@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.
- package/CHANGELOG.md +98 -0
- package/CLAUDE.md +31 -2
- package/lib/{wai-aria-deprecated-role → aria-prop-requires-role}/index.d.ts +0 -1
- package/lib/{wai-aria-no-global-prop → aria-prop-requires-role}/index.js +0 -1
- package/lib/attr-check.d.ts +0 -48
- package/lib/attr-check.js +0 -36
- package/lib/attr-eligibility.d.ts +41 -0
- package/lib/attr-eligibility.js +60 -0
- package/lib/attr-value-quotes/index.d.ts +0 -7
- package/lib/attr-value-quotes/index.js +0 -7
- package/lib/attr-value-quotes/meta.d.ts +0 -1
- package/lib/attr-value-quotes/meta.js +0 -1
- package/lib/case-sensitive-attr-name/index.d.ts +0 -8
- package/lib/case-sensitive-attr-name/index.js +0 -8
- package/lib/case-sensitive-attr-name/meta.d.ts +0 -1
- package/lib/case-sensitive-attr-name/meta.js +0 -1
- package/lib/case-sensitive-tag-name/index.d.ts +0 -8
- package/lib/case-sensitive-tag-name/index.js +0 -8
- package/lib/case-sensitive-tag-name/meta.d.ts +0 -1
- package/lib/case-sensitive-tag-name/meta.js +0 -1
- package/lib/class-naming/index.d.ts +0 -8
- package/lib/class-naming/index.js +0 -8
- package/lib/class-naming/meta.d.ts +1 -2
- package/lib/class-naming/meta.js +1 -2
- package/lib/consistent-table-row-length/index.d.ts +14 -0
- package/lib/consistent-table-row-length/index.js +69 -0
- package/lib/consistent-table-row-length/meta.d.ts +4 -0
- package/lib/consistent-table-row-length/meta.js +3 -0
- package/lib/create-message.d.ts +2 -25
- package/lib/create-message.js +2 -53
- package/lib/debug.d.ts +1 -9
- package/lib/debug.js +1 -5
- package/lib/element-supports-aria-prop/index.d.ts +12 -0
- package/lib/element-supports-aria-prop/index.js +38 -0
- package/lib/form-attr-references-form/index.d.ts +12 -0
- package/lib/form-attr-references-form/index.js +64 -0
- package/lib/{correct-aspect-ratio → form-attr-references-form}/meta.d.ts +1 -1
- package/lib/form-attr-references-form/meta.js +3 -0
- package/lib/head-element-order/meta.d.ts +1 -1
- package/lib/head-element-order/meta.js +1 -1
- package/lib/helpers.d.ts +8 -138
- package/lib/helpers.js +24 -165
- package/lib/index.d.ts +135 -78
- package/lib/index.js +167 -82
- package/lib/input-list-references-datalist/index.d.ts +13 -0
- package/lib/input-list-references-datalist/index.js +46 -0
- package/lib/input-list-references-datalist/meta.d.ts +4 -0
- package/lib/input-list-references-datalist/meta.js +3 -0
- package/lib/itemprop-requires-itemscope/index.d.ts +21 -0
- package/lib/itemprop-requires-itemscope/index.js +53 -0
- package/lib/itemprop-requires-itemscope/meta.d.ts +4 -0
- package/lib/itemprop-requires-itemscope/meta.js +3 -0
- package/lib/label-for-references-labelable/index.d.ts +12 -0
- package/lib/label-for-references-labelable/index.js +68 -0
- package/lib/label-for-references-labelable/meta.d.ts +4 -0
- package/lib/label-for-references-labelable/meta.js +3 -0
- package/lib/label-has-control/index.d.ts +5 -5
- package/lib/label-has-control/index.js +5 -18
- package/lib/label-has-control/meta.d.ts +0 -1
- package/lib/label-has-control/meta.js +0 -1
- package/lib/label-no-multiple-controls/index.d.ts +31 -0
- package/lib/label-no-multiple-controls/index.js +104 -0
- package/lib/label-no-multiple-controls/meta.d.ts +4 -0
- package/lib/label-no-multiple-controls/meta.js +3 -0
- package/lib/landmark-roles/roles.d.ts +32 -0
- package/lib/landmark-roles/roles.js +73 -0
- package/lib/link-types/index.d.ts +0 -5
- package/lib/link-types/index.js +5 -6
- package/lib/link-types/meta.d.ts +1 -2
- package/lib/link-types/meta.js +1 -2
- package/lib/map-id-name-match/index.d.ts +10 -0
- package/lib/map-id-name-match/index.js +39 -0
- package/lib/map-id-name-match/meta.d.ts +4 -0
- package/lib/map-id-name-match/meta.js +3 -0
- package/lib/meta-charset-position/index.d.ts +15 -0
- package/lib/meta-charset-position/index.js +31 -0
- package/lib/meta-charset-position/meta.d.ts +4 -0
- package/lib/meta-charset-position/meta.js +3 -0
- package/lib/meter-value-bounds/index.d.ts +10 -0
- package/lib/meter-value-bounds/index.js +123 -0
- package/lib/meter-value-bounds/meta.d.ts +4 -0
- package/lib/meter-value-bounds/meta.js +3 -0
- package/lib/{wai-aria-required-props → no-abstract-role}/index.d.ts +0 -1
- package/lib/{wai-aria-abstract-role → no-abstract-role}/index.js +0 -1
- package/lib/no-always-matching-source/index.d.ts +13 -0
- package/lib/no-always-matching-source/index.js +100 -0
- package/lib/no-always-matching-source/meta.d.ts +4 -0
- package/lib/no-always-matching-source/meta.js +3 -0
- package/lib/no-ambiguous-navigable-target-names/index.d.ts +0 -8
- package/lib/no-ambiguous-navigable-target-names/index.js +0 -8
- package/lib/no-ambiguous-navigable-target-names/meta.d.ts +1 -2
- package/lib/no-ambiguous-navigable-target-names/meta.js +1 -2
- package/lib/{wai-aria-required-owned-elements → no-aria-on-presentational-children}/index.d.ts +0 -1
- package/lib/{wai-aria-presentational-children → no-aria-on-presentational-children}/index.js +0 -1
- package/lib/no-aria-on-unsupported-element/index.d.ts +11 -0
- package/lib/no-aria-on-unsupported-element/index.js +35 -0
- package/lib/no-aria-on-unsupported-element/meta.d.ts +9 -0
- package/lib/no-aria-on-unsupported-element/meta.js +8 -0
- package/lib/no-boolean-attr-value/index.d.ts +0 -7
- package/lib/no-boolean-attr-value/index.js +0 -7
- package/lib/no-boolean-attr-value/meta.d.ts +0 -1
- package/lib/no-boolean-attr-value/meta.js +0 -1
- package/lib/no-broken-fragment-link/index.d.ts +15 -0
- package/lib/no-broken-fragment-link/index.js +93 -0
- package/lib/no-broken-fragment-link/meta.d.ts +4 -0
- package/lib/no-broken-fragment-link/meta.js +3 -0
- package/lib/no-consecutive-br/index.d.ts +0 -8
- package/lib/no-consecutive-br/index.js +0 -8
- package/lib/no-consecutive-br/meta.d.ts +0 -1
- package/lib/no-consecutive-br/meta.js +0 -1
- package/lib/no-content-after-body/index.d.ts +25 -0
- package/lib/no-content-after-body/index.js +51 -0
- package/lib/no-content-after-body/meta.d.ts +4 -0
- package/lib/no-content-after-body/meta.js +3 -0
- package/lib/no-contradictory-aria-prop/index.d.ts +10 -0
- package/lib/no-contradictory-aria-prop/index.js +34 -0
- package/lib/{wai-aria-abstract-role → no-default-aria-value}/index.d.ts +0 -1
- package/lib/{wai-aria-default-value → no-default-aria-value}/index.js +0 -1
- package/lib/no-default-value/index.d.ts +0 -7
- package/lib/no-default-value/index.js +0 -7
- package/lib/no-default-value/meta.d.ts +0 -1
- package/lib/no-default-value/meta.js +0 -1
- package/lib/no-deprecated-aria-prop/index.d.ts +3 -0
- package/lib/{wai-aria-deprecated-props → no-deprecated-aria-prop}/index.js +0 -1
- package/lib/no-deprecated-attr/index.d.ts +2 -0
- package/lib/{deprecated-attr → no-deprecated-attr}/index.js +5 -9
- package/lib/no-deprecated-attr/meta.d.ts +4 -0
- package/lib/no-deprecated-attr/meta.js +3 -0
- package/lib/no-deprecated-element/index.d.ts +2 -0
- package/lib/no-deprecated-element/index.js +27 -0
- package/lib/no-deprecated-element/meta.d.ts +4 -0
- package/lib/no-deprecated-element/meta.js +3 -0
- package/lib/no-deprecated-role/index.d.ts +3 -0
- package/lib/{wai-aria-deprecated-role → no-deprecated-role}/index.js +0 -1
- package/lib/no-disallowed-ancestor/index.d.ts +2 -0
- package/lib/no-disallowed-ancestor/index.js +25 -0
- package/lib/no-disallowed-ancestor/meta.d.ts +4 -0
- package/lib/no-disallowed-ancestor/meta.js +3 -0
- package/lib/no-disallowed-attr/index.d.ts +28 -0
- package/lib/no-disallowed-attr/index.js +77 -0
- package/lib/no-disallowed-attr/meta.d.ts +4 -0
- package/lib/no-disallowed-attr/meta.js +3 -0
- package/lib/no-duplicate-attr/index.d.ts +2 -0
- package/lib/{attr-duplication → no-duplicate-attr}/index.js +0 -7
- package/lib/no-duplicate-attr/meta.d.ts +6 -0
- package/lib/no-duplicate-attr/meta.js +10 -0
- package/lib/no-duplicate-autofocus/index.d.ts +0 -5
- package/lib/no-duplicate-autofocus/index.js +20 -6
- package/lib/no-duplicate-autofocus/meta.d.ts +1 -1
- package/lib/no-duplicate-autofocus/meta.js +1 -1
- package/lib/no-duplicate-dt/index.d.ts +0 -6
- package/lib/no-duplicate-dt/index.js +1 -6
- package/lib/no-duplicate-dt/meta.d.ts +1 -2
- package/lib/no-duplicate-dt/meta.js +1 -2
- package/lib/no-duplicate-h1/index.d.ts +18 -0
- package/lib/no-duplicate-h1/index.js +41 -0
- package/lib/no-duplicate-h1/meta.d.ts +4 -0
- package/lib/no-duplicate-h1/meta.js +3 -0
- package/lib/no-duplicate-id/index.d.ts +2 -0
- package/lib/{id-duplication → no-duplicate-id}/index.js +0 -7
- package/lib/no-duplicate-id/meta.d.ts +4 -0
- package/lib/no-duplicate-id/meta.js +3 -0
- package/lib/no-duplicate-sibling-attr/index.d.ts +2 -0
- package/lib/no-duplicate-sibling-attr/index.js +35 -0
- package/lib/no-duplicate-sibling-attr/meta.d.ts +4 -0
- package/lib/no-duplicate-sibling-attr/meta.js +3 -0
- package/lib/no-duplicate-visible-main/index.d.ts +0 -1
- package/lib/no-duplicate-visible-main/index.js +0 -1
- package/lib/no-duplicate-visible-main/meta.d.ts +1 -1
- package/lib/no-duplicate-visible-main/meta.js +1 -1
- package/lib/no-empty-palpable-content/index.d.ts +0 -8
- package/lib/no-empty-palpable-content/index.js +0 -8
- package/lib/no-empty-palpable-content/meta.d.ts +1 -2
- package/lib/no-empty-palpable-content/meta.js +1 -2
- package/lib/no-empty-table-track/index.d.ts +12 -0
- package/lib/no-empty-table-track/index.js +42 -0
- package/lib/no-empty-table-track/meta.d.ts +4 -0
- package/lib/no-empty-table-track/meta.js +3 -0
- package/lib/no-event-handler-attr/index.d.ts +7 -0
- package/lib/{no-use-event-handler-attr → no-event-handler-attr}/index.js +0 -11
- package/lib/no-event-handler-attr/meta.d.ts +4 -0
- package/lib/no-event-handler-attr/meta.js +3 -0
- package/lib/no-experimental-features/index.d.ts +9 -0
- package/lib/no-experimental-features/index.js +53 -0
- package/lib/no-experimental-features/meta.d.ts +4 -0
- package/lib/no-experimental-features/meta.js +3 -0
- package/lib/no-extra-selected-options/index.d.ts +10 -0
- package/lib/no-extra-selected-options/index.js +37 -0
- package/lib/no-extra-selected-options/meta.d.ts +4 -0
- package/lib/no-extra-selected-options/meta.js +3 -0
- package/lib/no-focusable-in-aria-hidden/index.d.ts +3 -0
- package/lib/{wai-aria-interaction-in-hidden → no-focusable-in-aria-hidden}/index.js +0 -1
- package/lib/no-focusable-in-aria-hidden/meta.d.ts +4 -0
- package/lib/no-focusable-in-aria-hidden/meta.js +3 -0
- package/lib/no-hardcoded-id/index.d.ts +2 -0
- package/lib/{no-hard-code-id → no-hardcoded-id}/index.js +0 -8
- package/lib/no-hardcoded-id/meta.d.ts +4 -0
- package/lib/no-hardcoded-id/meta.js +3 -0
- package/lib/no-ineffective-attr/index.d.ts +2 -0
- package/lib/{ineffective-attr → no-ineffective-attr}/index.js +0 -7
- package/lib/no-ineffective-attr/meta.d.ts +5 -0
- package/lib/no-ineffective-attr/meta.js +4 -0
- package/lib/no-input-file-value/index.d.ts +10 -0
- package/lib/no-input-file-value/index.js +41 -0
- package/lib/no-input-file-value/meta.d.ts +4 -0
- package/lib/no-input-file-value/meta.js +3 -0
- package/lib/no-invalid-aria-prop-value/index.d.ts +3 -0
- package/lib/{wai-aria-value → no-invalid-aria-prop-value}/index.js +0 -1
- package/lib/no-invalid-aria-prop-value/meta.d.ts +4 -0
- package/lib/no-invalid-aria-prop-value/meta.js +3 -0
- package/lib/no-invalid-attr-value/index.d.ts +27 -0
- package/lib/no-invalid-attr-value/index.js +83 -0
- package/lib/no-invalid-attr-value/meta.d.ts +4 -0
- package/lib/no-invalid-attr-value/meta.js +3 -0
- package/lib/no-malformed-character-reference/index.d.ts +2 -0
- package/lib/no-malformed-character-reference/index.js +38 -0
- package/lib/no-malformed-character-reference/meta.d.ts +5 -0
- package/lib/no-malformed-character-reference/meta.js +20 -0
- package/lib/{correct-aspect-ratio → no-mismatched-aspect-ratio}/index.js +13 -3
- package/lib/no-mismatched-aspect-ratio/meta.d.ts +4 -0
- package/lib/no-mismatched-aspect-ratio/meta.js +3 -0
- package/lib/{correct-aspect-ratio → no-mismatched-aspect-ratio}/resolve-image-size.js +8 -2
- package/lib/no-mixed-srcset-descriptors/index.d.ts +12 -0
- package/lib/no-mixed-srcset-descriptors/index.js +47 -0
- package/lib/no-mixed-srcset-descriptors/meta.d.ts +4 -0
- package/lib/no-mixed-srcset-descriptors/meta.js +3 -0
- package/lib/no-nested-top-level-landmark/index.d.ts +10 -0
- package/lib/no-nested-top-level-landmark/index.js +52 -0
- package/lib/no-nested-top-level-landmark/meta.d.ts +4 -0
- package/lib/no-nested-top-level-landmark/meta.js +3 -0
- package/lib/no-nonstandard-features/index.d.ts +9 -0
- package/lib/no-nonstandard-features/index.js +53 -0
- package/lib/no-nonstandard-features/meta.d.ts +4 -0
- package/lib/no-nonstandard-features/meta.js +3 -0
- package/lib/no-obsolete-attr/index.d.ts +2 -0
- package/lib/no-obsolete-attr/index.js +27 -0
- package/lib/no-obsolete-attr/meta.d.ts +4 -0
- package/lib/no-obsolete-attr/meta.js +3 -0
- package/lib/no-obsolete-doctype/index.d.ts +2 -0
- package/lib/{doctype → no-obsolete-doctype}/index.js +9 -16
- package/lib/no-obsolete-doctype/meta.d.ts +4 -0
- package/lib/no-obsolete-doctype/meta.js +3 -0
- package/lib/no-obsolete-element/index.d.ts +2 -0
- package/lib/{deprecated-element → no-obsolete-element}/index.js +6 -10
- package/lib/no-obsolete-element/meta.d.ts +4 -0
- package/lib/no-obsolete-element/meta.js +3 -0
- package/lib/no-orphaned-end-tag/index.d.ts +0 -7
- package/lib/no-orphaned-end-tag/index.js +0 -7
- package/lib/no-orphaned-end-tag/meta.d.ts +2 -2
- package/lib/no-orphaned-end-tag/meta.js +5 -2
- package/lib/no-prohibited-naming/index.d.ts +8 -0
- package/lib/no-prohibited-naming/index.js +36 -0
- package/lib/no-prohibited-naming/meta.d.ts +4 -0
- package/lib/no-prohibited-naming/meta.js +3 -0
- package/lib/{use-list → no-pseudo-list}/index.d.ts +1 -8
- package/lib/{use-list → no-pseudo-list}/index.js +0 -7
- package/lib/no-pseudo-list/meta.d.ts +4 -0
- package/lib/no-pseudo-list/meta.js +3 -0
- package/lib/{redundant-accessible-name → no-redundant-accessible-name}/index.d.ts +0 -4
- package/lib/{redundant-accessible-name → no-redundant-accessible-name}/index.js +0 -4
- package/lib/no-redundant-accessible-name/meta.d.ts +4 -0
- package/lib/no-redundant-accessible-name/meta.js +3 -0
- package/lib/no-redundant-aria-prop/index.d.ts +10 -0
- package/lib/{wai-aria-implicit-props → no-redundant-aria-prop}/index.js +9 -3
- package/lib/no-redundant-aria-prop/meta.d.ts +4 -0
- package/lib/no-redundant-aria-prop/meta.js +3 -0
- package/lib/no-redundant-role/index.d.ts +3 -0
- package/lib/{wai-aria-implicit-role → no-redundant-role}/index.js +0 -1
- package/lib/no-redundant-role/meta.d.ts +4 -0
- package/lib/no-redundant-role/meta.js +3 -0
- package/lib/no-refer-to-non-existent-id/index.d.ts +0 -9
- package/lib/no-refer-to-non-existent-id/index.js +1 -62
- package/lib/no-refer-to-non-existent-id/meta.d.ts +1 -2
- package/lib/no-refer-to-non-existent-id/meta.js +1 -2
- package/lib/no-restricted-attr/index.d.ts +27 -0
- package/lib/no-restricted-attr/index.js +96 -0
- package/lib/no-restricted-attr/meta.d.ts +4 -0
- package/lib/no-restricted-attr/meta.js +3 -0
- package/lib/no-restricted-element/index.d.ts +2 -0
- package/lib/{disallowed-element → no-restricted-element}/index.js +7 -8
- package/lib/no-restricted-element/meta.d.ts +4 -0
- package/lib/no-restricted-element/meta.js +3 -0
- package/lib/no-skipped-heading-level/index.d.ts +13 -0
- package/lib/{heading-levels → no-skipped-heading-level}/index.js +10 -5
- package/lib/no-skipped-heading-level/meta.d.ts +4 -0
- package/lib/no-skipped-heading-level/meta.js +3 -0
- package/lib/no-stray-head-or-body-tag/index.d.ts +28 -0
- package/lib/no-stray-head-or-body-tag/index.js +61 -0
- package/lib/no-stray-head-or-body-tag/meta.d.ts +4 -0
- package/lib/no-stray-head-or-body-tag/meta.js +3 -0
- package/lib/no-table-cell-overlap/index.d.ts +12 -0
- package/lib/no-table-cell-overlap/index.js +30 -0
- package/lib/no-table-cell-overlap/meta.d.ts +4 -0
- package/lib/no-table-cell-overlap/meta.js +3 -0
- package/lib/no-table-span-overflow/index.d.ts +12 -0
- package/lib/no-table-span-overflow/index.js +37 -0
- package/lib/no-table-span-overflow/meta.d.ts +4 -0
- package/lib/no-table-span-overflow/meta.js +3 -0
- package/lib/no-unclosed-element-at-eof/index.d.ts +2 -0
- package/lib/no-unclosed-element-at-eof/index.js +86 -0
- package/lib/no-unclosed-element-at-eof/meta.d.ts +4 -0
- package/lib/no-unclosed-element-at-eof/meta.js +3 -0
- package/lib/no-unescaped-char/index.d.ts +14 -0
- package/lib/{character-reference → no-unescaped-char}/index.js +31 -20
- package/lib/no-unescaped-char/meta.d.ts +4 -0
- package/lib/no-unescaped-char/meta.js +3 -0
- package/lib/{invalid-attr → no-unknown-attr}/index.d.ts +4 -19
- package/lib/no-unknown-attr/index.js +91 -0
- package/lib/no-unknown-attr/meta.d.ts +4 -0
- package/lib/no-unknown-attr/meta.js +3 -0
- package/lib/no-unknown-role/index.d.ts +3 -0
- package/lib/{wai-aria-non-existent-role → no-unknown-role}/index.js +0 -1
- package/lib/no-unknown-role/meta.d.ts +4 -0
- package/lib/no-unknown-role/meta.js +3 -0
- package/lib/no-unpaired-srcset-sizes/index.d.ts +12 -0
- package/lib/no-unpaired-srcset-sizes/index.js +77 -0
- package/lib/no-unpaired-srcset-sizes/meta.d.ts +4 -0
- package/lib/no-unpaired-srcset-sizes/meta.js +3 -0
- package/lib/{no-unsupported-features → no-unsupported-browser-features}/index.d.ts +1 -10
- package/lib/no-unsupported-browser-features/index.js +81 -0
- package/lib/no-unsupported-browser-features/meta.d.ts +4 -0
- package/lib/no-unsupported-browser-features/meta.js +3 -0
- package/lib/permitted-contents/index.d.ts +0 -18
- package/lib/permitted-contents/index.js +0 -78
- package/lib/permitted-contents/meta.d.ts +1 -2
- package/lib/permitted-contents/meta.js +1 -2
- package/lib/permitted-contents/represent-transparent-nodes.js +15 -6
- package/lib/permitted-roles/index.d.ts +3 -0
- package/lib/{wai-aria-permitted-roles → permitted-roles}/index.js +0 -1
- package/lib/permitted-roles/meta.d.ts +4 -0
- package/lib/permitted-roles/meta.js +3 -0
- package/lib/placeholder-label-option/index.d.ts +10 -4
- package/lib/placeholder-label-option/index.js +30 -17
- package/lib/placeholder-label-option/meta.d.ts +1 -2
- package/lib/placeholder-label-option/meta.js +1 -2
- package/lib/progress-value-bounds/index.d.ts +10 -0
- package/lib/progress-value-bounds/index.js +59 -0
- package/lib/progress-value-bounds/meta.d.ts +4 -0
- package/lib/progress-value-bounds/meta.js +3 -0
- package/lib/require-accessible-name/index.d.ts +0 -7
- package/lib/require-accessible-name/index.js +0 -7
- package/lib/require-accessible-name/meta.d.ts +0 -1
- package/lib/require-accessible-name/meta.js +0 -1
- package/lib/require-adjacent-popover/index.d.ts +2 -0
- package/lib/{neighbor-popovers → require-adjacent-popover}/index.js +1 -8
- package/lib/require-adjacent-popover/meta.d.ts +4 -0
- package/lib/require-adjacent-popover/meta.js +3 -0
- package/lib/require-ancestor/index.d.ts +2 -0
- package/lib/require-ancestor/index.js +29 -0
- package/lib/require-ancestor/meta.d.ts +4 -0
- package/lib/require-ancestor/meta.js +3 -0
- package/lib/require-aria-prop/index.d.ts +3 -0
- package/lib/{wai-aria-required-props → require-aria-prop}/index.js +0 -1
- package/lib/require-aria-prop/meta.d.ts +4 -0
- package/lib/require-aria-prop/meta.js +3 -0
- package/lib/{required-attr → require-attr}/index.d.ts +2 -9
- package/lib/{required-attr → require-attr}/index.js +0 -7
- package/lib/require-attr/meta.d.ts +4 -0
- package/lib/require-attr/meta.js +3 -0
- package/lib/require-datetime/index.d.ts +0 -8
- package/lib/require-datetime/index.js +0 -8
- package/lib/require-datetime/meta.d.ts +1 -2
- package/lib/require-datetime/meta.js +1 -2
- package/lib/require-dialog-autofocus/index.d.ts +0 -10
- package/lib/require-dialog-autofocus/index.js +0 -10
- package/lib/require-dialog-autofocus/meta.d.ts +0 -1
- package/lib/require-dialog-autofocus/meta.js +0 -1
- package/lib/require-doctype/index.d.ts +2 -0
- package/lib/require-doctype/index.js +19 -0
- package/lib/require-doctype/meta.d.ts +5 -0
- package/lib/require-doctype/meta.js +10 -0
- package/lib/{required-element → require-element}/index.d.ts +1 -9
- package/lib/{required-element → require-element}/index.js +0 -8
- package/lib/require-element/meta.d.ts +4 -0
- package/lib/require-element/meta.js +3 -0
- package/lib/require-end-tag/index.d.ts +2 -0
- package/lib/{end-tag → require-end-tag}/index.js +0 -7
- package/lib/require-end-tag/meta.d.ts +4 -0
- package/lib/require-end-tag/meta.js +3 -0
- package/lib/require-h1/index.d.ts +17 -0
- package/lib/{required-h1 → require-h1}/index.js +6 -14
- package/lib/require-h1/meta.d.ts +4 -0
- package/lib/require-h1/meta.js +3 -0
- package/lib/require-landmark-label/index.d.ts +11 -0
- package/lib/require-landmark-label/index.js +55 -0
- package/lib/require-landmark-label/meta.d.ts +4 -0
- package/lib/require-landmark-label/meta.js +3 -0
- package/lib/require-owned-elements/index.d.ts +3 -0
- package/lib/{wai-aria-required-owned-elements → require-owned-elements}/index.js +0 -2
- package/lib/require-owned-elements/meta.d.ts +4 -0
- package/lib/require-owned-elements/meta.js +3 -0
- package/lib/require-parent-role/index.d.ts +3 -0
- package/lib/{wai-aria-required-parent-role → require-parent-role}/index.js +0 -1
- package/lib/require-parent-role/meta.d.ts +4 -0
- package/lib/require-parent-role/meta.js +3 -0
- package/lib/role-supports-aria-prop/index.d.ts +8 -0
- package/lib/{wai-aria-disallowed-props → role-supports-aria-prop}/index.js +11 -10
- package/lib/role-supports-aria-prop/meta.d.ts +4 -0
- package/lib/role-supports-aria-prop/meta.js +3 -0
- package/lib/rule-aliases.d.ts +2 -0
- package/lib/rule-aliases.js +325 -0
- package/lib/sizes-auto-requires-lazy-loading/index.d.ts +14 -0
- package/lib/sizes-auto-requires-lazy-loading/index.js +68 -0
- package/lib/sizes-auto-requires-lazy-loading/meta.d.ts +4 -0
- package/lib/sizes-auto-requires-lazy-loading/meta.js +3 -0
- package/lib/srcset-sizes-constraint/parse-srcset.d.ts +6 -0
- package/lib/srcset-sizes-constraint/parse-srcset.js +6 -0
- package/lib/srcset-sizes-constraint/sibling-helpers.d.ts +21 -0
- package/lib/srcset-sizes-constraint/sibling-helpers.js +37 -0
- package/lib/tab-requires-tabpanel/index.d.ts +3 -0
- package/lib/tab-requires-tabpanel/index.js +21 -0
- package/lib/tab-requires-tabpanel/meta.d.ts +4 -0
- package/lib/tab-requires-tabpanel/meta.js +3 -0
- package/lib/table-row-column-alignment/grid.d.ts +108 -52
- package/lib/table-row-column-alignment/grid.js +276 -203
- package/lib/table-row-column-alignment/types.d.ts +6 -8
- package/lib/usemap-references-map/index.d.ts +14 -0
- package/lib/usemap-references-map/index.js +46 -0
- package/lib/usemap-references-map/meta.d.ts +4 -0
- package/lib/usemap-references-map/meta.js +3 -0
- package/lib/valid-importmap/index.d.ts +2 -0
- package/lib/valid-importmap/index.js +176 -0
- package/lib/valid-importmap/meta.d.ts +4 -0
- package/lib/valid-importmap/meta.js +3 -0
- package/lib/valid-speculation-rules/index.d.ts +2 -0
- package/lib/valid-speculation-rules/index.js +292 -0
- package/lib/valid-speculation-rules/meta.d.ts +4 -0
- package/lib/valid-speculation-rules/meta.js +3 -0
- package/lib/wai-aria/checkings/contradictory-aria-prop.d.ts +23 -0
- package/lib/wai-aria/checkings/{implicit-props.js → contradictory-aria-prop.js} +22 -14
- package/lib/wai-aria/checkings/element-supports-aria-prop.d.ts +20 -0
- package/lib/wai-aria/checkings/element-supports-aria-prop.js +83 -0
- package/lib/wai-aria/checkings/prohibited-naming.d.ts +35 -0
- package/lib/wai-aria/checkings/prohibited-naming.js +64 -0
- package/lib/wai-aria/checkings/redundant-aria-prop.d.ts +23 -0
- package/lib/wai-aria/checkings/redundant-aria-prop.js +53 -0
- package/lib/wai-aria/checkings/required-prop.d.ts +4 -0
- package/lib/wai-aria/checkings/required-prop.js +16 -3
- package/lib/wai-aria/checkings/role-supports-aria-prop.d.ts +20 -0
- package/lib/wai-aria/checkings/role-supports-aria-prop.js +30 -0
- package/lib/wai-aria/checkings/tab-requires-tabpanel.d.ts +19 -0
- package/lib/wai-aria/checkings/tab-requires-tabpanel.js +56 -0
- package/lib/wai-aria/default-options.js +1 -0
- package/lib/wai-aria/types.d.ts +2 -0
- package/package.json +11 -10
- package/schema.json +275 -59
- package/SKILL.md +0 -77
- package/lib/attr-duplication/index.d.ts +0 -9
- package/lib/attr-duplication/meta.d.ts +0 -6
- package/lib/attr-duplication/meta.js +0 -5
- package/lib/character-reference/index.d.ts +0 -12
- package/lib/character-reference/meta.d.ts +0 -5
- package/lib/character-reference/meta.js +0 -4
- package/lib/correct-aspect-ratio/meta.js +0 -3
- package/lib/deprecated-attr/index.d.ts +0 -8
- package/lib/deprecated-attr/meta.d.ts +0 -5
- package/lib/deprecated-attr/meta.js +0 -4
- package/lib/deprecated-element/index.d.ts +0 -8
- package/lib/deprecated-element/meta.d.ts +0 -5
- package/lib/deprecated-element/meta.js +0 -4
- package/lib/disallowed-element/index.d.ts +0 -9
- package/lib/disallowed-element/meta.d.ts +0 -5
- package/lib/disallowed-element/meta.js +0 -4
- package/lib/doctype/index.d.ts +0 -15
- package/lib/doctype/meta.d.ts +0 -5
- package/lib/doctype/meta.js +0 -4
- package/lib/end-tag/index.d.ts +0 -9
- package/lib/end-tag/meta.d.ts +0 -5
- package/lib/end-tag/meta.js +0 -4
- package/lib/heading-levels/index.d.ts +0 -8
- package/lib/heading-levels/meta.d.ts +0 -5
- package/lib/heading-levels/meta.js +0 -4
- package/lib/id-duplication/index.d.ts +0 -9
- package/lib/id-duplication/meta.d.ts +0 -5
- package/lib/id-duplication/meta.js +0 -4
- package/lib/ineffective-attr/index.d.ts +0 -9
- package/lib/ineffective-attr/meta.d.ts +0 -6
- package/lib/ineffective-attr/meta.js +0 -5
- package/lib/invalid-attr/index.js +0 -207
- package/lib/invalid-attr/meta.d.ts +0 -5
- package/lib/invalid-attr/meta.js +0 -4
- package/lib/landmark-roles/index.d.ts +0 -22
- package/lib/landmark-roles/index.js +0 -142
- package/lib/landmark-roles/meta.d.ts +0 -5
- package/lib/landmark-roles/meta.js +0 -4
- package/lib/neighbor-popovers/index.d.ts +0 -10
- package/lib/neighbor-popovers/meta.d.ts +0 -5
- package/lib/neighbor-popovers/meta.js +0 -4
- package/lib/no-hard-code-id/index.d.ts +0 -10
- package/lib/no-hard-code-id/meta.d.ts +0 -5
- package/lib/no-hard-code-id/meta.js +0 -4
- package/lib/no-unsupported-features/index.js +0 -139
- package/lib/no-unsupported-features/meta.d.ts +0 -5
- package/lib/no-unsupported-features/meta.js +0 -4
- package/lib/no-use-event-handler-attr/index.d.ts +0 -18
- package/lib/no-use-event-handler-attr/meta.d.ts +0 -5
- package/lib/no-use-event-handler-attr/meta.js +0 -4
- package/lib/redundant-accessible-name/meta.d.ts +0 -5
- package/lib/redundant-accessible-name/meta.js +0 -4
- package/lib/required-attr/meta.d.ts +0 -5
- package/lib/required-attr/meta.js +0 -4
- package/lib/required-element/meta.d.ts +0 -5
- package/lib/required-element/meta.js +0 -4
- package/lib/required-h1/index.d.ts +0 -18
- package/lib/required-h1/meta.d.ts +0 -5
- package/lib/required-h1/meta.js +0 -4
- package/lib/srcset-sizes-constraint/index.d.ts +0 -6
- package/lib/srcset-sizes-constraint/index.js +0 -108
- package/lib/srcset-sizes-constraint/meta.d.ts +0 -5
- package/lib/srcset-sizes-constraint/meta.js +0 -4
- package/lib/table-row-column-alignment/index.d.ts +0 -10
- package/lib/table-row-column-alignment/index.js +0 -97
- package/lib/table-row-column-alignment/meta.d.ts +0 -5
- package/lib/table-row-column-alignment/meta.js +0 -4
- package/lib/use-list/meta.d.ts +0 -5
- package/lib/use-list/meta.js +0 -4
- package/lib/wai-aria/checkings/disallowed-prop.d.ts +0 -23
- package/lib/wai-aria/checkings/disallowed-prop.js +0 -84
- package/lib/wai-aria/checkings/implicit-props.d.ts +0 -20
- package/lib/wai-aria/index.d.ts +0 -13
- package/lib/wai-aria/index.js +0 -115
- package/lib/wai-aria/meta.d.ts +0 -5
- package/lib/wai-aria/meta.js +0 -4
- package/lib/wai-aria-default-value/index.d.ts +0 -4
- package/lib/wai-aria-default-value/meta.d.ts +0 -5
- package/lib/wai-aria-default-value/meta.js +0 -4
- package/lib/wai-aria-deprecated-props/index.d.ts +0 -4
- package/lib/wai-aria-deprecated-props/meta.d.ts +0 -5
- package/lib/wai-aria-deprecated-props/meta.js +0 -4
- package/lib/wai-aria-disallowed-props/index.d.ts +0 -4
- package/lib/wai-aria-disallowed-props/meta.d.ts +0 -5
- package/lib/wai-aria-disallowed-props/meta.js +0 -4
- package/lib/wai-aria-implicit-props/index.d.ts +0 -4
- package/lib/wai-aria-implicit-props/meta.d.ts +0 -5
- package/lib/wai-aria-implicit-props/meta.js +0 -4
- package/lib/wai-aria-implicit-role/index.d.ts +0 -4
- package/lib/wai-aria-interaction-in-hidden/index.d.ts +0 -4
- package/lib/wai-aria-interaction-in-hidden/meta.d.ts +0 -5
- package/lib/wai-aria-interaction-in-hidden/meta.js +0 -4
- package/lib/wai-aria-no-global-prop/index.d.ts +0 -4
- package/lib/wai-aria-no-global-prop/meta.d.ts +0 -5
- package/lib/wai-aria-no-global-prop/meta.js +0 -4
- package/lib/wai-aria-non-existent-role/index.d.ts +0 -4
- package/lib/wai-aria-permitted-roles/index.d.ts +0 -4
- package/lib/wai-aria-presentational-children/index.d.ts +0 -4
- package/lib/wai-aria-presentational-children/meta.d.ts +0 -5
- package/lib/wai-aria-presentational-children/meta.js +0 -4
- package/lib/wai-aria-required-parent-role/index.d.ts +0 -4
- package/lib/wai-aria-value/index.d.ts +0 -4
- package/lib/wai-aria-value/meta.d.ts +0 -5
- package/lib/wai-aria-value/meta.js +0 -4
- /package/lib/{wai-aria-abstract-role → aria-prop-requires-role}/meta.d.ts +0 -0
- /package/lib/{wai-aria-abstract-role → aria-prop-requires-role}/meta.js +0 -0
- /package/lib/{wai-aria-deprecated-role → element-supports-aria-prop}/meta.d.ts +0 -0
- /package/lib/{wai-aria-deprecated-role → element-supports-aria-prop}/meta.js +0 -0
- /package/lib/{wai-aria-implicit-role → no-abstract-role}/meta.d.ts +0 -0
- /package/lib/{wai-aria-implicit-role → no-abstract-role}/meta.js +0 -0
- /package/lib/{wai-aria-non-existent-role → no-aria-on-presentational-children}/meta.d.ts +0 -0
- /package/lib/{wai-aria-non-existent-role → no-aria-on-presentational-children}/meta.js +0 -0
- /package/lib/{wai-aria-permitted-roles → no-contradictory-aria-prop}/meta.d.ts +0 -0
- /package/lib/{wai-aria-permitted-roles → no-contradictory-aria-prop}/meta.js +0 -0
- /package/lib/{wai-aria-required-owned-elements → no-default-aria-value}/meta.d.ts +0 -0
- /package/lib/{wai-aria-required-owned-elements → no-default-aria-value}/meta.js +0 -0
- /package/lib/{wai-aria-required-parent-role → no-deprecated-aria-prop}/meta.d.ts +0 -0
- /package/lib/{wai-aria-required-parent-role → no-deprecated-aria-prop}/meta.js +0 -0
- /package/lib/{wai-aria-required-props → no-deprecated-role}/meta.d.ts +0 -0
- /package/lib/{wai-aria-required-props → no-deprecated-role}/meta.js +0 -0
- /package/lib/{correct-aspect-ratio → no-mismatched-aspect-ratio}/index.d.ts +0 -0
- /package/lib/{correct-aspect-ratio → no-mismatched-aspect-ratio}/resolve-image-size.d.ts +0 -0
- /package/lib/{no-unsupported-features → no-unsupported-browser-features}/compat-data.d.ts +0 -0
- /package/lib/{no-unsupported-features → no-unsupported-browser-features}/compat-data.js +0 -0
- /package/lib/{no-unsupported-features → no-unsupported-browser-features}/resolve-browsers.d.ts +0 -0
- /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
|
|
65
|
-
|
|
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})`,
|
|
@@ -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,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,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,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
|
+
});
|
|
@@ -1,31 +1,24 @@
|
|
|
1
1
|
import { createRule } from '@markuplint/ml-core';
|
|
2
2
|
import meta from './meta.js';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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) {
|
|
@@ -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
|
-
|
|
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 &&
|
|
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
|
});
|
|
@@ -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: "
|
|
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: '
|
|
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
|
+
});
|
|
@@ -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
|
|
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: [
|
|
@@ -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,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;
|