wip
Some checks failed
Checkers / linkcheck (push) Has been cancelled
Checkers / spellcheck (push) Has been cancelled
CI / build (20, macos-latest) (push) Has been cancelled
CI / build (20, ubuntu-latest) (push) Has been cancelled
CI / build (20, windows-latest) (push) Has been cancelled
CI / build (22, macos-latest) (push) Has been cancelled
CI / build (22, ubuntu-latest) (push) Has been cancelled
CI / build (22, windows-latest) (push) Has been cancelled
CI / build (24, macos-latest) (push) Has been cancelled
CI / build (24, ubuntu-latest) (push) Has been cancelled
CI / build (24, windows-latest) (push) Has been cancelled
CI / pnpm (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
TestRepos / build (latest, ubuntu-latest) (push) Has been cancelled
UpdateTestRepos / update (push) Has been cancelled

This commit is contained in:
David Anson 2025-09-13 17:00:37 -07:00
parent 9065f74bb8
commit e857672728
6 changed files with 1312 additions and 129 deletions

View file

@ -13,7 +13,7 @@ export interface ConfigurationStrict {
/** /**
* Default state for all rules * Default state for all rules
*/ */
default?: boolean; default?: boolean | "error";
/** /**
* Path to configuration file to extend * Path to configuration file to extend
*/ */
@ -23,6 +23,7 @@ export interface ConfigurationStrict {
*/ */
MD001?: MD001?:
| boolean | boolean
| "error"
| { | {
/** /**
* RegExp for matching title in front matter * RegExp for matching title in front matter
@ -34,6 +35,7 @@ export interface ConfigurationStrict {
*/ */
"heading-increment"?: "heading-increment"?:
| boolean | boolean
| "error"
| { | {
/** /**
* RegExp for matching title in front matter * RegExp for matching title in front matter
@ -45,6 +47,7 @@ export interface ConfigurationStrict {
*/ */
MD003?: MD003?:
| boolean | boolean
| "error"
| { | {
/** /**
* Heading style * Heading style
@ -56,6 +59,7 @@ export interface ConfigurationStrict {
*/ */
"heading-style"?: "heading-style"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Heading style * Heading style
@ -67,6 +71,7 @@ export interface ConfigurationStrict {
*/ */
MD004?: MD004?:
| boolean | boolean
| "error"
| { | {
/** /**
* List style * List style
@ -78,6 +83,7 @@ export interface ConfigurationStrict {
*/ */
"ul-style"?: "ul-style"?:
| boolean | boolean
| "error"
| { | {
/** /**
* List style * List style
@ -87,16 +93,17 @@ export interface ConfigurationStrict {
/** /**
* MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md005.md * MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md005.md
*/ */
MD005?: boolean; MD005?: boolean | "error";
/** /**
* MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md005.md * MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md005.md
*/ */
"list-indent"?: boolean; "list-indent"?: boolean | "error";
/** /**
* MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md007.md * MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md007.md
*/ */
MD007?: MD007?:
| boolean | boolean
| "error"
| { | {
/** /**
* Spaces for indent * Spaces for indent
@ -116,6 +123,7 @@ export interface ConfigurationStrict {
*/ */
"ul-indent"?: "ul-indent"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Spaces for indent * Spaces for indent
@ -135,6 +143,7 @@ export interface ConfigurationStrict {
*/ */
MD009?: MD009?:
| boolean | boolean
| "error"
| { | {
/** /**
* Spaces for line break * Spaces for line break
@ -154,6 +163,7 @@ export interface ConfigurationStrict {
*/ */
"no-trailing-spaces"?: "no-trailing-spaces"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Spaces for line break * Spaces for line break
@ -173,6 +183,7 @@ export interface ConfigurationStrict {
*/ */
MD010?: MD010?:
| boolean | boolean
| "error"
| { | {
/** /**
* Include code blocks * Include code blocks
@ -192,6 +203,7 @@ export interface ConfigurationStrict {
*/ */
"no-hard-tabs"?: "no-hard-tabs"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Include code blocks * Include code blocks
@ -209,16 +221,17 @@ export interface ConfigurationStrict {
/** /**
* MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md011.md * MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md011.md
*/ */
MD011?: boolean; MD011?: boolean | "error";
/** /**
* MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md011.md * MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md011.md
*/ */
"no-reversed-links"?: boolean; "no-reversed-links"?: boolean | "error";
/** /**
* MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md012.md * MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md012.md
*/ */
MD012?: MD012?:
| boolean | boolean
| "error"
| { | {
/** /**
* Consecutive blank lines * Consecutive blank lines
@ -230,6 +243,7 @@ export interface ConfigurationStrict {
*/ */
"no-multiple-blanks"?: "no-multiple-blanks"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Consecutive blank lines * Consecutive blank lines
@ -241,6 +255,7 @@ export interface ConfigurationStrict {
*/ */
MD013?: MD013?:
| boolean | boolean
| "error"
| { | {
/** /**
* Number of characters * Number of characters
@ -280,6 +295,7 @@ export interface ConfigurationStrict {
*/ */
"line-length"?: "line-length"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Number of characters * Number of characters
@ -317,48 +333,49 @@ export interface ConfigurationStrict {
/** /**
* MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md014.md * MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md014.md
*/ */
MD014?: boolean; MD014?: boolean | "error";
/** /**
* MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md014.md * MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md014.md
*/ */
"commands-show-output"?: boolean; "commands-show-output"?: boolean | "error";
/** /**
* MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md018.md * MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md018.md
*/ */
MD018?: boolean; MD018?: boolean | "error";
/** /**
* MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md018.md * MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md018.md
*/ */
"no-missing-space-atx"?: boolean; "no-missing-space-atx"?: boolean | "error";
/** /**
* MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md019.md * MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md019.md
*/ */
MD019?: boolean; MD019?: boolean | "error";
/** /**
* MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md019.md * MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md019.md
*/ */
"no-multiple-space-atx"?: boolean; "no-multiple-space-atx"?: boolean | "error";
/** /**
* MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md020.md * MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md020.md
*/ */
MD020?: boolean; MD020?: boolean | "error";
/** /**
* MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md020.md * MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md020.md
*/ */
"no-missing-space-closed-atx"?: boolean; "no-missing-space-closed-atx"?: boolean | "error";
/** /**
* MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md021.md * MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md021.md
*/ */
MD021?: boolean; MD021?: boolean | "error";
/** /**
* MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md021.md * MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md021.md
*/ */
"no-multiple-space-closed-atx"?: boolean; "no-multiple-space-closed-atx"?: boolean | "error";
/** /**
* MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md022.md * MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md022.md
*/ */
MD022?: MD022?:
| boolean | boolean
| "error"
| { | {
/** /**
* Blank lines above heading * Blank lines above heading
@ -374,6 +391,7 @@ export interface ConfigurationStrict {
*/ */
"blanks-around-headings"?: "blanks-around-headings"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Blank lines above heading * Blank lines above heading
@ -387,16 +405,17 @@ export interface ConfigurationStrict {
/** /**
* MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md023.md * MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md023.md
*/ */
MD023?: boolean; MD023?: boolean | "error";
/** /**
* MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md023.md * MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md023.md
*/ */
"heading-start-left"?: boolean; "heading-start-left"?: boolean | "error";
/** /**
* MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md024.md * MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md024.md
*/ */
MD024?: MD024?:
| boolean | boolean
| "error"
| { | {
/** /**
* Only check sibling headings * Only check sibling headings
@ -408,6 +427,7 @@ export interface ConfigurationStrict {
*/ */
"no-duplicate-heading"?: "no-duplicate-heading"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Only check sibling headings * Only check sibling headings
@ -419,6 +439,7 @@ export interface ConfigurationStrict {
*/ */
MD025?: MD025?:
| boolean | boolean
| "error"
| { | {
/** /**
* RegExp for matching title in front matter * RegExp for matching title in front matter
@ -434,6 +455,7 @@ export interface ConfigurationStrict {
*/ */
"single-title"?: "single-title"?:
| boolean | boolean
| "error"
| { | {
/** /**
* RegExp for matching title in front matter * RegExp for matching title in front matter
@ -449,6 +471,7 @@ export interface ConfigurationStrict {
*/ */
"single-h1"?: "single-h1"?:
| boolean | boolean
| "error"
| { | {
/** /**
* RegExp for matching title in front matter * RegExp for matching title in front matter
@ -464,6 +487,7 @@ export interface ConfigurationStrict {
*/ */
MD026?: MD026?:
| boolean | boolean
| "error"
| { | {
/** /**
* Punctuation characters * Punctuation characters
@ -475,6 +499,7 @@ export interface ConfigurationStrict {
*/ */
"no-trailing-punctuation"?: "no-trailing-punctuation"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Punctuation characters * Punctuation characters
@ -486,6 +511,7 @@ export interface ConfigurationStrict {
*/ */
MD027?: MD027?:
| boolean | boolean
| "error"
| { | {
/** /**
* Include list items * Include list items
@ -497,6 +523,7 @@ export interface ConfigurationStrict {
*/ */
"no-multiple-space-blockquote"?: "no-multiple-space-blockquote"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Include list items * Include list items
@ -506,16 +533,17 @@ export interface ConfigurationStrict {
/** /**
* MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md028.md * MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md028.md
*/ */
MD028?: boolean; MD028?: boolean | "error";
/** /**
* MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md028.md * MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md028.md
*/ */
"no-blanks-blockquote"?: boolean; "no-blanks-blockquote"?: boolean | "error";
/** /**
* MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md029.md * MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md029.md
*/ */
MD029?: MD029?:
| boolean | boolean
| "error"
| { | {
/** /**
* List style * List style
@ -527,6 +555,7 @@ export interface ConfigurationStrict {
*/ */
"ol-prefix"?: "ol-prefix"?:
| boolean | boolean
| "error"
| { | {
/** /**
* List style * List style
@ -538,6 +567,7 @@ export interface ConfigurationStrict {
*/ */
MD030?: MD030?:
| boolean | boolean
| "error"
| { | {
/** /**
* Spaces for single-line unordered list items * Spaces for single-line unordered list items
@ -561,6 +591,7 @@ export interface ConfigurationStrict {
*/ */
"list-marker-space"?: "list-marker-space"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Spaces for single-line unordered list items * Spaces for single-line unordered list items
@ -584,6 +615,7 @@ export interface ConfigurationStrict {
*/ */
MD031?: MD031?:
| boolean | boolean
| "error"
| { | {
/** /**
* Include list items * Include list items
@ -595,6 +627,7 @@ export interface ConfigurationStrict {
*/ */
"blanks-around-fences"?: "blanks-around-fences"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Include list items * Include list items
@ -604,16 +637,17 @@ export interface ConfigurationStrict {
/** /**
* MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md032.md * MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md032.md
*/ */
MD032?: boolean; MD032?: boolean | "error";
/** /**
* MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md032.md * MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md032.md
*/ */
"blanks-around-lists"?: boolean; "blanks-around-lists"?: boolean | "error";
/** /**
* MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md033.md * MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md033.md
*/ */
MD033?: MD033?:
| boolean | boolean
| "error"
| { | {
/** /**
* Allowed elements * Allowed elements
@ -629,6 +663,7 @@ export interface ConfigurationStrict {
*/ */
"no-inline-html"?: "no-inline-html"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Allowed elements * Allowed elements
@ -642,16 +677,17 @@ export interface ConfigurationStrict {
/** /**
* MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md034.md * MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md034.md
*/ */
MD034?: boolean; MD034?: boolean | "error";
/** /**
* MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md034.md * MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md034.md
*/ */
"no-bare-urls"?: boolean; "no-bare-urls"?: boolean | "error";
/** /**
* MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md035.md * MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md035.md
*/ */
MD035?: MD035?:
| boolean | boolean
| "error"
| { | {
/** /**
* Horizontal rule style * Horizontal rule style
@ -663,6 +699,7 @@ export interface ConfigurationStrict {
*/ */
"hr-style"?: "hr-style"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Horizontal rule style * Horizontal rule style
@ -674,6 +711,7 @@ export interface ConfigurationStrict {
*/ */
MD036?: MD036?:
| boolean | boolean
| "error"
| { | {
/** /**
* Punctuation characters * Punctuation characters
@ -685,6 +723,7 @@ export interface ConfigurationStrict {
*/ */
"no-emphasis-as-heading"?: "no-emphasis-as-heading"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Punctuation characters * Punctuation characters
@ -694,32 +733,33 @@ export interface ConfigurationStrict {
/** /**
* MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md037.md * MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md037.md
*/ */
MD037?: boolean; MD037?: boolean | "error";
/** /**
* MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md037.md * MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md037.md
*/ */
"no-space-in-emphasis"?: boolean; "no-space-in-emphasis"?: boolean | "error";
/** /**
* MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md038.md * MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md038.md
*/ */
MD038?: boolean; MD038?: boolean | "error";
/** /**
* MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md038.md * MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md038.md
*/ */
"no-space-in-code"?: boolean; "no-space-in-code"?: boolean | "error";
/** /**
* MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md039.md * MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md039.md
*/ */
MD039?: boolean; MD039?: boolean | "error";
/** /**
* MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md039.md * MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md039.md
*/ */
"no-space-in-links"?: boolean; "no-space-in-links"?: boolean | "error";
/** /**
* MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md040.md * MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md040.md
*/ */
MD040?: MD040?:
| boolean | boolean
| "error"
| { | {
/** /**
* List of languages * List of languages
@ -735,6 +775,7 @@ export interface ConfigurationStrict {
*/ */
"fenced-code-language"?: "fenced-code-language"?:
| boolean | boolean
| "error"
| { | {
/** /**
* List of languages * List of languages
@ -750,6 +791,7 @@ export interface ConfigurationStrict {
*/ */
MD041?: MD041?:
| boolean | boolean
| "error"
| { | {
/** /**
* Allow content before first heading * Allow content before first heading
@ -769,6 +811,7 @@ export interface ConfigurationStrict {
*/ */
"first-line-heading"?: "first-line-heading"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Allow content before first heading * Allow content before first heading
@ -788,6 +831,7 @@ export interface ConfigurationStrict {
*/ */
"first-line-h1"?: "first-line-h1"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Allow content before first heading * Allow content before first heading
@ -805,16 +849,17 @@ export interface ConfigurationStrict {
/** /**
* MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md042.md * MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md042.md
*/ */
MD042?: boolean; MD042?: boolean | "error";
/** /**
* MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md042.md * MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md042.md
*/ */
"no-empty-links"?: boolean; "no-empty-links"?: boolean | "error";
/** /**
* MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md043.md * MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md043.md
*/ */
MD043?: MD043?:
| boolean | boolean
| "error"
| { | {
/** /**
* List of headings * List of headings
@ -830,6 +875,7 @@ export interface ConfigurationStrict {
*/ */
"required-headings"?: "required-headings"?:
| boolean | boolean
| "error"
| { | {
/** /**
* List of headings * List of headings
@ -845,6 +891,7 @@ export interface ConfigurationStrict {
*/ */
MD044?: MD044?:
| boolean | boolean
| "error"
| { | {
/** /**
* List of proper names * List of proper names
@ -864,6 +911,7 @@ export interface ConfigurationStrict {
*/ */
"proper-names"?: "proper-names"?:
| boolean | boolean
| "error"
| { | {
/** /**
* List of proper names * List of proper names
@ -881,16 +929,17 @@ export interface ConfigurationStrict {
/** /**
* MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md045.md * MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md045.md
*/ */
MD045?: boolean; MD045?: boolean | "error";
/** /**
* MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md045.md * MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md045.md
*/ */
"no-alt-text"?: boolean; "no-alt-text"?: boolean | "error";
/** /**
* MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md046.md * MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md046.md
*/ */
MD046?: MD046?:
| boolean | boolean
| "error"
| { | {
/** /**
* Block style * Block style
@ -902,6 +951,7 @@ export interface ConfigurationStrict {
*/ */
"code-block-style"?: "code-block-style"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Block style * Block style
@ -911,16 +961,17 @@ export interface ConfigurationStrict {
/** /**
* MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md047.md * MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md047.md
*/ */
MD047?: boolean; MD047?: boolean | "error";
/** /**
* MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md047.md * MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md047.md
*/ */
"single-trailing-newline"?: boolean; "single-trailing-newline"?: boolean | "error";
/** /**
* MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md048.md * MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md048.md
*/ */
MD048?: MD048?:
| boolean | boolean
| "error"
| { | {
/** /**
* Code fence style * Code fence style
@ -932,6 +983,7 @@ export interface ConfigurationStrict {
*/ */
"code-fence-style"?: "code-fence-style"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Code fence style * Code fence style
@ -943,6 +995,7 @@ export interface ConfigurationStrict {
*/ */
MD049?: MD049?:
| boolean | boolean
| "error"
| { | {
/** /**
* Emphasis style * Emphasis style
@ -954,6 +1007,7 @@ export interface ConfigurationStrict {
*/ */
"emphasis-style"?: "emphasis-style"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Emphasis style * Emphasis style
@ -965,6 +1019,7 @@ export interface ConfigurationStrict {
*/ */
MD050?: MD050?:
| boolean | boolean
| "error"
| { | {
/** /**
* Strong style * Strong style
@ -976,6 +1031,7 @@ export interface ConfigurationStrict {
*/ */
"strong-style"?: "strong-style"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Strong style * Strong style
@ -987,6 +1043,7 @@ export interface ConfigurationStrict {
*/ */
MD051?: MD051?:
| boolean | boolean
| "error"
| { | {
/** /**
* Ignore case of fragments * Ignore case of fragments
@ -1002,6 +1059,7 @@ export interface ConfigurationStrict {
*/ */
"link-fragments"?: "link-fragments"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Ignore case of fragments * Ignore case of fragments
@ -1017,6 +1075,7 @@ export interface ConfigurationStrict {
*/ */
MD052?: MD052?:
| boolean | boolean
| "error"
| { | {
/** /**
* Ignored link labels * Ignored link labels
@ -1032,6 +1091,7 @@ export interface ConfigurationStrict {
*/ */
"reference-links-images"?: "reference-links-images"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Ignored link labels * Ignored link labels
@ -1047,6 +1107,7 @@ export interface ConfigurationStrict {
*/ */
MD053?: MD053?:
| boolean | boolean
| "error"
| { | {
/** /**
* Ignored definitions * Ignored definitions
@ -1058,6 +1119,7 @@ export interface ConfigurationStrict {
*/ */
"link-image-reference-definitions"?: "link-image-reference-definitions"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Ignored definitions * Ignored definitions
@ -1069,6 +1131,7 @@ export interface ConfigurationStrict {
*/ */
MD054?: MD054?:
| boolean | boolean
| "error"
| { | {
/** /**
* Allow autolinks * Allow autolinks
@ -1100,6 +1163,7 @@ export interface ConfigurationStrict {
*/ */
"link-image-style"?: "link-image-style"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Allow autolinks * Allow autolinks
@ -1131,6 +1195,7 @@ export interface ConfigurationStrict {
*/ */
MD055?: MD055?:
| boolean | boolean
| "error"
| { | {
/** /**
* Table pipe style * Table pipe style
@ -1142,6 +1207,7 @@ export interface ConfigurationStrict {
*/ */
"table-pipe-style"?: "table-pipe-style"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Table pipe style * Table pipe style
@ -1151,24 +1217,25 @@ export interface ConfigurationStrict {
/** /**
* MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md056.md * MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md056.md
*/ */
MD056?: boolean; MD056?: boolean | "error";
/** /**
* MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md056.md * MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md056.md
*/ */
"table-column-count"?: boolean; "table-column-count"?: boolean | "error";
/** /**
* MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md058.md * MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md058.md
*/ */
MD058?: boolean; MD058?: boolean | "error";
/** /**
* MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md058.md * MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md058.md
*/ */
"blanks-around-tables"?: boolean; "blanks-around-tables"?: boolean | "error";
/** /**
* MD059/descriptive-link-text : Link text should be descriptive : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md059.md * MD059/descriptive-link-text : Link text should be descriptive : https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md059.md
*/ */
MD059?: MD059?:
| boolean | boolean
| "error"
| { | {
/** /**
* Prohibited link texts * Prohibited link texts
@ -1180,6 +1247,7 @@ export interface ConfigurationStrict {
*/ */
"descriptive-link-text"?: "descriptive-link-text"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Prohibited link texts * Prohibited link texts
@ -1191,6 +1259,7 @@ export interface ConfigurationStrict {
*/ */
MD060?: MD060?:
| boolean | boolean
| "error"
| { | {
/** /**
* Table column style * Table column style
@ -1202,6 +1271,7 @@ export interface ConfigurationStrict {
*/ */
"table-column-style"?: "table-column-style"?:
| boolean | boolean
| "error"
| { | {
/** /**
* Table column style * Table column style

View file

@ -19,6 +19,7 @@ const schema = {
"$id": schemaUri, "$id": schemaUri,
"title": "markdownlint configuration schema", "title": "markdownlint configuration schema",
"type": "object", "type": "object",
/** @type {Object.<string, object>} */
"properties": { "properties": {
"$schema": { "$schema": {
"description": "JSON Schema URI (expected by some editors)", "description": "JSON Schema URI (expected by some editors)",
@ -28,8 +29,8 @@ const schema = {
"default": { "default": {
"description": "Default state for all rules", "description": "Default state for all rules",
"oneOf": [ "oneOf": [
{ "type": "boolean" } { "type": "boolean" },
// { "enum": [ "error", "warning" ] } { "enum": [ "error" ] }
], ],
"default": true "default": true
}, },
@ -49,6 +50,7 @@ const schema = {
] ]
} }
}; };
/** @type {Object.<string, string[]>} */
const tags = {}; const tags = {};
// Add rules // Add rules
@ -63,11 +65,12 @@ for (const rule of rules) {
"description": "description":
`${rule.names.join("/")} : ${rule.description} : ${rule.information}`, `${rule.names.join("/")} : ${rule.description} : ${rule.information}`,
"oneOf": [ "oneOf": [
{ "type": "boolean" } { "type": "boolean" },
// { "enum": [ "error", "warning" ] } { "enum": [ "error" ] }
], ],
"default": true "default": true
}; };
/** @type {{type: "object", additionalProperties: boolean, properties?: object}} */
const subscheme = { const subscheme = {
"type": "object", "type": "object",
"additionalProperties": false "additionalProperties": false

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -4,11 +4,13 @@ import fs from "node:fs/promises";
import path from "node:path"; import path from "node:path";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
/* eslint-disable jsdoc/no-undefined-types */
/** /**
* Gets the file name of the current module. * Gets the file name of the current module.
* Shims import.meta.filename for Node 18. * Shims import.meta.filename for Node 18.
* *
* @param {Object} meta ESM import.meta object. * @param {ImportMeta} meta ESM import.meta object.
* @returns {string} File name. * @returns {string} File name.
*/ */
// eslint-disable-next-line no-underscore-dangle // eslint-disable-next-line no-underscore-dangle
@ -18,7 +20,7 @@ export const __filename = (meta) => fileURLToPath(meta.url);
* Gets the directory name of the current module. * Gets the directory name of the current module.
* Shims import.meta.dirname for Node 18. * Shims import.meta.dirname for Node 18.
* *
* @param {Object} meta ESM import.meta object. * @param {ImportMeta} meta ESM import.meta object.
* @returns {string} Directory name. * @returns {string} Directory name.
*/ */
// eslint-disable-next-line no-underscore-dangle // eslint-disable-next-line no-underscore-dangle
@ -28,9 +30,9 @@ export const __dirname = (meta) => path.dirname(__filename(meta));
* Imports a file as JSON. * Imports a file as JSON.
* Avoids "ExperimentalWarning: Importing JSON modules is an experimental feature and might change at any time". * Avoids "ExperimentalWarning: Importing JSON modules is an experimental feature and might change at any time".
* *
* @param {Object} meta ESM import.meta object. * @param {ImportMeta} meta ESM import.meta object.
* @param {string} file JSON file to import. * @param {string} file JSON file to import.
* @returns {Promise<Object>} JSON object. * @returns {Promise<any>} JSON object.
*/ */
export const importWithTypeJson = async(meta, file) => ( export const importWithTypeJson = async(meta, file) => (
// @ts-ignore // @ts-ignore

View file

@ -22,7 +22,9 @@ import * as constants from "../lib/constants.mjs";
import rules from "../lib/rules.mjs"; import rules from "../lib/rules.mjs";
import customRules from "./rules/rules.cjs"; import customRules from "./rules/rules.cjs";
import { __dirname, importWithTypeJson } from "./esm-helpers.mjs"; import { __dirname, importWithTypeJson } from "./esm-helpers.mjs";
/** @type {{exports: Object.<string, string>, homepage: string, version: string}} */
const packageJson = await importWithTypeJson(import.meta, "../package.json"); const packageJson = await importWithTypeJson(import.meta, "../package.json");
/** @type {{$id: string, properties: Object<string, any>}} */
const configSchema = await importWithTypeJson(import.meta, "../schema/markdownlint-config-schema.json"); const configSchema = await importWithTypeJson(import.meta, "../schema/markdownlint-config-schema.json");
const configSchemaStrict = await importWithTypeJson(import.meta, "../schema/markdownlint-config-schema-strict.json"); const configSchemaStrict = await importWithTypeJson(import.meta, "../schema/markdownlint-config-schema-strict.json");
@ -31,6 +33,10 @@ const ajvOptions = {
"allowUnionTypes": true "allowUnionTypes": true
}; };
/** @typedef {import("ava").ImplementationFn<[]>} ImplementationFn */
/** @typedef {import("markdownlint").Configuration} Configuration */
/** @typedef {import("markdownlint").LintResults} LintResults */
/** /**
* Gets an instance of a markdown-it factory, suitable for use with options.markdownItFactory. * Gets an instance of a markdown-it factory, suitable for use with options.markdownItFactory.
* *
@ -140,90 +146,98 @@ test("inputOnlyNewline", (t) => new Promise((resolve) => {
}); });
})); }));
test("defaultTrue", (t) => new Promise((resolve) => { /** @typedef {Object<string, string[]>} NormalizedLintResults */
t.plan(2);
const options = {
"files": [
"./test/atx_heading_spacing.md",
"./test/first_heading_bad_atx.md"
],
"config": {
"default": true
},
"noInlineConfig": true,
"resultVersion": 0
};
lintAsync(options, function callback(err, actualResult) {
t.falsy(err);
const expectedResult = {
"./test/atx_heading_spacing.md": {
"MD018": [ 1 ],
"MD019": [ 3, 5 ],
"MD041": [ 1 ]
},
"./test/first_heading_bad_atx.md": {
"MD041": [ 1 ]
}
};
// @ts-ignore
t.deepEqual(actualResult, expectedResult, "Undetected issues.");
resolve();
});
}));
test("defaultFalse", (t) => new Promise((resolve) => { /**
t.plan(2); * Normalizes LintResults.
const options = { *
"files": [ * @param {LintResults} results LintResults.
"./test/atx_heading_spacing.md", * @returns {NormalizedLintResults} Normalized LintResults.
"./test/first_heading_bad_atx.md" */
], function normalizeLintResults(results) {
"config": { return Object.fromEntries(
"default": false Object.entries(results).map(
}, ([ source, errors ]) => [
"noInlineConfig": true, source, errors.map(
"resultVersion": 0 ({ lineNumber, ruleNames }) => `${ruleNames[0]} ${lineNumber}`
}; )
lintAsync(options, function callback(err, actualResult) { ]
t.falsy(err); )
const expectedResult = { );
"./test/atx_heading_spacing.md": {}, }
"./test/first_heading_bad_atx.md": {}
};
// @ts-ignore
t.deepEqual(actualResult, expectedResult, "Undetected issues.");
resolve();
});
}));
test("defaultUndefined", (t) => new Promise((resolve) => { /**
t.plan(2); * Gets a Configuration default value test implementation.
const options = { *
"files": [ * @param {(config: Configuration) => void} setDefault Sets the value of the Configuration default value.
"./test/atx_heading_spacing.md", * @param {NormalizedLintResults} expected Expected result.
"./test/first_heading_bad_atx.md" * @returns {ImplementationFn} Test implementation.
], */
"config": {}, function getConfigDefaultTestImplementation(setDefault, expected) {
"noInlineConfig": true, return async(t) => {
"resultVersion": 0 t.plan(1);
}; const options = {
lintAsync(options, function callback(err, actualResult) { "files": [
t.falsy(err); "./test/atx_heading_spacing.md",
const expectedResult = { "./test/first_heading_bad_atx.md"
"./test/atx_heading_spacing.md": { ],
"MD018": [ 1 ], "config": {},
"MD019": [ 3, 5 ], "noInlineConfig": true
"MD041": [ 1 ]
},
"./test/first_heading_bad_atx.md": {
"MD041": [ 1 ]
}
}; };
// @ts-ignore setDefault(options.config);
t.deepEqual(actualResult, expectedResult, "Undetected issues."); const actual = await lintPromise(options);
resolve(); t.deepEqual(normalizeLintResults(actual), expected);
}); };
})); }
const configDefaultTestExpectedEnabled = {
"./test/atx_heading_spacing.md": [
"MD018 1",
"MD019 3",
"MD019 5",
"MD041 1"
],
"./test/first_heading_bad_atx.md": [
"MD041 1"
]
};
const configDefaultTestExpectedDisabled = {
"./test/atx_heading_spacing.md": [],
"./test/first_heading_bad_atx.md": []
};
test("defaultTrue", getConfigDefaultTestImplementation(
(config) => (config.default = true),
configDefaultTestExpectedEnabled
));
test("defaultFalse", getConfigDefaultTestImplementation(
(config) => (config.default = false),
configDefaultTestExpectedDisabled
));
test("defaultError", getConfigDefaultTestImplementation(
(config) => (config.default = "error"),
configDefaultTestExpectedEnabled
));
test("defaultWarning", getConfigDefaultTestImplementation(
// @ts-ignore
(config) => (config.default = "warning"),
configDefaultTestExpectedEnabled
));
test("defaultOff", getConfigDefaultTestImplementation(
// @ts-ignore
(config) => (config.default = "off"),
configDefaultTestExpectedEnabled
));
test("defaultUnset", getConfigDefaultTestImplementation(
() => {},
configDefaultTestExpectedEnabled
));
test("disableRules", (t) => new Promise((resolve) => { test("disableRules", (t) => new Promise((resolve) => {
t.plan(2); t.plan(2);
@ -802,6 +816,7 @@ test("customFileSystemSync", (t) => {
t.plan(2); t.plan(2);
const file = "/dir/file.md"; const file = "/dir/file.md";
const fsApi = { const fsApi = {
// @ts-ignore
"readFileSync": (p) => { "readFileSync": (p) => {
t.is(p, file); t.is(p, file);
return "# Heading"; return "# Heading";
@ -818,6 +833,7 @@ test("customFileSystemAsync", (t) => new Promise((resolve) => {
t.plan(3); t.plan(3);
const file = "/dir/file.md"; const file = "/dir/file.md";
const fsApi = { const fsApi = {
// @ts-ignore
"readFile": (p, o, cb) => { "readFile": (p, o, cb) => {
t.is(p, file); t.is(p, file);
cb(null, "# Heading"); cb(null, "# Heading");
@ -836,6 +852,7 @@ test("customFileSystemAsync", (t) => new Promise((resolve) => {
test("readme", async(t) => { test("readme", async(t) => {
t.plan(132); t.plan(132);
/** @type {Object.<string, string[]>} */
const tagToRules = {}; const tagToRules = {};
for (const rule of rules) { for (const rule of rules) {
for (const tag of rule.tags) { for (const tag of rule.tags) {
@ -894,7 +911,7 @@ test("readme", async(t) => {
} else if (inTags) { } else if (inTags) {
const parts = const parts =
token.content.replace(/[`*]/g, "").split(/ - |, |,\n/); token.content.replace(/[`*]/g, "").split(/ - |, |,\n/);
const tag = parts.shift(); const tag = parts.shift() || "";
t.deepEqual(parts, tagToRules[tag] || [], t.deepEqual(parts, tagToRules[tag] || [],
"Rule mismatch for tag " + tag + "."); "Rule mismatch for tag " + tag + ".");
delete tagToRules[tag]; delete tagToRules[tag];
@ -1248,6 +1265,7 @@ test("token-map-spans", (t) => {
"tags": [ "tms" ], "tags": [ "tms" ],
"parser": "markdownit", "parser": "markdownit",
"function": function tokenMapSpans(params) { "function": function tokenMapSpans(params) {
/** @type {number[]} */
const tokenLines = []; const tokenLines = [];
let lastLineNumber = -1; let lastLineNumber = -1;
const inlines = params.parsers.markdownit.tokens.filter( const inlines = params.parsers.markdownit.tokens.filter(