Skip to content

Commit

Permalink
Merge pull request #1102 from fivetanley/disallow-at-arguments-on-reg…
Browse files Browse the repository at this point in the history
…ular-html-nodes
  • Loading branch information
rwjblue committed May 18, 2020
2 parents a327311 + f265f28 commit 4621c12
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 3 deletions.
20 changes: 17 additions & 3 deletions packages/@glimmer/compiler/lib/template-compiler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,11 +134,11 @@ export default class TemplateCompiler implements Processor<InputOps> {
typeAttr = attrs[i];
continue;
}
this.attribute([attrs[i]], !simple || actionIsComponent);
this.attribute([attrs[i]], !simple || actionIsComponent, action);
}

if (typeAttr) {
this.attribute([typeAttr], !simple || actionIsComponent);
this.attribute([typeAttr], !simple || actionIsComponent, action);
}

for (let i = 0; i < action.modifiers.length; i++) {
Expand All @@ -161,7 +161,8 @@ export default class TemplateCompiler implements Processor<InputOps> {
}
}

attribute([action]: [AST.AttrNode], isComponent: boolean) {
attribute([action]: [AST.AttrNode], isComponent: boolean, elementNode: AST.ElementNode) {
assertValidArgumentName(action, isComponent, elementNode);
let { name, value } = action;

let namespace = getAttrNamespace(name);
Expand Down Expand Up @@ -690,6 +691,19 @@ function assertIsSimplePath(path: AST.Expression, loc: AST.SourceLocation, conte
}
}

function assertValidArgumentName(
attribute: AST.AttrNode,
isComponent: boolean,
elementNode: AST.ElementNode
) {
if (!isComponent && attribute.name[0] === '@') {
throw new SyntaxError(
`${attribute.name} is not a valid attribute name. @arguments are only allowed on components, but the tag for this element (\`${elementNode.tag}\`) is a regular, non-component HTML element.`,
attribute.loc
);
}
}

function assertValidYield(statement: AST.MustacheStatement): string {
let { pairs } = statement.hash;

Expand Down
13 changes: 13 additions & 0 deletions packages/@glimmer/compiler/test/compiler-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,19 @@ function test(desc: string, template: string, ...expectedStatements: BuilderStat
const Append = Builder.Append;
const Concat = Builder.Concat;

QUnit.test(
'@arguments are on regular non-component/regular HTML nodes throws syntax error',
function(assert) {
const template = strip`
<a @onClick={{action "hi"}}>Link</a>
`;
assert.throws(
() => compile(template),
/@onClick is not a valid attribute name. @arguments are only allowed on components, but the tag for this element \(`a`\) is a regular, non-component HTML element/
);
}
);

test('HTML text content', 'content', s`content`);

test('Text curlies', '<div>{{title}}<span>{{title}}</span></div>', [
Expand Down

0 comments on commit 4621c12

Please sign in to comment.