Added ETag and Cache-Control headers to cached routes and static files. See "Client-Side Caching" in the readme.
Minor breaking change due to a bug fix: the app's urlPath (config.urlPaths.app) is now removed from params.route.filePath for static resources to provide an accurate file path from your public web root. The appropriate replacement is params.route.pathname, which includes the entire path after your site's domain.
BREAKING CHANGE: The nesting syntax for the cache directive has changed slightly, but updating your code will be easy (mostly copy/paste of your existing cache directives). See "Caching Routes and Controllers" in the readme.
BREAKING CHANGE: File cache retrieval syntax has changed. You must now specify the file attribute rather than the key attribute:
app.exists({ file: '/path/to/file.txt' });
app.retrieve({ file: '/path/to/file.txt' });
app.exists({ file: 'myCustomKey' });
app.retrieve({ file: 'myCustomKey' });
gzip support added for both dynamic and static resources. See configuration options in the readme.
Static asset caching added. See configuration options in the readme.
You can now specify a node name in the URL to return a specific top-level JSON node (/format/json/output/nodename). Works for JSONP also. See JSON in the readme for instructions.
Added Forms section to readme to provide some tips on working with form data and creating progressively enhanced forms
citizen's reserved URL parameters no longer need to be added to cache.directives manually
Added an option to log a warning about invalid cache URL parameters instead of throwing an error. If citizen encounters a URL parameter not present in cache.urlParams, the route will be processed and displayed, but not cached. This is now the default behavior. Use "cache": { "invalidUrlParams" : "throw" } in your config to throw an error instead.
The server now throws an error if you try to assign values to any reserved directive names that will cause problems in your application; scopes include url, session, content, and others. I'd label this a breaking change, but if you're doing this, your application is probably already broken.
app.listen() has been enhanced to perform asynchronous parallel, series, or waterfall processing. This is a non-breaking change because the default behavior (parallel) is the same as the original behavior. See listen() in the readme for details.
Replaced POST body parsing with formidable. I hate adding dependencies, but formidable is the standard and it works very well, so it seems silly to write a multipart form parser from scratch.
Fixed default debug rendering (defaults to console, view is optional)
Errors now have their own views determined by the JS error code or HTTP status code, with a catch-all default error view. These views are optional and have no matching controller or model. See readme for details.
Fixed a bug in the view directive when used within an include controller. Note that the view directive still can't (and never will) work within a cached include controller. You need to specify the include controller's view in the include directive of the calling controller if you intend to cache the result.
Improved error messages by throwing proper Error objects, allowing more useful trace logs