@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,13 +1,10 @@
|
|
|
1
1
|
import { createRule, getAttrSpecs } from '@markuplint/ml-core';
|
|
2
2
|
import meta from './meta.js';
|
|
3
|
-
/**
|
|
4
|
-
* Rule that reports the use of deprecated or obsolete HTML attributes.
|
|
5
|
-
*
|
|
6
|
-
* Checks each attribute against the HTML spec and reports any that are
|
|
7
|
-
* marked as deprecated or obsolete.
|
|
8
|
-
*/
|
|
9
3
|
export default createRule({
|
|
10
4
|
meta: meta,
|
|
5
|
+
// Deprecation data is sourced from MDN/BCD (factual, not a spec MUST/MUST
|
|
6
|
+
// NOT), unlike `no-obsolete-attr`'s HTML LS non-conforming-features list.
|
|
7
|
+
defaultSeverity: 'warning',
|
|
11
8
|
async verify({ document, report, t }) {
|
|
12
9
|
await document.walkOn('Attr', attr => {
|
|
13
10
|
const attrSpecs = getAttrSpecs(attr.ownerElement, document.specs);
|
|
@@ -19,14 +16,13 @@ export default createRule({
|
|
|
19
16
|
if (!attrSpec) {
|
|
20
17
|
return;
|
|
21
18
|
}
|
|
22
|
-
if (attrSpec.deprecated
|
|
23
|
-
const message = t('{0} is {1:c}', t('the "{0*}" {1}', name, 'attribute'), attrSpec.obsolete ? 'obsolete' : 'deprecated');
|
|
19
|
+
if (attrSpec.deprecated) {
|
|
24
20
|
report({
|
|
25
21
|
scope: attr,
|
|
26
22
|
line: attr.nameNode?.startLine,
|
|
27
23
|
col: attr.nameNode?.startCol,
|
|
28
24
|
raw: attr.nameNode?.raw,
|
|
29
|
-
message,
|
|
25
|
+
message: t('{0} is {1:c}', t('the "{0*}" {1}', name, 'attribute'), 'deprecated'),
|
|
30
26
|
});
|
|
31
27
|
}
|
|
32
28
|
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createRule, getSpec } from '@markuplint/ml-core';
|
|
2
|
+
import meta from './meta.js';
|
|
3
|
+
export default createRule({
|
|
4
|
+
meta: meta,
|
|
5
|
+
// Deprecation data is sourced from MDN/BCD (factual, not a spec MUST/MUST
|
|
6
|
+
// NOT), unlike `no-obsolete-element`'s HTML LS non-conforming-features list.
|
|
7
|
+
defaultSeverity: 'warning',
|
|
8
|
+
async verify({ document, report, t }) {
|
|
9
|
+
await document.walkOn('Element', el => {
|
|
10
|
+
if (!(el.namespaceURI === 'http://www.w3.org/1999/xhtml' ||
|
|
11
|
+
el.namespaceURI === 'http://www.w3.org/2000/svg') ||
|
|
12
|
+
// Web components and authored elements (JSX/Vue/Svelte) reach this rule
|
|
13
|
+
// through `pretenders`: they masquerade as a known HTML element via
|
|
14
|
+
// `el.localName`, so the spec lookup below resolves correctly. See #3740.
|
|
15
|
+
(el.elementType !== 'html' && el.pretenderContext?.type !== 'pretender')) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const spec = getSpec(el, document.specs.specs);
|
|
19
|
+
if (spec && spec.deprecated) {
|
|
20
|
+
report({
|
|
21
|
+
scope: el,
|
|
22
|
+
message: t('{0} is {1:c}', t('the "{0*}" {1}', el.localName, 'element'), 'deprecated'),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
});
|
|
@@ -3,7 +3,6 @@ import { ARIA_RECOMMENDED_VERSION } from '@markuplint/ml-spec';
|
|
|
3
3
|
import { checkingDeprecatedRole } from '../wai-aria/checkings/deprecated-role.js';
|
|
4
4
|
import { defaultOptions } from '../wai-aria/default-options.js';
|
|
5
5
|
import meta from './meta.js';
|
|
6
|
-
/** Warns when a deprecated WAI-ARIA role is used. */
|
|
7
6
|
export default createRule({
|
|
8
7
|
meta,
|
|
9
8
|
defaultSeverity: 'warning',
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createRule } 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('Element', el => {
|
|
7
|
+
const elSpec = document.specs.specs.find(s => s.name === el.localName);
|
|
8
|
+
const forbiddenAncestors = elSpec?.contentModel?.forbiddenAncestors;
|
|
9
|
+
if (!forbiddenAncestors || forbiddenAncestors.length === 0) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
let ancestor = el.parentElement;
|
|
13
|
+
while (ancestor) {
|
|
14
|
+
if (forbiddenAncestors.some(selector => ancestor.matches(selector))) {
|
|
15
|
+
report({
|
|
16
|
+
scope: el,
|
|
17
|
+
message: t('{0} must not appear as a descendant of {1}', t('the "{0}" {1}', el.localName, 'element'), t('the "{0}" {1}', ancestor.localName, 'element')),
|
|
18
|
+
});
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
ancestor = ancestor.parentElement;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AttributeType } from '@markuplint/ml-spec';
|
|
2
|
+
import type { Pattern } from '@markuplint/types';
|
|
3
|
+
/**
|
|
4
|
+
* Configuration options for the `no-disallowed-attr` rule.
|
|
5
|
+
*/
|
|
6
|
+
type Option = {
|
|
7
|
+
/**
|
|
8
|
+
* Attribute names to treat as known and allowed, beyond what the spec
|
|
9
|
+
* defines. Shares its shape with `no-unknown-attr`'s option of the same
|
|
10
|
+
* name — see that rule for the full description.
|
|
11
|
+
*
|
|
12
|
+
* @since 3.7.0
|
|
13
|
+
*/
|
|
14
|
+
allowAttrs?: (string | Attr)[] | Record<string, AttributeType | Pattern>;
|
|
15
|
+
/** Attribute name prefix(es) to ignore during validation. */
|
|
16
|
+
ignoreAttrNamePrefix?: string | string[];
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Describes a single attribute with its name and expected value constraint.
|
|
20
|
+
*/
|
|
21
|
+
type Attr = {
|
|
22
|
+
/** The attribute name. */
|
|
23
|
+
name: string;
|
|
24
|
+
/** The expected attribute value type or validation rule. */
|
|
25
|
+
value: AttributeType | Pattern;
|
|
26
|
+
};
|
|
27
|
+
declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, Option>>;
|
|
28
|
+
export default _default;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { createRule, getAttrSpecs, getSpec } from '@markuplint/ml-core';
|
|
2
|
+
import { resolveAttrEligibility } from '../attr-eligibility.js';
|
|
3
|
+
import meta from './meta.js';
|
|
4
|
+
function allowedNames(allowAttrs) {
|
|
5
|
+
if (!allowAttrs) {
|
|
6
|
+
return new Set();
|
|
7
|
+
}
|
|
8
|
+
if (Array.isArray(allowAttrs)) {
|
|
9
|
+
return new Set(allowAttrs.map(a => (typeof a === 'string' ? a : a.name)));
|
|
10
|
+
}
|
|
11
|
+
return new Set(Object.keys(allowAttrs));
|
|
12
|
+
}
|
|
13
|
+
export default createRule({
|
|
14
|
+
meta: meta,
|
|
15
|
+
defaultOptions: {},
|
|
16
|
+
async verify({ document, report, t }) {
|
|
17
|
+
await document.walkOn('Attr', attr => {
|
|
18
|
+
if (attr.isDirective) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const name = attr.name;
|
|
22
|
+
const attrName = attr.nameNode;
|
|
23
|
+
// https://html.spec.whatwg.org/multipage/custom-elements.html#attr-is
|
|
24
|
+
// "The is attribute must not be specified on an autonomous custom element"
|
|
25
|
+
if (name === 'is' && attr.ownerElement.elementType === 'web-component') {
|
|
26
|
+
report({
|
|
27
|
+
scope: attr,
|
|
28
|
+
line: attrName?.startLine,
|
|
29
|
+
col: attrName?.startCol,
|
|
30
|
+
raw: attrName?.raw,
|
|
31
|
+
message: t('The "{0}" attribute must not be specified on an autonomous custom element', 'is'),
|
|
32
|
+
});
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (attr.rule.options.ignoreAttrNamePrefix != null) {
|
|
36
|
+
const prefixes = Array.isArray(attr.rule.options.ignoreAttrNamePrefix)
|
|
37
|
+
? attr.rule.options.ignoreAttrNamePrefix
|
|
38
|
+
: [attr.rule.options.ignoreAttrNamePrefix];
|
|
39
|
+
if (prefixes.some(prefix => name.indexOf(prefix) === 0)) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (allowedNames(attr.rule.options.allowAttrs).has(name)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (attr.ownerElement.elementType !== 'html') {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const attrSpecs = getAttrSpecs(attr.ownerElement, document.specs);
|
|
50
|
+
if (!attrSpecs) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const eligibility = resolveAttrEligibility(name, attr.ownerElement, attrSpecs);
|
|
54
|
+
if (eligibility.status === 'no-use') {
|
|
55
|
+
report({
|
|
56
|
+
scope: attr,
|
|
57
|
+
message: t('{0} is {1:c}', t('the "{0*}" {1}', name, 'attribute'), 'disallowed'),
|
|
58
|
+
});
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (eligibility.status !== 'condition-not-met') {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const spec = getSpec(attr.ownerElement, document.specs.specs);
|
|
65
|
+
if (spec?.possibleToAddProperties) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
report({
|
|
69
|
+
scope: attr,
|
|
70
|
+
message: t('{0} is {1}', t('the "{0*}" {1}', name, 'attribute'), 'disallowed'),
|
|
71
|
+
line: attrName?.startLine,
|
|
72
|
+
col: attrName?.startCol,
|
|
73
|
+
raw: attrName?.raw,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
});
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import { createRule } from '@markuplint/ml-core';
|
|
2
2
|
import { removeAttr } from '../helpers.js';
|
|
3
3
|
import meta from './meta.js';
|
|
4
|
-
/**
|
|
5
|
-
* Rule that checks for duplicate attributes on the same element.
|
|
6
|
-
*
|
|
7
|
-
* Walks all elements and reports when two or more attributes share the same
|
|
8
|
-
* name (case-insensitive for HTML elements). Attributes marked as duplicatable
|
|
9
|
-
* (e.g., template-engine directives) are excluded from this check.
|
|
10
|
-
*/
|
|
11
4
|
export default createRule({
|
|
12
5
|
meta: meta,
|
|
13
6
|
async verify({ document, report, t }) {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
category: 'syntax',
|
|
3
|
+
fixable: true,
|
|
4
|
+
// This rule's detection is a superset of parse5's `duplicate-attribute`
|
|
5
|
+
// event: parse5 only fires on HTML elements (case-insensitive), while
|
|
6
|
+
// this rule also covers JSX / SVG / authored components. When the rule
|
|
7
|
+
// is active, ml-core dedupes the built-in parse-error channel so users
|
|
8
|
+
// don't see two violations for the same duplicate.
|
|
9
|
+
mirrorsParseErrorCodes: ['duplicate-attribute'],
|
|
10
|
+
};
|
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ensures no more than one element in a document has the `autofocus` attribute.
|
|
3
|
-
*
|
|
4
|
-
* @see https://html.spec.whatwg.org/multipage/interaction.html#the-autofocus-attribute
|
|
5
|
-
*/
|
|
6
1
|
declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, null>>;
|
|
7
2
|
export default _default;
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { createRule } from '@markuplint/ml-core';
|
|
2
2
|
import meta from './meta.js';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* The HTML Living Standard scopes autofocus uniqueness to the "nearest ancestor
|
|
5
|
+
* autofocus scoping root element" — the element itself if it is a `dialog` or
|
|
6
|
+
* has a `popover` attribute, otherwise the nearest such ancestor, otherwise the
|
|
7
|
+
* document as a whole. Two `autofocus` elements only conflict when they share
|
|
8
|
+
* the same scoping root; two `dialog`/`popover` elements can each carry their
|
|
9
|
+
* own `autofocus` target without conflict.
|
|
5
10
|
*
|
|
6
11
|
* @see https://html.spec.whatwg.org/multipage/interaction.html#the-autofocus-attribute
|
|
7
12
|
*/
|
|
13
|
+
function getAutofocusScopingRoot(el) {
|
|
14
|
+
return el.closest('dialog, [popover]');
|
|
15
|
+
}
|
|
8
16
|
export default createRule({
|
|
9
17
|
meta: meta,
|
|
10
18
|
defaultValue: true,
|
|
@@ -17,11 +25,17 @@ export default createRule({
|
|
|
17
25
|
autofocusElements.push(el);
|
|
18
26
|
}
|
|
19
27
|
});
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
28
|
+
const seenScopingRoots = new Set();
|
|
29
|
+
for (const el of autofocusElements) {
|
|
30
|
+
const scopingRoot = getAutofocusScopingRoot(el);
|
|
31
|
+
if (seenScopingRoots.has(scopingRoot)) {
|
|
32
|
+
report({
|
|
33
|
+
scope: el,
|
|
34
|
+
message: t('The "{0}" attribute must be unique in the document', 'autofocus'),
|
|
35
|
+
});
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
seenScopingRoots.add(scopingRoot);
|
|
25
39
|
}
|
|
26
40
|
},
|
|
27
41
|
});
|
|
@@ -1,8 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rule that validates there are no duplicate `<dt>` elements within a `<dl>`.
|
|
3
|
-
*
|
|
4
|
-
* Iterates through each definition list and checks that no two `<dt>` elements
|
|
5
|
-
* (direct children or wrapped in `<div>`) share the same text content.
|
|
6
|
-
*/
|
|
7
1
|
declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<import("@markuplint/ml-core").RuleConfigValue, undefined>>;
|
|
8
2
|
export default _default;
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import { createRule } from '@markuplint/ml-core';
|
|
2
2
|
import meta from './meta.js';
|
|
3
|
-
/**
|
|
4
|
-
* Rule that validates there are no duplicate `<dt>` elements within a `<dl>`.
|
|
5
|
-
*
|
|
6
|
-
* Iterates through each definition list and checks that no two `<dt>` elements
|
|
7
|
-
* (direct children or wrapped in `<div>`) share the same text content.
|
|
8
|
-
*/
|
|
9
3
|
export default createRule({
|
|
10
4
|
meta: meta,
|
|
5
|
+
defaultSeverity: 'warning',
|
|
11
6
|
verify({ document, report, t }) {
|
|
12
7
|
const dlList = [...document.querySelectorAll('dl')];
|
|
13
8
|
for (const dl of dlList) {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration options for the `no-duplicate-h1` rule.
|
|
3
|
+
*/
|
|
4
|
+
export interface Options {
|
|
5
|
+
/** Whether to apply this rule in document fragments (components, partials). */
|
|
6
|
+
'in-document-fragment': boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Split from the former `required-h1` rule (#3989): the duplicate-`<h1>`
|
|
10
|
+
* half. Based on WCAG's Techniques H42 for Success Criterion 1.3.1 — a
|
|
11
|
+
* non-normative technique, not the criterion itself, so this rule's default
|
|
12
|
+
* severity is `warning`. The former rule's `expected-once` option gated this
|
|
13
|
+
* check; disabling this rule entirely is how to opt out now.
|
|
14
|
+
*
|
|
15
|
+
* @see https://www.w3.org/WAI/WCAG21/Techniques/html/H42
|
|
16
|
+
*/
|
|
17
|
+
declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, Options>>;
|
|
18
|
+
export default _default;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createRule } from '@markuplint/ml-core';
|
|
2
|
+
import meta from './meta.js';
|
|
3
|
+
/**
|
|
4
|
+
* Split from the former `required-h1` rule (#3989): the duplicate-`<h1>`
|
|
5
|
+
* half. Based on WCAG's Techniques H42 for Success Criterion 1.3.1 — a
|
|
6
|
+
* non-normative technique, not the criterion itself, so this rule's default
|
|
7
|
+
* severity is `warning`. The former rule's `expected-once` option gated this
|
|
8
|
+
* check; disabling this rule entirely is how to opt out now.
|
|
9
|
+
*
|
|
10
|
+
* @see https://www.w3.org/WAI/WCAG21/Techniques/html/H42
|
|
11
|
+
*/
|
|
12
|
+
export default createRule({
|
|
13
|
+
meta: meta,
|
|
14
|
+
defaultSeverity: 'warning',
|
|
15
|
+
defaultOptions: {
|
|
16
|
+
'in-document-fragment': false,
|
|
17
|
+
},
|
|
18
|
+
async verify({ document, report, t }) {
|
|
19
|
+
const h1Stack = [];
|
|
20
|
+
if (document.nodeList.length === 0) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (!document.rule.options['in-document-fragment'] && document.isFragment) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
await document.walkOn('Element', node => {
|
|
27
|
+
if (node.nodeName.toLowerCase() === 'h1') {
|
|
28
|
+
h1Stack.push(node);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
if (h1Stack.length > 1 && h1Stack[1]) {
|
|
32
|
+
const message = t('{0} is {1:c}', t('the "{0*}" {1}', 'h1', 'element'), 'duplicated');
|
|
33
|
+
report({
|
|
34
|
+
message,
|
|
35
|
+
line: h1Stack[1].startLine,
|
|
36
|
+
col: h1Stack[1].startCol,
|
|
37
|
+
raw: h1Stack[1].raw,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
});
|
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
import { createRule } from '@markuplint/ml-core';
|
|
2
2
|
import meta from './meta.js';
|
|
3
|
-
/**
|
|
4
|
-
* Rule that checks for duplicate `id` attribute values within a document.
|
|
5
|
-
*
|
|
6
|
-
* Walks all elements and collects `id` values, reporting any that have
|
|
7
|
-
* already been seen. Dynamic values and directive attributes are excluded
|
|
8
|
-
* from the check.
|
|
9
|
-
*/
|
|
10
3
|
export default createRule({
|
|
11
4
|
meta: meta,
|
|
12
5
|
async verify({ document, report, t }) {
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createRule } 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('Element', el => {
|
|
7
|
+
const elSpec = document.specs.specs.find(s => s.name === el.localName);
|
|
8
|
+
const uniqueAttrs = elSpec?.contentModel?.uniqueAttrs;
|
|
9
|
+
if (!uniqueAttrs || uniqueAttrs.length === 0) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
for (const attrName of uniqueAttrs) {
|
|
13
|
+
if (!el.hasAttribute(attrName)) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
const parent = el.parentElement;
|
|
17
|
+
if (!parent) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
// Only report on the second (and subsequent) element that has the attribute
|
|
21
|
+
const precedingSiblings = [...parent.children];
|
|
22
|
+
const elIndex = precedingSiblings.indexOf(el);
|
|
23
|
+
const hasPrecedingDuplicate = precedingSiblings
|
|
24
|
+
.slice(0, elIndex)
|
|
25
|
+
.some(child => child.localName === el.localName && child.hasAttribute(attrName));
|
|
26
|
+
if (hasPrecedingDuplicate) {
|
|
27
|
+
report({
|
|
28
|
+
scope: el,
|
|
29
|
+
message: t('The "{0}" attribute must not appear on more than one "{1}" element within the same parent', attrName, el.localName),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
});
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { createRule } from '@markuplint/ml-core';
|
|
2
2
|
import meta from './meta.js';
|
|
3
3
|
/**
|
|
4
|
-
* Ensures no more than one visible `<main>` element exists in a document.
|
|
5
4
|
* A `<main>` element with the `hidden` attribute is not considered visible.
|
|
6
5
|
*
|
|
7
6
|
* @see https://html.spec.whatwg.org/multipage/grouping-content.html#the-main-element
|
|
@@ -7,13 +7,5 @@ type Options = {
|
|
|
7
7
|
/** Whether to ignore elements marked with `aria-busy="true"`. */
|
|
8
8
|
ignoreIfAriaBusy?: boolean;
|
|
9
9
|
};
|
|
10
|
-
/**
|
|
11
|
-
* Rule that warns when palpable content elements are empty.
|
|
12
|
-
*
|
|
13
|
-
* Palpable content elements are expected to have visible or meaningful content.
|
|
14
|
-
* This rule reports elements that contain only whitespace text nodes, while
|
|
15
|
-
* excluding elements that are naturally empty (e.g., `<textarea>`, `<video>`)
|
|
16
|
-
* or have a nothing content model.
|
|
17
|
-
*/
|
|
18
10
|
declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, Options>>;
|
|
19
11
|
export default _default;
|
|
@@ -15,14 +15,6 @@ const allowedElements = new Set([
|
|
|
15
15
|
'video',
|
|
16
16
|
'img',
|
|
17
17
|
]);
|
|
18
|
-
/**
|
|
19
|
-
* Rule that warns when palpable content elements are empty.
|
|
20
|
-
*
|
|
21
|
-
* Palpable content elements are expected to have visible or meaningful content.
|
|
22
|
-
* This rule reports elements that contain only whitespace text nodes, while
|
|
23
|
-
* excluding elements that are naturally empty (e.g., `<textarea>`, `<video>`)
|
|
24
|
-
* or have a nothing content model.
|
|
25
|
-
*/
|
|
26
18
|
export default createRule({
|
|
27
19
|
meta: meta,
|
|
28
20
|
defaultSeverity: 'warning',
|