@markuplint/config-presets
v5.0.0
Published
markuplint config presets
Readme
@markuplint/config-presets
Usage
To the extends property of the configuration, specify like below:
{
"extends": ["markuplint:recommended"]
}You can choose some presets appropriately for your preference.
{
"extends": ["markuplint:html-standard", "markuplint:a11y"]
}Ruleset Mapping
Ruleset|Description|recommended|recommended-vue|recommended-svelte|recommended-static-html|recommended-react|a11y|code-styles|compat|html-standard|performance|rdfa|security|
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Must not duplicate ID|Be able to avoid problems in assistive technologies from the viewpoint of machine readability.|✅|✅|✅|✅|✅|✅|❌|❌|✅|❌|❌|❌|
Disallow accesskey attr| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
<label> should have control| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
Use landmark|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.|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
Require a unique label for duplicated landmarks|Split from the former landmark-roles rule (#3989).|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
Popover trigger and target must be adjacent| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
No ambiguous Navigable Target Names| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
No consecutive <br>| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
No refer to no existent ID| |✅|✅|✅|✅|✅|✅|❌|❌|✅|❌|❌|❌|
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.|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
No redundant accessible name sources| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
Require accessible name| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
Require autofocus in modal dialogs| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
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.|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
No duplicate <h1>| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
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.|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
No overlapping table cells| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
No table cell span reaching past its row group| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
No table row or column with no cell anchored to it| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
Use <ul>| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
Conform to WAI-ARIA| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
Require <html lang>| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
Require <abbr title>| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
Require <track> in media elements| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
Require <video muted> when autoplay is set| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
No merge cells| |✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
<summary> must not contain interactive contents|There is a case where an assistive technology can't access contents, or contents don't propagate a mouse event to <summary>.|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
Disallow autofocus attr outside dialog scope|Don't take away focus by force. The dialog element and its descendants are excepted.|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
tabindex attr only -1 or 0|Scoped to non-dialog elements because the HTML spec disallows tabindex on <dialog> (noUse).|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
Disallow user-scalable=no in viewport meta|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.|✅|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|
Consistent attribute name casing|HTML permits any mix of ASCII upper/lower case in attribute names; this is a style preference, not a spec requirement.|✅|✅|✅|✅|✅|❌|✅|❌|❌|❌|❌|❌|
Consistent tag name casing|HTML permits any mix of ASCII upper/lower case in tag names; this is a style preference, not a spec requirement.|✅|✅|✅|✅|✅|❌|✅|❌|❌|❌|❌|❌|
No duplicate attr|The parser ignores all such duplicate occurrences of the attribute.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No obsolete attr|Authors must not use attributes the spec has removed entirely. The group name is kept as deprecated-attr for backward compatibility.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
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.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No obsolete element|Authors must not use elements the spec has removed entirely. The group name is kept as deprecated-element for backward compatibility.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
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.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Require doctype|It has the effect of avoiding quirks mode. The group name is kept as doctype for backward compatibility.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No obsolete 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).|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Must not skip heading levels| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No duplicate autofocus|There must not be two elements with the autofocus attribute specified in the same document.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No duplicate visible main|There must not be more than one visible main element in a document.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No invalid attr|Each element's attribute names and values must conform to the HTML specification.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No use orphaned end tag| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No stray head or body tag| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No content after body| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No unclosed element at EOF| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Meta charset position within the first 1024 bytes| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Allow only permitted contents| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
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.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
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.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
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.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Need placeholder label option| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Require the datetime attribute if the content of the time element is invalid| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Specify required attr| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Validate <script type="importmap"> body against the import map spec|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.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Validate <script type="speculationrules"> body against the Speculation Rules spec| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Require sizes wherever srcset uses width descriptors, and vice versa|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.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Disallow mixing width and pixel density descriptors in srcset| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Require loading="lazy" wherever sizes="auto" is used| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Require a distinguishing media or type on a <source> with a following srcset-bearing sibling| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Validate link type keywords|Validates that rel attribute keywords are allowed on the given element and context (e.g., body-ok for <link> inside <body>).|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Form-associated form attribute must reference a form element| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
<input type="file"> value must be empty when specified| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
<input list> must reference a <datalist> element by ID| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
<label for> must reference a labelable element by ID| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
<label> descendant-control constraints (at most one form-control descendant; none when for targets an external labelable element)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
<map> id must equal name when both are specified| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
<img usemap> must be a valid hash-name reference to a <map> element| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
<meter> attribute inequalities (min ≤ value ≤ max etc.)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
<progress> attribute inequalities (value ≤ max; value ≤ 1 when max is absent)| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Single <select> allows at most one selected <option>| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Every itemprop belongs to an itemscoped item| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Specify charset=UTF-8| |✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No duplicate meta charset|There must not be more than one meta element with a charset attribute per document.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No duplicate meta description|There must not be more than one meta element where the name attribute value is an ASCII case-insensitive match for "description" per document.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No coexistence of meta charset and meta http-equiv content-type|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.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
<base> must precede <link> and <script>|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.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No use <small> as subheadings|The small element must not be used for subheadings.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No use <caption> within <figure>|When <table> is the only content in <figure> other than <figcaption>, <caption> should be omitted in favor of <figcaption>.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
Require title attr in <input pattern>|When an <input> element has a pattern attribute specified, authors should include a title attribute to give a description of the pattern.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
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.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
No use shortcut keyword in <link rel>|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.|✅|✅|✅|✅|✅|❌|❌|❌|✅|❌|❌|❌|
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.|✅|✅|✅|✅|✅|❌|❌|❌|❌|✅|❌|❌|
Require matching aspect-ratio 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.|✅|✅|✅|✅|✅|❌|❌|❌|❌|✅|❌|❌|
Require charset=UTF-8| |✅|✅|✅|✅|✅|❌|❌|❌|❌|✅|❌|❌|
Require defer attr|Should load and parse scripts lazily to avoid render-blocking.|✅|✅|✅|✅|✅|❌|❌|❌|❌|✅|❌|❌|
Require aspect-ratio|Require width and height attr with <img> to avoid Cumulative Layout Shift|✅|✅|✅|✅|✅|❌|❌|❌|❌|✅|❌|❌|
Require loading <iframe> lazily|Require loading=lazy with <iframe> to avoid render-blocking that causes loading if its element is out of the viewport.|✅|✅|✅|✅|✅|❌|❌|❌|❌|✅|❌|❌|
Allow property attr with <meta>|Be able to use Open-Graph etc.|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|✅|❌|
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.|❌|✅|✅|❌|✅|❌|❌|❌|❌|❌|❌|❌|
Use 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.|❌|❌|❌|✅|❌|❌|❌|❌|❌|❌|❌|❌|
Use 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).|❌|❌|❌|✅|❌|❌|❌|❌|❌|❌|❌|❌|
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.|❌|❌|❌|✅|❌|❌|❌|❌|❌|❌|❌|❌|
Disallow inline event handler attributes|Inline event handlers (onclick, onerror, etc.) execute arbitrary script from markup, which is a common XSS injection vector.|✅|✅|✅|✅|✅|❌|❌|❌|❌|❌|❌|✅|
Install
markuplint package includes this package.
$ npm install @markuplint/config-presets
$ yarn add @markuplint/config-presets