diff --git a/packages/ember-template-compiler/lib/plugins/assert-reserved-named-arguments.js b/packages/ember-template-compiler/lib/plugins/assert-reserved-named-arguments.js new file mode 100644 index 00000000000..175dfd40348 --- /dev/null +++ b/packages/ember-template-compiler/lib/plugins/assert-reserved-named-arguments.js @@ -0,0 +1,28 @@ +import { assert } from 'ember-metal/debug'; +import calculateLocationDisplay from 'ember-template-compiler/system/calculate-location-display'; + +export default function AssertReservedNamedArguments(options) { + this.syntax = null; + this.options = options; +} + +AssertReservedNamedArguments.prototype.transform = function AssertReservedNamedArguments_transform(ast) { + let moduleName = this.options.moduleName; + + this.syntax.traverse(ast, { + PathExpression: function(node) { + if (node.original[0] === '@') { + assert(assertMessage(moduleName, node)); + } + } + }); + + return ast; +}; + +function assertMessage(moduleName, node) { + let path = node.original; + let source = calculateLocationDisplay(moduleName, node.loc); + + return `'${path}' is not a valid path. ${source}`; +} diff --git a/packages/ember-template-compiler/lib/plugins/index.js b/packages/ember-template-compiler/lib/plugins/index.js index 4b6e493ca12..ae767ad77ae 100644 --- a/packages/ember-template-compiler/lib/plugins/index.js +++ b/packages/ember-template-compiler/lib/plugins/index.js @@ -3,9 +3,10 @@ import TransformItemClass from 'ember-template-compiler/plugins/transform-item-c import TransformAngleBracketComponents from 'ember-template-compiler/plugins/transform-angle-bracket-components'; import TransformInputOnToOnEvent from 'ember-template-compiler/plugins/transform-input-on-to-onEvent'; import TransformTopLevelComponents from 'ember-template-compiler/plugins/transform-top-level-components'; -import DeprecateRenderModel from 'ember-template-compiler/plugins/deprecate-render-model'; import TransformInlineLinkTo from 'ember-template-compiler/plugins/transform-inline-link-to'; import TransformOldClassBindingSyntax from 'ember-template-compiler/plugins/transform-old-class-binding-syntax'; +import DeprecateRenderModel from 'ember-template-compiler/plugins/deprecate-render-model'; +import AssertReservedNamedArguments from 'ember-template-compiler/plugins/assert-reserved-named-arguments'; export default Object.freeze([ TransformOldBindingSyntax, @@ -13,7 +14,8 @@ export default Object.freeze([ TransformAngleBracketComponents, TransformInputOnToOnEvent, TransformTopLevelComponents, - DeprecateRenderModel, TransformInlineLinkTo, - TransformOldClassBindingSyntax + TransformOldClassBindingSyntax, + DeprecateRenderModel, + AssertReservedNamedArguments ]); diff --git a/packages/ember-template-compiler/tests/plugins/assert-reserved-named-arguments-test.js b/packages/ember-template-compiler/tests/plugins/assert-reserved-named-arguments-test.js new file mode 100644 index 00000000000..a4448d6b307 --- /dev/null +++ b/packages/ember-template-compiler/tests/plugins/assert-reserved-named-arguments-test.js @@ -0,0 +1,26 @@ +import { compile } from '../utils/helpers'; + +QUnit.module('ember-template-compiler: assert-reserved-named-arguments'); + +QUnit.test('Paths beginning with @ are not valid', function() { + expect(3); + + expectAssertion(() => { + compile('{{@foo}}', { + moduleName: 'baz/foo-bar' + }); + }, `'@foo' is not a valid path. ('baz/foo-bar' @ L1:C2) `); + + expectAssertion(() => { + compile('{{#if @foo}}Yup{{/if}}', { + moduleName: 'baz/foo-bar' + }); + }, `'@foo' is not a valid path. ('baz/foo-bar' @ L1:C6) `); + + expectAssertion(() => { + compile('{{input type=(if @foo "bar" "baz")}}', { + moduleName: 'baz/foo-bar' + }); + }, `'@foo' is not a valid path. ('baz/foo-bar' @ L1:C17) `); +}); +