@herb-tools/linter 0.8.9 → 0.9.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 (573) hide show
  1. package/README.md +5 -5
  2. package/dist/{src/cli → cli}/argument-parser.js +15 -2
  3. package/dist/cli/argument-parser.js.map +1 -0
  4. package/dist/{src/cli → cli}/file-processor.js +155 -9
  5. package/dist/cli/file-processor.js.map +1 -0
  6. package/dist/cli/file-url.js +6 -0
  7. package/dist/cli/file-url.js.map +1 -0
  8. package/dist/cli/formatters/base-formatter.js.map +1 -0
  9. package/dist/{src/cli → cli}/formatters/detailed-formatter.js +16 -19
  10. package/dist/cli/formatters/detailed-formatter.js.map +1 -0
  11. package/dist/cli/formatters/github-actions-formatter.js.map +1 -0
  12. package/dist/cli/formatters/index.js.map +1 -0
  13. package/dist/cli/formatters/json-formatter.js.map +1 -0
  14. package/dist/cli/formatters/simple-formatter.js +54 -0
  15. package/dist/cli/formatters/simple-formatter.js.map +1 -0
  16. package/dist/cli/index.js.map +1 -0
  17. package/dist/cli/lint-worker.js +143 -0
  18. package/dist/cli/lint-worker.js.map +1 -0
  19. package/dist/cli/output-manager.js.map +1 -0
  20. package/dist/{src/cli → cli}/summary-reporter.js +13 -16
  21. package/dist/cli/summary-reporter.js.map +1 -0
  22. package/dist/{src/cli.js → cli.js} +5 -3
  23. package/dist/cli.js.map +1 -0
  24. package/dist/{src/custom-rule-loader.js → custom-rule-loader.js} +20 -4
  25. package/dist/custom-rule-loader.js.map +1 -0
  26. package/dist/herb-disable-comment-utils.js.map +1 -0
  27. package/dist/herb-lint.js +60648 -17513
  28. package/dist/herb-lint.js.map +1 -1
  29. package/dist/index.cjs +2621 -934
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.js +2554 -873
  32. package/dist/index.js.map +1 -1
  33. package/dist/lint-worker.js +71462 -0
  34. package/dist/lint-worker.js.map +1 -0
  35. package/dist/linter-ignore.js.map +1 -0
  36. package/dist/{src/linter.js → linter.js} +89 -74
  37. package/dist/linter.js.map +1 -0
  38. package/dist/loader.cjs +31206 -7834
  39. package/dist/loader.cjs.map +1 -1
  40. package/dist/loader.js +31168 -7802
  41. package/dist/loader.js.map +1 -1
  42. package/dist/parse-cache.js +30 -0
  43. package/dist/parse-cache.js.map +1 -0
  44. package/dist/rules/actionview-no-silent-helper.js +45 -0
  45. package/dist/rules/actionview-no-silent-helper.js.map +1 -0
  46. package/dist/{src/rules → rules}/erb-comment-syntax.js +2 -2
  47. package/dist/rules/erb-comment-syntax.js.map +1 -0
  48. package/dist/{src/rules → rules}/erb-no-case-node-children.js +2 -2
  49. package/dist/rules/erb-no-case-node-children.js.map +1 -0
  50. package/dist/rules/erb-no-conditional-html-element.js +38 -0
  51. package/dist/rules/erb-no-conditional-html-element.js.map +1 -0
  52. package/dist/rules/erb-no-conditional-open-tag.js +24 -0
  53. package/dist/rules/erb-no-conditional-open-tag.js.map +1 -0
  54. package/dist/rules/erb-no-duplicate-branch-elements.js +245 -0
  55. package/dist/rules/erb-no-duplicate-branch-elements.js.map +1 -0
  56. package/dist/{src/rules → rules}/erb-no-empty-tags.js +2 -2
  57. package/dist/rules/erb-no-empty-tags.js.map +1 -0
  58. package/dist/{src/rules → rules}/erb-no-extra-newline.js +4 -21
  59. package/dist/rules/erb-no-extra-newline.js.map +1 -0
  60. package/dist/{src/rules → rules}/erb-no-extra-whitespace-inside-tags.js +39 -13
  61. package/dist/rules/erb-no-extra-whitespace-inside-tags.js.map +1 -0
  62. package/dist/rules/erb-no-inline-case-conditions.js +40 -0
  63. package/dist/rules/erb-no-inline-case-conditions.js.map +1 -0
  64. package/dist/rules/erb-no-instance-variables-in-partials.js +67 -0
  65. package/dist/rules/erb-no-instance-variables-in-partials.js.map +1 -0
  66. package/dist/rules/erb-no-interpolated-class-names.js +47 -0
  67. package/dist/rules/erb-no-interpolated-class-names.js.map +1 -0
  68. package/dist/rules/erb-no-javascript-tag-helper.js +34 -0
  69. package/dist/rules/erb-no-javascript-tag-helper.js.map +1 -0
  70. package/dist/{src/rules → rules}/erb-no-output-control-flow.js +9 -12
  71. package/dist/rules/erb-no-output-control-flow.js.map +1 -0
  72. package/dist/rules/erb-no-output-in-attribute-name.js +30 -0
  73. package/dist/rules/erb-no-output-in-attribute-name.js.map +1 -0
  74. package/dist/rules/erb-no-output-in-attribute-position.js +30 -0
  75. package/dist/rules/erb-no-output-in-attribute-position.js.map +1 -0
  76. package/dist/rules/erb-no-raw-output-in-attribute-value.js +35 -0
  77. package/dist/rules/erb-no-raw-output-in-attribute-value.js.map +1 -0
  78. package/dist/{src/rules → rules}/erb-no-silent-tag-in-attribute-name.js +2 -2
  79. package/dist/rules/erb-no-silent-tag-in-attribute-name.js.map +1 -0
  80. package/dist/rules/erb-no-statement-in-script.js +58 -0
  81. package/dist/rules/erb-no-statement-in-script.js.map +1 -0
  82. package/dist/rules/erb-no-then-in-control-flow.js +45 -0
  83. package/dist/rules/erb-no-then-in-control-flow.js.map +1 -0
  84. package/dist/rules/erb-no-trailing-whitespace.js +138 -0
  85. package/dist/rules/erb-no-trailing-whitespace.js.map +1 -0
  86. package/dist/rules/erb-no-unsafe-js-attribute.js +36 -0
  87. package/dist/rules/erb-no-unsafe-js-attribute.js.map +1 -0
  88. package/dist/rules/erb-no-unsafe-raw.js +63 -0
  89. package/dist/rules/erb-no-unsafe-raw.js.map +1 -0
  90. package/dist/rules/erb-no-unsafe-script-interpolation.js +54 -0
  91. package/dist/rules/erb-no-unsafe-script-interpolation.js.map +1 -0
  92. package/dist/{src/rules → rules}/erb-prefer-image-tag-helper.js +5 -4
  93. package/dist/rules/erb-prefer-image-tag-helper.js.map +1 -0
  94. package/dist/{src/rules → rules}/erb-require-trailing-newline.js +2 -2
  95. package/dist/rules/erb-require-trailing-newline.js.map +1 -0
  96. package/dist/{src/rules → rules}/erb-require-whitespace-inside-tags.js +39 -15
  97. package/dist/rules/erb-require-whitespace-inside-tags.js.map +1 -0
  98. package/dist/{src/rules → rules}/erb-right-trim.js +2 -2
  99. package/dist/rules/erb-right-trim.js.map +1 -0
  100. package/dist/{src/rules → rules}/erb-strict-locals-comment-syntax.js +5 -5
  101. package/dist/rules/erb-strict-locals-comment-syntax.js.map +1 -0
  102. package/dist/{src/rules → rules}/erb-strict-locals-required.js +2 -2
  103. package/dist/rules/erb-strict-locals-required.js.map +1 -0
  104. package/dist/rules/file-utils.js.map +1 -0
  105. package/dist/rules/herb-disable-comment-base.js.map +1 -0
  106. package/dist/{src/rules → rules}/herb-disable-comment-malformed.js +2 -2
  107. package/dist/rules/herb-disable-comment-malformed.js.map +1 -0
  108. package/dist/{src/rules → rules}/herb-disable-comment-missing-rules.js +2 -2
  109. package/dist/rules/herb-disable-comment-missing-rules.js.map +1 -0
  110. package/dist/{src/rules → rules}/herb-disable-comment-no-duplicate-rules.js +2 -2
  111. package/dist/rules/herb-disable-comment-no-duplicate-rules.js.map +1 -0
  112. package/dist/{src/rules → rules}/herb-disable-comment-no-redundant-all.js +2 -2
  113. package/dist/rules/herb-disable-comment-no-redundant-all.js.map +1 -0
  114. package/dist/{src/rules → rules}/herb-disable-comment-unnecessary.js +2 -2
  115. package/dist/rules/herb-disable-comment-unnecessary.js.map +1 -0
  116. package/dist/{src/rules → rules}/herb-disable-comment-valid-rule-name.js +2 -2
  117. package/dist/rules/herb-disable-comment-valid-rule-name.js.map +1 -0
  118. package/dist/rules/html-allowed-script-type.js +57 -0
  119. package/dist/rules/html-allowed-script-type.js.map +1 -0
  120. package/dist/rules/html-anchor-require-href.js +68 -0
  121. package/dist/rules/html-anchor-require-href.js.map +1 -0
  122. package/dist/{src/rules → rules}/html-aria-attribute-must-be-valid.js +3 -3
  123. package/dist/rules/html-aria-attribute-must-be-valid.js.map +1 -0
  124. package/dist/{src/rules → rules}/html-aria-label-is-well-formatted.js +3 -3
  125. package/dist/rules/html-aria-label-is-well-formatted.js.map +1 -0
  126. package/dist/{src/rules → rules}/html-aria-level-must-be-valid.js +3 -3
  127. package/dist/rules/html-aria-level-must-be-valid.js.map +1 -0
  128. package/dist/{src/rules → rules}/html-aria-role-heading-requires-level.js +5 -4
  129. package/dist/rules/html-aria-role-heading-requires-level.js.map +1 -0
  130. package/dist/{src/rules → rules}/html-aria-role-must-be-valid.js +3 -3
  131. package/dist/rules/html-aria-role-must-be-valid.js.map +1 -0
  132. package/dist/{src/rules → rules}/html-attribute-double-quotes.js +4 -4
  133. package/dist/rules/html-attribute-double-quotes.js.map +1 -0
  134. package/dist/{src/rules → rules}/html-attribute-equals-spacing.js +2 -2
  135. package/dist/rules/html-attribute-equals-spacing.js.map +1 -0
  136. package/dist/{src/rules → rules}/html-attribute-values-require-quotes.js +2 -2
  137. package/dist/rules/html-attribute-values-require-quotes.js.map +1 -0
  138. package/dist/{src/rules → rules}/html-avoid-both-disabled-and-aria-disabled.js +9 -9
  139. package/dist/rules/html-avoid-both-disabled-and-aria-disabled.js.map +1 -0
  140. package/dist/{src/rules → rules}/html-body-only-elements.js +5 -4
  141. package/dist/rules/html-body-only-elements.js.map +1 -0
  142. package/dist/{src/rules → rules}/html-boolean-attributes-no-value.js +4 -3
  143. package/dist/rules/html-boolean-attributes-no-value.js.map +1 -0
  144. package/dist/rules/html-details-has-summary.js +52 -0
  145. package/dist/rules/html-details-has-summary.js.map +1 -0
  146. package/dist/{src/rules → rules}/html-head-only-elements.js +6 -5
  147. package/dist/rules/html-head-only-elements.js.map +1 -0
  148. package/dist/{src/rules → rules}/html-iframe-has-title.js +8 -11
  149. package/dist/rules/html-iframe-has-title.js.map +1 -0
  150. package/dist/{src/rules → rules}/html-img-require-alt.js +11 -5
  151. package/dist/rules/html-img-require-alt.js.map +1 -0
  152. package/dist/{src/rules → rules}/html-input-require-autocomplete.js +7 -10
  153. package/dist/rules/html-input-require-autocomplete.js.map +1 -0
  154. package/dist/{src/rules → rules}/html-navigation-has-label.js +6 -5
  155. package/dist/rules/html-navigation-has-label.js.map +1 -0
  156. package/dist/rules/html-no-abstract-roles.js +29 -0
  157. package/dist/rules/html-no-abstract-roles.js.map +1 -0
  158. package/dist/rules/html-no-aria-hidden-on-body.js +42 -0
  159. package/dist/rules/html-no-aria-hidden-on-body.js.map +1 -0
  160. package/dist/{src/rules → rules}/html-no-aria-hidden-on-focusable.js +6 -5
  161. package/dist/rules/html-no-aria-hidden-on-focusable.js.map +1 -0
  162. package/dist/{src/rules → rules}/html-no-block-inside-inline.js +6 -9
  163. package/dist/rules/html-no-block-inside-inline.js.map +1 -0
  164. package/dist/{src/rules → rules}/html-no-duplicate-attributes.js +4 -3
  165. package/dist/rules/html-no-duplicate-attributes.js.map +1 -0
  166. package/dist/{src/rules → rules}/html-no-duplicate-ids.js +14 -11
  167. package/dist/rules/html-no-duplicate-ids.js.map +1 -0
  168. package/dist/{src/rules → rules}/html-no-duplicate-meta-names.js +22 -20
  169. package/dist/rules/html-no-duplicate-meta-names.js.map +1 -0
  170. package/dist/{src/rules → rules}/html-no-empty-attributes.js +2 -2
  171. package/dist/rules/html-no-empty-attributes.js.map +1 -0
  172. package/dist/rules/html-no-empty-headings.js +98 -0
  173. package/dist/rules/html-no-empty-headings.js.map +1 -0
  174. package/dist/{src/rules → rules}/html-no-nested-links.js +23 -15
  175. package/dist/rules/html-no-nested-links.js.map +1 -0
  176. package/dist/{src/rules → rules}/html-no-positive-tab-index.js +3 -3
  177. package/dist/rules/html-no-positive-tab-index.js.map +1 -0
  178. package/dist/{src/rules → rules}/html-no-self-closing.js +4 -4
  179. package/dist/rules/html-no-self-closing.js.map +1 -0
  180. package/dist/{src/rules → rules}/html-no-space-in-tag.js +4 -6
  181. package/dist/rules/html-no-space-in-tag.js.map +1 -0
  182. package/dist/{src/rules → rules}/html-no-title-attribute.js +6 -5
  183. package/dist/rules/html-no-title-attribute.js.map +1 -0
  184. package/dist/{src/rules → rules}/html-no-underscores-in-attribute-names.js +2 -2
  185. package/dist/rules/html-no-underscores-in-attribute-names.js.map +1 -0
  186. package/dist/rules/html-require-closing-tags.js +29 -0
  187. package/dist/rules/html-require-closing-tags.js.map +1 -0
  188. package/dist/{src/rules → rules}/html-tag-name-lowercase.js +13 -9
  189. package/dist/rules/html-tag-name-lowercase.js.map +1 -0
  190. package/dist/{src/rules → rules}/index.js +19 -0
  191. package/dist/rules/index.js.map +1 -0
  192. package/dist/{src/rules → rules}/parser-no-errors.js +3 -3
  193. package/dist/rules/parser-no-errors.js.map +1 -0
  194. package/dist/{src/rules → rules}/rule-utils.js +141 -219
  195. package/dist/rules/rule-utils.js.map +1 -0
  196. package/dist/rules/string-utils.js.map +1 -0
  197. package/dist/{src/rules → rules}/svg-tag-name-capitalization.js +7 -6
  198. package/dist/rules/svg-tag-name-capitalization.js.map +1 -0
  199. package/dist/rules/turbo-permanent-require-id.js +34 -0
  200. package/dist/rules/turbo-permanent-require-id.js.map +1 -0
  201. package/dist/{src/rules.js → rules.js} +56 -10
  202. package/dist/rules.js.map +1 -0
  203. package/dist/types/cli/argument-parser.d.ts +1 -0
  204. package/dist/types/cli/file-processor.d.ts +13 -0
  205. package/dist/types/cli/file-url.d.ts +1 -0
  206. package/dist/types/cli/index.d.ts +1 -0
  207. package/dist/types/cli/lint-worker.d.ts +34 -0
  208. package/dist/types/custom-rule-loader.d.ts +4 -0
  209. package/dist/types/index.d.ts +1 -0
  210. package/dist/types/linter.d.ts +13 -6
  211. package/dist/types/parse-cache.d.ts +9 -0
  212. package/dist/types/{src/rules/html-aria-level-must-be-valid.d.ts → rules/actionview-no-silent-helper.d.ts} +4 -3
  213. package/dist/types/rules/erb-comment-syntax.d.ts +1 -1
  214. package/dist/types/rules/erb-no-case-node-children.d.ts +1 -1
  215. package/dist/types/{src/rules/herb-disable-comment-malformed.d.ts → rules/erb-no-conditional-html-element.d.ts} +3 -3
  216. package/dist/types/{src/rules/erb-prefer-image-tag-helper.d.ts → rules/erb-no-conditional-open-tag.d.ts} +3 -3
  217. package/dist/types/rules/erb-no-duplicate-branch-elements.d.ts +17 -0
  218. package/dist/types/rules/erb-no-empty-tags.d.ts +1 -1
  219. package/dist/types/rules/erb-no-extra-newline.d.ts +1 -1
  220. package/dist/types/rules/erb-no-extra-whitespace-inside-tags.d.ts +1 -1
  221. package/dist/types/{src/rules/html-no-duplicate-attributes.d.ts → rules/erb-no-inline-case-conditions.d.ts} +4 -3
  222. package/dist/types/rules/erb-no-instance-variables-in-partials.d.ts +10 -0
  223. package/dist/types/{src/rules/html-no-aria-hidden-on-focusable.d.ts → rules/erb-no-interpolated-class-names.d.ts} +2 -2
  224. package/dist/types/{src/rules/html-aria-attribute-must-be-valid.d.ts → rules/erb-no-javascript-tag-helper.d.ts} +2 -2
  225. package/dist/types/rules/erb-no-output-control-flow.d.ts +1 -1
  226. package/dist/types/{src/rules/erb-no-silent-tag-in-attribute-name.d.ts → rules/erb-no-output-in-attribute-name.d.ts} +2 -2
  227. package/dist/types/{src/rules/herb-disable-comment-missing-rules.d.ts → rules/erb-no-output-in-attribute-position.d.ts} +2 -2
  228. package/dist/types/{src/rules/erb-no-empty-tags.d.ts → rules/erb-no-raw-output-in-attribute-value.d.ts} +2 -2
  229. package/dist/types/rules/erb-no-silent-tag-in-attribute-name.d.ts +1 -1
  230. package/dist/types/{src/rules/html-navigation-has-label.d.ts → rules/erb-no-statement-in-script.d.ts} +2 -2
  231. package/dist/types/rules/erb-no-then-in-control-flow.d.ts +9 -0
  232. package/dist/types/rules/erb-no-trailing-whitespace.d.ts +19 -0
  233. package/dist/types/{src/rules/html-no-positive-tab-index.d.ts → rules/erb-no-unsafe-js-attribute.d.ts} +2 -2
  234. package/dist/types/{src/rules/erb-no-case-node-children.d.ts → rules/erb-no-unsafe-raw.d.ts} +2 -2
  235. package/dist/types/rules/erb-no-unsafe-script-interpolation.d.ts +8 -0
  236. package/dist/types/rules/erb-prefer-image-tag-helper.d.ts +1 -1
  237. package/dist/types/rules/erb-require-trailing-newline.d.ts +1 -1
  238. package/dist/types/rules/erb-require-whitespace-inside-tags.d.ts +1 -1
  239. package/dist/types/rules/erb-right-trim.d.ts +1 -1
  240. package/dist/types/rules/erb-strict-locals-comment-syntax.d.ts +1 -1
  241. package/dist/types/rules/erb-strict-locals-required.d.ts +1 -1
  242. package/dist/types/rules/herb-disable-comment-malformed.d.ts +1 -1
  243. package/dist/types/rules/herb-disable-comment-missing-rules.d.ts +1 -1
  244. package/dist/types/rules/herb-disable-comment-no-duplicate-rules.d.ts +1 -1
  245. package/dist/types/rules/herb-disable-comment-no-redundant-all.d.ts +1 -1
  246. package/dist/types/rules/herb-disable-comment-unnecessary.d.ts +1 -1
  247. package/dist/types/rules/herb-disable-comment-valid-rule-name.d.ts +1 -1
  248. package/dist/types/{src/rules/html-anchor-require-href.d.ts → rules/html-allowed-script-type.d.ts} +2 -2
  249. package/dist/types/rules/html-anchor-require-href.d.ts +3 -2
  250. package/dist/types/rules/html-aria-attribute-must-be-valid.d.ts +1 -1
  251. package/dist/types/rules/html-aria-label-is-well-formatted.d.ts +1 -1
  252. package/dist/types/rules/html-aria-level-must-be-valid.d.ts +1 -1
  253. package/dist/types/rules/html-aria-role-heading-requires-level.d.ts +1 -1
  254. package/dist/types/rules/html-aria-role-must-be-valid.d.ts +1 -1
  255. package/dist/types/rules/html-attribute-double-quotes.d.ts +1 -1
  256. package/dist/types/rules/html-attribute-equals-spacing.d.ts +1 -1
  257. package/dist/types/rules/html-attribute-values-require-quotes.d.ts +1 -1
  258. package/dist/types/rules/html-avoid-both-disabled-and-aria-disabled.d.ts +1 -1
  259. package/dist/types/rules/html-body-only-elements.d.ts +1 -1
  260. package/dist/types/rules/html-boolean-attributes-no-value.d.ts +1 -1
  261. package/dist/types/{src/rules/html-no-empty-attributes.d.ts → rules/html-details-has-summary.d.ts} +4 -3
  262. package/dist/types/rules/html-head-only-elements.d.ts +1 -1
  263. package/dist/types/rules/html-iframe-has-title.d.ts +1 -1
  264. package/dist/types/rules/html-img-require-alt.d.ts +1 -1
  265. package/dist/types/rules/html-input-require-autocomplete.d.ts +1 -1
  266. package/dist/types/rules/html-navigation-has-label.d.ts +1 -1
  267. package/dist/types/{src/rules/html-no-empty-headings.d.ts → rules/html-no-abstract-roles.d.ts} +2 -2
  268. package/dist/types/{src/rules/erb-no-output-control-flow.d.ts → rules/html-no-aria-hidden-on-body.d.ts} +3 -3
  269. package/dist/types/rules/html-no-aria-hidden-on-focusable.d.ts +1 -1
  270. package/dist/types/rules/html-no-block-inside-inline.d.ts +1 -1
  271. package/dist/types/rules/html-no-duplicate-attributes.d.ts +1 -1
  272. package/dist/types/rules/html-no-duplicate-ids.d.ts +1 -1
  273. package/dist/types/rules/html-no-duplicate-meta-names.d.ts +1 -1
  274. package/dist/types/rules/html-no-empty-attributes.d.ts +1 -1
  275. package/dist/types/rules/html-no-empty-headings.d.ts +1 -1
  276. package/dist/types/rules/html-no-nested-links.d.ts +1 -1
  277. package/dist/types/rules/html-no-positive-tab-index.d.ts +1 -1
  278. package/dist/types/rules/html-no-self-closing.d.ts +1 -1
  279. package/dist/types/rules/html-no-space-in-tag.d.ts +1 -1
  280. package/dist/types/rules/html-no-title-attribute.d.ts +1 -1
  281. package/dist/types/rules/html-no-underscores-in-attribute-names.d.ts +1 -1
  282. package/dist/types/{src/rules/html-body-only-elements.d.ts → rules/html-require-closing-tags.d.ts} +4 -3
  283. package/dist/types/rules/html-tag-name-lowercase.d.ts +1 -1
  284. package/dist/types/rules/index.d.ts +19 -0
  285. package/dist/types/rules/parser-no-errors.d.ts +1 -1
  286. package/dist/types/rules/rule-utils.d.ts +35 -88
  287. package/dist/types/rules/svg-tag-name-capitalization.d.ts +1 -1
  288. package/dist/types/{src/rules/html-aria-role-must-be-valid.d.ts → rules/turbo-permanent-require-id.d.ts} +2 -2
  289. package/dist/types/types.d.ts +25 -7
  290. package/dist/types/urls.d.ts +1 -0
  291. package/dist/{src/types.js → types.js} +53 -0
  292. package/dist/types.js.map +1 -0
  293. package/dist/urls.js +5 -0
  294. package/dist/urls.js.map +1 -0
  295. package/docs/rules/README.md +23 -2
  296. package/docs/rules/actionview-no-silent-helper.md +57 -0
  297. package/docs/rules/erb-no-conditional-html-element.md +90 -0
  298. package/docs/rules/erb-no-conditional-open-tag.md +130 -0
  299. package/docs/rules/erb-no-duplicate-branch-elements.md +98 -0
  300. package/docs/rules/erb-no-inline-case-conditions.md +85 -0
  301. package/docs/rules/erb-no-instance-variables-in-partials.md +43 -0
  302. package/docs/rules/erb-no-interpolated-class-names.md +57 -0
  303. package/docs/rules/erb-no-javascript-tag-helper.md +33 -0
  304. package/docs/rules/erb-no-output-in-attribute-name.md +38 -0
  305. package/docs/rules/erb-no-output-in-attribute-position.md +60 -0
  306. package/docs/rules/erb-no-raw-output-in-attribute-value.md +37 -0
  307. package/docs/rules/erb-no-statement-in-script.md +68 -0
  308. package/docs/rules/erb-no-then-in-control-flow.md +86 -0
  309. package/docs/rules/erb-no-trailing-whitespace.md +69 -0
  310. package/docs/rules/erb-no-unsafe-js-attribute.md +41 -0
  311. package/docs/rules/erb-no-unsafe-raw.md +47 -0
  312. package/docs/rules/erb-no-unsafe-script-interpolation.md +73 -0
  313. package/docs/rules/html-allowed-script-type.md +59 -0
  314. package/docs/rules/html-anchor-require-href.md +19 -6
  315. package/docs/rules/html-details-has-summary.md +46 -0
  316. package/docs/rules/html-img-require-alt.md +5 -3
  317. package/docs/rules/html-no-abstract-roles.md +74 -0
  318. package/docs/rules/html-no-aria-hidden-on-body.md +44 -0
  319. package/docs/rules/html-require-closing-tags.md +142 -0
  320. package/docs/rules/parser-no-errors.md +4 -17
  321. package/docs/rules/turbo-permanent-require-id.md +41 -0
  322. package/package.json +12 -11
  323. package/src/cli/argument-parser.ts +20 -2
  324. package/src/cli/file-processor.ts +189 -10
  325. package/src/cli/file-url.ts +6 -0
  326. package/src/cli/formatters/detailed-formatter.ts +19 -21
  327. package/src/cli/formatters/simple-formatter.ts +23 -13
  328. package/src/cli/index.ts +2 -0
  329. package/src/cli/lint-worker.ts +208 -0
  330. package/src/cli/summary-reporter.ts +14 -15
  331. package/src/cli.ts +5 -3
  332. package/src/custom-rule-loader.ts +20 -5
  333. package/src/herb-disable-comment-utils.ts +0 -3
  334. package/src/index.ts +1 -0
  335. package/src/linter.ts +98 -79
  336. package/src/parse-cache.ts +39 -0
  337. package/src/rules/actionview-no-silent-helper.ts +58 -0
  338. package/src/rules/erb-comment-syntax.ts +2 -2
  339. package/src/rules/erb-no-case-node-children.ts +2 -2
  340. package/src/rules/erb-no-conditional-html-element.ts +53 -0
  341. package/src/rules/erb-no-conditional-open-tag.ts +37 -0
  342. package/src/rules/erb-no-duplicate-branch-elements.ts +320 -0
  343. package/src/rules/erb-no-empty-tags.ts +2 -2
  344. package/src/rules/erb-no-extra-newline.ts +5 -25
  345. package/src/rules/erb-no-extra-whitespace-inside-tags.ts +45 -15
  346. package/src/rules/erb-no-inline-case-conditions.ts +54 -0
  347. package/src/rules/erb-no-instance-variables-in-partials.ts +101 -0
  348. package/src/rules/erb-no-interpolated-class-names.ts +65 -0
  349. package/src/rules/erb-no-javascript-tag-helper.ts +47 -0
  350. package/src/rules/erb-no-output-control-flow.ts +10 -10
  351. package/src/rules/erb-no-output-in-attribute-name.ts +39 -0
  352. package/src/rules/erb-no-output-in-attribute-position.ts +39 -0
  353. package/src/rules/erb-no-raw-output-in-attribute-value.ts +47 -0
  354. package/src/rules/erb-no-silent-tag-in-attribute-name.ts +2 -2
  355. package/src/rules/erb-no-statement-in-script.ts +82 -0
  356. package/src/rules/erb-no-then-in-control-flow.ts +62 -0
  357. package/src/rules/erb-no-trailing-whitespace.ts +187 -0
  358. package/src/rules/erb-no-unsafe-js-attribute.ts +47 -0
  359. package/src/rules/erb-no-unsafe-raw.ts +83 -0
  360. package/src/rules/erb-no-unsafe-script-interpolation.ts +76 -0
  361. package/src/rules/erb-prefer-image-tag-helper.ts +5 -4
  362. package/src/rules/erb-require-trailing-newline.ts +2 -2
  363. package/src/rules/erb-require-whitespace-inside-tags.ts +42 -18
  364. package/src/rules/erb-right-trim.ts +2 -2
  365. package/src/rules/erb-strict-locals-comment-syntax.ts +5 -5
  366. package/src/rules/erb-strict-locals-required.ts +2 -2
  367. package/src/rules/herb-disable-comment-malformed.ts +2 -2
  368. package/src/rules/herb-disable-comment-missing-rules.ts +2 -2
  369. package/src/rules/herb-disable-comment-no-duplicate-rules.ts +2 -2
  370. package/src/rules/herb-disable-comment-no-redundant-all.ts +2 -2
  371. package/src/rules/herb-disable-comment-unnecessary.ts +2 -2
  372. package/src/rules/herb-disable-comment-valid-rule-name.ts +2 -2
  373. package/src/rules/html-allowed-script-type.ts +84 -0
  374. package/src/rules/html-anchor-require-href.ts +73 -11
  375. package/src/rules/html-aria-attribute-must-be-valid.ts +3 -3
  376. package/src/rules/html-aria-label-is-well-formatted.ts +3 -3
  377. package/src/rules/html-aria-level-must-be-valid.ts +3 -3
  378. package/src/rules/html-aria-role-heading-requires-level.ts +5 -4
  379. package/src/rules/html-aria-role-must-be-valid.ts +3 -3
  380. package/src/rules/html-attribute-double-quotes.ts +4 -4
  381. package/src/rules/html-attribute-equals-spacing.ts +2 -2
  382. package/src/rules/html-attribute-values-require-quotes.ts +2 -2
  383. package/src/rules/html-avoid-both-disabled-and-aria-disabled.ts +10 -11
  384. package/src/rules/html-body-only-elements.ts +5 -4
  385. package/src/rules/html-boolean-attributes-no-value.ts +4 -3
  386. package/src/rules/html-details-has-summary.ts +69 -0
  387. package/src/rules/html-head-only-elements.ts +6 -5
  388. package/src/rules/html-iframe-has-title.ts +8 -11
  389. package/src/rules/html-img-require-alt.ts +16 -5
  390. package/src/rules/html-input-require-autocomplete.ts +7 -10
  391. package/src/rules/html-navigation-has-label.ts +6 -5
  392. package/src/rules/html-no-abstract-roles.ts +40 -0
  393. package/src/rules/html-no-aria-hidden-on-body.ts +58 -0
  394. package/src/rules/html-no-aria-hidden-on-focusable.ts +6 -5
  395. package/src/rules/html-no-block-inside-inline.ts +7 -13
  396. package/src/rules/html-no-duplicate-attributes.ts +4 -3
  397. package/src/rules/html-no-duplicate-ids.ts +16 -13
  398. package/src/rules/html-no-duplicate-meta-names.ts +20 -19
  399. package/src/rules/html-no-empty-attributes.ts +2 -2
  400. package/src/rules/html-no-empty-headings.ts +44 -58
  401. package/src/rules/html-no-nested-links.ts +25 -16
  402. package/src/rules/html-no-positive-tab-index.ts +3 -3
  403. package/src/rules/html-no-self-closing.ts +5 -5
  404. package/src/rules/html-no-space-in-tag.ts +5 -8
  405. package/src/rules/html-no-title-attribute.ts +6 -5
  406. package/src/rules/html-no-underscores-in-attribute-names.ts +2 -2
  407. package/src/rules/html-require-closing-tags.ts +41 -0
  408. package/src/rules/html-tag-name-lowercase.ts +14 -9
  409. package/src/rules/index.ts +19 -0
  410. package/src/rules/parser-no-errors.ts +3 -3
  411. package/src/rules/rule-utils.ts +162 -279
  412. package/src/rules/svg-tag-name-capitalization.ts +10 -10
  413. package/src/rules/turbo-permanent-require-id.ts +49 -0
  414. package/src/rules.ts +60 -10
  415. package/src/types.ts +76 -7
  416. package/src/urls.ts +5 -0
  417. package/dist/package.json +0 -65
  418. package/dist/src/cli/argument-parser.js.map +0 -1
  419. package/dist/src/cli/file-processor.js.map +0 -1
  420. package/dist/src/cli/formatters/base-formatter.js.map +0 -1
  421. package/dist/src/cli/formatters/detailed-formatter.js.map +0 -1
  422. package/dist/src/cli/formatters/github-actions-formatter.js.map +0 -1
  423. package/dist/src/cli/formatters/index.js.map +0 -1
  424. package/dist/src/cli/formatters/json-formatter.js.map +0 -1
  425. package/dist/src/cli/formatters/simple-formatter.js +0 -44
  426. package/dist/src/cli/formatters/simple-formatter.js.map +0 -1
  427. package/dist/src/cli/index.js.map +0 -1
  428. package/dist/src/cli/output-manager.js.map +0 -1
  429. package/dist/src/cli/summary-reporter.js.map +0 -1
  430. package/dist/src/cli.js.map +0 -1
  431. package/dist/src/custom-rule-loader.js.map +0 -1
  432. package/dist/src/herb-disable-comment-utils.js.map +0 -1
  433. package/dist/src/herb-lint.js +0 -5
  434. package/dist/src/herb-lint.js.map +0 -1
  435. package/dist/src/index.js +0 -5
  436. package/dist/src/index.js.map +0 -1
  437. package/dist/src/linter-ignore.js.map +0 -1
  438. package/dist/src/linter.js.map +0 -1
  439. package/dist/src/loader.js +0 -17
  440. package/dist/src/loader.js.map +0 -1
  441. package/dist/src/rules/erb-comment-syntax.js.map +0 -1
  442. package/dist/src/rules/erb-no-case-node-children.js.map +0 -1
  443. package/dist/src/rules/erb-no-empty-tags.js.map +0 -1
  444. package/dist/src/rules/erb-no-extra-newline.js.map +0 -1
  445. package/dist/src/rules/erb-no-extra-whitespace-inside-tags.js.map +0 -1
  446. package/dist/src/rules/erb-no-output-control-flow.js.map +0 -1
  447. package/dist/src/rules/erb-no-silent-tag-in-attribute-name.js.map +0 -1
  448. package/dist/src/rules/erb-prefer-image-tag-helper.js.map +0 -1
  449. package/dist/src/rules/erb-require-trailing-newline.js.map +0 -1
  450. package/dist/src/rules/erb-require-whitespace-inside-tags.js.map +0 -1
  451. package/dist/src/rules/erb-right-trim.js.map +0 -1
  452. package/dist/src/rules/erb-strict-locals-comment-syntax.js.map +0 -1
  453. package/dist/src/rules/erb-strict-locals-required.js.map +0 -1
  454. package/dist/src/rules/file-utils.js.map +0 -1
  455. package/dist/src/rules/herb-disable-comment-base.js.map +0 -1
  456. package/dist/src/rules/herb-disable-comment-malformed.js.map +0 -1
  457. package/dist/src/rules/herb-disable-comment-missing-rules.js.map +0 -1
  458. package/dist/src/rules/herb-disable-comment-no-duplicate-rules.js.map +0 -1
  459. package/dist/src/rules/herb-disable-comment-no-redundant-all.js.map +0 -1
  460. package/dist/src/rules/herb-disable-comment-unnecessary.js.map +0 -1
  461. package/dist/src/rules/herb-disable-comment-valid-rule-name.js.map +0 -1
  462. package/dist/src/rules/html-anchor-require-href.js +0 -32
  463. package/dist/src/rules/html-anchor-require-href.js.map +0 -1
  464. package/dist/src/rules/html-aria-attribute-must-be-valid.js.map +0 -1
  465. package/dist/src/rules/html-aria-label-is-well-formatted.js.map +0 -1
  466. package/dist/src/rules/html-aria-level-must-be-valid.js.map +0 -1
  467. package/dist/src/rules/html-aria-role-heading-requires-level.js.map +0 -1
  468. package/dist/src/rules/html-aria-role-must-be-valid.js.map +0 -1
  469. package/dist/src/rules/html-attribute-double-quotes.js.map +0 -1
  470. package/dist/src/rules/html-attribute-equals-spacing.js.map +0 -1
  471. package/dist/src/rules/html-attribute-values-require-quotes.js.map +0 -1
  472. package/dist/src/rules/html-avoid-both-disabled-and-aria-disabled.js.map +0 -1
  473. package/dist/src/rules/html-body-only-elements.js.map +0 -1
  474. package/dist/src/rules/html-boolean-attributes-no-value.js.map +0 -1
  475. package/dist/src/rules/html-head-only-elements.js.map +0 -1
  476. package/dist/src/rules/html-iframe-has-title.js.map +0 -1
  477. package/dist/src/rules/html-img-require-alt.js.map +0 -1
  478. package/dist/src/rules/html-input-require-autocomplete.js.map +0 -1
  479. package/dist/src/rules/html-navigation-has-label.js.map +0 -1
  480. package/dist/src/rules/html-no-aria-hidden-on-focusable.js.map +0 -1
  481. package/dist/src/rules/html-no-block-inside-inline.js.map +0 -1
  482. package/dist/src/rules/html-no-duplicate-attributes.js.map +0 -1
  483. package/dist/src/rules/html-no-duplicate-ids.js.map +0 -1
  484. package/dist/src/rules/html-no-duplicate-meta-names.js.map +0 -1
  485. package/dist/src/rules/html-no-empty-attributes.js.map +0 -1
  486. package/dist/src/rules/html-no-empty-headings.js +0 -115
  487. package/dist/src/rules/html-no-empty-headings.js.map +0 -1
  488. package/dist/src/rules/html-no-nested-links.js.map +0 -1
  489. package/dist/src/rules/html-no-positive-tab-index.js.map +0 -1
  490. package/dist/src/rules/html-no-self-closing.js.map +0 -1
  491. package/dist/src/rules/html-no-space-in-tag.js.map +0 -1
  492. package/dist/src/rules/html-no-title-attribute.js.map +0 -1
  493. package/dist/src/rules/html-no-underscores-in-attribute-names.js.map +0 -1
  494. package/dist/src/rules/html-tag-name-lowercase.js.map +0 -1
  495. package/dist/src/rules/index.js.map +0 -1
  496. package/dist/src/rules/parser-no-errors.js.map +0 -1
  497. package/dist/src/rules/rule-utils.js.map +0 -1
  498. package/dist/src/rules/string-utils.js.map +0 -1
  499. package/dist/src/rules/svg-tag-name-capitalization.js.map +0 -1
  500. package/dist/src/rules.js.map +0 -1
  501. package/dist/src/types.js.map +0 -1
  502. package/dist/tsconfig.tsbuildinfo +0 -1
  503. package/dist/types/src/cli/argument-parser.d.ts +0 -25
  504. package/dist/types/src/cli/file-processor.d.ts +0 -43
  505. package/dist/types/src/cli/formatters/base-formatter.d.ts +0 -6
  506. package/dist/types/src/cli/formatters/detailed-formatter.d.ts +0 -13
  507. package/dist/types/src/cli/formatters/github-actions-formatter.d.ts +0 -17
  508. package/dist/types/src/cli/formatters/index.d.ts +0 -5
  509. package/dist/types/src/cli/formatters/json-formatter.d.ts +0 -48
  510. package/dist/types/src/cli/formatters/simple-formatter.d.ts +0 -8
  511. package/dist/types/src/cli/index.d.ts +0 -5
  512. package/dist/types/src/cli/output-manager.d.ts +0 -32
  513. package/dist/types/src/cli/summary-reporter.d.ts +0 -28
  514. package/dist/types/src/cli.d.ts +0 -28
  515. package/dist/types/src/custom-rule-loader.d.ts +0 -62
  516. package/dist/types/src/herb-disable-comment-utils.d.ts +0 -69
  517. package/dist/types/src/herb-lint.d.ts +0 -2
  518. package/dist/types/src/index.d.ts +0 -4
  519. package/dist/types/src/linter-ignore.d.ts +0 -12
  520. package/dist/types/src/linter.d.ts +0 -133
  521. package/dist/types/src/loader.d.ts +0 -20
  522. package/dist/types/src/rules/erb-comment-syntax.d.ts +0 -14
  523. package/dist/types/src/rules/erb-no-extra-newline.d.ts +0 -14
  524. package/dist/types/src/rules/erb-no-extra-whitespace-inside-tags.d.ts +0 -18
  525. package/dist/types/src/rules/erb-require-trailing-newline.d.ts +0 -9
  526. package/dist/types/src/rules/erb-require-whitespace-inside-tags.d.ts +0 -18
  527. package/dist/types/src/rules/erb-right-trim.d.ts +0 -14
  528. package/dist/types/src/rules/erb-strict-locals-comment-syntax.d.ts +0 -9
  529. package/dist/types/src/rules/erb-strict-locals-required.d.ts +0 -9
  530. package/dist/types/src/rules/file-utils.d.ts +0 -13
  531. package/dist/types/src/rules/herb-disable-comment-base.d.ts +0 -37
  532. package/dist/types/src/rules/herb-disable-comment-no-duplicate-rules.d.ts +0 -8
  533. package/dist/types/src/rules/herb-disable-comment-no-redundant-all.d.ts +0 -8
  534. package/dist/types/src/rules/herb-disable-comment-unnecessary.d.ts +0 -8
  535. package/dist/types/src/rules/herb-disable-comment-valid-rule-name.d.ts +0 -8
  536. package/dist/types/src/rules/html-aria-label-is-well-formatted.d.ts +0 -8
  537. package/dist/types/src/rules/html-aria-role-heading-requires-level.d.ts +0 -8
  538. package/dist/types/src/rules/html-attribute-double-quotes.d.ts +0 -15
  539. package/dist/types/src/rules/html-attribute-equals-spacing.d.ts +0 -14
  540. package/dist/types/src/rules/html-attribute-values-require-quotes.d.ts +0 -15
  541. package/dist/types/src/rules/html-avoid-both-disabled-and-aria-disabled.d.ts +0 -8
  542. package/dist/types/src/rules/html-boolean-attributes-no-value.d.ts +0 -14
  543. package/dist/types/src/rules/html-head-only-elements.d.ts +0 -9
  544. package/dist/types/src/rules/html-iframe-has-title.d.ts +0 -8
  545. package/dist/types/src/rules/html-img-require-alt.d.ts +0 -8
  546. package/dist/types/src/rules/html-input-require-autocomplete.d.ts +0 -8
  547. package/dist/types/src/rules/html-no-block-inside-inline.d.ts +0 -8
  548. package/dist/types/src/rules/html-no-duplicate-ids.d.ts +0 -8
  549. package/dist/types/src/rules/html-no-duplicate-meta-names.d.ts +0 -9
  550. package/dist/types/src/rules/html-no-nested-links.d.ts +0 -8
  551. package/dist/types/src/rules/html-no-self-closing.d.ts +0 -16
  552. package/dist/types/src/rules/html-no-space-in-tag.d.ts +0 -16
  553. package/dist/types/src/rules/html-no-title-attribute.d.ts +0 -8
  554. package/dist/types/src/rules/html-no-underscores-in-attribute-names.d.ts +0 -8
  555. package/dist/types/src/rules/html-tag-name-lowercase.d.ts +0 -18
  556. package/dist/types/src/rules/index.d.ts +0 -54
  557. package/dist/types/src/rules/parser-no-errors.d.ts +0 -9
  558. package/dist/types/src/rules/rule-utils.d.ts +0 -351
  559. package/dist/types/src/rules/string-utils.d.ts +0 -15
  560. package/dist/types/src/rules/svg-tag-name-capitalization.d.ts +0 -16
  561. package/dist/types/src/rules.d.ts +0 -2
  562. package/dist/types/src/types.d.ts +0 -190
  563. /package/dist/{src/cli → cli}/formatters/base-formatter.js +0 -0
  564. /package/dist/{src/cli → cli}/formatters/github-actions-formatter.js +0 -0
  565. /package/dist/{src/cli → cli}/formatters/index.js +0 -0
  566. /package/dist/{src/cli → cli}/formatters/json-formatter.js +0 -0
  567. /package/dist/{src/cli → cli}/index.js +0 -0
  568. /package/dist/{src/cli → cli}/output-manager.js +0 -0
  569. /package/dist/{src/herb-disable-comment-utils.js → herb-disable-comment-utils.js} +0 -0
  570. /package/dist/{src/linter-ignore.js → linter-ignore.js} +0 -0
  571. /package/dist/{src/rules → rules}/file-utils.js +0 -0
  572. /package/dist/{src/rules → rules}/herb-disable-comment-base.js +0 -0
  573. /package/dist/{src/rules → rules}/string-utils.js +0 -0
@@ -0,0 +1,34 @@
1
+ import { BaseRuleVisitor } from "./rule-utils.js";
2
+ import { getAttribute } from "@herb-tools/core";
3
+ import { ParserRule } from "../types.js";
4
+ class TurboPermanentRequireIdVisitor extends BaseRuleVisitor {
5
+ visitHTMLOpenTagNode(node) {
6
+ this.checkTurboPermanent(node);
7
+ super.visitHTMLOpenTagNode(node);
8
+ }
9
+ checkTurboPermanent(node) {
10
+ const turboPermanentAttribute = getAttribute(node, "data-turbo-permanent");
11
+ if (!turboPermanentAttribute) {
12
+ return;
13
+ }
14
+ const idAttribute = getAttribute(node, "id");
15
+ if (!idAttribute) {
16
+ this.addOffense("Elements with `data-turbo-permanent` must have an `id` attribute. Without an `id`, Turbo can't track the element across page changes and the permanent behavior won't work as expected.", turboPermanentAttribute.location);
17
+ }
18
+ }
19
+ }
20
+ export class TurboPermanentRequireIdRule extends ParserRule {
21
+ static ruleName = "turbo-permanent-require-id";
22
+ get defaultConfig() {
23
+ return {
24
+ enabled: true,
25
+ severity: "error"
26
+ };
27
+ }
28
+ check(result, context) {
29
+ const visitor = new TurboPermanentRequireIdVisitor(this.ruleName, context);
30
+ visitor.visit(result.value);
31
+ return visitor.offenses;
32
+ }
33
+ }
34
+ //# sourceMappingURL=turbo-permanent-require-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turbo-permanent-require-id.js","sourceRoot":"","sources":["../../src/rules/turbo-permanent-require-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAIxC,MAAM,8BAA+B,SAAQ,eAAe;IAC1D,oBAAoB,CAAC,IAAqB;QACxC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;QAC9B,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC;IAEO,mBAAmB,CAAC,IAAqB;QAC/C,MAAM,uBAAuB,GAAG,YAAY,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAA;QAE1E,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,OAAM;QACR,CAAC;QAED,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAE5C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,UAAU,CACb,yLAAyL,EACzL,uBAAuB,CAAC,QAAQ,CACjC,CAAA;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,UAAU;IACzD,MAAM,CAAC,QAAQ,GAAG,4BAA4B,CAAA;IAE9C,IAAI,aAAa;QACf,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO;SAClB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAmB,EAAE,OAA8B;QACvD,MAAM,OAAO,GAAG,IAAI,8BAA8B,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAE1E,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAE3B,OAAO,OAAO,CAAC,QAAQ,CAAA;IACzB,CAAC"}
@@ -1,22 +1,40 @@
1
+ import { ActionViewNoSilentHelperRule } from "./rules/actionview-no-silent-helper.js";
1
2
  import { ERBCommentSyntax } from "./rules/erb-comment-syntax.js";
2
3
  import { ERBNoCaseNodeChildrenRule } from "./rules/erb-no-case-node-children.js";
4
+ import { ERBNoConditionalHTMLElementRule } from "./rules/erb-no-conditional-html-element.js";
5
+ import { ERBNoConditionalOpenTagRule } from "./rules/erb-no-conditional-open-tag.js";
6
+ import { ERBNoDuplicateBranchElementsRule } from "./rules/erb-no-duplicate-branch-elements.js";
3
7
  import { ERBNoEmptyTagsRule } from "./rules/erb-no-empty-tags.js";
4
8
  import { ERBNoExtraNewLineRule } from "./rules/erb-no-extra-newline.js";
5
9
  import { ERBNoExtraWhitespaceRule } from "./rules/erb-no-extra-whitespace-inside-tags.js";
10
+ import { ERBNoInlineCaseConditionsRule } from "./rules/erb-no-inline-case-conditions.js";
11
+ import { ERBNoInstanceVariablesInPartialsRule } from "./rules/erb-no-instance-variables-in-partials.js";
12
+ import { ERBNoInterpolatedClassNamesRule } from "./rules/erb-no-interpolated-class-names.js";
13
+ import { ERBNoJavascriptTagHelperRule } from "./rules/erb-no-javascript-tag-helper.js";
6
14
  import { ERBNoOutputControlFlowRule } from "./rules/erb-no-output-control-flow.js";
15
+ import { ERBNoOutputInAttributeNameRule } from "./rules/erb-no-output-in-attribute-name.js";
16
+ import { ERBNoOutputInAttributePositionRule } from "./rules/erb-no-output-in-attribute-position.js";
17
+ import { ERBNoRawOutputInAttributeValueRule } from "./rules/erb-no-raw-output-in-attribute-value.js";
7
18
  import { ERBNoSilentTagInAttributeNameRule } from "./rules/erb-no-silent-tag-in-attribute-name.js";
19
+ import { ERBNoStatementInScriptRule } from "./rules/erb-no-statement-in-script.js";
20
+ import { ERBNoThenInControlFlowRule } from "./rules/erb-no-then-in-control-flow.js";
21
+ import { ERBNoTrailingWhitespaceRule } from "./rules/erb-no-trailing-whitespace.js";
22
+ import { ERBNoUnsafeJSAttributeRule } from "./rules/erb-no-unsafe-js-attribute.js";
23
+ import { ERBNoUnsafeRawRule } from "./rules/erb-no-unsafe-raw.js";
24
+ import { ERBNoUnsafeScriptInterpolationRule } from "./rules/erb-no-unsafe-script-interpolation.js";
8
25
  import { ERBPreferImageTagHelperRule } from "./rules/erb-prefer-image-tag-helper.js";
9
26
  import { ERBRequireTrailingNewlineRule } from "./rules/erb-require-trailing-newline.js";
10
27
  import { ERBRequireWhitespaceRule } from "./rules/erb-require-whitespace-inside-tags.js";
11
28
  import { ERBRightTrimRule } from "./rules/erb-right-trim.js";
12
29
  import { ERBStrictLocalsCommentSyntaxRule } from "./rules/erb-strict-locals-comment-syntax.js";
13
30
  import { ERBStrictLocalsRequiredRule } from "./rules/erb-strict-locals-required.js";
14
- import { HerbDisableCommentValidRuleNameRule } from "./rules/herb-disable-comment-valid-rule-name.js";
15
- import { HerbDisableCommentNoRedundantAllRule } from "./rules/herb-disable-comment-no-redundant-all.js";
16
- import { HerbDisableCommentNoDuplicateRulesRule } from "./rules/herb-disable-comment-no-duplicate-rules.js";
17
- import { HerbDisableCommentMissingRulesRule } from "./rules/herb-disable-comment-missing-rules.js";
18
31
  import { HerbDisableCommentMalformedRule } from "./rules/herb-disable-comment-malformed.js";
32
+ import { HerbDisableCommentMissingRulesRule } from "./rules/herb-disable-comment-missing-rules.js";
33
+ import { HerbDisableCommentNoDuplicateRulesRule } from "./rules/herb-disable-comment-no-duplicate-rules.js";
34
+ import { HerbDisableCommentNoRedundantAllRule } from "./rules/herb-disable-comment-no-redundant-all.js";
19
35
  import { HerbDisableCommentUnnecessaryRule } from "./rules/herb-disable-comment-unnecessary.js";
36
+ import { HerbDisableCommentValidRuleNameRule } from "./rules/herb-disable-comment-valid-rule-name.js";
37
+ import { HTMLAllowedScriptTypeRule } from "./rules/html-allowed-script-type.js";
20
38
  import { HTMLAnchorRequireHrefRule } from "./rules/html-anchor-require-href.js";
21
39
  import { HTMLAriaAttributeMustBeValid } from "./rules/html-aria-attribute-must-be-valid.js";
22
40
  import { HTMLAriaLabelIsWellFormattedRule } from "./rules/html-aria-label-is-well-formatted.js";
@@ -28,12 +46,15 @@ import { HTMLAttributeEqualsSpacingRule } from "./rules/html-attribute-equals-sp
28
46
  import { HTMLAttributeValuesRequireQuotesRule } from "./rules/html-attribute-values-require-quotes.js";
29
47
  import { HTMLAvoidBothDisabledAndAriaDisabledRule } from "./rules/html-avoid-both-disabled-and-aria-disabled.js";
30
48
  import { HTMLBodyOnlyElementsRule } from "./rules/html-body-only-elements.js";
49
+ import { HTMLDetailsHasSummaryRule } from "./rules/html-details-has-summary.js";
31
50
  import { HTMLBooleanAttributesNoValueRule } from "./rules/html-boolean-attributes-no-value.js";
32
51
  import { HTMLHeadOnlyElementsRule } from "./rules/html-head-only-elements.js";
33
52
  import { HTMLIframeHasTitleRule } from "./rules/html-iframe-has-title.js";
34
53
  import { HTMLImgRequireAltRule } from "./rules/html-img-require-alt.js";
35
54
  import { HTMLInputRequireAutocompleteRule } from "./rules/html-input-require-autocomplete.js";
36
55
  import { HTMLNavigationHasLabelRule } from "./rules/html-navigation-has-label.js";
56
+ import { HTMLNoAbstractRolesRule } from "./rules/html-no-abstract-roles.js";
57
+ import { HTMLNoAriaHiddenOnBodyRule } from "./rules/html-no-aria-hidden-on-body.js";
37
58
  import { HTMLNoAriaHiddenOnFocusableRule } from "./rules/html-no-aria-hidden-on-focusable.js";
38
59
  import { HTMLNoBlockInsideInlineRule } from "./rules/html-no-block-inside-inline.js";
39
60
  import { HTMLNoDuplicateAttributesRule } from "./rules/html-no-duplicate-attributes.js";
@@ -47,29 +68,49 @@ import { HTMLNoSelfClosingRule } from "./rules/html-no-self-closing.js";
47
68
  import { HTMLNoSpaceInTagRule } from "./rules/html-no-space-in-tag.js";
48
69
  import { HTMLNoTitleAttributeRule } from "./rules/html-no-title-attribute.js";
49
70
  import { HTMLNoUnderscoresInAttributeNamesRule } from "./rules/html-no-underscores-in-attribute-names.js";
71
+ import { HTMLRequireClosingTagsRule } from "./rules/html-require-closing-tags.js";
50
72
  import { HTMLTagNameLowercaseRule } from "./rules/html-tag-name-lowercase.js";
51
- import { SVGTagNameCapitalizationRule } from "./rules/svg-tag-name-capitalization.js";
52
73
  import { ParserNoErrorsRule } from "./rules/parser-no-errors.js";
74
+ import { SVGTagNameCapitalizationRule } from "./rules/svg-tag-name-capitalization.js";
75
+ import { TurboPermanentRequireIdRule } from "./rules/turbo-permanent-require-id.js";
53
76
  export const rules = [
77
+ ActionViewNoSilentHelperRule,
54
78
  ERBCommentSyntax,
55
79
  ERBNoCaseNodeChildrenRule,
80
+ ERBNoConditionalHTMLElementRule,
81
+ ERBNoConditionalOpenTagRule,
82
+ ERBNoDuplicateBranchElementsRule,
56
83
  ERBNoEmptyTagsRule,
57
84
  ERBNoExtraNewLineRule,
58
85
  ERBNoExtraWhitespaceRule,
86
+ ERBNoInlineCaseConditionsRule,
87
+ ERBNoInstanceVariablesInPartialsRule,
88
+ ERBNoInterpolatedClassNamesRule,
89
+ ERBNoJavascriptTagHelperRule,
59
90
  ERBNoOutputControlFlowRule,
91
+ ERBNoOutputInAttributeNameRule,
92
+ ERBNoOutputInAttributePositionRule,
93
+ ERBNoRawOutputInAttributeValueRule,
60
94
  ERBNoSilentTagInAttributeNameRule,
95
+ ERBNoStatementInScriptRule,
96
+ ERBNoThenInControlFlowRule,
97
+ ERBNoTrailingWhitespaceRule,
98
+ ERBNoUnsafeJSAttributeRule,
99
+ ERBNoUnsafeRawRule,
100
+ ERBNoUnsafeScriptInterpolationRule,
61
101
  ERBPreferImageTagHelperRule,
62
102
  ERBRequireTrailingNewlineRule,
63
103
  ERBRequireWhitespaceRule,
64
104
  ERBRightTrimRule,
65
105
  ERBStrictLocalsCommentSyntaxRule,
66
106
  ERBStrictLocalsRequiredRule,
67
- HerbDisableCommentValidRuleNameRule,
68
- HerbDisableCommentNoRedundantAllRule,
69
- HerbDisableCommentNoDuplicateRulesRule,
70
- HerbDisableCommentMissingRulesRule,
71
107
  HerbDisableCommentMalformedRule,
108
+ HerbDisableCommentMissingRulesRule,
109
+ HerbDisableCommentNoDuplicateRulesRule,
110
+ HerbDisableCommentNoRedundantAllRule,
72
111
  HerbDisableCommentUnnecessaryRule,
112
+ HerbDisableCommentValidRuleNameRule,
113
+ HTMLAllowedScriptTypeRule,
73
114
  HTMLAnchorRequireHrefRule,
74
115
  HTMLAriaAttributeMustBeValid,
75
116
  HTMLAriaLabelIsWellFormattedRule,
@@ -81,12 +122,15 @@ export const rules = [
81
122
  HTMLAttributeValuesRequireQuotesRule,
82
123
  HTMLAvoidBothDisabledAndAriaDisabledRule,
83
124
  HTMLBodyOnlyElementsRule,
125
+ HTMLDetailsHasSummaryRule,
84
126
  HTMLBooleanAttributesNoValueRule,
85
127
  HTMLHeadOnlyElementsRule,
86
128
  HTMLIframeHasTitleRule,
87
129
  HTMLImgRequireAltRule,
88
130
  HTMLInputRequireAutocompleteRule,
89
131
  HTMLNavigationHasLabelRule,
132
+ HTMLNoAbstractRolesRule,
133
+ HTMLNoAriaHiddenOnBodyRule,
90
134
  HTMLNoAriaHiddenOnFocusableRule,
91
135
  HTMLNoBlockInsideInlineRule,
92
136
  HTMLNoDuplicateAttributesRule,
@@ -100,8 +144,10 @@ export const rules = [
100
144
  HTMLNoSpaceInTagRule,
101
145
  HTMLNoTitleAttributeRule,
102
146
  HTMLNoUnderscoresInAttributeNamesRule,
147
+ HTMLRequireClosingTagsRule,
103
148
  HTMLTagNameLowercaseRule,
104
- SVGTagNameCapitalizationRule,
105
149
  ParserNoErrorsRule,
150
+ SVGTagNameCapitalizationRule,
151
+ TurboPermanentRequireIdRule,
106
152
  ];
107
153
  //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ export interface ParsedArguments {
17
17
  init: boolean;
18
18
  loadCustomRules: boolean;
19
19
  failLevel?: DiagnosticSeverity;
20
+ jobs: number;
20
21
  }
21
22
  export declare class ArgumentParser {
22
23
  private readonly usage;
@@ -10,6 +10,7 @@ export interface ProcessedFile {
10
10
  }
11
11
  export interface ProcessingContext {
12
12
  projectPath?: string;
13
+ configPath?: string;
13
14
  pattern?: string;
14
15
  fix?: boolean;
15
16
  fixUnsafe?: boolean;
@@ -17,6 +18,7 @@ export interface ProcessingContext {
17
18
  linterConfig?: HerbConfigOptions['linter'];
18
19
  config?: Config;
19
20
  loadCustomRules?: boolean;
21
+ jobs?: number;
20
22
  }
21
23
  export interface ProcessingResult {
22
24
  totalErrors: number;
@@ -40,4 +42,15 @@ export declare class FileProcessor {
40
42
  private customRulesLoaded;
41
43
  private isRuleAutocorrectable;
42
44
  processFiles(files: string[], formatOption?: FormatOption, context?: ProcessingContext): Promise<ProcessingResult>;
45
+ private processFilesSequentially;
46
+ private processFilesInParallel;
47
+ private resolveWorkerPath;
48
+ private splitIntoChunks;
49
+ private runWorker;
50
+ private aggregateWorkerResults;
51
+ /**
52
+ * Returns the default number of parallel jobs based on available CPU cores.
53
+ * Returns 1 if parallelism detection fails.
54
+ */
55
+ static defaultJobs(): number;
43
56
  }
@@ -0,0 +1 @@
1
+ export declare function fileUrl(filePath: string): string;
@@ -2,4 +2,5 @@ export { ArgumentParser } from "./argument-parser.js";
2
2
  export { FileProcessor } from "./file-processor.js";
3
3
  export { SummaryReporter } from "./summary-reporter.js";
4
4
  export { OutputManager } from "./output-manager.js";
5
+ export type { WorkerInput, WorkerResult, WorkerOffense } from "./lint-worker.js";
5
6
  export * from "./formatters/index.js";
@@ -0,0 +1,34 @@
1
+ import { Diagnostic } from "@herb-tools/core";
2
+ export interface WorkerInput {
3
+ files: string[];
4
+ projectPath: string;
5
+ configPath?: string;
6
+ fix: boolean;
7
+ fixUnsafe: boolean;
8
+ ignoreDisableComments: boolean;
9
+ loadCustomRules: boolean;
10
+ }
11
+ export interface WorkerOffense {
12
+ filename: string;
13
+ offense: Diagnostic;
14
+ content: string;
15
+ autocorrectable: boolean;
16
+ }
17
+ export interface WorkerResult {
18
+ totalErrors: number;
19
+ totalWarnings: number;
20
+ totalInfo: number;
21
+ totalHints: number;
22
+ totalIgnored: number;
23
+ totalWouldBeIgnored: number;
24
+ filesWithOffenses: number;
25
+ filesFixed: number;
26
+ ruleCount: number;
27
+ offenses: WorkerOffense[];
28
+ ruleOffenses: [string, {
29
+ count: number;
30
+ files: string[];
31
+ }][];
32
+ fixMessages: string[];
33
+ error?: string;
34
+ }
@@ -36,6 +36,10 @@ export declare class CustomRuleLoader {
36
36
  * Type guard to check if an export is a valid rule class
37
37
  */
38
38
  private isValidRuleClass;
39
+ /**
40
+ * Check for usage of deprecated 'name' property instead of 'static ruleName'
41
+ */
42
+ private hasDeprecatedNameProperty;
39
43
  /**
40
44
  * Loads all custom rules from the project
41
45
  */
@@ -1,4 +1,5 @@
1
1
  export * from "./linter.js";
2
2
  export * from "./rules/index.js";
3
3
  export * from "./types.js";
4
+ export { ruleDocumentationUrl } from "./urls.js";
4
5
  export { rules } from "./rules.js";
@@ -1,4 +1,5 @@
1
- import type { RuleClass, Rule, LexerRule, SourceRule, LintResult, LintOffense, UnboundLintOffense, LintContext, AutofixResult } from "./types.js";
1
+ import { ParseCache } from "./parse-cache.js";
2
+ import type { RuleClass, ParserRuleClass, LexerRuleClass, SourceRuleClass, LintResult, LintOffense, UnboundLintOffense, LintContext, AutofixResult } from "./types.js";
2
3
  import type { HerbBackend } from "@herb-tools/core";
3
4
  import type { RuleConfig, Config } from "@herb-tools/config";
4
5
  export interface LinterOptions {
@@ -27,9 +28,10 @@ export interface LinterOptions {
27
28
  silentCustomRules?: boolean;
28
29
  }
29
30
  export declare class Linter {
30
- protected rules: RuleClass[];
31
+ rules: RuleClass[];
31
32
  protected allAvailableRules: RuleClass[];
32
33
  protected herb: HerbBackend;
34
+ protected parseCache: ParseCache;
33
35
  protected offenses: LintOffense[];
34
36
  protected config?: Config;
35
37
  /**
@@ -85,14 +87,19 @@ export declare class Linter {
85
87
  */
86
88
  protected get nonExcludableRules(): string[];
87
89
  getRuleCount(): number;
90
+ protected findRuleClass(ruleName: string): RuleClass | undefined;
88
91
  /**
89
- * Type guard to check if a rule is a LexerRule
92
+ * Type guard to check if a rule class is a LexerRule class
90
93
  */
91
- protected isLexerRule(rule: Rule): rule is LexerRule;
94
+ protected isLexerRuleClass(ruleClass: RuleClass): ruleClass is LexerRuleClass;
92
95
  /**
93
- * Type guard to check if a rule is a SourceRule
96
+ * Type guard to check if a rule class is a SourceRule class
94
97
  */
95
- protected isSourceRule(rule: Rule): rule is SourceRule;
98
+ protected isSourceRuleClass(ruleClass: RuleClass): ruleClass is SourceRuleClass;
99
+ /**
100
+ * Type guard to check if a rule class is a ParserRule class
101
+ */
102
+ protected isParserRuleClass(ruleClass: RuleClass): ruleClass is ParserRuleClass;
96
103
  /**
97
104
  * Execute a single rule and return its unbound offenses.
98
105
  * Handles rule type checking (Lexer/Parser/Source) and isEnabled checks.
@@ -0,0 +1,9 @@
1
+ import type { ParseResult, HerbBackend, ParserOptions } from "@herb-tools/core";
2
+ export declare class ParseCache {
3
+ private herb;
4
+ private cache;
5
+ constructor(herb: HerbBackend);
6
+ get(source: string, parserOptions?: Partial<ParserOptions>): ParseResult;
7
+ clear(): void;
8
+ resolveOptions(parserOptions: Partial<ParserOptions>): ParserOptions;
9
+ }
@@ -1,8 +1,9 @@
1
1
  import { ParserRule } from "../types.js";
2
2
  import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
- import type { ParseResult } from "@herb-tools/core";
4
- export declare class HTMLAriaLevelMustBeValidRule extends ParserRule {
5
- name: string;
3
+ import type { ParseResult, ParserOptions } from "@herb-tools/core";
4
+ export declare class ActionViewNoSilentHelperRule extends ParserRule {
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
+ get parserOptions(): Partial<ParserOptions>;
7
8
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
9
  }
@@ -6,7 +6,7 @@ interface ERBCommentSyntaxAutofixContext extends BaseAutofixContext {
6
6
  }
7
7
  export declare class ERBCommentSyntax extends ParserRule<ERBCommentSyntaxAutofixContext> {
8
8
  static autocorrectable: boolean;
9
- name: string;
9
+ static ruleName: string;
10
10
  get defaultConfig(): FullRuleConfig;
11
11
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense<ERBCommentSyntaxAutofixContext>[];
12
12
  autofix(offense: LintOffense<ERBCommentSyntaxAutofixContext>, result: ParseResult, _context?: Partial<LintContext>): ParseResult | null;
@@ -2,7 +2,7 @@ import { ParserRule } from "../types.js";
2
2
  import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
3
  import type { ParseResult } from "@herb-tools/core";
4
4
  export declare class ERBNoCaseNodeChildrenRule extends ParserRule {
5
- name: string;
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
7
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
8
  }
@@ -1,8 +1,8 @@
1
1
  import { ParserRule } from "../types.js";
2
- import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
2
  import type { ParseResult } from "@herb-tools/core";
4
- export declare class HerbDisableCommentMalformedRule extends ParserRule {
5
- name: string;
3
+ import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
4
+ export declare class ERBNoConditionalHTMLElementRule extends ParserRule {
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
7
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
8
  }
@@ -1,8 +1,8 @@
1
1
  import { ParserRule } from "../types.js";
2
- import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
2
  import type { ParseResult } from "@herb-tools/core";
4
- export declare class ERBPreferImageTagHelperRule extends ParserRule {
5
- name: string;
3
+ import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
4
+ export declare class ERBNoConditionalOpenTagRule extends ParserRule {
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
7
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
8
  }
@@ -0,0 +1,17 @@
1
+ import { ParserRule } from "../types.js";
2
+ import type { BaseAutofixContext, UnboundLintOffense, LintOffense, LintContext, FullRuleConfig } from "../types.js";
3
+ import type { ParseResult, ERBIfNode, ERBUnlessNode, ERBCaseNode } from "@herb-tools/core";
4
+ import type { Mutable } from "@herb-tools/rewriter";
5
+ type ConditionalNode = ERBIfNode | ERBUnlessNode | ERBCaseNode;
6
+ interface DuplicateBranchAutofixContext extends BaseAutofixContext {
7
+ node: Mutable<ConditionalNode>;
8
+ }
9
+ export declare class ERBNoDuplicateBranchElementsRule extends ParserRule<DuplicateBranchAutofixContext> {
10
+ static ruleName: string;
11
+ static autocorrectable: boolean;
12
+ static reindentAfterAutofix: boolean;
13
+ get defaultConfig(): FullRuleConfig;
14
+ check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense<DuplicateBranchAutofixContext>[];
15
+ autofix(offense: LintOffense<DuplicateBranchAutofixContext>, result: ParseResult): ParseResult | null;
16
+ }
17
+ export {};
@@ -2,7 +2,7 @@ import { ParserRule } from "../types.js";
2
2
  import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
3
  import type { ParseResult } from "@herb-tools/core";
4
4
  export declare class ERBNoEmptyTagsRule extends ParserRule {
5
- name: string;
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
7
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
8
  }
@@ -6,7 +6,7 @@ interface ERBNoExtraNewLineAutofixContext extends BaseAutofixContext {
6
6
  }
7
7
  export declare class ERBNoExtraNewLineRule extends SourceRule {
8
8
  static autocorrectable: boolean;
9
- name: string;
9
+ static ruleName: string;
10
10
  get defaultConfig(): FullRuleConfig;
11
11
  check(source: string, context?: Partial<LintContext>): UnboundLintOffense[];
12
12
  autofix(offense: LintOffense<ERBNoExtraNewLineAutofixContext>, source: string, _context?: Partial<LintContext>): string | null;
@@ -10,7 +10,7 @@ interface ERBNoExtraWhitespaceAutofixContext extends BaseAutofixContext {
10
10
  }
11
11
  export declare class ERBNoExtraWhitespaceRule extends ParserRule<ERBNoExtraWhitespaceAutofixContext> {
12
12
  static autocorrectable: boolean;
13
- name: string;
13
+ static ruleName: string;
14
14
  get defaultConfig(): FullRuleConfig;
15
15
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense<ERBNoExtraWhitespaceAutofixContext>[];
16
16
  autofix(offense: LintOffense<ERBNoExtraWhitespaceAutofixContext>, result: ParseResult, _context?: Partial<LintContext>): ParseResult | null;
@@ -1,8 +1,9 @@
1
1
  import { ParserRule } from "../types.js";
2
2
  import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
- import type { ParseResult } from "@herb-tools/core";
4
- export declare class HTMLNoDuplicateAttributesRule extends ParserRule {
5
- name: string;
3
+ import type { ParseResult, ParserOptions } from "@herb-tools/core";
4
+ export declare class ERBNoInlineCaseConditionsRule extends ParserRule {
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
+ get parserOptions(): Partial<ParserOptions>;
7
8
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
9
  }
@@ -0,0 +1,10 @@
1
+ import { ParserRule } from "../types.js";
2
+ import type { ParseResult, ParserOptions } from "@herb-tools/core";
3
+ import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
4
+ export declare class ERBNoInstanceVariablesInPartialsRule extends ParserRule {
5
+ static ruleName: string;
6
+ get defaultConfig(): FullRuleConfig;
7
+ get parserOptions(): Partial<ParserOptions>;
8
+ isEnabled(_result: ParseResult, context?: Partial<LintContext>): boolean;
9
+ check(result: ParseResult, _context?: Partial<LintContext>): UnboundLintOffense[];
10
+ }
@@ -1,8 +1,8 @@
1
1
  import { ParserRule } from "../types.js";
2
2
  import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
3
  import type { ParseResult } from "@herb-tools/core";
4
- export declare class HTMLNoAriaHiddenOnFocusableRule extends ParserRule {
5
- name: string;
4
+ export declare class ERBNoInterpolatedClassNamesRule extends ParserRule {
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
7
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
8
  }
@@ -1,8 +1,8 @@
1
1
  import { ParserRule } from "../types.js";
2
2
  import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
3
  import type { ParseResult } from "@herb-tools/core";
4
- export declare class HTMLAriaAttributeMustBeValid extends ParserRule {
5
- name: string;
4
+ export declare class ERBNoJavascriptTagHelperRule extends ParserRule {
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
7
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
8
  }
@@ -2,7 +2,7 @@ import type { ParseResult } from "@herb-tools/core";
2
2
  import { ParserRule } from "../types.js";
3
3
  import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
4
4
  export declare class ERBNoOutputControlFlowRule extends ParserRule {
5
- name: string;
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
7
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
8
  }
@@ -1,8 +1,8 @@
1
1
  import { ParserRule } from "../types.js";
2
2
  import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
3
  import type { ParseResult } from "@herb-tools/core";
4
- export declare class ERBNoSilentTagInAttributeNameRule extends ParserRule {
5
- name: string;
4
+ export declare class ERBNoOutputInAttributeNameRule extends ParserRule {
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
7
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
8
  }
@@ -1,8 +1,8 @@
1
1
  import { ParserRule } from "../types.js";
2
2
  import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
3
  import type { ParseResult } from "@herb-tools/core";
4
- export declare class HerbDisableCommentMissingRulesRule extends ParserRule {
5
- name: string;
4
+ export declare class ERBNoOutputInAttributePositionRule extends ParserRule {
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
7
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
8
  }
@@ -1,8 +1,8 @@
1
1
  import { ParserRule } from "../types.js";
2
2
  import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
3
  import type { ParseResult } from "@herb-tools/core";
4
- export declare class ERBNoEmptyTagsRule extends ParserRule {
5
- name: string;
4
+ export declare class ERBNoRawOutputInAttributeValueRule extends ParserRule {
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
7
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
8
  }
@@ -2,7 +2,7 @@ import { ParserRule } from "../types.js";
2
2
  import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
3
  import type { ParseResult } from "@herb-tools/core";
4
4
  export declare class ERBNoSilentTagInAttributeNameRule extends ParserRule {
5
- name: string;
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
7
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
8
  }
@@ -1,8 +1,8 @@
1
1
  import { ParserRule } from "../types.js";
2
2
  import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
3
  import type { ParseResult } from "@herb-tools/core";
4
- export declare class HTMLNavigationHasLabelRule extends ParserRule {
5
- name: string;
4
+ export declare class ERBNoStatementInScriptRule extends ParserRule {
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
7
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
8
  }
@@ -0,0 +1,9 @@
1
+ import { ParserRule } from "../types.js";
2
+ import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
+ import type { ParseResult, ParserOptions } from "@herb-tools/core";
4
+ export declare class ERBNoThenInControlFlowRule extends ParserRule {
5
+ static ruleName: string;
6
+ get defaultConfig(): FullRuleConfig;
7
+ get parserOptions(): Partial<ParserOptions>;
8
+ check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
9
+ }
@@ -0,0 +1,19 @@
1
+ import { ParserRule, Mutable, BaseAutofixContext } from "../types.js";
2
+ import type { UnboundLintOffense, LintOffense, LintContext, FullRuleConfig } from "../types.js";
3
+ import type { HTMLTextNode, LiteralNode, ParseResult } from "@herb-tools/core";
4
+ interface ERBNoTrailingWhitespaceAutofixContext extends BaseAutofixContext {
5
+ node: Mutable<HTMLTextNode> | Mutable<LiteralNode>;
6
+ }
7
+ export declare class ERBNoTrailingWhitespaceRule extends ParserRule<ERBNoTrailingWhitespaceAutofixContext> {
8
+ static autocorrectable: boolean;
9
+ static ruleName: string;
10
+ get defaultConfig(): FullRuleConfig;
11
+ check(result: ParseResult, _context?: Partial<LintContext>): UnboundLintOffense<ERBNoTrailingWhitespaceAutofixContext>[];
12
+ private findTrailingWhitespaceCandidates;
13
+ private collectSkipZones;
14
+ private isInSkipZone;
15
+ autofix(offense: LintOffense<ERBNoTrailingWhitespaceAutofixContext>, result: ParseResult, _context?: Partial<LintContext>): ParseResult | null;
16
+ private isOffenseAtEndOfContent;
17
+ private hasTrailingWhitespaceNotIndentation;
18
+ }
19
+ export {};
@@ -1,8 +1,8 @@
1
1
  import { ParserRule } from "../types.js";
2
2
  import type { UnboundLintOffense, LintContext, FullRuleConfig } from "../types.js";
3
3
  import type { ParseResult } from "@herb-tools/core";
4
- export declare class HTMLNoPositiveTabIndexRule extends ParserRule {
5
- name: string;
4
+ export declare class ERBNoUnsafeJSAttributeRule extends ParserRule {
5
+ static ruleName: string;
6
6
  get defaultConfig(): FullRuleConfig;
7
7
  check(result: ParseResult, context?: Partial<LintContext>): UnboundLintOffense[];
8
8
  }