-
-
Notifications
You must be signed in to change notification settings - Fork 4.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
passing @arguments to regular html elements doesn't give a great error message #18951
passing @arguments to regular html elements doesn't give a great error message #18951
Comments
I definitely think that the error should be much better here. |
@rwjblue is this the kind of thing we would want to implement at the template compiler level in glimmer, or is it intentionally undefined behavior to have arguments passed to regular html nodes in glimmer to open up future possibilities? |
I think fixing it in the compiler seems good. I think the code was just too dynamic (ie TypeScript didn’t help) and so this combination was missed. Don’t think it was intentional. That said if it’s easier to do it in ember as an ast plug-in, or because we have more information (file name and stuff) that’s fine too. |
We recently had an outage in one of our sites at Square since we had an Is there any way we could make this warn in production, and not break the entire render cycle? In its current state, it's dangerous; at the end of day, everyone will accidentally write bugs or mis-type things, and this is a pretty harsh penalty to pay. This was on |
And, added a PR for a lint rule to prevent this at |
IMO, we should just fix it as a compile-time syntax error (either in glimmer-vm or in ember) |
Yep, agreed. Doesn't hurt to land the template lint rule also, but it is just a stop gap for fixing it in the VM. |
Adds an error message in the compile phase to inform the developer that `@arguments` are not allowed on HTML nodes. This can often come from copy/pasting refactoring errors. For example, given the following template: Before, the developer would get a vague error at runtime ([Example taken from ember.js#18951](emberjs/ember.js#18951)): ``` jquery.js:3827 Uncaught TypeError: func is not a function at StatementCompilers.compile (VM32 ember.debug.js:43121) at compileStatements (VM32 ember.debug.js:44323) at maybeCompile (VM32 ember.debug.js:44312) at CompilableTemplateImpl.compile (VM32 ember.debug.js:44292) at Object.evaluate (VM32 ember.debug.js:51011) at AppendOpcodes.evaluate (VM32 ember.debug.js:49382) at LowLevelVM.evaluateSyscall (VM32 ember.debug.js:52284) at LowLevelVM.evaluateInner (VM32 ember.debug.js:52240) at LowLevelVM.evaluateOuter (VM32 ember.debug.js:52232) at JitVM.next (VM32 ember.debug.js:53175) ``` Now, they get an error message that looks like: ``` 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. (location line and column) ``` Given that there's no special behavior glimmer adds for `@arguments` on regular HTML nodes, and it seems invalid to put `@` in attribute names in regular HTML (validator.w3c.org gives ` Attribute @OnClick is not serializable as XML 1.0` error message for the example template below), it seems helpful for the glimmer compiler to fail at build time to prevent copy/paste errors and mistakes. Fixes emberjs/ember.js#18951
opened glimmerjs/glimmer-vm#1102 to help address this |
Adds an error message in the compile phase to inform the developer that `@arguments` are not allowed on HTML nodes. This can often come from copy/pasting refactoring errors. For example, given the following template: Before, the developer would get a vague error at runtime ([Example taken from ember.js#18951](emberjs/ember.js#18951)): ``` jquery.js:3827 Uncaught TypeError: func is not a function at StatementCompilers.compile (VM32 ember.debug.js:43121) at compileStatements (VM32 ember.debug.js:44323) at maybeCompile (VM32 ember.debug.js:44312) at CompilableTemplateImpl.compile (VM32 ember.debug.js:44292) at Object.evaluate (VM32 ember.debug.js:51011) at AppendOpcodes.evaluate (VM32 ember.debug.js:49382) at LowLevelVM.evaluateSyscall (VM32 ember.debug.js:52284) at LowLevelVM.evaluateInner (VM32 ember.debug.js:52240) at LowLevelVM.evaluateOuter (VM32 ember.debug.js:52232) at JitVM.next (VM32 ember.debug.js:53175) ``` Now, they get an error message that looks like: ``` 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. (location line and column) ``` Given that there's no special behavior glimmer adds for `@arguments` on regular HTML nodes, and it seems invalid to put `@` in attribute names in regular HTML (validator.w3c.org gives ` Attribute @OnClick is not serializable as XML 1.0` error message for the example template below), it seems helpful for the glimmer compiler to fail at build time to prevent copy/paste errors and mistakes. Fixes emberjs/ember.js#18951
Adds an error message in the compile phase to inform the developer that `@arguments` are not allowed on HTML nodes. This can often come from copy/pasting refactoring errors. For example, given the following template: ```handlebars <a href="https://emberjs.com" @OnClick={{action "foo"}}>Ember.js</a> ``` Before, the developer would get a vague error at runtime ([Example taken from ember.js#18951](emberjs/ember.js#18951)): ``` jquery.js:3827 Uncaught TypeError: func is not a function at StatementCompilers.compile (VM32 ember.debug.js:43121) at compileStatements (VM32 ember.debug.js:44323) at maybeCompile (VM32 ember.debug.js:44312) at CompilableTemplateImpl.compile (VM32 ember.debug.js:44292) at Object.evaluate (VM32 ember.debug.js:51011) at AppendOpcodes.evaluate (VM32 ember.debug.js:49382) at LowLevelVM.evaluateSyscall (VM32 ember.debug.js:52284) at LowLevelVM.evaluateInner (VM32 ember.debug.js:52240) at LowLevelVM.evaluateOuter (VM32 ember.debug.js:52232) at JitVM.next (VM32 ember.debug.js:53175) ``` Now, they get an error message that looks like: ``` 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. (location line and column) ``` Given that there's no special behavior glimmer adds for `@arguments` on regular HTML nodes, and it seems invalid to put `@` in attribute names in regular HTML (validator.w3c.org gives ` Attribute @OnClick is not serializable as XML 1.0` error message for the example template below), it seems helpful for the glimmer compiler to fail at build time to prevent copy/paste errors and mistakes. Fixes emberjs/ember.js#18951
(reopened to track landing the fix in Ember) |
Twiddle: https://ember-twiddle.com/83bd6cc98d5038094a80cc21c11c98cb?openFiles=templates.application%5C.hbs%2C
Ember Version: 3.17.0
Tried searching for this one but apologies if I couldn't find it.
Given:
The following error appears at runtime:
Would it be possible to give a better error message at runtime like
@arguments are not allowed on regular html elements
?Would it be possible for this to be an error at compile time?
The text was updated successfully, but these errors were encountered: