@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
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML LS [§4.9.12.1 *Forming a table*](https://html.spec.whatwg.org/multipage/tables.html#forming-a-table)
|
|
3
|
+
* Step 20: "if a column or a row does not have at least one cell anchored to it, that also
|
|
4
|
+
* constitutes a table model error" — covers both a `<tr>` with no cell anchored in it and a
|
|
5
|
+
* column that no cell (nor a `<col>` / `<colgroup>` it belongs to) ever anchors a cell to.
|
|
6
|
+
*
|
|
7
|
+
* Split from the original `table-row-column-alignment` rule. Skips a table that
|
|
8
|
+
* `no-table-cell-overlap` already reports on — once two cells claim the same slot, anchors
|
|
9
|
+
* derived from the grid model are no longer reliable.
|
|
10
|
+
*/
|
|
11
|
+
declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, undefined>>;
|
|
12
|
+
export default _default;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createRule } from '@markuplint/ml-core';
|
|
2
|
+
import { Grid } from '../table-row-column-alignment/grid.js';
|
|
3
|
+
import meta from './meta.js';
|
|
4
|
+
/**
|
|
5
|
+
* HTML LS [§4.9.12.1 *Forming a table*](https://html.spec.whatwg.org/multipage/tables.html#forming-a-table)
|
|
6
|
+
* Step 20: "if a column or a row does not have at least one cell anchored to it, that also
|
|
7
|
+
* constitutes a table model error" — covers both a `<tr>` with no cell anchored in it and a
|
|
8
|
+
* column that no cell (nor a `<col>` / `<colgroup>` it belongs to) ever anchors a cell to.
|
|
9
|
+
*
|
|
10
|
+
* Split from the original `table-row-column-alignment` rule. Skips a table that
|
|
11
|
+
* `no-table-cell-overlap` already reports on — once two cells claim the same slot, anchors
|
|
12
|
+
* derived from the grid model are no longer reliable.
|
|
13
|
+
*/
|
|
14
|
+
export default createRule({
|
|
15
|
+
meta,
|
|
16
|
+
verify({ document, report, t }) {
|
|
17
|
+
const tables = document.querySelectorAll('table');
|
|
18
|
+
for (const table of tables) {
|
|
19
|
+
const grid = new Grid(table);
|
|
20
|
+
if (grid.hasOverlapped()) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
for (const range of grid.getColumnsWithoutAnchor()) {
|
|
24
|
+
const count = range.right - range.left;
|
|
25
|
+
report({
|
|
26
|
+
scope: range.source.getAttributeNode('colspan') ?? range.source,
|
|
27
|
+
message: count === 1
|
|
28
|
+
? t('{0} {1} has no cells beginning in it', t('1'), t('column'))
|
|
29
|
+
: t('{0} {1} have no cells beginning in them', t(`${count}`), t('columns')),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
for (const row of grid.getRows()) {
|
|
33
|
+
if (row.anchorCount === 0) {
|
|
34
|
+
report({
|
|
35
|
+
scope: row.element,
|
|
36
|
+
message: t('{0} {1} has no cells beginning in it', t('1'), t('row')),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Configuration options for the `no-event-handler-attr` rule. */
|
|
2
|
+
type Options = {
|
|
3
|
+
/** Attribute name pattern(s) to exclude from the check. */
|
|
4
|
+
ignore?: string | string[];
|
|
5
|
+
};
|
|
6
|
+
declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean | readonly string[], Options>>;
|
|
7
|
+
export default _default;
|
|
@@ -20,17 +20,6 @@ function matchEventName(eventName, pattern) {
|
|
|
20
20
|
}
|
|
21
21
|
return eventName === pattern.toLowerCase();
|
|
22
22
|
}
|
|
23
|
-
/**
|
|
24
|
-
* Rule that disallows inline event handler attributes (e.g., `onclick`,
|
|
25
|
-
* `onchange`).
|
|
26
|
-
*
|
|
27
|
-
* Reports any attribute on an HTML element whose name starts with `on`,
|
|
28
|
-
* indicating an inline event handler. An `ignore` option allows specific
|
|
29
|
-
* attribute names or patterns to be excluded from the check.
|
|
30
|
-
*
|
|
31
|
-
* The value can be `true` (disallow all event handlers) or a `string[]`
|
|
32
|
-
* of event names (without the `on` prefix) to selectively disallow.
|
|
33
|
-
*/
|
|
34
23
|
export default createRule({
|
|
35
24
|
meta: meta,
|
|
36
25
|
defaultSeverity: 'warning',
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for the `no-experimental-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?.experimental) {
|
|
24
|
+
report({
|
|
25
|
+
scope: el,
|
|
26
|
+
message: t('{0} is {1:c}', t('the "{0*}" {1}', elName, 'element'), 'experimental'),
|
|
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?.experimental) {
|
|
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'), 'experimental'),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forbid more than one `selected` option in a `<select>` that does not
|
|
3
|
+
* carry the `multiple` attribute. Mirrors HTML LS §4.10.7's "list of
|
|
4
|
+
* options" rule (direct `<option>` children, plus `<option>` children
|
|
5
|
+
* of `<optgroup>` children).
|
|
6
|
+
*
|
|
7
|
+
* @see https://html.spec.whatwg.org/multipage/form-elements.html#the-select-element
|
|
8
|
+
*/
|
|
9
|
+
declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, null>>;
|
|
10
|
+
export default _default;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { createRule } from '@markuplint/ml-core';
|
|
2
|
+
import meta from './meta.js';
|
|
3
|
+
/**
|
|
4
|
+
* Forbid more than one `selected` option in a `<select>` that does not
|
|
5
|
+
* carry the `multiple` attribute. Mirrors HTML LS §4.10.7's "list of
|
|
6
|
+
* options" rule (direct `<option>` children, plus `<option>` children
|
|
7
|
+
* of `<optgroup>` children).
|
|
8
|
+
*
|
|
9
|
+
* @see https://html.spec.whatwg.org/multipage/form-elements.html#the-select-element
|
|
10
|
+
*/
|
|
11
|
+
export default createRule({
|
|
12
|
+
meta: meta,
|
|
13
|
+
defaultValue: true,
|
|
14
|
+
defaultOptions: null,
|
|
15
|
+
async verify({ document, report, t }) {
|
|
16
|
+
await document.walkOn('Element', el => {
|
|
17
|
+
if (el.localName !== 'select')
|
|
18
|
+
return;
|
|
19
|
+
// Pretender selects with no `as` pin: descendants are unknown until typed.
|
|
20
|
+
if (el.pretenderContext?.type === 'pretender' && !el.hasAttribute('as'))
|
|
21
|
+
return;
|
|
22
|
+
if (el.hasAttribute('multiple'))
|
|
23
|
+
return;
|
|
24
|
+
const selected = [
|
|
25
|
+
...el.querySelectorAll(':scope > option[selected], :scope > optgroup > option[selected]'),
|
|
26
|
+
];
|
|
27
|
+
if (selected.length <= 1)
|
|
28
|
+
return;
|
|
29
|
+
for (const opt of selected.slice(1)) {
|
|
30
|
+
report({
|
|
31
|
+
scope: opt,
|
|
32
|
+
message: t('The "{0}" element cannot have more than one selected "{1}" descendant unless the "{2}" attribute is specified', 'select', 'option', 'multiple'),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
});
|
|
@@ -2,7 +2,6 @@ import { createRule, getSpec } from '@markuplint/ml-core';
|
|
|
2
2
|
import { checkingInteractionInHidden } from '../wai-aria/checkings/interaction-in-hidden.js';
|
|
3
3
|
import { defaultOptions } from '../wai-aria/default-options.js';
|
|
4
4
|
import meta from './meta.js';
|
|
5
|
-
/** Warns when focusable interactive elements are placed inside an aria-hidden subtree. */
|
|
6
5
|
export default createRule({
|
|
7
6
|
meta,
|
|
8
7
|
defaultSeverity: 'warning',
|
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
import { createRule } from '@markuplint/ml-core';
|
|
2
2
|
import meta from './meta.js';
|
|
3
|
-
/**
|
|
4
|
-
* Rule that disallows hard-coded `id` attribute values in document fragments.
|
|
5
|
-
*
|
|
6
|
-
* Only active for fragment documents (e.g., component templates). Reports
|
|
7
|
-
* any `id` attribute whose value is a static string rather than a dynamic
|
|
8
|
-
* or code-generated value, encouraging dynamic ID generation to avoid
|
|
9
|
-
* collisions when fragments are reused.
|
|
10
|
-
*/
|
|
11
3
|
export default createRule({
|
|
12
4
|
meta: meta,
|
|
13
5
|
defaultSeverity: 'warning',
|
|
@@ -2,13 +2,6 @@ import { createRule, getAttrSpecs } from '@markuplint/ml-core';
|
|
|
2
2
|
import { toNoEmptyStringArrayFromStringOrArray } from '@markuplint/shared';
|
|
3
3
|
import { removeAttr } from '../helpers.js';
|
|
4
4
|
import meta from './meta.js';
|
|
5
|
-
/**
|
|
6
|
-
* Rule that detects attributes that have no effect on their owner element.
|
|
7
|
-
*
|
|
8
|
-
* Checks each attribute's spec for ineffective conditions (CSS selectors)
|
|
9
|
-
* and reports when the owner element matches any of those conditions,
|
|
10
|
-
* meaning the attribute is present but has no practical effect.
|
|
11
|
-
*/
|
|
12
5
|
export default createRule({
|
|
13
6
|
meta: meta,
|
|
14
7
|
defaultSeverity: 'warning',
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<input type="file">` may carry the `value` attribute only when its
|
|
3
|
+
* value is the empty string. Per HTML LS §4.10.5.1.18 (File Upload
|
|
4
|
+
* state): "The value attribute, if specified, must have a value that
|
|
5
|
+
* is the empty string."
|
|
6
|
+
*
|
|
7
|
+
* @see https://html.spec.whatwg.org/multipage/input.html#file-upload-state-(type=file)
|
|
8
|
+
*/
|
|
9
|
+
declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, null>>;
|
|
10
|
+
export default _default;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createRule } from '@markuplint/ml-core';
|
|
2
|
+
import meta from './meta.js';
|
|
3
|
+
/**
|
|
4
|
+
* `<input type="file">` may carry the `value` attribute only when its
|
|
5
|
+
* value is the empty string. Per HTML LS §4.10.5.1.18 (File Upload
|
|
6
|
+
* state): "The value attribute, if specified, must have a value that
|
|
7
|
+
* is the empty string."
|
|
8
|
+
*
|
|
9
|
+
* @see https://html.spec.whatwg.org/multipage/input.html#file-upload-state-(type=file)
|
|
10
|
+
*/
|
|
11
|
+
export default createRule({
|
|
12
|
+
meta: meta,
|
|
13
|
+
defaultValue: true,
|
|
14
|
+
defaultOptions: null,
|
|
15
|
+
async verify({ document, report, t }) {
|
|
16
|
+
await document.walkOn('Element', el => {
|
|
17
|
+
if (el.localName !== 'input')
|
|
18
|
+
return;
|
|
19
|
+
// Pretender inputs with no `as` pin: attributes are unknown until typed.
|
|
20
|
+
if (el.pretenderContext?.type === 'pretender' && !el.hasAttribute('as'))
|
|
21
|
+
return;
|
|
22
|
+
const typeAttr = el.getAttributeNode('type');
|
|
23
|
+
const valueAttr = el.getAttributeNode('value');
|
|
24
|
+
if (!typeAttr || !valueAttr)
|
|
25
|
+
return;
|
|
26
|
+
if (typeAttr.isDynamicValue || valueAttr.isDynamicValue)
|
|
27
|
+
return;
|
|
28
|
+
if (typeAttr.value.toLowerCase() !== 'file')
|
|
29
|
+
return;
|
|
30
|
+
if (valueAttr.value === '')
|
|
31
|
+
return;
|
|
32
|
+
report({
|
|
33
|
+
scope: valueAttr,
|
|
34
|
+
line: valueAttr.valueNode?.startLine,
|
|
35
|
+
col: valueAttr.valueNode?.startCol,
|
|
36
|
+
raw: valueAttr.valueNode?.raw,
|
|
37
|
+
message: t('The "{0}" attribute on a "{1}" element with "{2}={3}" must be the empty string', 'value', 'input', 'type', 'file'),
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
});
|
|
@@ -3,7 +3,6 @@ import { ARIA_RECOMMENDED_VERSION } from '@markuplint/ml-spec';
|
|
|
3
3
|
import { checkingValue } from '../wai-aria/checkings/value.js';
|
|
4
4
|
import { defaultOptions } from '../wai-aria/default-options.js';
|
|
5
5
|
import meta from './meta.js';
|
|
6
|
-
/** Warns when an ARIA property or state value does not conform to its expected type. */
|
|
7
6
|
export default createRule({
|
|
8
7
|
meta,
|
|
9
8
|
defaultOptions,
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AttributeType } from '@markuplint/ml-spec';
|
|
2
|
+
import type { Pattern } from '@markuplint/types';
|
|
3
|
+
/**
|
|
4
|
+
* Configuration options for the `no-invalid-attr-value` rule.
|
|
5
|
+
*/
|
|
6
|
+
type Option = {
|
|
7
|
+
/**
|
|
8
|
+
* Attribute names to treat as known, beyond what the spec defines, with
|
|
9
|
+
* the type or pattern their value must match. Shares its shape with
|
|
10
|
+
* `no-unknown-attr`'s option of the same name — the name-eligibility half
|
|
11
|
+
* lives there, this rule only consumes the value constraint.
|
|
12
|
+
*
|
|
13
|
+
* @since 3.7.0
|
|
14
|
+
*/
|
|
15
|
+
allowAttrs?: (string | Attr)[] | Record<string, AttributeType | Pattern>;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Describes a single attribute with its name and expected value constraint.
|
|
19
|
+
*/
|
|
20
|
+
type Attr = {
|
|
21
|
+
/** The attribute name. */
|
|
22
|
+
name: string;
|
|
23
|
+
/** The expected attribute value type or validation rule. */
|
|
24
|
+
value: AttributeType | Pattern;
|
|
25
|
+
};
|
|
26
|
+
declare const _default: Readonly<import("@markuplint/ml-core").RuleSeed<boolean, Option>>;
|
|
27
|
+
export default _default;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { createRule, getAttrSpecs } from '@markuplint/ml-core';
|
|
2
|
+
import { attrCheck } from '../attr-check.js';
|
|
3
|
+
import { resolveAttrEligibility } from '../attr-eligibility.js';
|
|
4
|
+
import { log as ruleLog } from '../debug.js';
|
|
5
|
+
import meta from './meta.js';
|
|
6
|
+
const log = ruleLog.extend('no-invalid-attr-value');
|
|
7
|
+
function allowedTypes(allowAttrs) {
|
|
8
|
+
const map = new Map();
|
|
9
|
+
if (!allowAttrs) {
|
|
10
|
+
return map;
|
|
11
|
+
}
|
|
12
|
+
if (Array.isArray(allowAttrs)) {
|
|
13
|
+
for (const allowAttr of allowAttrs) {
|
|
14
|
+
if (typeof allowAttr === 'string') {
|
|
15
|
+
map.set(allowAttr, 'Any');
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
map.set(allowAttr.name, allowAttr.value);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
for (const [name, type] of Object.entries(allowAttrs)) {
|
|
23
|
+
map.set(name, type);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return map;
|
|
27
|
+
}
|
|
28
|
+
export default createRule({
|
|
29
|
+
meta: meta,
|
|
30
|
+
defaultOptions: {},
|
|
31
|
+
async verify({ document, report, t }) {
|
|
32
|
+
await document.walkOn('Attr', attr => {
|
|
33
|
+
if (attr.isDirective) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const name = attr.name;
|
|
37
|
+
const value = attr.value;
|
|
38
|
+
const valueNode = attr.valueNode;
|
|
39
|
+
const allowType = allowedTypes(attr.rule.options.allowAttrs).get(name);
|
|
40
|
+
let invalid = false;
|
|
41
|
+
if (allowType === undefined) {
|
|
42
|
+
if (attr.ownerElement.elementType !== 'html') {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const attrSpecs = getAttrSpecs(attr.ownerElement, document.specs);
|
|
46
|
+
if (!attrSpecs) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
log('Checking %s[%s="%s"]', attr.nodeName, name, value);
|
|
50
|
+
const eligibility = resolveAttrEligibility(name, attr.ownerElement, attrSpecs);
|
|
51
|
+
if (eligibility.status !== 'ok') {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
invalid = attrCheck(t, name, value, false, eligibility.spec);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
invalid = attrCheck(t, name, value, true, {
|
|
58
|
+
name,
|
|
59
|
+
type: allowType,
|
|
60
|
+
description: '',
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (attr.isDynamicValue) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const invalidList = Array.isArray(invalid) ? invalid : [invalid];
|
|
67
|
+
for (const one of invalidList) {
|
|
68
|
+
if (one === false || one.invalidType !== 'invalid-value') {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
report({
|
|
72
|
+
scope: attr,
|
|
73
|
+
message: one.message,
|
|
74
|
+
line: (valueNode?.startLine ?? 0) + (one.loc?.line ?? 0),
|
|
75
|
+
col: one.loc && one.loc.line > 0
|
|
76
|
+
? one.loc.col + 1
|
|
77
|
+
: (valueNode?.startCol ?? 0) + (one.loc?.col ?? 0),
|
|
78
|
+
raw: one.loc?.raw ?? value,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
},
|
|
83
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { createRule } from '@markuplint/ml-core';
|
|
2
|
+
import meta from './meta.js';
|
|
3
|
+
/**
|
|
4
|
+
* parse5 ERR codes for malformed character references — the eight codes
|
|
5
|
+
* this rule claims responsibility for via `meta.mirrorsParseErrorCodes`.
|
|
6
|
+
* Kept as a Set for O(1) lookup against `document.parseErrors`.
|
|
7
|
+
*/
|
|
8
|
+
const parse5CharacterReferenceCodes = new Set([
|
|
9
|
+
'unknown-named-character-reference',
|
|
10
|
+
'missing-semicolon-after-character-reference',
|
|
11
|
+
'absence-of-digits-in-numeric-character-reference',
|
|
12
|
+
'null-character-reference',
|
|
13
|
+
'surrogate-character-reference',
|
|
14
|
+
'control-character-reference',
|
|
15
|
+
'noncharacter-character-reference',
|
|
16
|
+
'character-reference-outside-unicode-range',
|
|
17
|
+
]);
|
|
18
|
+
export default createRule({
|
|
19
|
+
meta: meta,
|
|
20
|
+
verify({ document, report, t }) {
|
|
21
|
+
// Hook into parse5's malformed-character-reference events surfaced on
|
|
22
|
+
// `document.parseErrors`. These eight codes — declared in
|
|
23
|
+
// `meta.mirrorsParseErrorCodes` — are suppressed on the built-in
|
|
24
|
+
// `parse-error` channel by ml-core, so this rule is the only place a
|
|
25
|
+
// user with this rule enabled will see them.
|
|
26
|
+
for (const pe of document.parseErrors) {
|
|
27
|
+
if (!parse5CharacterReferenceCodes.has(pe.code)) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
report({
|
|
31
|
+
line: pe.startLine,
|
|
32
|
+
col: pe.startCol,
|
|
33
|
+
raw: pe.raw,
|
|
34
|
+
message: t('{0} is {1:c}', t('the {0}', 'character reference'), pe.code),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
readonly category: "syntax";
|
|
3
|
+
readonly mirrorsParseErrorCodes: readonly ["unknown-named-character-reference", "missing-semicolon-after-character-reference", "absence-of-digits-in-numeric-character-reference", "null-character-reference", "surrogate-character-reference", "control-character-reference", "noncharacter-character-reference", "character-reference-outside-unicode-range"];
|
|
4
|
+
};
|
|
5
|
+
export default _default;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// This rule reads `document.parseErrors` and converts parse5's eight
|
|
2
|
+
// `*-character-reference` malformed-reference codes — unknown names, missing
|
|
3
|
+
// semicolons, NULL / surrogate / control / noncharacter / out-of-range
|
|
4
|
+
// numeric references — into its own violations, so a user who enables this
|
|
5
|
+
// rule sees them under `ruleId: 'no-malformed-character-reference'` instead
|
|
6
|
+
// of the built-in `parse-error` channel. ml-core suppresses the mirrored
|
|
7
|
+
// codes unconditionally — they only ever surface through this rule.
|
|
8
|
+
export default {
|
|
9
|
+
category: 'syntax',
|
|
10
|
+
mirrorsParseErrorCodes: [
|
|
11
|
+
'unknown-named-character-reference',
|
|
12
|
+
'missing-semicolon-after-character-reference',
|
|
13
|
+
'absence-of-digits-in-numeric-character-reference',
|
|
14
|
+
'null-character-reference',
|
|
15
|
+
'surrogate-character-reference',
|
|
16
|
+
'control-character-reference',
|
|
17
|
+
'noncharacter-character-reference',
|
|
18
|
+
'character-reference-outside-unicode-range',
|
|
19
|
+
],
|
|
20
|
+
};
|