@html-eslint/eslint-plugin 0.42.0 → 0.43.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 (189) hide show
  1. package/lib/languages/html-language.js +3 -3
  2. package/lib/languages/html-source-code.js +9 -11
  3. package/lib/languages/html-traversal-step.js +4 -3
  4. package/lib/rules/attrs-newline.js +3 -4
  5. package/lib/rules/element-newline.js +4 -14
  6. package/lib/rules/id-naming-convention.js +3 -6
  7. package/lib/rules/indent/indent-level.js +1 -1
  8. package/lib/rules/indent/indent.js +18 -23
  9. package/lib/rules/lowercase.js +3 -5
  10. package/lib/rules/max-element-depth.js +3 -5
  11. package/lib/rules/no-abstract-roles.js +3 -5
  12. package/lib/rules/no-accesskey-attrs.js +3 -5
  13. package/lib/rules/no-aria-hidden-body.js +2 -2
  14. package/lib/rules/no-aria-hidden-on-focusable.js +3 -3
  15. package/lib/rules/no-duplicate-attrs.js +3 -7
  16. package/lib/rules/no-duplicate-class.js +3 -6
  17. package/lib/rules/no-duplicate-id.js +6 -9
  18. package/lib/rules/no-duplicate-in-head.js +6 -9
  19. package/lib/rules/no-empty-headings.js +3 -4
  20. package/lib/rules/no-extra-spacing-attrs.js +4 -14
  21. package/lib/rules/no-extra-spacing-text.js +3 -9
  22. package/lib/rules/no-heading-inside-button.js +2 -2
  23. package/lib/rules/no-inline-styles.js +2 -2
  24. package/lib/rules/no-invalid-entity.js +3 -4
  25. package/lib/rules/no-invalid-role.js +2 -2
  26. package/lib/rules/no-multiple-empty-lines.js +10 -11
  27. package/lib/rules/no-multiple-h1.js +3 -3
  28. package/lib/rules/no-nested-interactive.js +3 -3
  29. package/lib/rules/no-non-scalable-viewport.js +2 -2
  30. package/lib/rules/no-obsolete-tags.js +2 -2
  31. package/lib/rules/no-positive-tabindex.js +3 -5
  32. package/lib/rules/no-restricted-attr-values.js +4 -6
  33. package/lib/rules/no-restricted-attrs.js +4 -6
  34. package/lib/rules/no-script-style-type.js +3 -5
  35. package/lib/rules/no-skip-heading-levels.js +3 -3
  36. package/lib/rules/no-target-blank.js +2 -2
  37. package/lib/rules/no-trailing-spaces.js +10 -9
  38. package/lib/rules/prefer-https.js +3 -6
  39. package/lib/rules/quotes.js +25 -10
  40. package/lib/rules/require-attrs.js +3 -8
  41. package/lib/rules/require-button-type.js +3 -4
  42. package/lib/rules/require-closing-tags.js +3 -3
  43. package/lib/rules/require-doctype.js +2 -2
  44. package/lib/rules/require-explicit-size.js +2 -5
  45. package/lib/rules/require-form-method.js +2 -2
  46. package/lib/rules/require-frame-title.js +2 -2
  47. package/lib/rules/require-img-alt.js +4 -4
  48. package/lib/rules/require-input-label.js +3 -3
  49. package/lib/rules/require-lang.js +2 -2
  50. package/lib/rules/require-li-container.js +2 -2
  51. package/lib/rules/require-meta-charset.js +3 -4
  52. package/lib/rules/require-meta-description.js +3 -4
  53. package/lib/rules/require-meta-viewport.js +3 -4
  54. package/lib/rules/require-open-graph-protocol.js +3 -6
  55. package/lib/rules/require-title.js +3 -5
  56. package/lib/rules/sort-attrs.js +4 -5
  57. package/lib/rules/use-baseline.js +3 -6
  58. package/lib/rules/utils/baseline.js +7 -4
  59. package/lib/rules/utils/node.js +11 -26
  60. package/lib/rules/utils/settings.js +4 -7
  61. package/lib/rules/utils/source-code.js +2 -2
  62. package/lib/rules/utils/template-literal.js +43 -0
  63. package/lib/rules/utils/visitors.js +6 -7
  64. package/package.json +6 -6
  65. package/types/languages/html-language.d.ts +0 -5
  66. package/types/languages/html-language.d.ts.map +1 -1
  67. package/types/languages/html-source-code.d.ts +13 -14
  68. package/types/languages/html-source-code.d.ts.map +1 -1
  69. package/types/languages/html-traversal-step.d.ts +5 -5
  70. package/types/languages/html-traversal-step.d.ts.map +1 -1
  71. package/types/rules/attrs-newline.d.ts +3 -4
  72. package/types/rules/attrs-newline.d.ts.map +1 -1
  73. package/types/rules/element-newline.d.ts +5 -13
  74. package/types/rules/element-newline.d.ts.map +1 -1
  75. package/types/rules/id-naming-convention.d.ts +3 -6
  76. package/types/rules/id-naming-convention.d.ts.map +1 -1
  77. package/types/rules/indent/indent-level.d.ts +3 -3
  78. package/types/rules/indent/indent-level.d.ts.map +1 -1
  79. package/types/rules/indent/indent.d.ts +5 -18
  80. package/types/rules/indent/indent.d.ts.map +1 -1
  81. package/types/rules/lowercase.d.ts +2 -8
  82. package/types/rules/lowercase.d.ts.map +1 -1
  83. package/types/rules/max-element-depth.d.ts +3 -6
  84. package/types/rules/max-element-depth.d.ts.map +1 -1
  85. package/types/rules/no-abstract-roles.d.ts +2 -8
  86. package/types/rules/no-abstract-roles.d.ts.map +1 -1
  87. package/types/rules/no-accesskey-attrs.d.ts +2 -8
  88. package/types/rules/no-accesskey-attrs.d.ts.map +1 -1
  89. package/types/rules/no-aria-hidden-body.d.ts +2 -5
  90. package/types/rules/no-aria-hidden-body.d.ts.map +1 -1
  91. package/types/rules/no-aria-hidden-on-focusable.d.ts +2 -6
  92. package/types/rules/no-aria-hidden-on-focusable.d.ts.map +1 -1
  93. package/types/rules/no-duplicate-attrs.d.ts +2 -10
  94. package/types/rules/no-duplicate-attrs.d.ts.map +1 -1
  95. package/types/rules/no-duplicate-class.d.ts +3 -7
  96. package/types/rules/no-duplicate-class.d.ts.map +1 -1
  97. package/types/rules/no-duplicate-id.d.ts +2 -9
  98. package/types/rules/no-duplicate-id.d.ts.map +1 -1
  99. package/types/rules/no-duplicate-in-head.d.ts +2 -9
  100. package/types/rules/no-duplicate-in-head.d.ts.map +1 -1
  101. package/types/rules/no-empty-headings.d.ts +2 -7
  102. package/types/rules/no-empty-headings.d.ts.map +1 -1
  103. package/types/rules/no-extra-spacing-attrs.d.ts +3 -14
  104. package/types/rules/no-extra-spacing-attrs.d.ts.map +1 -1
  105. package/types/rules/no-extra-spacing-text.d.ts +3 -9
  106. package/types/rules/no-extra-spacing-text.d.ts.map +1 -1
  107. package/types/rules/no-heading-inside-button.d.ts +2 -5
  108. package/types/rules/no-heading-inside-button.d.ts.map +1 -1
  109. package/types/rules/no-inline-styles.d.ts +2 -5
  110. package/types/rules/no-inline-styles.d.ts.map +1 -1
  111. package/types/rules/no-invalid-entity.d.ts +3 -5
  112. package/types/rules/no-invalid-entity.d.ts.map +1 -1
  113. package/types/rules/no-invalid-role.d.ts +2 -5
  114. package/types/rules/no-invalid-role.d.ts.map +1 -1
  115. package/types/rules/no-multiple-empty-lines.d.ts +3 -7
  116. package/types/rules/no-multiple-empty-lines.d.ts.map +1 -1
  117. package/types/rules/no-multiple-h1.d.ts +2 -6
  118. package/types/rules/no-multiple-h1.d.ts.map +1 -1
  119. package/types/rules/no-nested-interactive.d.ts +2 -6
  120. package/types/rules/no-nested-interactive.d.ts.map +1 -1
  121. package/types/rules/no-non-scalable-viewport.d.ts +2 -5
  122. package/types/rules/no-non-scalable-viewport.d.ts.map +1 -1
  123. package/types/rules/no-obsolete-tags.d.ts +2 -5
  124. package/types/rules/no-obsolete-tags.d.ts.map +1 -1
  125. package/types/rules/no-positive-tabindex.d.ts +2 -8
  126. package/types/rules/no-positive-tabindex.d.ts.map +1 -1
  127. package/types/rules/no-restricted-attr-values.d.ts +3 -7
  128. package/types/rules/no-restricted-attr-values.d.ts.map +1 -1
  129. package/types/rules/no-restricted-attrs.d.ts +3 -7
  130. package/types/rules/no-restricted-attrs.d.ts.map +1 -1
  131. package/types/rules/no-script-style-type.d.ts +2 -8
  132. package/types/rules/no-script-style-type.d.ts.map +1 -1
  133. package/types/rules/no-skip-heading-levels.d.ts +2 -6
  134. package/types/rules/no-skip-heading-levels.d.ts.map +1 -1
  135. package/types/rules/no-target-blank.d.ts +2 -5
  136. package/types/rules/no-target-blank.d.ts.map +1 -1
  137. package/types/rules/no-trailing-spaces.d.ts +2 -7
  138. package/types/rules/no-trailing-spaces.d.ts.map +1 -1
  139. package/types/rules/prefer-https.d.ts +2 -9
  140. package/types/rules/prefer-https.d.ts.map +1 -1
  141. package/types/rules/quotes.d.ts +7 -9
  142. package/types/rules/quotes.d.ts.map +1 -1
  143. package/types/rules/require-attrs.d.ts +3 -8
  144. package/types/rules/require-attrs.d.ts.map +1 -1
  145. package/types/rules/require-button-type.d.ts +2 -7
  146. package/types/rules/require-button-type.d.ts.map +1 -1
  147. package/types/rules/require-closing-tags.d.ts +3 -4
  148. package/types/rules/require-closing-tags.d.ts.map +1 -1
  149. package/types/rules/require-doctype.d.ts +2 -5
  150. package/types/rules/require-doctype.d.ts.map +1 -1
  151. package/types/rules/require-explicit-size.d.ts +3 -5
  152. package/types/rules/require-explicit-size.d.ts.map +1 -1
  153. package/types/rules/require-form-method.d.ts +2 -5
  154. package/types/rules/require-form-method.d.ts.map +1 -1
  155. package/types/rules/require-frame-title.d.ts +2 -5
  156. package/types/rules/require-frame-title.d.ts.map +1 -1
  157. package/types/rules/require-img-alt.d.ts +3 -4
  158. package/types/rules/require-img-alt.d.ts.map +1 -1
  159. package/types/rules/require-input-label.d.ts +2 -6
  160. package/types/rules/require-input-label.d.ts.map +1 -1
  161. package/types/rules/require-lang.d.ts +2 -5
  162. package/types/rules/require-lang.d.ts.map +1 -1
  163. package/types/rules/require-li-container.d.ts +2 -5
  164. package/types/rules/require-li-container.d.ts.map +1 -1
  165. package/types/rules/require-meta-charset.d.ts +2 -7
  166. package/types/rules/require-meta-charset.d.ts.map +1 -1
  167. package/types/rules/require-meta-description.d.ts +2 -7
  168. package/types/rules/require-meta-description.d.ts.map +1 -1
  169. package/types/rules/require-meta-viewport.d.ts +2 -7
  170. package/types/rules/require-meta-viewport.d.ts.map +1 -1
  171. package/types/rules/require-open-graph-protocol.d.ts +3 -5
  172. package/types/rules/require-open-graph-protocol.d.ts.map +1 -1
  173. package/types/rules/require-title.d.ts +2 -8
  174. package/types/rules/require-title.d.ts.map +1 -1
  175. package/types/rules/sort-attrs.d.ts +3 -6
  176. package/types/rules/sort-attrs.d.ts.map +1 -1
  177. package/types/rules/use-baseline.d.ts +3 -7
  178. package/types/rules/use-baseline.d.ts.map +1 -1
  179. package/types/rules/utils/baseline.d.ts.map +1 -1
  180. package/types/rules/utils/node.d.ts +25 -29
  181. package/types/rules/utils/node.d.ts.map +1 -1
  182. package/types/rules/utils/settings.d.ts +7 -9
  183. package/types/rules/utils/settings.d.ts.map +1 -1
  184. package/types/rules/utils/source-code.d.ts +4 -4
  185. package/types/rules/utils/source-code.d.ts.map +1 -1
  186. package/types/rules/utils/template-literal.d.ts +18 -0
  187. package/types/rules/utils/template-literal.d.ts.map +1 -0
  188. package/types/rules/utils/visitors.d.ts +4 -4
  189. package/types/rules/utils/visitors.d.ts.map +1 -1
@@ -1,7 +1,6 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
3
- * @typedef { import("../types").SuggestionReportDescriptor } SuggestionReportDescriptor
4
- * @typedef { import("@html-eslint/types").Text} Text
2
+ * @import {RuleModule} from "../types";
3
+ * @import {Text} from "@html-eslint/types";
5
4
  */
6
5
 
7
6
  // Define the type for entities.json
@@ -23,7 +22,7 @@ const MESSAGE_IDS = {
23
22
  };
24
23
 
25
24
  /**
26
- * @type {RuleModule}
25
+ * @type {RuleModule<[]>}
27
26
  */
28
27
  module.exports = {
29
28
  meta: {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
2
+ * @import {RuleModule} from "../types";
3
3
  */
4
4
 
5
5
  const { NODE_TYPES } = require("@html-eslint/parser");
@@ -227,7 +227,7 @@ const ELEMENTS_DISALLOWING_PRESENTATION_OR_NONE_ROLE = new Set([
227
227
  ]);
228
228
 
229
229
  /**
230
- * @type {RuleModule}
230
+ * @type {RuleModule<[]>}
231
231
  */
232
232
  module.exports = {
233
233
  meta: {
@@ -1,15 +1,12 @@
1
1
  /**
2
- * @typedef { import("@html-eslint/types").AnyToken } AnyToken
3
- * @typedef { import("@html-eslint/types").Document } Document
4
- * @typedef { import("@html-eslint/types").CommentContent } CommentContent
5
- * @typedef { import("@html-eslint/types").Text } Text
2
+ * @import {CommentContent, Text} from "@html-eslint/types";
3
+ * @import {RuleModule} from "../types";
6
4
  *
7
5
  * @typedef {Object} Option
8
6
  * @property {number} Option.max
9
- * @typedef { import("../types").RuleModule<[Option]> } RuleModule
10
7
  */
11
8
 
12
- const { parse } = require("@html-eslint/template-parser");
9
+ const { parseTemplateLiteral } = require("./utils/template-literal");
13
10
  const { RULE_CATEGORY } = require("../constants");
14
11
  const {
15
12
  shouldCheckTaggedTemplateExpression,
@@ -28,7 +25,7 @@ const MESSAGE_IDS = {
28
25
  };
29
26
 
30
27
  /**
31
- * @type {RuleModule}
28
+ * @type {RuleModule<[Option]>}
32
29
  */
33
30
  module.exports = {
34
31
  meta: {
@@ -120,10 +117,9 @@ module.exports = {
120
117
  },
121
118
  TaggedTemplateExpression(node) {
122
119
  if (shouldCheckTaggedTemplateExpression(node, context)) {
123
- const { html, tokens } = parse(
120
+ const { html, tokens } = parseTemplateLiteral(
124
121
  node.quasi,
125
- getSourceCode(context),
126
- {}
122
+ getSourceCode(context)
127
123
  );
128
124
  const lines = codeToLines(html);
129
125
  check(
@@ -136,7 +132,10 @@ module.exports = {
136
132
  },
137
133
  TemplateLiteral(node) {
138
134
  if (shouldCheckTemplateLiteral(node, context)) {
139
- const { html, tokens } = parse(node, getSourceCode(context), {});
135
+ const { html, tokens } = parseTemplateLiteral(
136
+ node,
137
+ getSourceCode(context)
138
+ );
140
139
  const lines = codeToLines(html);
141
140
  check(
142
141
  lines,
@@ -1,6 +1,6 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
3
- * @typedef { import("@html-eslint/types").Tag } Tag
2
+ * @import {Tag} from "@html-eslint/types";
3
+ * @import {RuleModule} from "../types";
4
4
  */
5
5
 
6
6
  const { RULE_CATEGORY } = require("../constants");
@@ -11,7 +11,7 @@ const MESSAGE_IDS = {
11
11
  };
12
12
 
13
13
  /**
14
- * @type {RuleModule}
14
+ * @type {RuleModule<[]>}
15
15
  */
16
16
  module.exports = {
17
17
  meta: {
@@ -1,6 +1,6 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
3
- * @typedef { import("@html-eslint/types").Tag } Tag
2
+ * @import {Tag} from "@html-eslint/types";
3
+ * @import {RuleModule} from "../types";
4
4
  */
5
5
 
6
6
  const { RULE_CATEGORY } = require("../constants");
@@ -56,7 +56,7 @@ function isInteractive(tag) {
56
56
  }
57
57
 
58
58
  /**
59
- * @type {RuleModule}
59
+ * @type {RuleModule<[]>}
60
60
  */
61
61
  module.exports = {
62
62
  meta: {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
2
+ * @import {RuleModule} from "../types";
3
3
  */
4
4
 
5
5
  const { RULE_CATEGORY } = require("../constants");
@@ -11,7 +11,7 @@ const MESSAGE_IDS = {
11
11
  };
12
12
 
13
13
  /**
14
- * @type {RuleModule}
14
+ * @type {RuleModule<[]>}
15
15
  */
16
16
  module.exports = {
17
17
  meta: {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
2
+ * @import {RuleModule} from "../types";
3
3
  */
4
4
 
5
5
  const { RULE_CATEGORY, OBSOLETE_TAGS } = require("../constants");
@@ -13,7 +13,7 @@ const MESSAGE_IDS = {
13
13
  };
14
14
 
15
15
  /**
16
- * @type {RuleModule}
16
+ * @type {RuleModule<[]>}
17
17
  */
18
18
  module.exports = {
19
19
  meta: {
@@ -1,8 +1,6 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
3
- * @typedef { import("@html-eslint/types").Tag } Tag
4
- * @typedef { import("@html-eslint/types").StyleTag } StyleTag
5
- * @typedef { import("@html-eslint/types").ScriptTag } ScriptTag
2
+ * @import {Tag, StyleTag,ScriptTag } from "@html-eslint/types";
3
+ * @import {RuleModule} from "../types";
6
4
  */
7
5
 
8
6
  const { RULE_CATEGORY } = require("../constants");
@@ -15,7 +13,7 @@ const MESSAGE_IDS = {
15
13
  };
16
14
 
17
15
  /**
18
- * @type {RuleModule}
16
+ * @type {RuleModule<[]>}
19
17
  */
20
18
  module.exports = {
21
19
  meta: {
@@ -1,10 +1,7 @@
1
1
  /**
2
- * @typedef { import("@html-eslint/types").StyleTag } StyleTag
3
- * @typedef { import("@html-eslint/types").Attribute } Attribute
4
- * @typedef { import("@html-eslint/types").Tag } Tag
5
- * @typedef { import("@html-eslint/types").ScriptTag } ScriptTag
2
+ * @import {StyleTag, Attribute, Tag, ScriptTag } from "@html-eslint/types";
3
+ * @import {RuleModule} from "../types";
6
4
  * @typedef {{attrPatterns: string[], attrValuePatterns: string[], message?: string}[]} Options
7
- * @typedef { import("../types").RuleModule<Options> } RuleModule
8
5
  */
9
6
 
10
7
  const { RULE_CATEGORY } = require("../constants");
@@ -16,7 +13,7 @@ const MESSAGE_IDS = {
16
13
  };
17
14
 
18
15
  /**
19
- * @type {RuleModule}
16
+ * @type {RuleModule<Options>}
20
17
  */
21
18
  module.exports = {
22
19
  meta: {
@@ -53,6 +50,7 @@ module.exports = {
53
50
  type: "string",
54
51
  },
55
52
  },
53
+ additionalProperties: false,
56
54
  },
57
55
  },
58
56
  messages: {
@@ -1,11 +1,8 @@
1
1
  /**
2
- * @typedef { import("@html-eslint/types").StyleTag } StyleTag
3
- * @typedef { import("@html-eslint/types").Attribute } Attribute
4
- * @typedef { import("@html-eslint/types").Tag } Tag
5
- * @typedef { import("@html-eslint/types").ScriptTag } ScriptTag
2
+ * @import {StyleTag, Attribute, Tag, ScriptTag} from "@html-eslint/types";
3
+ * @import {RuleModule} from "../types";
6
4
  * @typedef {{tagPatterns: string[], attrPatterns: string[], message?: string}[]} Options
7
5
  *
8
- * @typedef { import("../types").RuleModule<Options> } RuleModule
9
6
  */
10
7
 
11
8
  const { NODE_TYPES } = require("@html-eslint/parser");
@@ -18,7 +15,7 @@ const MESSAGE_IDS = {
18
15
  };
19
16
 
20
17
  /**
21
- * @type {RuleModule}
18
+ * @type {RuleModule<Options>}
22
19
  */
23
20
  module.exports = {
24
21
  meta: {
@@ -55,6 +52,7 @@ module.exports = {
55
52
  type: "string",
56
53
  },
57
54
  },
55
+ additionalProperties: false,
58
56
  },
59
57
  },
60
58
  messages: {
@@ -1,8 +1,6 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
3
- * @typedef { import("@html-eslint/types").StyleTag } StyleTag
4
- * @typedef { import("@html-eslint/types").Tag } Tag
5
- * @typedef { import("@html-eslint/types").ScriptTag } ScriptTag
2
+ * @import {RuleModule} from "../types";
3
+ * @import {StyleTag, Tag, ScriptTag} from "@html-eslint/types";
6
4
  */
7
5
 
8
6
  const { RULE_CATEGORY } = require("../constants");
@@ -15,7 +13,7 @@ const MESSAGE_IDS = {
15
13
  };
16
14
 
17
15
  /**
18
- * @type {RuleModule}
16
+ * @type {RuleModule<[]>}
19
17
  */
20
18
  module.exports = {
21
19
  meta: {
@@ -1,6 +1,6 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
3
- * @typedef { import("@html-eslint/types").Tag } Tag
2
+ * @import {RuleModule} from "../types";
3
+ * @import {Tag} from "@html-eslint/types";
4
4
  */
5
5
 
6
6
  const { RULE_CATEGORY } = require("../constants");
@@ -11,7 +11,7 @@ const MESSAGE_IDS = {
11
11
  };
12
12
 
13
13
  /**
14
- * @type {RuleModule}
14
+ * @type {RuleModule<[]>}
15
15
  */
16
16
  module.exports = {
17
17
  meta: {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
2
+ * @import {RuleModule} from "../types";
3
3
  */
4
4
 
5
5
  const { RULE_CATEGORY } = require("../constants");
@@ -12,7 +12,7 @@ const MESSAGE_IDS = {
12
12
  };
13
13
 
14
14
  /**
15
- * @type {RuleModule}
15
+ * @type {RuleModule<[]>}
16
16
  */
17
17
  module.exports = {
18
18
  meta: {
@@ -1,10 +1,9 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
3
- * @typedef { import("@html-eslint/types").CommentContent } CommentContent
4
- * @typedef { import("@html-eslint/types").Text } Text
2
+ * @import {RuleModule} from "../types";
3
+ * @import {CommentContent, Text} from "@html-eslint/types";
5
4
  */
6
5
 
7
- const { parse } = require("@html-eslint/template-parser");
6
+ const { parseTemplateLiteral } = require("./utils/template-literal");
8
7
  const { RULE_CATEGORY } = require("../constants");
9
8
  const {
10
9
  getTemplateTokens,
@@ -23,7 +22,7 @@ const MESSAGE_IDS = {
23
22
  };
24
23
 
25
24
  /**
26
- * @type {RuleModule}
25
+ * @type {RuleModule<[]>}
27
26
  */
28
27
  module.exports = {
29
28
  meta: {
@@ -108,10 +107,9 @@ module.exports = {
108
107
  },
109
108
  TaggedTemplateExpression(node) {
110
109
  if (shouldCheckTaggedTemplateExpression(node, context)) {
111
- const { html, tokens } = parse(
110
+ const { html, tokens } = parseTemplateLiteral(
112
111
  node.quasi,
113
- getSourceCode(context),
114
- {}
112
+ getSourceCode(context)
115
113
  );
116
114
  const lines = codeToLines(html);
117
115
  check(
@@ -128,7 +126,10 @@ module.exports = {
128
126
  },
129
127
  TemplateLiteral(node) {
130
128
  if (shouldCheckTemplateLiteral(node, context)) {
131
- const { html, tokens } = parse(node, getSourceCode(context), {});
129
+ const { html, tokens } = parseTemplateLiteral(
130
+ node,
131
+ getSourceCode(context)
132
+ );
132
133
  const lines = codeToLines(html);
133
134
  check(
134
135
  html,
@@ -1,9 +1,6 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
3
- * @typedef { import("@html-eslint/types").Tag } Tag
4
- * @typedef { import("@html-eslint/types").ScriptTag } ScriptTag
5
- * @typedef { import("@html-eslint/types").Attribute } Attribute
6
- * @typedef { import("@html-eslint/types").AttributeValue } AttributeValue
2
+ * @import {Tag, ScriptTag, Attribute, AttributeValue} from "@html-eslint/types";
3
+ * @import {RuleModule} from "../types";
7
4
  */
8
5
 
9
6
  const { RULE_CATEGORY } = require("../constants");
@@ -66,7 +63,7 @@ function getResourceAttributeValue(node) {
66
63
  }
67
64
 
68
65
  /**
69
- * @type {RuleModule}
66
+ * @type {RuleModule<[]>}
70
67
  */
71
68
  module.exports = {
72
69
  meta: {
@@ -1,12 +1,10 @@
1
1
  /**
2
- * @typedef { import("eslint").AST.Range } Range
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
2
+ * @import {AST} from "eslint";
3
+ * @import {Attribute, Tag, ScriptTag, StyleTag} from "@html-eslint/types";
4
+ * @import {RuleModule} from "../types";
7
5
  *
8
- * @typedef {"single" | "double"} Option
9
- * @typedef { import("../types").RuleModule<[Option]> } RuleModule
6
+ * @typedef {"single" | "double"} SingleOrQuoteOption
7
+ * @typedef {{enforceTemplatedAttrValue: boolean}} ObjectOption
10
8
  */
11
9
 
12
10
  const { NODE_TYPES } = require("@html-eslint/parser");
@@ -28,7 +26,7 @@ const QUOTES_STYLES = {
28
26
  const QUOTES_CODES = [`"`, `'`];
29
27
 
30
28
  /**
31
- * @type {RuleModule}
29
+ * @type {RuleModule<[SingleOrQuoteOption, ObjectOption]>}
32
30
  */
33
31
  module.exports = {
34
32
  meta: {
@@ -46,6 +44,16 @@ module.exports = {
46
44
  {
47
45
  enum: [QUOTES_STYLES.SINGLE, QUOTES_STYLES.DOUBLE],
48
46
  },
47
+ {
48
+ type: "object",
49
+ properties: {
50
+ enforceTemplatedAttrValue: {
51
+ type: "boolean",
52
+ default: false,
53
+ },
54
+ },
55
+ additionalProperties: false,
56
+ },
49
57
  ],
50
58
  messages: {
51
59
  [MESSAGE_IDS.UNEXPECTED]:
@@ -61,11 +69,15 @@ module.exports = {
61
69
  ? context.options[0]
62
70
  : QUOTES_STYLES.DOUBLE;
63
71
  const expectedQuote = SELECTED_STYLE === QUOTES_STYLES.DOUBLE ? `"` : `'`;
72
+ const enforceTemplatedAttrValue =
73
+ context.options &&
74
+ context.options[1] &&
75
+ context.options[1].enforceTemplatedAttrValue;
64
76
 
65
77
  const sourceCode = getSourceCode(context);
66
78
 
67
79
  /**
68
- * @param {Range} range
80
+ * @param {AST.Range} range
69
81
  * @returns {string}
70
82
  */
71
83
  function getCodeIn(range) {
@@ -94,7 +106,10 @@ module.exports = {
94
106
  * Allow template expression.
95
107
  * ex: html`<div foo=${foo}></div>`
96
108
  */
97
- if (attr.value.parts.some((part) => part.type === NODE_TYPES.Template)) {
109
+ if (
110
+ !enforceTemplatedAttrValue &&
111
+ attr.value.parts.some((part) => part.type === NODE_TYPES.Template)
112
+ ) {
98
113
  return;
99
114
  }
100
115
 
@@ -1,17 +1,12 @@
1
1
  /**
2
- * @typedef { import("@html-eslint/types").Tag } Tag
3
- * @typedef { import("@html-eslint/types").ScriptTag } ScriptTag
4
- * @typedef { import("@html-eslint/types").StyleTag } StyleTag
5
- * @typedef { import("@html-eslint/types").Attribute } Attribute
2
+ * @import {Tag, ScriptTag, StyleTag, Attribute} from "@html-eslint/types";
3
+ * @import {RuleModule, ReportFixFunction} from "../types";
6
4
  *
7
5
  * @typedef {Object} Option
8
6
  * @property {string} tag
9
7
  * @property {string} attr
10
8
  * @property {string} [value]
11
9
  *
12
- * @typedef { import("../types").RuleModule<Option[]> } RuleModule
13
- * @typedef { import("../types").ReportFixFunction} ReportFixFunction
14
- *
15
10
  */
16
11
 
17
12
  const { NODE_TYPES } = require("@html-eslint/parser");
@@ -25,7 +20,7 @@ const MESSAGE_IDS = {
25
20
  };
26
21
 
27
22
  /**
28
- * @type {RuleModule}
23
+ * @type {RuleModule<Option[]>}
29
24
  */
30
25
  module.exports = {
31
26
  meta: {
@@ -1,7 +1,6 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
3
- * @typedef { import("@html-eslint/types").AttributeValue } AttributeValue
4
- * @typedef { import("../types").SuggestionReportDescriptor } SuggestionReportDescriptor
2
+ * @import {RuleModule, SuggestionReportDescriptor} from "../types";
3
+ * @import {AttributeValue} from "@html-eslint/types";
5
4
  */
6
5
 
7
6
  const { RULE_CATEGORY } = require("../constants");
@@ -20,7 +19,7 @@ const MESSAGE_IDS = {
20
19
  const VALID_BUTTON_TYPES_SET = new Set(["submit", "button", "reset"]);
21
20
 
22
21
  /**
23
- * @type {RuleModule}
22
+ * @type {RuleModule<[]>}
24
23
  */
25
24
  module.exports = {
26
25
  meta: {
@@ -1,10 +1,10 @@
1
1
  /**
2
- * @typedef { import("@html-eslint/types").Tag } Tag
2
+ * @import {Tag} from "@html-eslint/types";
3
+ * @import {RuleModule} from "../types";
3
4
  *
4
5
  * @typedef {Object} Option
5
6
  * @property {"always" | "never"} [Option.selfClosing]
6
7
  * @property {string[]} [Option.selfClosingCustomPatterns]
7
- * @typedef { import("../types").RuleModule<[Option]> } RuleModule
8
8
  */
9
9
 
10
10
  const { RULE_CATEGORY, VOID_ELEMENTS } = require("../constants");
@@ -20,7 +20,7 @@ const MESSAGE_IDS = {
20
20
  };
21
21
 
22
22
  /**
23
- * @type {RuleModule}
23
+ * @type {RuleModule<[Option]>}
24
24
  */
25
25
  module.exports = {
26
26
  meta: {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
2
+ * @import {RuleModule} from "../types";
3
3
  */
4
4
 
5
5
  const { RULE_CATEGORY } = require("../constants");
@@ -10,7 +10,7 @@ const MESSAGE_IDS = {
10
10
  };
11
11
 
12
12
  /**
13
- * @type {RuleModule}
13
+ * @type {RuleModule<[]>}
14
14
  */
15
15
  module.exports = {
16
16
  meta: {
@@ -1,12 +1,9 @@
1
1
  /**
2
- * @typedef { import("@html-eslint/types").Tag } Tag
3
- * @typedef { import("@html-eslint/types").AnyNode } AnyNode
2
+ * @import {RuleModule} from "../types";
4
3
  *
5
4
  * @typedef {Object} Option
6
5
  * @property {string[]} [Option.allowClass]
7
6
  * @property {string[]} [Option.allowId]
8
- * @typedef { import("../types").RuleModule<[Option]> } RuleModule
9
- *
10
7
  */
11
8
 
12
9
  const { RULE_CATEGORY } = require("../constants");
@@ -22,7 +19,7 @@ const MESSAGE_IDS = {
22
19
  const TARGET_ELEMENTS = ["img", "iframe"];
23
20
 
24
21
  /**
25
- * @type {RuleModule}
22
+ * @type {RuleModule<[Option]>}
26
23
  */
27
24
  module.exports = {
28
25
  meta: {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
2
+ * @import {RuleModule} from "../types";
3
3
  */
4
4
 
5
5
  const { NODE_TYPES } = require("@html-eslint/parser");
@@ -17,7 +17,7 @@ const MESSAGE_IDS = {
17
17
  const ALLOWED_METHODS = new Set(["GET", "POST", "DIALOG"]);
18
18
 
19
19
  /**
20
- * @type {RuleModule}
20
+ * @type {RuleModule<[]>}
21
21
  */
22
22
  module.exports = {
23
23
  meta: {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
2
+ * @import {RuleModule} from "../types";
3
3
  */
4
4
 
5
5
  const { RULE_CATEGORY } = require("../constants");
@@ -13,7 +13,7 @@ const MESSAGE_IDS = {
13
13
  };
14
14
 
15
15
  /**
16
- * @type {RuleModule}
16
+ * @type {RuleModule<[]>}
17
17
  */
18
18
  module.exports = {
19
19
  meta: {
@@ -1,10 +1,9 @@
1
1
  /**
2
- * @typedef { import("@html-eslint/types").Tag } Tag
2
+ * @import {Tag} from "@html-eslint/types";
3
+ * @import {RuleModule} from "../types";
3
4
  *
4
5
  * @typedef {Object} Option
5
6
  * @property {string[]} [substitute]
6
- *
7
- * @typedef { import("../types").RuleModule<[Option]> } RuleModule
8
7
  */
9
8
 
10
9
  const { RULE_CATEGORY } = require("../constants");
@@ -17,7 +16,7 @@ const MESSAGE_IDS = {
17
16
  };
18
17
 
19
18
  /**
20
- * @type {RuleModule}
19
+ * @type {RuleModule<[Option]>}
21
20
  */
22
21
  module.exports = {
23
22
  meta: {
@@ -43,6 +42,7 @@ module.exports = {
43
42
  },
44
43
  },
45
44
  },
45
+ additionalProperties: false,
46
46
  },
47
47
  ],
48
48
  messages: {
@@ -1,6 +1,6 @@
1
1
  /**
2
- * @typedef { import("@html-eslint/types").Tag } Tag
3
- * @typedef { import("../types").RuleModule<[]> } RuleModule
2
+ * @import {RuleModule} from "../types";
3
+ * @import {Tag} from "@html-eslint/types";
4
4
  */
5
5
 
6
6
  const { RULE_CATEGORY } = require("../constants");
@@ -17,7 +17,7 @@ const INPUT_TAGS = new Set(["input", "textarea", "select"]);
17
17
  const LABEL_ATTRIBUTES = new Set(["id", "aria-labelledby", "aria-label"]);
18
18
 
19
19
  /**
20
- * @type {RuleModule}
20
+ * @type {RuleModule<[]>}
21
21
  */
22
22
  module.exports = {
23
23
  meta: {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
2
+ * @import {RuleModule} from "../types";
3
3
  */
4
4
 
5
5
  const { RULE_CATEGORY } = require("../constants");
@@ -13,7 +13,7 @@ const MESSAGE_IDS = {
13
13
  };
14
14
 
15
15
  /**
16
- * @type {RuleModule}
16
+ * @type {RuleModule<[]>}
17
17
  */
18
18
  module.exports = {
19
19
  meta: {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule<[]> } RuleModule
2
+ * @import {RuleModule} from "../types";
3
3
  */
4
4
 
5
5
  const { NODE_TYPES } = require("@html-eslint/parser");
@@ -13,7 +13,7 @@ const MESSAGE_IDS = {
13
13
  const VALID_CONTAINERS = ["ul", "ol", "menu"];
14
14
 
15
15
  /**
16
- * @type {RuleModule}
16
+ * @type {RuleModule<[]>}
17
17
  */
18
18
  module.exports = {
19
19
  meta: {