@html-eslint/eslint-plugin 0.40.3 → 0.41.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/configs/recommended.js +4 -1
- package/lib/exports.ts +1 -1
- package/lib/index.js +17 -20
- package/lib/languages/html-language.js +13 -8
- package/lib/rules/attrs-newline.js +2 -0
- package/lib/rules/element-newline.js +3 -0
- package/lib/rules/id-naming-convention.js +2 -0
- package/lib/rules/indent/indent.js +4 -4
- package/lib/rules/index.js +6 -1
- package/lib/rules/lowercase.js +2 -0
- package/lib/rules/max-element-depth.js +2 -0
- package/lib/rules/no-abstract-roles.js +2 -0
- package/lib/rules/no-accesskey-attrs.js +2 -0
- package/lib/rules/no-aria-hidden-body.js +2 -0
- package/lib/rules/no-duplicate-attrs.js +2 -0
- package/lib/rules/no-duplicate-class.js +4 -2
- package/lib/rules/no-duplicate-id.js +2 -0
- package/lib/rules/no-extra-spacing-attrs.js +2 -0
- package/lib/rules/no-extra-spacing-text.js +2 -0
- package/lib/rules/no-heading-inside-button.js +3 -0
- package/lib/rules/no-inline-styles.js +3 -0
- package/lib/rules/no-invalid-role.js +5 -2
- package/lib/rules/no-multiple-empty-lines.js +3 -1
- package/lib/rules/no-multiple-h1.js +2 -0
- package/lib/rules/no-nested-interactive.js +2 -0
- package/lib/rules/no-non-scalable-viewport.js +2 -0
- package/lib/rules/no-obsolete-tags.js +2 -0
- package/lib/rules/no-positive-tabindex.js +2 -0
- package/lib/rules/no-restricted-attr-values.js +2 -0
- package/lib/rules/no-restricted-attrs.js +2 -0
- package/lib/rules/no-script-style-type.js +2 -0
- package/lib/rules/no-skip-heading-levels.js +2 -0
- package/lib/rules/no-target-blank.js +2 -0
- package/lib/rules/no-trailing-spaces.js +2 -0
- package/lib/rules/prefer-https.js +2 -0
- package/lib/rules/quotes.js +4 -2
- package/lib/rules/require-attrs.js +2 -0
- package/lib/rules/require-button-type.js +2 -0
- package/lib/rules/require-closing-tags.js +2 -0
- package/lib/rules/require-doctype.js +2 -0
- package/lib/rules/require-explicit-size.js +2 -0
- package/lib/rules/require-form-method.js +4 -2
- package/lib/rules/require-frame-title.js +2 -0
- package/lib/rules/require-img-alt.js +2 -0
- package/lib/rules/require-input-label.js +2 -0
- package/lib/rules/require-lang.js +2 -0
- package/lib/rules/require-li-container.js +2 -0
- package/lib/rules/require-meta-charset.js +2 -0
- package/lib/rules/require-meta-description.js +2 -0
- package/lib/rules/require-meta-viewport.js +2 -0
- package/lib/rules/require-open-graph-protocol.js +4 -1
- package/lib/rules/require-title.js +2 -0
- package/lib/rules/sort-attrs.js +2 -0
- package/lib/rules/use-baseline.js +2 -0
- package/lib/rules/utils/node.js +5 -6
- package/lib/rules/utils/rule.js +11 -0
- package/package.json +19 -13
- package/types/configs/recommended.d.ts +17 -17
- package/types/exports.d.ts +1 -1
- package/types/exports.d.ts.map +1 -1
- package/types/index.d.ts +64 -102
- package/types/index.d.ts.map +1 -1
- package/types/languages/html-language.d.ts +22 -21
- package/types/languages/html-language.d.ts.map +1 -1
- package/types/languages/html-source-code.d.ts +3 -1
- package/types/languages/html-source-code.d.ts.map +1 -1
- package/types/rules/attrs-newline.d.ts.map +1 -1
- package/types/rules/element-newline.d.ts.map +1 -1
- package/types/rules/id-naming-convention.d.ts.map +1 -1
- package/types/rules/index.d.ts +1 -69
- package/types/rules/lowercase.d.ts.map +1 -1
- package/types/rules/max-element-depth.d.ts.map +1 -1
- package/types/rules/no-abstract-roles.d.ts.map +1 -1
- package/types/rules/no-accesskey-attrs.d.ts.map +1 -1
- package/types/rules/no-aria-hidden-body.d.ts.map +1 -1
- package/types/rules/no-duplicate-attrs.d.ts.map +1 -1
- package/types/rules/no-duplicate-class.d.ts.map +1 -1
- package/types/rules/no-duplicate-id.d.ts.map +1 -1
- package/types/rules/no-extra-spacing-attrs.d.ts.map +1 -1
- package/types/rules/no-extra-spacing-text.d.ts.map +1 -1
- package/types/rules/no-heading-inside-button.d.ts.map +1 -1
- package/types/rules/no-inline-styles.d.ts.map +1 -1
- package/types/rules/no-invalid-role.d.ts.map +1 -1
- package/types/rules/no-multiple-empty-lines.d.ts +1 -1
- package/types/rules/no-multiple-empty-lines.d.ts.map +1 -1
- package/types/rules/no-multiple-h1.d.ts.map +1 -1
- package/types/rules/no-nested-interactive.d.ts.map +1 -1
- package/types/rules/no-non-scalable-viewport.d.ts.map +1 -1
- package/types/rules/no-obsolete-tags.d.ts.map +1 -1
- package/types/rules/no-positive-tabindex.d.ts.map +1 -1
- package/types/rules/no-restricted-attr-values.d.ts.map +1 -1
- package/types/rules/no-restricted-attrs.d.ts.map +1 -1
- package/types/rules/no-script-style-type.d.ts.map +1 -1
- package/types/rules/no-skip-heading-levels.d.ts.map +1 -1
- package/types/rules/no-target-blank.d.ts.map +1 -1
- package/types/rules/no-trailing-spaces.d.ts.map +1 -1
- package/types/rules/prefer-https.d.ts.map +1 -1
- package/types/rules/quotes.d.ts.map +1 -1
- package/types/rules/require-attrs.d.ts.map +1 -1
- package/types/rules/require-button-type.d.ts.map +1 -1
- package/types/rules/require-closing-tags.d.ts.map +1 -1
- package/types/rules/require-doctype.d.ts.map +1 -1
- package/types/rules/require-explicit-size.d.ts.map +1 -1
- package/types/rules/require-form-method.d.ts.map +1 -1
- package/types/rules/require-frame-title.d.ts.map +1 -1
- package/types/rules/require-img-alt.d.ts.map +1 -1
- package/types/rules/require-input-label.d.ts.map +1 -1
- package/types/rules/require-lang.d.ts.map +1 -1
- package/types/rules/require-li-container.d.ts.map +1 -1
- package/types/rules/require-meta-charset.d.ts.map +1 -1
- package/types/rules/require-meta-description.d.ts.map +1 -1
- package/types/rules/require-meta-viewport.d.ts.map +1 -1
- package/types/rules/require-open-graph-protocol.d.ts.map +1 -1
- package/types/rules/require-title.d.ts.map +1 -1
- package/types/rules/sort-attrs.d.ts.map +1 -1
- package/types/rules/use-baseline.d.ts.map +1 -1
- package/types/rules/utils/node.d.ts +1 -1
- package/types/rules/utils/node.d.ts.map +1 -1
- package/types/rules/utils/rule.d.ts +6 -0
- package/types/rules/utils/rule.d.ts.map +1 -0
- package/types/rules/utils/source-code.d.ts +1 -6
- package/types/rules/utils/source-code.d.ts.map +1 -1
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
const { RULE_CATEGORY } = require("../constants");
|
|
6
6
|
const { findAttr } = require("./utils/node");
|
|
7
7
|
const { createVisitors } = require("./utils/visitors");
|
|
8
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
8
9
|
|
|
9
10
|
const MESSAGE_IDS = {
|
|
10
11
|
MISSING: "missing",
|
|
@@ -21,6 +22,7 @@ module.exports = {
|
|
|
21
22
|
description: "Disallow usage of unsafe `target='_blank'`",
|
|
22
23
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
23
24
|
recommended: false,
|
|
25
|
+
url: getRuleUrl("no-target-blank"),
|
|
24
26
|
},
|
|
25
27
|
|
|
26
28
|
fixable: null,
|
|
@@ -16,6 +16,7 @@ const {
|
|
|
16
16
|
shouldCheckTemplateLiteral,
|
|
17
17
|
} = require("./utils/settings");
|
|
18
18
|
const { getSourceCode } = require("./utils/source-code");
|
|
19
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
19
20
|
|
|
20
21
|
const MESSAGE_IDS = {
|
|
21
22
|
TRAILING_SPACE: "trailingSpace",
|
|
@@ -31,6 +32,7 @@ module.exports = {
|
|
|
31
32
|
description: "Disallow trailing whitespace at the end of lines",
|
|
32
33
|
recommended: false,
|
|
33
34
|
category: RULE_CATEGORY.STYLE,
|
|
35
|
+
url: getRuleUrl("no-trailing-spaces"),
|
|
34
36
|
},
|
|
35
37
|
fixable: true,
|
|
36
38
|
schema: [],
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
const { RULE_CATEGORY } = require("../constants");
|
|
10
10
|
const { findAttr, isScript } = require("./utils/node");
|
|
11
11
|
const { createVisitors } = require("./utils/visitors");
|
|
12
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
12
13
|
|
|
13
14
|
const MESSAGE_IDS = {
|
|
14
15
|
UNEXPECTED: "unexpected",
|
|
@@ -74,6 +75,7 @@ module.exports = {
|
|
|
74
75
|
description: "Prefer to use HTTPS for embedded resources",
|
|
75
76
|
recommended: false,
|
|
76
77
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
78
|
+
url: getRuleUrl("prefer-https"),
|
|
77
79
|
},
|
|
78
80
|
fixable: false,
|
|
79
81
|
schema: [],
|
package/lib/rules/quotes.js
CHANGED
|
@@ -9,10 +9,11 @@
|
|
|
9
9
|
* @typedef { import("../types").RuleModule<[Option]> } RuleModule
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
const {
|
|
12
|
+
const { NODE_TYPES } = require("@html-eslint/parser");
|
|
13
13
|
const { RULE_CATEGORY } = require("../constants");
|
|
14
14
|
const { getSourceCode } = require("./utils/source-code");
|
|
15
15
|
const { createVisitors } = require("./utils/visitors");
|
|
16
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
16
17
|
|
|
17
18
|
const MESSAGE_IDS = {
|
|
18
19
|
UNEXPECTED: "unexpected",
|
|
@@ -38,6 +39,7 @@ module.exports = {
|
|
|
38
39
|
"Enforce consistent quoting attributes with double(\") or single(')",
|
|
39
40
|
category: RULE_CATEGORY.STYLE,
|
|
40
41
|
recommended: true,
|
|
42
|
+
url: getRuleUrl("quotes"),
|
|
41
43
|
},
|
|
42
44
|
fixable: true,
|
|
43
45
|
schema: [
|
|
@@ -92,7 +94,7 @@ module.exports = {
|
|
|
92
94
|
* Allow template expression.
|
|
93
95
|
* ex: html`<div foo=${foo}></div>`
|
|
94
96
|
*/
|
|
95
|
-
if (attr.value.parts.some((part) => part.type ===
|
|
97
|
+
if (attr.value.parts.some((part) => part.type === NODE_TYPES.Template)) {
|
|
96
98
|
return;
|
|
97
99
|
}
|
|
98
100
|
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
const { NODE_TYPES } = require("@html-eslint/parser");
|
|
18
18
|
const { RULE_CATEGORY } = require("../constants");
|
|
19
19
|
const { createVisitors } = require("./utils/visitors");
|
|
20
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
20
21
|
|
|
21
22
|
const MESSAGE_IDS = {
|
|
22
23
|
MISSING: "missing",
|
|
@@ -34,6 +35,7 @@ module.exports = {
|
|
|
34
35
|
description: "Require specified attributes",
|
|
35
36
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
36
37
|
recommended: false,
|
|
38
|
+
url: getRuleUrl("require-attrs"),
|
|
37
39
|
},
|
|
38
40
|
fixable: "code",
|
|
39
41
|
schema: {
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
const { RULE_CATEGORY } = require("../constants");
|
|
8
8
|
const { findAttr } = require("./utils/node");
|
|
9
9
|
const { createVisitors } = require("./utils/visitors");
|
|
10
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
10
11
|
|
|
11
12
|
const MESSAGE_IDS = {
|
|
12
13
|
MISSING: "missing",
|
|
@@ -29,6 +30,7 @@ module.exports = {
|
|
|
29
30
|
description: "Require use of button element with a valid type attribute.",
|
|
30
31
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
31
32
|
recommended: false,
|
|
33
|
+
url: getRuleUrl("require-button-type"),
|
|
32
34
|
},
|
|
33
35
|
|
|
34
36
|
fixable: true,
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
const { RULE_CATEGORY, VOID_ELEMENTS } = require("../constants");
|
|
11
11
|
const { createVisitors } = require("./utils/visitors");
|
|
12
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
12
13
|
|
|
13
14
|
const VOID_ELEMENTS_SET = new Set(VOID_ELEMENTS);
|
|
14
15
|
|
|
@@ -29,6 +30,7 @@ module.exports = {
|
|
|
29
30
|
description: "Require closing tags.",
|
|
30
31
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
31
32
|
recommended: true,
|
|
33
|
+
url: getRuleUrl("require-closing-tags"),
|
|
32
34
|
},
|
|
33
35
|
|
|
34
36
|
fixable: true,
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
const { RULE_CATEGORY } = require("../constants");
|
|
6
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
6
7
|
|
|
7
8
|
const MESSAGE_IDS = {
|
|
8
9
|
MISSING: "missing",
|
|
@@ -19,6 +20,7 @@ module.exports = {
|
|
|
19
20
|
description: "Require `<!DOCTYPE HTML>` in html,",
|
|
20
21
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
21
22
|
recommended: true,
|
|
23
|
+
url: getRuleUrl("require-doctype"),
|
|
22
24
|
},
|
|
23
25
|
|
|
24
26
|
fixable: true,
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
const { RULE_CATEGORY } = require("../constants");
|
|
13
13
|
const { findAttr } = require("./utils/node");
|
|
14
14
|
const { createVisitors } = require("./utils/visitors");
|
|
15
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
15
16
|
|
|
16
17
|
const MESSAGE_IDS = {
|
|
17
18
|
MISSING_HEIGHT: "missingHeight",
|
|
@@ -32,6 +33,7 @@ module.exports = {
|
|
|
32
33
|
"Enforces that some elements (img, iframe) have explicitly defined width and height attributes.",
|
|
33
34
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
34
35
|
recommended: false,
|
|
36
|
+
url: getRuleUrl("require-explicit-size"),
|
|
35
37
|
},
|
|
36
38
|
|
|
37
39
|
fixable: null,
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
* @typedef { import("../types").RuleModule<[]> } RuleModule
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
const {
|
|
5
|
+
const { NODE_TYPES } = require("@html-eslint/parser");
|
|
6
6
|
const { RULE_CATEGORY } = require("../constants");
|
|
7
7
|
const { findAttr } = require("./utils/node");
|
|
8
8
|
const { createVisitors } = require("./utils/visitors");
|
|
9
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
9
10
|
|
|
10
11
|
const MESSAGE_IDS = {
|
|
11
12
|
MISSING: "missing",
|
|
@@ -26,6 +27,7 @@ module.exports = {
|
|
|
26
27
|
description: "Require `method` attribute in `<form>`",
|
|
27
28
|
category: RULE_CATEGORY.ACCESSIBILITY,
|
|
28
29
|
recommended: false,
|
|
30
|
+
url: getRuleUrl("require-form-method"),
|
|
29
31
|
},
|
|
30
32
|
|
|
31
33
|
fixable: false,
|
|
@@ -65,7 +67,7 @@ module.exports = {
|
|
|
65
67
|
|
|
66
68
|
if (
|
|
67
69
|
method.value.parts &&
|
|
68
|
-
method.value.parts.some((part) => part.type !==
|
|
70
|
+
method.value.parts.some((part) => part.type !== NODE_TYPES.Part)
|
|
69
71
|
) {
|
|
70
72
|
return;
|
|
71
73
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
const { RULE_CATEGORY } = require("../constants");
|
|
6
6
|
const { findAttr } = require("./utils/node");
|
|
7
7
|
const { createVisitors } = require("./utils/visitors");
|
|
8
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
8
9
|
|
|
9
10
|
const MESSAGE_IDS = {
|
|
10
11
|
MISSING: "missing",
|
|
@@ -22,6 +23,7 @@ module.exports = {
|
|
|
22
23
|
description: "Require `title` in `<frame>`, `<iframe>`",
|
|
23
24
|
category: RULE_CATEGORY.ACCESSIBILITY,
|
|
24
25
|
recommended: false,
|
|
26
|
+
url: getRuleUrl("require-frame-title"),
|
|
25
27
|
},
|
|
26
28
|
|
|
27
29
|
fixable: false,
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
const { RULE_CATEGORY } = require("../constants");
|
|
11
11
|
const { createVisitors } = require("./utils/visitors");
|
|
12
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
12
13
|
|
|
13
14
|
const MESSAGE_IDS = {
|
|
14
15
|
MISSING_ALT: "missingAlt",
|
|
@@ -25,6 +26,7 @@ module.exports = {
|
|
|
25
26
|
description: "Require `alt` attribute at `<img>` tag",
|
|
26
27
|
category: RULE_CATEGORY.ACCESSIBILITY,
|
|
27
28
|
recommended: true,
|
|
29
|
+
url: getRuleUrl("require-img-alt"),
|
|
28
30
|
},
|
|
29
31
|
|
|
30
32
|
fixable: null,
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
const { RULE_CATEGORY } = require("../constants");
|
|
7
7
|
const { createVisitors } = require("./utils/visitors");
|
|
8
8
|
const { findParent, isTag } = require("./utils/node");
|
|
9
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
9
10
|
|
|
10
11
|
const MESSAGE_IDS = {
|
|
11
12
|
MISSING: "missingLabel",
|
|
@@ -27,6 +28,7 @@ module.exports = {
|
|
|
27
28
|
"Enforces use of label for form elements(`input`, `textarea`, `select`)",
|
|
28
29
|
category: RULE_CATEGORY.ACCESSIBILITY,
|
|
29
30
|
recommended: false,
|
|
31
|
+
url: getRuleUrl("require-input-label"),
|
|
30
32
|
},
|
|
31
33
|
fixable: null,
|
|
32
34
|
schema: [],
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
const { RULE_CATEGORY } = require("../constants");
|
|
6
6
|
const { findAttr } = require("./utils/node");
|
|
7
7
|
const { createVisitors } = require("./utils/visitors");
|
|
8
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
8
9
|
|
|
9
10
|
const MESSAGE_IDS = {
|
|
10
11
|
MISSING: "missing",
|
|
@@ -22,6 +23,7 @@ module.exports = {
|
|
|
22
23
|
description: "Require `lang` attribute at `<html>` tag",
|
|
23
24
|
category: RULE_CATEGORY.SEO,
|
|
24
25
|
recommended: true,
|
|
26
|
+
url: getRuleUrl("require-lang"),
|
|
25
27
|
},
|
|
26
28
|
|
|
27
29
|
fixable: null,
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
const { NODE_TYPES } = require("@html-eslint/parser");
|
|
6
6
|
const { RULE_CATEGORY } = require("../constants");
|
|
7
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
7
8
|
|
|
8
9
|
const MESSAGE_IDS = {
|
|
9
10
|
INVALID: "invalid",
|
|
@@ -22,6 +23,7 @@ module.exports = {
|
|
|
22
23
|
description: "Enforce `<li>` to be in `<ul>`, `<ol>` or `<menu>`.",
|
|
23
24
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
24
25
|
recommended: true,
|
|
26
|
+
url: getRuleUrl("require-li-container"),
|
|
25
27
|
},
|
|
26
28
|
|
|
27
29
|
fixable: null,
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
const { RULE_CATEGORY } = require("../constants");
|
|
8
8
|
const { find } = require("./utils/array");
|
|
9
9
|
const { findAttr, isTag } = require("./utils/node");
|
|
10
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
10
11
|
|
|
11
12
|
const MESSAGE_IDS = {
|
|
12
13
|
MISSING: "missing",
|
|
@@ -32,6 +33,7 @@ module.exports = {
|
|
|
32
33
|
description: 'Enforce to use `<meta charset="...">` in `<head>`',
|
|
33
34
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
34
35
|
recommended: false,
|
|
36
|
+
url: getRuleUrl("require-meta-charset"),
|
|
35
37
|
},
|
|
36
38
|
|
|
37
39
|
fixable: null,
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
const { RULE_CATEGORY } = require("../constants");
|
|
7
7
|
const { filter } = require("./utils/array");
|
|
8
8
|
const { findAttr, isTag } = require("./utils/node");
|
|
9
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
9
10
|
|
|
10
11
|
const MESSAGE_IDS = {
|
|
11
12
|
MISSING: "missing",
|
|
@@ -31,6 +32,7 @@ module.exports = {
|
|
|
31
32
|
description: 'Require use of `<meta name="description">` in `<head>`',
|
|
32
33
|
category: RULE_CATEGORY.SEO,
|
|
33
34
|
recommended: false,
|
|
35
|
+
url: getRuleUrl("require-meta-description"),
|
|
34
36
|
},
|
|
35
37
|
|
|
36
38
|
fixable: null,
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
const { RULE_CATEGORY } = require("../constants");
|
|
8
8
|
const { find } = require("./utils/array");
|
|
9
9
|
const { findAttr, isTag } = require("./utils/node");
|
|
10
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
10
11
|
|
|
11
12
|
const MESSAGE_IDS = {
|
|
12
13
|
MISSING: "missing",
|
|
@@ -40,6 +41,7 @@ module.exports = {
|
|
|
40
41
|
description: 'Enforce to use `<meta name="viewport">` in `<head>`',
|
|
41
42
|
category: RULE_CATEGORY.ACCESSIBILITY,
|
|
42
43
|
recommended: false,
|
|
44
|
+
url: getRuleUrl("require-meta-viewport"),
|
|
43
45
|
},
|
|
44
46
|
|
|
45
47
|
fixable: null,
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
const { RULE_CATEGORY } = require("../constants");
|
|
11
11
|
const { filter } = require("./utils/array");
|
|
12
12
|
const { findAttr, isTag } = require("./utils/node");
|
|
13
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
13
14
|
|
|
14
15
|
const MESSAGE_IDS = {
|
|
15
16
|
MISSING: "missing",
|
|
@@ -42,9 +43,11 @@ module.exports = {
|
|
|
42
43
|
type: "code",
|
|
43
44
|
|
|
44
45
|
docs: {
|
|
45
|
-
description:
|
|
46
|
+
description:
|
|
47
|
+
"Enforce to use specified meta tags for open graph protocol.",
|
|
46
48
|
category: RULE_CATEGORY.SEO,
|
|
47
49
|
recommended: false,
|
|
50
|
+
url: getRuleUrl("require-open-graph-protocol"),
|
|
48
51
|
},
|
|
49
52
|
|
|
50
53
|
fixable: null,
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
const { RULE_CATEGORY } = require("../constants");
|
|
9
9
|
const { find } = require("./utils/array");
|
|
10
10
|
const { isText, isTag } = require("./utils/node");
|
|
11
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
11
12
|
|
|
12
13
|
const MESSAGE_IDS = {
|
|
13
14
|
MISSING_TITLE: "missing",
|
|
@@ -41,6 +42,7 @@ module.exports = {
|
|
|
41
42
|
description: "Require `<title><title/>` in the `<head><head/>`",
|
|
42
43
|
category: RULE_CATEGORY.SEO,
|
|
43
44
|
recommended: true,
|
|
45
|
+
url: getRuleUrl("require-title"),
|
|
44
46
|
},
|
|
45
47
|
|
|
46
48
|
fixable: null,
|
package/lib/rules/sort-attrs.js
CHANGED
|
@@ -12,6 +12,7 @@ const { hasTemplate } = require("./utils/node");
|
|
|
12
12
|
const { RULE_CATEGORY } = require("../constants");
|
|
13
13
|
const { getSourceCode } = require("./utils/source-code");
|
|
14
14
|
const { createVisitors } = require("./utils/visitors");
|
|
15
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
15
16
|
|
|
16
17
|
const MESSAGE_IDS = {
|
|
17
18
|
UNSORTED: "unsorted",
|
|
@@ -28,6 +29,7 @@ module.exports = {
|
|
|
28
29
|
description: "Enforce attributes alphabetical sorting",
|
|
29
30
|
category: RULE_CATEGORY.STYLE,
|
|
30
31
|
recommended: false,
|
|
32
|
+
url: getRuleUrl("sort-attrs"),
|
|
31
33
|
},
|
|
32
34
|
fixable: "code",
|
|
33
35
|
schema: [
|
|
@@ -16,6 +16,7 @@ const {
|
|
|
16
16
|
BASELINE_LOW,
|
|
17
17
|
} = require("./utils/baseline");
|
|
18
18
|
const { createVisitors } = require("./utils/visitors");
|
|
19
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
19
20
|
|
|
20
21
|
const MESSAGE_IDS = {
|
|
21
22
|
NOT_BASELINE_ELEMENT: "notBaselineElement",
|
|
@@ -33,6 +34,7 @@ module.exports = {
|
|
|
33
34
|
description: "Enforce the use of baseline features.",
|
|
34
35
|
recommended: true,
|
|
35
36
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
37
|
+
url: getRuleUrl("use-baseline"),
|
|
36
38
|
},
|
|
37
39
|
fixable: null,
|
|
38
40
|
schema: [
|
package/lib/rules/utils/node.js
CHANGED
|
@@ -16,11 +16,10 @@
|
|
|
16
16
|
* @typedef { import("@html-eslint/types").CloseTemplate } CloseTemplate
|
|
17
17
|
* @typedef { import("eslint").AST.Range } Range
|
|
18
18
|
* @typedef { import("eslint").AST.SourceLocation } SourceLocation
|
|
19
|
-
* @typedef { import("
|
|
19
|
+
* @typedef { import("@html-eslint/types").AnyToken } AnyToken
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
22
|
const { NODE_TYPES } = require("@html-eslint/parser");
|
|
23
|
-
const { NodeTypes, TokenTypes } = require("es-html-parser");
|
|
24
23
|
|
|
25
24
|
/**
|
|
26
25
|
* @param {Tag | ScriptTag | StyleTag} node
|
|
@@ -68,7 +67,7 @@ function isRangesOverlap(rangeA, rangeB) {
|
|
|
68
67
|
*/
|
|
69
68
|
function isOverlapWithTemplates(parts, range) {
|
|
70
69
|
return parts
|
|
71
|
-
.filter((part) => part.type !==
|
|
70
|
+
.filter((part) => part.type !== NODE_TYPES.Part)
|
|
72
71
|
.some((part) => isRangesOverlap(part.range, range));
|
|
73
72
|
}
|
|
74
73
|
|
|
@@ -77,7 +76,7 @@ function isOverlapWithTemplates(parts, range) {
|
|
|
77
76
|
* @returns {boolean}
|
|
78
77
|
*/
|
|
79
78
|
function hasTemplate(node) {
|
|
80
|
-
return node.parts.some((part) => part.type !==
|
|
79
|
+
return node.parts.some((part) => part.type !== NODE_TYPES.Part);
|
|
81
80
|
}
|
|
82
81
|
|
|
83
82
|
/**
|
|
@@ -101,7 +100,7 @@ function splitToLineNodes(node) {
|
|
|
101
100
|
function hasTemplate(range) {
|
|
102
101
|
return parts.some(
|
|
103
102
|
(part) =>
|
|
104
|
-
part.type !==
|
|
103
|
+
part.type !== NODE_TYPES.Part && isRangesOverlap(part.range, range)
|
|
105
104
|
);
|
|
106
105
|
}
|
|
107
106
|
|
|
@@ -248,7 +247,7 @@ function getTemplateTokens(tokens) {
|
|
|
248
247
|
.map((token) => token["parts"] || [])
|
|
249
248
|
)
|
|
250
249
|
// @ts-ignore
|
|
251
|
-
.filter((token) => token.type !==
|
|
250
|
+
.filter((token) => token.type !== NODE_TYPES.Part)
|
|
252
251
|
);
|
|
253
252
|
}
|
|
254
253
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@html-eslint/eslint-plugin",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
3
|
+
"version": "0.41.0-alpha.0",
|
|
4
|
+
"type": "commonjs",
|
|
5
|
+
"description": "ESLint plugin for HTML",
|
|
5
6
|
"author": "yeonjuan",
|
|
6
7
|
"homepage": "https://github.com/yeonjuan/html-eslint#readme",
|
|
7
8
|
"license": "MIT",
|
|
@@ -23,7 +24,7 @@
|
|
|
23
24
|
"test:legacy": "TEST_ESLINT_LEGACY_CONFIG=true && jest",
|
|
24
25
|
"ts": "tsc --noEmit",
|
|
25
26
|
"lint": "eslint .",
|
|
26
|
-
"build": "rimraf types && tsc
|
|
27
|
+
"build": "rimraf types && tsc --project tsconfig.build.json"
|
|
27
28
|
},
|
|
28
29
|
"bugs": {
|
|
29
30
|
"url": "https://github.com/yeonjuan/html-eslint/issues"
|
|
@@ -38,20 +39,25 @@
|
|
|
38
39
|
"accessibility"
|
|
39
40
|
],
|
|
40
41
|
"dependencies": {
|
|
41
|
-
"@eslint/plugin-kit": "0.
|
|
42
|
-
"@html-eslint/parser": "^0.
|
|
43
|
-
"@html-eslint/template-parser": "^0.
|
|
44
|
-
"@html-eslint/template-syntax-parser": "^0.
|
|
42
|
+
"@eslint/plugin-kit": "^0.3.1",
|
|
43
|
+
"@html-eslint/parser": "^0.41.0-alpha.0",
|
|
44
|
+
"@html-eslint/template-parser": "^0.41.0-alpha.0",
|
|
45
|
+
"@html-eslint/template-syntax-parser": "^0.41.0-alpha.0"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"eslint": "^8.0.0 || ^9.0.0"
|
|
45
49
|
},
|
|
46
50
|
"devDependencies": {
|
|
47
|
-
"@eslint/core": "0.
|
|
48
|
-
"@html-eslint/types": "^0.
|
|
49
|
-
"@types/eslint": "^9.6.1",
|
|
51
|
+
"@eslint/core": "^0.14.0",
|
|
52
|
+
"@html-eslint/types": "^0.41.0-alpha.0",
|
|
50
53
|
"@types/estree": "^0.0.47",
|
|
51
54
|
"es-html-parser": "0.2.0",
|
|
52
|
-
"eslint": "^9.
|
|
55
|
+
"eslint": "^9.27.0",
|
|
53
56
|
"espree": "^10.3.0",
|
|
54
|
-
"typescript": "^5.
|
|
57
|
+
"typescript": "^5.8.3"
|
|
58
|
+
},
|
|
59
|
+
"engines": {
|
|
60
|
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
|
55
61
|
},
|
|
56
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "a1d2d99f91d5adc86184ea15151b5c04bd53ea8d"
|
|
57
63
|
}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
export let rules: {
|
|
2
|
-
"@html-eslint/require-lang":
|
|
3
|
-
"@html-eslint/require-img-alt":
|
|
4
|
-
"@html-eslint/require-doctype":
|
|
5
|
-
"@html-eslint/require-title":
|
|
6
|
-
"@html-eslint/no-multiple-h1":
|
|
7
|
-
"@html-eslint/no-extra-spacing-attrs":
|
|
8
|
-
"@html-eslint/attrs-newline":
|
|
9
|
-
"@html-eslint/element-newline":
|
|
2
|
+
"@html-eslint/require-lang": "error";
|
|
3
|
+
"@html-eslint/require-img-alt": "error";
|
|
4
|
+
"@html-eslint/require-doctype": "error";
|
|
5
|
+
"@html-eslint/require-title": "error";
|
|
6
|
+
"@html-eslint/no-multiple-h1": "error";
|
|
7
|
+
"@html-eslint/no-extra-spacing-attrs": "error";
|
|
8
|
+
"@html-eslint/attrs-newline": "error";
|
|
9
|
+
"@html-eslint/element-newline": ["error", {
|
|
10
10
|
inline: string[];
|
|
11
|
-
}
|
|
12
|
-
"@html-eslint/no-duplicate-id":
|
|
13
|
-
"@html-eslint/indent":
|
|
14
|
-
"@html-eslint/require-li-container":
|
|
15
|
-
"@html-eslint/quotes":
|
|
16
|
-
"@html-eslint/no-obsolete-tags":
|
|
17
|
-
"@html-eslint/require-closing-tags":
|
|
18
|
-
"@html-eslint/no-duplicate-attrs":
|
|
19
|
-
"@html-eslint/use-baseline":
|
|
11
|
+
}];
|
|
12
|
+
"@html-eslint/no-duplicate-id": "error";
|
|
13
|
+
"@html-eslint/indent": "error";
|
|
14
|
+
"@html-eslint/require-li-container": "error";
|
|
15
|
+
"@html-eslint/quotes": "error";
|
|
16
|
+
"@html-eslint/no-obsolete-tags": "error";
|
|
17
|
+
"@html-eslint/require-closing-tags": "error";
|
|
18
|
+
"@html-eslint/no-duplicate-attrs": "error";
|
|
19
|
+
"@html-eslint/use-baseline": "error";
|
|
20
20
|
};
|
|
21
21
|
//# sourceMappingURL=recommended.d.ts.map
|
package/types/exports.d.ts
CHANGED
package/types/exports.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../lib/exports.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,GAAG,QAAQ,SAAS,CAAC,CAAC;AACnC,
|
|
1
|
+
{"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../lib/exports.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,GAAG,QAAQ,SAAS,CAAC,CAAC;AACnC,SAAS,MAAM,CAAC"}
|