@markuplint/config-presets 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 +44 -0
- package/README.md +48 -10
- package/package.json +4 -3
- package/preset.a11y.json +1 -1
- package/preset.code-styles.json +1 -1
- package/preset.compat.json +1 -1
- package/preset.html-standard.json +1 -1
- package/preset.performance.json +1 -1
- package/preset.rdfa.json +1 -1
- package/preset.recommended-react.json +1 -1
- package/preset.recommended-static-html.json +1 -1
- package/preset.recommended-svelte.json +1 -1
- package/preset.recommended-vue.json +1 -1
- package/preset.security.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,50 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [5.0.0-rc.5](https://github.com/markuplint/markuplint/compare/v5.0.0-rc.4...v5.0.0-rc.5) (2026-08-28)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- **rules:** surface disallowed-element reason via reasonOnly (close [#3815](https://github.com/markuplint/markuplint/issues/3815)) ([#3986](https://github.com/markuplint/markuplint/issues/3986)) ([0142cec](https://github.com/markuplint/markuplint/commit/0142cec667f70fee086f2a6e06d7a26e66bda380))
|
|
11
|
+
- **types): strict charset=utf-8; feat(rules:** usemap-references-map ([#3969](https://github.com/markuplint/markuplint/issues/3969)) ([c63070e](https://github.com/markuplint/markuplint/commit/c63070e29ccb283da7468b2fc67db372ebfcf42a)), closes [#3945](https://github.com/markuplint/markuplint/issues/3945) [#3966](https://github.com/markuplint/markuplint/issues/3966) [#3966](https://github.com/markuplint/markuplint/issues/3966) [#3928](https://github.com/markuplint/markuplint/issues/3928)
|
|
12
|
+
|
|
13
|
+
### Code Refactoring
|
|
14
|
+
|
|
15
|
+
- **rules:** redesign v5 rule system — naming, splits, specConformance ([#3989](https://github.com/markuplint/markuplint/issues/3989)) ([e925565](https://github.com/markuplint/markuplint/commit/e925565ce537848d7d1573369723cbce724a841b)), closes [#4](https://github.com/markuplint/markuplint/issues/4) [#aside-conditional-role-mapping-aria-13](https://github.com/markuplint/markuplint/issues/aside-conditional-role-mapping-aria-13)
|
|
16
|
+
|
|
17
|
+
- fix(config-presets)!: enable invalid-attr in html-standard, simplify rdfa nodeRule (#3803) ([2114933](https://github.com/markuplint/markuplint/commit/2114933f90640110baf8dcc85f34cab73b412bdf)), closes [#3803](https://github.com/markuplint/markuplint/issues/3803)
|
|
18
|
+
|
|
19
|
+
### Features
|
|
20
|
+
|
|
21
|
+
- **config-presets:** add 6 new conformance rules to html-standard preset ([595e3b9](https://github.com/markuplint/markuplint/commit/595e3b91a2e4c8c33a8fd1c9d179b3a9dc8be054))
|
|
22
|
+
- **config-presets:** forbid <base> after <link> or <script> in <head> ([#3925](https://github.com/markuplint/markuplint/issues/3925)) ([ceb892d](https://github.com/markuplint/markuplint/commit/ceb892d64772d459a6bd9564684218e3afbdec2e))
|
|
23
|
+
- **config-presets:** wire form-attr-references-form + no-refer-to-non-existent-id ([8fad30f](https://github.com/markuplint/markuplint/commit/8fad30f79b679f5581f368de1f187cfad4870731))
|
|
24
|
+
- **rules:** add input-list-references-datalist rule ([#3931](https://github.com/markuplint/markuplint/issues/3931)) ([bf4ef54](https://github.com/markuplint/markuplint/commit/bf4ef54a1b2937ecbe05fbe5121ddfe199781a95))
|
|
25
|
+
- **rules:** add label-for-references-labelable rule ([#3932](https://github.com/markuplint/markuplint/issues/3932)) ([3713e6b](https://github.com/markuplint/markuplint/commit/3713e6b435a76fe03a941a36a5e33c0ab06c9a80)), closes [#3918](https://github.com/markuplint/markuplint/issues/3918)
|
|
26
|
+
- **rules:** add progress-value-bounds rule ([#3926](https://github.com/markuplint/markuplint/issues/3926)) ([1e259ec](https://github.com/markuplint/markuplint/commit/1e259ec9929ceb3c7ac5864ce2807420646e9602))
|
|
27
|
+
- **rules:** add wai-aria-tab-requires-tabpanel rule ([#3955](https://github.com/markuplint/markuplint/issues/3955)) ([eac9abe](https://github.com/markuplint/markuplint/commit/eac9abef20ef304c3da2114849686b9cf0733942))
|
|
28
|
+
- **rules:** extend label-no-multiple-controls for external labeled control ([#3933](https://github.com/markuplint/markuplint/issues/3933)) ([392f051](https://github.com/markuplint/markuplint/commit/392f051c0d7ee8be8f3dc12afae6a902c6c8ea2b))
|
|
29
|
+
- **rules:** surface parse5-silent HTML LS parse errors (close nu-only umbrella [#3943](https://github.com/markuplint/markuplint/issues/3943)) ([#3980](https://github.com/markuplint/markuplint/issues/3980)) ([89951fa](https://github.com/markuplint/markuplint/commit/89951fa274007d56370510cb0cf11aead808ce13))
|
|
30
|
+
- wire script-content into preset, bench, and default-rules ([dd0507a](https://github.com/markuplint/markuplint/commit/dd0507a9f54fcff25dba666a1c8fbc082489bdc8))
|
|
31
|
+
|
|
32
|
+
### BREAKING CHANGES
|
|
33
|
+
|
|
34
|
+
- **rules:** with no alias coverage.
|
|
35
|
+
- `markuplint:html-standard` now enables the base `invalid-attr` rule.
|
|
36
|
+
`rdfa/meta-property` is no longer a named rule — override behavior is preserved by
|
|
37
|
+
the unnamed nodeRule. Users who disabled this named rule via
|
|
38
|
+
`rules: { "rdfa/meta-property": false }` should remove that entry.
|
|
39
|
+
|
|
40
|
+
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
|
41
|
+
|
|
42
|
+
# [5.0.0-rc.4](https://github.com/markuplint/markuplint/compare/v5.0.0-rc.3...v5.0.0-rc.4) (2026-04-19)
|
|
43
|
+
|
|
44
|
+
**Note:** Version bump only for package @markuplint/config-presets
|
|
45
|
+
|
|
46
|
+
# [5.0.0-rc.3](https://github.com/markuplint/markuplint/compare/v5.0.0-rc.2...v5.0.0-rc.3) (2026-04-19)
|
|
47
|
+
|
|
48
|
+
**Note:** Version bump only for package @markuplint/config-presets
|
|
49
|
+
|
|
6
50
|
# [5.0.0-rc.2](https://github.com/markuplint/markuplint/compare/v5.0.0-rc.1...v5.0.0-rc.2) (2026-04-15)
|
|
7
51
|
|
|
8
52
|
### Features
|
package/README.md
CHANGED
|
@@ -27,16 +27,22 @@ Ruleset|Description|`recommended`|`recommended-vue`|`recommended-svelte`|`recomm
|
|
|
27
27
|
[Must not duplicate **ID**](https://www.w3.org/WAI/WCAG21/Techniques/html/H93.html)|Be able to avoid problems in assistive technologies from the viewpoint of machine readability.|✅|✅|✅|✅|✅|✅|❌|❌|✅|❌|❌|❌|
|
|
28
28
|
[Disallow `accesskey` attr](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/accesskey#accessibility_concerns)| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
29
29
|
`<label>` should have control| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
30
|
-
[Use **landmark**](https://www.w3.org/
|
|
30
|
+
[Use **landmark**](https://www.w3.org/WAI/ARIA/apg/practices/landmark-regions/)|Split from the former `landmark-roles` rule (#3989); this group keeps its name and wraps only this one rule. The duplicated-landmark-labeling half lives in the new `a11y/require-landmark-label` sibling group below.|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
31
|
+
[Require a unique label for duplicated landmarks](https://www.w3.org/WAI/ARIA/apg/practices/landmark-regions/)|Split from the former `landmark-roles` rule (#3989).|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
31
32
|
**Popover** trigger and target must be adjacent| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
32
33
|
[No ambiguous **Navigable Target Names**](https://html.spec.whatwg.org/multipage/document-sequences.html#navigable-target-names)| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
33
34
|
No consecutive `<br>`| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
34
35
|
No refer to no existent **ID**| |✅|✅|✅|✅|✅|✅|❌|❌|✅|❌|❌|❌|
|
|
36
|
+
No broken fragment link|Split from the former `no-refer-to-non-existent-id` rule (#3989). Because `no-refer-to-non-existent-id` itself isn't renamed or deprecated, it gets no `rule-aliases.ts` entry — a hand-written config that enables only `no-refer-to-non-existent-id` keeps working unchanged but silently loses fragment link coverage. This group is how a11y-preset users keep it.|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
35
37
|
No redundant **accessible name** sources| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
36
38
|
Require **accessible name**| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
37
39
|
Require **autofocus** in modal dialogs| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
38
|
-
Require `<h1>`|
|
|
39
|
-
|
|
40
|
+
Require `<h1>`|Split from the former `required-h1` rule (#3989); this group keeps its name and wraps only this one rule. The duplicate-`<h1>` half lives in the new `a11y/no-duplicate-h1` sibling group below.|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
41
|
+
No duplicate `<h1>`| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
42
|
+
Align row and column|Split from the former `table-row-column-alignment` rule (#3989). This group keeps its name for anyone overriding it directly; the three table-model-error checks that split out alongside it (`no-table-cell-overlap`, `no-table-span-overflow`, `no-empty-table-track`) live in their own sibling groups below since their default severity, `error`, differs from this group's `warning`.|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
43
|
+
[No overlapping table cells](https://html.spec.whatwg.org/multipage/tables.html#forming-a-table)| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
44
|
+
[No table cell span reaching past its row group](https://html.spec.whatwg.org/multipage/tables.html#forming-a-table)| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
45
|
+
[No table row or column with no cell anchored to it](https://html.spec.whatwg.org/multipage/tables.html#forming-a-table)| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
40
46
|
Use `<ul>`| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
41
47
|
Conform to **WAI-ARIA**| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
42
48
|
Require `<html lang>`| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
@@ -48,39 +54,71 @@ No merge cells| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
|
48
54
|
[Disallow `autofocus` attr outside dialog scope](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/autofocus#accessibility_considerations)|Don't take away focus by force. The `dialog` element and its descendants are excepted.|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
49
55
|
[`tabindex` attr only `-1` or `0`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex#accessibility_concerns)|Scoped to non-dialog elements because the HTML spec disallows `tabindex` on `<dialog>` (`noUse`).|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
50
56
|
[Disallow `user-scalable=no` in viewport meta](https://developer.mozilla.org/en-US/docs/Web/HTML/Viewport_meta_tag)|Usage of `user-scalable=no` can cause accessibility issues to users with visual impairments such as low vision. WCAG requires a minimum of 2× scaling.|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
|
|
57
|
+
[Consistent **attribute name** casing](https://html.spec.whatwg.org/multipage/syntax.html#attributes-2)|HTML permits any mix of ASCII upper/lower case in attribute names; this is a style preference, not a spec requirement.|✅|✅|✅|✅|✅|❌|✅|❌|❌|❌|❌|❌|
|
|
58
|
+
[Consistent **tag name** casing](https://html.spec.whatwg.org/multipage/syntax.html#syntax-tag-name)|HTML permits any mix of ASCII upper/lower case in tag names; this is a style preference, not a spec requirement.|✅|✅|✅|✅|✅|❌|✅|❌|❌|❌|❌|❌|
|
|
51
59
|
[No duplicate attr](https://html.spec.whatwg.org/multipage/parsing.html#parse-error-duplicate-attribute)|The parser ignores all such duplicate occurrences of the attribute.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
52
|
-
No
|
|
53
|
-
No
|
|
54
|
-
|
|
60
|
+
No obsolete attr|Authors must not use attributes the spec has removed entirely. The group name is kept as `deprecated-attr` for backward compatibility.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
61
|
+
No deprecated attr|MDN/BCD-sourced (factual, not a spec MUST) — kept enabled here (severity downgraded to warning, not removed from the preset) so existing markuplint:html-standard users keep this coverage.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
62
|
+
No obsolete element|Authors must not use elements the spec has removed entirely. The group name is kept as `deprecated-element` for backward compatibility.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
63
|
+
No deprecated element|MDN/BCD-sourced (factual, not a spec MUST) — kept enabled here (severity downgraded to warning, not removed from the preset) so existing markuplint:html-standard users keep this coverage.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
64
|
+
[Require `doctype`](https://html.spec.whatwg.org/multipage/syntax.html#syntax-doctype)|It has the effect of avoiding quirks mode. The group name is kept as `doctype` for backward compatibility.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
65
|
+
[No obsolete doctype](https://html.spec.whatwg.org/multipage/syntax.html#the-doctype)|Authors must not use an obsolete DOCTYPE (a public identifier, or a system identifier other than the one legacy-string exception the spec still permits).|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
55
66
|
Must not skip heading levels| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
56
67
|
[No duplicate autofocus](https://html.spec.whatwg.org/multipage/interaction.html#the-autofocus-attribute)|There must not be two elements with the autofocus attribute specified in the same document.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
57
68
|
[No duplicate visible main](https://html.spec.whatwg.org/multipage/grouping-content.html#the-main-element)|There must not be more than one visible main element in a document.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
58
|
-
No
|
|
59
|
-
[No duplicate names in `<dl>`](https://html.spec.whatwg.org/multipage/grouping-content.html#the-dl-element:~:text=Within%20a%20single%20dl%20element%2C%20there%20should%20not%20be%20more%20than%20one%20dt%20element%20for%20each%20name)|Within a single dl element, there should not be more than one dt element for each name.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
69
|
+
[No invalid attr](https://html.spec.whatwg.org/multipage/dom.html#attributes)|Each element's attribute names and values must conform to the HTML specification.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
60
70
|
No use **orphaned end tag**| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
71
|
+
No **stray head or body tag**| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
72
|
+
No **content after body**| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
73
|
+
No **unclosed element at EOF**| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
74
|
+
**Meta charset** position within the first 1024 bytes| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
61
75
|
Allow only **permitted contents**| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
76
|
+
No disallowed ancestor|An element must not appear as a descendant of an ancestor its content model forbids (e.g. `<address>` inside `<address>`). Split off from `permitted-contents` — kept as its own named group here so preset users keep this coverage.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
77
|
+
Require ancestor|An element must appear as a descendant of a required ancestor (e.g. `<area>` outside `<map>`). Split off from `permitted-contents` — kept as its own named group here so preset users keep this coverage.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
78
|
+
No duplicate sibling attr|An attribute the content model marks as sibling-unique must not appear on more than one element of the same type within the same parent (e.g. multiple `<track default>`). Split off from `permitted-contents` — kept as its own named group here so preset users keep this coverage.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
62
79
|
Need **placeholder label option**| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
63
80
|
Require the `datetime` attribute if the content of the `time` element is invalid| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
64
81
|
Specify required attr| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
65
|
-
[
|
|
82
|
+
[Validate `<script type="importmap">` body against the import map spec](https://html.spec.whatwg.org/multipage/webappapis.html#parse-an-import-map-string)|Split from the former `script-content` rule (#3989). This group keeps its name — and wraps only this one rule, so a group with 2+ rules doesn't get its virtual rule name suffixed with the base rule name — for anyone overriding it directly. `valid-speculation-rules` lives in its own sibling group below for the same reason.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
83
|
+
[Validate `<script type="speculationrules">` body against the Speculation Rules spec](https://html.spec.whatwg.org/multipage/speculative-loading.html)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
84
|
+
[Require `sizes` wherever `srcset` uses width descriptors, and vice versa](https://html.spec.whatwg.org/multipage/images.html#srcset-attributes)|Split from the former `srcset-sizes-constraint` rule (#3989). This group keeps its name — and wraps only this one rule, so a group with 2+ rules doesn't get its virtual rule name suffixed with the base rule name — for anyone overriding it directly. The other three checks live in their own sibling groups below for the same reason.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
85
|
+
[Disallow mixing width and pixel density descriptors in `srcset`](https://html.spec.whatwg.org/multipage/images.html#srcset-attributes)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
86
|
+
[Require `loading="lazy"` wherever `sizes="auto"` is used](https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
87
|
+
[Require a distinguishing `media` or `type` on a `<source>` with a following srcset-bearing sibling](https://html.spec.whatwg.org/multipage/embedded-content.html#the-source-element)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
66
88
|
[Validate link type keywords](https://html.spec.whatwg.org/multipage/links.html#linkTypes)|Validates that `rel` attribute keywords are allowed on the given element and context (e.g., body-ok for `<link>` inside `<body>`).|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
89
|
+
[Form-associated `form` attribute must reference a form element](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#attr-fae-form)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
90
|
+
[`<input type="file">` value must be empty when specified](https://html.spec.whatwg.org/multipage/input.html#file-upload-state-(type=file))| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
91
|
+
[`<input list>` must reference a `<datalist>` element by ID](https://html.spec.whatwg.org/multipage/input.html#the-list-attribute)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
92
|
+
[`<label for>` must reference a labelable element by ID](https://html.spec.whatwg.org/multipage/forms.html#attr-label-for)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
93
|
+
[`<label>` descendant-control constraints (at most one form-control descendant; none when `for` targets an external labelable element)](https://html.spec.whatwg.org/multipage/forms.html#the-label-element)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
94
|
+
[`<map>` `id` must equal `name` when both are specified](https://html.spec.whatwg.org/multipage/image-maps.html#the-map-element)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
95
|
+
[`<img usemap>` must be a valid hash-name reference to a `<map>` element](https://html.spec.whatwg.org/multipage/image-maps.html#attr-hyperlink-usemap)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
96
|
+
[`<meter>` attribute inequalities (min ≤ value ≤ max etc.)](https://html.spec.whatwg.org/multipage/form-elements.html#the-meter-element)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
97
|
+
[`<progress>` attribute inequalities (value ≤ max; value ≤ 1 when max is absent)](https://html.spec.whatwg.org/multipage/form-elements.html#the-progress-element)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
98
|
+
[Single `<select>` allows at most one selected `<option>`](https://html.spec.whatwg.org/multipage/form-elements.html#the-select-element)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
99
|
+
[Every `itemprop` belongs to an `itemscope`d item](https://html.spec.whatwg.org/multipage/microdata.html#associating-names-with-items)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
67
100
|
[Specify `charset=UTF-8`](https://html.spec.whatwg.org/multipage/semantics.html#charset)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
68
101
|
[No duplicate meta charset](https://html.spec.whatwg.org/multipage/semantics.html#attr-meta-charset)|There must not be more than one meta element with a charset attribute per document.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
69
102
|
[No duplicate meta description](https://html.spec.whatwg.org/multipage/semantics.html#standard-metadata-names)|There must not be more than one meta element where the name attribute value is an ASCII case-insensitive match for "description" per document.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
70
103
|
[No coexistence of meta charset and meta http-equiv content-type](https://html.spec.whatwg.org/multipage/semantics.html#attr-meta-charset)|A document must not contain both a meta element with an http-equiv attribute in the Encoding declaration state and a meta element with the charset attribute.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
104
|
+
[`<base>` must precede `<link>` and `<script>`](https://html.spec.whatwg.org/multipage/semantics.html#the-base-element)|A base element must come before any other elements in the tree that have attributes defined as taking URLs, except the html element. In `<head>`, the URL-taking elements are `<link>` (href, imagesrcset) and `<script>` (src); a `<base>` that follows either shadows its own effect on those references.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
71
105
|
[No use `<small>` as **subheadings**](https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-small-element)|The small element must not be used for subheadings.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
72
106
|
[No use `<caption>` within `<figure>`](https://html.spec.whatwg.org/multipage/tables.html#the-caption-element)|When `<table>` is the only content in `<figure>` other than `<figcaption>`, `<caption>` should be omitted in favor of `<figcaption>`.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
73
107
|
[Require `title` attr in `<input pattern>`](https://html.spec.whatwg.org/multipage/input.html#attr-input-pattern)|When an `<input>` element has a `pattern` attribute specified, authors should include a `title` attribute to give a description of the pattern.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
74
108
|
No nested same `<details>` name group|A document must not contain a details element that is a descendant of another details element in the same details name group.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
75
109
|
[No use `shortcut` keyword in `<link rel>`](https://html.spec.whatwg.org/multipage/links.html#rel-shortcut-icon)|For historical reasons, the icon keyword may be preceded by the keyword "shortcut". However, pages should not use the keyword "shortcut" as it is unnecessary.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
|
|
110
|
+
Require conventional **`<head>` element order**|A consistent order (charset, viewport, title, then the rest) lets the browser start rendering sooner instead of re-parsing metadata.|✅|✅|✅|✅|✅|❌|❌|❌|❌|✅|❌|❌|
|
|
111
|
+
[Require **matching aspect-ratio** attributes](https://html.spec.whatwg.org/multipage/embedded-content-other.html#dimension-attributes)|`width`/`height` that mismatch the image's actual aspect ratio still cause a layout shift once the image loads, defeating the point of setting them.|✅|✅|✅|✅|✅|❌|❌|❌|❌|✅|❌|❌|
|
|
76
112
|
[Require `charset=UTF-8`](https://html.spec.whatwg.org/multipage/semantics.html#charset)| |✅|✅|✅|✅|✅|❌|❌|❌|❌|✅|❌|❌|
|
|
77
113
|
Require `defer` attr|Should load and parse scripts lazily to avoid render-blocking.|✅|✅|✅|✅|✅|❌|❌|❌|❌|✅|❌|❌|
|
|
78
114
|
Require **aspect-ratio**|Require `width` and `height` attr with `<img>` to avoid **Cumulative Layout Shift**|✅|✅|✅|✅|✅|❌|❌|❌|❌|✅|❌|❌|
|
|
79
115
|
Require loading `<iframe>` lazily|Require `loading=lazy` with `<iframe>` to avoid render-blocking that causes loading if its element is out of the viewport.|✅|✅|✅|✅|✅|❌|❌|❌|❌|✅|❌|❌|
|
|
80
116
|
Allow `property` attr with `<meta>`|Be able to use **Open-Graph** etc.|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|✅|❌|
|
|
81
117
|
No hard coding **ID**|The component that hard-coded ID cannot mount to an app duplicated because the IDs must be unique in a document. Recommend to specify dynamic IDs to avoid doing that.|❌|✅|✅|❌|✅|❌|❌|❌|❌|❌|❌|❌|
|
|
82
|
-
Use [**
|
|
118
|
+
Use [**no-unescaped-char**](https://markuplint.dev/docs/rules/no-unescaped-char)|Warns when a literal `<` (the one character HTML LS always prohibits unescaped) appears in a text node or attribute value. The group name is kept as `character-reference` for backward compatibility.|❌|❌|❌|✅|❌|❌|❌|❌|❌|❌|❌|❌|
|
|
119
|
+
Use [**no-malformed-character-reference**](https://markuplint.dev/docs/rules/no-malformed-character-reference)|Warns when a `&...;`-shaped character reference is malformed (unknown name, missing semicolon, or a NULL/surrogate/control/ noncharacter/out-of-range numeric reference).|❌|❌|❌|✅|❌|❌|❌|❌|❌|❌|❌|❌|
|
|
83
120
|
No omit **end-tag**|Recommend to write an end-tag always because it is too difficult for a human decide an element is end-tag omittable.|❌|❌|❌|✅|❌|❌|❌|❌|❌|❌|❌|❌|
|
|
121
|
+
Disallow inline **event handler attributes**|Inline event handlers (`onclick`, `onerror`, etc.) execute arbitrary script from markup, which is a common XSS injection vector.|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|✅|
|
|
84
122
|
|
|
85
123
|
## Install
|
|
86
124
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@markuplint/config-presets",
|
|
3
|
-
"version": "5.0.0-rc.
|
|
3
|
+
"version": "5.0.0-rc.5",
|
|
4
4
|
"description": "markuplint config presets",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"author": "Yusuke Hirao <yusukehirao@me.com>",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"engines": {
|
|
13
|
-
"node": ">=
|
|
13
|
+
"node": ">=24"
|
|
14
14
|
},
|
|
15
15
|
"publishConfig": {
|
|
16
16
|
"access": "public"
|
|
@@ -20,9 +20,10 @@
|
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@isaacs/brace-expansion": "5.0.1",
|
|
23
|
+
"@markuplint/rules": "5.0.0-rc.5",
|
|
23
24
|
"glob": "13.0.6",
|
|
24
25
|
"jsonc-parser": "3.3.1",
|
|
25
26
|
"mustache": "4.2.0"
|
|
26
27
|
},
|
|
27
|
-
"gitHead": "
|
|
28
|
+
"gitHead": "8d87463af2ff3f1b83fb28da20f1819362cf3555"
|
|
28
29
|
}
|
package/preset.a11y.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"rules":{"a11y/id-duplication":{"specConformance":"normative","rules":{"id
|
|
1
|
+
{"rules":{"a11y/id-duplication":{"specConformance":"normative","rules":{"no-duplicate-id":true}},"a11y/no-accesskey":{"specConformance":"non-normative","rules":{"no-restricted-attr":{"options":{"disallowAttrs":["accesskey"]}}}},"a11y/label-has-control":{"specConformance":"non-normative","rules":{"label-has-control":true}},"a11y/landmark-roles":{"specConformance":"non-normative","rules":{"no-nested-top-level-landmark":true}},"a11y/require-landmark-label":{"specConformance":"non-normative","rules":{"require-landmark-label":true}},"a11y/neighbor-popovers":{"specConformance":"non-normative","rules":{"require-adjacent-popover":true}},"a11y/no-ambiguous-navigable-target-names":{"specConformance":"non-normative","rules":{"no-ambiguous-navigable-target-names":true}},"a11y/no-consecutive-br":{"specConformance":"non-normative","rules":{"no-consecutive-br":true}},"a11y/no-refer-to-non-existent-id":{"specConformance":"normative","rules":{"no-refer-to-non-existent-id":true}},"a11y/no-broken-fragment-link":{"specConformance":"non-normative","rules":{"no-broken-fragment-link":true}},"a11y/redundant-accessible-name":{"specConformance":"non-normative","rules":{"no-redundant-accessible-name":true}},"a11y/require-accessible-name":{"specConformance":"non-normative","rules":{"require-accessible-name":true}},"a11y/require-dialog-autofocus":{"specConformance":"non-normative","rules":{"require-dialog-autofocus":true}},"a11y/required-h1":{"specConformance":"non-normative","rules":{"require-h1":true}},"a11y/no-duplicate-h1":{"specConformance":"non-normative","rules":{"no-duplicate-h1":true}},"a11y/table-row-column-alignment":{"specConformance":"non-normative","rules":{"consistent-table-row-length":true}},"a11y/no-table-cell-overlap":{"specConformance":"normative","rules":{"no-table-cell-overlap":true}},"a11y/no-table-span-overflow":{"specConformance":"normative","rules":{"no-table-span-overflow":true}},"a11y/no-empty-table-track":{"specConformance":"normative","rules":{"no-empty-table-track":true}},"a11y/use-list":{"specConformance":"non-normative","rules":{"no-pseudo-list":true}},"a11y/wai-aria/unsupported-element":{"specConformance":"normative","rules":{"no-aria-on-unsupported-element":true}},"a11y/wai-aria/non-existent-role":{"specConformance":"normative","rules":{"no-unknown-role":true}},"a11y/wai-aria/abstract-role":{"specConformance":"normative","rules":{"no-abstract-role":true}},"a11y/wai-aria/permitted-roles":{"specConformance":"normative","rules":{"permitted-roles":true}},"a11y/wai-aria/implicit-role":{"specConformance":"non-normative","severity":"warning","rules":{"no-redundant-role":true}},"a11y/wai-aria/implicit-props":{"specConformance":"non-normative","severity":"warning","rules":{"no-redundant-aria-prop":true}},"a11y/wai-aria/contradictory-props":{"specConformance":"normative","rules":{"no-contradictory-aria-prop":true}},"a11y/wai-aria/required-props":{"specConformance":"normative","rules":{"require-aria-prop":true}},"a11y/wai-aria/disallowed-props":{"specConformance":"normative","rules":{"role-supports-aria-prop":true}},"a11y/wai-aria/prohibited-naming":{"specConformance":"normative","rules":{"no-prohibited-naming":true}},"a11y/wai-aria/element-supports-aria-prop":{"specConformance":"normative","rules":{"element-supports-aria-prop":true}},"a11y/wai-aria/deprecated-role":{"specConformance":"non-normative","severity":"warning","rules":{"no-deprecated-role":true}},"a11y/wai-aria/deprecated-props":{"specConformance":"non-normative","severity":"warning","rules":{"no-deprecated-aria-prop":true}},"a11y/wai-aria/value":{"specConformance":"normative","rules":{"no-invalid-aria-prop-value":true}},"a11y/wai-aria/required-owned-elements":{"specConformance":"normative","severity":"warning","rules":{"require-owned-elements":true}},"a11y/wai-aria/required-parent-role":{"specConformance":"normative","rules":{"require-parent-role":true}},"a11y/wai-aria/tab-requires-tabpanel":{"specConformance":"normative","rules":{"tab-requires-tabpanel":true}},"a11y/wai-aria/presentational-children":{"specConformance":"non-normative","severity":"warning","rules":{"no-aria-on-presentational-children":true}},"a11y/wai-aria/no-global-prop":{"specConformance":"normative","rules":{"aria-prop-requires-role":true}},"a11y/wai-aria/default-value":{"specConformance":"non-normative","severity":"warning","rules":{"no-default-aria-value":true}},"a11y/wai-aria/interaction-in-hidden":{"specConformance":"non-normative","severity":"warning","rules":{"no-focusable-in-aria-hidden":true}}},"nodeRules":[{"name":"a11y/html-lang","specConformance":"non-normative","selector":":where(html)","rules":{"require-attr":["lang"]}},{"name":"a11y/abbr-title","specConformance":"non-normative","selector":":where(abbr)","rules":{"require-attr":["title"]}},{"name":"a11y/media-track","specConformance":"non-normative","selector":":where(video, audio)","rules":{"require-element":["track"]}},{"name":"a11y/video-autoplay-muted","specConformance":"non-normative","selector":":where(video[autoplay])","rules":{"require-attr":["muted"]}},{"name":"a11y/no-merge-cells","specConformance":"non-normative","selector":":where(th, td)","rules":{"no-restricted-attr":{"options":{"disallowAttrs":["colspan","rowspan"]}}}},{"name":"a11y/summary-no-interactive","specConformance":"non-normative","selector":":where(summary)","rules":{"no-restricted-element":[":model(interactive)"]}},{"name":"a11y/no-autofocus-outside-dialog","specConformance":"non-normative","selector":":where(:not(dialog, dialog *))","rules":{"no-restricted-attr":{"options":{"disallowAttrs":["autofocus"]}}}},{"name":"a11y/tabindex-restrict","specConformance":"non-normative","selector":":where(:not(dialog))","rules":{"no-restricted-attr":{"options":{"disallowAttrs":[{"name":"tabindex","value":{"pattern":"/^(?!-1$|0$).*$/"}}]}}}},{"name":"a11y/viewport-no-user-scalable","specConformance":"non-normative","selector":":where(meta[name='viewport' i])","rules":{"no-restricted-attr":{"options":{"disallowAttrs":[{"name":"content","value":{"pattern":"/user-scalable\\s*=\\s*(no|0)\\b/i"}}]}}}}]}
|
package/preset.code-styles.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{}
|
|
1
|
+
{"rules":{"code-styles/case-sensitive-attr-name":{"specConformance":"non-normative","rules":{"case-sensitive-attr-name":true}},"code-styles/case-sensitive-tag-name":{"specConformance":"non-normative","rules":{"case-sensitive-tag-name":true}}}}
|
package/preset.compat.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"rules":{"no-unsupported-features":
|
|
1
|
+
{"rules":{"no-unsupported-browser-features":true,"no-nonstandard-features":true}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"rules":{"html-standard/attr-duplication":{"specConformance":"normative","rules":{"attr-
|
|
1
|
+
{"rules":{"html-standard/attr-duplication":{"specConformance":"normative","rules":{"no-duplicate-attr":true}},"html-standard/deprecated-attr":{"specConformance":"normative","rules":{"no-obsolete-attr":true}},"html-standard/no-deprecated-attr":{"specConformance":"non-normative","rules":{"no-deprecated-attr":true}},"html-standard/deprecated-element":{"specConformance":"normative","rules":{"no-obsolete-element":true}},"html-standard/no-deprecated-element":{"specConformance":"non-normative","rules":{"no-deprecated-element":true}},"html-standard/doctype":{"specConformance":"normative","rules":{"require-doctype":true}},"html-standard/no-obsolete-doctype":{"specConformance":"normative","rules":{"no-obsolete-doctype":true}},"html-standard/heading-levels":{"specConformance":"non-normative","rules":{"no-skipped-heading-level":true}},"html-standard/id-duplication":{"specConformance":"normative","rules":{"no-duplicate-id":true}},"html-standard/no-duplicate-autofocus":{"specConformance":"normative","rules":{"no-duplicate-autofocus":true}},"html-standard/no-duplicate-visible-main":{"specConformance":"normative","rules":{"no-duplicate-visible-main":true}},"no-unknown-attr":true,"no-disallowed-attr":true,"no-invalid-attr-value":true,"html-standard/no-refer-to-non-existent-id":{"specConformance":"normative","rules":{"no-refer-to-non-existent-id":true}},"html-standard/no-orphaned-end-tag":{"specConformance":"normative","rules":{"no-orphaned-end-tag":true}},"html-standard/no-stray-head-or-body-tag":{"specConformance":"normative","rules":{"no-stray-head-or-body-tag":true}},"html-standard/no-content-after-body":{"specConformance":"normative","rules":{"no-content-after-body":true}},"html-standard/no-unclosed-element-at-eof":{"specConformance":"normative","rules":{"no-unclosed-element-at-eof":true}},"html-standard/meta-charset-position":{"specConformance":"normative","rules":{"meta-charset-position":true}},"html-standard/permitted-contents":{"specConformance":"normative","rules":{"permitted-contents":true}},"html-standard/no-disallowed-ancestor":{"specConformance":"normative","rules":{"no-disallowed-ancestor":true}},"html-standard/require-ancestor":{"specConformance":"normative","rules":{"require-ancestor":true}},"html-standard/no-duplicate-sibling-attr":{"specConformance":"normative","rules":{"no-duplicate-sibling-attr":true}},"html-standard/placeholder-label-option":{"specConformance":"normative","rules":{"placeholder-label-option":true}},"html-standard/require-datetime":{"specConformance":"normative","rules":{"require-datetime":true}},"html-standard/required-attr":{"specConformance":"normative","rules":{"require-attr":true}},"html-standard/script-content":{"specConformance":"normative","rules":{"valid-importmap":true}},"html-standard/valid-speculation-rules":{"specConformance":"normative","rules":{"valid-speculation-rules":true}},"html-standard/srcset-sizes-constraint":{"specConformance":"normative","rules":{"no-unpaired-srcset-sizes":true}},"html-standard/no-mixed-srcset-descriptors":{"specConformance":"normative","rules":{"no-mixed-srcset-descriptors":true}},"html-standard/sizes-auto-requires-lazy-loading":{"specConformance":"normative","rules":{"sizes-auto-requires-lazy-loading":true}},"html-standard/no-always-matching-source":{"specConformance":"normative","rules":{"no-always-matching-source":true}},"html-standard/link-types":{"specConformance":"normative","rules":{"link-types":true}},"html-standard/form-attr-references-form":{"specConformance":"normative","rules":{"form-attr-references-form":true}},"html-standard/input-file-empty-value":{"specConformance":"normative","rules":{"no-input-file-value":true}},"html-standard/input-list-references-datalist":{"specConformance":"normative","rules":{"input-list-references-datalist":true}},"html-standard/label-for-references-labelable":{"specConformance":"normative","rules":{"label-for-references-labelable":true}},"html-standard/label-no-multiple-controls":{"specConformance":"normative","rules":{"label-no-multiple-controls":true}},"html-standard/map-id-name-match":{"specConformance":"normative","rules":{"map-id-name-match":true}},"html-standard/usemap-references-map":{"specConformance":"normative","rules":{"usemap-references-map":true}},"html-standard/meter-value-bounds":{"specConformance":"normative","rules":{"meter-value-bounds":true}},"html-standard/progress-value-bounds":{"specConformance":"normative","rules":{"progress-value-bounds":true}},"html-standard/no-extra-selected-options":{"specConformance":"normative","rules":{"no-extra-selected-options":true}},"html-standard/itemprop-requires-itemscope":{"specConformance":"normative","rules":{"itemprop-requires-itemscope":true}}},"nodeRules":[{"name":"html-standard/head-charset-utf8","specConformance":"normative","selector":":where(head)","rules":{"require-element":["meta[charset=\"UTF-8\" i]"]}},{"name":"html-standard/no-duplicate-charset","specConformance":"normative","selector":":where(head)","rules":{"no-restricted-element":{"value":["meta[charset] ~ meta[charset]"],"reason":"There must not be more than one meta element with a charset attribute per document. https://html.spec.whatwg.org/multipage/semantics.html#attr-meta-charset","reasonOnly":true}}},{"name":"html-standard/no-duplicate-description","specConformance":"normative","selector":":where(head)","rules":{"no-restricted-element":{"value":["meta[name=\"description\" i] ~ meta[name=\"description\" i]"],"reason":"There must not be more than one meta element where the name attribute value is an ASCII case-insensitive match for \"description\" per document. https://html.spec.whatwg.org/multipage/semantics.html#standard-metadata-names","reasonOnly":true}}},{"name":"html-standard/no-charset-http-equiv-coexist","specConformance":"normative","selector":":where(head)","rules":{"no-restricted-element":{"value":["meta[charset] ~ meta[http-equiv=\"content-type\" i]","meta[http-equiv=\"content-type\" i] ~ meta[charset]"],"reason":"A document must not contain both a meta element with an http-equiv attribute in the Encoding declaration state and a meta element with the charset attribute. https://html.spec.whatwg.org/multipage/semantics.html#attr-meta-charset","reasonOnly":true}}},{"name":"html-standard/no-base-after-link-or-script","specConformance":"normative","selector":":where(head)","rules":{"no-restricted-element":{"value":[":is(link, script) ~ base"],"reason":"A base element must come before any other elements in the tree that have attributes defined as taking URLs, except the html element. https://html.spec.whatwg.org/multipage/semantics.html#the-base-element","reasonOnly":true}}},{"name":"html-standard/no-small-in-heading","specConformance":"normative","selector":"h1, h2, h3, h4, h5, h6","rules":{"no-restricted-element":{"value":["small"],"reason":"The small element must not be used for subheadings. https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-small-element"}}},{"name":"html-standard/figure-no-caption","specConformance":"non-normative","selector":":where(figcaption ~ table, table:has(~ figcaption))","rules":{"no-restricted-element":{"value":["caption"],"reason":"When a table element is the only content in a figure element other than the figcaption, the caption element should be omitted in favor of the figcaption. (https://html.spec.whatwg.org/multipage/tables.html#the-caption-element)"},"require-accessible-name":false}},{"name":"html-standard/input-pattern-title","specConformance":"non-normative","selector":":where(input[pattern])","rules":{"require-attr":{"value":[{"name":"title"}]}}},{"name":"html-standard/no-nested-details-name","specConformance":"normative","regexSelector":{"nodeName":"details","attrName":"name","attrValue":"^(?<value>.+)$","combination":{"combinator":" ","nodeName":"details"}},"rules":{"no-restricted-attr":{"options":{"disallowAttrs":[{"name":"name","value":{"pattern":"{{ value }}"}}]},"reason":"A document must not contain a details element that is a descendant of another details element in the same details name group."}}},{"name":"html-standard/no-shortcut-icon","specConformance":"non-normative","selector":"link","rules":{"no-restricted-attr":{"options":{"disallowAttrs":[{"name":"rel","value":{"pattern":"/\\bshortcut\\b/i"}}]},"reason":"The \"shortcut\" keyword is unnecessary. Use rel=\"icon\" instead. https://html.spec.whatwg.org/multipage/links.html#rel-shortcut-icon"}}}]}
|
package/preset.performance.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"nodeRules":[{"name":"performance/head-charset-utf8","specConformance":"normative","selector":":where(head)","rules":{"
|
|
1
|
+
{"rules":{"performance/head-element-order":{"specConformance":"non-normative","rules":{"head-element-order":true}},"performance/no-mismatched-aspect-ratio":{"specConformance":"normative","rules":{"no-mismatched-aspect-ratio":true}}},"nodeRules":[{"name":"performance/head-charset-utf8","specConformance":"normative","selector":":where(head)","rules":{"require-element":["meta[charset=\"UTF-8\" i]"]}},{"name":"performance/script-defer","specConformance":"non-normative","selector":":where(script[src]:not([type=module]))","rules":{"require-attr":["defer"]}},{"name":"performance/img-aspect-ratio","specConformance":"non-normative","selector":":where(img[src])","rules":{"require-attr":["width","height"]}},{"name":"performance/iframe-lazy-loading","specConformance":"non-normative","selector":":where(iframe)","rules":{"require-attr":["title",{"name":"loading","value":"lazy"}]}}]}
|
package/preset.rdfa.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"nodeRules":[{"
|
|
1
|
+
{"nodeRules":[{"selector":":where(meta[property])","rules":{"no-unknown-attr":{"options":{"allowAttrs":[{"name":"property","value":"NoEmptyAny"},{"name":"content","value":"NoEmptyAny"}]}},"no-disallowed-attr":{"options":{"allowAttrs":[{"name":"property","value":"NoEmptyAny"},{"name":"content","value":"NoEmptyAny"}]}},"no-invalid-attr-value":{"options":{"allowAttrs":[{"name":"property","value":"NoEmptyAny"},{"name":"content","value":"NoEmptyAny"}]}},"require-attr":false}}]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"extends":["markuplint:code-styles","markuplint:html-standard","markuplint:a11y","markuplint:performance","markuplint:security","markuplint:rdfa"],"rules":{"react/no-hard-code-id":{"rules":{"no-
|
|
1
|
+
{"extends":["markuplint:code-styles","markuplint:html-standard","markuplint:a11y","markuplint:performance","markuplint:security","markuplint:rdfa"],"rules":{"react/no-hard-code-id":{"rules":{"no-hardcoded-id":true}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"extends":["markuplint:code-styles","markuplint:html-standard","markuplint:a11y","markuplint:performance","markuplint:security","markuplint:rdfa"],"rules":{"static-html/character-reference":{"specConformance":"normative","rules":{"character-reference":true}},"static-html/end-tag":{"specConformance":"non-normative","rules":{"end-tag":true}}}}
|
|
1
|
+
{"extends":["markuplint:code-styles","markuplint:html-standard","markuplint:a11y","markuplint:performance","markuplint:security","markuplint:rdfa"],"rules":{"static-html/character-reference":{"specConformance":"normative","rules":{"no-unescaped-char":true}},"static-html/no-malformed-character-reference":{"specConformance":"normative","rules":{"no-malformed-character-reference":true}},"static-html/end-tag":{"specConformance":"non-normative","rules":{"require-end-tag":true}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"extends":["markuplint:code-styles","markuplint:html-standard","markuplint:a11y","markuplint:performance","markuplint:security","markuplint:rdfa"],"rules":{"svelte/no-hard-code-id":{"rules":{"no-
|
|
1
|
+
{"extends":["markuplint:code-styles","markuplint:html-standard","markuplint:a11y","markuplint:performance","markuplint:security","markuplint:rdfa"],"rules":{"svelte/no-hard-code-id":{"rules":{"no-hardcoded-id":true}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"extends":["markuplint:code-styles","markuplint:html-standard","markuplint:a11y","markuplint:performance","markuplint:security","markuplint:rdfa"],"rules":{"vue/no-hard-code-id":{"rules":{"no-
|
|
1
|
+
{"extends":["markuplint:code-styles","markuplint:html-standard","markuplint:a11y","markuplint:performance","markuplint:security","markuplint:rdfa"],"rules":{"vue/no-hard-code-id":{"rules":{"no-hardcoded-id":true}}}}
|
package/preset.security.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{}
|
|
1
|
+
{"rules":{"security/no-event-handler-attr":{"specConformance":"non-normative","rules":{"no-event-handler-attr":true}}}}
|