@markuplint/rules 5.0.0-rc.2 → 5.0.0-rc.5

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/CHANGELOG.md +98 -0
  2. package/CLAUDE.md +31 -2
  3. package/lib/{wai-aria-deprecated-role → aria-prop-requires-role}/index.d.ts +0 -1
  4. package/lib/{wai-aria-no-global-prop → aria-prop-requires-role}/index.js +0 -1
  5. package/lib/attr-check.d.ts +0 -48
  6. package/lib/attr-check.js +0 -36
  7. package/lib/attr-eligibility.d.ts +41 -0
  8. package/lib/attr-eligibility.js +60 -0
  9. package/lib/attr-value-quotes/index.d.ts +0 -7
  10. package/lib/attr-value-quotes/index.js +0 -7
  11. package/lib/attr-value-quotes/meta.d.ts +0 -1
  12. package/lib/attr-value-quotes/meta.js +0 -1
  13. package/lib/case-sensitive-attr-name/index.d.ts +0 -8
  14. package/lib/case-sensitive-attr-name/index.js +0 -8
  15. package/lib/case-sensitive-attr-name/meta.d.ts +0 -1
  16. package/lib/case-sensitive-attr-name/meta.js +0 -1
  17. package/lib/case-sensitive-tag-name/index.d.ts +0 -8
  18. package/lib/case-sensitive-tag-name/index.js +0 -8
  19. package/lib/case-sensitive-tag-name/meta.d.ts +0 -1
  20. package/lib/case-sensitive-tag-name/meta.js +0 -1
  21. package/lib/class-naming/index.d.ts +0 -8
  22. package/lib/class-naming/index.js +0 -8
  23. package/lib/class-naming/meta.d.ts +1 -2
  24. package/lib/class-naming/meta.js +1 -2
  25. package/lib/consistent-table-row-length/index.d.ts +14 -0
  26. package/lib/consistent-table-row-length/index.js +69 -0
  27. package/lib/consistent-table-row-length/meta.d.ts +4 -0
  28. package/lib/consistent-table-row-length/meta.js +3 -0
  29. package/lib/create-message.d.ts +2 -25
  30. package/lib/create-message.js +2 -53
  31. package/lib/debug.d.ts +1 -9
  32. package/lib/debug.js +1 -5
  33. package/lib/element-supports-aria-prop/index.d.ts +12 -0
  34. package/lib/element-supports-aria-prop/index.js +38 -0
  35. package/lib/form-attr-references-form/index.d.ts +12 -0
  36. package/lib/form-attr-references-form/index.js +64 -0
  37. package/lib/{correct-aspect-ratio → form-attr-references-form}/meta.d.ts +1 -1
  38. package/lib/form-attr-references-form/meta.js +3 -0
  39. package/lib/head-element-order/meta.d.ts +1 -1
  40. package/lib/head-element-order/meta.js +1 -1
  41. package/lib/helpers.d.ts +8 -138
  42. package/lib/helpers.js +24 -165
  43. package/lib/index.d.ts +135 -78
  44. package/lib/index.js +167 -82
  45. package/lib/input-list-references-datalist/index.d.ts +13 -0
  46. package/lib/input-list-references-datalist/index.js +46 -0
  47. package/lib/input-list-references-datalist/meta.d.ts +4 -0
  48. package/lib/input-list-references-datalist/meta.js +3 -0
  49. package/lib/itemprop-requires-itemscope/index.d.ts +21 -0
  50. package/lib/itemprop-requires-itemscope/index.js +53 -0
  51. package/lib/itemprop-requires-itemscope/meta.d.ts +4 -0
  52. package/lib/itemprop-requires-itemscope/meta.js +3 -0
  53. package/lib/label-for-references-labelable/index.d.ts +12 -0
  54. package/lib/label-for-references-labelable/index.js +68 -0
  55. package/lib/label-for-references-labelable/meta.d.ts +4 -0
  56. package/lib/label-for-references-labelable/meta.js +3 -0
  57. package/lib/label-has-control/index.d.ts +5 -5
  58. package/lib/label-has-control/index.js +5 -18
  59. package/lib/label-has-control/meta.d.ts +0 -1
  60. package/lib/label-has-control/meta.js +0 -1
  61. package/lib/label-no-multiple-controls/index.d.ts +31 -0
  62. package/lib/label-no-multiple-controls/index.js +104 -0
  63. package/lib/label-no-multiple-controls/meta.d.ts +4 -0
  64. package/lib/label-no-multiple-controls/meta.js +3 -0
  65. package/lib/landmark-roles/roles.d.ts +32 -0
  66. package/lib/landmark-roles/roles.js +73 -0
  67. package/lib/link-types/index.d.ts +0 -5
  68. package/lib/link-types/index.js +5 -6
  69. package/lib/link-types/meta.d.ts +1 -2
  70. package/lib/link-types/meta.js +1 -2
  71. package/lib/map-id-name-match/index.d.ts +10 -0
  72. package/lib/map-id-name-match/index.js +39 -0
  73. package/lib/map-id-name-match/meta.d.ts +4 -0
  74. package/lib/map-id-name-match/meta.js +3 -0
  75. package/lib/meta-charset-position/index.d.ts +15 -0
  76. package/lib/meta-charset-position/index.js +31 -0
  77. package/lib/meta-charset-position/meta.d.ts +4 -0
  78. package/lib/meta-charset-position/meta.js +3 -0
  79. package/lib/meter-value-bounds/index.d.ts +10 -0
  80. package/lib/meter-value-bounds/index.js +123 -0
  81. package/lib/meter-value-bounds/meta.d.ts +4 -0
  82. package/lib/meter-value-bounds/meta.js +3 -0
  83. package/lib/{wai-aria-required-props → no-abstract-role}/index.d.ts +0 -1
  84. package/lib/{wai-aria-abstract-role → no-abstract-role}/index.js +0 -1
  85. package/lib/no-always-matching-source/index.d.ts +13 -0
  86. package/lib/no-always-matching-source/index.js +100 -0
  87. package/lib/no-always-matching-source/meta.d.ts +4 -0
  88. package/lib/no-always-matching-source/meta.js +3 -0
  89. package/lib/no-ambiguous-navigable-target-names/index.d.ts +0 -8
  90. package/lib/no-ambiguous-navigable-target-names/index.js +0 -8
  91. package/lib/no-ambiguous-navigable-target-names/meta.d.ts +1 -2
  92. package/lib/no-ambiguous-navigable-target-names/meta.js +1 -2
  93. package/lib/{wai-aria-required-owned-elements → no-aria-on-presentational-children}/index.d.ts +0 -1
  94. package/lib/{wai-aria-presentational-children → no-aria-on-presentational-children}/index.js +0 -1
  95. package/lib/no-aria-on-unsupported-element/index.d.ts +11 -0
  96. package/lib/no-aria-on-unsupported-element/index.js +35 -0
  97. package/lib/no-aria-on-unsupported-element/meta.d.ts +9 -0
  98. package/lib/no-aria-on-unsupported-element/meta.js +8 -0
  99. package/lib/no-boolean-attr-value/index.d.ts +0 -7
  100. package/lib/no-boolean-attr-value/index.js +0 -7
  101. package/lib/no-boolean-attr-value/meta.d.ts +0 -1
  102. package/lib/no-boolean-attr-value/meta.js +0 -1
  103. package/lib/no-broken-fragment-link/index.d.ts +15 -0
  104. package/lib/no-broken-fragment-link/index.js +93 -0
  105. package/lib/no-broken-fragment-link/meta.d.ts +4 -0
  106. package/lib/no-broken-fragment-link/meta.js +3 -0
  107. package/lib/no-consecutive-br/index.d.ts +0 -8
  108. package/lib/no-consecutive-br/index.js +0 -8
  109. package/lib/no-consecutive-br/meta.d.ts +0 -1
  110. package/lib/no-consecutive-br/meta.js +0 -1
  111. package/lib/no-content-after-body/index.d.ts +25 -0
  112. package/lib/no-content-after-body/index.js +51 -0
  113. package/lib/no-content-after-body/meta.d.ts +4 -0
  114. package/lib/no-content-after-body/meta.js +3 -0
  115. package/lib/no-contradictory-aria-prop/index.d.ts +10 -0
  116. package/lib/no-contradictory-aria-prop/index.js +34 -0
  117. package/lib/{wai-aria-abstract-role → no-default-aria-value}/index.d.ts +0 -1
  118. package/lib/{wai-aria-default-value → no-default-aria-value}/index.js +0 -1
  119. package/lib/no-default-value/index.d.ts +0 -7
  120. package/lib/no-default-value/index.js +0 -7
  121. package/lib/no-default-value/meta.d.ts +0 -1
  122. package/lib/no-default-value/meta.js +0 -1
  123. package/lib/no-deprecated-aria-prop/index.d.ts +3 -0
  124. package/lib/{wai-aria-deprecated-props → no-deprecated-aria-prop}/index.js +0 -1
  125. package/lib/no-deprecated-attr/index.d.ts +2 -0
  126. package/lib/{deprecated-attr → no-deprecated-attr}/index.js +5 -9
  127. package/lib/no-deprecated-attr/meta.d.ts +4 -0
  128. package/lib/no-deprecated-attr/meta.js +3 -0
  129. package/lib/no-deprecated-element/index.d.ts +2 -0
  130. package/lib/no-deprecated-element/index.js +27 -0
  131. package/lib/no-deprecated-element/meta.d.ts +4 -0
  132. package/lib/no-deprecated-element/meta.js +3 -0
  133. package/lib/no-deprecated-role/index.d.ts +3 -0
  134. package/lib/{wai-aria-deprecated-role → no-deprecated-role}/index.js +0 -1
  135. package/lib/no-disallowed-ancestor/index.d.ts +2 -0
  136. package/lib/no-disallowed-ancestor/index.js +25 -0
  137. package/lib/no-disallowed-ancestor/meta.d.ts +4 -0
  138. package/lib/no-disallowed-ancestor/meta.js +3 -0
  139. package/lib/no-disallowed-attr/index.d.ts +28 -0
  140. package/lib/no-disallowed-attr/index.js +77 -0
  141. package/lib/no-disallowed-attr/meta.d.ts +4 -0
  142. package/lib/no-disallowed-attr/meta.js +3 -0
  143. package/lib/no-duplicate-attr/index.d.ts +2 -0
  144. package/lib/{attr-duplication → no-duplicate-attr}/index.js +0 -7
  145. package/lib/no-duplicate-attr/meta.d.ts +6 -0
  146. package/lib/no-duplicate-attr/meta.js +10 -0
  147. package/lib/no-duplicate-autofocus/index.d.ts +0 -5
  148. package/lib/no-duplicate-autofocus/index.js +20 -6
  149. package/lib/no-duplicate-autofocus/meta.d.ts +1 -1
  150. package/lib/no-duplicate-autofocus/meta.js +1 -1
  151. package/lib/no-duplicate-dt/index.d.ts +0 -6
  152. package/lib/no-duplicate-dt/index.js +1 -6
  153. package/lib/no-duplicate-dt/meta.d.ts +1 -2
  154. package/lib/no-duplicate-dt/meta.js +1 -2
  155. package/lib/no-duplicate-h1/index.d.ts +18 -0
  156. package/lib/no-duplicate-h1/index.js +41 -0
  157. package/lib/no-duplicate-h1/meta.d.ts +4 -0
  158. package/lib/no-duplicate-h1/meta.js +3 -0
  159. package/lib/no-duplicate-id/index.d.ts +2 -0
  160. package/lib/{id-duplication → no-duplicate-id}/index.js +0 -7
  161. package/lib/no-duplicate-id/meta.d.ts +4 -0
  162. package/lib/no-duplicate-id/meta.js +3 -0
  163. package/lib/no-duplicate-sibling-attr/index.d.ts +2 -0
  164. package/lib/no-duplicate-sibling-attr/index.js +35 -0
  165. package/lib/no-duplicate-sibling-attr/meta.d.ts +4 -0
  166. package/lib/no-duplicate-sibling-attr/meta.js +3 -0
  167. package/lib/no-duplicate-visible-main/index.d.ts +0 -1
  168. package/lib/no-duplicate-visible-main/index.js +0 -1
  169. package/lib/no-duplicate-visible-main/meta.d.ts +1 -1
  170. package/lib/no-duplicate-visible-main/meta.js +1 -1
  171. package/lib/no-empty-palpable-content/index.d.ts +0 -8
  172. package/lib/no-empty-palpable-content/index.js +0 -8
  173. package/lib/no-empty-palpable-content/meta.d.ts +1 -2
  174. package/lib/no-empty-palpable-content/meta.js +1 -2
  175. package/lib/no-empty-table-track/index.d.ts +12 -0
  176. package/lib/no-empty-table-track/index.js +42 -0
  177. package/lib/no-empty-table-track/meta.d.ts +4 -0
  178. package/lib/no-empty-table-track/meta.js +3 -0
  179. package/lib/no-event-handler-attr/index.d.ts +7 -0
  180. package/lib/{no-use-event-handler-attr → no-event-handler-attr}/index.js +0 -11
  181. package/lib/no-event-handler-attr/meta.d.ts +4 -0
  182. package/lib/no-event-handler-attr/meta.js +3 -0
  183. package/lib/no-experimental-features/index.d.ts +9 -0
  184. package/lib/no-experimental-features/index.js +53 -0
  185. package/lib/no-experimental-features/meta.d.ts +4 -0
  186. package/lib/no-experimental-features/meta.js +3 -0
  187. package/lib/no-extra-selected-options/index.d.ts +10 -0
  188. package/lib/no-extra-selected-options/index.js +37 -0
  189. package/lib/no-extra-selected-options/meta.d.ts +4 -0
  190. package/lib/no-extra-selected-options/meta.js +3 -0
  191. package/lib/no-focusable-in-aria-hidden/index.d.ts +3 -0
  192. package/lib/{wai-aria-interaction-in-hidden → no-focusable-in-aria-hidden}/index.js +0 -1
  193. package/lib/no-focusable-in-aria-hidden/meta.d.ts +4 -0
  194. package/lib/no-focusable-in-aria-hidden/meta.js +3 -0
  195. package/lib/no-hardcoded-id/index.d.ts +2 -0
  196. package/lib/{no-hard-code-id → no-hardcoded-id}/index.js +0 -8
  197. package/lib/no-hardcoded-id/meta.d.ts +4 -0
  198. package/lib/no-hardcoded-id/meta.js +3 -0
  199. package/lib/no-ineffective-attr/index.d.ts +2 -0
  200. package/lib/{ineffective-attr → no-ineffective-attr}/index.js +0 -7
  201. package/lib/no-ineffective-attr/meta.d.ts +5 -0
  202. package/lib/no-ineffective-attr/meta.js +4 -0
  203. package/lib/no-input-file-value/index.d.ts +10 -0
  204. package/lib/no-input-file-value/index.js +41 -0
  205. package/lib/no-input-file-value/meta.d.ts +4 -0
  206. package/lib/no-input-file-value/meta.js +3 -0
  207. package/lib/no-invalid-aria-prop-value/index.d.ts +3 -0
  208. package/lib/{wai-aria-value → no-invalid-aria-prop-value}/index.js +0 -1
  209. package/lib/no-invalid-aria-prop-value/meta.d.ts +4 -0
  210. package/lib/no-invalid-aria-prop-value/meta.js +3 -0
  211. package/lib/no-invalid-attr-value/index.d.ts +27 -0
  212. package/lib/no-invalid-attr-value/index.js +83 -0
  213. package/lib/no-invalid-attr-value/meta.d.ts +4 -0
  214. package/lib/no-invalid-attr-value/meta.js +3 -0
  215. package/lib/no-malformed-character-reference/index.d.ts +2 -0
  216. package/lib/no-malformed-character-reference/index.js +38 -0
  217. package/lib/no-malformed-character-reference/meta.d.ts +5 -0
  218. package/lib/no-malformed-character-reference/meta.js +20 -0
  219. package/lib/{correct-aspect-ratio → no-mismatched-aspect-ratio}/index.js +13 -3
  220. package/lib/no-mismatched-aspect-ratio/meta.d.ts +4 -0
  221. package/lib/no-mismatched-aspect-ratio/meta.js +3 -0
  222. package/lib/{correct-aspect-ratio → no-mismatched-aspect-ratio}/resolve-image-size.js +8 -2
  223. package/lib/no-mixed-srcset-descriptors/index.d.ts +12 -0
  224. package/lib/no-mixed-srcset-descriptors/index.js +47 -0
  225. package/lib/no-mixed-srcset-descriptors/meta.d.ts +4 -0
  226. package/lib/no-mixed-srcset-descriptors/meta.js +3 -0
  227. package/lib/no-nested-top-level-landmark/index.d.ts +10 -0
  228. package/lib/no-nested-top-level-landmark/index.js +52 -0
  229. package/lib/no-nested-top-level-landmark/meta.d.ts +4 -0
  230. package/lib/no-nested-top-level-landmark/meta.js +3 -0
  231. package/lib/no-nonstandard-features/index.d.ts +9 -0
  232. package/lib/no-nonstandard-features/index.js +53 -0
  233. package/lib/no-nonstandard-features/meta.d.ts +4 -0
  234. package/lib/no-nonstandard-features/meta.js +3 -0
  235. package/lib/no-obsolete-attr/index.d.ts +2 -0
  236. package/lib/no-obsolete-attr/index.js +27 -0
  237. package/lib/no-obsolete-attr/meta.d.ts +4 -0
  238. package/lib/no-obsolete-attr/meta.js +3 -0
  239. package/lib/no-obsolete-doctype/index.d.ts +2 -0
  240. package/lib/{doctype → no-obsolete-doctype}/index.js +9 -16
  241. package/lib/no-obsolete-doctype/meta.d.ts +4 -0
  242. package/lib/no-obsolete-doctype/meta.js +3 -0
  243. package/lib/no-obsolete-element/index.d.ts +2 -0
  244. package/lib/{deprecated-element → no-obsolete-element}/index.js +6 -10
  245. package/lib/no-obsolete-element/meta.d.ts +4 -0
  246. package/lib/no-obsolete-element/meta.js +3 -0
  247. package/lib/no-orphaned-end-tag/index.d.ts +0 -7
  248. package/lib/no-orphaned-end-tag/index.js +0 -7
  249. package/lib/no-orphaned-end-tag/meta.d.ts +2 -2
  250. package/lib/no-orphaned-end-tag/meta.js +5 -2
  251. package/lib/no-prohibited-naming/index.d.ts +8 -0
  252. package/lib/no-prohibited-naming/index.js +36 -0
  253. package/lib/no-prohibited-naming/meta.d.ts +4 -0
  254. package/lib/no-prohibited-naming/meta.js +3 -0
  255. package/lib/{use-list → no-pseudo-list}/index.d.ts +1 -8
  256. package/lib/{use-list → no-pseudo-list}/index.js +0 -7
  257. package/lib/no-pseudo-list/meta.d.ts +4 -0
  258. package/lib/no-pseudo-list/meta.js +3 -0
  259. package/lib/{redundant-accessible-name → no-redundant-accessible-name}/index.d.ts +0 -4
  260. package/lib/{redundant-accessible-name → no-redundant-accessible-name}/index.js +0 -4
  261. package/lib/no-redundant-accessible-name/meta.d.ts +4 -0
  262. package/lib/no-redundant-accessible-name/meta.js +3 -0
  263. package/lib/no-redundant-aria-prop/index.d.ts +10 -0
  264. package/lib/{wai-aria-implicit-props → no-redundant-aria-prop}/index.js +9 -3
  265. package/lib/no-redundant-aria-prop/meta.d.ts +4 -0
  266. package/lib/no-redundant-aria-prop/meta.js +3 -0
  267. package/lib/no-redundant-role/index.d.ts +3 -0
  268. package/lib/{wai-aria-implicit-role → no-redundant-role}/index.js +0 -1
  269. package/lib/no-redundant-role/meta.d.ts +4 -0
  270. package/lib/no-redundant-role/meta.js +3 -0
  271. package/lib/no-refer-to-non-existent-id/index.d.ts +0 -9
  272. package/lib/no-refer-to-non-existent-id/index.js +1 -62
  273. package/lib/no-refer-to-non-existent-id/meta.d.ts +1 -2
  274. package/lib/no-refer-to-non-existent-id/meta.js +1 -2
  275. package/lib/no-restricted-attr/index.d.ts +27 -0
  276. package/lib/no-restricted-attr/index.js +96 -0
  277. package/lib/no-restricted-attr/meta.d.ts +4 -0
  278. package/lib/no-restricted-attr/meta.js +3 -0
  279. package/lib/no-restricted-element/index.d.ts +2 -0
  280. package/lib/{disallowed-element → no-restricted-element}/index.js +7 -8
  281. package/lib/no-restricted-element/meta.d.ts +4 -0
  282. package/lib/no-restricted-element/meta.js +3 -0
  283. package/lib/no-skipped-heading-level/index.d.ts +13 -0
  284. package/lib/{heading-levels → no-skipped-heading-level}/index.js +10 -5
  285. package/lib/no-skipped-heading-level/meta.d.ts +4 -0
  286. package/lib/no-skipped-heading-level/meta.js +3 -0
  287. package/lib/no-stray-head-or-body-tag/index.d.ts +28 -0
  288. package/lib/no-stray-head-or-body-tag/index.js +61 -0
  289. package/lib/no-stray-head-or-body-tag/meta.d.ts +4 -0
  290. package/lib/no-stray-head-or-body-tag/meta.js +3 -0
  291. package/lib/no-table-cell-overlap/index.d.ts +12 -0
  292. package/lib/no-table-cell-overlap/index.js +30 -0
  293. package/lib/no-table-cell-overlap/meta.d.ts +4 -0
  294. package/lib/no-table-cell-overlap/meta.js +3 -0
  295. package/lib/no-table-span-overflow/index.d.ts +12 -0
  296. package/lib/no-table-span-overflow/index.js +37 -0
  297. package/lib/no-table-span-overflow/meta.d.ts +4 -0
  298. package/lib/no-table-span-overflow/meta.js +3 -0
  299. package/lib/no-unclosed-element-at-eof/index.d.ts +2 -0
  300. package/lib/no-unclosed-element-at-eof/index.js +86 -0
  301. package/lib/no-unclosed-element-at-eof/meta.d.ts +4 -0
  302. package/lib/no-unclosed-element-at-eof/meta.js +3 -0
  303. package/lib/no-unescaped-char/index.d.ts +14 -0
  304. package/lib/{character-reference → no-unescaped-char}/index.js +31 -20
  305. package/lib/no-unescaped-char/meta.d.ts +4 -0
  306. package/lib/no-unescaped-char/meta.js +3 -0
  307. package/lib/{invalid-attr → no-unknown-attr}/index.d.ts +4 -19
  308. package/lib/no-unknown-attr/index.js +91 -0
  309. package/lib/no-unknown-attr/meta.d.ts +4 -0
  310. package/lib/no-unknown-attr/meta.js +3 -0
  311. package/lib/no-unknown-role/index.d.ts +3 -0
  312. package/lib/{wai-aria-non-existent-role → no-unknown-role}/index.js +0 -1
  313. package/lib/no-unknown-role/meta.d.ts +4 -0
  314. package/lib/no-unknown-role/meta.js +3 -0
  315. package/lib/no-unpaired-srcset-sizes/index.d.ts +12 -0
  316. package/lib/no-unpaired-srcset-sizes/index.js +77 -0
  317. package/lib/no-unpaired-srcset-sizes/meta.d.ts +4 -0
  318. package/lib/no-unpaired-srcset-sizes/meta.js +3 -0
  319. package/lib/{no-unsupported-features → no-unsupported-browser-features}/index.d.ts +1 -10
  320. package/lib/no-unsupported-browser-features/index.js +81 -0
  321. package/lib/no-unsupported-browser-features/meta.d.ts +4 -0
  322. package/lib/no-unsupported-browser-features/meta.js +3 -0
  323. package/lib/permitted-contents/index.d.ts +0 -18
  324. package/lib/permitted-contents/index.js +0 -78
  325. package/lib/permitted-contents/meta.d.ts +1 -2
  326. package/lib/permitted-contents/meta.js +1 -2
  327. package/lib/permitted-contents/represent-transparent-nodes.js +15 -6
  328. package/lib/permitted-roles/index.d.ts +3 -0
  329. package/lib/{wai-aria-permitted-roles → permitted-roles}/index.js +0 -1
  330. package/lib/permitted-roles/meta.d.ts +4 -0
  331. package/lib/permitted-roles/meta.js +3 -0
  332. package/lib/placeholder-label-option/index.d.ts +10 -4
  333. package/lib/placeholder-label-option/index.js +30 -17
  334. package/lib/placeholder-label-option/meta.d.ts +1 -2
  335. package/lib/placeholder-label-option/meta.js +1 -2
  336. package/lib/progress-value-bounds/index.d.ts +10 -0
  337. package/lib/progress-value-bounds/index.js +59 -0
  338. package/lib/progress-value-bounds/meta.d.ts +4 -0
  339. package/lib/progress-value-bounds/meta.js +3 -0
  340. package/lib/require-accessible-name/index.d.ts +0 -7
  341. package/lib/require-accessible-name/index.js +0 -7
  342. package/lib/require-accessible-name/meta.d.ts +0 -1
  343. package/lib/require-accessible-name/meta.js +0 -1
  344. package/lib/require-adjacent-popover/index.d.ts +2 -0
  345. package/lib/{neighbor-popovers → require-adjacent-popover}/index.js +1 -8
  346. package/lib/require-adjacent-popover/meta.d.ts +4 -0
  347. package/lib/require-adjacent-popover/meta.js +3 -0
  348. package/lib/require-ancestor/index.d.ts +2 -0
  349. package/lib/require-ancestor/index.js +29 -0
  350. package/lib/require-ancestor/meta.d.ts +4 -0
  351. package/lib/require-ancestor/meta.js +3 -0
  352. package/lib/require-aria-prop/index.d.ts +3 -0
  353. package/lib/{wai-aria-required-props → require-aria-prop}/index.js +0 -1
  354. package/lib/require-aria-prop/meta.d.ts +4 -0
  355. package/lib/require-aria-prop/meta.js +3 -0
  356. package/lib/{required-attr → require-attr}/index.d.ts +2 -9
  357. package/lib/{required-attr → require-attr}/index.js +0 -7
  358. package/lib/require-attr/meta.d.ts +4 -0
  359. package/lib/require-attr/meta.js +3 -0
  360. package/lib/require-datetime/index.d.ts +0 -8
  361. package/lib/require-datetime/index.js +0 -8
  362. package/lib/require-datetime/meta.d.ts +1 -2
  363. package/lib/require-datetime/meta.js +1 -2
  364. package/lib/require-dialog-autofocus/index.d.ts +0 -10
  365. package/lib/require-dialog-autofocus/index.js +0 -10
  366. package/lib/require-dialog-autofocus/meta.d.ts +0 -1
  367. package/lib/require-dialog-autofocus/meta.js +0 -1
  368. package/lib/require-doctype/index.d.ts +2 -0
  369. package/lib/require-doctype/index.js +19 -0
  370. package/lib/require-doctype/meta.d.ts +5 -0
  371. package/lib/require-doctype/meta.js +10 -0
  372. package/lib/{required-element → require-element}/index.d.ts +1 -9
  373. package/lib/{required-element → require-element}/index.js +0 -8
  374. package/lib/require-element/meta.d.ts +4 -0
  375. package/lib/require-element/meta.js +3 -0
  376. package/lib/require-end-tag/index.d.ts +2 -0
  377. package/lib/{end-tag → require-end-tag}/index.js +0 -7
  378. package/lib/require-end-tag/meta.d.ts +4 -0
  379. package/lib/require-end-tag/meta.js +3 -0
  380. package/lib/require-h1/index.d.ts +17 -0
  381. package/lib/{required-h1 → require-h1}/index.js +6 -14
  382. package/lib/require-h1/meta.d.ts +4 -0
  383. package/lib/require-h1/meta.js +3 -0
  384. package/lib/require-landmark-label/index.d.ts +11 -0
  385. package/lib/require-landmark-label/index.js +55 -0
  386. package/lib/require-landmark-label/meta.d.ts +4 -0
  387. package/lib/require-landmark-label/meta.js +3 -0
  388. package/lib/require-owned-elements/index.d.ts +3 -0
  389. package/lib/{wai-aria-required-owned-elements → require-owned-elements}/index.js +0 -2
  390. package/lib/require-owned-elements/meta.d.ts +4 -0
  391. package/lib/require-owned-elements/meta.js +3 -0
  392. package/lib/require-parent-role/index.d.ts +3 -0
  393. package/lib/{wai-aria-required-parent-role → require-parent-role}/index.js +0 -1
  394. package/lib/require-parent-role/meta.d.ts +4 -0
  395. package/lib/require-parent-role/meta.js +3 -0
  396. package/lib/role-supports-aria-prop/index.d.ts +8 -0
  397. package/lib/{wai-aria-disallowed-props → role-supports-aria-prop}/index.js +11 -10
  398. package/lib/role-supports-aria-prop/meta.d.ts +4 -0
  399. package/lib/role-supports-aria-prop/meta.js +3 -0
  400. package/lib/rule-aliases.d.ts +2 -0
  401. package/lib/rule-aliases.js +325 -0
  402. package/lib/sizes-auto-requires-lazy-loading/index.d.ts +14 -0
  403. package/lib/sizes-auto-requires-lazy-loading/index.js +68 -0
  404. package/lib/sizes-auto-requires-lazy-loading/meta.d.ts +4 -0
  405. package/lib/sizes-auto-requires-lazy-loading/meta.js +3 -0
  406. package/lib/srcset-sizes-constraint/parse-srcset.d.ts +6 -0
  407. package/lib/srcset-sizes-constraint/parse-srcset.js +6 -0
  408. package/lib/srcset-sizes-constraint/sibling-helpers.d.ts +21 -0
  409. package/lib/srcset-sizes-constraint/sibling-helpers.js +37 -0
  410. package/lib/tab-requires-tabpanel/index.d.ts +3 -0
  411. package/lib/tab-requires-tabpanel/index.js +21 -0
  412. package/lib/tab-requires-tabpanel/meta.d.ts +4 -0
  413. package/lib/tab-requires-tabpanel/meta.js +3 -0
  414. package/lib/table-row-column-alignment/grid.d.ts +108 -52
  415. package/lib/table-row-column-alignment/grid.js +276 -203
  416. package/lib/table-row-column-alignment/types.d.ts +6 -8
  417. package/lib/usemap-references-map/index.d.ts +14 -0
  418. package/lib/usemap-references-map/index.js +46 -0
  419. package/lib/usemap-references-map/meta.d.ts +4 -0
  420. package/lib/usemap-references-map/meta.js +3 -0
  421. package/lib/valid-importmap/index.d.ts +2 -0
  422. package/lib/valid-importmap/index.js +176 -0
  423. package/lib/valid-importmap/meta.d.ts +4 -0
  424. package/lib/valid-importmap/meta.js +3 -0
  425. package/lib/valid-speculation-rules/index.d.ts +2 -0
  426. package/lib/valid-speculation-rules/index.js +292 -0
  427. package/lib/valid-speculation-rules/meta.d.ts +4 -0
  428. package/lib/valid-speculation-rules/meta.js +3 -0
  429. package/lib/wai-aria/checkings/contradictory-aria-prop.d.ts +23 -0
  430. package/lib/wai-aria/checkings/{implicit-props.js → contradictory-aria-prop.js} +22 -14
  431. package/lib/wai-aria/checkings/element-supports-aria-prop.d.ts +20 -0
  432. package/lib/wai-aria/checkings/element-supports-aria-prop.js +83 -0
  433. package/lib/wai-aria/checkings/prohibited-naming.d.ts +35 -0
  434. package/lib/wai-aria/checkings/prohibited-naming.js +64 -0
  435. package/lib/wai-aria/checkings/redundant-aria-prop.d.ts +23 -0
  436. package/lib/wai-aria/checkings/redundant-aria-prop.js +53 -0
  437. package/lib/wai-aria/checkings/required-prop.d.ts +4 -0
  438. package/lib/wai-aria/checkings/required-prop.js +16 -3
  439. package/lib/wai-aria/checkings/role-supports-aria-prop.d.ts +20 -0
  440. package/lib/wai-aria/checkings/role-supports-aria-prop.js +30 -0
  441. package/lib/wai-aria/checkings/tab-requires-tabpanel.d.ts +19 -0
  442. package/lib/wai-aria/checkings/tab-requires-tabpanel.js +56 -0
  443. package/lib/wai-aria/default-options.js +1 -0
  444. package/lib/wai-aria/types.d.ts +2 -0
  445. package/package.json +11 -10
  446. package/schema.json +275 -59
  447. package/SKILL.md +0 -77
  448. package/lib/attr-duplication/index.d.ts +0 -9
  449. package/lib/attr-duplication/meta.d.ts +0 -6
  450. package/lib/attr-duplication/meta.js +0 -5
  451. package/lib/character-reference/index.d.ts +0 -12
  452. package/lib/character-reference/meta.d.ts +0 -5
  453. package/lib/character-reference/meta.js +0 -4
  454. package/lib/correct-aspect-ratio/meta.js +0 -3
  455. package/lib/deprecated-attr/index.d.ts +0 -8
  456. package/lib/deprecated-attr/meta.d.ts +0 -5
  457. package/lib/deprecated-attr/meta.js +0 -4
  458. package/lib/deprecated-element/index.d.ts +0 -8
  459. package/lib/deprecated-element/meta.d.ts +0 -5
  460. package/lib/deprecated-element/meta.js +0 -4
  461. package/lib/disallowed-element/index.d.ts +0 -9
  462. package/lib/disallowed-element/meta.d.ts +0 -5
  463. package/lib/disallowed-element/meta.js +0 -4
  464. package/lib/doctype/index.d.ts +0 -15
  465. package/lib/doctype/meta.d.ts +0 -5
  466. package/lib/doctype/meta.js +0 -4
  467. package/lib/end-tag/index.d.ts +0 -9
  468. package/lib/end-tag/meta.d.ts +0 -5
  469. package/lib/end-tag/meta.js +0 -4
  470. package/lib/heading-levels/index.d.ts +0 -8
  471. package/lib/heading-levels/meta.d.ts +0 -5
  472. package/lib/heading-levels/meta.js +0 -4
  473. package/lib/id-duplication/index.d.ts +0 -9
  474. package/lib/id-duplication/meta.d.ts +0 -5
  475. package/lib/id-duplication/meta.js +0 -4
  476. package/lib/ineffective-attr/index.d.ts +0 -9
  477. package/lib/ineffective-attr/meta.d.ts +0 -6
  478. package/lib/ineffective-attr/meta.js +0 -5
  479. package/lib/invalid-attr/index.js +0 -207
  480. package/lib/invalid-attr/meta.d.ts +0 -5
  481. package/lib/invalid-attr/meta.js +0 -4
  482. package/lib/landmark-roles/index.d.ts +0 -22
  483. package/lib/landmark-roles/index.js +0 -142
  484. package/lib/landmark-roles/meta.d.ts +0 -5
  485. package/lib/landmark-roles/meta.js +0 -4
  486. package/lib/neighbor-popovers/index.d.ts +0 -10
  487. package/lib/neighbor-popovers/meta.d.ts +0 -5
  488. package/lib/neighbor-popovers/meta.js +0 -4
  489. package/lib/no-hard-code-id/index.d.ts +0 -10
  490. package/lib/no-hard-code-id/meta.d.ts +0 -5
  491. package/lib/no-hard-code-id/meta.js +0 -4
  492. package/lib/no-unsupported-features/index.js +0 -139
  493. package/lib/no-unsupported-features/meta.d.ts +0 -5
  494. package/lib/no-unsupported-features/meta.js +0 -4
  495. package/lib/no-use-event-handler-attr/index.d.ts +0 -18
  496. package/lib/no-use-event-handler-attr/meta.d.ts +0 -5
  497. package/lib/no-use-event-handler-attr/meta.js +0 -4
  498. package/lib/redundant-accessible-name/meta.d.ts +0 -5
  499. package/lib/redundant-accessible-name/meta.js +0 -4
  500. package/lib/required-attr/meta.d.ts +0 -5
  501. package/lib/required-attr/meta.js +0 -4
  502. package/lib/required-element/meta.d.ts +0 -5
  503. package/lib/required-element/meta.js +0 -4
  504. package/lib/required-h1/index.d.ts +0 -18
  505. package/lib/required-h1/meta.d.ts +0 -5
  506. package/lib/required-h1/meta.js +0 -4
  507. package/lib/srcset-sizes-constraint/index.d.ts +0 -6
  508. package/lib/srcset-sizes-constraint/index.js +0 -108
  509. package/lib/srcset-sizes-constraint/meta.d.ts +0 -5
  510. package/lib/srcset-sizes-constraint/meta.js +0 -4
  511. package/lib/table-row-column-alignment/index.d.ts +0 -10
  512. package/lib/table-row-column-alignment/index.js +0 -97
  513. package/lib/table-row-column-alignment/meta.d.ts +0 -5
  514. package/lib/table-row-column-alignment/meta.js +0 -4
  515. package/lib/use-list/meta.d.ts +0 -5
  516. package/lib/use-list/meta.js +0 -4
  517. package/lib/wai-aria/checkings/disallowed-prop.d.ts +0 -23
  518. package/lib/wai-aria/checkings/disallowed-prop.js +0 -84
  519. package/lib/wai-aria/checkings/implicit-props.d.ts +0 -20
  520. package/lib/wai-aria/index.d.ts +0 -13
  521. package/lib/wai-aria/index.js +0 -115
  522. package/lib/wai-aria/meta.d.ts +0 -5
  523. package/lib/wai-aria/meta.js +0 -4
  524. package/lib/wai-aria-default-value/index.d.ts +0 -4
  525. package/lib/wai-aria-default-value/meta.d.ts +0 -5
  526. package/lib/wai-aria-default-value/meta.js +0 -4
  527. package/lib/wai-aria-deprecated-props/index.d.ts +0 -4
  528. package/lib/wai-aria-deprecated-props/meta.d.ts +0 -5
  529. package/lib/wai-aria-deprecated-props/meta.js +0 -4
  530. package/lib/wai-aria-disallowed-props/index.d.ts +0 -4
  531. package/lib/wai-aria-disallowed-props/meta.d.ts +0 -5
  532. package/lib/wai-aria-disallowed-props/meta.js +0 -4
  533. package/lib/wai-aria-implicit-props/index.d.ts +0 -4
  534. package/lib/wai-aria-implicit-props/meta.d.ts +0 -5
  535. package/lib/wai-aria-implicit-props/meta.js +0 -4
  536. package/lib/wai-aria-implicit-role/index.d.ts +0 -4
  537. package/lib/wai-aria-interaction-in-hidden/index.d.ts +0 -4
  538. package/lib/wai-aria-interaction-in-hidden/meta.d.ts +0 -5
  539. package/lib/wai-aria-interaction-in-hidden/meta.js +0 -4
  540. package/lib/wai-aria-no-global-prop/index.d.ts +0 -4
  541. package/lib/wai-aria-no-global-prop/meta.d.ts +0 -5
  542. package/lib/wai-aria-no-global-prop/meta.js +0 -4
  543. package/lib/wai-aria-non-existent-role/index.d.ts +0 -4
  544. package/lib/wai-aria-permitted-roles/index.d.ts +0 -4
  545. package/lib/wai-aria-presentational-children/index.d.ts +0 -4
  546. package/lib/wai-aria-presentational-children/meta.d.ts +0 -5
  547. package/lib/wai-aria-presentational-children/meta.js +0 -4
  548. package/lib/wai-aria-required-parent-role/index.d.ts +0 -4
  549. package/lib/wai-aria-value/index.d.ts +0 -4
  550. package/lib/wai-aria-value/meta.d.ts +0 -5
  551. package/lib/wai-aria-value/meta.js +0 -4
  552. /package/lib/{wai-aria-abstract-role → aria-prop-requires-role}/meta.d.ts +0 -0
  553. /package/lib/{wai-aria-abstract-role → aria-prop-requires-role}/meta.js +0 -0
  554. /package/lib/{wai-aria-deprecated-role → element-supports-aria-prop}/meta.d.ts +0 -0
  555. /package/lib/{wai-aria-deprecated-role → element-supports-aria-prop}/meta.js +0 -0
  556. /package/lib/{wai-aria-implicit-role → no-abstract-role}/meta.d.ts +0 -0
  557. /package/lib/{wai-aria-implicit-role → no-abstract-role}/meta.js +0 -0
  558. /package/lib/{wai-aria-non-existent-role → no-aria-on-presentational-children}/meta.d.ts +0 -0
  559. /package/lib/{wai-aria-non-existent-role → no-aria-on-presentational-children}/meta.js +0 -0
  560. /package/lib/{wai-aria-permitted-roles → no-contradictory-aria-prop}/meta.d.ts +0 -0
  561. /package/lib/{wai-aria-permitted-roles → no-contradictory-aria-prop}/meta.js +0 -0
  562. /package/lib/{wai-aria-required-owned-elements → no-default-aria-value}/meta.d.ts +0 -0
  563. /package/lib/{wai-aria-required-owned-elements → no-default-aria-value}/meta.js +0 -0
  564. /package/lib/{wai-aria-required-parent-role → no-deprecated-aria-prop}/meta.d.ts +0 -0
  565. /package/lib/{wai-aria-required-parent-role → no-deprecated-aria-prop}/meta.js +0 -0
  566. /package/lib/{wai-aria-required-props → no-deprecated-role}/meta.d.ts +0 -0
  567. /package/lib/{wai-aria-required-props → no-deprecated-role}/meta.js +0 -0
  568. /package/lib/{correct-aspect-ratio → no-mismatched-aspect-ratio}/index.d.ts +0 -0
  569. /package/lib/{correct-aspect-ratio → no-mismatched-aspect-ratio}/resolve-image-size.d.ts +0 -0
  570. /package/lib/{no-unsupported-features → no-unsupported-browser-features}/compat-data.d.ts +0 -0
  571. /package/lib/{no-unsupported-features → no-unsupported-browser-features}/compat-data.js +0 -0
  572. /package/lib/{no-unsupported-features → no-unsupported-browser-features}/resolve-browsers.d.ts +0 -0
  573. /package/lib/{no-unsupported-features → no-unsupported-browser-features}/resolve-browsers.js +0 -0
@@ -0,0 +1,100 @@
1
+ import { createRule } from '@markuplint/ml-core';
2
+ import { followingElementSiblings } from '../srcset-sizes-constraint/sibling-helpers.js';
3
+ import meta from './meta.js';
4
+ /** Violation message for an always-matching `<source>`. */
5
+ const ALWAYS_MATCHING_SOURCE_MESSAGE = 'The "source" element must have a "media" or "type" attribute when it has a following sibling "source" or "img" element with a "srcset" attribute';
6
+ /**
7
+ * HTML LS § the source element: when a `<source>` has a following sibling
8
+ * `<source>` or `<img>` element with a `srcset` attribute specified, it must
9
+ * have a usable `media` and/or `type` attribute, otherwise it "always
10
+ * matches" and shadows the following candidates. Split out of the former
11
+ * `srcset-sizes-constraint` rule's Check 6.
12
+ *
13
+ * Whether the current `<source>` itself has a `srcset` is irrelevant — the
14
+ * requirement is about distinguishing it from what follows, not about its
15
+ * own candidates.
16
+ */
17
+ export default createRule({
18
+ meta,
19
+ async verify({ document, report }) {
20
+ await document.walkOn('Element', el => {
21
+ if (el.localName !== 'source') {
22
+ return;
23
+ }
24
+ // source is only relevant inside <picture>
25
+ if (el.parentElement?.localName !== 'picture') {
26
+ return;
27
+ }
28
+ // Skip if element has spread attributes (dynamic props)
29
+ if (el.hasSpreadAttr) {
30
+ return;
31
+ }
32
+ if (isAlwaysMatchingSource(el)) {
33
+ report({ scope: el, message: ALWAYS_MATCHING_SOURCE_MESSAGE });
34
+ }
35
+ });
36
+ },
37
+ });
38
+ /**
39
+ * Whether a `media` attribute value is "always matching" per HTML LS, i.e. it
40
+ * does not distinguish the `<source>` from its siblings.
41
+ *
42
+ * A value is always-matching when, after stripping leading and trailing ASCII
43
+ * whitespace, it is the empty string or an ASCII case-insensitive match for the
44
+ * string `"all"`.
45
+ *
46
+ * ASCII whitespace (TAB, LF, FF, CR, SPACE) is stripped explicitly rather than
47
+ * via `String.prototype.trim`, which would also strip non-ASCII whitespace such
48
+ * as NBSP. A media value padded with NBSP around "all" is NOT
49
+ * always-matching per the spec and must keep its distinguishing media query.
50
+ *
51
+ * @param value - The raw `media` attribute value
52
+ * @returns `true` if the value is empty or `"all"` (case-insensitive)
53
+ */
54
+ function isAlwaysMatchingMedia(value) {
55
+ const normalized = value.replaceAll(/^[\t\n\f\r ]+|[\t\n\f\r ]+$/g, '').toLowerCase();
56
+ return normalized === '' || normalized === 'all';
57
+ }
58
+ /**
59
+ * Whether a `<source>` "always matches" and so shadows the following
60
+ * candidates: it lacks a usable `media`/`type` attribute yet has a following
61
+ * sibling `<source>`/`<img>` with a `srcset` attribute. See HTML LS § the
62
+ * source element.
63
+ *
64
+ * A `type` attribute (any value, including dynamic) satisfies the requirement.
65
+ * A `media` attribute satisfies it only when its value is a non-always-matching
66
+ * media query; a dynamic value is unknown at lint time, so assume it qualifies
67
+ * to avoid false positives.
68
+ *
69
+ * @param el - The `<source>` element to test
70
+ * @returns `true` if the source must be reported as always-matching
71
+ */
72
+ function isAlwaysMatchingSource(
73
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
74
+ el) {
75
+ const typeAttr = el.getAttributeNode('type');
76
+ const mediaAttr = el.getAttributeNode('media');
77
+ const hasUsableType = typeAttr != null;
78
+ const hasUsableMedia = mediaAttr != null && (mediaAttr.isDynamicValue || !isAlwaysMatchingMedia(mediaAttr.value));
79
+ return !hasUsableType && !hasUsableMedia && hasFollowingSrcsetSibling(el);
80
+ }
81
+ /**
82
+ * Whether the element has a following sibling `<source>` or `<img>` element
83
+ * with a `srcset` attribute specified.
84
+ *
85
+ * Per the spec the sibling does not have to be the immediately next sibling.
86
+ *
87
+ * @param el - The starting element to search from
88
+ * @returns `true` if such a following sibling exists
89
+ */
90
+ function hasFollowingSrcsetSibling(
91
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
92
+ el) {
93
+ for (const sibling of followingElementSiblings(el)) {
94
+ if ((sibling.localName === 'source' || sibling.localName === 'img') &&
95
+ sibling.getAttributeNode('srcset') != null) {
96
+ return true;
97
+ }
98
+ }
99
+ return false;
100
+ }
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ readonly category: "attributes";
3
+ };
4
+ export default _default;
@@ -0,0 +1,3 @@
1
+ export default {
2
+ category: 'attributes',
3
+ };
@@ -1,10 +1,2 @@
1
- /**
2
- * Rule that warns against ambiguous navigable target names.
3
- *
4
- * Detects attribute values (e.g., `target`) that look like browsing context
5
- * keywords (such as `_blank`, `_self`) but are missing the leading underscore,
6
- * which would make them navigable target names instead of keywords. Suggests
7
- * adding the underscore prefix when applicable.
8
- */
9
1
  declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, undefined>>;
10
2
  export default _default;
@@ -1,14 +1,6 @@
1
1
  import { createRule, getAttrSpecs } from '@markuplint/ml-core';
2
2
  import { valueCheck } from '../attr-check.js';
3
3
  import meta from './meta.js';
4
- /**
5
- * Rule that warns against ambiguous navigable target names.
6
- *
7
- * Detects attribute values (e.g., `target`) that look like browsing context
8
- * keywords (such as `_blank`, `_self`) but are missing the leading underscore,
9
- * which would make them navigable target names instead of keywords. Suggests
10
- * adding the underscore prefix when applicable.
11
- */
12
4
  export default createRule({
13
5
  meta: meta,
14
6
  defaultSeverity: 'warning',
@@ -1,5 +1,4 @@
1
- /** Rule metadata for the `no-ambiguous-navigable-target-names` rule, categorized as accessibility. */
2
1
  declare const _default: {
3
- readonly category: "a11y";
2
+ readonly category: "attributes";
4
3
  };
5
4
  export default _default;
@@ -1,4 +1,3 @@
1
- /** Rule metadata for the `no-ambiguous-navigable-target-names` rule, categorized as accessibility. */
2
1
  export default {
3
- category: 'a11y',
2
+ category: 'attributes',
4
3
  };
@@ -1,4 +1,3 @@
1
1
  import type { Options } from '../wai-aria/types.js';
2
- /** Warns when a role does not contain its required child roles. */
3
2
  declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, Options>>;
4
3
  export default _default;
@@ -2,7 +2,6 @@ import { createRule, getSpec } from '@markuplint/ml-core';
2
2
  import { checkingPresentationalChildren } from '../wai-aria/checkings/presentational-children.js';
3
3
  import { defaultOptions } from '../wai-aria/default-options.js';
4
4
  import meta from './meta.js';
5
- /** Warns when ARIA attributes are set on descendants of roles with presentational children. */
6
5
  export default createRule({
7
6
  meta,
8
7
  defaultSeverity: 'warning',
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Extracted from the former `wai-aria` umbrella rule (#3989), which always
3
+ * performed this check first, unconditionally, before any of its other
4
+ * (now independently-split) checks. No element in the bundled HTML / SVG /
5
+ * MathML spec data currently sets `globalAttrs['#ARIAAttrs']` to `false` —
6
+ * every element that declares the flag at all sets it `true` — so this rule
7
+ * has no reachable positive case against the current spec data; it exists
8
+ * to remain correct if a future spec update marks some element this way.
9
+ */
10
+ declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, undefined>>;
11
+ export default _default;
@@ -0,0 +1,35 @@
1
+ import { createRule, getSpec } from '@markuplint/ml-core';
2
+ import { Collection } from '../helpers.js';
3
+ import meta from './meta.js';
4
+ /**
5
+ * Extracted from the former `wai-aria` umbrella rule (#3989), which always
6
+ * performed this check first, unconditionally, before any of its other
7
+ * (now independently-split) checks. No element in the bundled HTML / SVG /
8
+ * MathML spec data currently sets `globalAttrs['#ARIAAttrs']` to `false` —
9
+ * every element that declares the flag at all sets it `true` — so this rule
10
+ * has no reachable positive case against the current spec data; it exists
11
+ * to remain correct if a future spec update marks some element this way.
12
+ */
13
+ export default createRule({
14
+ meta: meta,
15
+ async verify({ document, report, t }) {
16
+ await document.walkOn('Element', el => {
17
+ const elSpec = getSpec(el, document.specs.specs);
18
+ if (!elSpec) {
19
+ return;
20
+ }
21
+ if (elSpec.globalAttrs['#ARIAAttrs']) {
22
+ return;
23
+ }
24
+ const roleAttr = el.getAttributeNode('role');
25
+ const propAttrs = el.attributes.filter(attr => /^aria-/i.test(attr.name));
26
+ const ariaAttrs = new Collection(roleAttr, ...propAttrs);
27
+ for (const ariaAttr of ariaAttrs) {
28
+ report({
29
+ scope: ariaAttr,
30
+ message: t('{0} is {1:c}', t('the "{0*}" {1}', ariaAttr.name, 'attribute'), 'disallowed'),
31
+ });
32
+ }
33
+ });
34
+ },
35
+ });
@@ -0,0 +1,9 @@
1
+ declare const _default: {
2
+ readonly category: "a11y";
3
+ readonly specConformance: {
4
+ readonly sources: readonly ["aria-in-html"];
5
+ readonly level: "must";
6
+ readonly cites: readonly ["https://w3c.github.io/html-aria/#docconformance"];
7
+ };
8
+ };
9
+ export default _default;
@@ -0,0 +1,8 @@
1
+ export default {
2
+ category: 'a11y',
3
+ specConformance: {
4
+ sources: ['aria-in-html'],
5
+ level: 'must',
6
+ cites: ['https://w3c.github.io/html-aria/#docconformance'],
7
+ },
8
+ };
@@ -1,9 +1,2 @@
1
- /**
2
- * Rule that disallows explicit values on boolean attributes.
3
- *
4
- * Checks each attribute against the HTML spec and reports when a boolean
5
- * attribute (e.g., `disabled`, `checked`) is written with an explicit value
6
- * such as `disabled="disabled"` instead of the bare attribute name.
7
- */
8
1
  declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, undefined>>;
9
2
  export default _default;
@@ -1,13 +1,6 @@
1
1
  import { createRule, getAttrSpecs } from '@markuplint/ml-core';
2
2
  import { removeAttrValue } from '../helpers.js';
3
3
  import meta from './meta.js';
4
- /**
5
- * Rule that disallows explicit values on boolean attributes.
6
- *
7
- * Checks each attribute against the HTML spec and reports when a boolean
8
- * attribute (e.g., `disabled`, `checked`) is written with an explicit value
9
- * such as `disabled="disabled"` instead of the bare attribute name.
10
- */
11
4
  export default createRule({
12
5
  meta: meta,
13
6
  defaultSeverity: 'warning',
@@ -1,4 +1,3 @@
1
- /** Rule metadata for `no-boolean-attr-value`: categorized as a style rule. */
2
1
  declare const _default: {
3
2
  readonly category: "style";
4
3
  readonly fixable: true;
@@ -1,4 +1,3 @@
1
- /** Rule metadata for `no-boolean-attr-value`: categorized as a style rule. */
2
1
  export default {
3
2
  category: 'style',
4
3
  fixable: true,
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Split out of the former `no-refer-to-non-existent-id` rule. Unlike the
3
+ * `DOMID`-typed attributes and ARIA ID references that rule covers, HTML LS
4
+ * does not treat a broken hyperlink fragment as a conformance violation —
5
+ * scrolling to a fragment simply does nothing when its target is absent
6
+ * (§ Scrolling to a fragment). Reporting it is still useful (almost always
7
+ * an author mistake), which is why the default severity stays `warning`
8
+ * rather than `no-refer-to-non-existent-id`'s `error`.
9
+ *
10
+ * @see https://html.spec.whatwg.org/multipage/browsing-the-web.html#scrolling-to-a-fragment
11
+ */
12
+ declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, {
13
+ fragmentRefersNameAttr: boolean;
14
+ }>>;
15
+ export default _default;
@@ -0,0 +1,93 @@
1
+ import { createRule } from '@markuplint/ml-core';
2
+ import { decodeEntities, decodeHref } from '@markuplint/shared';
3
+ import meta from './meta.js';
4
+ /** CSS selector matching hyperlink elements that have an `href` attribute. */
5
+ const HYPERLINK_SELECTOR = 'a[href], area[href]';
6
+ /**
7
+ * Split out of the former `no-refer-to-non-existent-id` rule. Unlike the
8
+ * `DOMID`-typed attributes and ARIA ID references that rule covers, HTML LS
9
+ * does not treat a broken hyperlink fragment as a conformance violation —
10
+ * scrolling to a fragment simply does nothing when its target is absent
11
+ * (§ Scrolling to a fragment). Reporting it is still useful (almost always
12
+ * an author mistake), which is why the default severity stays `warning`
13
+ * rather than `no-refer-to-non-existent-id`'s `error`.
14
+ *
15
+ * @see https://html.spec.whatwg.org/multipage/browsing-the-web.html#scrolling-to-a-fragment
16
+ */
17
+ export default createRule({
18
+ meta: meta,
19
+ defaultSeverity: 'warning',
20
+ defaultOptions: {
21
+ fragmentRefersNameAttr: false,
22
+ },
23
+ async verify({ document, report, t }) {
24
+ const idList = new Set();
25
+ const nameList = new Set();
26
+ let hasDynamicId = false;
27
+ let hasDynamicName = false;
28
+ const isMutable = document.nodeList.some(node => node.is(node.MARKUPLINT_PREPROCESSOR_BLOCK));
29
+ if (isMutable) {
30
+ return;
31
+ }
32
+ for (const el of document.querySelectorAll('[id]')) {
33
+ const attr = el.getAttributeNode('id');
34
+ if (!attr) {
35
+ continue;
36
+ }
37
+ if (attr.isDynamicValue) {
38
+ hasDynamicId = true;
39
+ }
40
+ if (attr.valueType !== 'code') {
41
+ idList.add(decodeEntities(attr.value));
42
+ }
43
+ }
44
+ if (hasDynamicId) {
45
+ return;
46
+ }
47
+ for (const el of document.querySelectorAll('[name]')) {
48
+ const attr = el.getAttributeNode('name');
49
+ if (!attr) {
50
+ continue;
51
+ }
52
+ if (attr.isDynamicValue) {
53
+ hasDynamicName = true;
54
+ }
55
+ if (attr.valueType !== 'code') {
56
+ nameList.add(decodeEntities(attr.value));
57
+ }
58
+ }
59
+ await document.walkOn('Element', el => {
60
+ if (el.rule.options.fragmentRefersNameAttr && hasDynamicName) {
61
+ return;
62
+ }
63
+ if (!el.matches(HYPERLINK_SELECTOR)) {
64
+ return;
65
+ }
66
+ const href = el.getAttributeNode('href');
67
+ if (!href) {
68
+ return;
69
+ }
70
+ const rawFragment = href.value.match(/^#(.+)/)?.[1];
71
+ if (rawFragment == null) {
72
+ return;
73
+ }
74
+ const decodedFragment = decodeHref(rawFragment);
75
+ // > 2. If fragment is the empty string, then return the special value top of the document.
76
+ // >
77
+ // > 9. If decodedFragment is an ASCII case-insensitive match for the string top, then return the top of the document.
78
+ if (decodedFragment === '' || /^top$/i.test(decodedFragment)) {
79
+ return;
80
+ }
81
+ if (!idList.has(decodedFragment) &&
82
+ (el.rule.options.fragmentRefersNameAttr ? !nameList.has(decodedFragment) : true)) {
83
+ report({
84
+ scope: href,
85
+ line: href.valueNode?.startLine,
86
+ col: href.valueNode?.startCol,
87
+ raw: href.valueNode?.raw,
88
+ message: t('Missing {0}', t('"{0*}" ID', decodedFragment)),
89
+ });
90
+ }
91
+ });
92
+ },
93
+ });
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ readonly category: "references";
3
+ };
4
+ export default _default;
@@ -0,0 +1,3 @@
1
+ export default {
2
+ category: 'references',
3
+ };
@@ -1,10 +1,2 @@
1
- /**
2
- * Rule that disallows consecutive `<br>` elements.
3
- *
4
- * Queries all `<br>` elements in the document and checks whether the next
5
- * non-whitespace sibling is another `<br>`. Consecutive line breaks are
6
- * typically a sign that a more semantic element (e.g., `<p>`) should be
7
- * used instead, which is important for accessibility.
8
- */
9
1
  declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, undefined>>;
10
2
  export default _default;
@@ -1,13 +1,5 @@
1
1
  import { createRule } from '@markuplint/ml-core';
2
2
  import meta from './meta.js';
3
- /**
4
- * Rule that disallows consecutive `<br>` elements.
5
- *
6
- * Queries all `<br>` elements in the document and checks whether the next
7
- * non-whitespace sibling is another `<br>`. Consecutive line breaks are
8
- * typically a sign that a more semantic element (e.g., `<p>`) should be
9
- * used instead, which is important for accessibility.
10
- */
11
3
  export default createRule({
12
4
  meta: meta,
13
5
  defaultSeverity: 'warning',
@@ -1,4 +1,3 @@
1
- /** Rule metadata for `no-consecutive-br`: categorized as an accessibility rule. */
2
1
  declare const _default: {
3
2
  readonly category: "a11y";
4
3
  readonly fixable: true;
@@ -1,4 +1,3 @@
1
- /** Rule metadata for `no-consecutive-br`: categorized as an accessibility rule. */
2
1
  export default {
3
2
  category: 'a11y',
4
3
  fixable: true,
@@ -0,0 +1,25 @@
1
+ /**
2
+ * HTML LS "after body" insertion mode:
3
+ *
4
+ * > An end-of-file token: Stop parsing.
5
+ * >
6
+ * > Anything else: Parse error. Switch the insertion mode to "in body" and
7
+ * > reprocess the token.
8
+ *
9
+ * Whitespace characters (U+0009/000A/000C/000D/0020) have their own case one
10
+ * step above ("process using the rules for the 'in body' insertion mode"
11
+ * without the parse error), so a trailing newline after `</body>` is normal
12
+ * and out of scope here — only a start tag or non-whitespace text reaching
13
+ * this insertion mode is the "Anything else" parse error. Because the
14
+ * reprocessing switches back to "in body", the offending content still ends
15
+ * up nested inside `<body>` in the resulting tree even though, in the
16
+ * source, it appears after `<body>`'s own end tag.
17
+ *
18
+ * Scoped to `<body>`'s direct children: anything deeper (e.g. text inside a
19
+ * later `<script>`) is that descendant's own content, not a stray token that
20
+ * arrived after the body boundary closed.
21
+ *
22
+ * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-afterbody
23
+ */
24
+ declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, undefined>>;
25
+ export default _default;
@@ -0,0 +1,51 @@
1
+ import { createRule } from '@markuplint/ml-core';
2
+ import meta from './meta.js';
3
+ /**
4
+ * HTML LS "after body" insertion mode:
5
+ *
6
+ * > An end-of-file token: Stop parsing.
7
+ * >
8
+ * > Anything else: Parse error. Switch the insertion mode to "in body" and
9
+ * > reprocess the token.
10
+ *
11
+ * Whitespace characters (U+0009/000A/000C/000D/0020) have their own case one
12
+ * step above ("process using the rules for the 'in body' insertion mode"
13
+ * without the parse error), so a trailing newline after `</body>` is normal
14
+ * and out of scope here — only a start tag or non-whitespace text reaching
15
+ * this insertion mode is the "Anything else" parse error. Because the
16
+ * reprocessing switches back to "in body", the offending content still ends
17
+ * up nested inside `<body>` in the resulting tree even though, in the
18
+ * source, it appears after `<body>`'s own end tag.
19
+ *
20
+ * Scoped to `<body>`'s direct children: anything deeper (e.g. text inside a
21
+ * later `<script>`) is that descendant's own content, not a stray token that
22
+ * arrived after the body boundary closed.
23
+ *
24
+ * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-afterbody
25
+ */
26
+ export default createRule({
27
+ meta: meta,
28
+ verify({ document, report, t }) {
29
+ const body = document.querySelector('body');
30
+ if (!body?.closeTag)
31
+ return;
32
+ const bodyCloseEnd = body.closeTag.startOffset + body.closeTag.raw.length;
33
+ for (const child of body.childNodes) {
34
+ if (child.startOffset < bodyCloseEnd)
35
+ continue;
36
+ if (child.is(child.ELEMENT_NODE)) {
37
+ report({
38
+ scope: child,
39
+ message: t('Content after the end tag of the "{0}" element is not allowed', 'body'),
40
+ });
41
+ continue;
42
+ }
43
+ if (child.is(child.TEXT_NODE) && child.raw.trim() !== '') {
44
+ report({
45
+ scope: child,
46
+ message: t('Content after the end tag of the "{0}" element is not allowed', 'body'),
47
+ });
48
+ }
49
+ }
50
+ },
51
+ });
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ readonly category: "syntax";
3
+ };
4
+ export default _default;
@@ -0,0 +1,3 @@
1
+ export default {
2
+ category: 'syntax',
3
+ };
@@ -0,0 +1,10 @@
1
+ import type { Options } from '../wai-aria/types.js';
2
+ /**
3
+ * Split from the former `wai-aria-implicit-props` rule (#3989): the
4
+ * "contradictory" half. See `checkingContradictoryAriaProp`'s JSDoc for the
5
+ * full spec citation. Must-level (ARIA in HTML §6 conformance), so this rule
6
+ * uses the default `error` severity — contrast `no-redundant-aria-prop`'s
7
+ * should-level `warning`, which the former combined rule used uniformly.
8
+ */
9
+ declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, Options>>;
10
+ export default _default;
@@ -0,0 +1,34 @@
1
+ import { createRule, ariaSpecs, getAttrSpecs, getSpec } from '@markuplint/ml-core';
2
+ import { ARIA_RECOMMENDED_VERSION } from '@markuplint/ml-spec';
3
+ import { checkingContradictoryAriaProp } from '../wai-aria/checkings/contradictory-aria-prop.js';
4
+ import { defaultOptions } from '../wai-aria/default-options.js';
5
+ import meta from './meta.js';
6
+ /**
7
+ * Split from the former `wai-aria-implicit-props` rule (#3989): the
8
+ * "contradictory" half. See `checkingContradictoryAriaProp`'s JSDoc for the
9
+ * full spec citation. Must-level (ARIA in HTML §6 conformance), so this rule
10
+ * uses the default `error` severity — contrast `no-redundant-aria-prop`'s
11
+ * should-level `warning`, which the former combined rule used uniformly.
12
+ */
13
+ export default createRule({
14
+ meta,
15
+ defaultOptions,
16
+ async verify({ document, report }) {
17
+ await document.walkOn('Element', el => {
18
+ const elSpec = getSpec(el, document.specs.specs);
19
+ if (!elSpec)
20
+ return;
21
+ if (!elSpec.globalAttrs['#ARIAAttrs'])
22
+ return;
23
+ const propAttrs = el.attributes.filter(attr => /^aria-/i.test(attr.name));
24
+ if (propAttrs.length === 0)
25
+ return;
26
+ const ariaVersion = el.rule.options?.version ?? document.ruleCommonSettings?.ariaVersion ?? ARIA_RECOMMENDED_VERSION;
27
+ const { props: propSpecs } = ariaSpecs(document.specs, ariaVersion);
28
+ const attrSpecs = getAttrSpecs(el, document.specs);
29
+ for (const attr of propAttrs) {
30
+ report(checkingContradictoryAriaProp({ attr, propSpecs, attrSpecs }));
31
+ }
32
+ });
33
+ },
34
+ });
@@ -1,4 +1,3 @@
1
1
  import type { Options } from '../wai-aria/types.js';
2
- /** Warns when an abstract WAI-ARIA role is used directly in content. */
3
2
  declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, Options>>;
4
3
  export default _default;
@@ -3,7 +3,6 @@ import { ARIA_RECOMMENDED_VERSION } from '@markuplint/ml-spec';
3
3
  import { checkingDefaultValue } from '../wai-aria/checkings/default-value.js';
4
4
  import { defaultOptions } from '../wai-aria/default-options.js';
5
5
  import meta from './meta.js';
6
- /** Warns when an ARIA property is explicitly set to its spec-defined default value. */
7
6
  export default createRule({
8
7
  meta,
9
8
  defaultSeverity: 'warning',
@@ -1,9 +1,2 @@
1
- /**
2
- * Rule that disallows explicitly setting an attribute to its default value.
3
- *
4
- * Looks up each attribute's default value from the spec and reports when
5
- * the authored value matches the default, since the attribute can be
6
- * omitted entirely for the same effect.
7
- */
8
1
  declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, undefined>>;
9
2
  export default _default;
@@ -1,13 +1,6 @@
1
1
  import { createRule, getAttrSpecs } from '@markuplint/ml-core';
2
2
  import { removeAttr, toNormalizedValue } from '../helpers.js';
3
3
  import meta from './meta.js';
4
- /**
5
- * Rule that disallows explicitly setting an attribute to its default value.
6
- *
7
- * Looks up each attribute's default value from the spec and reports when
8
- * the authored value matches the default, since the attribute can be
9
- * omitted entirely for the same effect.
10
- */
11
4
  export default createRule({
12
5
  meta: meta,
13
6
  defaultSeverity: 'warning',
@@ -1,4 +1,3 @@
1
- /** Rule metadata for `no-default-value`: categorized as a style rule. */
2
1
  declare const _default: {
3
2
  readonly category: "style";
4
3
  readonly fixable: true;
@@ -1,4 +1,3 @@
1
- /** Rule metadata for `no-default-value`: categorized as a style rule. */
2
1
  export default {
3
2
  category: 'style',
4
3
  fixable: true,
@@ -0,0 +1,3 @@
1
+ import type { Options } from '../wai-aria/types.js';
2
+ declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, Options>>;
3
+ export default _default;
@@ -3,7 +3,6 @@ import { ARIA_RECOMMENDED_VERSION } from '@markuplint/ml-spec';
3
3
  import { checkingDeprecatedProps } from '../wai-aria/checkings/deprecated-props.js';
4
4
  import { defaultOptions } from '../wai-aria/default-options.js';
5
5
  import meta from './meta.js';
6
- /** Warns when a deprecated ARIA property or state is used on a role. */
7
6
  export default createRule({
8
7
  meta,
9
8
  defaultSeverity: 'warning',
@@ -0,0 +1,2 @@
1
+ declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, undefined>>;
2
+ export default _default;