@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,5 +0,0 @@
1
- /** Rule metadata for `deprecated-attr`: categorized as a validation rule. */
2
- declare const _default: {
3
- readonly category: "validation";
4
- };
5
- export default _default;
@@ -1,4 +0,0 @@
1
- /** Rule metadata for `deprecated-attr`: categorized as a validation rule. */
2
- export default {
3
- category: 'validation',
4
- };
@@ -1,8 +0,0 @@
1
- /**
2
- * Rule that reports the use of deprecated or obsolete HTML elements.
3
- *
4
- * Walks HTML and SVG elements and checks their spec status. Reports any
5
- * element that is marked as deprecated or obsolete in the HTML specification.
6
- */
7
- declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, undefined>>;
8
- export default _default;
@@ -1,5 +0,0 @@
1
- /** Rule metadata for `deprecated-element`: categorized as a validation rule. */
2
- declare const _default: {
3
- readonly category: "validation";
4
- };
5
- export default _default;
@@ -1,4 +0,0 @@
1
- /** Rule metadata for `deprecated-element`: categorized as a validation rule. */
2
- export default {
3
- category: 'validation',
4
- };
@@ -1,9 +0,0 @@
1
- /**
2
- * Rule that disallows elements matching the configured CSS selectors.
3
- *
4
- * Accepts an array of selector strings as its value. Queries the document
5
- * (and per-element overrides) for matching elements and reports each one
6
- * as disallowed.
7
- */
8
- declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<string[], undefined>>;
9
- export default _default;
@@ -1,5 +0,0 @@
1
- /** Rule metadata for `disallowed-element`: categorized as a validation rule. */
2
- declare const _default: {
3
- readonly category: "validation";
4
- };
5
- export default _default;
@@ -1,4 +0,0 @@
1
- /** Rule metadata for `disallowed-element`: categorized as a validation rule. */
2
- export default {
3
- category: 'validation',
4
- };
@@ -1,15 +0,0 @@
1
- /** Configuration options for the doctype rule. */
2
- type Option = {
3
- /** Whether to report obsolete doctypes that include a public or system identifier. */
4
- denyObsoleteType: boolean;
5
- };
6
- /**
7
- * Rule that validates the presence and correctness of the document's DOCTYPE
8
- * declaration.
9
- *
10
- * Reports an error when no DOCTYPE is found (skipped for document fragments)
11
- * and when an obsolete DOCTYPE (one with a public or system identifier) is
12
- * declared.
13
- */
14
- declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<"always", Option>>;
15
- export default _default;
@@ -1,5 +0,0 @@
1
- /** Rule metadata for `doctype`: categorized as a validation rule. */
2
- declare const _default: {
3
- readonly category: "validation";
4
- };
5
- export default _default;
@@ -1,4 +0,0 @@
1
- /** Rule metadata for `doctype`: categorized as a validation rule. */
2
- export default {
3
- category: 'validation',
4
- };
@@ -1,9 +0,0 @@
1
- /**
2
- * Rule that checks for missing end tags on non-void HTML elements.
3
- *
4
- * Reports elements that are neither void nor self-closing and have no
5
- * closing tag. Omitted elements and elements in documents configured
6
- * with `endTag: 'never'` are excluded.
7
- */
8
- declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, undefined>>;
9
- export default _default;
@@ -1,5 +0,0 @@
1
- /** Rule metadata for `end-tag`: categorized as a style rule. */
2
- declare const _default: {
3
- readonly category: "style";
4
- };
5
- export default _default;
@@ -1,4 +0,0 @@
1
- /** Rule metadata for `end-tag`: categorized as a style rule. */
2
- export default {
3
- category: 'style',
4
- };
@@ -1,8 +0,0 @@
1
- /**
2
- * Rule that validates heading levels (h1-h6) are not skipped.
3
- *
4
- * Ensures that heading elements appear in a sequential order without
5
- * gaps (e.g., an h4 must not follow an h2 directly without an h3 in between).
6
- */
7
- declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, null>>;
8
- export default _default;
@@ -1,5 +0,0 @@
1
- /** Rule metadata for the `heading-levels` rule, categorized as validation. */
2
- declare const _default: {
3
- readonly category: "validation";
4
- };
5
- export default _default;
@@ -1,4 +0,0 @@
1
- /** Rule metadata for the `heading-levels` rule, categorized as validation. */
2
- export default {
3
- category: 'validation',
4
- };
@@ -1,9 +0,0 @@
1
- /**
2
- * Rule that checks for duplicate `id` attribute values within a document.
3
- *
4
- * Walks all elements and collects `id` values, reporting any that have
5
- * already been seen. Dynamic values and directive attributes are excluded
6
- * from the check.
7
- */
8
- declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, undefined>>;
9
- export default _default;
@@ -1,5 +0,0 @@
1
- /** Rule metadata for `id-duplication`: categorized as a validation rule. */
2
- declare const _default: {
3
- readonly category: "validation";
4
- };
5
- export default _default;
@@ -1,4 +0,0 @@
1
- /** Rule metadata for `id-duplication`: categorized as a validation rule. */
2
- export default {
3
- category: 'validation',
4
- };
@@ -1,9 +0,0 @@
1
- /**
2
- * Rule that detects attributes that have no effect on their owner element.
3
- *
4
- * Checks each attribute's spec for ineffective conditions (CSS selectors)
5
- * and reports when the owner element matches any of those conditions,
6
- * meaning the attribute is present but has no practical effect.
7
- */
8
- declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, undefined>>;
9
- export default _default;
@@ -1,6 +0,0 @@
1
- /** Rule metadata for `ineffective-attr`: categorized as a style rule. */
2
- declare const _default: {
3
- readonly category: "style";
4
- readonly fixable: true;
5
- };
6
- export default _default;
@@ -1,5 +0,0 @@
1
- /** Rule metadata for `ineffective-attr`: categorized as a style rule. */
2
- export default {
3
- category: 'style',
4
- fixable: true,
5
- };
@@ -1,207 +0,0 @@
1
- import { createRule, getAttrSpecs, getSpec } from '@markuplint/ml-core';
2
- import { check, isEnum, isPattern } from '@markuplint/types';
3
- import { attrCheck } from '../attr-check.js';
4
- import { log as ruleLog } from '../debug.js';
5
- import { isValidAttr } from '../helpers.js';
6
- import meta from './meta.js';
7
- const log = ruleLog.extend('invalid-attr');
8
- /**
9
- * Rule that validates attributes against the HTML spec, allowed lists,
10
- * and disallowed lists.
11
- *
12
- * Checks each attribute for: existence in the spec, correct value type,
13
- * allowed/disallowed overrides from configuration, and typo suggestions
14
- * via candidate matching. Supports `allowAttrs` and `disallowAttrs`.
15
- * Non-existent attributes on elements that allow additional properties
16
- * (pretenders) can be optionally permitted.
17
- */
18
- export default createRule({
19
- meta: meta,
20
- defaultOptions: {},
21
- async verify({ document, report, t }) {
22
- await document.walkOn('Attr', attr => {
23
- // Default
24
- const allowToAddPropertiesForPretender = attr.rule.options.allowToAddPropertiesForPretender ?? true;
25
- if (attr.isDirective) {
26
- return;
27
- }
28
- // https://html.spec.whatwg.org/multipage/custom-elements.html#attr-is
29
- // "The is attribute must not be specified on an autonomous custom element"
30
- if (attr.name === 'is' && attr.ownerElement.elementType === 'web-component') {
31
- report({
32
- scope: attr,
33
- line: attr.nameNode?.startLine,
34
- col: attr.nameNode?.startCol,
35
- raw: attr.nameNode?.raw,
36
- message: t('The "{0}" attribute must not be specified on an autonomous custom element', 'is'),
37
- });
38
- return;
39
- }
40
- const attrSpecs = getAttrSpecs(attr.ownerElement, document.specs);
41
- const attrName = attr.nameNode;
42
- const name = attr.name;
43
- if (attr.ownerElement.elementType === 'html' && attr.candidate) {
44
- const message = t('{0} is {1:c}', t('the "{0*}" {1}', name, 'attribute'), 'disallowed') +
45
- t('. ') +
46
- t('Did you mean "{0}"?', attr.candidate);
47
- report({
48
- scope: attr,
49
- line: attrName?.startLine,
50
- col: attrName?.startCol,
51
- raw: attrName?.raw,
52
- message: message,
53
- });
54
- return;
55
- }
56
- const valueNode = attr.valueNode;
57
- const value = attr.value;
58
- if (attr.rule.options.ignoreAttrNamePrefix != null) {
59
- const ignoreAttrNamePrefixes = Array.isArray(attr.rule.options.ignoreAttrNamePrefix)
60
- ? attr.rule.options.ignoreAttrNamePrefix
61
- : [attr.rule.options.ignoreAttrNamePrefix];
62
- if (ignoreAttrNamePrefixes.some(prefix => name.indexOf(prefix) === 0)) {
63
- return;
64
- }
65
- }
66
- let invalid = false;
67
- const allowAttrs = {};
68
- const disallowAttrs = {};
69
- if (attr.rule.options.allowAttrs) {
70
- if (Array.isArray(attr.rule.options.allowAttrs)) {
71
- for (const allowAttr of attr.rule.options.allowAttrs) {
72
- if (typeof allowAttr === 'string') {
73
- allowAttrs[allowAttr] = 'Any';
74
- continue;
75
- }
76
- allowAttrs[allowAttr.name] = allowAttr.value;
77
- }
78
- }
79
- else {
80
- for (const [attrName, attrType] of Object.entries(attr.rule.options.allowAttrs)) {
81
- allowAttrs[attrName] = attrType;
82
- }
83
- }
84
- }
85
- if (attr.rule.options.disallowAttrs) {
86
- if (Array.isArray(attr.rule.options.disallowAttrs)) {
87
- for (const disallowAttr of attr.rule.options.disallowAttrs) {
88
- if (typeof disallowAttr === 'string') {
89
- disallowAttrs[disallowAttr] = 'Any';
90
- continue;
91
- }
92
- disallowAttrs[disallowAttr.name] = disallowAttr.value;
93
- }
94
- }
95
- else {
96
- for (const [attrName, attrType] of Object.entries(attr.rule.options.disallowAttrs)) {
97
- disallowAttrs[attrName] = attrType;
98
- }
99
- }
100
- }
101
- const allowValue = allowAttrs[name] ?? null;
102
- const disallowValue = disallowAttrs[name] ?? null;
103
- if (allowValue !== null) {
104
- invalid = attrCheck(t, name, value, true, {
105
- name,
106
- type: allowValue,
107
- description: '',
108
- });
109
- }
110
- else if (disallowValue !== null) {
111
- if (disallowValue === 'Any') {
112
- invalid = {
113
- invalidType: 'non-existent',
114
- message: t('{0} is disallowed', t('the "{0*}" {1}', name, 'attribute')),
115
- };
116
- }
117
- else {
118
- const checkResult = isPattern(disallowValue)
119
- ? check(value, disallowValue)
120
- : attrCheck(t, name, value, true, {
121
- name,
122
- type: disallowValue,
123
- description: '',
124
- });
125
- const isMatched = isPattern(disallowValue)
126
- ? checkResult.matched
127
- : checkResult === false;
128
- if (isMatched) {
129
- invalid = {
130
- invalidType: 'invalid-value',
131
- message: createDisallowMessage(t, name, disallowValue),
132
- };
133
- }
134
- }
135
- }
136
- else if (attr.ownerElement.elementType === 'html' && attrSpecs) {
137
- log('Checking %s[%s="%s"]', attr.nodeName, name, value);
138
- invalid = isValidAttr(t, name, value, attr.isDynamicValue || false, attr.ownerElement, attrSpecs, log);
139
- }
140
- const invalidList = Array.isArray(invalid) ? invalid : [invalid];
141
- for (const invalid of invalidList) {
142
- if (invalid !== false) {
143
- switch (invalid.invalidType) {
144
- case 'disallowed-attr': {
145
- report({
146
- scope: attr,
147
- message: invalid.message,
148
- });
149
- break;
150
- }
151
- case 'invalid-value': {
152
- if (attr.isDynamicValue) {
153
- break;
154
- }
155
- report({
156
- scope: attr,
157
- message: invalid.message,
158
- line: (valueNode?.startLine ?? 0) + (invalid.loc?.line ?? 0),
159
- col: invalid.loc && invalid.loc.line > 0
160
- ? invalid.loc?.col + 1
161
- : (valueNode?.startCol ?? 0) + (invalid.loc?.col ?? 0),
162
- raw: invalid.loc?.raw ?? value,
163
- });
164
- break;
165
- }
166
- case 'non-existent': {
167
- if (allowToAddPropertiesForPretender &&
168
- attr.ownerElement.pretenderContext?.type === 'origin') {
169
- return;
170
- }
171
- const spec = getSpec(attr.ownerElement, document.specs.specs);
172
- if (spec?.possibleToAddProperties) {
173
- return;
174
- }
175
- report({
176
- scope: attr,
177
- message: invalid.message,
178
- line: attrName?.startLine,
179
- col: attrName?.startCol,
180
- raw: attrName?.raw,
181
- });
182
- }
183
- }
184
- }
185
- }
186
- });
187
- },
188
- });
189
- /**
190
- * Creates an appropriate disallow message based on the type structure.
191
- *
192
- * @param t - The i18n translator
193
- * @param name - The attribute name
194
- * @param type - The attribute type or pattern
195
- * @returns A localized message string
196
- */
197
- function createDisallowMessage(t, name,
198
- // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
199
- type) {
200
- if (isPattern(type)) {
201
- return t('{0} is matched with the below disallowed patterns: {1}', t('the "{0*}" {1}', name, 'attribute'), type.pattern);
202
- }
203
- if (typeof type !== 'string' && isEnum(type)) {
204
- return t('{0} is disallowed to accept the following values: {1}', t('the "{0*}" {1}', name, 'attribute'), t(type.enum));
205
- }
206
- return t('{0} is disallowed', t('{0} of {1}', t('the {0}', 'type'), t('the "{0*}" {1}', name, 'attribute')));
207
- }
@@ -1,5 +0,0 @@
1
- /** Rule metadata for `invalid-attr`: categorized as a validation rule. */
2
- declare const _default: {
3
- readonly category: "validation";
4
- };
5
- export default _default;
@@ -1,4 +0,0 @@
1
- /** Rule metadata for `invalid-attr`: categorized as a validation rule. */
2
- export default {
3
- category: 'validation',
4
- };
@@ -1,22 +0,0 @@
1
- /**
2
- * Configuration options for the landmark-roles rule.
3
- */
4
- type Options = {
5
- /** Landmark roles to exclude from validation. */
6
- ignoreRoles: Roles[];
7
- /** Whether to require a unique accessible name when duplicate landmark roles exist. */
8
- labelEachArea: boolean;
9
- };
10
- /** Landmark roles that should appear at the top level of the document. */
11
- type TopLevelRoles = 'banner' | 'main' | 'contentinfo';
12
- /** All recognized ARIA landmark roles for this rule. */
13
- type Roles = TopLevelRoles | 'complementary' | 'form' | 'navigation' | 'region';
14
- /**
15
- * Rule that validates proper usage of ARIA landmark roles.
16
- *
17
- * Checks that `banner`, `main`, and `contentinfo` landmarks are
18
- * top-level (not nested inside other landmarks), and that when duplicate landmarks
19
- * of the same role exist, each has a unique accessible name.
20
- */
21
- declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, Options>>;
22
- export default _default;
@@ -1,142 +0,0 @@
1
- import { createRule } from '@markuplint/ml-core';
2
- import meta from './meta.js';
3
- /** CSS selectors used to identify elements with each landmark role. */
4
- const selectors = {
5
- complementary: ['[role="complementary"]', 'aside'],
6
- contentinfo: ['[role="contentinfo"]'],
7
- form: ['[role="form"]', 'form[aria-labelledby]', 'form[aria-label]', 'form[title]'],
8
- banner: ['[role="banner"]'],
9
- main: ['[role="main"]', 'main'],
10
- navigation: ['[role="navigation"]', 'nav'],
11
- region: ['[role="region"]', 'section[aria-labelledby]', 'section[aria-label]', 'section[title]'],
12
- };
13
- /** Roles that are required to be top-level landmarks per WAI-ARIA practices. */
14
- const topLevelRoles = ['banner', 'main', 'contentinfo'];
15
- /**
16
- * Rule that validates proper usage of ARIA landmark roles.
17
- *
18
- * Checks that `banner`, `main`, and `contentinfo` landmarks are
19
- * top-level (not nested inside other landmarks), and that when duplicate landmarks
20
- * of the same role exist, each has a unique accessible name.
21
- */
22
- export default createRule({
23
- meta: meta,
24
- defaultSeverity: 'warning',
25
- defaultOptions: {
26
- ignoreRoles: [],
27
- labelEachArea: true,
28
- },
29
- verify({ document, report, t }) {
30
- if (document.isFragment) {
31
- return;
32
- }
33
- const roles = {
34
- complementary: [...document.querySelectorAll(selectors.complementary.join(','))],
35
- contentinfo: [...document.querySelectorAll(selectors.contentinfo.join(','))],
36
- form: [...document.querySelectorAll(selectors.form.join(','))],
37
- banner: [...document.querySelectorAll(selectors.banner.join(','))],
38
- main: [...document.querySelectorAll(selectors.main.join(','))],
39
- navigation: [...document.querySelectorAll(selectors.navigation.join(','))],
40
- region: [...document.querySelectorAll(selectors.region.join(','))],
41
- };
42
- /**
43
- * `<header>`
44
- *
45
- * @cite https://www.w3.org/TR/wai-aria-practices/examples/landmarks/HTML5.html
46
- *
47
- * > When in context of the body element. The header element is not a banner landmark when it is a descendant of the following HTML sectioning elements:
48
- * > - article
49
- * > - aside
50
- * > - main
51
- * > - nav
52
- * > - section
53
- */
54
- const headers = [...document.querySelectorAll('header')].filter(header => {
55
- return !header.closest('article, aside, main, nav, section');
56
- });
57
- roles.banner.push(...headers);
58
- /**
59
- * `<footer>`
60
- *
61
- * @cite https://www.w3.org/TR/wai-aria-practices/examples/landmarks/HTML5.html
62
- *
63
- * > When in context of the body element. The footer element is not a contentinfo landmark when it is a descendant of the following HTML sectioning elements:
64
- * > - article
65
- * > - aside
66
- * > - main
67
- * > - nav
68
- * > - section
69
- */
70
- const footers = [...document.querySelectorAll('footer')].filter(footer => {
71
- return !footer.closest('article, aside, main, nav, section');
72
- });
73
- roles.contentinfo.push(...footers);
74
- const uuidList = landmarkRoleElementUUIDList(roles);
75
- // @cite https://www.w3.org/TR/wai-aria-practices/examples/landmarks/index.html
76
- // > `banner`, `main`, `complementary` and `contentinfo` landmarks should be top level landmarks.
77
- for (const role of topLevelRoles) {
78
- const elements = roles[role];
79
- for (const el of elements) {
80
- if (el.rule.disabled) {
81
- continue;
82
- }
83
- if (el.rule.options.ignoreRoles?.includes(role)) {
84
- continue;
85
- }
86
- if (el.isDescendantByUUIDList(uuidList)) {
87
- report({
88
- scope: el,
89
- message: t('{0} should be {1}', t('the "{0*}" {1}', role, 'role'), 'top level'),
90
- });
91
- }
92
- }
93
- }
94
- for (const role of Object.keys(roles)) {
95
- const roleEls = roles[role];
96
- const duplicated = 1 < roleEls.length;
97
- if (!duplicated) {
98
- continue;
99
- }
100
- for (const el of roleEls) {
101
- if (el.rule.disabled) {
102
- continue;
103
- }
104
- if (!el.rule.options.labelEachArea) {
105
- continue;
106
- }
107
- if (!hasLabel(el)) {
108
- report({
109
- scope: el,
110
- message: t('Require {0}', t('unique {0}', 'accessible name')),
111
- });
112
- }
113
- }
114
- }
115
- },
116
- });
117
- /**
118
- * Collects all UUIDs of elements that have landmark roles.
119
- *
120
- * @param roleset - The mapping of roles to their matched elements.
121
- * @returns A flat array of UUIDs for all landmark role elements.
122
- */
123
- function landmarkRoleElementUUIDList(
124
- // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
125
- roleset) {
126
- return Object.values(roleset).flatMap(elements => elements.map(element => element.uuid));
127
- }
128
- /**
129
- * Checks whether an element has an accessible label via `aria-label` or `aria-labelledby`.
130
- *
131
- * @param el - The landmark element to check.
132
- * @returns `true` if the element has an accessible name, `false` otherwise.
133
- */
134
- function hasLabel(
135
- // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
136
- el) {
137
- const hasHeading = el.querySelectorAll('h1, h2, h3, h4, h5, h6').length > 0;
138
- if (hasHeading && el.matches('[aria-labelledby]')) {
139
- return true;
140
- }
141
- return el.matches('[aria-label]');
142
- }
@@ -1,5 +0,0 @@
1
- /** Rule metadata for the `landmark-roles` rule, categorized as accessibility. */
2
- declare const _default: {
3
- readonly category: "a11y";
4
- };
5
- export default _default;
@@ -1,4 +0,0 @@
1
- /** Rule metadata for the `landmark-roles` rule, categorized as accessibility. */
2
- export default {
3
- category: 'a11y',
4
- };
@@ -1,10 +0,0 @@
1
- /**
2
- * Rule that detects perceptible content between a popover trigger and its target.
3
- *
4
- * When a `[popovertarget]` element or a `[commandfor]` element with a popover-related
5
- * `command` attribute and its corresponding `[popover]` target exist in the DOM, any
6
- * focusable elements, elements with accessible names, or non-whitespace text nodes
7
- * between them are reported as violations.
8
- */
9
- declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, undefined>>;
10
- export default _default;
@@ -1,5 +0,0 @@
1
- /** Rule metadata for the `neighbor-popovers` rule, categorized as accessibility. */
2
- declare const _default: {
3
- readonly category: "a11y";
4
- };
5
- export default _default;
@@ -1,4 +0,0 @@
1
- /** Rule metadata for the `neighbor-popovers` rule, categorized as accessibility. */
2
- export default {
3
- category: 'a11y',
4
- };
@@ -1,10 +0,0 @@
1
- /**
2
- * Rule that disallows hard-coded `id` attribute values in document fragments.
3
- *
4
- * Only active for fragment documents (e.g., component templates). Reports
5
- * any `id` attribute whose value is a static string rather than a dynamic
6
- * or code-generated value, encouraging dynamic ID generation to avoid
7
- * collisions when fragments are reused.
8
- */
9
- declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, undefined>>;
10
- export default _default;
@@ -1,5 +0,0 @@
1
- /** Rule metadata for `no-hard-code-id`: categorized as a maintainability rule. */
2
- declare const _default: {
3
- readonly category: "maintainability";
4
- };
5
- export default _default;
@@ -1,4 +0,0 @@
1
- /** Rule metadata for `no-hard-code-id`: categorized as a maintainability rule. */
2
- export default {
3
- category: 'maintainability',
4
- };