@html-eslint/eslint-plugin 0.35.0 → 0.35.2
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/exports.ts +2 -0
- package/lib/index.js +6 -1
- package/lib/rules/attrs-newline.js +11 -7
- package/lib/rules/element-newline.js +25 -18
- package/lib/rules/id-naming-convention.js +10 -4
- package/lib/rules/indent/indent-level.js +1 -1
- package/lib/rules/indent/indent.js +26 -15
- package/lib/rules/lowercase.js +4 -4
- package/lib/rules/max-element-depth.js +8 -5
- package/lib/rules/no-abstract-roles.js +4 -4
- package/lib/rules/no-accesskey-attrs.js +4 -4
- package/lib/rules/no-aria-hidden-body.js +1 -1
- package/lib/rules/no-duplicate-attrs.js +4 -4
- package/lib/rules/no-duplicate-id.js +5 -5
- package/lib/rules/no-extra-spacing-attrs.js +18 -12
- package/lib/rules/no-extra-spacing-text.js +8 -5
- package/lib/rules/no-heading-inside-button.js +1 -1
- package/lib/rules/no-inline-styles.js +1 -1
- package/lib/rules/no-invalid-role.js +1 -1
- package/lib/rules/no-multiple-empty-lines.js +8 -5
- package/lib/rules/no-multiple-h1.js +2 -2
- package/lib/rules/no-nested-interactive.js +2 -2
- package/lib/rules/no-non-scalable-viewport.js +1 -1
- package/lib/rules/no-obsolete-tags.js +1 -1
- package/lib/rules/no-positive-tabindex.js +4 -4
- package/lib/rules/no-restricted-attr-values.js +5 -5
- package/lib/rules/no-restricted-attrs.js +8 -7
- package/lib/rules/no-script-style-type.js +4 -4
- package/lib/rules/no-skip-heading-levels.js +2 -2
- package/lib/rules/no-target-blank.js +1 -1
- package/lib/rules/no-trailing-spaces.js +3 -3
- package/lib/rules/prefer-https.js +5 -5
- package/lib/rules/quotes.js +7 -5
- package/lib/rules/require-attrs.js +7 -5
- package/lib/rules/require-button-type.js +1 -1
- package/lib/rules/require-closing-tags.js +6 -2
- package/lib/rules/require-doctype.js +1 -1
- package/lib/rules/require-explicit-size.js +8 -3
- package/lib/rules/require-form-method.js +1 -1
- package/lib/rules/require-frame-title.js +1 -1
- package/lib/rules/require-img-alt.js +9 -8
- package/lib/rules/require-input-label.js +2 -2
- package/lib/rules/require-lang.js +4 -7
- package/lib/rules/require-li-container.js +1 -1
- package/lib/rules/require-meta-charset.js +3 -3
- package/lib/rules/require-meta-description.js +3 -3
- package/lib/rules/require-meta-viewport.js +3 -3
- package/lib/rules/require-open-graph-protocol.js +6 -3
- package/lib/rules/require-title.js +4 -4
- package/lib/rules/sort-attrs.js +11 -11
- package/lib/rules/utils/node.js +23 -23
- package/lib/rules/utils/settings.js +3 -3
- package/lib/rules/utils/source-code.js +1 -1
- package/lib/rules/utils/visitors.js +1 -1
- package/lib/types/ast.ts +17 -0
- package/lib/types/{rule.d.ts → rule.ts} +41 -10
- package/package.json +12 -19
- package/types/exports.d.ts +3 -0
- package/types/exports.d.ts.map +1 -0
- package/types/index.d.ts +80 -5
- package/types/index.d.ts.map +1 -1
- package/types/rules/attrs-newline.d.ts +7 -3
- package/types/rules/attrs-newline.d.ts.map +1 -1
- package/types/rules/element-newline.d.ts +17 -11
- package/types/rules/element-newline.d.ts.map +1 -1
- package/types/rules/id-naming-convention.d.ts +10 -5
- package/types/rules/id-naming-convention.d.ts.map +1 -1
- package/types/rules/indent/indent-level.d.ts +2 -2
- package/types/rules/indent/indent-level.d.ts.map +1 -1
- package/types/rules/indent/indent.d.ts +15 -9
- package/types/rules/indent/indent.d.ts.map +1 -1
- package/types/rules/index.d.ts +64 -47
- package/types/rules/lowercase.d.ts +5 -5
- package/types/rules/lowercase.d.ts.map +1 -1
- package/types/rules/max-element-depth.d.ts +8 -5
- package/types/rules/max-element-depth.d.ts.map +1 -1
- package/types/rules/no-abstract-roles.d.ts +5 -5
- package/types/rules/no-abstract-roles.d.ts.map +1 -1
- package/types/rules/no-accesskey-attrs.d.ts +5 -5
- package/types/rules/no-accesskey-attrs.d.ts.map +1 -1
- package/types/rules/no-aria-hidden-body.d.ts +1 -1
- package/types/rules/no-aria-hidden-body.d.ts.map +1 -1
- package/types/rules/no-duplicate-attrs.d.ts +5 -5
- package/types/rules/no-duplicate-attrs.d.ts.map +1 -1
- package/types/rules/no-duplicate-id.d.ts +6 -6
- package/types/rules/no-duplicate-id.d.ts.map +1 -1
- package/types/rules/no-extra-spacing-attrs.d.ts +19 -13
- package/types/rules/no-extra-spacing-attrs.d.ts.map +1 -1
- package/types/rules/no-extra-spacing-text.d.ts +9 -6
- package/types/rules/no-extra-spacing-text.d.ts.map +1 -1
- package/types/rules/no-heading-inside-button.d.ts +1 -1
- package/types/rules/no-heading-inside-button.d.ts.map +1 -1
- package/types/rules/no-inline-styles.d.ts +1 -1
- package/types/rules/no-inline-styles.d.ts.map +1 -1
- package/types/rules/no-invalid-role.d.ts +1 -1
- package/types/rules/no-invalid-role.d.ts.map +1 -1
- package/types/rules/no-multiple-empty-lines.d.ts +8 -5
- package/types/rules/no-multiple-empty-lines.d.ts.map +1 -1
- package/types/rules/no-multiple-h1.d.ts +2 -2
- package/types/rules/no-multiple-h1.d.ts.map +1 -1
- package/types/rules/no-nested-interactive.d.ts +2 -2
- package/types/rules/no-nested-interactive.d.ts.map +1 -1
- package/types/rules/no-non-scalable-viewport.d.ts +1 -1
- package/types/rules/no-non-scalable-viewport.d.ts.map +1 -1
- package/types/rules/no-obsolete-tags.d.ts +1 -1
- package/types/rules/no-obsolete-tags.d.ts.map +1 -1
- package/types/rules/no-positive-tabindex.d.ts +4 -4
- package/types/rules/no-positive-tabindex.d.ts.map +1 -1
- package/types/rules/no-restricted-attr-values.d.ts +6 -6
- package/types/rules/no-restricted-attr-values.d.ts.map +1 -1
- package/types/rules/no-restricted-attrs.d.ts +6 -6
- package/types/rules/no-restricted-attrs.d.ts.map +1 -1
- package/types/rules/no-script-style-type.d.ts +4 -4
- package/types/rules/no-script-style-type.d.ts.map +1 -1
- package/types/rules/no-skip-heading-levels.d.ts +2 -2
- package/types/rules/no-skip-heading-levels.d.ts.map +1 -1
- package/types/rules/no-target-blank.d.ts +1 -1
- package/types/rules/no-target-blank.d.ts.map +1 -1
- package/types/rules/no-trailing-spaces.d.ts +3 -3
- package/types/rules/no-trailing-spaces.d.ts.map +1 -1
- package/types/rules/prefer-https.d.ts +5 -5
- package/types/rules/prefer-https.d.ts.map +1 -1
- package/types/rules/quotes.d.ts +7 -6
- package/types/rules/quotes.d.ts.map +1 -1
- package/types/rules/require-attrs.d.ts +6 -6
- package/types/rules/require-attrs.d.ts.map +1 -1
- package/types/rules/require-button-type.d.ts +1 -1
- package/types/rules/require-button-type.d.ts.map +1 -1
- package/types/rules/require-closing-tags.d.ts +7 -3
- package/types/rules/require-closing-tags.d.ts.map +1 -1
- package/types/rules/require-doctype.d.ts +1 -1
- package/types/rules/require-doctype.d.ts.map +1 -1
- package/types/rules/require-explicit-size.d.ts +8 -4
- package/types/rules/require-explicit-size.d.ts.map +1 -1
- package/types/rules/require-form-method.d.ts +1 -1
- package/types/rules/require-form-method.d.ts.map +1 -1
- package/types/rules/require-frame-title.d.ts +1 -1
- package/types/rules/require-frame-title.d.ts.map +1 -1
- package/types/rules/require-img-alt.d.ts +6 -3
- package/types/rules/require-img-alt.d.ts.map +1 -1
- package/types/rules/require-input-label.d.ts +3 -3
- package/types/rules/require-input-label.d.ts.map +1 -1
- package/types/rules/require-lang.d.ts +1 -1
- package/types/rules/require-lang.d.ts.map +1 -1
- package/types/rules/require-li-container.d.ts +1 -1
- package/types/rules/require-li-container.d.ts.map +1 -1
- package/types/rules/require-meta-charset.d.ts +4 -4
- package/types/rules/require-meta-charset.d.ts.map +1 -1
- package/types/rules/require-meta-description.d.ts +4 -4
- package/types/rules/require-meta-description.d.ts.map +1 -1
- package/types/rules/require-meta-viewport.d.ts +4 -4
- package/types/rules/require-meta-viewport.d.ts.map +1 -1
- package/types/rules/require-open-graph-protocol.d.ts +5 -4
- package/types/rules/require-open-graph-protocol.d.ts.map +1 -1
- package/types/rules/require-title.d.ts +5 -5
- package/types/rules/require-title.d.ts.map +1 -1
- package/types/rules/sort-attrs.d.ts +8 -5
- package/types/rules/sort-attrs.d.ts.map +1 -1
- package/types/rules/utils/node.d.ts +28 -28
- package/types/rules/utils/node.d.ts.map +1 -1
- package/types/rules/utils/settings.d.ts +3 -3
- package/types/rules/utils/settings.d.ts.map +1 -1
- package/types/rules/utils/source-code.d.ts +8 -3
- package/types/rules/utils/source-code.d.ts.map +1 -1
- package/types/rules/utils/visitors.d.ts +1 -1
- package/types/rules/utils/visitors.d.ts.map +1 -1
- package/types/types/ast.d.ts +16 -0
- package/types/types/ast.d.ts.map +1 -0
- package/types/types/index.d.ts +4 -0
- package/types/types/index.d.ts.map +1 -0
- package/types/types/rule.d.ts +97 -0
- package/types/types/rule.d.ts.map +1 -0
- package/types/types/settings.d.ts +13 -0
- package/types/types/settings.d.ts.map +1 -0
- package/lib/types/ast.d.ts +0 -213
- package/lib/types/{index.d.ts → index.ts} +1 -1
- /package/lib/types/{settings.d.ts → settings.ts} +0 -0
package/lib/rules/quotes.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @typedef { import("eslint").AST.Range } Range
|
|
3
|
-
* @typedef { import("
|
|
4
|
-
* @typedef { import("
|
|
5
|
-
* @typedef { import("
|
|
6
|
-
* @typedef { import("
|
|
7
|
-
*
|
|
3
|
+
* @typedef { import("@html-eslint/types").Attribute } Attribute
|
|
4
|
+
* @typedef { import("@html-eslint/types").Tag } Tag
|
|
5
|
+
* @typedef { import("@html-eslint/types").ScriptTag } ScriptTag
|
|
6
|
+
* @typedef { import("@html-eslint/types").StyleTag } StyleTag
|
|
7
|
+
*
|
|
8
|
+
* @typedef {"single" | "double"} Option
|
|
9
|
+
* @typedef { import("../types").RuleModule<[Option]> } RuleModule
|
|
8
10
|
*/
|
|
9
11
|
|
|
10
12
|
const { RULE_CATEGORY } = require("../constants");
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @typedef { import("
|
|
3
|
-
* @typedef { import("
|
|
4
|
-
* @typedef { import("
|
|
5
|
-
* @typedef { import("../types").StyleTag } StyleTag
|
|
2
|
+
* @typedef { import("@html-eslint/types").Tag } Tag
|
|
3
|
+
* @typedef { import("@html-eslint/types").ScriptTag } ScriptTag
|
|
4
|
+
* @typedef { import("@html-eslint/types").StyleTag } StyleTag
|
|
6
5
|
*
|
|
7
6
|
* @typedef {Object} Option
|
|
8
7
|
* @property {string} tag
|
|
9
8
|
* @property {string} attr
|
|
10
|
-
* @property {string
|
|
9
|
+
* @property {string} [value]
|
|
10
|
+
*
|
|
11
|
+
* @typedef { import("../types").RuleModule<Option[]> } RuleModule
|
|
12
|
+
*
|
|
11
13
|
*/
|
|
12
14
|
|
|
13
15
|
const { NODE_TYPES } = require("@html-eslint/parser");
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @typedef { import("
|
|
3
|
-
*
|
|
2
|
+
* @typedef { import("@html-eslint/types").Tag } Tag
|
|
3
|
+
*
|
|
4
|
+
* @typedef {Object} Option
|
|
5
|
+
* @property {"always" | "never"} [Option.selfClosing]
|
|
6
|
+
* @property {string[]} [Option.selfClosingCustomPatterns]
|
|
7
|
+
* @typedef { import("../types").RuleModule<[Option]> } RuleModule
|
|
4
8
|
*/
|
|
5
9
|
|
|
6
10
|
const { RULE_CATEGORY, VOID_ELEMENTS } = require("../constants");
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @typedef { import("
|
|
3
|
-
* @typedef { import("
|
|
4
|
-
*
|
|
2
|
+
* @typedef { import("@html-eslint/types").Tag } Tag
|
|
3
|
+
* @typedef { import("@html-eslint/types").AnyNode } AnyNode
|
|
4
|
+
*
|
|
5
|
+
* @typedef {Object} Option
|
|
6
|
+
* @property {string[]} [Option.allowClass]
|
|
7
|
+
* @property {string[]} [Option.allowId]
|
|
8
|
+
* @typedef { import("../types").RuleModule<[Option]> } RuleModule
|
|
9
|
+
*
|
|
5
10
|
*/
|
|
6
11
|
|
|
7
12
|
const { RULE_CATEGORY } = require("../constants");
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @typedef { import("
|
|
3
|
-
*
|
|
2
|
+
* @typedef { import("@html-eslint/types").Tag } Tag
|
|
3
|
+
*
|
|
4
|
+
* @typedef {Object} Option
|
|
5
|
+
* @property {string[]} [Option.substitute]
|
|
6
|
+
*
|
|
7
|
+
* @typedef { import("../types").RuleModule<[Option]> } RuleModule
|
|
4
8
|
*/
|
|
5
9
|
|
|
6
10
|
const { RULE_CATEGORY } = require("../constants");
|
|
@@ -56,12 +60,9 @@ module.exports = {
|
|
|
56
60
|
}
|
|
57
61
|
if (!hasAltAttrAndValue(node, substitute)) {
|
|
58
62
|
context.report({
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
end: node.openEnd.loc.end,
|
|
63
|
-
},
|
|
64
|
-
range: [node.openStart.range[0], node.openEnd.range[1]],
|
|
63
|
+
loc: {
|
|
64
|
+
start: node.openStart.loc.start,
|
|
65
|
+
end: node.openEnd.loc.end,
|
|
65
66
|
},
|
|
66
67
|
messageId: MESSAGE_IDS.MISSING_ALT,
|
|
67
68
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @typedef { import("
|
|
3
|
-
* @typedef { import("../types").
|
|
2
|
+
* @typedef { import("@html-eslint/types").Tag } Tag
|
|
3
|
+
* @typedef { import("../types").RuleModule<[]> } RuleModule
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const { RULE_CATEGORY } = require("../constants");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @typedef { import("../types").RuleModule } RuleModule
|
|
2
|
+
* @typedef { import("../types").RuleModule<[]> } RuleModule
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
const { RULE_CATEGORY } = require("../constants");
|
|
@@ -41,12 +41,9 @@ module.exports = {
|
|
|
41
41
|
const langAttr = findAttr(node, "lang");
|
|
42
42
|
if (!langAttr) {
|
|
43
43
|
context.report({
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
end: node.openEnd.loc.end,
|
|
48
|
-
},
|
|
49
|
-
range: [node.openStart.range[0], node.openEnd.range[1]],
|
|
44
|
+
loc: {
|
|
45
|
+
start: node.openStart.loc.start,
|
|
46
|
+
end: node.openEnd.loc.end,
|
|
50
47
|
},
|
|
51
48
|
messageId: MESSAGE_IDS.MISSING,
|
|
52
49
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @typedef { import("
|
|
3
|
-
* @typedef { import("
|
|
4
|
-
* @typedef { import("../types").
|
|
2
|
+
* @typedef { import("@html-eslint/types").Tag } Tag
|
|
3
|
+
* @typedef { import("@html-eslint/types").AnyNode } AnyNode
|
|
4
|
+
* @typedef { import("../types").RuleModule<[]> } RuleModule
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
const { RULE_CATEGORY } = require("../constants");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @typedef { import("
|
|
3
|
-
* @typedef { import("
|
|
4
|
-
* @typedef { import("../types").
|
|
2
|
+
* @typedef { import("@html-eslint/types").Tag } Tag
|
|
3
|
+
* @typedef { import("@html-eslint/types").AnyNode } AnyNode
|
|
4
|
+
* @typedef { import("../types").RuleModule<[]> } RuleModule
|
|
5
5
|
*/
|
|
6
6
|
const { RULE_CATEGORY } = require("../constants");
|
|
7
7
|
const { filter } = require("./utils/array");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @typedef { import("
|
|
3
|
-
* @typedef { import("
|
|
4
|
-
* @typedef { import("../types").
|
|
2
|
+
* @typedef { import("@html-eslint/types").Tag } Tag
|
|
3
|
+
* @typedef { import("@html-eslint/types").AnyNode } AnyNode
|
|
4
|
+
* @typedef { import("../types").RuleModule<[]> } RuleModule
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
const { RULE_CATEGORY } = require("../constants");
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @typedef { import("
|
|
3
|
-
* @typedef { import("
|
|
4
|
-
*
|
|
2
|
+
* @typedef { import("@html-eslint/types").Tag } Tag
|
|
3
|
+
* @typedef { import("@html-eslint/types").AnyNode } AnyNode
|
|
4
|
+
*
|
|
5
|
+
* @typedef {string[]} Option
|
|
6
|
+
*
|
|
7
|
+
* @typedef { import("../types").RuleModule<[Option]> } RuleModule
|
|
5
8
|
*/
|
|
6
9
|
|
|
7
10
|
const { RULE_CATEGORY } = require("../constants");
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @typedef { import("
|
|
3
|
-
* @typedef { import("
|
|
4
|
-
* @typedef { import("
|
|
5
|
-
* @typedef { import("../types").
|
|
2
|
+
* @typedef { import("@html-eslint/types").Tag } Tag
|
|
3
|
+
* @typedef { import("@html-eslint/types").Text } Text
|
|
4
|
+
* @typedef { import("@html-eslint/types").AnyNode } AnyNode
|
|
5
|
+
* @typedef { import("../types").RuleModule<[]> } RuleModule
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
const { RULE_CATEGORY } = require("../constants");
|
package/lib/rules/sort-attrs.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @typedef { import("
|
|
3
|
-
* @typedef { import("
|
|
4
|
-
* @typedef { import("
|
|
5
|
-
*
|
|
2
|
+
* @typedef { import("../types").RuleFixer } RuleFixer
|
|
3
|
+
* @typedef { import("@html-eslint/types").Attribute } Attribute
|
|
4
|
+
* @typedef { import("@html-eslint/types").Text } Text
|
|
5
|
+
*
|
|
6
|
+
* @typedef {Object} Option
|
|
7
|
+
* @property {string[]} [Option.priority]
|
|
8
|
+
* @typedef { import("../types").RuleModule<[Option]> } RuleModule
|
|
6
9
|
*/
|
|
7
10
|
|
|
8
11
|
const { hasTemplate } = require("./utils/node");
|
|
@@ -53,7 +56,7 @@ module.exports = {
|
|
|
53
56
|
/**
|
|
54
57
|
* @type {string[]}
|
|
55
58
|
*/
|
|
56
|
-
const priority = option.priority;
|
|
59
|
+
const priority = option.priority || [];
|
|
57
60
|
|
|
58
61
|
/**
|
|
59
62
|
* @param {Attribute} attrA
|
|
@@ -165,12 +168,9 @@ module.exports = {
|
|
|
165
168
|
const first = unsorted[0];
|
|
166
169
|
const last = unsorted[unsorted.length - 1];
|
|
167
170
|
context.report({
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
start: first.loc.start,
|
|
172
|
-
end: last.loc.end,
|
|
173
|
-
},
|
|
171
|
+
loc: {
|
|
172
|
+
start: first.loc.start,
|
|
173
|
+
end: last.loc.end,
|
|
174
174
|
},
|
|
175
175
|
messageId: MESSAGE_IDS.UNSORTED,
|
|
176
176
|
fix(fixer) {
|
package/lib/rules/utils/node.js
CHANGED
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @typedef { import("
|
|
3
|
-
* @typedef { import("
|
|
4
|
-
* @typedef { import("
|
|
5
|
-
* @typedef { import("
|
|
2
|
+
* @typedef { import("@html-eslint/types").Attribute } Attribute
|
|
3
|
+
* @typedef { import("@html-eslint/types").Tag } Tag
|
|
4
|
+
* @typedef { import("@html-eslint/types").ScriptTag } ScriptTag
|
|
5
|
+
* @typedef { import("@html-eslint/types").StyleTag } StyleTag
|
|
6
|
+
* @typedef { import("@html-eslint/types").AnyNode } AnyNode
|
|
6
7
|
* @typedef { import("../../types").Line } Line
|
|
7
|
-
* @typedef { import("../../types").
|
|
8
|
-
* @typedef { import("
|
|
9
|
-
* @typedef { import("
|
|
10
|
-
* @typedef { import("
|
|
11
|
-
* @typedef { import("
|
|
12
|
-
* @typedef { import("
|
|
13
|
-
* @typedef { import("
|
|
14
|
-
* @typedef { import("
|
|
15
|
-
* @typedef { import("
|
|
16
|
-
* @typedef { import("../../types").AnyPartNode } AnyPartNode
|
|
8
|
+
* @typedef { import("../../types").BaseNode } BaseNode
|
|
9
|
+
* @typedef { import("@html-eslint/types").Text } Text
|
|
10
|
+
* @typedef { import("@html-eslint/types").CommentContent } CommentContent
|
|
11
|
+
* @typedef { import("@html-eslint/types").Comment } Comment
|
|
12
|
+
* @typedef { import("@html-eslint/types").AttributeValue } AttributeValue
|
|
13
|
+
* @typedef { import("@html-eslint/types").AttributeKey } AttributeKey
|
|
14
|
+
* @typedef { import("@html-eslint/types").TemplateText } TemplateText
|
|
15
|
+
* @typedef { import("@html-eslint/types").OpenTemplate } OpenTemplate
|
|
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
19
|
* @typedef { import("es-html-parser").AnyToken } AnyToken
|
|
20
|
-
|
|
21
20
|
*/
|
|
22
21
|
|
|
23
22
|
const { NODE_TYPES } = require("@html-eslint/parser");
|
|
@@ -156,7 +155,7 @@ function getLocBetween(before, after) {
|
|
|
156
155
|
}
|
|
157
156
|
|
|
158
157
|
/**
|
|
159
|
-
* @param {
|
|
158
|
+
* @param {BaseNode} node
|
|
160
159
|
* @returns {node is Tag}
|
|
161
160
|
*/
|
|
162
161
|
function isTag(node) {
|
|
@@ -164,7 +163,7 @@ function isTag(node) {
|
|
|
164
163
|
}
|
|
165
164
|
|
|
166
165
|
/**
|
|
167
|
-
* @param {
|
|
166
|
+
* @param {BaseNode} node
|
|
168
167
|
* @returns {node is ScriptTag}
|
|
169
168
|
*/
|
|
170
169
|
function isScript(node) {
|
|
@@ -172,7 +171,7 @@ function isScript(node) {
|
|
|
172
171
|
}
|
|
173
172
|
|
|
174
173
|
/**
|
|
175
|
-
* @param {
|
|
174
|
+
* @param {BaseNode} node
|
|
176
175
|
* @returns {node is StyleTag}
|
|
177
176
|
*/
|
|
178
177
|
function isStyle(node) {
|
|
@@ -180,7 +179,7 @@ function isStyle(node) {
|
|
|
180
179
|
}
|
|
181
180
|
|
|
182
181
|
/**
|
|
183
|
-
* @param {
|
|
182
|
+
* @param {BaseNode} node
|
|
184
183
|
* @returns {node is Comment}
|
|
185
184
|
*/
|
|
186
185
|
function isComment(node) {
|
|
@@ -188,7 +187,7 @@ function isComment(node) {
|
|
|
188
187
|
}
|
|
189
188
|
|
|
190
189
|
/**
|
|
191
|
-
* @param {
|
|
190
|
+
* @param {BaseNode} node
|
|
192
191
|
* @returns {node is Text}
|
|
193
192
|
*/
|
|
194
193
|
function isText(node) {
|
|
@@ -196,7 +195,7 @@ function isText(node) {
|
|
|
196
195
|
}
|
|
197
196
|
|
|
198
197
|
/**
|
|
199
|
-
* @param {
|
|
198
|
+
* @param {BaseNode} node
|
|
200
199
|
* @returns {node is Line}
|
|
201
200
|
*/
|
|
202
201
|
function isLine(node) {
|
|
@@ -214,7 +213,7 @@ function codeToLines(source) {
|
|
|
214
213
|
}
|
|
215
214
|
|
|
216
215
|
/**
|
|
217
|
-
* @param {
|
|
216
|
+
* @param {AnyNode} node
|
|
218
217
|
* @param {(node: AnyNode) => boolean} predicate
|
|
219
218
|
* @returns {null | AnyNode}
|
|
220
219
|
*/
|
|
@@ -224,7 +223,8 @@ function findParent(node, predicate) {
|
|
|
224
223
|
}
|
|
225
224
|
if (
|
|
226
225
|
node.type === "TaggedTemplateExpression" ||
|
|
227
|
-
node.type === "TemplateLiteral"
|
|
226
|
+
node.type === "TemplateLiteral" ||
|
|
227
|
+
node.type === "TemplateElement"
|
|
228
228
|
) {
|
|
229
229
|
return null;
|
|
230
230
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @typedef {import("../../types").MaybeHTMLSettings} MaybeHTMLSettings
|
|
3
3
|
* @typedef {import("../../types").HTMLSettings} HTMLSettings
|
|
4
|
-
* @typedef {import("../../types").Context} Context
|
|
5
|
-
* @typedef {import("
|
|
6
|
-
* @typedef {import("
|
|
4
|
+
* @typedef {import("../../types").Context<any[]>} Context
|
|
5
|
+
* @typedef {import("@html-eslint/types").TaggedTemplateExpression} TaggedTemplateExpression
|
|
6
|
+
* @typedef {import("@html-eslint/types").TemplateLiteral} TemplateLiteral
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
const { getSourceCode } = require("../utils/source-code");
|
package/lib/types/ast.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import eslint from "eslint";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This is not a node generated by es-html-parser; it is created by utils's splitToLineNodes.
|
|
5
|
+
*/
|
|
6
|
+
export interface Line extends BaseNode {
|
|
7
|
+
type: "Line";
|
|
8
|
+
value: string;
|
|
9
|
+
hasTemplate: boolean;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface BaseNode {
|
|
13
|
+
parent?: BaseNode | null;
|
|
14
|
+
type: string;
|
|
15
|
+
range: eslint.AST.Range;
|
|
16
|
+
loc: eslint.AST.SourceLocation;
|
|
17
|
+
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import eslint from "eslint";
|
|
2
|
-
import * as AST from "
|
|
2
|
+
import * as AST from "@html-eslint/types";
|
|
3
|
+
import * as estree from "estree";
|
|
4
|
+
import { Line } from "./ast";
|
|
5
|
+
|
|
6
|
+
type AnyNodeAndLine = AST.AnyNode | Line;
|
|
3
7
|
|
|
4
8
|
type PostFix<T, S extends string> = {
|
|
5
9
|
[K in keyof T as `${K & string}${S}`]: T[K];
|
|
@@ -44,12 +48,36 @@ interface BaseRuleListener {
|
|
|
44
48
|
TemplateLiteral?: (node: AST.TemplateLiteral) => void;
|
|
45
49
|
}
|
|
46
50
|
|
|
51
|
+
interface RuleFix {
|
|
52
|
+
range: eslint.AST.Range;
|
|
53
|
+
text: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface RuleFixer {
|
|
57
|
+
insertTextAfter(nodeOrToken: AnyNodeAndLine, text: string): RuleFix;
|
|
58
|
+
|
|
59
|
+
insertTextAfterRange(range: eslint.AST.Range, text: string): RuleFix;
|
|
60
|
+
|
|
61
|
+
insertTextBefore(nodeOrToken: AnyNodeAndLine, text: string): RuleFix;
|
|
62
|
+
|
|
63
|
+
insertTextBeforeRange(range: eslint.AST.Range, text: string): RuleFix;
|
|
64
|
+
|
|
65
|
+
remove(nodeOrToken: AnyNodeAndLine): RuleFix;
|
|
66
|
+
|
|
67
|
+
removeRange(range: eslint.AST.Range): RuleFix;
|
|
68
|
+
|
|
69
|
+
replaceText(nodeOrToken: AnyNodeAndLine, text: string): RuleFix;
|
|
70
|
+
|
|
71
|
+
replaceTextRange(range: eslint.AST.Range, text: string): RuleFix;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
type ReportFixFunction = (
|
|
75
|
+
fixer: RuleFixer
|
|
76
|
+
) => IterableIterator<RuleFix> | readonly RuleFix[] | RuleFix | null;
|
|
77
|
+
|
|
47
78
|
interface ReportDescriptorOptionsBase {
|
|
48
79
|
data?: { [key: string]: string };
|
|
49
|
-
|
|
50
|
-
fix?:
|
|
51
|
-
| null
|
|
52
|
-
| ((fixer: RuleFixer) => null | Fix | IterableIterator<Fix> | Fix[]);
|
|
80
|
+
fix?: null | ReportFixFunction;
|
|
53
81
|
}
|
|
54
82
|
|
|
55
83
|
type SuggestionDescriptorMessage = { desc: string } | { messageId: string };
|
|
@@ -65,19 +93,22 @@ type ReportDescriptor = ReportDescriptorMessage &
|
|
|
65
93
|
ReportDescriptorOptions;
|
|
66
94
|
type ReportDescriptorMessage = { message: string } | { messageId: string };
|
|
67
95
|
type ReportDescriptorLocation = {
|
|
68
|
-
node?: BaseNode;
|
|
69
|
-
loc?:
|
|
96
|
+
node?: estree.BaseNode;
|
|
97
|
+
loc?: eslint.AST.SourceLocation;
|
|
70
98
|
line?: number;
|
|
71
99
|
column?: number;
|
|
72
100
|
};
|
|
73
101
|
|
|
74
|
-
export interface Context extends
|
|
102
|
+
export interface Context<Options extends unknown[]>
|
|
103
|
+
extends Omit<eslint.Rule.RuleContext, "report"> {
|
|
75
104
|
report(descriptor: ReportDescriptor): void;
|
|
105
|
+
options: Options;
|
|
76
106
|
}
|
|
77
107
|
|
|
78
108
|
export type RuleListener = BaseRuleListener &
|
|
79
109
|
PostFix<BaseRuleListener, ":exit">;
|
|
80
110
|
|
|
81
|
-
export interface RuleModule extends
|
|
82
|
-
create(context: Context): RuleListener;
|
|
111
|
+
export interface RuleModule<Options extends unknown[]> {
|
|
112
|
+
create(context: Context<Options>): RuleListener;
|
|
113
|
+
meta: eslint.Rule.RuleMetaData;
|
|
83
114
|
}
|
package/package.json
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@html-eslint/eslint-plugin",
|
|
3
|
-
"version": "0.35.
|
|
3
|
+
"version": "0.35.2",
|
|
4
4
|
"description": "ESLint plugin for html",
|
|
5
5
|
"author": "yeonjuan",
|
|
6
6
|
"homepage": "https://github.com/yeonjuan/html-eslint#readme",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"main": "lib/index.js",
|
|
9
|
-
"types": "types/
|
|
10
|
-
"directories": {
|
|
11
|
-
"lib": "lib",
|
|
12
|
-
"test": "__tests__",
|
|
13
|
-
"types": "types"
|
|
14
|
-
},
|
|
9
|
+
"types": "types/exports.d.ts",
|
|
15
10
|
"files": [
|
|
16
11
|
"lib",
|
|
17
12
|
"types"
|
|
@@ -25,16 +20,13 @@
|
|
|
25
20
|
},
|
|
26
21
|
"scripts": {
|
|
27
22
|
"test": "jest --coverage",
|
|
28
|
-
"ts": "tsc",
|
|
29
|
-
"lint": "eslint",
|
|
30
|
-
"build": "tsc
|
|
23
|
+
"ts": "tsc --noEmit",
|
|
24
|
+
"lint": "eslint .",
|
|
25
|
+
"build": "rimraf types && tsc --project tsconfig.build.json"
|
|
31
26
|
},
|
|
32
27
|
"bugs": {
|
|
33
28
|
"url": "https://github.com/yeonjuan/html-eslint/issues"
|
|
34
29
|
},
|
|
35
|
-
"engines": {
|
|
36
|
-
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
|
37
|
-
},
|
|
38
30
|
"keywords": [
|
|
39
31
|
"eslint",
|
|
40
32
|
"eslintplugin",
|
|
@@ -45,17 +37,18 @@
|
|
|
45
37
|
"accessibility"
|
|
46
38
|
],
|
|
47
39
|
"dependencies": {
|
|
48
|
-
"@html-eslint/template-parser": "^0.35.
|
|
49
|
-
"@html-eslint/template-syntax-parser": "^0.35.
|
|
40
|
+
"@html-eslint/template-parser": "^0.35.2",
|
|
41
|
+
"@html-eslint/template-syntax-parser": "^0.35.2"
|
|
50
42
|
},
|
|
51
43
|
"devDependencies": {
|
|
52
|
-
"@html-eslint/parser": "^0.35.
|
|
44
|
+
"@html-eslint/parser": "^0.35.2",
|
|
45
|
+
"@html-eslint/types": "^0.35.1",
|
|
53
46
|
"@types/eslint": "^9.6.1",
|
|
54
47
|
"@types/estree": "^0.0.47",
|
|
55
|
-
"es-html-parser": "0.1.
|
|
56
|
-
"eslint": "^9",
|
|
48
|
+
"es-html-parser": "0.1.1",
|
|
49
|
+
"eslint": "^9.21.0",
|
|
57
50
|
"espree": "^10.3.0",
|
|
58
51
|
"typescript": "^5.7.2"
|
|
59
52
|
},
|
|
60
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "d367b20d5822e66a88aed100f7a3e67bb9e1b2f0"
|
|
61
54
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../lib/exports.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,GAAG,QAAQ,SAAS,CAAC,CAAC;AACnC,eAAe,MAAM,CAAC"}
|