# ember-cli-htmlbars-inline-precompile [![npm version](https://badge.fury.io/js/ember-cli-htmlbars-inline-precompile.svg)](https://badge.fury.io/js/ember-cli-htmlbars-inline-precompile) [![Build Status](https://travis-ci.org/ember-cli/ember-cli-htmlbars-inline-precompile.svg?branch=master)](https://travis-ci.org/ember-cli/ember-cli-htmlbars-inline-precompile) [![Ember Observer Score](http://emberobserver.com/badges/ember-cli-htmlbars-inline-precompile.svg)](http://emberobserver.com/addons/ember-cli-htmlbars-inline-precompile) [![Dependency Status](https://david-dm.org/ember-cli/ember-cli-htmlbars-inline-precompile.svg)](https://david-dm.org/ember-cli/ember-cli-htmlbars-inline-precompile) Precompile HTMLBars template strings within the tests of an Ember-CLI project via ES6 tagged template strings: ``` js // ember-cli-project/test/unit/components/my-component-test.js import hbs from 'htmlbars-inline-precompile'; import { moduleForComponent, test } from 'ember-qunit'; moduleForComponent('my-component'); test('it renders', function(assert) { var component = this.subject({ greeting: "hello ember testing", layout: hbs` greeting: {{greeting}} ` }); assert.equal(this.$().html().trim(), "greeting: hello ember testing"); }); ``` --- If you are using `ember-cli-qunit@0.3.12`, writing component integration tests becomes as readable as: ``` js import hbs from 'htmlbars-inline-precompile'; import { moduleForComponent, test } from 'ember-qunit'; moduleForComponent('my-component', { integration: true }); test('block params work', function(assert) { this.render(hbs` {{#my-component date=theDate as |daysAgo| }} This happened {{daysAgo}} days ago. {{/my-component}} `); this.set('theDate', new Date(2015, 2, 11)); assert.equal(this.$().text().trim(), "This happened 123 days ago."); }); ``` ### CoffeeScript support Version `0.2.0` introduced the possibility to use this addon within CoffeeScript, using [`ember-cli-coffeescript`](https://github.com/kimroen/ember-cli-coffeescript). Since the backtick ``` ` ``` is used to embed JavaScript, the `hbs` function can be invoked with the template as a normal string: ``` coffeescript `import hbs from 'htmlbars-inline-precompile';` `import { moduleForComponent, test } from 'ember-qunit';` moduleForComponent "my-component", integration: true test "block params work", (assert) -> @render hbs ''' {{#my-component date=theDate as |daysAgo| }} This happened {{daysAgo}} days ago. {{/my-component}} ''' @set 'theDate', new Date(2015, 2, 11) assert.equal this.$().text().trim(), "This happened 123 days ago." ``` ### Installation Install the addon via `ember install ember-cli-htmlbars-inline-precompile` ### Troubleshooting #### `Plugin undefined didn't export a default Transformer instance` If you get an error like `Plugin undefined didn't export a default Transformer instance` this likely means that the installed version of `babel-core` is outdated. You can check for the installed version via `npm ls babel-core` within the root of your Ember-CLI application: ``` $ npm ls babel-core your-app@0.0.0 ~/your-app └─┬ ember-cli-babel@5.0.0 └─┬ broccoli-babel-transpiler@5.0.0 └── babel-core@5.1.13 ``` Since this addon relies on a feature implemented in `babel@v5.2.10`, you need to update your installed dependency of `ember-cli-babel` via: ``` rm -rf node_modules/ember-cli-babel npm install ``` After that the version of `babel-core` should be at least `5.2.10`: ``` $ npm ls babel-core your-app@0.0.0 ~/your-app └─┬ ember-cli-babel@5.0.0 └─┬ broccoli-babel-transpiler@5.0.0 └── babel-core@5.2.10 ``` Starting the development environment via `ember server` or `ember test --server` should start as expected and your inline template strings are compiled. #### JSHint problems with `ember-cli-mocha`: `Expected ')' and instead saw '` If `ember-cli-mocha` complains with a message like `Expected ')' and instead saw '`, you need to upgrade the used `ember-cli-mocha` package in your Ember-CLI app/addon. This has been discussed in [switchfly/ember-cli-mocha#57](https://github.com/switchfly/ember-cli-mocha/pull/57#discussion_r32633195), where the solution is a clean [`npm install`](https://github.com/switchfly/ember-cli-mocha/pull/57#discussion_r32654980). ### Caveats Keep in mind that the source files are transformed, so the inline template definitions are replaced with `Ember.HTMLBars.template(…)` statements. This means that you can't do fancy stuff like string interpolation within the templates: ``` js test('string interpolation within templates is NOT supported', function(assert) { var valuePath = 'greeting'; var component = this.subject({ greeting: "hello ember testing", layout: hbs` ${valuePath}: {{value}} ` }); // the template will be "${valuePath}: {{value}}" ``` If you need stuff like this, you need to include `ember-template-compiler.js` in your test-build and use `Ember.HTMLBars.compile("…")` within your tests. ### Alternatives - [broccoli-ember-inline-template-compiler](https://github.com/rwjblue/broccoli-ember-inline-template-compiler) - Include `ember-handlebars-compiler.js` in your test-build and compile client side via `Ember.HTMLBars.compile(…)` ### Thanks This addon wouldn't exist without the lightning fast response by open source hero [@kittens](https://github.com/kittens), who implemented the [feature to replace a node with a source string](http://git.io/vJSrs) not even an hour after I mentioned it in gitter :heart:.