Skip to content

Commit 08c4356

Browse files
Add 2 more rules: no-forbidden-elements, no-obsolete-elements (29/127)
Co-authored-by: NullVoxPopuli <[email protected]>
1 parent 19f5da2 commit 08c4356

11 files changed

Lines changed: 148 additions & 13 deletions

README.md

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -186,19 +186,22 @@ rules in templates can be disabled with eslint directives with mustache or html
186186

187187
### Best Practices
188188

189-
| Name | Description | 💼 | 🔧 | 💡 |
190-
| :--------------------------------------------------------------------------------- | :----------------------------------------------------- | :-------------------------------------------------------------- | :- | :- |
191-
| [template-no-args-paths](docs/rules/template-no-args-paths.md) | disallow @args in paths | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
192-
| [template-no-debugger](docs/rules/template-no-debugger.md) | disallow {{debugger}} in templates | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
193-
| [template-no-duplicate-attributes](docs/rules/template-no-duplicate-attributes.md) | disallow duplicate attribute names in templates | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | 🔧 | |
194-
| [template-no-duplicate-id](docs/rules/template-no-duplicate-id.md) | disallow duplicate id attributes | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
195-
| [template-no-inline-styles](docs/rules/template-no-inline-styles.md) | disallow inline styles | | | |
196-
| [template-no-input-block](docs/rules/template-no-input-block.md) | disallow block usage of {{input}} helper | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
197-
| [template-no-input-tagname](docs/rules/template-no-input-tagname.md) | disallow tagName attribute on {{input}} helper | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
198-
| [template-no-log](docs/rules/template-no-log.md) | disallow {{log}} in templates | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
199-
| [template-no-unnecessary-concat](docs/rules/template-no-unnecessary-concat.md) | disallow unnecessary string concatenation | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | 🔧 | |
200-
| [template-no-valueless-arguments](docs/rules/template-no-valueless-arguments.md) | disallow valueless named arguments | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
201-
| [template-require-button-type](docs/rules/template-require-button-type.md) | require button elements to have a valid type attribute | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | 🔧 | |
189+
| Name | Description | 💼 | 🔧 | 💡 |
190+
| :--------------------------------------------------------------------------------------------------------- | :----------------------------------------------------- | :-------------------------------------------------------------- | :- | :- |
191+
| [template-no-args-paths](docs/rules/template-no-args-paths.md) | disallow @args in paths | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
192+
| [template-no-debugger](docs/rules/template-no-debugger.md) | disallow {{debugger}} in templates | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
193+
| [template-no-duplicate-attributes](docs/rules/template-no-duplicate-attributes.md) | disallow duplicate attribute names in templates | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | 🔧 | |
194+
| [template-no-duplicate-id](docs/rules/template-no-duplicate-id.md) | disallow duplicate id attributes | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
195+
| [template-no-forbidden-elements](docs/rules/template-no-forbidden-elements.md) | disallow specific HTML elements | | | |
196+
| [template-no-inline-styles](docs/rules/template-no-inline-styles.md) | disallow inline styles | | | |
197+
| [template-no-input-block](docs/rules/template-no-input-block.md) | disallow block usage of {{input}} helper | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
198+
| [template-no-input-tagname](docs/rules/template-no-input-tagname.md) | disallow tagName attribute on {{input}} helper | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
199+
| [template-no-log](docs/rules/template-no-log.md) | disallow {{log}} in templates | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
200+
| [template-no-obsolete-elements](docs/rules/template-no-obsolete-elements.md) | disallow obsolete HTML elements | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
201+
| [template-no-this-in-template-only-components](docs/rules/template-no-this-in-template-only-components.md) | disallow this in template-only components (gjs/gts) | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
202+
| [template-no-unnecessary-concat](docs/rules/template-no-unnecessary-concat.md) | disallow unnecessary string concatenation | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | 🔧 | |
203+
| [template-no-valueless-arguments](docs/rules/template-no-valueless-arguments.md) | disallow valueless named arguments | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
204+
| [template-require-button-type](docs/rules/template-require-button-type.md) | require button elements to have a valid type attribute | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | 🔧 | |
202205

203206
### Components
204207

@@ -349,6 +352,7 @@ rules in templates can be disabled with eslint directives with mustache or html
349352

350353
| Name | Description | 💼 | 🔧 | 💡 |
351354
| :------------------------------------------------------------------------------------------- | :--------------------------------------------------------- | :- | :- | :- |
355+
| [template-no-quoteless-attributes](docs/rules/template-no-quoteless-attributes.md) | require quotes on all attribute values | | 🔧 | |
352356
| [template-no-unnecessary-curly-strings](docs/rules/template-no-unnecessary-curly-strings.md) | disallow unnecessary curly braces in string interpolations | | | |
353357

354358
### Stylistic Issues
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# ember/template-no-forbidden-elements
2+
3+
<!-- end auto-generated rule header -->
4+
5+
## Examples
6+
7+
See ember-template-lint documentation.
8+
9+
## References
10+
11+
- [ember-template-lint no-forbidden-elements](https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-forbidden-elements.md)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# ember/template-no-obsolete-elements
2+
3+
💼 This rule is enabled in the following [configs](https://github.com/ember-cli/eslint-plugin-ember#-configurations): ![gjs logo](/docs/svgs/gjs.svg) `recommended-gjs`, ![gts logo](/docs/svgs/gts.svg) `recommended-gts`.
4+
5+
<!-- end auto-generated rule header -->
6+
7+
## Examples
8+
9+
See ember-template-lint documentation.
10+
11+
## References
12+
13+
- [ember-template-lint no-obsolete-elements](https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-obsolete-elements.md)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# ember/template-no-quoteless-attributes
2+
3+
🔧 This rule is automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/latest/user-guide/command-line-interface#--fix).
4+
5+
<!-- end auto-generated rule header -->
6+
7+
## Examples
8+
9+
See ember-template-lint documentation.
10+
11+
## References
12+
13+
- [ember-template-lint no-quoteless-attributes](https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-quoteless-attributes.md)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# ember/template-no-this-in-template-only-components
2+
3+
💼 This rule is enabled in the following [configs](https://github.com/ember-cli/eslint-plugin-ember#-configurations): ![gjs logo](/docs/svgs/gjs.svg) `recommended-gjs`, ![gts logo](/docs/svgs/gts.svg) `recommended-gts`.
4+
5+
<!-- end auto-generated rule header -->
6+
7+
## Examples
8+
9+
See ember-template-lint documentation.
10+
11+
## References
12+
13+
- [ember-template-lint no-this-in-template-only-components](https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-this-in-template-only-components.md)

lib/recommended-rules-gjs.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ module.exports = {
2121
"ember/template-no-input-tagname": "error",
2222
"ember/template-no-let-reference": "error",
2323
"ember/template-no-log": "error",
24+
"ember/template-no-obsolete-elements": "error",
2425
"ember/template-no-partial": "error",
2526
"ember/template-no-positive-tabindex": "error",
27+
"ember/template-no-this-in-template-only-components": "error",
2628
"ember/template-no-triple-curlies": "error",
2729
"ember/template-no-unbound": "error",
2830
"ember/template-no-unnecessary-concat": "error",

lib/recommended-rules-gts.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ module.exports = {
2121
"ember/template-no-input-tagname": "error",
2222
"ember/template-no-let-reference": "error",
2323
"ember/template-no-log": "error",
24+
"ember/template-no-obsolete-elements": "error",
2425
"ember/template-no-partial": "error",
2526
"ember/template-no-positive-tabindex": "error",
27+
"ember/template-no-this-in-template-only-components": "error",
2628
"ember/template-no-triple-curlies": "error",
2729
"ember/template-no-unbound": "error",
2830
"ember/template-no-unnecessary-concat": "error",
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: 'suggestion',
5+
docs: {
6+
description: 'disallow specific HTML elements',
7+
category: 'Best Practices',
8+
recommendedGjs: false,
9+
recommendedGts: false,
10+
url: 'https://github.com/ember-cli/eslint-plugin-ember/tree/master/docs/rules/template-no-forbidden-elements.md',
11+
},
12+
schema: [{ type: 'array', items: { type: 'string' } }],
13+
messages: { forbidden: 'Use of forbidden element <{{element}}>' },
14+
},
15+
create(context) {
16+
const forbidden = new Set(context.options[0] || []);
17+
return {
18+
GlimmerElementNode(node) {
19+
if (forbidden.has(node.tag)) {
20+
context.report({ node, messageId: 'forbidden', data: { element: node.tag } });
21+
}
22+
},
23+
};
24+
},
25+
};
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const OBSOLETE = ['acronym', 'applet', 'basefont', 'bgsound', 'big', 'blink', 'center', 'dir', 'font', 'frame', 'frameset', 'isindex', 'keygen', 'listing', 'marquee', 'menuitem', 'multicol', 'nextid', 'nobr', 'noembed', 'noframes', 'plaintext', 's', 'spacer', 'strike', 'tt', 'u', 'xmp'];
2+
/** @type {import('eslint').Rule.RuleModule} */
3+
module.exports = {
4+
meta: {
5+
type: 'suggestion',
6+
docs: {
7+
description: 'disallow obsolete HTML elements',
8+
category: 'Best Practices',
9+
recommendedGjs: true,
10+
recommendedGts: true,
11+
url: 'https://github.com/ember-cli/eslint-plugin-ember/tree/master/docs/rules/template-no-obsolete-elements.md',
12+
},
13+
schema: [],
14+
messages: { obsolete: '<{{element}}> is obsolete, use modern alternatives' },
15+
},
16+
create(context) {
17+
const obsolete = new Set(OBSOLETE);
18+
return {
19+
GlimmerElementNode(node) {
20+
if (obsolete.has(node.tag)) {
21+
context.report({ node, messageId: 'obsolete', data: { element: node.tag } });
22+
}
23+
},
24+
};
25+
},
26+
};
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
const rule = require('../../../lib/rules/template-no-forbidden-elements');
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-forbidden-elements', rule, {
8+
valid: [
9+
{ code: '<template><div></div></template>', options: [['script']] },
10+
],
11+
invalid: [
12+
{ code: '<template><script></script></template>', options: [['script']], errors: [{ messageId: 'forbidden' }] },
13+
],
14+
});

0 commit comments

Comments
 (0)