Skip to content

Commit 2d03b5a

Browse files
Add 2 rules: splat-attributes-only, no-attrs-in-components (34/127)
Co-authored-by: NullVoxPopuli <[email protected]>
1 parent 37326d0 commit 2d03b5a

4 files changed

Lines changed: 97 additions & 0 deletions

File tree

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+
recommendedGjs: true,
9+
recommendedGts: 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+
noAttrs: 'Component templates should not contain `attrs`.',
15+
},
16+
},
17+
create(context) {
18+
return {
19+
GlimmerPathExpression(node) {
20+
// Check if the path starts with "attrs"
21+
if (node.original?.startsWith('attrs.') || node.original === 'attrs') {
22+
context.report({ node, messageId: 'noAttrs' });
23+
}
24+
},
25+
};
26+
},
27+
};
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/** @type {import('eslint').Rule.RuleModule} */
2+
module.exports = {
3+
meta: {
4+
type: 'problem',
5+
docs: {
6+
description: 'disallow ...spread other than ...attributes',
7+
category: 'Best Practices',
8+
recommendedGjs: true,
9+
recommendedGts: true,
10+
url: 'https://github.com/ember-cli/eslint-plugin-ember/tree/master/docs/rules/template-splat-attributes-only.md',
11+
},
12+
schema: [],
13+
messages: {
14+
onlyAttributes: 'Only `...attributes` can be applied to elements',
15+
},
16+
},
17+
create(context) {
18+
return {
19+
GlimmerAttrNode(node) {
20+
if (node.name?.startsWith('...') && node.name !== '...attributes') {
21+
context.report({ node, messageId: 'onlyAttributes' });
22+
}
23+
},
24+
};
25+
},
26+
};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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: ['<template>{{@value}}</template>', '<template>{{this.value}}</template>'],
11+
invalid: [
12+
{
13+
code: '<template>{{attrs.value}}</template>',
14+
output: null,
15+
errors: [{ messageId: 'noAttrs' }],
16+
},
17+
{
18+
code: '<template>{{attrs}}</template>',
19+
output: null,
20+
errors: [{ messageId: 'noAttrs' }],
21+
},
22+
],
23+
});
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const rule = require('../../../lib/rules/template-splat-attributes-only');
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-splat-attributes-only', rule, {
10+
valid: [
11+
'<template><div ...attributes></div></template>',
12+
'<template><MyComponent ...attributes /></template>',
13+
],
14+
invalid: [
15+
{
16+
code: '<template><div ...props></div></template>',
17+
output: null,
18+
errors: [{ messageId: 'onlyAttributes' }],
19+
},
20+
],
21+
});

0 commit comments

Comments
 (0)