@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.
Files changed (177) hide show
  1. package/lib/exports.ts +2 -0
  2. package/lib/index.js +6 -1
  3. package/lib/rules/attrs-newline.js +11 -7
  4. package/lib/rules/element-newline.js +25 -18
  5. package/lib/rules/id-naming-convention.js +10 -4
  6. package/lib/rules/indent/indent-level.js +1 -1
  7. package/lib/rules/indent/indent.js +26 -15
  8. package/lib/rules/lowercase.js +4 -4
  9. package/lib/rules/max-element-depth.js +8 -5
  10. package/lib/rules/no-abstract-roles.js +4 -4
  11. package/lib/rules/no-accesskey-attrs.js +4 -4
  12. package/lib/rules/no-aria-hidden-body.js +1 -1
  13. package/lib/rules/no-duplicate-attrs.js +4 -4
  14. package/lib/rules/no-duplicate-id.js +5 -5
  15. package/lib/rules/no-extra-spacing-attrs.js +18 -12
  16. package/lib/rules/no-extra-spacing-text.js +8 -5
  17. package/lib/rules/no-heading-inside-button.js +1 -1
  18. package/lib/rules/no-inline-styles.js +1 -1
  19. package/lib/rules/no-invalid-role.js +1 -1
  20. package/lib/rules/no-multiple-empty-lines.js +8 -5
  21. package/lib/rules/no-multiple-h1.js +2 -2
  22. package/lib/rules/no-nested-interactive.js +2 -2
  23. package/lib/rules/no-non-scalable-viewport.js +1 -1
  24. package/lib/rules/no-obsolete-tags.js +1 -1
  25. package/lib/rules/no-positive-tabindex.js +4 -4
  26. package/lib/rules/no-restricted-attr-values.js +5 -5
  27. package/lib/rules/no-restricted-attrs.js +8 -7
  28. package/lib/rules/no-script-style-type.js +4 -4
  29. package/lib/rules/no-skip-heading-levels.js +2 -2
  30. package/lib/rules/no-target-blank.js +1 -1
  31. package/lib/rules/no-trailing-spaces.js +3 -3
  32. package/lib/rules/prefer-https.js +5 -5
  33. package/lib/rules/quotes.js +7 -5
  34. package/lib/rules/require-attrs.js +7 -5
  35. package/lib/rules/require-button-type.js +1 -1
  36. package/lib/rules/require-closing-tags.js +6 -2
  37. package/lib/rules/require-doctype.js +1 -1
  38. package/lib/rules/require-explicit-size.js +8 -3
  39. package/lib/rules/require-form-method.js +1 -1
  40. package/lib/rules/require-frame-title.js +1 -1
  41. package/lib/rules/require-img-alt.js +9 -8
  42. package/lib/rules/require-input-label.js +2 -2
  43. package/lib/rules/require-lang.js +4 -7
  44. package/lib/rules/require-li-container.js +1 -1
  45. package/lib/rules/require-meta-charset.js +3 -3
  46. package/lib/rules/require-meta-description.js +3 -3
  47. package/lib/rules/require-meta-viewport.js +3 -3
  48. package/lib/rules/require-open-graph-protocol.js +6 -3
  49. package/lib/rules/require-title.js +4 -4
  50. package/lib/rules/sort-attrs.js +11 -11
  51. package/lib/rules/utils/node.js +23 -23
  52. package/lib/rules/utils/settings.js +3 -3
  53. package/lib/rules/utils/source-code.js +1 -1
  54. package/lib/rules/utils/visitors.js +1 -1
  55. package/lib/types/ast.ts +17 -0
  56. package/lib/types/{rule.d.ts → rule.ts} +41 -10
  57. package/package.json +12 -19
  58. package/types/exports.d.ts +3 -0
  59. package/types/exports.d.ts.map +1 -0
  60. package/types/index.d.ts +80 -5
  61. package/types/index.d.ts.map +1 -1
  62. package/types/rules/attrs-newline.d.ts +7 -3
  63. package/types/rules/attrs-newline.d.ts.map +1 -1
  64. package/types/rules/element-newline.d.ts +17 -11
  65. package/types/rules/element-newline.d.ts.map +1 -1
  66. package/types/rules/id-naming-convention.d.ts +10 -5
  67. package/types/rules/id-naming-convention.d.ts.map +1 -1
  68. package/types/rules/indent/indent-level.d.ts +2 -2
  69. package/types/rules/indent/indent-level.d.ts.map +1 -1
  70. package/types/rules/indent/indent.d.ts +15 -9
  71. package/types/rules/indent/indent.d.ts.map +1 -1
  72. package/types/rules/index.d.ts +64 -47
  73. package/types/rules/lowercase.d.ts +5 -5
  74. package/types/rules/lowercase.d.ts.map +1 -1
  75. package/types/rules/max-element-depth.d.ts +8 -5
  76. package/types/rules/max-element-depth.d.ts.map +1 -1
  77. package/types/rules/no-abstract-roles.d.ts +5 -5
  78. package/types/rules/no-abstract-roles.d.ts.map +1 -1
  79. package/types/rules/no-accesskey-attrs.d.ts +5 -5
  80. package/types/rules/no-accesskey-attrs.d.ts.map +1 -1
  81. package/types/rules/no-aria-hidden-body.d.ts +1 -1
  82. package/types/rules/no-aria-hidden-body.d.ts.map +1 -1
  83. package/types/rules/no-duplicate-attrs.d.ts +5 -5
  84. package/types/rules/no-duplicate-attrs.d.ts.map +1 -1
  85. package/types/rules/no-duplicate-id.d.ts +6 -6
  86. package/types/rules/no-duplicate-id.d.ts.map +1 -1
  87. package/types/rules/no-extra-spacing-attrs.d.ts +19 -13
  88. package/types/rules/no-extra-spacing-attrs.d.ts.map +1 -1
  89. package/types/rules/no-extra-spacing-text.d.ts +9 -6
  90. package/types/rules/no-extra-spacing-text.d.ts.map +1 -1
  91. package/types/rules/no-heading-inside-button.d.ts +1 -1
  92. package/types/rules/no-heading-inside-button.d.ts.map +1 -1
  93. package/types/rules/no-inline-styles.d.ts +1 -1
  94. package/types/rules/no-inline-styles.d.ts.map +1 -1
  95. package/types/rules/no-invalid-role.d.ts +1 -1
  96. package/types/rules/no-invalid-role.d.ts.map +1 -1
  97. package/types/rules/no-multiple-empty-lines.d.ts +8 -5
  98. package/types/rules/no-multiple-empty-lines.d.ts.map +1 -1
  99. package/types/rules/no-multiple-h1.d.ts +2 -2
  100. package/types/rules/no-multiple-h1.d.ts.map +1 -1
  101. package/types/rules/no-nested-interactive.d.ts +2 -2
  102. package/types/rules/no-nested-interactive.d.ts.map +1 -1
  103. package/types/rules/no-non-scalable-viewport.d.ts +1 -1
  104. package/types/rules/no-non-scalable-viewport.d.ts.map +1 -1
  105. package/types/rules/no-obsolete-tags.d.ts +1 -1
  106. package/types/rules/no-obsolete-tags.d.ts.map +1 -1
  107. package/types/rules/no-positive-tabindex.d.ts +4 -4
  108. package/types/rules/no-positive-tabindex.d.ts.map +1 -1
  109. package/types/rules/no-restricted-attr-values.d.ts +6 -6
  110. package/types/rules/no-restricted-attr-values.d.ts.map +1 -1
  111. package/types/rules/no-restricted-attrs.d.ts +6 -6
  112. package/types/rules/no-restricted-attrs.d.ts.map +1 -1
  113. package/types/rules/no-script-style-type.d.ts +4 -4
  114. package/types/rules/no-script-style-type.d.ts.map +1 -1
  115. package/types/rules/no-skip-heading-levels.d.ts +2 -2
  116. package/types/rules/no-skip-heading-levels.d.ts.map +1 -1
  117. package/types/rules/no-target-blank.d.ts +1 -1
  118. package/types/rules/no-target-blank.d.ts.map +1 -1
  119. package/types/rules/no-trailing-spaces.d.ts +3 -3
  120. package/types/rules/no-trailing-spaces.d.ts.map +1 -1
  121. package/types/rules/prefer-https.d.ts +5 -5
  122. package/types/rules/prefer-https.d.ts.map +1 -1
  123. package/types/rules/quotes.d.ts +7 -6
  124. package/types/rules/quotes.d.ts.map +1 -1
  125. package/types/rules/require-attrs.d.ts +6 -6
  126. package/types/rules/require-attrs.d.ts.map +1 -1
  127. package/types/rules/require-button-type.d.ts +1 -1
  128. package/types/rules/require-button-type.d.ts.map +1 -1
  129. package/types/rules/require-closing-tags.d.ts +7 -3
  130. package/types/rules/require-closing-tags.d.ts.map +1 -1
  131. package/types/rules/require-doctype.d.ts +1 -1
  132. package/types/rules/require-doctype.d.ts.map +1 -1
  133. package/types/rules/require-explicit-size.d.ts +8 -4
  134. package/types/rules/require-explicit-size.d.ts.map +1 -1
  135. package/types/rules/require-form-method.d.ts +1 -1
  136. package/types/rules/require-form-method.d.ts.map +1 -1
  137. package/types/rules/require-frame-title.d.ts +1 -1
  138. package/types/rules/require-frame-title.d.ts.map +1 -1
  139. package/types/rules/require-img-alt.d.ts +6 -3
  140. package/types/rules/require-img-alt.d.ts.map +1 -1
  141. package/types/rules/require-input-label.d.ts +3 -3
  142. package/types/rules/require-input-label.d.ts.map +1 -1
  143. package/types/rules/require-lang.d.ts +1 -1
  144. package/types/rules/require-lang.d.ts.map +1 -1
  145. package/types/rules/require-li-container.d.ts +1 -1
  146. package/types/rules/require-li-container.d.ts.map +1 -1
  147. package/types/rules/require-meta-charset.d.ts +4 -4
  148. package/types/rules/require-meta-charset.d.ts.map +1 -1
  149. package/types/rules/require-meta-description.d.ts +4 -4
  150. package/types/rules/require-meta-description.d.ts.map +1 -1
  151. package/types/rules/require-meta-viewport.d.ts +4 -4
  152. package/types/rules/require-meta-viewport.d.ts.map +1 -1
  153. package/types/rules/require-open-graph-protocol.d.ts +5 -4
  154. package/types/rules/require-open-graph-protocol.d.ts.map +1 -1
  155. package/types/rules/require-title.d.ts +5 -5
  156. package/types/rules/require-title.d.ts.map +1 -1
  157. package/types/rules/sort-attrs.d.ts +8 -5
  158. package/types/rules/sort-attrs.d.ts.map +1 -1
  159. package/types/rules/utils/node.d.ts +28 -28
  160. package/types/rules/utils/node.d.ts.map +1 -1
  161. package/types/rules/utils/settings.d.ts +3 -3
  162. package/types/rules/utils/settings.d.ts.map +1 -1
  163. package/types/rules/utils/source-code.d.ts +8 -3
  164. package/types/rules/utils/source-code.d.ts.map +1 -1
  165. package/types/rules/utils/visitors.d.ts +1 -1
  166. package/types/rules/utils/visitors.d.ts.map +1 -1
  167. package/types/types/ast.d.ts +16 -0
  168. package/types/types/ast.d.ts.map +1 -0
  169. package/types/types/index.d.ts +4 -0
  170. package/types/types/index.d.ts.map +1 -0
  171. package/types/types/rule.d.ts +97 -0
  172. package/types/types/rule.d.ts.map +1 -0
  173. package/types/types/settings.d.ts +13 -0
  174. package/types/types/settings.d.ts.map +1 -0
  175. package/lib/types/ast.d.ts +0 -213
  176. package/lib/types/{index.d.ts → index.ts} +1 -1
  177. /package/lib/types/{settings.d.ts → settings.ts} +0 -0
@@ -1,10 +1,12 @@
1
1
  /**
2
2
  * @typedef { import("eslint").AST.Range } Range
3
- * @typedef { import("../types").RuleModule } RuleModule
4
- * @typedef { import("../types").Attribute } Attribute
5
- * @typedef { import("../types").Tag } Tag
6
- * @typedef { import("../types").ScriptTag } ScriptTag
7
- * @typedef { import("../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
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("../types").RuleModule } RuleModule
3
- * @typedef { import("../types").Tag } Tag
4
- * @typedef { import("../types").ScriptTag } ScriptTag
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 | undefined} value
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,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");
@@ -1,6 +1,10 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule } RuleModule
3
- * @typedef { import("../types").Tag } Tag
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,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");
@@ -1,7 +1,12 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule } RuleModule
3
- * @typedef { import("../types").Tag } Tag
4
- * @typedef { import("../types").AnyNode } AnyNode
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,5 +1,5 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule } RuleModule
2
+ * @typedef { import("../types").RuleModule<[]> } RuleModule
3
3
  */
4
4
 
5
5
  const { NodeTypes } = require("es-html-parser");
@@ -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");
@@ -1,6 +1,10 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule } RuleModule
3
- * @typedef { import("../types").Tag } Tag
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
- node: {
60
- loc: {
61
- start: node.openStart.loc.start,
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("../types").RuleModule } RuleModule
3
- * @typedef { import("../types").Tag } Tag
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
- node: {
45
- loc: {
46
- start: node.openStart.loc.start,
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,5 +1,5 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule } RuleModule
2
+ * @typedef { import("../types").RuleModule<[]> } RuleModule
3
3
  */
4
4
 
5
5
  const { NODE_TYPES } = require("@html-eslint/parser");
@@ -1,7 +1,7 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule } RuleModule
3
- * @typedef { import("../types").Tag } Tag
4
- * @typedef { import("../types").AnyNode } AnyNode
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("../types").RuleModule } RuleModule
3
- * @typedef { import("../types").Tag } Tag
4
- * @typedef { import("../types").AnyNode } AnyNode
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("../types").RuleModule } RuleModule
3
- * @typedef { import("../types").Tag } Tag
4
- * @typedef { import("../types").AnyNode } AnyNode
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("../types").RuleModule } RuleModule
3
- * @typedef { import("../types").Tag } Tag
4
- * @typedef { import("../types").AnyNode } AnyNode
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("../types").RuleModule } RuleModule
3
- * @typedef { import("../types").Tag } Tag
4
- * @typedef { import("../types").Text } Text
5
- * @typedef { import("../types").AnyNode } AnyNode
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");
@@ -1,8 +1,11 @@
1
1
  /**
2
- * @typedef { import("eslint").Rule.RuleFixer } RuleFixer
3
- * @typedef { import("../types").RuleModule } RuleModule
4
- * @typedef { import("../types").Attribute } Attribute
5
- * @typedef { import("../types").Text } Text
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
- node: {
169
- range: [first.range[0], last.range[1]],
170
- loc: {
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) {
@@ -1,23 +1,22 @@
1
1
  /**
2
- * @typedef { import("../../types").Attribute } Attribute
3
- * @typedef { import("../../types").Tag } Tag
4
- * @typedef { import("../../types").ScriptTag } ScriptTag
5
- * @typedef { import("../../types").StyleTag } StyleTag
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").Text } Text
8
- * @typedef { import("../../types").CommentContent } CommentContent
9
- * @typedef { import("../../types").Comment } Comment
10
- * @typedef { import("../../types").AnyNode } AnyNode
11
- * @typedef { import("../../types").AttributeValue } AttributeValue
12
- * @typedef { import("../../types").AttributeKey } AttributeKey
13
- * @typedef { import("../../types").TemplateText } TemplateText
14
- * @typedef { import("../../types").OpenTemplate } OpenTemplate
15
- * @typedef { import("../../types").CloseTemplate } CloseTemplate
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 {AnyNode} node
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 {AnyNode} node
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 {AnyNode} node
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 {AnyNode} node
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 {AnyNode} node
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 {AnyNode | Line | TemplateText | OpenTemplate | CloseTemplate } node
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 {Exclude<AnyNode, Line>} node
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("../../types").TaggedTemplateExpression} TaggedTemplateExpression
6
- * @typedef {import("../../types").TemplateLiteral} TemplateLiteral
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");
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @typedef {import("../../types").Context} Context
2
+ * @typedef {import("../../types").Context<any[]>} Context
3
3
  */
4
4
 
5
5
  /**
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @typedef { import("../../types").Context } Context
2
+ * @typedef { import("../../types").Context<any[]> } Context
3
3
  * @typedef { import("../../types").RuleListener } RuleListener
4
4
  */
5
5
 
@@ -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 "./ast";
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?: ESLint.AST.SourceLocation;
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 Omit<ESLint.Rule.RuleContext, "report"> {
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 eslint.Rule.RuleModule {
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.0",
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/index.d.ts",
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 -p ./tsconfig.build.json"
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.0",
49
- "@html-eslint/template-syntax-parser": "^0.35.0"
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.0",
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.0",
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": "2493a6a72eba5e4fca3be33897050a4ea29712dd"
53
+ "gitHead": "d367b20d5822e66a88aed100f7a3e67bb9e1b2f0"
61
54
  }
@@ -0,0 +1,3 @@
1
+ import plugin = require("./index");
2
+ export default plugin;
3
+ //# sourceMappingURL=exports.d.ts.map
@@ -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"}