@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
@@ -1,9 +1,16 @@
1
1
  import { createRule } from '@markuplint/ml-core';
2
2
  import meta from './meta.js';
3
3
  import { getImageDimensions } from './resolve-image-size.js';
4
+ /**
5
+ * HTML LS §4.8.17 Dimension attributes: "the specified height and width must
6
+ * match the dimensions of the intrinsic aspect ratio". `width`/`height`
7
+ * attributes are integers, so an image whose intrinsic ratio doesn't divide
8
+ * evenly can never have an exact integer match — a half-pixel tolerance
9
+ * absorbs that unavoidable rounding without accepting a genuinely wrong ratio.
10
+ */
11
+ const TOLERANCE_PX = 0.5;
4
12
  export default createRule({
5
13
  meta: meta,
6
- defaultSeverity: 'warning',
7
14
  defaultOptions: {},
8
15
  async verify({ document, report }) {
9
16
  await document.walkOn('Element', async (el) => {
@@ -61,8 +68,11 @@ export default createRule({
61
68
  return;
62
69
  }
63
70
  const { width: actualWidth, height: actualHeight } = dimensions;
64
- // Cross-multiplication comparison to avoid floating-point errors
65
- if (attrWidth * actualHeight !== attrHeight * actualWidth) {
71
+ // Cross-multiplication keeps the comparison in integer space; dividing by
72
+ // actualWidth expresses the mismatch in height-pixel-equivalent units so it
73
+ // can be checked against the pixel tolerance.
74
+ const mismatchPx = Math.abs(attrWidth * actualHeight - attrHeight * actualWidth) / actualWidth;
75
+ if (mismatchPx > TOLERANCE_PX) {
66
76
  report({
67
77
  scope: el,
68
78
  message: `The aspect ratio of the image (${actualWidth}:${actualHeight}) does not match the width/height attributes (${widthStr}:${heightStr})`,
@@ -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
+ };
@@ -126,7 +126,12 @@ export async function getImageDimensions(src, documentRoot, documentFilename) {
126
126
  return null;
127
127
  }
128
128
  await loadCacheFromDisk();
129
- // Get file size for cache key
129
+ // Get file size for cache key. Deliberately treats every failure class the
130
+ // same (missing file, permission denied, I/O error, etc.) as "can't check
131
+ // this image" rather than a lint-worthy violation — a filesystem problem
132
+ // unrelated to markup correctness shouldn't fail the lint run, and this
133
+ // rule has no way to distinguish "the author has a typo in src" (already
134
+ // the common, expected case) from a transient/environmental read failure.
130
135
  let fileSize;
131
136
  try {
132
137
  const fileStat = await stat(absolutePath);
@@ -140,7 +145,8 @@ export async function getImageDimensions(src, documentRoot, documentFilename) {
140
145
  if (cached) {
141
146
  return cached;
142
147
  }
143
- // Read and measure the image
148
+ // Read and measure the image. Same rationale as the `stat` catch above:
149
+ // any read failure means this rule can't check the image, not a violation.
144
150
  let buffer;
145
151
  try {
146
152
  buffer = await readFile(absolutePath);
@@ -0,0 +1,12 @@
1
+ /**
2
+ * HTML LS § Srcset attributes: every candidate in a `srcset` must use the
3
+ * same kind of descriptor — all width (`w`) or all pixel density (`x`,
4
+ * including the implied `1x` of a descriptor-less candidate). Split out of
5
+ * the former `srcset-sizes-constraint` rule's Check 2.
6
+ *
7
+ * Overlaps with the `Srcset` type validator `no-invalid-attr-value` uses for
8
+ * the same attribute: that rule validates syntax, this one validates the
9
+ * inter-descriptor constraint, and both may fire on the same mixed value.
10
+ */
11
+ declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, undefined>>;
12
+ export default _default;
@@ -0,0 +1,47 @@
1
+ import { createRule } from '@markuplint/ml-core';
2
+ import { parseSrcset } from '../srcset-sizes-constraint/parse-srcset.js';
3
+ import meta from './meta.js';
4
+ /**
5
+ * HTML LS § Srcset attributes: every candidate in a `srcset` must use the
6
+ * same kind of descriptor — all width (`w`) or all pixel density (`x`,
7
+ * including the implied `1x` of a descriptor-less candidate). Split out of
8
+ * the former `srcset-sizes-constraint` rule's Check 2.
9
+ *
10
+ * Overlaps with the `Srcset` type validator `no-invalid-attr-value` uses for
11
+ * the same attribute: that rule validates syntax, this one validates the
12
+ * inter-descriptor constraint, and both may fire on the same mixed value.
13
+ */
14
+ export default createRule({
15
+ meta,
16
+ async verify({ document, report }) {
17
+ await document.walkOn('Element', el => {
18
+ const localName = el.localName;
19
+ // Only check img and source (inside picture) elements
20
+ if (localName !== 'img' && localName !== 'source') {
21
+ return;
22
+ }
23
+ // source is only relevant inside <picture>
24
+ if (localName === 'source' && el.parentElement?.localName !== 'picture') {
25
+ return;
26
+ }
27
+ // Skip if element has spread attributes (dynamic props)
28
+ if (el.hasSpreadAttr) {
29
+ return;
30
+ }
31
+ const srcsetAttr = el.getAttributeNode('srcset');
32
+ if (!srcsetAttr || srcsetAttr.isDynamicValue) {
33
+ return;
34
+ }
35
+ const parsed = parseSrcset(srcsetAttr.value);
36
+ if (parsed.hasWidth && (parsed.hasDensity || parsed.hasImplied)) {
37
+ report({
38
+ scope: el,
39
+ line: srcsetAttr.valueNode?.startLine,
40
+ col: srcsetAttr.valueNode?.startCol,
41
+ raw: srcsetAttr.valueNode?.raw,
42
+ message: 'The "srcset" attribute must not mix width and pixel density descriptors',
43
+ });
44
+ }
45
+ });
46
+ },
47
+ });
@@ -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
+ };
@@ -0,0 +1,10 @@
1
+ import type { Roles } from '../landmark-roles/roles.js';
2
+ /**
3
+ * Configuration options for the `no-nested-top-level-landmark` rule.
4
+ */
5
+ type Options = {
6
+ /** Landmark roles to exclude from validation. */
7
+ ignoreRoles: Roles[];
8
+ };
9
+ declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, Options>>;
10
+ export default _default;
@@ -0,0 +1,52 @@
1
+ import { createRule } from '@markuplint/ml-core';
2
+ import { computeLandmarkRoles, landmarkRoleElementUUIDList } from '../landmark-roles/roles.js';
3
+ import meta from './meta.js';
4
+ /**
5
+ * Roles this rule requires to be top-level landmarks — not nested inside any
6
+ * other landmark.
7
+ *
8
+ * Split from the former `landmark-roles` rule (#3989), unchanged: APG's
9
+ * Landmark Regions practice also requires `complementary` to be top-level,
10
+ * but this rule deliberately does not check it. `<aside>`'s implicit role is
11
+ * conditional under ARIA 1.3 (v5's default version) — nested inside certain
12
+ * sectioning ancestors it demotes to `generic`, not `complementary` — and
13
+ * this rule's selector-based detection (`landmark-roles/roles.ts`) has no way
14
+ * to tell the two apart, so checking `complementary` here would produce
15
+ * false positives for legitimately generic asides. See the v4→v5 ARIA
16
+ * migration guide's "`<aside>` conditional role mapping" section for the
17
+ * full history of that decision.
18
+ *
19
+ * @see https://www.w3.org/WAI/ARIA/apg/practices/landmark-regions/
20
+ */
21
+ const topLevelRoles = ['banner', 'main', 'contentinfo'];
22
+ export default createRule({
23
+ meta,
24
+ defaultSeverity: 'warning',
25
+ defaultOptions: {
26
+ ignoreRoles: [],
27
+ },
28
+ verify({ document, report, t }) {
29
+ if (document.isFragment) {
30
+ return;
31
+ }
32
+ const roles = computeLandmarkRoles(document);
33
+ const uuidList = landmarkRoleElementUUIDList(roles);
34
+ for (const role of topLevelRoles) {
35
+ const elements = roles[role];
36
+ for (const el of elements) {
37
+ if (el.rule.disabled) {
38
+ continue;
39
+ }
40
+ if (el.rule.options.ignoreRoles?.includes(role)) {
41
+ continue;
42
+ }
43
+ if (el.isDescendantByUUIDList(uuidList)) {
44
+ report({
45
+ scope: el,
46
+ message: t('{0} should be {1}', t('the "{0*}" {1}', role, 'role'), 'top level'),
47
+ });
48
+ }
49
+ }
50
+ }
51
+ },
52
+ });
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ readonly category: "a11y";
3
+ };
4
+ export default _default;
@@ -0,0 +1,3 @@
1
+ export default {
2
+ category: 'a11y',
3
+ };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Options for the `no-nonstandard-features` rule.
3
+ */
4
+ type Options = {
5
+ /** Features to ignore. Element name ("dialog") or attribute pattern ("input[list]"). */
6
+ readonly ignoreFeatures?: readonly string[];
7
+ };
8
+ declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, Options>>;
9
+ export default _default;
@@ -0,0 +1,53 @@
1
+ import { createRule, getAttrSpecs, getSpec } from '@markuplint/ml-core';
2
+ import meta from './meta.js';
3
+ export default createRule({
4
+ meta: meta,
5
+ defaultSeverity: 'warning',
6
+ defaultOptions: {},
7
+ async verify({ document, report, t }) {
8
+ const options = document.rule.options;
9
+ const ignoreFeatures = new Set(options.ignoreFeatures);
10
+ await document.walkOn('Element', el => {
11
+ // Web components and authored elements (JSX/Vue/Svelte) reach this rule
12
+ // via `pretenders`: they masquerade as a known HTML element on `el.localName`,
13
+ // so spec lookups below resolve correctly. See #3740.
14
+ if (el.namespaceURI !== 'http://www.w3.org/1999/xhtml' ||
15
+ (el.elementType !== 'html' && el.pretenderContext?.type !== 'pretender')) {
16
+ return;
17
+ }
18
+ const elName = el.localName;
19
+ const elOptions = el.rule.options;
20
+ const elIgnoreFeatures = new Set(elOptions.ignoreFeatures ?? ignoreFeatures);
21
+ if (!elIgnoreFeatures.has(elName)) {
22
+ const spec = getSpec(el, document.specs.specs);
23
+ if (spec?.nonStandard) {
24
+ report({
25
+ scope: el,
26
+ message: t('{0} is {1:c}', t('the "{0*}" {1}', elName, 'element'), 'non-standard'),
27
+ });
28
+ }
29
+ }
30
+ const attrSpecs = getAttrSpecs(el, document.specs);
31
+ for (const attr of el.attributes) {
32
+ if (attr.isDirective) {
33
+ continue;
34
+ }
35
+ const attrName = attr.name;
36
+ const ignoreKey = `${elName}[${attrName}]`;
37
+ if (elIgnoreFeatures.has(ignoreKey)) {
38
+ continue;
39
+ }
40
+ const attrSpec = attrSpecs?.find(s => s.name === attrName);
41
+ if (attrSpec?.nonStandard) {
42
+ report({
43
+ scope: attr,
44
+ line: attr.nameNode?.startLine,
45
+ col: attr.nameNode?.startCol,
46
+ raw: attr.nameNode?.raw,
47
+ message: t('{0} is {1:c}', t('the "{0*}" {1}', attrName, 'attribute'), 'non-standard'),
48
+ });
49
+ }
50
+ }
51
+ });
52
+ },
53
+ });
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ readonly category: "compat";
3
+ };
4
+ export default _default;
@@ -0,0 +1,3 @@
1
+ export default {
2
+ category: 'compat',
3
+ };
@@ -0,0 +1,2 @@
1
+ declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, undefined>>;
2
+ export default _default;
@@ -0,0 +1,27 @@
1
+ import { createRule, getAttrSpecs } from '@markuplint/ml-core';
2
+ import meta from './meta.js';
3
+ export default createRule({
4
+ meta: meta,
5
+ async verify({ document, report, t }) {
6
+ await document.walkOn('Attr', attr => {
7
+ const attrSpecs = getAttrSpecs(attr.ownerElement, document.specs);
8
+ if (!attrSpecs) {
9
+ return;
10
+ }
11
+ const name = attr.name;
12
+ const attrSpec = attrSpecs.find(item => item.name === name);
13
+ if (!attrSpec) {
14
+ return;
15
+ }
16
+ if (attrSpec.obsolete) {
17
+ report({
18
+ scope: attr,
19
+ line: attr.nameNode?.startLine,
20
+ col: attr.nameNode?.startCol,
21
+ raw: attr.nameNode?.raw,
22
+ message: t('{0} is {1:c}', t('the "{0*}" {1}', name, 'attribute'), 'obsolete'),
23
+ });
24
+ }
25
+ });
26
+ },
27
+ });
@@ -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
+ };
@@ -0,0 +1,2 @@
1
+ declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, undefined>>;
2
+ export default _default;
@@ -1,31 +1,24 @@
1
1
  import { createRule } from '@markuplint/ml-core';
2
2
  import meta from './meta.js';
3
3
  /**
4
- * Rule that validates the presence and correctness of the document's DOCTYPE
5
- * declaration.
6
- *
7
- * Reports an error when no DOCTYPE is found (skipped for document fragments)
8
- * and when an obsolete DOCTYPE (one with a public or system identifier) is
9
- * declared.
4
+ * HTML LS §13.1.1: the "force-quirks flag" doctype-parsing algorithm has no
5
+ * exception for this string, but §the-initial-insertion-mode / the DOCTYPE
6
+ * grammar explicitly permits `<!DOCTYPE html SYSTEM "about:legacy-compat">`
7
+ * as the one conforming legacy-string doctype, used to keep a document
8
+ * shareable with old parsers that require a system identifier.
10
9
  */
10
+ const LEGACY_COMPAT_SYSTEM_ID = 'about:legacy-compat';
11
11
  export default createRule({
12
12
  meta: meta,
13
- defaultValue: 'always',
14
- defaultOptions: {
15
- denyObsoleteType: true,
16
- },
17
13
  verify({ document, report, t }) {
18
14
  if (document.isFragment) {
19
15
  return;
20
16
  }
21
17
  const doctype = document.doctype;
22
18
  if (!doctype) {
23
- report({
24
- message: t('Require {0}', 'doctype'),
25
- line: 1,
26
- col: 1,
27
- raw: '',
28
- });
19
+ return;
20
+ }
21
+ if (!doctype.publicId && doctype.systemId === LEGACY_COMPAT_SYSTEM_ID) {
29
22
  return;
30
23
  }
31
24
  if ((doctype.name.toLowerCase() === 'html' && doctype.publicId) || doctype.systemId) {
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ readonly category: "structure";
3
+ };
4
+ export default _default;
@@ -0,0 +1,3 @@
1
+ export default {
2
+ category: 'structure',
3
+ };
@@ -0,0 +1,2 @@
1
+ declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, undefined>>;
2
+ export default _default;
@@ -1,26 +1,22 @@
1
1
  import { createRule, getSpec } from '@markuplint/ml-core';
2
2
  import meta from './meta.js';
3
- /**
4
- * Rule that reports the use of deprecated or obsolete HTML elements.
5
- *
6
- * Walks HTML and SVG elements and checks their spec status. Reports any
7
- * element that is marked as deprecated or obsolete in the HTML specification.
8
- */
9
3
  export default createRule({
10
4
  meta: meta,
11
5
  async verify({ document, report, t }) {
12
6
  await document.walkOn('Element', el => {
13
7
  if (!(el.namespaceURI === 'http://www.w3.org/1999/xhtml' ||
14
8
  el.namespaceURI === 'http://www.w3.org/2000/svg') ||
15
- el.elementType !== 'html') {
9
+ // Web components and authored elements (JSX/Vue/Svelte) reach this rule
10
+ // through `pretenders`: they masquerade as a known HTML element via
11
+ // `el.localName`, so the spec lookup below resolves correctly. See #3740.
12
+ (el.elementType !== 'html' && el.pretenderContext?.type !== 'pretender')) {
16
13
  return;
17
14
  }
18
15
  const spec = getSpec(el, document.specs.specs);
19
- if (spec && (spec.obsolete != null || spec.deprecated)) {
20
- const message = t('{0} is {1:c}', t('the "{0*}" {1}', el.localName, 'element'), spec.deprecated ? 'deprecated' : 'obsolete');
16
+ if (spec && spec.obsolete != null) {
21
17
  report({
22
18
  scope: el,
23
- message,
19
+ message: t('{0} is {1:c}', t('the "{0*}" {1}', el.localName, 'element'), 'obsolete'),
24
20
  });
25
21
  }
26
22
  });
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ readonly category: "structure";
3
+ };
4
+ export default _default;
@@ -0,0 +1,3 @@
1
+ export default {
2
+ category: 'structure',
3
+ };
@@ -1,9 +1,2 @@
1
- /**
2
- * Rule that detects orphaned end tags with no matching start tag.
3
- *
4
- * Scans text nodes and reports any that originated from invalid (bogus) AST
5
- * nodes, which indicates a stray end tag that the parser could not match
6
- * to an opening element.
7
- */
8
1
  declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, null>>;
9
2
  export default _default;
@@ -1,12 +1,5 @@
1
1
  import { createRule } from '@markuplint/ml-core';
2
2
  import meta from './meta.js';
3
- /**
4
- * Rule that detects orphaned end tags with no matching start tag.
5
- *
6
- * Scans text nodes and reports any that originated from invalid (bogus) AST
7
- * nodes, which indicates a stray end tag that the parser could not match
8
- * to an opening element.
9
- */
10
3
  export default createRule({
11
4
  meta,
12
5
  async verify({ document, report, t }) {
@@ -1,6 +1,6 @@
1
- /** Rule metadata for `no-orphaned-end-tag`: categorized as a validation rule. */
2
1
  declare const _default: {
3
- readonly category: "validation";
2
+ readonly category: "syntax";
4
3
  readonly fixable: true;
4
+ readonly mirrorsParseErrorCodes: readonly ["end-tag-without-matching-open-element"];
5
5
  };
6
6
  export default _default;
@@ -1,5 +1,8 @@
1
- /** Rule metadata for `no-orphaned-end-tag`: categorized as a validation rule. */
2
1
  export default {
3
- category: 'validation',
2
+ category: 'syntax',
4
3
  fixable: true,
4
+ // Mirrors parse5's `end-tag-without-matching-open-element`. This rule
5
+ // reads `text.isBogus` (set by parser-utils from parse5's tree-construction
6
+ // step) so the detection is by definition aligned with parse5's judgement.
7
+ mirrorsParseErrorCodes: ['end-tag-without-matching-open-element'],
5
8
  };
@@ -0,0 +1,8 @@
1
+ import type { Options } from '../wai-aria/types.js';
2
+ /**
3
+ * Split from the former `wai-aria-disallowed-props` rule (#3989): the naming-
4
+ * prohibition constraint alone. See `checkingProhibitedNaming`'s JSDoc for the
5
+ * full spec citation.
6
+ */
7
+ declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, Options>>;
8
+ export default _default;
@@ -0,0 +1,36 @@
1
+ import { createRule, getComputedRole, ariaSpecs, getSpec } from '@markuplint/ml-core';
2
+ import { ARIA_RECOMMENDED_VERSION } from '@markuplint/ml-spec';
3
+ import { checkingProhibitedNaming } from '../wai-aria/checkings/prohibited-naming.js';
4
+ import { defaultOptions } from '../wai-aria/default-options.js';
5
+ import meta from './meta.js';
6
+ /**
7
+ * Split from the former `wai-aria-disallowed-props` rule (#3989): the naming-
8
+ * prohibition constraint alone. See `checkingProhibitedNaming`'s JSDoc for the
9
+ * full spec citation.
10
+ */
11
+ export default createRule({
12
+ meta,
13
+ defaultOptions,
14
+ async verify({ document, report }) {
15
+ await document.walkOn('Element', el => {
16
+ const elSpec = getSpec(el, document.specs.specs);
17
+ // Autonomous custom elements have no spec.<el>.jsonc entry. They
18
+ // still accept aria-* per the platform, so do not skip them here —
19
+ // `checkingProhibitedNaming` enforces the ARIA in HTML §4.4 naming
20
+ // prohibition for unnamed-role custom elements.
21
+ if (!elSpec && el.elementType !== 'web-component')
22
+ return;
23
+ if (elSpec && !elSpec.globalAttrs['#ARIAAttrs'])
24
+ return;
25
+ const propAttrs = el.attributes.filter(attr => /^aria-/i.test(attr.name));
26
+ if (propAttrs.length === 0)
27
+ return;
28
+ const ariaVersion = el.rule.options?.version ?? document.ruleCommonSettings?.ariaVersion ?? ARIA_RECOMMENDED_VERSION;
29
+ const computed = getComputedRole(document.specs, el, ariaVersion);
30
+ const { props: propSpecs } = ariaSpecs(document.specs, ariaVersion);
31
+ for (const attr of propAttrs) {
32
+ report(checkingProhibitedNaming({ attr, role: computed.role, propSpecs }));
33
+ }
34
+ });
35
+ },
36
+ });
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ readonly category: "a11y";
3
+ };
4
+ export default _default;
@@ -0,0 +1,3 @@
1
+ export default {
2
+ category: 'a11y',
3
+ };
@@ -1,7 +1,7 @@
1
1
  /** An array of characters recognized as bullet-like symbols indicating list items. */
2
2
  type Bullets = readonly string[];
3
3
  /**
4
- * Configuration options for the use-list rule.
4
+ * Configuration options for the no-pseudo-list rule.
5
5
  */
6
6
  type Options = {
7
7
  /** Bullet characters that require a space after them to be considered list items. */
@@ -15,12 +15,5 @@ type Options = {
15
15
  /** Whether to report text nodes preceded by a preprocessor block. */
16
16
  prevCodeBlock?: boolean;
17
17
  };
18
- /**
19
- * Rule that suggests using `<li>` elements instead of text with bullet characters.
20
- *
21
- * Detects text nodes that start with bullet-like characters (Unicode bullets,
22
- * markdown-style dashes/asterisks, etc.) and recommends converting them into
23
- * proper list markup using `<li>` elements.
24
- */
25
18
  declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<Bullets, Options>>;
26
19
  export default _default;
@@ -1,13 +1,6 @@
1
1
  import { createRule } from '@markuplint/ml-core';
2
2
  import { decodeEntities } from '@markuplint/shared';
3
3
  import meta from './meta.js';
4
- /**
5
- * Rule that suggests using `<li>` elements instead of text with bullet characters.
6
- *
7
- * Detects text nodes that start with bullet-like characters (Unicode bullets,
8
- * markdown-style dashes/asterisks, etc.) and recommends converting them into
9
- * proper list markup using `<li>` elements.
10
- */
11
4
  export default createRule({
12
5
  meta: meta,
13
6
  defaultValue: [
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ readonly category: "a11y";
3
+ };
4
+ export default _default;
@@ -0,0 +1,3 @@
1
+ export default {
2
+ category: 'a11y',
3
+ };
@@ -1,8 +1,4 @@
1
1
  import type { RuleConfigValue } from '@markuplint/ml-core';
2
- /**
3
- * Rule that detects elements with multiple accessible name sources
4
- * where a higher-priority source overrides a lower-priority one.
5
- */
6
2
  declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<RuleConfigValue, {
7
3
  checkTitleFallback: boolean;
8
4
  checkPlaceholderFallback: boolean;
@@ -2,10 +2,6 @@ import { createRule, getComputedRole } from '@markuplint/ml-core';
2
2
  import { ARIA_RECOMMENDED_VERSION, isExposed } from '@markuplint/ml-spec';
3
3
  import { accnameMayBeMutable, getOwnedLabel } from '../helpers.js';
4
4
  import meta from './meta.js';
5
- /**
6
- * Rule that detects elements with multiple accessible name sources
7
- * where a higher-priority source overrides a lower-priority one.
8
- */
9
5
  export default createRule({
10
6
  meta,
11
7
  defaultSeverity: 'warning',
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ readonly category: "a11y";
3
+ };
4
+ export default _default;
@@ -0,0 +1,3 @@
1
+ export default {
2
+ category: 'a11y',
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
+ * "redundant" half. See `checkingRedundantAriaProp`'s JSDoc for the full
5
+ * spec citation. Should-level (ARIA in HTML §6 recommends the native
6
+ * attribute), so this rule keeps the former rule's `warning` default —
7
+ * contrast `no-contradictory-aria-prop`'s `error`.
8
+ */
9
+ declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, Options>>;
10
+ export default _default;