Skip to content

Commit 86499ac

Browse files
Add 5 more rules: no-input-block, no-input-tagname, no-valueless-arguments, no-args-paths, no-unnecessary-curly-strings (25/127 total)
Co-authored-by: NullVoxPopuli <[email protected]>
1 parent 51e20d4 commit 86499ac

10 files changed

Lines changed: 196 additions & 0 deletions
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/** @type {import('eslint').Rule.RuleModule} */
2+
module.exports = {
3+
meta: {
4+
type: 'problem',
5+
docs: {
6+
description: 'disallow @args in paths',
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-no-args-paths.md',
11+
},
12+
schema: [],
13+
messages: { argsPath: 'Do not use paths with @args, use @argName directly instead.' },
14+
},
15+
create(context) {
16+
return {
17+
GlimmerPathExpression(node) {
18+
if (node.original?.startsWith('@args.')) {
19+
context.report({ node, messageId: 'argsPath' });
20+
}
21+
},
22+
};
23+
},
24+
};
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/** @type {import('eslint').Rule.RuleModule} */
2+
module.exports = {
3+
meta: {
4+
type: 'problem',
5+
docs: {
6+
description: 'disallow block usage of {{input}} helper',
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-no-input-block.md',
11+
},
12+
schema: [],
13+
messages: { blockUsage: 'Unexpected block usage. The input helper may only be used inline.' },
14+
},
15+
create(context) {
16+
return {
17+
GlimmerBlockStatement(node) {
18+
if (node.path?.type === 'GlimmerPathExpression' && node.path.original === 'input') {
19+
context.report({ node, messageId: 'blockUsage' });
20+
}
21+
},
22+
};
23+
},
24+
};
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/** @type {import('eslint').Rule.RuleModule} */
2+
module.exports = {
3+
meta: {
4+
type: 'problem',
5+
docs: {
6+
description: 'disallow tagName attribute on {{input}} helper',
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-no-input-tagname.md',
11+
},
12+
schema: [],
13+
messages: { unexpected: 'Unexpected tagName usage on input helper.' },
14+
},
15+
create(context) {
16+
function check(node) {
17+
if (!node.path) return;
18+
const attrs = node.hash?.pairs || [];
19+
const hasTagName = attrs.some((a) => a.key === 'tagName');
20+
21+
if (node.path.original === 'input' && hasTagName) {
22+
context.report({ node, messageId: 'unexpected' });
23+
} else if (
24+
node.path.original === 'component' &&
25+
node.params?.[0]?.original === 'input' &&
26+
hasTagName
27+
) {
28+
context.report({ node, messageId: 'unexpected' });
29+
}
30+
}
31+
return {
32+
GlimmerMustacheStatement: check,
33+
GlimmerSubExpression: check,
34+
};
35+
},
36+
};
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 unnecessary curly braces in string interpolations',
7+
category: 'Style',
8+
recommendedGjs: false,
9+
recommendedGts: false,
10+
url: 'https://github.com/ember-cli/eslint-plugin-ember/tree/master/docs/rules/template-no-unnecessary-curly-strings.md',
11+
},
12+
schema: [],
13+
messages: { unnecessary: 'Unnecessary curly braces in string.' },
14+
},
15+
create(context) {
16+
return {
17+
GlimmerAttrNode(node) {
18+
if (
19+
node.value?.type === 'GlimmerMustacheStatement' &&
20+
node.value.path?.type === 'GlimmerStringLiteral'
21+
) {
22+
context.report({ node: node.value, messageId: 'unnecessary' });
23+
}
24+
},
25+
};
26+
},
27+
};
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/** @type {import('eslint').Rule.RuleModule} */
2+
module.exports = {
3+
meta: {
4+
type: 'problem',
5+
docs: {
6+
description: 'disallow valueless named arguments',
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-no-valueless-arguments.md',
11+
},
12+
schema: [],
13+
messages: { valueless: 'Named arguments should have an explicitly assigned value.' },
14+
},
15+
create(context) {
16+
return {
17+
GlimmerAttrNode(node) {
18+
// Check if it's a named argument (@foo) with no value
19+
if (node.name?.startsWith('@') && (!node.value || node.value.type === 'GlimmerTextNode' && !node.value.chars)) {
20+
context.report({ node, messageId: 'valueless' });
21+
}
22+
},
23+
};
24+
},
25+
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const rule = require('../../../lib/rules/template-no-args-paths');
2+
const RuleTester = require('eslint').RuleTester;
3+
const ruleTester = new RuleTester({
4+
parser: require.resolve('ember-eslint-parser'),
5+
parserOptions: { ecmaVersion: 2022, sourceType: 'module' },
6+
});
7+
ruleTester.run('template-no-args-paths', rule, {
8+
valid: ['<template>{{@foo}}</template>'],
9+
invalid: [
10+
{ code: '<template>{{@args.foo}}</template>', errors: [{ messageId: 'argsPath' }] },
11+
],
12+
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const rule = require('../../../lib/rules/template-no-input-block');
2+
const RuleTester = require('eslint').RuleTester;
3+
const ruleTester = new RuleTester({
4+
parser: require.resolve('ember-eslint-parser'),
5+
parserOptions: { ecmaVersion: 2022, sourceType: 'module' },
6+
});
7+
ruleTester.run('template-no-input-block', rule, {
8+
valid: ['<template>{{input value=this.foo}}</template>'],
9+
invalid: [
10+
{ code: '<template>{{#input}}{{/input}}</template>', errors: [{ messageId: 'blockUsage' }] },
11+
],
12+
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const rule = require('../../../lib/rules/template-no-input-tagname');
2+
const RuleTester = require('eslint').RuleTester;
3+
const ruleTester = new RuleTester({
4+
parser: require.resolve('ember-eslint-parser'),
5+
parserOptions: { ecmaVersion: 2022, sourceType: 'module' },
6+
});
7+
ruleTester.run('template-no-input-tagname', rule, {
8+
valid: ['<template>{{input value=this.foo}}</template>'],
9+
invalid: [
10+
{ code: '<template>{{input tagName="span"}}</template>', errors: [{ messageId: 'unexpected' }] },
11+
],
12+
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const rule = require('../../../lib/rules/template-no-unnecessary-curly-strings');
2+
const RuleTester = require('eslint').RuleTester;
3+
const ruleTester = new RuleTester({
4+
parser: require.resolve('ember-eslint-parser'),
5+
parserOptions: { ecmaVersion: 2022, sourceType: 'module' },
6+
});
7+
ruleTester.run('template-no-unnecessary-curly-strings', rule, {
8+
valid: ['<template><div class="foo"></div></template>'],
9+
invalid: [
10+
{ code: '<template><div class={{"foo"}}></div></template>', errors: [{ messageId: 'unnecessary' }] },
11+
],
12+
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const rule = require('../../../lib/rules/template-no-valueless-arguments');
2+
const RuleTester = require('eslint').RuleTester;
3+
const ruleTester = new RuleTester({
4+
parser: require.resolve('ember-eslint-parser'),
5+
parserOptions: { ecmaVersion: 2022, sourceType: 'module' },
6+
});
7+
ruleTester.run('template-no-valueless-arguments', rule, {
8+
valid: ['<template><Foo @bar={{true}} /></template>'],
9+
invalid: [
10+
{ code: '<template><Foo @bar /></template>', errors: [{ messageId: 'valueless' }] },
11+
],
12+
});

0 commit comments

Comments
 (0)