5 * Added docs for `status` option special-case. Closes #739
6 * Fixed `options.filename`, exposing the view path to template engines
11 * Revert "removed jsonp stripping" for XSS
16 * Added `res.json()` JSONP support. Closes #737
17 * Added _extending-templates_ example. Closes #730
18 * Added "strict routing" setting for trailing slashes
19 * Added support for multiple envs in `app.configure()` calls. Closes #735
20 * Changed: `res.send()` using `res.json()`
21 * Changed: when cookie `path === null` don't default it
22 * Changed; default cookie path to "home" setting. Closes #731
23 * Removed _pids/logs_ creation from express(1)
28 * Added chainable `res.status(code)`
29 * Added `res.json()`, an explicit version of `res.send(obj)`
30 * Added simple web-service example
35 * \#express is now on freenode! come join!
36 * Added `req.get(field, param)`
37 * Added links to Japanese documentation, thanks @hideyukisaito!
38 * Added; the `express(1)` generated app outputs the env
39 * Added `content-negotiation` example
40 * Dependency: connect >= 1.5.1 < 2.0.0
41 * Fixed view layout bug. Closes #720
42 * Fixed; ignore body on 304. Closes #701
48 * Removed generation of dummy test file from `express(1)`
49 * Fixed; `express(1)` adds express as a dep
50 * Fixed; prune on `prepublish`
55 * Added `req.route`, exposing the current route
56 * Added _package.json_ generation support to `express(1)`
57 * Fixed call to `app.param()` function for optional params. Closes #682
62 * Fixed bug-ish with `../' in `res.partial()` calls
67 * Fixed `app.options()`
72 * Added route `Collection`, ex: `app.get('/user/:id').remove();`
73 * Added support for `app.param(fn)` to define param logic
74 * Removed `app.param()` support for callback with return value
75 * Removed module.parent check from express(1) generated app. Closes #670
76 * Refactored router. Closes #639
81 * Changed; using devDependencies instead of git submodules
82 * Fixed redis session example
83 * Fixed markdown example
84 * Fixed view caching, should not be enabled in development
89 * Added export `.view` as alias for `.View`
94 * Added `./examples/say`
95 * Fixed `res.sendfile()` bug preventing the transfer of files with spaces
100 * Added "case sensitive routes" option.
101 * Changed; split methods supported per rfc [slaskis]
102 * Fixed route-specific middleware when using the same callback function several times
112 * Added `app.match()` as `app.match.all()`
113 * Added `app.lookup()` as `app.lookup.all()`
114 * Added `app.remove()` for `app.remove.all()`
115 * Added `app.remove.VERB()`
116 * Fixed template caching collision issue. Closes #644
117 * Moved router over from connect and started refactor
122 * Added options support to `res.clearCookie()`
123 * Added `res.helpers()` as alias of `res.locals()`
124 * Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel * Dependency `connect >= 1.4.0`
125 * Changed; auto set Content-Type in res.attachement [Aaron Heckmann]
126 * Renamed "cache views" to "view cache". Closes #628
127 * Fixed caching of views when using several apps. Closes #637
128 * Fixed gotcha invoking `app.param()` callbacks once per route middleware.
130 * Fixed partial lookup precedence. Closes #631
136 * Added second callback support for `res.download()` connection errors
137 * Fixed `filename` option passing to template engine
142 * Added `layout(path)` helper to change the layout within a view. Closes #610
143 * Fixed `partial()` collection object support.
144 Previously only anything with `.length` would work.
145 When `.length` is present one must still be aware of holes,
146 however now `{ collection: {foo: 'bar'}}` is valid, exposes
147 `keyInCollection` and `keysInCollection`.
149 * Performance improved with better view caching
150 * Removed `request` and `response` locals
151 * Changed; errorHandler page title is now `Express` instead of `Connect`
156 * Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606
157 * Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606
158 * Added `app.VERB(path)` as alias of `app.lookup.VERB()`.
159 * Dependency `connect >= 1.2.0`
164 * Added; expose `err.view` object when failing to locate a view
165 * Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann]
166 * Fixed; `res.send(undefined)` responds with 204 [aheckmann]
171 * Added `<root>/_?<name>` partial lookup support. Closes #447
172 * Added `request`, `response`, and `app` local variables
173 * Added `settings` local variable, containing the app's settings
174 * Added `req.flash()` exception if `req.session` is not available
175 * Added `res.send(bool)` support (json response)
176 * Fixed stylus example for latest version
177 * Fixed; wrap try/catch around `res.render()`
182 * Fixed up index view path alternative.
183 * Changed; `res.locals()` without object returns the locals
185 2.0.0rc3 / 2011-03-17
188 * Added `res.locals(obj)` to compliment `res.local(key, val)`
189 * Added `res.partial()` callback support
190 * Fixed recursive error reporting issue in `res.render()`
192 2.0.0rc2 / 2011-03-17
195 * Changed; `partial()` "locals" are now optional
196 * Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01]
197 * Fixed .filename view engine option [reported by drudge]
199 * Fixed `{req,res}.app` reference when mounting [Ben Weaver]
204 * Fixed; expose `HTTPSServer` constructor
205 * Fixed express(1) default test charset. Closes #579 [reported by secoif]
206 * Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP]
208 2.0.0beta3 / 2011-03-09
211 * Added support for `res.contentType()` literal
212 The original `res.contentType('.json')`,
213 `res.contentType('application/json')`, and `res.contentType('json')`
215 * Added `res.render()` status option support back
216 * Added charset option for `res.render()`
217 * Added `.charset` support (via connect 1.0.4)
218 * Added view resolution hints when in development and a lookup fails
219 * Added layout lookup support relative to the page view.
220 For example while rendering `./views/user/index.jade` if you create
221 `./views/user/layout.jade` it will be used in favour of the root layout.
222 * Fixed `res.redirect()`. RFC states absolute url [reported by unlink]
223 * Fixed; default `res.send()` string charset to utf8
224 * Removed `Partial` constructor (not currently used)
226 2.0.0beta2 / 2011-03-07
229 * Added res.render() `.locals` support back to aid in migration process
230 * Fixed flash example
232 2.0.0beta / 2011-03-03
235 * Added HTTPS support
236 * Added `res.cookie()` maxAge support
237 * Added `req.header()` _Referrer_ / _Referer_ special-case, either works
238 * Added mount support for `res.redirect()`, now respects the mount-point
239 * Added `union()` util, taking place of `merge(clone())` combo
240 * Added stylus support to express(1) generated app
241 * Added secret to session middleware used in examples and generated app
242 * Added `res.local(name, val)` for progressive view locals
243 * Added default param support to `req.param(name, default)`
244 * Added `app.disabled()` and `app.enabled()`
245 * Added `app.register()` support for omitting leading ".", either works
246 * Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539
247 * Added `app.param()` to map route params to async/sync logic
248 * Added; aliased `app.helpers()` as `app.locals()`. Closes #481
249 * Added extname with no leading "." support to `res.contentType()`
250 * Added `cache views` setting, defaulting to enabled in "production" env
251 * Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_.
252 * Added `req.accepts()` support for extensions
253 * Changed; `res.download()` and `res.sendfile()` now utilize Connect's
254 static file server `connect.static.send()`.
255 * Changed; replaced `connect.utils.mime()` with npm _mime_ module
256 * Changed; allow `req.query` to be pre-defined (via middleware or other parent
257 * Changed view partial resolution, now relative to parent view
258 * Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`.
259 * Fixed `req.param()` bug returning Array.prototype methods. Closes #552
260 * Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()`
261 * Fixed; using _qs_ module instead of _querystring_
262 * Fixed; strip unsafe chars from jsonp callbacks
263 * Removed "stream threshold" setting
268 * Allow `req.query` to be pre-defined (via middleware or other parent app)
269 * "connect": ">= 0.5.0 < 1.0.0". Closes #547
270 * Removed the long deprecated __EXPRESS_ENV__ support
275 * Fixed `render()` setting inheritance.
276 Mounted apps would not inherit "view engine"
281 * Fixed `view engine` setting bug when period is in dirname
286 * Added secret to generated app `session()` call
291 * Added `qs` dependency to _package.json_
292 * Fixed namespaced `require()`s for latest connect support
297 * Remove unsafe characters from JSONP callback names [Ryan Grove]
302 * Removed nested require, using `connect.router`
307 * Fixed for middleware stacked via `createServer()`
308 previously the `foo` middleware passed to `createServer(foo)`
309 would not have access to Express methods such as `res.send()`
310 or props like `req.query` etc.
315 * Added; deduce partial object names from the last segment.
316 For example by default `partial('forum/post', postObject)` will
317 give you the _post_ object, providing a meaningful default.
318 * Added http status code string representation to `res.redirect()` body
319 * Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__.
320 * Added `req.is()` to aid in content negotiation
321 * Added partial local inheritance [suggested by masylum]. Closes #102
322 providing access to parent template locals.
323 * Added _-s, --session[s]_ flag to express(1) to add session related middleware
324 * Added _--template_ flag to express(1) to specify the
325 template engine to use.
326 * Added _--css_ flag to express(1) to specify the
327 stylesheet engine to use (or just plain css by default).
328 * Added `app.all()` support [thanks aheckmann]
329 * Added partial direct object support.
330 You may now `partial('user', user)` providing the "user" local,
331 vs previously `partial('user', { object: user })`.
332 * Added _route-separation_ example since many people question ways
333 to do this with CommonJS modules. Also view the _blog_ example for
335 * Performance; caching view path derived partial object names
336 * Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454
337 * Fixed jsonp support; _text/javascript_ as per mailinglist discussion
339 1.0.0rc4 / 2010-10-14
342 * Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0
343 * Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware))
344 * Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass]
345 * Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass]
346 * Added `partial()` support for array-like collections. Closes #434
347 * Added support for swappable querystring parsers
348 * Added session usage docs. Closes #443
349 * Added dynamic helper caching. Closes #439 [suggested by maritz]
350 * Added authentication example
351 * Added basic Range support to `res.sendfile()` (and `res.download()` etc)
352 * Changed; `express(1)` generated app using 2 spaces instead of 4
353 * Default env to "development" again [aheckmann]
354 * Removed _context_ option is no more, use "scope"
355 * Fixed; exposing _./support_ libs to examples so they can run without installs
358 1.0.0rc3 / 2010-09-20
361 * Added confirmation for `express(1)` app generation. Closes #391
362 * Added extending of flash formatters via `app.flashFormatters`
363 * Added flash formatter support. Closes #411
364 * Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold"
365 * Added _stream threshold_ setting for `res.sendfile()`
366 * Added `res.send()` __HEAD__ support
367 * Added `res.clearCookie()`
368 * Added `res.cookie()`
369 * Added `res.render()` headers option
370 * Added `res.redirect()` response bodies
371 * Added `res.render()` status option support. Closes #425 [thanks aheckmann]
372 * Fixed `res.sendfile()` responding with 403 on malicious path
373 * Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_
374 * Fixed; mounted apps settings now inherit from parent app [aheckmann]
375 * Fixed; stripping Content-Length / Content-Type when 204
376 * Fixed `res.send()` 204. Closes #419
377 * Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402
378 * Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo]
381 1.0.0rc2 / 2010-08-17
384 * Added `app.register()` for template engine mapping. Closes #390
385 * Added `res.render()` callback support as second argument (no options)
386 * Added callback support to `res.download()`
387 * Added callback support for `res.sendfile()`
388 * Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()`
389 * Added "partials" setting to docs
390 * Added default expresso tests to `express(1)` generated app. Closes #384
391 * Fixed `res.sendfile()` error handling, defer via `next()`
392 * Fixed `res.render()` callback when a layout is used [thanks guillermo]
393 * Fixed; `make install` creating ~/.node_libraries when not present
394 * Fixed issue preventing error handlers from being defined anywhere. Closes #387
399 * Added mounted hook. Closes #369
400 * Added connect dependency to _package.json_
402 * Removed "reload views" setting and support code
403 development env never caches, production always caches.
405 * Removed _param_ in route callbacks, signature is now
406 simply (req, res, next), previously (req, res, params, next).
407 Use _req.params_ for path captures, _req.query_ for GET params.
409 * Fixed "home" setting
410 * Fixed middleware/router precedence issue. Closes #366
411 * Fixed; _configure()_ callbacks called immediately. Closes #368
413 1.0.0beta2 / 2010-07-23
416 * Added more examples
417 * Added; exporting `Server` constructor
418 * Added `Server#helpers()` for view locals
419 * Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349
420 * Added support for absolute view paths
421 * Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363
422 * Added Guillermo Rauch to the contributor list
423 * Added support for "as" for non-collection partials. Closes #341
424 * Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf]
425 * Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo]
426 * Fixed instanceof `Array` checks, now `Array.isArray()`
427 * Fixed express(1) expansion of public dirs. Closes #348
428 * Fixed middleware precedence. Closes #345
429 * Fixed view watcher, now async [thanks aheckmann]
431 1.0.0beta / 2010-07-15
437 - Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs
442 * Utilize relative requires
443 * Added Static bufferSize option [aheckmann]
444 * Fixed caching of view and partial subdirectories [aheckmann]
445 * Fixed mime.type() comments now that ".ext" is not supported
446 * Updated haml submodule
447 * Updated class submodule
448 * Removed bin/express
453 * Added node v0.1.97 compatibility
454 * Added support for deleting cookies via Request#cookie('key', null)
455 * Updated haml submodule
456 * Fixed not-found page, now using using charset utf-8
457 * Fixed show-exceptions page, now using using charset utf-8
458 * Fixed view support due to fs.readFile Buffers
459 * Changed; mime.type() no longer accepts ".type" due to node extname() changes
464 * Added node v0.1.96 compatibility
465 * Added view `helpers` export which act as additional local variables
466 * Updated haml submodule
467 * Changed ETag; removed inode, modified time only
468 * Fixed LF to CRLF for setting multiple cookies
469 * Fixed cookie complation; values are now urlencoded
470 * Fixed cookies parsing; accepts quoted values and url escaped cookies
475 * Added support for layouts using different engines
476 - this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' })
477 - this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml'
478 - this.render('page.html.haml', { layout: false }) // no layout
479 * Updated ext submodule
480 * Updated haml submodule
481 * Fixed EJS partial support by passing along the context. Issue #307
486 * Fixed binary uploads.
491 * Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s
492 encoding is set to 'utf8' or 'utf-8'.
493 * Added "encoding" option to Request#render(). Closes #299
494 * Added "dump exceptions" setting, which is enabled by default.
495 * Added simple ejs template engine support
496 * Added error reponse support for text/plain, application/json. Closes #297
497 * Added callback function param to Request#error()
498 * Added Request#sendHead()
499 * Added Request#stream()
500 * Added support for Request#respond(304, null) for empty response bodies
501 * Added ETag support to Request#sendfile()
502 * Added options to Request#sendfile(), passed to fs.createReadStream()
503 * Added filename arg to Request#download()
504 * Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request
505 * Performance enhanced by preventing several calls to toLowerCase() in Router#match()
506 * Changed; Request#sendfile() now streams
507 * Changed; Renamed Request#halt() to Request#respond(). Closes #289
508 * Changed; Using sys.inspect() instead of JSON.encode() for error output
509 * Changed; run() returns the http.Server instance. Closes #298
510 * Changed; Defaulting Server#host to null (INADDR_ANY)
511 * Changed; Logger "common" format scale of 0.4f
512 * Removed Logger "request" format
513 * Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found
514 * Fixed several issues with http client
515 * Fixed Logger Content-Length output
516 * Fixed bug preventing Opera from retaining the generated session id. Closes #292
521 * Added DSL level error() route support
522 * Added DSL level notFound() route support
523 * Added Request#error()
524 * Added Request#notFound()
525 * Added Request#render() callback function. Closes #258
526 * Added "max upload size" setting
527 * Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254
528 * Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js
529 * Added callback function support to Request#halt() as 3rd/4th arg
530 * Added preprocessing of route param wildcards using param(). Closes #251
531 * Added view partial support (with collections etc)
532 * Fixed bug preventing falsey params (such as ?page=0). Closes #286
533 * Fixed setting of multiple cookies. Closes #199
534 * Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml)
535 * Changed; session cookie is now httpOnly
536 * Changed; Request is no longer global
537 * Changed; Event is no longer global
538 * Changed; "sys" module is no longer global
539 * Changed; moved Request#download to Static plugin where it belongs
540 * Changed; Request instance created before body parsing. Closes #262
541 * Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253
542 * Changed; Pre-caching view partials in memory when "cache view partials" is enabled
543 * Updated support to node --version 0.1.90
544 * Updated dependencies
545 * Removed set("session cookie") in favour of use(Session, { cookie: { ... }})
546 * Removed utils.mixin(); use Object#mergeDeep()
551 * Added coffeescript example app. Closes #242
552 * Changed; cache api now async friendly. Closes #240
553 * Removed deprecated 'express/static' support. Use 'express/plugins/static'
558 * Added Request#isXHR. Closes #229
559 * Added `make install` (for the executable)
560 * Added `express` executable for setting up simple app templates
561 * Added "GET /public/*" to Static plugin, defaulting to <root>/public
562 * Added Static plugin
563 * Fixed; Request#render() only calls cache.get() once
564 * Fixed; Namespacing View caches with "view:"
565 * Fixed; Namespacing Static caches with "static:"
566 * Fixed; Both example apps now use the Static plugin
567 * Fixed set("views"). Closes #239
568 * Fixed missing space for combined log format
569 * Deprecated Request#sendfile() and 'express/static'
570 * Removed Server#running
575 * Added Request#flash() support without args, now returns all flashes
576 * Updated ext submodule
581 * Fixed session reaper
582 * Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft)
588 * Fixed requiring of haml / sass due to kiwi removal
593 * Fixed GIT submodules (HAH!)
598 * Changed; Express now using submodules again until a PM is adopted
599 * Changed; chat example using millisecond conversions from ext
604 * Added Request#pass() support (finds the next matching route, or the given path)
605 * Added Logger plugin (default "common" format replaces CommonLogger)
606 * Removed Profiler plugin
607 * Removed CommonLogger plugin
612 * Added seed.yml for kiwi package management support
613 * Added HTTP client query string support when method is GET. Closes #205
615 * Added support for arbitrary view engines.
616 For example "foo.engine.html" will now require('engine'),
617 the exports from this module are cached after the first require().
619 * Added async plugin support
621 * Removed usage of RESTful route funcs as http client
622 get() etc, use http.get() and friends
624 * Removed custom exceptions
629 * Added ext dependency (library of js extensions)
630 * Removed extname() / basename() utils. Use path module
631 * Removed toArray() util. Use arguments.values
632 * Removed escapeRegexp() util. Use RegExp.escape()
633 * Removed process.mixin() dependency. Use utils.mixin()
635 * Removed ElementCollection
636 * Shameless self promotion of ebook "Advanced JavaScript" (http://dev-mag.com) ;)
641 * Added flash() example to sample upload app
642 * Added high level restful http client module (express/http)
643 * Changed; RESTful route functions double as HTTP clients. Closes #69
644 * Changed; throwing error when routes are added at runtime
645 * Changed; defaulting render() context to the current Request. Closes #197
646 * Updated haml submodule
651 * Updated haml / sass submodules. Closes #200
652 * Added flash message support. Closes #64
653 * Added accepts() now allows multiple args. fixes #117
654 * Added support for plugins to halt. Closes #189
655 * Added alternate layout support. Closes #119
656 * Removed Route#run(). Closes #188
657 * Fixed broken specs due to use(Cookie) missing
662 * Added "plot" format option for Profiler (for gnuplot processing)
663 * Added request number to Profiler plugin
664 * Fixed binary encoding for multi-part file uploads, was previously defaulting to UTF8
665 * Fixed issue with routes not firing when not files are present. Closes #184
666 * Fixed process.Promise -> events.Promise
671 * Added parseParam() support for name[] etc. (allows for file inputs with "multiple" attr) Closes #180
672 * Added Both Cache and Session option "reapInterval" may be "reapEvery". Closes #174
673 * Added expiration support to cache api with reaper. Closes #133
674 * Added cache Store.Memory#reap()
675 * Added Cache; cache api now uses first class Cache instances
676 * Added abstract session Store. Closes #172
677 * Changed; cache Memory.Store#get() utilizing Collection
678 * Renamed MemoryStore -> Store.Memory
679 * Fixed use() of the same plugin several time will always use latest options. Closes #176
684 * Changed; Hooks (before / after) pass request as arg as well as evaluated in their context
685 * Updated node support to 0.1.27 Closes #169
686 * Updated dirname(__filename) -> __dirname
687 * Updated libxmljs support to v0.2.0
688 * Added session support with memory store / reaping
689 * Added quick uid() helper
690 * Added multi-part upload support
691 * Added Sass.js support / submodule
692 * Added production env caching view contents and static files
693 * Added static file caching. Closes #136
694 * Added cache plugin with memory stores
695 * Added support to StaticFile so that it works with non-textual files.
696 * Removed dirname() helper
697 * Removed several globals (now their modules must be required)
702 * Added view benchmarks; currently haml vs ejs
703 * Added Request#attachment() specs. Closes #116
704 * Added use of node's parseQuery() util. Closes #123
705 * Added `make init` for submodules
707 * Updated sample chat app to show messages on load
708 * Updated libxmljs parseString -> parseHtmlString
709 * Fixed `make init` to work with older versions of git
710 * Fixed specs can now run independant specs for those who cant build deps. Closes #127
711 * Fixed issues introduced by the node url module changes. Closes 126.
712 * Fixed two assertions failing due to Collection#keys() returning strings
713 * Fixed faulty Collection#toArray() spec due to keys() returning strings
714 * Fixed `make test` now builds libxmljs.node before testing