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