@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
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
/** @satisfies {import('eslint').Linter.FlatConfig} */
|
|
2
|
+
const recommended = {
|
|
2
3
|
rules: {
|
|
3
4
|
"@html-eslint/require-lang": "error",
|
|
4
5
|
"@html-eslint/require-img-alt": "error",
|
|
@@ -23,3 +24,5 @@ module.exports = {
|
|
|
23
24
|
"@html-eslint/use-baseline": "error",
|
|
24
25
|
},
|
|
25
26
|
};
|
|
27
|
+
|
|
28
|
+
module.exports = recommended;
|
package/lib/exports.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import plugin = require("./index");
|
|
2
|
-
export
|
|
2
|
+
export = plugin;
|
package/lib/index.js
CHANGED
|
@@ -3,25 +3,35 @@ const recommended = require("./configs/recommended");
|
|
|
3
3
|
const parser = require("@html-eslint/parser");
|
|
4
4
|
const { HTMLLanguage } = require("./languages/html-language");
|
|
5
5
|
const { name, version } = require("../package.json");
|
|
6
|
+
|
|
6
7
|
/**
|
|
7
|
-
* @
|
|
8
|
-
* @typedef {import("./configs/recommended")} RecommendedConfig
|
|
9
|
-
* @typedef {{name: string, version: string}} PluginMeta
|
|
10
|
-
* @typedef {{recommended: RecommendedConfig, "flat/recommended": import("eslint").Linter.FlatConfig }} HtmlESLintConfigs
|
|
11
|
-
* @typedef {{html: HTMLLanguage}} Languages
|
|
8
|
+
* @import { ESLint } from "eslint";
|
|
12
9
|
*/
|
|
13
10
|
|
|
14
11
|
/**
|
|
15
|
-
* @
|
|
12
|
+
* @satisfies {ESLint.Plugin}
|
|
16
13
|
*/
|
|
17
14
|
const plugin = {
|
|
18
15
|
meta: {
|
|
19
16
|
name,
|
|
20
17
|
version,
|
|
21
18
|
},
|
|
22
|
-
// @ts-ignore
|
|
23
19
|
configs: {
|
|
24
20
|
recommended,
|
|
21
|
+
|
|
22
|
+
"flat/recommended": {
|
|
23
|
+
plugins: {
|
|
24
|
+
/** @type {ESLint.Plugin} */
|
|
25
|
+
get "@html-eslint"() {
|
|
26
|
+
return plugin;
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
languageOptions: {
|
|
31
|
+
parser,
|
|
32
|
+
},
|
|
33
|
+
rules: recommended.rules,
|
|
34
|
+
},
|
|
25
35
|
},
|
|
26
36
|
languages: {
|
|
27
37
|
html: new HTMLLanguage(),
|
|
@@ -29,17 +39,4 @@ const plugin = {
|
|
|
29
39
|
rules,
|
|
30
40
|
};
|
|
31
41
|
|
|
32
|
-
Object.assign(plugin.configs, {
|
|
33
|
-
"flat/recommended": {
|
|
34
|
-
plugins: {
|
|
35
|
-
"@html-eslint": plugin,
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
languageOptions: {
|
|
39
|
-
parser,
|
|
40
|
-
},
|
|
41
|
-
rules: recommended.rules,
|
|
42
|
-
},
|
|
43
|
-
});
|
|
44
|
-
|
|
45
42
|
module.exports = plugin;
|
|
@@ -2,8 +2,13 @@ const { visitorKeys, parseForESLint } = require("@html-eslint/parser");
|
|
|
2
2
|
const { HTMLSourceCode } = require("./html-source-code");
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* @
|
|
6
|
-
* @
|
|
5
|
+
* @import { Language, ParseResult, File, FileError, OkParseResult } from "@eslint/core";
|
|
6
|
+
* @import { ParserOptions } from "@html-eslint/parser";
|
|
7
|
+
* @import { AST } from "eslint";
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @implements {Language<{ LangOptions: ParserOptions; Code: HTMLSourceCode; RootNode: AST.Program; Node: {}}>}
|
|
7
12
|
*/
|
|
8
13
|
class HTMLLanguage {
|
|
9
14
|
constructor() {
|
|
@@ -31,14 +36,14 @@ class HTMLLanguage {
|
|
|
31
36
|
this.nodeTypeKey = "type";
|
|
32
37
|
|
|
33
38
|
/**
|
|
34
|
-
* The visitor keys for the
|
|
39
|
+
* The visitor keys for the es-html-parser AST.
|
|
35
40
|
* @type {Record<string, string[]>}
|
|
36
41
|
*/
|
|
37
42
|
this.visitorKeys = visitorKeys;
|
|
38
43
|
}
|
|
39
44
|
|
|
40
45
|
/**
|
|
41
|
-
* @param {
|
|
46
|
+
* @param {ParserOptions} languageOptions
|
|
42
47
|
*/
|
|
43
48
|
validateLanguageOptions(languageOptions) {
|
|
44
49
|
if (!languageOptions) {
|
|
@@ -64,8 +69,8 @@ class HTMLLanguage {
|
|
|
64
69
|
/**
|
|
65
70
|
* @param {File} file
|
|
66
71
|
* @param {Object} [context]
|
|
67
|
-
* @param {
|
|
68
|
-
* @returns {
|
|
72
|
+
* @param {ParserOptions} context.languageOptions
|
|
73
|
+
* @returns {ParseResult<AST.Program>}
|
|
69
74
|
*/
|
|
70
75
|
parse(file, context) {
|
|
71
76
|
const code = /** @type {string} */ (file.body);
|
|
@@ -80,14 +85,14 @@ class HTMLLanguage {
|
|
|
80
85
|
} catch (e) {
|
|
81
86
|
return {
|
|
82
87
|
ok: false,
|
|
83
|
-
errors: [e],
|
|
88
|
+
errors: [/** @type {FileError} */ (e)],
|
|
84
89
|
};
|
|
85
90
|
}
|
|
86
91
|
}
|
|
87
92
|
|
|
88
93
|
/**
|
|
89
94
|
* @param {File} file
|
|
90
|
-
* @param {
|
|
95
|
+
* @param {OkParseResult<AST.Program>} parseResult
|
|
91
96
|
*/
|
|
92
97
|
createSourceCode(file, parseResult) {
|
|
93
98
|
return new HTMLSourceCode({
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
const { RULE_CATEGORY } = require("../constants");
|
|
16
16
|
const { createVisitors } = require("./utils/visitors");
|
|
17
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* @type {MessageId}
|
|
@@ -34,6 +35,7 @@ module.exports = {
|
|
|
34
35
|
description: "Enforce newline between attributes",
|
|
35
36
|
category: RULE_CATEGORY.STYLE,
|
|
36
37
|
recommended: true,
|
|
38
|
+
url: getRuleUrl("attrs-newline"),
|
|
37
39
|
},
|
|
38
40
|
|
|
39
41
|
fixable: true,
|
|
@@ -29,6 +29,8 @@ const {
|
|
|
29
29
|
isStyle,
|
|
30
30
|
} = require("./utils/node");
|
|
31
31
|
const { createVisitors } = require("./utils/visitors");
|
|
32
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
33
|
+
|
|
32
34
|
const MESSAGE_IDS = {
|
|
33
35
|
EXPECT_NEW_LINE_AFTER: "expectAfter",
|
|
34
36
|
};
|
|
@@ -84,6 +86,7 @@ module.exports = {
|
|
|
84
86
|
description: "Enforce newline between elements.",
|
|
85
87
|
category: RULE_CATEGORY.STYLE,
|
|
86
88
|
recommended: true,
|
|
89
|
+
url: getRuleUrl("element-newline"),
|
|
87
90
|
},
|
|
88
91
|
|
|
89
92
|
fixable: true,
|
|
@@ -20,6 +20,7 @@ const {
|
|
|
20
20
|
} = require("./utils/naming");
|
|
21
21
|
const { findAttr, isAttributesEmpty, hasTemplate } = require("./utils/node");
|
|
22
22
|
const { createVisitors } = require("./utils/visitors");
|
|
23
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
23
24
|
|
|
24
25
|
const MESSAGE_IDS = {
|
|
25
26
|
WRONG: "wrong",
|
|
@@ -51,6 +52,7 @@ module.exports = {
|
|
|
51
52
|
description: "Enforce consistent naming id attributes",
|
|
52
53
|
category: RULE_CATEGORY.STYLE,
|
|
53
54
|
recommended: false,
|
|
55
|
+
url: getRuleUrl("id-naming-convention"),
|
|
54
56
|
},
|
|
55
57
|
|
|
56
58
|
fixable: null,
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
*/
|
|
36
36
|
|
|
37
37
|
const { parse } = require("@html-eslint/template-parser");
|
|
38
|
-
const {
|
|
38
|
+
const { NODE_TYPES } = require("@html-eslint/parser");
|
|
39
39
|
const { RULE_CATEGORY } = require("../../constants");
|
|
40
40
|
const {
|
|
41
41
|
splitToLineNodes,
|
|
@@ -158,7 +158,7 @@ module.exports = {
|
|
|
158
158
|
return getTagIncreasingLevel(node);
|
|
159
159
|
}
|
|
160
160
|
const type = node.type;
|
|
161
|
-
if (type ===
|
|
161
|
+
if (type === NODE_TYPES.Attribute) {
|
|
162
162
|
const optionIndent = indentLevelOptions[type];
|
|
163
163
|
if (typeof optionIndent === "number") {
|
|
164
164
|
return optionIndent;
|
|
@@ -329,7 +329,7 @@ module.exports = {
|
|
|
329
329
|
indentLevel.indent(node);
|
|
330
330
|
if (hasTemplate(node)) {
|
|
331
331
|
node.parts.forEach((part) => {
|
|
332
|
-
if (part.type !==
|
|
332
|
+
if (part.type !== NODE_TYPES.Part) {
|
|
333
333
|
if (part.open) {
|
|
334
334
|
checkIndent(part.open);
|
|
335
335
|
}
|
|
@@ -362,7 +362,7 @@ module.exports = {
|
|
|
362
362
|
indentLevel.indent(node);
|
|
363
363
|
if (hasTemplate(node)) {
|
|
364
364
|
node.parts.forEach((part) => {
|
|
365
|
-
if (part.type !==
|
|
365
|
+
if (part.type !== NODE_TYPES.Part) {
|
|
366
366
|
if (part.open) {
|
|
367
367
|
checkIndent(part.open);
|
|
368
368
|
}
|
package/lib/rules/index.js
CHANGED
|
@@ -50,7 +50,7 @@ const noDuplicateClass = require("./no-duplicate-class");
|
|
|
50
50
|
// import new rule here ↑
|
|
51
51
|
// DO NOT REMOVE THIS COMMENT
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
const rules = {
|
|
54
54
|
"require-lang": requireLang,
|
|
55
55
|
"require-img-alt": requireImgAlt,
|
|
56
56
|
"require-doctype": requireDoctype,
|
|
@@ -103,3 +103,8 @@ module.exports = {
|
|
|
103
103
|
// export new rule here ↑
|
|
104
104
|
// DO NOT REMOVE THIS COMMENT
|
|
105
105
|
};
|
|
106
|
+
|
|
107
|
+
module.exports =
|
|
108
|
+
/** @type {Record<string, import('@eslint/core').RuleDefinition>} */ (
|
|
109
|
+
/** @type {unknown} */ (rules)
|
|
110
|
+
);
|
package/lib/rules/lowercase.js
CHANGED
|
@@ -10,6 +10,7 @@ const { RULE_CATEGORY } = require("../constants");
|
|
|
10
10
|
const SVG_CAMEL_CASE_ATTRIBUTES = require("../constants/svg-camel-case-attributes");
|
|
11
11
|
const { createVisitors } = require("./utils/visitors");
|
|
12
12
|
const { hasTemplate } = require("./utils/node");
|
|
13
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
13
14
|
|
|
14
15
|
const MESSAGE_IDS = {
|
|
15
16
|
UNEXPECTED: "unexpected",
|
|
@@ -26,6 +27,7 @@ module.exports = {
|
|
|
26
27
|
description: "Enforce to use lowercase for tag and attribute names.",
|
|
27
28
|
category: RULE_CATEGORY.STYLE,
|
|
28
29
|
recommended: false,
|
|
30
|
+
url: getRuleUrl("lowercase"),
|
|
29
31
|
},
|
|
30
32
|
|
|
31
33
|
fixable: "code",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
const { RULE_CATEGORY } = require("../constants");
|
|
12
12
|
const { createVisitors } = require("./utils/visitors");
|
|
13
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
13
14
|
|
|
14
15
|
const MESSAGE_IDS = {
|
|
15
16
|
MAX_DEPTH_EXCEEDED: "maxDepthExceeded",
|
|
@@ -26,6 +27,7 @@ module.exports = {
|
|
|
26
27
|
description: "Enforce element maximum depth",
|
|
27
28
|
category: RULE_CATEGORY.STYLE,
|
|
28
29
|
recommended: false,
|
|
30
|
+
url: getRuleUrl("max-element-depth"),
|
|
29
31
|
},
|
|
30
32
|
|
|
31
33
|
fixable: null,
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
const { RULE_CATEGORY } = require("../constants");
|
|
9
9
|
const { findAttr } = require("./utils/node");
|
|
10
10
|
const { createVisitors } = require("./utils/visitors");
|
|
11
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
11
12
|
|
|
12
13
|
const MESSAGE_IDS = {
|
|
13
14
|
UNEXPECTED: "unexpected",
|
|
@@ -39,6 +40,7 @@ module.exports = {
|
|
|
39
40
|
description: "Disallow to use of abstract roles",
|
|
40
41
|
category: RULE_CATEGORY.ACCESSIBILITY,
|
|
41
42
|
recommended: false,
|
|
43
|
+
url: getRuleUrl("no-abstract-roles"),
|
|
42
44
|
},
|
|
43
45
|
|
|
44
46
|
fixable: null,
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
const { RULE_CATEGORY } = require("../constants");
|
|
9
9
|
const { findAttr } = require("./utils/node");
|
|
10
10
|
const { createVisitors } = require("./utils/visitors");
|
|
11
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
11
12
|
|
|
12
13
|
const MESSAGE_IDS = {
|
|
13
14
|
UNEXPECTED: "unexpected",
|
|
@@ -24,6 +25,7 @@ module.exports = {
|
|
|
24
25
|
description: "Disallow to use of accesskey attribute",
|
|
25
26
|
category: RULE_CATEGORY.ACCESSIBILITY,
|
|
26
27
|
recommended: false,
|
|
28
|
+
url: getRuleUrl("no-accesskey-attrs"),
|
|
27
29
|
},
|
|
28
30
|
|
|
29
31
|
fixable: null,
|
|
@@ -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
|
UNEXPECTED: "unexpected",
|
|
@@ -22,6 +23,7 @@ module.exports = {
|
|
|
22
23
|
"Disallow to use aria-hidden attributes on the `body` element.",
|
|
23
24
|
category: RULE_CATEGORY.ACCESSIBILITY,
|
|
24
25
|
recommended: false,
|
|
26
|
+
url: getRuleUrl("no-aria-hidden-body"),
|
|
25
27
|
},
|
|
26
28
|
|
|
27
29
|
fixable: null,
|
|
@@ -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
|
DUPLICATE_ATTRS: "duplicateAttrs",
|
|
@@ -26,6 +27,7 @@ module.exports = {
|
|
|
26
27
|
description: "Disallow to use duplicate attributes",
|
|
27
28
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
28
29
|
recommended: true,
|
|
30
|
+
url: getRuleUrl("no-duplicate-attrs"),
|
|
29
31
|
},
|
|
30
32
|
|
|
31
33
|
fixable: null,
|
|
@@ -10,9 +10,10 @@
|
|
|
10
10
|
* @property {import("@html-eslint/types").AnyNode['range']} range
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
const {
|
|
13
|
+
const { NODE_TYPES } = require("@html-eslint/parser");
|
|
14
14
|
const { RULE_CATEGORY } = require("../constants");
|
|
15
15
|
const { createVisitors } = require("./utils/visitors");
|
|
16
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
16
17
|
|
|
17
18
|
const MESSAGE_IDS = {
|
|
18
19
|
DUPLICATE_CLASS: "duplicateClass",
|
|
@@ -28,6 +29,7 @@ module.exports = {
|
|
|
28
29
|
description: "Disallow to use duplicate class",
|
|
29
30
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
30
31
|
recommended: false,
|
|
32
|
+
url: getRuleUrl("no-duplicate-class"),
|
|
31
33
|
},
|
|
32
34
|
fixable: "code",
|
|
33
35
|
schema: [],
|
|
@@ -71,7 +73,7 @@ module.exports = {
|
|
|
71
73
|
if (
|
|
72
74
|
!attributeValue ||
|
|
73
75
|
!attributeValue.value ||
|
|
74
|
-
attributeValue.parts.some((part) => part.type ===
|
|
76
|
+
attributeValue.parts.some((part) => part.type === NODE_TYPES.Template)
|
|
75
77
|
) {
|
|
76
78
|
return;
|
|
77
79
|
}
|
|
@@ -14,6 +14,7 @@ const {
|
|
|
14
14
|
shouldCheckTemplateLiteral,
|
|
15
15
|
} = require("./utils/settings");
|
|
16
16
|
const { getSourceCode } = require("./utils/source-code");
|
|
17
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
17
18
|
|
|
18
19
|
const MESSAGE_IDS = {
|
|
19
20
|
DUPLICATE_ID: "duplicateId",
|
|
@@ -30,6 +31,7 @@ module.exports = {
|
|
|
30
31
|
description: "Disallow to use duplicate id",
|
|
31
32
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
32
33
|
recommended: true,
|
|
34
|
+
url: getRuleUrl("no-duplicate-id"),
|
|
33
35
|
},
|
|
34
36
|
|
|
35
37
|
fixable: null,
|
|
@@ -23,6 +23,7 @@ const { RULE_CATEGORY } = require("../constants");
|
|
|
23
23
|
const { getLocBetween } = require("./utils/node");
|
|
24
24
|
const { getSourceCode } = require("./utils/source-code");
|
|
25
25
|
const { createVisitors } = require("./utils/visitors");
|
|
26
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
26
27
|
|
|
27
28
|
const MESSAGE_IDS = {
|
|
28
29
|
EXTRA_BETWEEN: "unexpectedBetween",
|
|
@@ -49,6 +50,7 @@ module.exports = {
|
|
|
49
50
|
description: "Disallow an extra spacing around attributes",
|
|
50
51
|
category: RULE_CATEGORY.STYLE,
|
|
51
52
|
recommended: true,
|
|
53
|
+
url: getRuleUrl("no-extra-spacing-attrs"),
|
|
52
54
|
},
|
|
53
55
|
|
|
54
56
|
fixable: true,
|
|
@@ -15,6 +15,7 @@ const { RULE_CATEGORY } = require("../constants");
|
|
|
15
15
|
const { isTag, isOverlapWithTemplates } = require("./utils/node");
|
|
16
16
|
const { getSourceCode } = require("./utils/source-code");
|
|
17
17
|
const { createVisitors } = require("./utils/visitors");
|
|
18
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
18
19
|
|
|
19
20
|
const MESSAGE_IDS = {
|
|
20
21
|
UNEXPECTED: "unexpected",
|
|
@@ -31,6 +32,7 @@ module.exports = {
|
|
|
31
32
|
description: "Disallow unnecessary consecutive spaces",
|
|
32
33
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
33
34
|
recommended: false,
|
|
35
|
+
url: getRuleUrl("no-extra-spacing-text"),
|
|
34
36
|
},
|
|
35
37
|
|
|
36
38
|
fixable: true,
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
const { RULE_CATEGORY } = require("../constants");
|
|
6
6
|
const { findParent, isTag } = require("./utils/node");
|
|
7
7
|
const { createVisitors } = require("./utils/visitors");
|
|
8
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
9
|
+
|
|
8
10
|
const MESSAGE_IDS = {
|
|
9
11
|
UNEXPECTED: "unexpected",
|
|
10
12
|
};
|
|
@@ -22,6 +24,7 @@ module.exports = {
|
|
|
22
24
|
description: "Disallows the use of heading elements inside <button>.",
|
|
23
25
|
category: RULE_CATEGORY.ACCESSIBILITY,
|
|
24
26
|
recommended: false,
|
|
27
|
+
url: getRuleUrl("no-heading-inside-button"),
|
|
25
28
|
},
|
|
26
29
|
|
|
27
30
|
fixable: null,
|
|
@@ -5,6 +5,8 @@
|
|
|
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");
|
|
9
|
+
|
|
8
10
|
const MESSAGE_IDS = {
|
|
9
11
|
INLINE_STYLE: "unexpectedInlineStyle",
|
|
10
12
|
};
|
|
@@ -20,6 +22,7 @@ module.exports = {
|
|
|
20
22
|
description: "Disallow using inline style",
|
|
21
23
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
22
24
|
recommended: false,
|
|
25
|
+
url: getRuleUrl("no-inline-styles"),
|
|
23
26
|
},
|
|
24
27
|
|
|
25
28
|
fixable: null,
|
|
@@ -2,10 +2,12 @@
|
|
|
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");
|
|
10
|
+
|
|
9
11
|
const MESSAGE_IDS = {
|
|
10
12
|
INVALID: "invalid",
|
|
11
13
|
INVALID_PRESENTATION: "invalidPresentation",
|
|
@@ -235,6 +237,7 @@ module.exports = {
|
|
|
235
237
|
description: "Disallows use of invalid role.",
|
|
236
238
|
category: RULE_CATEGORY.ACCESSIBILITY,
|
|
237
239
|
recommended: false,
|
|
240
|
+
url: getRuleUrl("no-invalid-role"),
|
|
238
241
|
},
|
|
239
242
|
|
|
240
243
|
fixable: null,
|
|
@@ -259,7 +262,7 @@ module.exports = {
|
|
|
259
262
|
*/
|
|
260
263
|
if (
|
|
261
264
|
role.value &&
|
|
262
|
-
role.value.parts.some((part) => part.type ===
|
|
265
|
+
role.value.parts.some((part) => part.type === NODE_TYPES.Template)
|
|
263
266
|
) {
|
|
264
267
|
return;
|
|
265
268
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @typedef { import("
|
|
2
|
+
* @typedef { import("@html-eslint/types").AnyToken } AnyToken
|
|
3
3
|
* @typedef { import("@html-eslint/types").Document } Document
|
|
4
4
|
* @typedef { import("@html-eslint/types").CommentContent } CommentContent
|
|
5
5
|
* @typedef { import("@html-eslint/types").Text } Text
|
|
@@ -21,6 +21,7 @@ const {
|
|
|
21
21
|
isRangesOverlap,
|
|
22
22
|
getTemplateTokens,
|
|
23
23
|
} = require("./utils/node");
|
|
24
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
24
25
|
|
|
25
26
|
const MESSAGE_IDS = {
|
|
26
27
|
UNEXPECTED: "unexpected",
|
|
@@ -37,6 +38,7 @@ module.exports = {
|
|
|
37
38
|
description: "Disallow multiple empty lines",
|
|
38
39
|
category: RULE_CATEGORY.STYLE,
|
|
39
40
|
recommended: false,
|
|
41
|
+
url: getRuleUrl("no-multiple-empty-lines"),
|
|
40
42
|
},
|
|
41
43
|
|
|
42
44
|
fixable: "whitespace",
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const { RULE_CATEGORY } = require("../constants");
|
|
7
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
7
8
|
|
|
8
9
|
const MESSAGE_IDS = {
|
|
9
10
|
MULTIPLE_H1: "unexpectedMultiH1",
|
|
@@ -20,6 +21,7 @@ module.exports = {
|
|
|
20
21
|
description: "Disallow multiple `<h1></h1>`.",
|
|
21
22
|
category: RULE_CATEGORY.SEO,
|
|
22
23
|
recommended: true,
|
|
24
|
+
url: getRuleUrl("no-multiple-h1"),
|
|
23
25
|
},
|
|
24
26
|
|
|
25
27
|
fixable: null,
|
|
@@ -6,6 +6,7 @@
|
|
|
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
|
UNEXPECTED: "unexpected",
|
|
@@ -65,6 +66,7 @@ module.exports = {
|
|
|
65
66
|
description: "Disallows nested interactive elements",
|
|
66
67
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
67
68
|
recommended: false,
|
|
69
|
+
url: getRuleUrl("no-nested-interactive"),
|
|
68
70
|
},
|
|
69
71
|
|
|
70
72
|
fixable: null,
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
const { RULE_CATEGORY } = require("../constants");
|
|
6
6
|
const { findAttr } = require("./utils/node");
|
|
7
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
7
8
|
|
|
8
9
|
const MESSAGE_IDS = {
|
|
9
10
|
UNEXPECTED: "unexpected",
|
|
@@ -21,6 +22,7 @@ module.exports = {
|
|
|
21
22
|
'Disallow use of `user-scalable=no` in `<meta name="viewport">`.',
|
|
22
23
|
category: RULE_CATEGORY.ACCESSIBILITY,
|
|
23
24
|
recommended: false,
|
|
25
|
+
url: getRuleUrl("no-non-scalable-viewport"),
|
|
24
26
|
},
|
|
25
27
|
|
|
26
28
|
fixable: null,
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
const { RULE_CATEGORY, OBSOLETE_TAGS } = require("../constants");
|
|
6
6
|
const { createVisitors } = require("./utils/visitors");
|
|
7
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
7
8
|
|
|
8
9
|
const OBSOLETE_TAGS_SET = new Set(OBSOLETE_TAGS);
|
|
9
10
|
|
|
@@ -22,6 +23,7 @@ module.exports = {
|
|
|
22
23
|
description: "Disallow to use obsolete elements in HTML5",
|
|
23
24
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
24
25
|
recommended: true,
|
|
26
|
+
url: getRuleUrl("no-obsolete-tags"),
|
|
25
27
|
},
|
|
26
28
|
|
|
27
29
|
fixable: null,
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
const { RULE_CATEGORY } = require("../constants");
|
|
9
9
|
const { findAttr } = require("./utils/node");
|
|
10
10
|
const { createVisitors } = require("./utils/visitors");
|
|
11
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
11
12
|
|
|
12
13
|
const MESSAGE_IDS = {
|
|
13
14
|
UNEXPECTED: "unexpected",
|
|
@@ -24,6 +25,7 @@ module.exports = {
|
|
|
24
25
|
description: "Disallow use of positive `tabindex`.",
|
|
25
26
|
category: RULE_CATEGORY.ACCESSIBILITY,
|
|
26
27
|
recommended: false,
|
|
28
|
+
url: getRuleUrl("no-positive-tabindex"),
|
|
27
29
|
},
|
|
28
30
|
|
|
29
31
|
fixable: null,
|
|
@@ -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
|
RESTRICTED: "restricted",
|
|
@@ -25,6 +26,7 @@ module.exports = {
|
|
|
25
26
|
description: "Disallow specified attributes",
|
|
26
27
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
27
28
|
recommended: false,
|
|
29
|
+
url: getRuleUrl("no-restricted-attr-values"),
|
|
28
30
|
},
|
|
29
31
|
|
|
30
32
|
fixable: null,
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
const { NODE_TYPES } = require("@html-eslint/parser");
|
|
12
12
|
const { RULE_CATEGORY } = require("../constants");
|
|
13
13
|
const { createVisitors } = require("./utils/visitors");
|
|
14
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
14
15
|
|
|
15
16
|
const MESSAGE_IDS = {
|
|
16
17
|
RESTRICTED: "restricted",
|
|
@@ -27,6 +28,7 @@ module.exports = {
|
|
|
27
28
|
description: "Disallow specified attributes",
|
|
28
29
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
29
30
|
recommended: false,
|
|
31
|
+
url: getRuleUrl("no-restricted-attrs"),
|
|
30
32
|
},
|
|
31
33
|
|
|
32
34
|
fixable: null,
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
const { RULE_CATEGORY } = require("../constants");
|
|
9
9
|
const { findAttr } = require("./utils/node");
|
|
10
10
|
const { createVisitors } = require("./utils/visitors");
|
|
11
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
11
12
|
|
|
12
13
|
const MESSAGE_IDS = {
|
|
13
14
|
UNNECESSARY: "unnecessary",
|
|
@@ -25,6 +26,7 @@ module.exports = {
|
|
|
25
26
|
"Enforce to omit type attributes for style sheets and scripts",
|
|
26
27
|
category: RULE_CATEGORY.BEST_PRACTICE,
|
|
27
28
|
recommended: false,
|
|
29
|
+
url: getRuleUrl("no-script-style-type"),
|
|
28
30
|
},
|
|
29
31
|
|
|
30
32
|
fixable: "code",
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const { RULE_CATEGORY } = require("../constants");
|
|
7
|
+
const { getRuleUrl } = require("./utils/rule");
|
|
7
8
|
|
|
8
9
|
const MESSAGE_IDS = {
|
|
9
10
|
UNEXPECTED: "unexpected",
|
|
@@ -20,6 +21,7 @@ module.exports = {
|
|
|
20
21
|
description: "Disallow skipping heading levels",
|
|
21
22
|
category: RULE_CATEGORY.ACCESSIBILITY,
|
|
22
23
|
recommended: false,
|
|
24
|
+
url: getRuleUrl("no-skip-heading-levels"),
|
|
23
25
|
},
|
|
24
26
|
|
|
25
27
|
fixable: null,
|