Skip to content

Commit 51e20d4

Browse files
Add 6 more rules: no-unbound, no-with, no-duplicate-id, no-inline-styles, link-rel-noopener, no-unnecessary-concat (20/127 total)
Co-authored-by: NullVoxPopuli <[email protected]>
1 parent edae353 commit 51e20d4

21 files changed

Lines changed: 381 additions & 3 deletions

README.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,10 @@ rules in templates can be disabled with eslint directives with mustache or html
190190
| :--------------------------------------------------------------------------------- | :----------------------------------------------------- | :-------------------------------------------------------------- | :- | :- |
191191
| [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) | | |
192192
| [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) | 🔧 | |
193+
| [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) | | |
194+
| [template-no-inline-styles](docs/rules/template-no-inline-styles.md) | disallow inline styles | | | |
193195
| [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) | | |
196+
| [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) | 🔧 | |
194197
| [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) | 🔧 | |
195198

196199
### Components
@@ -252,6 +255,8 @@ rules in templates can be disabled with eslint directives with mustache or html
252255
| [template-deprecated-render-helper](docs/rules/template-deprecated-render-helper.md) | disallow {{render}} helper | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
253256
| [template-no-action](docs/rules/template-no-action.md) | disallow {{action}} helper | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
254257
| [template-no-partial](docs/rules/template-no-partial.md) | disallow {{partial}} helper | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
258+
| [template-no-unbound](docs/rules/template-no-unbound.md) | disallow {{unbound}} helper | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
259+
| [template-no-with](docs/rules/template-no-with.md) | disallow {{with}} helper | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
255260

256261
### Ember Data
257262

@@ -322,9 +327,10 @@ rules in templates can be disabled with eslint directives with mustache or html
322327

323328
### Security
324329

325-
| Name                       | Description | 💼 | 🔧 | 💡 |
326-
| :--------------------------------------------------------------------- | :------------------------------------------------------------ | :-------------------------------------------------------------- | :- | :- |
327-
| [template-no-triple-curlies](docs/rules/template-no-triple-curlies.md) | disallow usage of triple curly brackets (unescaped variables) | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
330+
| Name                       | Description | 💼 | 🔧 | 💡 |
331+
| :--------------------------------------------------------------------- | :-------------------------------------------------------------- | :-------------------------------------------------------------- | :- | :- |
332+
| [template-link-rel-noopener](docs/rules/template-link-rel-noopener.md) | require rel="noopener noreferrer" on links with target="_blank" | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | 🔧 | |
333+
| [template-no-triple-curlies](docs/rules/template-no-triple-curlies.md) | disallow usage of triple curly brackets (unescaped variables) | ![gjs logo](/docs/svgs/gjs.svg) ![gts logo](/docs/svgs/gts.svg) | | |
328334

329335
### Services
330336

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# ember/template-link-rel-noopener
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+
🔧 This rule is automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/latest/user-guide/command-line-interface#--fix).
6+
7+
<!-- end auto-generated rule header -->
8+
9+
## Examples
10+
11+
See ember-template-lint documentation.
12+
13+
## References
14+
15+
- [ember-template-lint link-rel-noopener](https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/link-rel-noopener.md)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# ember/template-no-duplicate-id
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-duplicate-id](https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-duplicate-id.md)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# ember/template-no-inline-styles
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-inline-styles](https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-inline-styles.md)

docs/rules/template-no-unbound.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# ember/template-no-unbound
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-unbound](https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-unbound.md)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# ember/template-no-unnecessary-concat
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+
🔧 This rule is automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/latest/user-guide/command-line-interface#--fix).
6+
7+
<!-- end auto-generated rule header -->
8+
9+
## Examples
10+
11+
See ember-template-lint documentation.
12+
13+
## References
14+
15+
- [ember-template-lint no-unnecessary-concat](https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-unnecessary-concat.md)

docs/rules/template-no-with.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# ember/template-no-with
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-with](https://github.com/ember-template-lint/ember-template-lint/blob/master/docs/rule/no-with.md)

lib/recommended-rules-gjs.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,22 @@
77
module.exports = {
88
"ember/template-deprecated-inline-view-helper": "error",
99
"ember/template-deprecated-render-helper": "error",
10+
"ember/template-link-rel-noopener": "error",
1011
"ember/template-no-abstract-roles": "error",
1112
"ember/template-no-accesskey-attribute": "error",
1213
"ember/template-no-action": "error",
1314
"ember/template-no-aria-hidden-body": "error",
1415
"ember/template-no-autofocus-attribute": "error",
1516
"ember/template-no-debugger": "error",
1617
"ember/template-no-duplicate-attributes": "error",
18+
"ember/template-no-duplicate-id": "error",
1719
"ember/template-no-let-reference": "error",
1820
"ember/template-no-log": "error",
1921
"ember/template-no-partial": "error",
2022
"ember/template-no-positive-tabindex": "error",
2123
"ember/template-no-triple-curlies": "error",
24+
"ember/template-no-unbound": "error",
25+
"ember/template-no-unnecessary-concat": "error",
26+
"ember/template-no-with": "error",
2227
"ember/template-require-button-type": "error"
2328
}

lib/recommended-rules-gts.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,22 @@
77
module.exports = {
88
"ember/template-deprecated-inline-view-helper": "error",
99
"ember/template-deprecated-render-helper": "error",
10+
"ember/template-link-rel-noopener": "error",
1011
"ember/template-no-abstract-roles": "error",
1112
"ember/template-no-accesskey-attribute": "error",
1213
"ember/template-no-action": "error",
1314
"ember/template-no-aria-hidden-body": "error",
1415
"ember/template-no-autofocus-attribute": "error",
1516
"ember/template-no-debugger": "error",
1617
"ember/template-no-duplicate-attributes": "error",
18+
"ember/template-no-duplicate-id": "error",
1719
"ember/template-no-let-reference": "error",
1820
"ember/template-no-log": "error",
1921
"ember/template-no-partial": "error",
2022
"ember/template-no-positive-tabindex": "error",
2123
"ember/template-no-triple-curlies": "error",
24+
"ember/template-no-unbound": "error",
25+
"ember/template-no-unnecessary-concat": "error",
26+
"ember/template-no-with": "error",
2227
"ember/template-require-button-type": "error"
2328
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/** @type {import('eslint').Rule.RuleModule} */
2+
module.exports = {
3+
meta: {
4+
type: 'problem',
5+
docs: {
6+
description: 'require rel="noopener noreferrer" on links with target="_blank"',
7+
category: 'Security',
8+
recommendedGjs: true,
9+
recommendedGts: true,
10+
url: 'https://github.com/ember-cli/eslint-plugin-ember/tree/master/docs/rules/template-link-rel-noopener.md',
11+
},
12+
fixable: 'code',
13+
schema: [],
14+
messages: {
15+
missingRel: 'links with target="_blank" must have rel="noopener noreferrer"',
16+
},
17+
},
18+
create(context) {
19+
return {
20+
GlimmerElementNode(node) {
21+
if (node.tag !== 'a') return;
22+
23+
const targetAttr = node.attributes?.find((a) => a.name === 'target');
24+
if (!targetAttr?.value || targetAttr.value.type !== 'GlimmerTextNode') return;
25+
if (targetAttr.value.chars !== '_blank') return;
26+
27+
const relAttr = node.attributes?.find((a) => a.name === 'rel');
28+
const hasProperRel =
29+
relAttr?.value?.type === 'GlimmerTextNode' &&
30+
/noopener/.test(relAttr.value.chars) &&
31+
/noreferrer/.test(relAttr.value.chars);
32+
33+
if (!hasProperRel) {
34+
context.report({
35+
node: targetAttr,
36+
messageId: 'missingRel',
37+
fix(fixer) {
38+
const sourceCode = context.sourceCode;
39+
const openTag = sourceCode.getText(node).match(/^<a[^>]*/)[0];
40+
const insertPos = node.range[0] + openTag.length;
41+
return fixer.insertTextBeforeRange(
42+
[insertPos, insertPos],
43+
' rel="noopener noreferrer"'
44+
);
45+
},
46+
});
47+
}
48+
},
49+
};
50+
},
51+
};

0 commit comments

Comments
 (0)