Skip to content

Commit 4810446

Browse files
Merge pull request #2407 from NullVoxPopuli/nvp/template-lint-extract-rule-template-no-attrs-in-components
Extract rule: template-no-attrs-in-components
2 parents 32c6a86 + 0575fa6 commit 4810446

File tree

4 files changed

+98
-0
lines changed

4 files changed

+98
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ rules in templates can be disabled with eslint directives with mustache or html
255255
| [no-old-shims](docs/rules/no-old-shims.md) | disallow usage of old shims for modules || 🔧 | |
256256
| [no-string-prototype-extensions](docs/rules/no-string-prototype-extensions.md) | disallow usage of `String` prototype extensions || | |
257257
| [template-no-action](docs/rules/template-no-action.md) | disallow {{action}} helper | | | |
258+
| [template-no-attrs-in-components](docs/rules/template-no-attrs-in-components.md) | disallow attrs in component templates | | | |
258259

259260
### Ember Data
260261

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# ember/template-no-attrs-in-components
2+
3+
<!-- end auto-generated rule header -->
4+
5+
This rule prevents the usage of `this.attrs` property to access values passed to the component. Use `@arg` syntax instead.
6+
7+
## Examples
8+
9+
This rule **forbids** the following:
10+
11+
```hbs
12+
{{this.attrs.foo}}
13+
```
14+
15+
This rule **allows** the following:
16+
17+
```hbs
18+
{{@foo}}
19+
```
20+
21+
## References
22+
23+
- [rfcs/named args](https://github.com/emberjs/rfcs/blob/master/text/0276-named-args.md#motivation)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/** @type {import('eslint').Rule.RuleModule} */
2+
module.exports = {
3+
meta: {
4+
type: 'suggestion',
5+
docs: {
6+
description: 'disallow attrs in component templates',
7+
category: 'Deprecations',
8+
strictGjs: true,
9+
strictGts: true,
10+
url: 'https://github.com/ember-cli/eslint-plugin-ember/tree/master/docs/rules/template-no-attrs-in-components.md',
11+
},
12+
schema: [],
13+
messages: {
14+
noThisAttrs:
15+
'Component templates should not contain `this.attrs`. Use `@arg` syntax instead.',
16+
},
17+
},
18+
create(context) {
19+
return {
20+
GlimmerPathExpression(node) {
21+
if (node.original?.startsWith('this.attrs.') || node.original === 'this.attrs') {
22+
context.report({ node, messageId: 'noThisAttrs' });
23+
}
24+
},
25+
};
26+
},
27+
};
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
const rule = require('../../../lib/rules/template-no-attrs-in-components');
2+
const RuleTester = require('eslint').RuleTester;
3+
4+
const ruleTester = new RuleTester({
5+
parser: require.resolve('ember-eslint-parser'),
6+
parserOptions: { ecmaVersion: 2022, sourceType: 'module' },
7+
});
8+
9+
ruleTester.run('template-no-attrs-in-components', rule, {
10+
valid: [
11+
'<template>{{@value}}</template>',
12+
'<template>{{this.value}}</template>',
13+
// Class component with normal this access
14+
`import Component from '@glimmer/component';
15+
class MyComponent extends Component {
16+
<template>{{this.args.name}}</template>
17+
}`,
18+
// Bare attrs is not accessible without this, so it's allowed
19+
'<template>{{attrs.value}}</template>',
20+
'<template>{{attrs}}</template>',
21+
`import Component from '@glimmer/component';
22+
class MyComponent extends Component {
23+
<template>{{attrs.name}}</template>
24+
}`,
25+
],
26+
invalid: [
27+
{
28+
code: '<template>{{this.attrs.value}}</template>',
29+
output: null,
30+
errors: [{ messageId: 'noThisAttrs' }],
31+
},
32+
{
33+
code: '<template>{{this.attrs}}</template>',
34+
output: null,
35+
errors: [{ messageId: 'noThisAttrs' }],
36+
},
37+
// Class component using this.attrs
38+
{
39+
code: `import Component from '@glimmer/component';
40+
class MyComponent extends Component {
41+
<template>{{this.attrs.name}}</template>
42+
}`,
43+
output: null,
44+
errors: [{ messageId: 'noThisAttrs' }],
45+
},
46+
],
47+
});

0 commit comments

Comments
 (0)