@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.
Files changed (122) hide show
  1. package/lib/configs/recommended.js +4 -1
  2. package/lib/exports.ts +1 -1
  3. package/lib/index.js +17 -20
  4. package/lib/languages/html-language.js +13 -8
  5. package/lib/rules/attrs-newline.js +2 -0
  6. package/lib/rules/element-newline.js +3 -0
  7. package/lib/rules/id-naming-convention.js +2 -0
  8. package/lib/rules/indent/indent.js +4 -4
  9. package/lib/rules/index.js +6 -1
  10. package/lib/rules/lowercase.js +2 -0
  11. package/lib/rules/max-element-depth.js +2 -0
  12. package/lib/rules/no-abstract-roles.js +2 -0
  13. package/lib/rules/no-accesskey-attrs.js +2 -0
  14. package/lib/rules/no-aria-hidden-body.js +2 -0
  15. package/lib/rules/no-duplicate-attrs.js +2 -0
  16. package/lib/rules/no-duplicate-class.js +4 -2
  17. package/lib/rules/no-duplicate-id.js +2 -0
  18. package/lib/rules/no-extra-spacing-attrs.js +2 -0
  19. package/lib/rules/no-extra-spacing-text.js +2 -0
  20. package/lib/rules/no-heading-inside-button.js +3 -0
  21. package/lib/rules/no-inline-styles.js +3 -0
  22. package/lib/rules/no-invalid-role.js +5 -2
  23. package/lib/rules/no-multiple-empty-lines.js +3 -1
  24. package/lib/rules/no-multiple-h1.js +2 -0
  25. package/lib/rules/no-nested-interactive.js +2 -0
  26. package/lib/rules/no-non-scalable-viewport.js +2 -0
  27. package/lib/rules/no-obsolete-tags.js +2 -0
  28. package/lib/rules/no-positive-tabindex.js +2 -0
  29. package/lib/rules/no-restricted-attr-values.js +2 -0
  30. package/lib/rules/no-restricted-attrs.js +2 -0
  31. package/lib/rules/no-script-style-type.js +2 -0
  32. package/lib/rules/no-skip-heading-levels.js +2 -0
  33. package/lib/rules/no-target-blank.js +2 -0
  34. package/lib/rules/no-trailing-spaces.js +2 -0
  35. package/lib/rules/prefer-https.js +2 -0
  36. package/lib/rules/quotes.js +4 -2
  37. package/lib/rules/require-attrs.js +2 -0
  38. package/lib/rules/require-button-type.js +2 -0
  39. package/lib/rules/require-closing-tags.js +2 -0
  40. package/lib/rules/require-doctype.js +2 -0
  41. package/lib/rules/require-explicit-size.js +2 -0
  42. package/lib/rules/require-form-method.js +4 -2
  43. package/lib/rules/require-frame-title.js +2 -0
  44. package/lib/rules/require-img-alt.js +2 -0
  45. package/lib/rules/require-input-label.js +2 -0
  46. package/lib/rules/require-lang.js +2 -0
  47. package/lib/rules/require-li-container.js +2 -0
  48. package/lib/rules/require-meta-charset.js +2 -0
  49. package/lib/rules/require-meta-description.js +2 -0
  50. package/lib/rules/require-meta-viewport.js +2 -0
  51. package/lib/rules/require-open-graph-protocol.js +4 -1
  52. package/lib/rules/require-title.js +2 -0
  53. package/lib/rules/sort-attrs.js +2 -0
  54. package/lib/rules/use-baseline.js +2 -0
  55. package/lib/rules/utils/node.js +5 -6
  56. package/lib/rules/utils/rule.js +11 -0
  57. package/package.json +19 -13
  58. package/types/configs/recommended.d.ts +17 -17
  59. package/types/exports.d.ts +1 -1
  60. package/types/exports.d.ts.map +1 -1
  61. package/types/index.d.ts +64 -102
  62. package/types/index.d.ts.map +1 -1
  63. package/types/languages/html-language.d.ts +22 -21
  64. package/types/languages/html-language.d.ts.map +1 -1
  65. package/types/languages/html-source-code.d.ts +3 -1
  66. package/types/languages/html-source-code.d.ts.map +1 -1
  67. package/types/rules/attrs-newline.d.ts.map +1 -1
  68. package/types/rules/element-newline.d.ts.map +1 -1
  69. package/types/rules/id-naming-convention.d.ts.map +1 -1
  70. package/types/rules/index.d.ts +1 -69
  71. package/types/rules/lowercase.d.ts.map +1 -1
  72. package/types/rules/max-element-depth.d.ts.map +1 -1
  73. package/types/rules/no-abstract-roles.d.ts.map +1 -1
  74. package/types/rules/no-accesskey-attrs.d.ts.map +1 -1
  75. package/types/rules/no-aria-hidden-body.d.ts.map +1 -1
  76. package/types/rules/no-duplicate-attrs.d.ts.map +1 -1
  77. package/types/rules/no-duplicate-class.d.ts.map +1 -1
  78. package/types/rules/no-duplicate-id.d.ts.map +1 -1
  79. package/types/rules/no-extra-spacing-attrs.d.ts.map +1 -1
  80. package/types/rules/no-extra-spacing-text.d.ts.map +1 -1
  81. package/types/rules/no-heading-inside-button.d.ts.map +1 -1
  82. package/types/rules/no-inline-styles.d.ts.map +1 -1
  83. package/types/rules/no-invalid-role.d.ts.map +1 -1
  84. package/types/rules/no-multiple-empty-lines.d.ts +1 -1
  85. package/types/rules/no-multiple-empty-lines.d.ts.map +1 -1
  86. package/types/rules/no-multiple-h1.d.ts.map +1 -1
  87. package/types/rules/no-nested-interactive.d.ts.map +1 -1
  88. package/types/rules/no-non-scalable-viewport.d.ts.map +1 -1
  89. package/types/rules/no-obsolete-tags.d.ts.map +1 -1
  90. package/types/rules/no-positive-tabindex.d.ts.map +1 -1
  91. package/types/rules/no-restricted-attr-values.d.ts.map +1 -1
  92. package/types/rules/no-restricted-attrs.d.ts.map +1 -1
  93. package/types/rules/no-script-style-type.d.ts.map +1 -1
  94. package/types/rules/no-skip-heading-levels.d.ts.map +1 -1
  95. package/types/rules/no-target-blank.d.ts.map +1 -1
  96. package/types/rules/no-trailing-spaces.d.ts.map +1 -1
  97. package/types/rules/prefer-https.d.ts.map +1 -1
  98. package/types/rules/quotes.d.ts.map +1 -1
  99. package/types/rules/require-attrs.d.ts.map +1 -1
  100. package/types/rules/require-button-type.d.ts.map +1 -1
  101. package/types/rules/require-closing-tags.d.ts.map +1 -1
  102. package/types/rules/require-doctype.d.ts.map +1 -1
  103. package/types/rules/require-explicit-size.d.ts.map +1 -1
  104. package/types/rules/require-form-method.d.ts.map +1 -1
  105. package/types/rules/require-frame-title.d.ts.map +1 -1
  106. package/types/rules/require-img-alt.d.ts.map +1 -1
  107. package/types/rules/require-input-label.d.ts.map +1 -1
  108. package/types/rules/require-lang.d.ts.map +1 -1
  109. package/types/rules/require-li-container.d.ts.map +1 -1
  110. package/types/rules/require-meta-charset.d.ts.map +1 -1
  111. package/types/rules/require-meta-description.d.ts.map +1 -1
  112. package/types/rules/require-meta-viewport.d.ts.map +1 -1
  113. package/types/rules/require-open-graph-protocol.d.ts.map +1 -1
  114. package/types/rules/require-title.d.ts.map +1 -1
  115. package/types/rules/sort-attrs.d.ts.map +1 -1
  116. package/types/rules/use-baseline.d.ts.map +1 -1
  117. package/types/rules/utils/node.d.ts +1 -1
  118. package/types/rules/utils/node.d.ts.map +1 -1
  119. package/types/rules/utils/rule.d.ts +6 -0
  120. package/types/rules/utils/rule.d.ts.map +1 -0
  121. package/types/rules/utils/source-code.d.ts +1 -6
  122. package/types/rules/utils/source-code.d.ts.map +1 -1
@@ -1,4 +1,5 @@
1
- module.exports = {
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 default plugin;
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
- * @typedef {import("./rules")} AllRules
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
- * @type {{meta: PluginMeta, rules: AllRules, configs: HtmlESLintConfigs, languages: Languages}}
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
- * @typedef {import('@eslint/core').File} File
6
- * @typedef {import('@html-eslint/parser').ParserOptions} LanguageOptions
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 CSSTree AST.
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 {LanguageOptions} languageOptions
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 {LanguageOptions} context.languageOptions
68
- * @returns {{ok: true; ast: any; comments: any[]} | {ok: false, errors: unknown[]}}
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 {any} parseResult
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 { NodeTypes } = require("es-html-parser");
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 === NodeTypes.Attribute) {
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 !== NodeTypes.Part) {
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 !== NodeTypes.Part) {
365
+ if (part.type !== NODE_TYPES.Part) {
366
366
  if (part.open) {
367
367
  checkIndent(part.open);
368
368
  }
@@ -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
- module.exports = {
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
+ );
@@ -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 { NodeTypes } = require("es-html-parser");
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 === NodeTypes.Template)
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 { NodeTypes } = require("es-html-parser");
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 === NodeTypes.Template)
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("es-html-parser").AnyToken } AnyToken
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,