UNPKG

60.9 kBMarkdownView Raw
1# Release Notes
2
3## Development
4
5[Commits](https://github.com/handlebars-lang/handlebars.js/compare/v4.7.7...master)
6
7## v4.7.7 - February 15th, 2021
8
9- fix weird error in integration tests - eb860c0
10- fix: check prototype property access in strict-mode (#1736) - b6d3de7
11- fix: escape property names in compat mode (#1736) - f058970
12- refactor: In spec tests, use expectTemplate over equals and shouldThrow (#1683) - 77825f8
13- chore: start testing on Node.js 12 and 13 - 3789a30
14
15(POSSIBLY) BREAKING CHANGES:
16
17- the changes from version [4.6.0](https://github.com/handlebars-lang/handlebars.js/blob/master/release-notes.md#v460---january-8th-2020) now also apply
18 in when using the compile-option "strict: true". Access to prototype properties is forbidden completely by default, specific properties or methods
19 can be allowed via runtime-options. See #1633 for details. If you are using Handlebars as documented, you should not be accessing prototype properties
20 from your template anyway, so the changes should not be a problem for you. Only the use of undocumented features can break your build.
21
22That is why we only bump the patch version despite mentioning breaking changes.
23
24[Commits](https://github.com/wycats/handlebars.js/compare/v4.7.6...v4.7.7)
25
26## v4.7.6 - April 3rd, 2020
27
28Chore/Housekeeping:
29
30- [#1672](https://github.com/wycats/handlebars.js/issues/1672) - Switch cmd parser to latest minimist ([@dougwilson](https://api.github.com/users/dougwilson)
31
32Compatibility notes:
33
34- Restored Node.js compatibility
35
36[Commits](https://github.com/wycats/handlebars.js/compare/v4.7.5...v4.7.6)
37
38## v4.7.5 - April 2nd, 2020
39
40Chore/Housekeeping:
41
42- ~Node.js version support has been changed to v6+~ Reverted in 4.7.6
43
44Compatibility notes:
45
46- ~Node.js < v6 is no longer supported~ Reverted in 4.7.6
47
48[Commits](https://github.com/wycats/handlebars.js/compare/v4.7.4...v4.7.5)
49
50## v4.7.4 - April 1st, 2020
51
52Chore/Housekeeping:
53
54- [#1666](https://github.com/wycats/handlebars.js/issues/1666) - Replaced minimist with yargs for handlebars CLI ([@aorinevo](https://api.github.com/users/aorinevo), [@AviVahl](https://api.github.com/users/AviVahl) & [@fabb](https://api.github.com/users/fabb))
55
56Compatibility notes:
57
58- No incompatibilities are to be expected
59
60[Commits](https://github.com/wycats/handlebars.js/compare/v4.7.3...v4.7.4)
61
62## v4.7.3 - February 5th, 2020
63
64Chore/Housekeeping:
65
66- [#1644](https://github.com/wycats/handlebars.js/issues/1644) - Download links to aws broken on handlebarsjs.com - access denied ([@Tea56](https://api.github.com/users/Tea56))
67- Fix spelling and punctuation in changelog - d78cc73
68
69Bugfixes:
70
71- Add Type Definition for Handlebars.VERSION, Fixes #1647 - 4de51fe
72- Include Type Definition for runtime.js in Package - a32d05f
73
74Compatibility notes:
75
76- No incompatibilities are to be expected
77
78[Commits](https://github.com/wycats/handlebars.js/compare/v4.7.2...v4.7.3)
79
80## v4.7.2 - January 13th, 2020
81
82Bugfixes:
83
84- fix: don't wrap helpers that are not functions - 9d5aa36, #1639
85
86Chore/Build:
87
88- chore: execute saucelabs-task only if access-key exists - a4fd391
89
90Compatibility notes:
91
92- No breaking changes are to be expected
93
94[Commits](https://github.com/wycats/handlebars.js/compare/v4.7.1...v4.7.2)
95
96## v4.7.1 - January 12th, 2020
97
98Bugfixes:
99
100- fix: fix log output in case of illegal property access - f152dfc
101- fix: log error for illegal property access only once per property - 3c1e252
102
103Compatibility notes:
104
105- no incompatibilities are to be expected.
106
107[Commits](https://github.com/wycats/handlebars.js/compare/v4.7.0...v4.7.1)
108
109## v4.7.0 - January 10th, 2020
110
111Features:
112
113- feat: default options for controlling proto access - 7af1c12, #1635
114 - This makes it possible to disable the prototype access restrictions added in 4.6.0
115 - an error is logged in the console, if access to prototype properties is attempted and denied
116 and no explicit configuration has taken place.
117
118Compatibility notes:
119
120- no compatibilities are expected
121
122[Commits](https://github.com/wycats/handlebars.js/compare/v4.6.0...v4.7.0)
123
124## v4.6.0 - January 8th, 2020
125
126Features:
127
128- feat: access control to prototype properties via whitelist (#1633)- d03b6ec
129
130Bugfixes:
131
132- fix(runtime.js): partials compile not caching (#1600) - 23d58e7
133
134Chores, docs:
135
136- various refactorings and improvements to tests - d7f0dcf, 187d611, d337f40
137- modernize the build-setup
138 - use prettier to format and eslint to verify - c40d9f3, 8901c28, e97685e, 1f61f21
139 - use nyc instead of istanbul to collect coverage - 164b7ff, 1ebce2b
140 - update build code to use modern javascript and make it cleaner - 14b621c, 1ec1737, 3a5b65e, dde108e, 04b1984, 587e7a3
141 - restructur build commands - e913dc5,
142- eslint rule changes - ac4655e, dc54952
143- Update (C) year in the LICENSE file - d1fb07b
144- chore: try to fix saucelabs credentials (#1627) -
145- Update readme.md with updated links (#1620) - edcc84f
146
147BREAKING CHANGES:
148
149- access to prototype properties is forbidden completely by default,
150 specific properties or methods can be allowed via runtime-options.
151 See #1633 for details.
152 If you are using Handlebars as documented, you should not be accessing prototype
153 properties from your template anyway, so the changes should not be a problem
154 for you. Only the use of undocumented features can break your build.
155
156 That is why we only bump the minor version despite mentioning breaking changes.
157
158[Commits](https://github.com/wycats/handlebars.js/compare/v4.5.3...v4.6.0)
159
160## v4.5.3 - November 18th, 2019
161
162Bugfixes:
163
164- fix: add "no-prototype-builtins" eslint-rule and fix all occurences - f7f05d7
165- fix: add more properties required to be enumerable - 1988878
166
167Chores / Build:
168
169- fix: use !== 0 instead of != 0 - c02b05f
170- add chai and dirty-chai and sinon, for cleaner test-assertions and spies,
171 deprecate old assertion-methods - 93e284e, 886ba86, 0817dad, 93516a0
172
173Security:
174
175- The properties `__proto__`, `__defineGetter__`, `__defineSetter__` and `__lookupGetter__`
176 have been added to the list of "properties that must be enumerable".
177 If a property by that name is found and not enumerable on its parent,
178 it will silently evaluate to `undefined`. This is done in both the compiled template and the "lookup"-helper.
179 This will prevent new Remote-Code-Execution exploits that have been
180 published recently.
181
182Compatibility notes:
183
184- Due to the security-fixes. The semantics of the templates using
185 `__proto__`, `__defineGetter__`, `__defineSetter__` and `__lookupGetter__` in the respect that those expression now return
186 `undefined` rather than their actual value from the proto.
187- The semantics have not changed in cases where the properties are enumerable, as in:
188
189```js
190{
191 __proto__: 'some string';
192}
193```
194
195- The change may be breaking in that respect, but we still only
196 increase the patch-version, because the incompatible use-cases
197 are not intended, undocumented and far less important than fixing
198 Remote-Code-Execution exploits on existing systems.
199
200[Commits](https://github.com/wycats/handlebars.js/compare/v4.5.2...v4.5.3)
201
202## v4.5.2 - November 13th, 2019
203
204# Bugfixes
205
206- fix: use String(field) in lookup when checking for "constructor" - d541378
207- test: add fluent API for testing Handlebars - c2ac79c
208
209Compatibility notes:
210
211- no incompatibility are to be expected
212
213[Commits](https://github.com/wycats/handlebars.js/compare/v4.5.1...v4.5.2)
214
215## v4.5.1 - October 29th, 2019
216
217Bugfixs
218
219- fix: move "eslint-plugin-compat" to devDependencies - 5e9d17f (#1589)
220
221Compatibility notes:
222
223- No compatibility issues are to be expected
224
225[Commits](https://github.com/wycats/handlebars.js/compare/v4.5.0...v4.5.1)
226
227## v4.5.0 - October 28th, 2019
228
229Features / Improvements
230
231- Add method Handlebars.parseWithoutProcessing (#1584) - 62ed3c2
232- add guard to if & unless helpers (#1549)
233- show source location for the strict lookup exceptions - feb60f8
234
235Bugfixes:
236
237- Use objects for hash value tracking - 7fcf9d2
238
239Chore:
240
241- Resolve deprecation warning message from eslint while running eslint (#1586) - 7052e88
242- chore: add eslint-plugin-compat and eslint-plugin-es5 - 088e618
243
244Compatibility notes:
245
246- No compatibility issues are to be expected
247
248[Commits](https://github.com/wycats/handlebars.js/compare/v4.4.5...v4.5.0)
249
250## v4.4.5 - October 20th, 2019
251
252Bugfixes:
253
254- Contents of raw-blocks must be matched with non-eager regex-matching - 8d5530e, #1579
255
256[Commits](https://github.com/wycats/handlebars.js/compare/v4.4.4...v4.4.5)
257
258## v4.4.4 - October 20th, 2019
259
260Bugfixes:
261
262- fix: prevent zero length tokens in raw-blocks (#1577, #1578) - f1752fe
263
264Chore:
265
266- chore: link to s3 bucket with https, add "npm ci" to build instructions - 0b593bf
267
268Compatibility notes:
269
270- no compatibility issues are expected
271
272[Commits](https://github.com/wycats/handlebars.js/compare/v4.4.3...v4.4.4)
273
274## v4.4.3 - October 8th, 2019
275
276Bugfixes
277
278Typings:
279
280- add missing type fields to AST typings and add tests for them - 0440af2
281
282[Commits](https://github.com/wycats/handlebars.js/compare/v4.4.2...v4.4.3)
283
284## v4.4.2 - October 2nd, 2019
285
286- chore: fix grunt-saucelabs dependency - b7eada0
287
288[Commits](https://github.com/wycats/handlebars.js/compare/v4.4.1...v4.4.2)
289
290## v4.4.1 - October 2nd, 2019
291
292- [#1562](https://github.com/wycats/handlebars.js/issues/1562) - Error message for syntax error missing location in 4.2.1+
293
294[Commits](https://github.com/wycats/handlebars.js/compare/v4.4.0...v4.4.1)
295
296## v4.4.0 - September 29th, 2019
297
298- Added support for iterable objects in {{#each}} helper (#1557) - cf7545e
299
300[Commits](https://github.com/wycats/handlebars.js/compare/v4.3.4...v4.4.0)
301
302## v4.3.4 - September 28th, 2019
303
304- fix: harden "propertyIsEnumerable"-check - ff4d827
305
306Compatibility notes:
307
308- No incompatibilities are known.
309
310[Commits](https://github.com/wycats/handlebars.js/compare/v4.3.3...v4.3.4)
311
312## v4.3.3 - September 27th, 2019
313
314- fix test case for browsers that do not support **defineGetter** - 8742bde
315
316[Commits](https://github.com/wycats/handlebars.js/compare/v4.3.2...v4.3.3)
317
318## v4.3.2 - September 26th, 2019
319
320- Use Object.prototype.propertyIsEnumerable to check for constructors - 213c0bb, #1563
321
322Compatibility notes:
323
324- There are no breaking changes
325
326[Commits](https://github.com/wycats/handlebars.js/compare/v4.3.1...v4.3.2)
327
328## v4.3.1 - September 25th, 2019
329
330Fixes:
331
332- do not break on precompiled templates from Handlebars >=4.0.0 <4.3.0 - 1266838, #1561
333- Ensure allowCallsToHelperMissing runtime option is optional in typings - 93444c5, 64ecb9e, #1560
334
335[Commits](https://github.com/wycats/handlebars.js/compare/v4.3.0...v4.3.1)
336
337## v4.3.0 - September 24th, 2019
338
339Fixes:
340
341- Security: Disallow calling "helperMissing" and "blockHelperMissing" directly - 2078c72
342- Disallow calling "helperMissing" and "blockHelperMissing" directly - 2078c72
343
344Features:
345
346- Add new runtime option `allowCallsToHelperMissing` to allow calling `blockHelperMissing` and `helperMissing`.
347
348Breaking changes:
349
350Compatibility notes:
351
352- Compiler revision increased - 06b7224
353
354 - This means that template compiled with versions prior to 4.3.0 will not work with runtimes >= 4.3.0
355 The increase was done because the "helperMissing" and "blockHelperMissing" are now moved from the helpers
356 to the internal "container.hooks" object, so old templates will not be able to call them anymore. We suggest
357 that you always recompile your templates with the latest compiler in your build pipelines.
358
359- Disallow calling "helperMissing" and "blockHelperMissing" directly - 2078c72
360 - Calling "helperMissing" and "blockHelperMissing" directly from a template (like in `{{blockHelperMissing}}` was
361 never intended and was part of the exploits that have been revealed early in 2019
362 (see https://github.com/wycats/handlebars.js/issues/1495). _It is also part of a new exploit that
363 is not captured by the earlier fix._ In order to harden Handlebars against such exploits, calling thos helpers
364 is now not possible anymore. _Overriding_ those helpers is still possible.
365 - If you really need this behavior, you can set the runtime option `allowCallsToHelperMissing` to `true` and the
366 calls will again be possible
367
368Both bullet points imly that Handlebars is not 100% percent compatible to 4.2.0, despite the minor version bump.
369
370We consider it more important to resolve a major security issue than to maintain 100% compatibility.
371
372[Commits](https://github.com/wycats/handlebars.js/compare/v4.2.1...v4.3.0)
373
374## v4.2.1 - September 20th, 2019
375
376Bugfixes:
377
378- The "browser" property in the package.json has been updated to use the common-js builds instead of the minified UMD - c55a7be, #1553
379
380Compatibility notes:
381
382- No compatibility issues should arise
383
384[Commits](https://github.com/wycats/handlebars.js/compare/v4.2.0...v4.2.1)
385
386## v4.2.0 - September 3rd, 2019
387
388Chore/Test:
389
390- Use custom `grunt-saucelab` with current sauce-connect proxy - f119497
391- Add framework for various integration tests - f9cce4d
392- Add integration test for webpack - a57b682
393
394Bugfixes:
395
396- [#1544](https://github.com/wycats/handlebars.js/issues/1544) - Typescript types: `knownHelpers` doesnt allow for custom helpers ([@NickCis](https://api.github.com/users/NickCis))
397- [#1534](https://github.com/wycats/handlebars.js/pull/1534) - Add typings for "Handlebars.VM.resolvePartial ([@AndrewLeedham](https://api.github.com/users/AndrewLeedham))
398
399Features:
400
401- [#1540](https://github.com/wycats/handlebars.js/pull/1540) - added "browser"-property to package.json, resolves #1102 ([@ouijan](https://api.github.com/users/ouijan))
402
403Compatibility notes:
404
405- The new "browser"-property should not break anything, but you can never be sure. The integration test for webpack
406 shows that it works, but if it doesn't please open an issue.
407
408[Commits](https://github.com/wycats/handlebars.js/compare/v4.1.2-0...v4.2.0)
409
410## v4.1.2-0 - August 25th, 2019
411
412[#1540](https://github.com/wycats/handlebars.js/pull/1540) - added browser to package.json, resolves #1102 ([@ouijan](https://api.github.com/users/ouijan))
413
414Compatibility notes:
415
416- We are not sure if imports via webpack are still working, which is why this release is a pre-release
417
418[Commits](https://github.com/wycats/handlebars.js/compare/v4.1.2...v4.1.2-0)
419
420## v4.1.2 - April 13th, 2019
421
422Chore/Test:
423
424- [#1515](https://github.com/wycats/handlebars.js/pull/1515) - Port over linting and test for typings ([@zimmi88](https://api.github.com/users/zimmi88))
425- chore: add missing typescript dependency, add package-lock.json - 594f1e3
426- test: remove safari from saucelabs - 871accc
427
428Bugfixes:
429
430- fix: prevent RCE through the "lookup"-helper - cd38583
431
432Compatibility notes:
433
434Access to the constructor of a class thought `{{lookup obj "constructor" }}` is now prohibited. This closes
435a leak that only half closed in versions 4.0.13 and 4.1.0, but it is a slight incompatibility.
436
437This kind of access is not the intended use of Handlebars and leads to the vulnerability described
438in #1495. We will **not** increase the major version, because such use is not intended or documented,
439and because of the potential impact of the issue (we fear that most people won't use a new major version
440and the issue may not be resolved on many systems).
441
442[Commits](https://github.com/wycats/handlebars.js/compare/v4.1.1...v4.1.2)
443
444## v4.1.1 - March 16th, 2019
445
446Bugfixes:
447
448- fix: add "runtime.d.ts" to allow "require('handlebars/runtime')" in TypeScript - 5cedd62
449
450Refactorings:
451
452- replace "async" with "neo-async" - 048f2ce
453- use "substring"-function instead of "substr" - 445ae12
454
455Compatibility notes:
456
457- This is a bugfix release. There are no breaking change and no new features.
458
459[Commits](https://github.com/wycats/handlebars.js/compare/v4.1.0...v4.1.1)
460
461## v4.1.0 - February 7th, 2019
462
463New Features
464
465- import TypeScript typings - 27ac1ee
466
467Security fixes:
468
469- disallow access to the constructor in templates to prevent RCE - 42841c4, #1495
470
471Housekeeping
472
473- chore: fix components/handlebars package.json and auto-update on release - bacd473
474- chore: Use node 10 to build handlebars - 78dd89c
475- chore/doc: Add more release docs - 6b87c21
476
477Compatibility notes:
478
479Access to class constructors (i.e. `({}).constructor`) is now prohibited to prevent
480Remote Code Execution. This means that following construct will no work anymore:
481
482```
483class SomeClass {
484}
485
486SomeClass.staticProperty = 'static'
487
488var template = Handlebars.compile('{{constructor.staticProperty}}');
489document.getElementById('output').innerHTML = template(new SomeClass());
490// expected: 'static', but now this is empty.
491```
492
493This kind of access is not the intended use of Handlebars and leads to the vulnerability described in #1495. We will **not** increase the major version, because such use is not intended or documented, and because of the potential impact of the issue (we fear that most people won't use a new major version and the issue may not be resolved on many systems).
494
495[Commits](https://github.com/wycats/handlebars.js/compare/v4.0.12...v4.1.0)
496
497## v4.0.12 - September 4th, 2018
498
499New features:
500
501- none
502
503Various dependency updates
504
505- [#1464](https://github.com/wycats/handlebars.js/pull/1464) - Bump versions of grunt-plugins to 1.x
506- [#1398](https://github.com/wycats/handlebars.js/pull/1398) - Chore: updated various dev dependencies
507- upgrade uglify-js - d3d3942
508- Update grunt-eslint to 20.1.0 - 7729aa9
509- Update dependencies "async" to 2.5.0 and "source-map" to 0.6.1 (73d5637)
510
511Bugfixes:
512
513- [components/handlebars.js#24](https://github.com/components/handlebars.js#24) Add package.json to components shim
514- Updated `source-map`-package should work better with `rollup`[#1463](https://github.com/wycats/handlebars.js/issues/1463)
515
516Removed obsolete code:
517
518- unnecessary check - 0ddff8b
519- Use `files` field - 69c6ca5
520- Update jsfiddle to 4.0.11 - 8947dd0
521
522Compatibility notes:
523
524- No compatibility issues are to be expected
525
526[Commits](https://github.com/wycats/handlebars.js/compare/v4.0.11...v4.0.12)
527
528## v4.0.11 - October 17th, 2017
529
530- [#1391](https://github.com/wycats/handlebars.js/issues/1391) - `uglify-js` is unconditionally imported, but only listed as optional dependency ([@Turbo87](https://github.com/Turbo87))
531- [#1233](https://github.com/wycats/handlebars.js/issues/1233) - Unable to build under windows - error at test:bin task ([@blikblum](https://github.com/blikblum))
532- Update (C) year in the LICENSE file - 21386b6
533
534Compatibility notes:
535
536- This is a bugfix release. There are no breaking change and no new features.
537
538[Commits](https://github.com/wycats/handlebars.js/compare/v4.0.10...v4.0.11)
539
540## v4.0.10 - May 21st, 2017
541
542- Fix regression in 4.0.9: Replace "Object.assign" (not support in IE) by "util/extend" - 0e953d1
543
544[Commits](https://github.com/wycats/handlebars.js/compare/v4.0.9...v4.0.10)
545
546## v4.0.9 - May 21st, 2017
547
548- [#1327](https://github.com/wycats/handlebars.js/issues/1327) Handlebars.compile() does not modify "options" anymore
549- pending [#1331](https://github.com/wycats/handlebars.js/issues/1331) Attempts to build Handlebars in a Windows environment
550 - Fix build in windows - cc554a5
551 - Ensure LF line-edings in handlebars-template fixtures (\*.hbs) - ed879a6
552 - Run integration test with `node handlebars -a ...` on Windows - 2e21e2b
553 - Ensure LF line-edings in lexer-files (\*.l) - bdfdbea
554 - Force LF line-endings for spec/artifacts - b50ef03
555 - Use istanbul/lib/cli.js instead of node_modules/.bin/istanbul - 6e6269f
556- TravisCI: Publish valid semver tags independently of the branch - 7378f85
557
558Compatibility notes:
559
560- No compatibility issues are expected.
561
562[Commits](https://github.com/wycats/handlebars.js/compare/v4.0.8...v4.0.9)
563
564## v4.0.8 - May 2nd, 2017
565
566- [#1341](https://github.com/wycats/handlebars.js/issues/1341) [#1342](https://github.com/wycats/handlebars.js/issues/1342) Allow partial-blocks to be executed without "options" ([@nknapp](https://github.com/nknapp)) - a00c598
567
568Compatibility notes:
569
570- No breaking changes
571
572[Commits](https://github.com/wycats/handlebars.js/compare/v4.0.7...v4.0.8)
573
574## v4.0.7 - April 29th, 2017
575
576- [#1319](https://github.com/wycats/handlebars.js/issues/1319): Fix context-stack when calling block-helpers on null values ([@nknapp](https://github.com/nknapp)) - c8f4b57
577- [#1315](https://github.com/wycats/handlebars.js/pull/1315) Parser: Change suffix to use ES6 default module export ([@Turbo87](https://github.com/Turbo87))- b617375
578- [#1290](https://github.com/wycats/handlebars.js/pull/1290) [#1252](https://github.com/wycats/handlebars.js/issue/1290) Add more tests for partial-blocks and inline partials ([@nknapp](https://github.com/nknapp)) - 63a8e0c
579- [#1252](https://github.com/wycats/handlebars.js/issue/1290) Using @partial-block twice in a template not possible ([@nknapp](https://github.com/nknapp)) - 5a164d0
580- [#1310](https://github.com/wycats/handlebars.js/pull/1310) Avoid duplicate "sourceMappingURL=" lines. ([@joonas-lahtinen](https://github.com/joonas-lahtinen)) - 01b0f65
581- [#1275](https://github.com/wycats/handlebars.js/pull/1275) require('sys') is deprecated, using 'util' instead ([@travnels](https://github.com/travnels)) - 406f2ee
582- [#1285](https://github.com/wycats/handlebars.js/pull/1285) [#1284](https://github.com/wycats/handlebars.js/issues/1284) Make "column"-property of Errors enumerable ([@nknapp](https://github.com/nknapp)) - a023cb4
583- [#1285](https://github.com/wycats/handlebars.js/pull/1285) Testcase to verify that compile-errors have a column-property ([@nknapp](https://github.com/nknapp)) - c7dc353
584
585[Commits](https://github.com/wycats/handlebars.js/compare/v4.0.6...v4.0.7)
586
587## v4.0.6 - November 12th, 2016
588
589- [#1243](https://github.com/wycats/handlebars.js/pull/1243) - Walk up data frames for nested @partial-block ([@lawnsea](https://github.com/lawnsea))
590- [#1210](https://github.com/wycats/handlebars.js/pull/1210) - Add a new lightweight package based on handlebars in the README ([@kabirbaidhya](https://github.com/kabirbaidhya))
591- [#1187](https://github.com/wycats/handlebars.js/pull/1187) - Ensure that existing blockParams and depths are respected on dupe programs ([@charleso](https://github.com/charleso))
592- [#1191](https://github.com/wycats/handlebars.js/pull/1191) - Added cory ([@leo](https://github.com/leo))
593- [#1177](https://github.com/wycats/handlebars.js/pull/1177) - Preserve License info in Closure Compiler ([@gennadiylitvinyuk](https://github.com/gennadiylitvinyuk))
594- [#1171](https://github.com/wycats/handlebars.js/pull/1171) - Contributing doc fix: failing thats -> failing tests ([@paulfalgout](https://github.com/paulfalgout))
595- [#1166](https://github.com/wycats/handlebars.js/pull/1166) - Update license date ([@timwangdev](https://github.com/timwangdev))
596- Update jsfiddle to point to latest - 959ee55 (originally dfc7554 by [@kpdecker](https://github.com/kpdecker))
597- [#1163](https://github.com/wycats/handlebars.js/pull/1163) - Fix typos on decorators-api.md. ([@adjohnson916](https://github.com/adjohnson916))
598- Drop extra Error params - 8c19874 (originally 63fdb92 by [@kpdecker](https://github.com/kpdecker))
599- [#1153](https://github.com/wycats/handlebars.js/pull/1153) - Add documentation for running tests to contributing.md ([@ryanmurakami](https://github.com/ryanmurakami))
600- Avoid error in older browsers in test - 400916c (originally a6121ca by [@kpdecker](https://github.com/kpdecker))
601- Update target browser test versions - fee2334 (originally 871c32a by [@kpdecker](https://github.com/kpdecker))
602- Exclude coverage check in exception conditional - 32d6363 (originally 326734b by [@kpdecker](https://github.com/kpdecker))
603- Fix throw when creating exception object in Safari - 20c965c (originally 2ea6119 by [@kpdecker](https://github.com/kpdecker))
604- Update build for modern node versions - 6c9f98c (originally 8289c0b by [@kpdecker](https://github.com/kpdecker))
605- [#1135](https://github.com/wycats/handlebars.js/issues/1135) - Relax depth check for context push - c393c81 (originally 25458fd by [@kpdecker](https://github.com/kpdecker))
606
607[Commits](https://github.com/wycats/handlebars.js/compare/v4.0.5...v4.0.6)
608
609## v4.0.5 - November 19th, 2015
610
611- [#1132](https://github.com/wycats/handlebars.js/pull/1132) - Update uglify-js to avoid vulnerability ([@plynchnlm](https://github.com/plynchnlm))
612- [#1129](https://github.com/wycats/handlebars.js/issues/1129) - Minified lib returns an empty string ([@bricss](https://github.com/bricss))
613- Return current handlebars instance from noConflict - 685cf92
614- Add webpack to dev dependency to support npm 3 - 7a6c228
615- Further relax uglify dependency - 0a3b3c2
616- Include tests for minimized artifacts - c21118d
617- Fix lint errors under latest eslint - 9f59de9
618- Add print-script helper script - 98a6717
619
620[Commits](https://github.com/wycats/handlebars.js/compare/v4.0.4...v4.0.5)
621
622## v4.0.4 - October 29th, 2015
623
624- [#1121](https://github.com/wycats/handlebars.js/pull/1121) - Include partial name in 'undefined partial' exception message ([@shinypb](https://github.com/shinypb))
625- [#1125](https://github.com/wycats/handlebars.js/pull/1125) - Add promised-handlebars to "in-the-wild"-list ([@nknapp](https://github.com/nknapp))
626
627[Commits](https://github.com/wycats/handlebars.js/compare/v4.0.3...v4.0.4)
628
629## v4.0.3 - September 23rd, 2015
630
631- [#1099](https://github.com/wycats/handlebars.js/issues/1099) - @partial-block is overridden ([@btmorex](https://github.com/btmorex))
632- [#1093](https://github.com/wycats/handlebars.js/issues/1093) - #each skips iteration on undefined values ([@florianpilz](https://github.com/florianpilz))
633- [#1092](https://github.com/wycats/handlebars.js/issues/1092) - Square braces in key name ([@distantnative](https://github.com/distantnative))
634- [#1091](https://github.com/wycats/handlebars.js/pull/1091) - fix typo in release notes ([@nikolas](https://github.com/nikolas))
635- [#1090](https://github.com/wycats/handlebars.js/pull/1090) - grammar fixes in 4.0.0 release notes ([@nikolas](https://github.com/nikolas))
636
637Compatibility notes:
638
639- `each` iteration with `undefined` values has been restored to the 3.0 behaviors. Helper calls with undefined context values will now execute against an arbitrary empty object to avoid executing against global object in non-strict mode.
640- `]` can now be included in `[]` wrapped identifiers by escaping with `\`. Any `[]` identifiers that include `\` will now have to properly escape these values.
641
642[Commits](https://github.com/wycats/handlebars.js/compare/v4.0.2...v4.0.3)
643
644## v4.0.2 - September 4th, 2015
645
646- [#1089](https://github.com/wycats/handlebars.js/issues/1089) - "Failover content" not working in multiple levels of inline partials ([@michaellopez](https://github.com/michaellopez))
647
648[Commits](https://github.com/wycats/handlebars.js/compare/v4.0.1...v4.0.2)
649
650## v4.0.1 - September 2nd, 2015
651
652- Fix failure when using decorators in partials - 05b82a2
653
654[Commits](https://github.com/wycats/handlebars.js/compare/v4.0.0...v4.0.1)
655
656## v4.0.0 - September 1st, 2015
657
658- [#1082](https://github.com/wycats/handlebars.js/pull/1082) - Decorators and Inline Partials ([@kpdecker](https://github.com/kpdecker))
659- [#1076](https://github.com/wycats/handlebars.js/pull/1076) - Implement partial blocks ([@kpdecker](https://github.com/kpdecker))
660- [#1087](https://github.com/wycats/handlebars.js/pull/1087) - Fix #each when last object entry has empty key ([@denniskuczynski](https://github.com/denniskuczynski))
661- [#1084](https://github.com/wycats/handlebars.js/pull/1084) - Bump uglify version to fix vulnerability ([@John-Steidley](https://github.com/John-Steidley))
662- [#1068](https://github.com/wycats/handlebars.js/pull/1068) - Fix typo ([@0xack13](https://github.com/0xack13))
663- [#1060](https://github.com/wycats/handlebars.js/pull/1060) - #1056 Fixed grammar for nested raw blocks ([@ericbn](https://github.com/ericbn))
664- [#1052](https://github.com/wycats/handlebars.js/pull/1052) - Updated year in License ([@maqnouch](https://github.com/maqnouch))
665- [#1037](https://github.com/wycats/handlebars.js/pull/1037) - Fix minor typos in README ([@tomxtobin](https://github.com/tomxtobin))
666- [#1032](https://github.com/wycats/handlebars.js/issues/1032) - Is it possible to render a partial without the parent scope? ([@aputinski](https://github.com/aputinski))
667- [#1019](https://github.com/wycats/handlebars.js/pull/1019) - Fixes typo in tests ([@aymerick](https://github.com/aymerick))
668- [#1016](https://github.com/wycats/handlebars.js/issues/1016) - Version mis-match ([@mayankdedhia](https://github.com/mayankdedhia))
669- [#1023](https://github.com/wycats/handlebars.js/issues/1023) - is it possible for nested custom helpers to communicate between each other?
670- [#893](https://github.com/wycats/handlebars.js/issues/893) - [Proposal] Section blocks.
671- [#792](https://github.com/wycats/handlebars.js/issues/792) - feature request: inline partial definitions
672- [#583](https://github.com/wycats/handlebars.js/issues/583) - Parent path continues to drill down depth with multiple conditionals
673- [#404](https://github.com/wycats/handlebars.js/issues/404) - Add named child helpers that can be referenced by block helpers
674- Escape = in HTML content - [83b8e84](https://github.com/wycats/handlebars.js/commit/83b8e84)
675- Drop AST constructors in favor of JSON - [95d84ba](https://github.com/wycats/handlebars.js/commit/95d84ba)
676- Pass container rather than exec as context - [9a2d1d6](https://github.com/wycats/handlebars.js/commit/9a2d1d6)
677- Add ignoreStandalone compiler option - [ea3a5a1](https://github.com/wycats/handlebars.js/commit/ea3a5a1)
678- Ignore empty when iterating on sparse arrays - [06d515a](https://github.com/wycats/handlebars.js/commit/06d515a)
679- Add support for string and stdin precompilation - [0de8dac](https://github.com/wycats/handlebars.js/commit/0de8dac)
680- Simplify object assignment generation logic - [77e6bfc](https://github.com/wycats/handlebars.js/commit/77e6bfc)
681- Bulletproof AST.helpers.helperExpression - [93b0760](https://github.com/wycats/handlebars.js/commit/93b0760)
682- Always return string responses - [8e868ab](https://github.com/wycats/handlebars.js/commit/8e868ab)
683- Pass undefined fields to helpers in strict mode - [5d4b8da](https://github.com/wycats/handlebars.js/commit/5d4b8da)
684- Avoid depth creation when context remains the same - [279e038](https://github.com/wycats/handlebars.js/commit/279e038)
685- Improve logging API - [9a49d35](https://github.com/wycats/handlebars.js/commit/9a49d35)
686- Fix with operator in no @data mode - [231a8d7](https://github.com/wycats/handlebars.js/commit/231a8d7)
687- Allow empty key name in each iteration - [1bb640b](https://github.com/wycats/handlebars.js/commit/1bb640b)
688- Add with block parameter support - [2a85106](https://github.com/wycats/handlebars.js/commit/2a85106)
689- Fix escaping of non-javascript identifiers - [410141c](https://github.com/wycats/handlebars.js/commit/410141c)
690- Fix location information for programs - [93faffa](https://github.com/wycats/handlebars.js/commit/93faffa)
691
692Compatibility notes:
693
694- Depthed paths are now conditionally pushed on to the stack. If the helper uses the same context, then a new stack is not created. This leads to behavior that better matches expectations for helpers like `if` that do not seem to alter the context. Any instances of `../` in templates will need to be checked for the correct behavior under 4.0.0. In general templates will either reduce the number of `../` instances or leave them as is. See [#1028](https://github.com/wycats/handlebars.js/issues/1028).
695- The `=` character is now HTML escaped. This closes a potential exploit case when using unquoted attributes, i.e. `<div foo={{bar}}>`. In general it's recommended that attributes always be quoted when their values are generated from a mustache to avoid any potential exploit surfaces.
696- AST constructors have been dropped in favor of plain old javascript objects
697- The runtime version has been increased. Precompiled templates will need to use runtime of at least 4.0.0.
698
699[Commits](https://github.com/wycats/handlebars.js/compare/v3.0.3...v4.0.0)
700
701## v3.0.3 - April 28th, 2015
702
703- [#1004](https://github.com/wycats/handlebars.js/issues/1004) - Latest version breaks with RequireJS (global is undefined) ([@boskee](https://github.com/boskee))
704
705[Commits](https://github.com/wycats/handlebars.js/compare/v3.0.2...v3.0.3)
706
707## v3.0.2 - April 20th, 2015
708
709- [#998](https://github.com/wycats/handlebars.js/pull/998) - Add full support for es6 ([@kpdecker](https://github.com/kpdecker))
710- [#994](https://github.com/wycats/handlebars.js/issues/994) - Access Handlebars.Visitor in browser ([@tamlyn](https://github.com/tamlyn))
711- [#990](https://github.com/wycats/handlebars.js/issues/990) - Allow passing null/undefined literals subexpressions ([@blimmer](https://github.com/blimmer))
712- [#989](https://github.com/wycats/handlebars.js/issues/989) - Source-map error with requirejs ([@SteppeEagle](https://github.com/SteppeEagle))
713- [#967](https://github.com/wycats/handlebars.js/issues/967) - can't access "this" property ([@75lb](https://github.com/75lb))
714- Use captureStackTrace for error handler - a009a97
715- Ignore branches tested without coverage monitoring - 37a664b
716
717[Commits](https://github.com/wycats/handlebars.js/compare/v3.0.1...v3.0.2)
718
719## v3.0.1 - March 24th, 2015
720
721- [#984](https://github.com/wycats/handlebars.js/pull/984) - Adding documentation for passing arguments into partials ([@johneke](https://github.com/johneke))
722- [#973](https://github.com/wycats/handlebars.js/issues/973) - version 3 is slower than version 2 ([@elover](https://github.com/elover))
723- [#966](https://github.com/wycats/handlebars.js/issues/966) - "handlebars --version" does not work with v3.0.0 ([@abloomston](https://github.com/abloomston))
724- [#964](https://github.com/wycats/handlebars.js/pull/964) - default is a reserved word ([@grassick](https://github.com/grassick))
725- [#962](https://github.com/wycats/handlebars.js/pull/962) - Add dashbars' link on README. ([@pismute](https://github.com/pismute))
726
727[Commits](https://github.com/wycats/handlebars.js/compare/v3.0.0...v3.0.1)
728
729## v3.0.0 - February 10th, 2015
730
731- [#941](https://github.com/wycats/handlebars.js/pull/941) - Add support for dynamic partial names ([@kpdecker](https://github.com/kpdecker))
732- [#940](https://github.com/wycats/handlebars.js/pull/940) - Add missing reserved words so compiler knows to use array syntax: ([@mattflaschen](https://github.com/mattflaschen))
733- [#938](https://github.com/wycats/handlebars.js/pull/938) - Fix example using #with helper ([@diwo](https://github.com/diwo))
734- [#930](https://github.com/wycats/handlebars.js/pull/930) - Add parent tracking and mutation to AST visitors ([@kpdecker](https://github.com/kpdecker))
735- [#926](https://github.com/wycats/handlebars.js/issues/926) - Depthed lookups fail when program duplicator runs ([@kpdecker](https://github.com/kpdecker))
736- [#918](https://github.com/wycats/handlebars.js/pull/918) - Add instructions for 'spec/mustache' to CONTRIBUTING.md, fix a few typos ([@oneeman](https://github.com/oneeman))
737- [#915](https://github.com/wycats/handlebars.js/pull/915) - Ast update ([@kpdecker](https://github.com/kpdecker))
738- [#910](https://github.com/wycats/handlebars.js/issues/910) - Different behavior of {{@last}} when {{#each}} in {{#each}} ([@zordius](https://github.com/zordius))
739- [#907](https://github.com/wycats/handlebars.js/issues/907) - Implement named helper variable references ([@kpdecker](https://github.com/kpdecker))
740- [#906](https://github.com/wycats/handlebars.js/pull/906) - Add parser support for block params ([@mmun](https://github.com/mmun))
741- [#903](https://github.com/wycats/handlebars.js/issues/903) - Only provide aliases for multiple use calls ([@kpdecker](https://github.com/kpdecker))
742- [#902](https://github.com/wycats/handlebars.js/pull/902) - Generate Source Maps ([@kpdecker](https://github.com/kpdecker))
743- [#901](https://github.com/wycats/handlebars.js/issues/901) - Still escapes with noEscape enabled on isolated Handlebars environment ([@zedknight](https://github.com/zedknight))
744- [#896](https://github.com/wycats/handlebars.js/pull/896) - Simplify BlockNode by removing intermediate MustacheNode ([@mmun](https://github.com/mmun))
745- [#892](https://github.com/wycats/handlebars.js/pull/892) - Implement parser for else chaining of helpers ([@kpdecker](https://github.com/kpdecker))
746- [#889](https://github.com/wycats/handlebars.js/issues/889) - Consider extensible parser API ([@kpdecker](https://github.com/kpdecker))
747- [#887](https://github.com/wycats/handlebars.js/issues/887) - Handlebars.noConflict() option? ([@bradvogel](https://github.com/bradvogel))
748- [#886](https://github.com/wycats/handlebars.js/issues/886) - Add SafeString to context (or use duck-typing) ([@dominicbarnes](https://github.com/dominicbarnes))
749- [#870](https://github.com/wycats/handlebars.js/pull/870) - Registering undefined partial throws exception. ([@max-b](https://github.com/max-b))
750- [#866](https://github.com/wycats/handlebars.js/issues/866) - comments don't respect whitespace control ([@75lb](https://github.com/75lb))
751- [#863](https://github.com/wycats/handlebars.js/pull/863) - + jsDelivr CDN info ([@tomByrer](https://github.com/tomByrer))
752- [#858](https://github.com/wycats/handlebars.js/issues/858) - Disable new default auto-indent at included partials ([@majodev](https://github.com/majodev))
753- [#856](https://github.com/wycats/handlebars.js/pull/856) - jspm compatibility ([@MajorBreakfast](https://github.com/MajorBreakfast))
754- [#805](https://github.com/wycats/handlebars.js/issues/805) - Request: "strict" lookups ([@nzakas](https://github.com/nzakas))
755
756- Export the default object for handlebars/runtime - 5594416
757- Lookup partials when undefined - 617dd57
758
759Compatibility notes:
760
761- Runtime breaking changes. Must match 3.x runtime and precompiler.
762- The AST has been upgraded to a public API.
763 - There are a number of changes to this, but the format is now documented in docs/compiler-api.md
764 - The Visitor API has been expanded to support mutation and provide a base implementation
765- The `JavaScriptCompiler` APIs have been formalized and documented. As part of the sourcemap handling these should be updated to return arrays for concatenation.
766- `JavaScriptCompiler.namespace` has been removed as it was unused.
767- `SafeString` is now duck typed on `toHTML`
768
769New Features:
770
771- noConflict
772- Source Maps
773- Block Params
774- Strict Mode
775- @last and other each changes
776- Chained else blocks
777- @data methods can now have helper parameters passed to them
778- Dynamic partials
779
780[Commits](https://github.com/wycats/handlebars.js/compare/v2.0.0...v3.0.0)
781
782## v2.0.0 - September 1st, 2014
783
784- Update jsfiddle to 2.0.0-beta.1 - 0670f65
785- Add contrib note regarding handlebarsjs.com docs - 4d17e3c
786- Play nice with gemspec version numbers - 64d5481
787
788[Commits](https://github.com/wycats/handlebars.js/compare/v2.0.0-beta.1...v2.0.0)
789
790## v2.0.0-beta.1 - August 26th, 2014
791
792- [#787](https://github.com/wycats/handlebars.js/pull/787) - Remove whitespace surrounding standalone statements ([@kpdecker](https://github.com/kpdecker))
793- [#827](https://github.com/wycats/handlebars.js/issues/827) - Render false literal as “false” ([@scoot557](https://github.com/scoot557))
794- [#767](https://github.com/wycats/handlebars.js/issues/767) - Subexpressions bug with hash and context ([@evensoul](https://github.com/evensoul))
795- Changes to 0/undefined handling
796 - [#731](https://github.com/wycats/handlebars.js/pull/731) - Strange behavior for {{#foo}} {{bar}} {{/foo}} when foo is 0 ([@kpdecker](https://github.com/kpdecker))
797 - [#820](https://github.com/wycats/handlebars.js/issues/820) - strange behavior for {{foo.bar}} when foo is 0 or null or false ([@zordius](https://github.com/zordius))
798 - [#837](https://github.com/wycats/handlebars.js/issues/837) - Strange input for custom helper ( foo.bar == false when foo is undefined ) ([@zordius](https://github.com/zordius))
799- [#819](https://github.com/wycats/handlebars.js/pull/819) - Implement recursive field lookup ([@kpdecker](https://github.com/kpdecker))
800- [#764](https://github.com/wycats/handlebars.js/issues/764) - This reference not working for helpers ([@kpdecker](https://github.com/kpdecker))
801- [#773](https://github.com/wycats/handlebars.js/issues/773) - Implicit parameters in {{#each}} introduces a peculiarity in helpers calling convention ([@Bertrand](https://github.com/Bertrand))
802- [#783](https://github.com/wycats/handlebars.js/issues/783) - helperMissing and consistency for different expression types ([@ErisDS](https://github.com/ErisDS))
803- [#795](https://github.com/wycats/handlebars.js/pull/795) - Turn the precompile script into a wrapper around a module. ([@jwietelmann](https://github.com/jwietelmann))
804- [#823](https://github.com/wycats/handlebars.js/pull/823) - Support inverse sections on the with helper ([@dan-manges](https://github.com/dan-manges))
805- [#834](https://github.com/wycats/handlebars.js/pull/834) - Refactor blocks, programs and inverses ([@mmun](https://github.com/mmun))
806- [#852](https://github.com/wycats/handlebars.js/issues/852) - {{foo~}} space control behavior is different from older version ([@zordius](https://github.com/zordius))
807- [#835](https://github.com/wycats/handlebars.js/issues/835) - Templates overwritten if file is loaded twice
808
809- Expose escapeExpression on the root object - 980c38c
810- Remove nested function eval in blockHelperMissing - 6f22ec1
811- Fix compiler program de-duping - 9e3f824
812
813Compatibility notes:
814
815- The default build now outputs a generic UMD wrapper. This should be transparent change but may cause issues in some environments.
816- Runtime compatibility breaks in both directions. Ensure that both compiler and client are upgraded to 2.0.0-beta.1 or higher at the same time.
817 - `programWithDepth` has been removed an instead an array of context values is passed to fields needing depth lookups.
818- `false` values are now printed to output rather than silently dropped
819- Lines containing only block statements and whitespace are now removed. This matches the Mustache spec but may cause issues with code that expects whitespace to exist but would not otherwise.
820- Partials that are standalone will now indent their rendered content
821- `AST.ProgramNode`'s signature has changed.
822- Numerious methods/features removed from pseudo-API classes
823 - `JavaScriptCompiler.register`
824 - `JavaScriptCompiler.replaceStack` no longer supports non-inline replace
825 - `Compiler.disassemble`
826 - `DECLARE` opcode
827 - `strip` opcode
828 - `lookup` opcode
829 - Content nodes may have their `string` values mutated over time. `original` field provides the unmodified value.
830- Removed unused `Handlebars.registerHelper` `inverse` parameter
831- `each` helper requires iterator parameter
832
833[Commits](https://github.com/wycats/handlebars.js/compare/v2.0.0-alpha.4...v2.0.0-beta.1)
834
835## v2.0.0-alpha.4 - May 19th, 2014
836
837- Expose setup wrappers for compiled templates - 3638874
838
839[Commits](https://github.com/wycats/handlebars.js/compare/v2.0.0-alpha.3...v2.0.0-alpha.4)
840
841## v2.0.0-alpha.3 - May 19th, 2014
842
843- [#797](https://github.com/wycats/handlebars.js/pull/797) - Pass full helper ID to helperMissing when options are provided ([@tomdale](https://github.com/tomdale))
844- [#793](https://github.com/wycats/handlebars.js/pull/793) - Ensure isHelper is coerced to a boolean ([@mmun](https://github.com/mmun))
845- Refactor template init logic - 085e5e1
846
847[Commits](https://github.com/wycats/handlebars.js/compare/v2.0.0-alpha.2...v2.0.0-alpha.3)
848
849## v2.0.0-alpha.2 - March 6th, 2014
850
851- [#756](https://github.com/wycats/handlebars.js/pull/756) - fix bug in IE<=8 (no Array::map), closes #751 ([@jenseng](https://github.com/jenseng))
852- [#749](https://github.com/wycats/handlebars.js/pull/749) - properly handle multiple subexpressions in the same hash, fixes #748 ([@jenseng](https://github.com/jenseng))
853- [#743](https://github.com/wycats/handlebars.js/issues/743) - subexpression confusion/problem? ([@waynedpj](https://github.com/waynedpj))
854- [#746](https://github.com/wycats/handlebars.js/issues/746) - [CLI] support `handlebars --version` ([@apfelbox](https://github.com/apfelbox))
855- [#747](https://github.com/wycats/handlebars.js/pull/747) - updated grunt-saucelabs, failing tests revealed ([@Jonahss](https://github.com/Jonahss))
856- Make JSON a requirement for the compiler. - 058c0fb
857- Temporarily kill the AWS publish CI step - 8347ee2
858
859Compatibility notes:
860
861- A JSON polyfill is required to run the compiler under IE8 and below. It's recommended that the precompiler be used in lieu of running the compiler on these legacy environments.
862
863[Commits](https://github.com/wycats/handlebars.js/compare/v2.0.0-alpha.1...v2.0.0-alpha.2)
864
865## v2.0.0-alpha.1 - February 10th, 2014
866
867- [#182](https://github.com/wycats/handlebars.js/pull/182) - Allow passing hash parameters to partials ([@kpdecker](https://github.com/kpdecker))
868- [#392](https://github.com/wycats/handlebars.js/pull/392) - Access to root context in partials and helpers ([@kpdecker](https://github.com/kpdecker))
869- [#472](https://github.com/wycats/handlebars.js/issues/472) - Helpers cannot have decimal parameters ([@kayleg](https://github.com/kayleg))
870- [#569](https://github.com/wycats/handlebars.js/pull/569) - Unable to lookup array values using @index ([@kpdecker](https://github.com/kpdecker))
871- [#491](https://github.com/wycats/handlebars.js/pull/491) - For nested helpers: get the @ variables of the outer helper from the inner one ([@kpdecker](https://github.com/kpdecker))
872- [#669](https://github.com/wycats/handlebars.js/issues/669) - Ability to unregister a helper ([@dbachrach](https://github.com/dbachrach))
873- [#730](https://github.com/wycats/handlebars.js/pull/730) - Raw block helpers ([@kpdecker](https://github.com/kpdecker))
874- [#634](https://github.com/wycats/handlebars.js/pull/634) - It would be great to have the helper name passed to `blockHelperMissing` ([@kpdecker](https://github.com/kpdecker))
875- [#729](https://github.com/wycats/handlebars.js/pull/729) - Convert template spec to object literal ([@kpdecker](https://github.com/kpdecker))
876
877- [#658](https://github.com/wycats/handlebars.js/issues/658) - Depthed helpers do not work after an upgrade from 1.0.0 ([@xibxor](https://github.com/xibxor))
878- [#671](https://github.com/wycats/handlebars.js/issues/671) - Crashes on no-parameter {{#each}} ([@stepancheg](https://github.com/stepancheg))
879- [#689](https://github.com/wycats/handlebars.js/issues/689) - broken template precompilation ([@AAS](https://github.com/AAS))
880- [#698](https://github.com/wycats/handlebars.js/pull/698) - Fix parser generation under windows ([@osiris43](https://github.com/osiris43))
881- [#699](https://github.com/wycats/handlebars.js/issues/699) - @DATA not compiles to invalid JS in stringParams mode ([@kpdecker](https://github.com/kpdecker))
882- [#705](https://github.com/wycats/handlebars.js/issues/705) - 1.3.0 can not be wrapped in an IIFE ([@craigteegarden](https://github.com/craigteegarden))
883- [#706](https://github.com/wycats/handlebars.js/pull/706) - README: Use with helper instead of relying on blockHelperMissing ([@scottgonzalez](https://github.com/scottgonzalez))
884
885- [#700](https://github.com/wycats/handlebars.js/pull/700) - Remove redundant conditions ([@blakeembrey](https://github.com/blakeembrey))
886- [#704](https://github.com/wycats/handlebars.js/pull/704) - JavaScript Compiler Cleanup ([@blakeembrey](https://github.com/blakeembrey))
887
888Compatibility notes:
889
890- `helperMissing` helper no longer has the indexed name argument. Helper name is now available via `options.name`.
891- Precompiler output has changed, which breaks compatibility with prior versions of the runtime and precompiled output.
892- `JavaScriptCompiler.compilerInfo` now returns generic objects rather than javascript source.
893- AST changes
894 - INTEGER -> NUMBER
895 - Additional PartialNode hash parameter
896 - New RawBlockNode type
897- Data frames now have a `_parent` field. This is internal but is enumerable for performance/compatibility reasons.
898
899[Commits](https://github.com/wycats/handlebars.js/compare/v1.3.0...v2.0.0-alpha.1)
900
901## v1.3.0 - January 1st, 2014
902
903- [#690](https://github.com/wycats/handlebars.js/pull/690) - Added support for subexpressions ([@machty](https://github.com/machty))
904- [#696](https://github.com/wycats/handlebars.js/pull/696) - Fix for reserved keyword "default" ([@nateirwin](https://github.com/nateirwin))
905- [#692](https://github.com/wycats/handlebars.js/pull/692) - add line numbers to nodes when parsing ([@fivetanley](https://github.com/fivetanley))
906- [#695](https://github.com/wycats/handlebars.js/pull/695) - Pull options out from param setup to allow easier extension ([@blakeembrey](https://github.com/blakeembrey))
907- [#694](https://github.com/wycats/handlebars.js/pull/694) - Make the environment reusable ([@blakeembrey](https://github.com/blakeembrey))
908- [#636](https://github.com/wycats/handlebars.js/issues/636) - Print line and column of errors ([@sgronblo](https://github.com/sgronblo))
909- Use literal for data lookup - c1a93d3
910- Add stack handling sanity checks - cd885bf
911- Fix stack id "leak" on replaceStack - ddfe457
912- Fix incorrect stack pop when replacing literals - f4d337d
913
914[Commits](https://github.com/wycats/handlebars.js/compare/v1.2.1...v1.3.0)
915
916## v1.2.1 - December 26th, 2013
917
918- [#684](https://github.com/wycats/handlebars.js/pull/684) - Allow any number of trailing characters for valid JavaScript variable ([@blakeembrey](https://github.com/blakeembrey))
919- [#686](https://github.com/wycats/handlebars.js/pull/686) - Falsy AMD module names in version 1.2.0 ([@kpdecker](https://github.com/kpdecker))
920
921[Commits](https://github.com/wycats/handlebars.js/compare/v1.2.0...v1.2.1)
922
923## v1.2.0 - December 23rd, 2013
924
925- [#675](https://github.com/wycats/handlebars.js/issues/675) - Cannot compile empty template for partial ([@erwinw](https://github.com/erwinw))
926- [#677](https://github.com/wycats/handlebars.js/issues/677) - Triple brace statements fail under IE ([@hamzaCM](https://github.com/hamzaCM))
927- [#655](https://github.com/wycats/handlebars.js/issues/655) - Loading Handlebars using bower ([@niki4810](https://github.com/niki4810))
928- [#657](https://github.com/wycats/handlebars.js/pull/657) - Fixes issue where cli compiles non handlebars templates ([@chrishoage](https://github.com/chrishoage))
929- [#681](https://github.com/wycats/handlebars.js/pull/681) - Adds in-browser testing and Saucelabs CI ([@kpdecker](https://github.com/kpdecker))
930- [#661](https://github.com/wycats/handlebars.js/pull/661) - Add @first and @index to #each object iteration ([@cgp](https://github.com/cgp))
931- [#650](https://github.com/wycats/handlebars.js/pull/650) - Handlebars is MIT-licensed ([@thomasboyt](https://github.com/thomasboyt))
932- [#641](https://github.com/wycats/handlebars.js/pull/641) - Document ember testing process ([@kpdecker](https://github.com/kpdecker))
933- [#662](https://github.com/wycats/handlebars.js/issues/662) - handlebars-source 1.1.2 is missing from RubyGems.
934- [#656](https://github.com/wycats/handlebars.js/issues/656) - Expose COMPILER_REVISION checks as a hook ([@machty](https://github.com/machty))
935- [#668](https://github.com/wycats/handlebars.js/issues/668) - Consider publishing handlebars-runtime as a separate module on npm ([@dlmanning](https://github.com/dlmanning))
936- [#679](https://github.com/wycats/handlebars.js/issues/679) - Unable to override invokePartial ([@mattbrailsford](https://github.com/mattbrailsford))
937- [#646](https://github.com/wycats/handlebars.js/pull/646) - Fix "\\{{" immediately following "\{{" ([@dmarcotte](https://github.com/dmarcotte))
938- Allow extend to work with non-prototyped objects - eb53f2e
939- Add JavascriptCompiler public API tests - 1a751b2
940- Add AST test coverage for more complex paths - ddea5be
941- Fix handling of boolean escape in MustacheNode - b4968bb
942
943Compatibility notes:
944
945- `@index` and `@first` are now supported for `each` iteration on objects
946- `Handlebars.VM.checkRevision` and `Handlebars.JavaScriptCompiler.prototype.compilerInfo` now available to modify the version checking behavior.
947- Browserify users may link to the runtime library via `require('handlebars/runtime')`
948
949[Commits](https://github.com/wycats/handlebars.js/compare/v1.1.2...v1.2.0)
950
951## v1.1.2 - November 5th, 2013
952
953- [#645](https://github.com/wycats/handlebars.js/issues/645) - 1.1.1 fails under IE8 ([@kpdecker](https://github.com/kpdecker))
954- [#644](https://github.com/wycats/handlebars.js/issues/644) - Using precompiled templates (AMD mode) with handlebars.runtime 1.1.1 ([@fddima](https://github.com/fddima))
955
956- Add simple binary utility tests - 96a45a4
957- Fix empty string compilation - eea708a
958
959[Commits](https://github.com/wycats/handlebars.js/compare/v1.1.1...v1.1.2)
960
961## v1.1.1 - November 4th, 2013
962
963- [#642](https://github.com/wycats/handlebars.js/issues/642) - handlebars 1.1.0 are broken with nodejs
964
965- Fix release notes link - 17ba258
966
967[Commits](https://github.com/wycats/handlebars.js/compare/v1.1.0...v1.1.1)
968
969## v1.1.0 - November 3rd, 2013
970
971- [#628](https://github.com/wycats/handlebars.js/pull/628) - Convert code to ES6 modules ([@kpdecker](https://github.com/kpdecker))
972- [#336](https://github.com/wycats/handlebars.js/pull/336) - Add whitespace control syntax ([@kpdecker](https://github.com/kpdecker))
973- [#535](https://github.com/wycats/handlebars.js/pull/535) - Fix for probable JIT error under Safari ([@sorentwo](https://github.com/sorentwo))
974- [#483](https://github.com/wycats/handlebars.js/issues/483) - Add first and last @ vars to each helper ([@denniskuczynski](https://github.com/denniskuczynski))
975- [#557](https://github.com/wycats/handlebars.js/pull/557) - `\\{{foo}}` escaping only works in some situations ([@dmarcotte](https://github.com/dmarcotte))
976- [#552](https://github.com/wycats/handlebars.js/pull/552) - Added BOM removal flag. ([@blessenm](https://github.com/blessenm))
977- [#543](https://github.com/wycats/handlebars.js/pull/543) - publish passing master builds to s3 ([@fivetanley](https://github.com/fivetanley))
978
979- [#608](https://github.com/wycats/handlebars.js/issues/608) - Add `includeZero` flag to `if` conditional
980- [#498](https://github.com/wycats/handlebars.js/issues/498) - `Handlebars.compile` fails on empty string although a single blank works fine
981- [#599](https://github.com/wycats/handlebars.js/issues/599) - lambda helpers only receive options if used with arguments
982- [#592](https://github.com/wycats/handlebars.js/issues/592) - Optimize array and subprogram performance
983- [#571](https://github.com/wycats/handlebars.js/issues/571) - uglify upgrade breaks compatibility with older versions of node
984- [#587](https://github.com/wycats/handlebars.js/issues/587) - Partial inside partial breaks?
985
986Compatibility notes:
987
988- The project now includes separate artifacts for AMD, CommonJS, and global objects.
989 - AMD: Users may load the bundled `handlebars.amd.js` or `handlebars.runtime.amd.js` files or load individual modules directly. AMD users should also note that the handlebars object is exposed via the `default` field on the imported object. This [gist](https://gist.github.com/wycats/7417be0dc361a69d5916) provides some discussion of possible compatibility shims.
990 - CommonJS/Node: Node loading occurs as normal via `require`
991 - Globals: The `handlebars.js` and `handlebars.runtime.js` files should behave in the same manner as the v1.0.12 / 1.0.0 release.
992- Build artifacts have been removed from the repository. [npm][npm], [components/handlebars.js][components], [cdnjs][cdnjs], or the [builds page][builds-page] should now be used as the source of built artifacts.
993- Context-stored helpers are now always passed the `options` hash. Previously no-argument helpers did not have this argument.
994
995[Commits](https://github.com/wycats/handlebars.js/compare/v1.0.12...v1.1.0)
996
997## v1.0.12 / 1.0.0 - May 31 2013
998
999- [#515](https://github.com/wycats/handlebars.js/issues/515) - Add node require extensions support ([@jjclark1982](https://github.com/jjclark1982))
1000- [#517](https://github.com/wycats/handlebars.js/issues/517) - Fix amd precompiler output with directories ([@blessenm](https://github.com/blessenm))
1001- [#433](https://github.com/wycats/handlebars.js/issues/433) - Add support for unicode ids
1002- [#469](https://github.com/wycats/handlebars.js/issues/469) - Add support for `?` in ids
1003- [#534](https://github.com/wycats/handlebars.js/issues/534) - Protect from object prototype modifications
1004- [#519](https://github.com/wycats/handlebars.js/issues/519) - Fix partials with . name ([@jamesgorrie](https://github.com/jamesgorrie))
1005- [#519](https://github.com/wycats/handlebars.js/issues/519) - Allow ID or strings in partial names
1006- [#437](https://github.com/wycats/handlebars.js/issues/437) - Require matching brace counts in escaped expressions
1007- Merge passed partials and helpers with global namespace values
1008- Add support for complex ids in @data references
1009- Docs updates
1010
1011Compatibility notes:
1012
1013- The parser is now stricter on `{{{`, requiring that the end token be `}}}`. Templates that do not
1014 follow this convention should add the additional brace value.
1015- Code that relies on global the namespace being muted when custom helpers or partials are passed will need to explicitly pass an `undefined` value for any helpers that should not be available.
1016- The compiler version has changed. Precompiled templates with 1.0.12 or higher must use the 1.0.0 or higher runtime.
1017
1018[Commits](https://github.com/wycats/handlebars.js/compare/v1.0.11...v1.0.12)
1019
1020## v1.0.11 / 1.0.0-rc4 - May 13 2013
1021
1022- [#458](https://github.com/wycats/handlebars.js/issues/458) - Fix `./foo` syntax ([@jpfiset](https://github.com/jpfiset))
1023- [#460](https://github.com/wycats/handlebars.js/issues/460) - Allow `:` in unescaped identifiers ([@jpfiset](https://github.com/jpfiset))
1024- [#471](https://github.com/wycats/handlebars.js/issues/471) - Create release notes (These!)
1025- [#456](https://github.com/wycats/handlebars.js/issues/456) - Allow escaping of `\\`
1026- [#211](https://github.com/wycats/handlebars.js/issues/211) - Fix exception in `escapeExpression`
1027- [#375](https://github.com/wycats/handlebars.js/issues/375) - Escape unicode newlines
1028- [#461](https://github.com/wycats/handlebars.js/issues/461) - Do not fail when compiling `""`
1029- [#302](https://github.com/wycats/handlebars.js/issues/302) - Fix sanity check in knownHelpersOnly mode
1030- [#369](https://github.com/wycats/handlebars.js/issues/369) - Allow registration of multiple helpers and partial by passing definition object
1031- Add bower package declaration ([@DevinClark](https://github.com/DevinClark))
1032- Add NuSpec package declaration ([@MikeMayer](https://github.com/MikeMayer))
1033- Handle empty context in `with` ([@thejohnfreeman](https://github.com/thejohnfreeman))
1034- Support custom template extensions in CLI ([@matteoagosti](https://github.com/matteoagosti))
1035- Fix Rhino support ([@broady](https://github.com/broady))
1036- Include contexts in string mode ([@leshill](https://github.com/leshill))
1037- Return precompiled scripts when compiling to AMD ([@JamesMaroney](https://github.com/JamesMaroney))
1038- Docs updates ([@iangreenleaf](https://github.com/iangreenleaf), [@gilesbowkett](https://github.com/gilesbowkett), [@utkarsh2012](https://github.com/utkarsh2012))
1039- Fix `toString` handling under IE and browserify ([@tommydudebreaux](https://github.com/tommydudebreaux))
1040- Add program metadata
1041
1042[Commits](https://github.com/wycats/handlebars.js/compare/v1.0.10...v1.0.11)
1043
1044## v1.0.10 - Node - Feb 27 2013
1045
1046- [#428](https://github.com/wycats/handlebars.js/issues/428) - Fix incorrect rendering of nested programs
1047- Fix exception message ([@tricknotes](https://github.com/tricknotes))
1048- Added negative number literal support
1049- Concert library to single IIFE
1050- Add handlebars-source gemspec ([@machty](https://github.com/machty))
1051
1052[Commits](https://github.com/wycats/handlebars.js/compare/v1.0.9...v1.0.10)
1053
1054## v1.0.9 - Node - Feb 15 2013
1055
1056- Added `Handlebars.create` API in node module for sandboxed instances ([@tommydudebreaux](https://github.com/tommydudebreaux))
1057
1058[Commits](https://github.com/wycats/handlebars.js/compare/1.0.0-rc.3...v1.0.9)
1059
1060## 1.0.0-rc3 - Browser - Feb 14 2013
1061
1062- Prevent use of `this` or `..` in illogical place ([@leshill](https://github.com/leshill))
1063- Allow AST passing for `parse`/`compile`/`precompile` ([@machty](https://github.com/machty))
1064- Optimize generated output by inlining statements where possible
1065- Check compiler version when evaluating templates
1066- Package browser dist in npm package
1067
1068[Commits](https://github.com/wycats/handlebars.js/compare/v1.0.8...1.0.0-rc.3)
1069
1070## Prior Versions
1071
1072When upgrading from the Handlebars 0.9 series, be aware that the
1073signature for passing custom helpers or partials to templates has
1074changed.
1075
1076Instead of:
1077
1078```js
1079template(context, helpers, partials, [data]);
1080```
1081
1082Use:
1083
1084```js
1085template(context, { helpers: helpers, partials: partials, data: data });
1086```
1087
1088[builds-page]: http://builds.handlebarsjs.com.s3.amazonaws.com/index.html
1089[cdnjs]: http://cdnjs.com/libraries/handlebars.js/
1090[components]: https://github.com/components/handlebars.js
1091[npm]: https://npmjs.org/package/handlebars