UPDATES
-
in
server/workflow:- we now are compatbile with Letsencrypt v2 through the use of ACME.js, a low-level client for Let's Encrypt built by Root (https://therootcompany.com/)
-
in
server/monitor:- We do not use
node-inspectoranymore but we now uses V8's integrated debugging service - So to start a debugging session you will now need to:
- open a ssh tunnel to your remote server (ssh -L 9229:localhost:9229 user@remote.example.com)
- open chrome tab with
chrome://inspect#devices
- We do not use
-
in
general/latedb:-
You can now directly access the raw data stored in a lateDB table
db.tables.get(table_name) -
You can also directly query a field's index in a LatDB table:
db.tables.get(table_name, id, index)Be carefull:
db.tables.getreturns the raw data stored in LateDB, you'd rather usedb.tables.querythat returns a filtered and cloned version of the data. -
Tables' fields are now collected automatically in LateDB and can also be added, removed and listed manually
To get a table's fields list:
db.tables.list(table_name)To add a field in a table's fields list:
db.tables.alter(table_name, {add:'field'})To remove a field from a table's fields list:
db.tables.alter(table_name, {drop:'field'})
-
FIXED BUGS
-
in
server/monitor:- filtered dot files out of monitoring
- filtered files inside
node_modulesdirectory out of monitoring - error messages received were wrongly and badly rerouted to stdout
-
in
general/latedb:- was not able to compact client-side database when no timestamp was given
- was not able to clone null values (introduced in 0.0.31)
-
in bin/chocomake, ssl key length was increased to 2048
UPDATES
- updated Chokidar to v 3.4.0
- updated Chocolate's logo in README.md file
See version v0.0.33
NEW FEATURES
- in
server/monitoradded a web server- will be usefull in dev mode to restart the app if it becomes unresponsive
- activated through
app.config.jsonoption"monitor":{ "interface": true } - will wait for https requests at application's
port + 2 - can only handle
/-/server/monitor?register_key,/-/server/monitor?action=restartand/-/server/monitorrequest- use
/-/server/monitor?register_keyto enter your master access key - use
/-/server/monitorto see the current process pid and and button to restart the app - use
/-/server/monitor?action=restartor press the button to restart the app
- use
- if used with Chocolate's proxy service, all request to
/-/server/monitorwill be redirected to that web server
- in
server/studioadded two commands to convert document and switch to 2 spaces or 4 spaces indent:- Alt-Shift-2
- Alt-Shift-4
- in
server/workflowadd websocket group management:- use
__.websocket.subscribe(group_id)to subscribe to bradcast message for thisgroup_id - use
__.websocket.broadcast(group_id, message)to broadcastmessagetogroup_idsubscribers
- use
- in
general/latedb:-
added
identityservice todb.tables:db.tables.create 'cars', identity:on db.tables.insert 'cars', name:'Toyota' # an autoincrment id field is automatically inserted unless an id field is already present in line -
db.tables.updatenow has an optionaldiffoption that will remove fields with same value as original line in the providedline_update. Of course this can not be used with Array or Object fields.db.tables.update 'cars', modified_line, diff:on # non modified fields in modified_line will not be sent to the table's update -
added
db.tables.dropto remove a table you don't need anymore
-
UPDATES
-
general/coffeekup:- in
coffeescripttag section, whereidfunctions are read only:id(name)will look first inlocalscope then inmoduleandglobalscopes to find the id's valueid.module(name)will look first inmodulescope then inglobalscopes to find the id's value
- in other tag sections,
idfunction will look only in their scope - added
maintag in known HTML5 tags
- in
-
server/workflow:- in a service called from a WebSocket request, the
__.websocketrefers to the calling websocket and__.websocketsrefers the meta-websocket that corresponds to all websockets registered with the current session. - in a service called from an HTTP(S) request, the
__.websocketand__.websocketsrefer to the meta-websocket
- in a service called from a WebSocket request, the
-
general/chocodash:-
added
_.asyncas_.serialize/_.flowsynonym andthispassed to deferred function now containsnextfunctionYou can use it this way:
_.async (await) -> await -> my_first_async_func -> # ... @next() @next.later await -> sync_func() @next()or
_.async (await) -> await (next) -> my_first_async_func -> # ... next() next.later await (next) -> sync_func() next()
-
-
general/latedb:-
allowed simple dot notation to do a one-to-many relationship in query syntax
db.tables.query('table.linked_table') // many-to-one or one-to-many between table and linked_table db.tables.query('table.[linked_table]') // one-to-many only -
db.tables.insertwill return line.id ifoptions.identityis on
-
-
server/studio:- added find, fold all and unfold all commands in the toolbar to facilitate editor usage for tablets
-
updated Ace to v1.4.2 (21.11.18)
FIXED BUGS
- in
general/chocokup, in some situations Chockup crashed due to a bug introduced by scope management - in
general/interfacewhen usingmasterInterfaceservice on an interface that used thestepsservice, thisstepsservcice was not called - in
general/coffeekup,keyparameter missing inids.toJSONString - in
general/latedb- log.upgrade was not properly called for db.tables Table type
- log.upgrade was not filtering carriage return characters, leading to unnecessary upgrades
- in
server/fileresolve_repo was not handling relative paths
NEW FEATURES
-
general/chocokupandgeneral/locco/interface: newidandid.classfeature.When building HTML documents using Chocokup you may already use the
id(),id.ids()andid.classes()functions.
id()gives you a new unique id to be used to define a DOM element id andid.ids()gives you a local id generator to get ids by name, like in:ids = id.ids() ids('ok_button')Now, you can define named ids in three different scopes (
local,moduleandgeneral) usingid('id_name'),id.module('id_name')andid.global('id_name').Using Coffeekup,
id('id_name'),id.module('id_name')andid.global('id_name')refer to three distinct global scopes.Using Chockup,
id('id_name')has aglobalscope, but you can define a module scope for a given kup using
theChocokup.scope(kup, module_path)and then get a module's scoped id usingid.module('id_name').Using Locco/Interface.Web:
id('id_name')has a local scope (local to the Interface.Web'srendercodeid.module('id_name')has a module scope (local to the module file in which the Interface is defined)id.global('id_name')has a global scope (global in allrendercode used in the page/document rendered
So, using Locco/Interface.Web:
- you can share unique ids between different Interfaces'
rendercode - you don't need to get a local id generator with
id.ids(), just useid('id_name') - you don't need to pass the
id.idsgenerated ids dictionary to thecoffeescriptsection, it will be done behind the scene.
i.e., local usage:
sample_interface = new Interface.Web.Html render: -> input "##{id 'input'}", value:'Ok' coffeescript -> element = document.getElementById(id 'input') alert element.valuei.e., module usage:
extern_interface = new Interface.Web.Html render: -> coffeescript -> element = document.getElementById(id.module 'input') alert element.value sample_interface = new Interface.Web.Html use: -> {extern_interface} render: -> input "##{id.module 'input'}", value:'Ok' extern_interface()
UPDATES
- Added missing chocomake.bat file to
bindirectory
FIXED BUGS
server/studioandserver/file:grepsearch service was not working well on Linux after Windows compatibility updateserver/monitor: faulty datadir introduced in 0.0.29
NEW FEATURES
- Windows compatibility: now
Chocolatecan run on Windows.- a
bin/chocomake.bathas been added to create Chocolate projects on Windows systems - few modifications have been made on core code to make Chocolate compatible with
Node.json Winodws platform - current limitations on Windows:
File.hasWriteAccessalways returnstrue- Chocolate's debug service does not work yet
- a
server/file:- added
getGitStatusservice that returns the current Git status for current Git repository - added
getFileDiffservice that returns the current file's Git diff
- added
server/studio: addedDiffandStatustabs to display Git status for current app and Git diff for current file- added
server/monitor.jsandserver/server.js, so that one can startChocolateusing classical Node.js command
UPDATES
-
general/chocokup: added.overflowrule to chocokup's css to overflow-auto to a DOM element -
server/interface:- added
pwa_workerrequest type using?how=pwa_workerthis request returns atext/javascriptfile the the browser - added
masterInterfaces.excludesub-section inapp.config.jsonfile to tell themasterInterfacesservice to bypass any file which name starts with one of the prefixes given inmasterInterfaces.exclude's array create_hashservice now through a web interface
- added
-
server/file: update list of searchable files suffixes ingrep:'.coffee', '.js', '.css', '.scss', '.json', '.txt', '.md', '.markdown', '.ck', '.chockup', '.log'
FIXED BUGS
server/file:resolve_reponow resolve to to closest parent to have a.gitfolder
NEW FEATURES
-
general/litelorem: added basicloremservice that can generateword,sentence,paragraph,image,facelorem.word(): generates one word
lorem.words(count): generates
countwordslorem.sentence(): generates one sentence (5 to 10 words each), starting with an upper case and ending with a point.
lorem.sentences(count): generates
countsentenceslorem.paragraph(): generates one paragraph (10 to 20 sentences each), separated by a newline char (\n)
lorem.paragraphs(count): generates
countparagraphslorem.image(): generates a random image (400x200px)
lorem.image(width:200, height:300): generates a random image (200x400)
lorem.image(type:'arch'): generates a random architecture image. Type can be:
animals,arch,nature,people,techlorem.image(type:'people', color:'sepia'): generates a random people image in sepia (with sepia a
typehas to be provided).lorem.image(color:'grayscale'): generates a random image in gray scale.
lorem.image(blur:true): generates a random blurred image (with blurred image no
typecan be provided).lorem.image(gravity:'east'): generates a random image cropped to the east if image is wider than high (with gravity image no
typecan be provided). Gravity can benorth,east,south,west,center -
general/chocokup: added lorem service as a native keyword in Chocokupe.g.:div lorem.words(4)
<div>volutpat odio facilisis mauris</div>div lorem.sentences(2)
<div>Malesuada bibendum arcu vitae elementum curabitur vitae nunc. Nec sagittis aliquam malesuada bibendum arcu vitae elementum.</div>p para for para in lorem.paragraphs(2).split('\n')
<p>Vitae tortor condimentum lacinia quis vel. Dignissim sodales ut eu sem integer vitae. Arcu vitae elementum curabitur vitae nunc sed velit dignissim sodales. Facilisis leo vel fringilla est ullamcorper. Felis donec et odio pellentesque. Sem integer vitae justo eget. Dignissim diam quis enim lobortis. Pellentesque diam volutpat commodo sed egestas egestas fringilla phasellus faucibus. Elementum curabitur vitae nunc sed velit dignissim sodales ut. Sodales ut eu sem integer. Velit dignissim sodales ut eu sem integer. Ut eu sem integer vitae justo. Nec sagittis aliquam malesuada bibendum arcu. Lobortis scelerisque fermentum dui faucibus in ornare. Volutpat odio facilisis mauris sit amet massa vitae tortor. Odio tempor orci dapibus ultrices in iaculis nunc sed augue.</p>
<p>Magna fermentum iaculis eu non. Malesuada bibendum arcu vitae elementum curabitur vitae nunc sed velit. Eu sem integer vitae justo eget magna fermentum iaculis eu. Tempor orci dapibus ultrices in iaculis nunc sed augue lacus. Quis enim lobortis scelerisque fermentum dui faucibus in ornare. Nulla facilisi etiam dignissim diam quis enim lobortis. Odio tempor orci dapibus ultrices in iaculis nunc sed. Fringilla urna porttitor rhoncus dolor purus non enim. Ut aliquam purus sit amet luctus venenatis lectus magna fringilla. Orci dapibus ultrices in iaculis nunc sed augue. Sed velit dignissim sodales ut eu sem integer vitae justo. Congue eu consequat ac felis donec.</p>img src:lorem.image()
<img src="https://picsum.photos/400/200?cache=4801568232095026" />img src:lorem.face('woman')
<img src="https://randomuser.me/api/portraits/women/43.jpg" /> -
general/chocodash: added_.slugifyservice that converts a string to version that is compatible with URL -
.ck,.chocokupfiles can be served fromstaticfolder so that you can write an Html-like file usingChocokup
UPDATES
server/interface:masterInterfacecan now manage page interface defined by a simple function that returns a stringserver/interface:defaultExchangenow has anextensionparameter to set an extension name ifdefaultExchangeservice is insideserver/interfaceandgeneral/locco/interface: modified thereviewservice to enable embedded interface to act as access controller for tha MasterItem interface- updated formidable to v1.2.1
FIXED BUGS
server/monitor: added the.scssfile's folder to theincludePathsSass compiler command so that otherscssfiles present in the same folder could be found by the compiler.server/interface:masterInterfacewas not found if placed in an application's extension folder
NEW FEATURES
-
general/locco/interface:useis a new option in aninterfacedeclaration. It allows you to pass values/objects to theinterfacethrough thebin/propsproperty that will not be overriden by any data passed to the interface. Use thisuseoption instead ofdefaultswhen you do not want your default values defined for the interface to be overriden (defaultsvalues are overriden when values with the same name are submited to the interface).
-
server/reserve:spacenow gives access to aDBservice that allows you to open an other database than the default one. It is accessible through theInterface'srender'sthisobject:this.space.DB.
-
You can now define
extensionsin achocolatejsproject. Extensions can provide a default behavior for a part of your app, like User's management...Use the
extensionsoptiondata/app.config.jsonto declare one ore moreextensions:"extensions": { "mymodule": "virtual_folder" }A package named
mymoduleand installed in app'snode_modulesfolder with optionalclient, general, server, staticfolders will be used as an extention to the current app folder.So modules and files placed in this package will be accessible with an url starting with the
virtual_foldervalue.virtual_foldercan be empty.When in an
Interfacerender service, constants defined in anextensionnamemy_extensionwill be available inthis.space.constants.my_extension -
You can now define
Master Interfacesto provide a default behavior for you web pages. When you call a page that is provided by anInterface, thisInterfacewill be sent first to aMaster Interfacethat will insert thisInterfacein its default behaviour.
Use masterInterfaces option in data/app.config.json to define one or more master Interface
`masterInterfaces` is defined by:
- `directory`: optional string or array of strings defining the web directory(ies) on which to use the `master interface` service. If not provided, the `master interface` will be used for every web page in your web site.
- `extension`: optional string giving the name of the `extension` in which the `master interface` is defined. If not provided, `chocolate` will look for the `master interface` in your app folders.
- `where`: string heading to the module where the `master interface` is defined (in an `extension` or in your app)
- `what`: string giving the name of the function in the `master interface` module to be called to render the `master interface`
- `prop`: string giving the name used by the `master interface` function to designate the provided `interface` (that has to be encapsulated)
e.g.:
"masterInterfaces": [
{
"directory": "admin",
"extension": "users",
"where": "server/admin/common",
"what": "document",
"prop": "content"
}
]
monitor.coffeeservice- will now convert
.scssSass files present inclientfolder to.cssinstaticfolder. - when designing an extension,
monitorwill look inextension'sclientandgeneralfolder to convert.coffee,.ckor.scssfiles or to build Javascript bundles to theextension's static folder.
- will now convert
UPDATES
general/latedb:- you can now query a non-existing table and receive an empty array as a result
general/chocokup:- now, you can unregister all registered
kupsall at once by callingChocokup.unregisterwith no parameter
- now, you can unregister all registered
- updated node-inspector to v1.1.2
- added node-sass v4.7.2 as a dependency
FIXED BUGS
server/studio: small bug indisplay_opened_files_listthat would produce a wrong path in folder's linkgeneral/latedb:- was not able to query an existing but empty table
- was crashing on startup when an empty foregn key was foundin a table
general/coffeekup: internalstringifyfunction was not handling correctly object's key values. now it puts quotes around object's key valuesgeneral/locco/interface:respondingetSelfnow referencesreactioncorrectly. This is usefull if the interface has astepsservice that wants to return a response
NEW FEATURES
studio:- you can now open and execute a module in another tab window by pressing the ↗ button (next to the close button)
- a module's tab, that was opened from
studio, will be automatically reloaded every time a file is saved from the studio's editor - you can now start and stop the debugger directly from the UI using the ▣ button!
UPDATES
-
general/latedb:-
Table's list now returns an alphabetically ordered list
-
db.tables.get: you can now get a line in a table by its primary key (usually anid)line = db.tables.get 'table_name', id
-
-
general/coffeekup:id.idsservice now has an optionaldbparameter, if you need to share an ids collection between separate interfaces
-
general/loco/interface:-
Interface.submittransmitservice now allows to pass some more data to add to theInterface'sprops -
renderfunction, inInterfaceobjects, can transmit the request it received to anotherInterfaceorInterface.Webrenderfunction:render : -> @transmit module, 'function_name', optional_propsor
render : -> @transmit function, optional_props
-
-
server/monitor:- you can now specify a
groupto run the process with. if you specify auserbut nogroupthen theuserwill also be used as agroup - the debugger is now started using the same protocol than the app (https or http depending on the
http_onlyoption available inapp.config.json)
- you can now specify a
-
server.studio:- wrap mode and invisible characters buttons moved on the toolbar
- main studio panel is now blurred when you are logged off
-
updated formidable to v1.0.17
FIXED BUGS
general/locco/interface: fixed sub-sub-interfaces that where not properly declared if used in many placesclient/litejq: Ajax header was missing'x-requested-with':'XMLHttpRequest'server/workflow: compressed response was only working with string or buffer response. Now response is converted to string if response isn't string or Buffer.general/chocokup: inrender, this.params.props was not deleted and thus always transfered to sub kupsserver/interface: upload usingFormidablehad a bug and was not compatible with Node's new versions
NEW FEATURES
-
added relational-like services in
lateDB, with insert, join and query capabilitiesdb.tables.create 'colors' db.tables.insert 'colors', id:1, name:'white' db.tables.insert 'colors', id:2, name:'black' db.tables.create 'brands' db.tables.insert 'brands', id:1, name:'Mercedes' db.tables.create 'cars' db.tables.insert 'cars', id:1, name:'SLK 200', color_id:1, brand_id:1 db.tables.insert 'cars', id:2, name:'SL 600', color_id:2, brand_id:1 lines = db.tables.query select: 'cars.brands(*)' sort:['name'] lines = db.tables.query 'Car', filter: (line, keys, tableName) -> line.name.indexOf('SL') isnt 0 -
added basic gzip compression support (
"compression": true, in app.config.json file) on https(s) responses for text/plain, text/html, text/javascript and application/json requests accepting gzip response
UPDATES
-
updated LateDB section in README.md
-
updated Locco Interface section in README.md
-
in
general/latedb:-
the
loadfunction is made synchronous so that data is made available immediately -
added an alternative
updateusage to copy an object in the databasedb.update 'key 1': 'data 1' 'key 2': 'data 2' , (data) -> for k,v of data then @[k] = v
-
-
in
server\reserve:- breaking changes in usage that provide lateDB's services through
reserve's services - a
constantsservice is now available as aspaceproperty- this service requires a
data/constantjs or coffee file that returns an object
- this service requires a
- breaking changes in usage that provide lateDB's services through
-
in
general/locco/interface:- client-side Interface.Web
actor's property initialized to mainactorwhen this interface does not already belong to an actor spaceis a new property available inInterface'sthisobject alognsidebin/props, that gives accessspace's lateDB services (dbandconstants)
- client-side Interface.Web
-
in
general/chocodash:_.prototypeservice now acceptsusean object instead of a function to add some definitions in the prototype -
in
server/monitorsetprocess.env.HOME = @appdir ; process.env.USER = @userif an user is specified when starting the app (--user) -
in
client/litejq, default datatype for$.getis nowguessthat will acceptxml, json, script, text, html -
updated coffee-script to 1.12.6
-
updated back ws to 0.8.1
-
breaking changes in
server/reserveusage -
removed sqlite3 from Chocolate's dependencies
FIXED BUGS
- in
server/monitor:build_lib_packagewas not working anymore due to a recent change innormalizeimpactingreadDirDownSync - in
general/locco/interface:propsandkeyswere lost in sub-interfaces butbinwas not lost - in
server/file: moveFilewas normalizing destination path before giving it towriteToFile- convert to string results returned by the
grepcommand as it may be Buffer instead of String
NEW FEATURES
chocolatejscan now handle proxying websockets
UPDATES
- better console.log redirection if using
log.inFileparameter indata/app.config.jsonconfig file - updated README.md with LateDB section
- updated microtime to 2.1.3
- updated ws to 2.3.1
FIXED BUGS
- in
general/interface, the review method was missing theactorproperty in itsthiscontext - in
server/workflow, an empty json string result was not handled correctly
NEW FEATURES
-
added
general/lateDB: a very simple database system.lateDBprovides you an in-memory javascript space that you can modify with anupdatemethoddb.update('key': { op: func, data: some_data });i.e. (in Coffeescript):
db.update 'result': op: (data) -> (@log ?= []).push data data: "done"or in Javascript:
db.update({ 'result': { op: function(data) { return (this.log != null ? this.log : this.log = []).push(data); }, data: "done" } });will store in the database
{result:{log:['done']}}resultis the key parameter which defines asection/table/bucketname, in which you want to store some data It contains anopfield which provides a function to execute onthislocation, and adatafield which should contain thedatato provide to theopfunction.What the
updateservice do is that it records theopmethod and thedataprovided in alog.dbfile which will be reloaded and executed next time your app will be restarted.Your
opanddatashould rather not produce object oriented data (using the prototyping chain), unless those objets provides astringifymethod which should write a javascript code in thelog.dbfile that will re-create the oject.And voilà, that's bascially all...
-
in
server/interface:- the
__context parameter sent to invoked module services now contains:- a
websocketthat can be used to send some message to the client when a websocket connection has been established (i.e. whenlocco Workspaceis running client-side) - a
consoleobject with alogmethod that will route the log message to the defaultconsoleand to the client through thewebsocketthat may be present in thecontextobject
- a
- the
UPDATES
-
in
locco/chocodash: -
_.celland_.observeare added as functional equivalent to object oriented _.Signal and _.Observer -
removed
helpersoption from_.Signalservice -
_.stringify- has now 3 optional modes:
json: returns a JSON stringificationjs: (which is default mode) returns a javascript string to recreate the given objectfull: same asjsmode, but treatsArrayobjects as full object and stringifies values by keys instead of by indexes
- has a
writeoption to define a function that will receive every chunk of string generated during the stringify operation,
It can be used to store those string to a file or the send them to a stream. By default it should return the given string. - has a
strictoption to tell wether_.stringifyaccepts a user typed object. If not it throws an error.
- has now 3 optional modes:
-
in
server/studio: -
list of opened files is now saved in
localStorage. Those files are reload automaticaly next tilestudiois opened -
in
opened files panel, you can now click on directory entries to go directly there -
the login toggle button will now display a yellow color when the app is restarting
-
the
darktheme is now more grey and not brown anymore. -
a
*symbol is now also added to the file name displayed in the editor's file selector when the file was modified -
in
server/monitor: -
the restart service now throttle the requests to 1 per second to avoid unnecessary restarts when few files are generated/rebuilt on a save
FIXED BUGS
-
in
server/studio -
errors were not properly displayed in lab execution panel
-
Specolateservice was crashing when an error was occuring in server side tested code due to a relative pathname of the tested file -
in
general/chocokup -
a
box,panel,headerorfooterfollowed by a string was not displaying that string in the produced html -
in
server/workflow, better management ofregionto define a system command -
in
server/file, reorganized code, normalize, resolve and region management (system and app) -
in
general/newnotes, put needed resource files forpresentservice, inside/static/vendor/slides
NEW FEATURES
- in
data/app.config.json,logparameters are added :-
inFile(true or false) tells Chcolate to redirect log functions output todata/chocolate.logfile -
timestamp(true or false) tells Chcolate to add a timestamp to every Console output"log": { "inFile": true, "timestamp": true } -
rewritean array of rewrite rules :rule: a regular expression
replace: a string to replace what will be found by the regular expression"rewrite": [ {"rule": "/(.+)_(.+)_(.+)_(.+)", "replace":"/?Library=$1&Book=$2&Chapter=$3&Verse=$4"} ]
-
UPDATES
-
in
app.config.json'sproxysection, you can now specify: -
a domain port redirection
"proxy": { "lestencrypt": true, "redirect": { "mydomain.com": "mydomain.fr" } }will redirect mydomain.net requests to mydomain.com port
-
a domain for the proxy service itself:
"proxy": { "lestencrypt": true, "proxy_domain": { "proxy.mydomain.com" } } -
to log proxy events:
"proxy": { "log": true, } -
in
server/monitor, you can now specify a user to run yourmonitorand app processes.coffee monitor --user myappuserNOTE: this will only work if you start
server/monitorwith a privileged account -
in
server/interface:- now provides the HTTP response object to the called service in the
__context parameter - does not return anymore the
propsproperty as an alias to thebinproperty inInterface.Reactionresponse to a web request, which was an unnecessary duplicate. When using anInterface.Actorclientside, it puts back thepropsproperty as an alias to thebinproperty.
- now provides the HTTP response object to the called service in the
-
in
server/studio, does not give results fromnode_modulessubdirectories anymore -
in
data/app.config.jsonthedisplay_errorsparameter is renameddisplayErrors -
http-proxynode-module upgraded to v1.16.2 -
logConsoleAndErrorsdoes not have atimestampparameter anymore as it is managed by theapp.config.jsontimestampparameter
FIXED BUGS
- in
server/studio, search/grep service was somehow broken - in
server/workflow, - send a response when a proxy error occurs and don't create unnecessary proxy handlers
httpredirection tohttpsnow includes the requested url- in
server/filelogConsoleAndErrorsservice was broken. It should work now.unlogConsoleAndErrorswas added.
NEW FEATURES
- in
data/app.config.json:display_errorsparameter tells Chocolate to display errors (or not) on the rendered web page
UPDATES
-
in locco/interface's Interface.Web :
-
introducing Interface.Web.Global objets that will be automatically copied from one props/bin to sub-interface's bin
-
only Interface.Web and Interface.Web.Global objects are copied from one props/bin to sub-interface's bin
-
in server/interface:
-
don't add missing html/body tags in response if request is an Ajax call (headers['x-requested-with'] is 'XMLHttpRequest')
-
add
whatin context passed to invoked module service -
in server/workflow: Session::addKey and Session::removeKey were added to allow you to add or remove access keys from the Session's keychain
FIXED BUGS
- in
server/interface'scookservice, we now trim cookies' key and value in case the client put spaces there - in
general/chocodash'scloneservice, don't return the original object if only one parameter is provided (target object to receive cloned values not provided), but return the cloned object as expected
NEW FEATURES
-
Added
Javascriptcode execution andJavascripttoCoffeescriptconversion services in theLabpanels (thanks to js2coffee.js library) -
Added
Htmlcode rendering andHtmltoCoffekup/Chocokupconversion services in theLabpanels (thanks to htmlkup.coffee library) -
locco protocol and Interface allows a
redirecturl to be specified and used to generate an HTTP 303 responseservice = new Interface check -> ... # if the `check` function returns false redirect: 'login' # the interface will return an HTTP 303 redirect to the `login` page -
monitor.coffeeservice now allows you to define Javascript bundles to be build when source files are saved.
If you have some client side Coffeescript/Javascript files (in Client or General folders) with the same prefix (or in the same subfolder), they can be bundled in the same file.In the
app.config.jsonfile, add abuild:{bundles:[]}section, with the following parameters:filename: the name for the output bundle file prefix: the prefix used in (or the path to) every file to put in the bundle known_files: an array of files' path, that have to be put in that precise order in the bundle with_modules: true or false, to put in the bundle the necessary code to make those files required by the Chocolate's require service "build": { "bundles": [ { "filename": "locco.js", "prefix": "locco", "known_files": { "locco/intention.js": true, "locco/data.js": true, "locco/action.js": true, "locco/document.js": true, "locco/workflow.js": true, "locco/interface.js": true, "locco/actor.js": true, "locco/reserve.js": true, "locco/prototype.js": true }, "with_modules": true } ] }
UPDATES
thisandbinavailable in Locco/Interface'sdefaultsandcheckfunctions
FIXED BUGS
Chocodowndoes not insert unnecessary<p>tag anymore when it translatesChocokupblock (<<<) orCoffeescriptblock ({{{)
NEW FEATURES
-
letsencryptrenewal service now works automaticaly -
Single Page Applicationcan be easily created usinglocco/actor
Create a new service
myservice.coffee, in which you will define a function that will return an actor that can work both client and server sides :
MyService = ->
_ = require 'chocolate/general/chocodash'
Interface = require 'chocolate/general/locco/interface'
Actor = require 'chocolate/general/locco/actor'
_.prototype inherit:Actor.Web, # make your service inherit from Actor.Web
ping: new Interface.Remote -> "pong" # use Interface.Remote to have your interface work client and server side
login: new Interface.Remote -> @transmit @actor.users, 'login' # in the Interface render code you can use @transmit to delegate the interface handling to another Actor's interface
main: new Interface.Web.Html -> # your actor's interface called main will be used as the default interface
# ...
# my css and html code written using Chocokup
# ...
coffeescript: ->
# send a message server side when the login button is clicked
$("#loginButtonId").on "click", (e) ->
loginInfos = login:$("#login").val(), pwd:$("#password").val()
self.login.submit(login_infos).subscribe (result) ->
{name} = result.props
if name?
# ...
Then the server side only services:
Users = _.prototype inherit:Actor,
constructor: ->
# @usersDb = ... whatever method you want to store your users' data
login: new Interface ->
{login, pwd} = @props
# user = @actor.usersDb.get login, pwd
# ...
logged: new Interface ->
# ...
Then the server main interface:
module.exports = _.prototype inherit: _.prototyper(MyService),
constructor: ->
@options =
filename: __filename # required to have the page's manifest file being managed automatialy
name: 'My Service' # the title displayed by the client window
script: """
# whatever client scripts needed...
"""
stylesheet: """
# whatever css files needed...
"""
@users = new Users
UPDATES
-
can now serve
.pdffiles instaticfolder -
in locco/interface, data given to an interface service, like the
renderfunction, is accessible through an object namedbin.Now, you can use
propsas a synonym tobinmyService = new Interface.Web defaults: -> title: 'home' render: -> div this.props.titleor
myService = new Interface.Web { title: 'home' }, -> div @props.titleor it is still possible to use
binmyService = new Interface.Web { title: 'home' }, -> div @bin.titleThe data returned by the Interface also has now a
propsproperty that can be used as a synonym tobinmyInterface.submit(params).subscribe (result) -> {name} = result.props ...
FIXED BUGS
- in chocokup/coffeekup: a markup with an attribute starting with a point (like style '.mycssclass {color:white}' was wrongly interpreted as an html class id
- in package.json: works with letsencrypt module version 1.4.4 only
- in chocodash: Publisher with no subscriber will save notified values until a reporter has subscribed
NEW FEATURES
- add .chocokup files support
- Chocokup files are
htmlfiles written with a Coffeescript syntax - Using
CodeandDocpanel side-by-side you can design Html page easily - When you save a
.chocokupfile in theclientfolder, it is immediately converted to anhtmlfile in thestatic/libfolder
UPDATES
- text written in
CoffeescriptorChocodownLab panels are saved in local storage, so you can get them back on page reload - updated Ace to package April.16.2016
FIXED BUGS
-
in
coffeekup.coffee: when a tag has only one attribute and this attributes starts with a dot then it is correctly interpreted as a css class declarationi '.icon'is now correctly translated to<i class="icon">instead of<i>.icon</i>
NEW FEATURES
-
Free SSL certificate generation using
letsencryptservice! -
configure in
data/app.config.json:"letsencrypt": { "domains": [ "yourdomain.com" ], "email": "you@yourdomain.com", "agreeTos": true, "production": true, } -
put
falseinproductionparameter to test certificate generation -
generated certificate should appear in
data/letsencrypt/live/yourdomainfolder -
your certificate will be renewed and the app restarted, automatically after approximately 90 days
-
you can put many domains in the same certificate
"domains": [ "yourdomain.com", "theirdomain.com", "ourdomain.com" ] -
you have to explicitly add an entry with
yourdomainprefixed withwwwif you want to support it"domains": [ "yourdomain.com", "www.yourdomain.com" ] -
Reverse proxy simple service
-
configure in
data/app.config.json:"proxy": ['yourdomain.com', 'theirdomain.com', 'ourdomain.com'] -
Chocolatewill forward request for those domains to local processes/apps awaiting requests on your proxy app port + 10
so if your proxy app is on8026port thenyourdomain.comwill be on8036,theirdomain.comwill be on8046... -
if you also use
Chocolate'sletsencryptfeature, you only have to set:"proxy": trueand
Chocolatewill use the domains defined in"letsencrypt": { "domains": [ "yourdomain.com" ], ...
UPDATES
-
in
data/app.config.json: -
port_httpsandport_httpscan be defined indata/app.config.jsonand will be used if present when starting the app -
When
port_httpsandport_httpsare not defined in config file butportis thenportwill be used as port forhttpsandport+1forhttp -
in
server.file: -
logConsoleAndErrorsnow add a timestamp on every log entry inchocolate.log
NEW FEATURES
-
server/configmodule is added to manage config files, instead of being defined thedata/config.coffeefile. -
Configuration will now be done inside
data/app.config.jsonfile -
When
Chocolatefinds adata/config.coffeefile it copies it's content indata/app.config.jsonif the keys are not already existing ther. -
So after running once, you can safely remove the
data/config.coffeefile or only parts of it, if it's better for you. -
If you keep
data/config.coffeealongside the newdata/app.config.json, then configurations done indata/app.config.jsonwill be overridden by those done indata/config.coffee -
as the
configmodule is available in __ params of locco/interface service, you can not anymore directly access config key/values, but you will have to use thegetmethod of theconfigobjectmyservice = new Interface ({__}) -> configValue = __.config.get 'configKey'
UPDATES
-
in
locco/interface: -
thisincheckandlocksfunction is now defined to{bin, document:@document, 'interface':@} -
in server/document:
-
add
throttleoption in Cache and Structure class to define time to wait between successivehibernatecalls -
add
reloadmethod in Cache class to reload the cache from file -
add
savemethod in Cache class to put save the cache to file -
add
clonemethod in Cache class to clone an object from the cache -
add
setmethod in Cache class to put a new value to cache and immediately hibernate the cache -
add
updatemethod to allow the update of many keys at once syncing from an optional external store and saving updates on file immediately -
in
general/chocodash: -
add
_.Cuidgenerator from Eric Elliott -
allow
_.throttleto receive no options parameter,_.throttle -> #do something max once a second -
in
general/coffeekup: -
coffeekup id generator replaced by the Cuid generator from Eric Elliott
-
in
server/interface:- access to the
client,generalandserverfolders is now restricted- as a standard user you can only call functions called
interfacein modules of those folders - other functions defined in modules of those folders are accessible only from other modules on the server
- a user with the
sofkeycan access every function in those modules
- as a standard user you can only call functions called
- access to the
-
in
server/monitor: -
now also restarts the app when a file with suffix
.config.jsonis modified -
in
data/configor now indata/app.config.json, if you add a default page handler to which redirect unkonwn pages, you have to use an Array and not a Function to pass value as a key index:before: exports.defaultExchange = where:'demo', what:'showme', params: name: -> 0 now: exports.defaultExchange = where:'demo', what:'showme', params: name: [0]where: module name you want to call for every unknown pagewhat: function name in the module do call (if omitted the module itself will be called)params: params to pass to the function. If the param value is an array, then the value(s) in the array will be used as key index(es) to the original params. 0 is the page path and 1...N are the querystring parameters' value
FIXED BUGS
-
in locco/interface:
-
TypeError: Object true has no method 'call'in Interface.Web.submit -
in server/document:
-
bug in asynchronous hibernate (typo)
-
in general/coffeekup:
-
attributes with
undefined,nullandfalsevalues are not rendered anymore -
in server/file:
-
logConsoleAndErrorsnow works better on consecutive calls toconsolefunctions likeconsole.log
NEW FEATURES
-
in server/studio:
-
new snippets availble for Locco and Chocodash:
# Require Locco Interface snippet locco_require_interface # Locco full Interface snippet locco_interface_full # Locco full Interface.Web.Html snippet locco_interface_html_full # Locco standard Interface.Web.Html snippet locco_interface_html_standard # Locco minimal Interface.Web.Html snippet locco_interface_html_minimal # Chocodash require snippet require_chocodash # Chocodash async or flow snippet chocodash_async_or_flow -
you can add user defined snippets in data/config.coffee
exports.snippets: coffee:""" # New Service Page snippet service_page \tInterface = require 'chocolate/general/locco/interface' \tmodule.exports = new Interface.Web.Html \t\tdefaults: -> \t\trender: -> """ -
in data/config, you can add a default page handler to which redirect unkonwn pages
exports.defaultExchange = where:'demo', what:'showme', params: name: -> 0where: module name you want to call for every unknown pagewhat: function name in the module do call (if omitted the module itself will be called)params: params to pass to the function. If the param value is a function, then the returned value will be used as a key index to the original params. 0 is the page path and 1...N are the querystring parameters' value
UPDATES
-
in server/interface:
-
you can now directly export an Interface.Web object in a file module without the 'interface' attribute
Interface = require 'chocolate/general/locco/interface' module.exports = new Interface.Web -> div 'Hello' instead of Interface = require 'chocolate/general/locco/interface' exports.interface = new Interface.Web -> div 'Hello' -
config module available in __ params of locco/interface service
-
in locco/interface:
-
'render' replaces 'action' in interface definition. 'action' stays available as a 'render' synonym
html = new Interface.Web.Html action: -> div 'Hello World' is equivalent to the new preferred syntax: html = new Interface.Web.Html render: -> div 'Hello World' -
'check' replaces 'values' in interface definition. 'values' is not supported anymore
-
bin content becomes available in 'render' function arguments:
demo = new Interface render: -> {who, where} = @bin demo = new Interface render: (bin) -> {who, where} = bin demo = new Interface render: ({who, where}) -> demo = new Interface ({who, where}) -> -
'defaults' can be passed as a param to an interface definition
html = new Interface.Web.Html {menu}, -> menu() -
Interface.Web code rewritten to manage naming collision in different module
-
in Interface.Web render function, this.keys is an array with the names of the values copied in this.bin
-
in locco/chocodash:
- added _.clone function to enable object deep copy
FIXED BUGS
- in locco/interface
- review is done properly on Web interfaces just before de render function is called and not globally at begining
- make available __ context in bin arguments of sub interfaces
- make available locals (like _ and Chocokup) as local variable of sub interfaces
NEW FEATURES
- added debug mode using node-inspector (add exports.debug = true in data/config.coffee then connect to http://myserver:8081/debug?ws=myserver:8081&port=5858
- monitor.coffee, workflow.coffe: replace uncaughtException handling with a more general logging system serialized to a ./data/chocolate.log
UPDATES
- in chocokup.coffee
- added Chocockup.Html as an alias to Chocokup.Panel
- support functions in coffeescript markup attributes
- in locco/interface.coffee:
- an Interface submit now has its steps function moved out review. So we have: review, steps and then action.
- 'review' is there to prepare the interface and check if we can use it
- 'steps' is there to execute internal actions before responding to the request
- 'action' is there to react to the submit
- added Interface.Web.Html as an alias to Interface.Web.Panel
- an Interface submit now has its steps function moved out review. So we have: review, steps and then action.
- added 'exports.debug = false # http://myserver:8081/debug?ws=myserver:8081&port=5858' in chocomake to show debug option in new projects
- added params in server/interface.coffee 'context' so params are also available in @bin.__ in a locco/interface
- updated chokidar to v1.4.3
- updated microtime to v2.1.1
- updated sqlite3 to v3.1.3
FIXED BUGS
- in locco/interface: values ans steps declaration were defaulted with _.defaults, but they are functions (so no more _.defaults on them)!
- in chocokup.coffee: render attributes when an empty string is specified
- in locco/interface.coffee:
- defaults in sub interfaces not handled properly
- recursive interfaces not handled properly and reviewed infinitely
- cleaned bin in Interface object before review'ing' it's content
- in workflow.server: allow array arguments in request. Just have to repeat the &field=value
NEW FEATURES
- Studio
- added Login/Logoff indicator, switch and key input
- added switch to toggle wrap mode on or off in editor
- added Literate CoffeeScript support (use .litcoffee file type)
- added Json file support in editor
- added basic element creation support $('') in liteJq
- monitor.coffee:
- added memory param to define node.js --max-old-space-size param
- added named params --appdir, --port, --memory
UPDATES
- __ is a Chocolate context given to every remotely called exported module function
- __.appdir is relative path from Chocolate system directory to application directory
- __.sysdir is relative path from application directory to Chocolate system directory
- updated coffee-script to 1.9.1
- server/Document.Cache: added async mode to access file and made it default mode
FIXED BUGS
- corrected -webkit-overflow-scrolling:touch in Chocokup body CSS
- static file now seen as 'app' if
howquery parameter isnt 'web' ; otherwise seen as 'static' even if with other params (can pass parameters to static files.) - correctly load CoffeeScript in chocodown.js if run server side on node.js
- remove 'chocolate' from
required url if used to load Chocolate libs from static folder - File::moveFile was not working correctly anymore
- Upload service was not working anymore - name attribute was missing on iframe
- _.super can be called in _.prototype declared constructor
NEW FEATURES
Studio
- introduced Light theme (now by default) white-grey/blue, that you can switch back (use the up right □ symbol) to Dark original chocolate theme
- added a dropdown selector to help you switch between opened files
- added a up right
closebutton to give another place to close the currently opened file - added a up right
show invisiblebutton to show or hide thespace,tabandreturnchars - added a CTRL-U/CMD-U shortcut to insert a UUID in the code
liteJq, server/Interface and server/Workflow
- Websocket is now supported (with with poling fallback) to allow message exchange between client and server in both size
chocodown.js
- Turn {{ javascript }} and {{{ coffeescript }}} blocks into
scriptblocks - Turn <<< Chocokup >>> blocks into html blocks
locco/Document, locco/Workflow, locco/Interface, locco/Actor
- lot of work done but not yet ready
UPDATES
Locco
- Interface options don't need the
ruleskeyword anymore. Just putdefaults,values,locksbefore theactionsection.rulesis not recognize now.
liteJq
- taking care of javascript when inserting html block - eg: $('.myClass').html()
- added json-late format: json Chocolate format which allows to save functions, date... in json-like notation
- added
afterfunction that allows inserting after a DOM node
chocodash
- added
_.isObject: returns true if value is not a primitive - added
_.isBasicObject: returns true if value constructor is {}.constructor - added
_.param: transforms a javascript value to an url query parameter - added
_.extend: copies values from an object to another object
Studio
- the opened files panel now keeps a link to the last 10 opened files (instead of 5)
UPDATES
Chocodash
- _.super was working only in a simple case
FIXED BUGS
Chocodash
- static/lib/chocodash.js was not correctly recompiled in v0.0.10
Locco
- Interface replaced @rules and @action by provided params in constructor instead of merging them
NEW FEATURES
Chocolate directory structure
- moved vendor libraries from /static to /static/vendor
- renamed /general/intentware folder to /general/locco
You should update references to this folder if you use it in your Chocolate application - renamed /static/ijax folder to /static/lib
You should rename this folder if you have one in your Chocolate application - renamed /static/ijax/ijax.js file to /static/lib/locco.js
You should rename this file if you have one in your Chocolate application
Locco Interface:
- introduce
Interfaceservice that manages security, defaults and values valid range Interface.Webto easily create web app interface with Chocokup
Chocokup:
-
added the
id([value])function to generate ids (added in coffeekup)button "##{id()}", i for i in [9..0] -
can pass parameters to embedded coffeescript block
ids = clear: id() body -> button "##{ids.clear}", "clear" coffeescript {ids}, -> $ -> $("##{ids.clear}").on "click", -> alert "clear" -
produced code is now not formatted (meaningfull whitespace problem).
Should use theformatparameter. -
more isolated parameters: @__.content() instead of @content (idem for @body and @head) in kups
-
Chocokup.App to include Chocodash, litejQ, Coffeescript, Locco
-
Chocoss:
- preparing Chocokup Css Framework
- added Eric Meyer's Reset CSS v2.0
- introduced Css themes: reset(default), paper, writer, coder
Chocodash:
- renamed Chocoflow into Chocodash
- started to move javascript utilities into Chocodash:
- _.type, _.Type, _.defaults, _.serialize, _.parallelize, _.stringify, _.parse
- _.Signal, _.Observer and _.Publisher implement reactive programing services (from Reactor.js)
- add Class-like service with _.protoype (with inherit, adopt and use)
- _.Uuid:
- added an interface in Uuid so that /-/general/locco/uuid displays a new Uuid
Chocodown:
- adds the formatChocokup option in Chocodown.converter
Coffeekup:
- added the
idhelper function that will return an incremental id - Locco now independent from Mootools (works with litejQ or jquery)
Studio
- in Chocodown panel, you can specify wether you want embedded Chocokup code to produce formatted HTML
- Specolate has a better error handling
- console.log is now copied in Studio message box
FIXED BUGS
- header and footer when not in a Chocokup Panel work as standard HTML5 tags
- renamed internal Coffeekup 'data' variable to '__data' to avoid colisions
- display error produced in Interface.exchangeSimple when user has sofkey privileges
- removed Chocokup title helper. Now title works as a standard html tag
- added Chocokup Core Css in Chocodown Lab view
- added
panelcss class to Chocokup panels so it can be styled - removed useless
divin Chocokup panels - Chocolate's module loader is more robust
- server/interface forget-key renamed to forget-keys
UPDATES
- updated coffee-script to 1.7.1
- updated Ace to package March.08.2014
NEW FEATURES
- litejQ : a lite jQuery-compatible library (9kb compressed and gziped) aimed at replacing Mootools in Chocolate and becoming its client-side scripts foundation.
- with Chocodown
- inline tests: open litejQ documentation (/general/docs/doc-litejq.md)
and open the doccolate panel (Doc) to see the
checkfunction working - in Locco:
- can call a function in a sub-object inside a module
https//myserver/mymodule?MyObject.function?param1¶m2 - params can be unnamed and numeric when calling a function inside a module
https//myserver/mymodule?add?123&9872 - in Studio:
- can change debug evaluation column width by pressing +/- buttons
- in Newnotes:
- create a new note by pressing Return
- when editing, create a new note by pressing Return if cursor at the end
- when editing, insert a newline with Ctrl + Return or Shift + Return or press only return if not at note's end
- toggle a note by pressing Shift-Return
- toggle note priority by pressing Ctrl-Return when not editing
- insert a new note before a note with Alt + Return
- split a note in two notes with Ctrl-Shift-Return when editing
FIXED BUGS
- static files can be created or deleted through studio interface in an app
- deleting a file was copying it in default.coffee!
- can pass parameters to static files. They were seen as 'app' instead of 'static' if with params
- don't execute debug compilation in coffeescript lab when debug panel is hidden
- problem in debug panel with multiple empty strings ('')
- chocokup css helper did not understand @media clause
UPDATES
- updated Newnotes documentation
- updated Ace to package 12.02.2013
NEW FEATURES
- Basic autocomplete and snippets services introduced in editor
- First step in ChocoDB : write and read Javascript object in database
- Added Chocoflow: basic serialize and parallelize services
- Added a basic profiling tool to Debugate
- Synchronize editor view with Documentation (Docco) view
- Changed Locco test command to the more appropriate eval
FIXED BUGS
- synchronisation problems removed in Coffeescript Lab debug panel
- make Specolate unit tests work better client side (force module loading and clean)
- force resize editor view when switching between horizontal and vertical side-by-side
UPDATES
- updated Ace to package 07.31.2013
- updated node-sqlite3 to 2.1.17
- updated coffee-script to 1.6.3
NEW FEATURES
- Newnotes: add automatic refresh on remote change
- Chocokup: add Css support (write Css with Coffeescript syntax)
- Chocodown: add .chocodown .cd support in Studio
- Chocodown: add .chocodown .cd support as static file type
FIXED BUGS
- replace div with iframe for Doccolate panel in studio
- removed a bug introduced in v0.0.6 (alert in Coffeescript debug mode)
UPDATES
- add Css support for Chocokup sample in README.md
NEW FEATURES
- Replaced Chocokup lab by Chocodown lab (literate style web dev using Markdown)
- Enhanced Debug Lab display : vertical scroll sync between Coffescript and Debug panels
- Updated Help to introduce Chocodown
- Updated ReadMe to replace Chocokup Lab with Chocodown Lab section
FIXED BUGS
- Column alignment for values fixed in Lab with Coffeescript debug mode
NEW FEATURES
- allow binary file in Locco 'move' verb
- now specolate specs receive system context variable in jasmine.getEnv().__
- allow file basic upload
- allow list and open every file type
FIXED BUGS
- replace static strings in the Lab before Debug so that = and [ dont break
- clean File.coffee code to allow all file types
- reintroduced javascript execution in Chocokup lab (it disappeared with iframe usage)
UPDATES
- updated Ace to package 06.04.2013
NEW FEATURES
- simplified and enhanced Chocokup use in Chocodown : use
! chocokupand#! chocokupincodeblock to execute Chocokup or to highlight and then execute Chocokup code - added JSON output type in Newnotes.Present (
asparameter can be: paper, impress or json). It helps export Newnotes branches. - added
keypassparameter inconfig.coffee file to enable master key (sofkey) bypass ; enable demonstration mode when used with access restriction on files
FIXED BUGS
- enhanced monitor.config to wait for child process to exit on SIGTERM before exiting ourself so that Upstart can cleanly stop us
- Specolate did not work serverside because jasmine-node module was missing from package.json
- Specolate was no working with appdir module specs and with nonexistent module
NEW FEATURES
- Html support added in Studio
- Nice interface to register/unregister access keys
- Make Chocokup playgroud/sanbox independant in an iFrame
- Make Git history follow files renames
- Add file Rename/Delete services
FIXED BUGS
- make Http only Chocolate server really work!
- make ?how=edit use file type to set correct Ace language parser
- files could not be saved in static folder - static was only available to read file
- locals variable can be declared in Chocokup param and not only in Chocokup.render
- helpers variable can be declared in Chocokup to provides helpers functions or sub-templates to a main template
- clear Coffeescript JS panel when ther is an error
- added __ parameter documentation
NEW FEATURES
- better Bootstrap compatibility with Chocokup
- http only webapp - use config.coffee file with exports.http_only = yes
- move port, key and cert parameters in config.coffee
- better Chocokup and General error info returned by Chocolate
FIXED BUGS
- cpu to 100% with fresh project
- editing code in lab panel is very laggy
- 'body' does not work in chocokup when not used in panel
- 'static' folder missing
- incorrect Monit sample to supervise the upstart daemon
- update client libraries:
- coffescript: 1.6.2
- jasmine: 1.3.1
- ace: build 2013-03-14
- .js documents don't always work in editor
##v0.0.1 (2013-03-24)
Initial public release