From 0eedda0a6c28c039b45b78360914c1825da31110 Mon Sep 17 00:00:00 2001 From: David Anson Date: Mon, 28 Oct 2024 21:40:39 -0700 Subject: [PATCH 01/64] Update MD027/no-multiple-space-blockquote to handle multiple lines of indented code inside a blockquote (fixes #1393). --- demo/markdownlint-browser.js | 10 ++++++++-- lib/md027.js | 10 ++++++++-- test/blockquote_spaces.md | 14 ++++++++++++++ .../markdownlint-test-scenarios.js.md | 14 ++++++++++++++ .../markdownlint-test-scenarios.js.snap | Bin 258724 -> 258767 bytes 5 files changed, 44 insertions(+), 4 deletions(-) diff --git a/demo/markdownlint-browser.js b/demo/markdownlint-browser.js index dc357d2b7..5a3ee76a7 100644 --- a/demo/markdownlint-browser.js +++ b/demo/markdownlint-browser.js @@ -4680,9 +4680,15 @@ module.exports = { "tags": [ "blockquote", "whitespace", "indentation" ], "parser": "micromark", "function": function MD027(params, onError) { + const { tokens } = params.parsers.micromark; for (const token of filterByTypesCached([ "linePrefix" ])) { - const siblings = token.parent?.children || params.parsers.micromark.tokens; - if (siblings[siblings.indexOf(token) - 1]?.type === "blockQuotePrefix") { + const parent = token.parent; + const codeIndented = parent?.type === "codeIndented"; + const siblings = parent?.children || tokens; + if ( + !codeIndented && + (siblings[siblings.indexOf(token) - 1]?.type === "blockQuotePrefix") + ) { const { startColumn, startLine, text } = token; const { length } = text; const line = params.lines[startLine - 1]; diff --git a/lib/md027.js b/lib/md027.js index d4610c62f..6c19b1a20 100644 --- a/lib/md027.js +++ b/lib/md027.js @@ -13,9 +13,15 @@ module.exports = { "tags": [ "blockquote", "whitespace", "indentation" ], "parser": "micromark", "function": function MD027(params, onError) { + const { tokens } = params.parsers.micromark; for (const token of filterByTypesCached([ "linePrefix" ])) { - const siblings = token.parent?.children || params.parsers.micromark.tokens; - if (siblings[siblings.indexOf(token) - 1]?.type === "blockQuotePrefix") { + const parent = token.parent; + const codeIndented = parent?.type === "codeIndented"; + const siblings = parent?.children || tokens; + if ( + !codeIndented && + (siblings[siblings.indexOf(token) - 1]?.type === "blockQuotePrefix") + ) { const { startColumn, startLine, text } = token; const { length } = text; const line = params.lines[startLine - 1]; diff --git a/test/blockquote_spaces.md b/test/blockquote_spaces.md index b58fbfaa1..a2ae64a65 100644 --- a/test/blockquote_spaces.md +++ b/test/blockquote_spaces.md @@ -46,3 +46,17 @@ Test nothing in the blockquote: > {MD027:-1} + + + +> Blockquoted code blocks: +> +> Code +> Code +> Code +> +> ```text +> Code +> Code +> Code +> ``` diff --git a/test/snapshots/markdownlint-test-scenarios.js.md b/test/snapshots/markdownlint-test-scenarios.js.md index fc392a5a6..6d3649651 100644 --- a/test/snapshots/markdownlint-test-scenarios.js.md +++ b/test/snapshots/markdownlint-test-scenarios.js.md @@ -6825,6 +6825,20 @@ Generated by [AVA](https://avajs.dev). ␊ > ␊ {MD027:-1}␊ + ␊ + ␊ + ␊ + > Blockquoted code blocks:␊ + >␊ + > Code␊ + > Code␊ + > Code␊ + >␊ + > \`\`\`text␊ + > Code␊ + > Code␊ + > Code␊ + > \`\`\`␊ `, } diff --git a/test/snapshots/markdownlint-test-scenarios.js.snap b/test/snapshots/markdownlint-test-scenarios.js.snap index ea8f3358a81fbebdce9746e935a21d79b0c3518a..5f1f8fc452a7de6fe33b1634eea146b9abf3ba3d 100644 GIT binary patch delta 235650 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

t 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

m74mSSNA7tkYuvw(5wVqw% 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

8@m{78I(MYfs=_uvubH%%65~)}NO+u));==Q; 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�EBQs?Rd$1U1dbJUwpV~J+cbR6*S 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 QmGwgWf7?_c)Shk}02SYIivR!s From 886e00a8d53c275d12801be34d1636fe03789eb2 Mon Sep 17 00:00:00 2001 From: David Anson Date: Thu, 31 Oct 2024 04:49:49 +0000 Subject: [PATCH 02/64] Update test repo snapshots. --- .../markdownlint-test-repos-small.js.md | 36 +++++++++--------- .../markdownlint-test-repos-small.js.snap | Bin 5167 -> 5171 bytes 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/test/snapshots/markdownlint-test-repos-small.js.md b/test/snapshots/markdownlint-test-repos-small.js.md index e941e4739..11feae1bf 100644 --- a/test/snapshots/markdownlint-test-repos-small.js.md +++ b/test/snapshots/markdownlint-test-repos-small.js.md @@ -195,24 +195,24 @@ Generated by [AVA](https://avajs.dev). test-repos/mochajs-mocha/docs/index.md: 37: MD051/link-fragments Link fragments should be valid [Context: "[node debugger support](#-inspect-inspect-brk-inspect)"]␊ test-repos/mochajs-mocha/docs/index.md: 39: MD051/link-fragments Link fragments should be valid [Context: "[source-map support](#-enable-source-maps)"]␊ test-repos/mochajs-mocha/docs/index.md: 45: MD051/link-fragments Link fragments should be valid [Context: "[arbitrary transpiler support (coffee-script etc)](#-compilers)"]␊ - test-repos/mochajs-mocha/docs/index.md: 1233: MD051/link-fragments Link fragments should be valid [Context: "[\`--parallel\`](#-parallel-p)"]␊ - test-repos/mochajs-mocha/docs/index.md: 1251: MD051/link-fragments Link fragments should be valid [Context: "[\`--node-option\`](#-node-option-name-n-name)"]␊ - test-repos/mochajs-mocha/docs/index.md: 1272: MD051/link-fragments Link fragments should be valid [Context: "[\`--node-option\`](#-node-option-name-n-name)"]␊ - test-repos/mochajs-mocha/docs/index.md: 1278: MD051/link-fragments Link fragments should be valid [Context: "[\`--parallel\`](#-parallel-p)"]␊ - test-repos/mochajs-mocha/docs/index.md: 1303: MD051/link-fragments Link fragments should be valid [Context: "[\`--grep\`](#-grep-regexp-g-regexp)"]␊ - test-repos/mochajs-mocha/docs/index.md: 1303: MD051/link-fragments Link fragments should be valid [Context: "[\`--fgrep\`](#-fgrep-string-f-string)"]␊ - test-repos/mochajs-mocha/docs/index.md: 1314: MD051/link-fragments Link fragments should be valid [Context: "[\`--file\`](#-file-file)"]␊ - test-repos/mochajs-mocha/docs/index.md: 1315: MD051/link-fragments Link fragments should be valid [Context: "[\`--sort\`](#-sort-s)"]␊ - test-repos/mochajs-mocha/docs/index.md: 1321: MD051/link-fragments Link fragments should be valid [Context: "[globally](#-timeout-ms-t-ms)"]␊ - test-repos/mochajs-mocha/docs/index.md: 1382: MD051/link-fragments Link fragments should be valid [Context: "[\`--parallel\`](#-parallel-p)"]␊ - test-repos/mochajs-mocha/docs/index.md: 1389: MD051/link-fragments Link fragments should be valid [Context: "[\`--timeout\`](#-timeout-ms-t-ms)"]␊ - test-repos/mochajs-mocha/docs/index.md: 1399: MD051/link-fragments Link fragments should be valid [Context: "[job count](#-jobs-count-j-count)"]␊ - test-repos/mochajs-mocha/docs/index.md: 1413: MD051/link-fragments Link fragments should be valid [Context: "[\`--require\`](#-require-module-r-module)"]␊ - test-repos/mochajs-mocha/docs/index.md: 1623: MD051/link-fragments Link fragments should be valid [Context: "[\`--parallel\`](#-parallel-p)"]␊ - test-repos/mochajs-mocha/docs/index.md: 2097: MD051/link-fragments Link fragments should be valid [Context: "[Watch mode](#-watch-w)"]␊ - test-repos/mochajs-mocha/docs/index.md: 2384: MD053/link-image-reference-definitions Link and image reference definitions should be needed [Unused link or image reference definition: "caniuse-notifications"] [Context: "[caniuse-notifications]: https..."]␊ - test-repos/mochajs-mocha/docs/index.md: 2385: MD053/link-image-reference-definitions Link and image reference definitions should be needed [Unused link or image reference definition: "caniuse-promises"] [Context: "[caniuse-promises]: https://ca..."]␊ - test-repos/mochajs-mocha/docs/index.md: 2416: MD053/link-image-reference-definitions Link and image reference definitions should be needed [Unused link or image reference definition: "mocha-website"] [Context: "[mocha-website]: https://mocha..."]` + test-repos/mochajs-mocha/docs/index.md: 1244: MD051/link-fragments Link fragments should be valid [Context: "[\`--parallel\`](#-parallel-p)"]␊ + test-repos/mochajs-mocha/docs/index.md: 1262: MD051/link-fragments Link fragments should be valid [Context: "[\`--node-option\`](#-node-option-name-n-name)"]␊ + test-repos/mochajs-mocha/docs/index.md: 1283: MD051/link-fragments Link fragments should be valid [Context: "[\`--node-option\`](#-node-option-name-n-name)"]␊ + test-repos/mochajs-mocha/docs/index.md: 1289: MD051/link-fragments Link fragments should be valid [Context: "[\`--parallel\`](#-parallel-p)"]␊ + test-repos/mochajs-mocha/docs/index.md: 1314: MD051/link-fragments Link fragments should be valid [Context: "[\`--grep\`](#-grep-regexp-g-regexp)"]␊ + test-repos/mochajs-mocha/docs/index.md: 1314: MD051/link-fragments Link fragments should be valid [Context: "[\`--fgrep\`](#-fgrep-string-f-string)"]␊ + test-repos/mochajs-mocha/docs/index.md: 1325: MD051/link-fragments Link fragments should be valid [Context: "[\`--file\`](#-file-file)"]␊ + test-repos/mochajs-mocha/docs/index.md: 1326: MD051/link-fragments Link fragments should be valid [Context: "[\`--sort\`](#-sort-s)"]␊ + test-repos/mochajs-mocha/docs/index.md: 1332: MD051/link-fragments Link fragments should be valid [Context: "[globally](#-timeout-ms-t-ms)"]␊ + test-repos/mochajs-mocha/docs/index.md: 1393: MD051/link-fragments Link fragments should be valid [Context: "[\`--parallel\`](#-parallel-p)"]␊ + test-repos/mochajs-mocha/docs/index.md: 1400: MD051/link-fragments Link fragments should be valid [Context: "[\`--timeout\`](#-timeout-ms-t-ms)"]␊ + test-repos/mochajs-mocha/docs/index.md: 1410: MD051/link-fragments Link fragments should be valid [Context: "[job count](#-jobs-count-j-count)"]␊ + test-repos/mochajs-mocha/docs/index.md: 1424: MD051/link-fragments Link fragments should be valid [Context: "[\`--require\`](#-require-module-r-module)"]␊ + test-repos/mochajs-mocha/docs/index.md: 1634: MD051/link-fragments Link fragments should be valid [Context: "[\`--parallel\`](#-parallel-p)"]␊ + test-repos/mochajs-mocha/docs/index.md: 2112: MD051/link-fragments Link fragments should be valid [Context: "[Watch mode](#-watch-w)"]␊ + test-repos/mochajs-mocha/docs/index.md: 2399: MD053/link-image-reference-definitions Link and image reference definitions should be needed [Unused link or image reference definition: "caniuse-notifications"] [Context: "[caniuse-notifications]: https..."]␊ + test-repos/mochajs-mocha/docs/index.md: 2400: MD053/link-image-reference-definitions Link and image reference definitions should be needed [Unused link or image reference definition: "caniuse-promises"] [Context: "[caniuse-promises]: https://ca..."]␊ + test-repos/mochajs-mocha/docs/index.md: 2431: MD053/link-image-reference-definitions Link and image reference definitions should be needed [Unused link or image reference definition: "mocha-website"] [Context: "[mocha-website]: https://mocha..."]` ## https://github.com/pi-hole/docs diff --git a/test/snapshots/markdownlint-test-repos-small.js.snap b/test/snapshots/markdownlint-test-repos-small.js.snap index a33d27c071f2dea37303c50a4f13e9266954bc02..d11cebcd426d3b30d3037ccf316988514b43bbc0 100644 GIT binary patch delta 4732 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 K2(u7^4*>v8J6iPs delta 4742 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 From b6dda50e58bf624a4e3b20a236e616f3ab71c564 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 04:55:01 +0000 Subject: [PATCH 03/64] Bump @stylistic/eslint-plugin from 2.9.0 to 2.10.0 Bumps [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) from 2.9.0 to 2.10.0. - [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases) - [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v2.10.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@stylistic/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index be2a7475e..fc0cce4ad 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ }, "devDependencies": { "@eslint/js": "9.13.0", - "@stylistic/eslint-plugin": "2.9.0", + "@stylistic/eslint-plugin": "2.10.0", "ajv": "8.17.1", "ava": "6.2.0", "c8": "10.1.2", From 04b597ab908e69bc5ca4beda8be696a83c601a47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 04:55:09 +0000 Subject: [PATCH 04/64] Bump eslint-plugin-n from 17.11.1 to 17.12.0 Bumps [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) from 17.11.1 to 17.12.0. - [Release notes](https://github.com/eslint-community/eslint-plugin-n/releases) - [Changelog](https://github.com/eslint-community/eslint-plugin-n/blob/master/CHANGELOG.md) - [Commits](https://github.com/eslint-community/eslint-plugin-n/compare/v17.11.1...v17.12.0) --- updated-dependencies: - dependency-name: eslint-plugin-n dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fc0cce4ad..6354614ee 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "character-entities": "2.0.2", "eslint": "9.13.0", "eslint-plugin-jsdoc": "50.4.3", - "eslint-plugin-n": "17.11.1", + "eslint-plugin-n": "17.12.0", "eslint-plugin-regexp": "2.6.0", "eslint-plugin-unicorn": "56.0.0", "gemoji": "8.1.0", From 589ecbf720b0c02ba4d447b9c6f761469d35d659 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 02:27:55 +0000 Subject: [PATCH 05/64] Bump webpack from 5.95.0 to 5.96.0 Bumps [webpack](https://github.com/webpack/webpack) from 5.95.0 to 5.96.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.95.0...v5.96.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6354614ee..74ff29ccb 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "terser-webpack-plugin": "5.3.10", "toml": "3.0.0", "typescript": "5.6.3", - "webpack": "5.95.0", + "webpack": "5.96.0", "webpack-cli": "5.1.4" }, "keywords": [ From 727518d1cfba503b3ca22d66c968f97e3dd04888 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 02:31:25 +0000 Subject: [PATCH 06/64] Bump webpack from 5.95.0 to 5.96.0 in /micromark Bumps [webpack](https://github.com/webpack/webpack) from 5.95.0 to 5.96.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.95.0...v5.96.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- micromark/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micromark/package.json b/micromark/package.json index e4b632667..281bccbc2 100644 --- a/micromark/package.json +++ b/micromark/package.json @@ -40,7 +40,7 @@ "micromark-extension-math": "3.1.0", "micromark-util-types": "2.0.0", "terser-webpack-plugin": "5.3.10", - "webpack": "5.95.0", + "webpack": "5.96.0", "webpack-cli": "5.1.4" } } From db409190ed94d3572315955fc7743f22517aa141 Mon Sep 17 00:00:00 2001 From: Nick Schonning Date: Thu, 31 Oct 2024 01:54:13 -0400 Subject: [PATCH 07/64] ci: Add Node 23 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cbda46809..90ef007ed 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: fail-fast: false matrix: os: [macos-latest, ubuntu-latest, windows-latest] - node-version: [ 18, 20, 22 ] + node-version: [ 18, 20, 22, 23 ] steps: - uses: actions/checkout@v4 From 7ba8160e8c89975331e849821ff1cc0509e115a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 02:25:47 +0000 Subject: [PATCH 08/64] Bump @eslint/js from 9.13.0 to 9.14.0 Bumps [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) from 9.13.0 to 9.14.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.14.0/packages/js) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 74ff29ccb..71329c1a0 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "markdownlint-micromark": "0.1.12" }, "devDependencies": { - "@eslint/js": "9.13.0", + "@eslint/js": "9.14.0", "@stylistic/eslint-plugin": "2.10.0", "ajv": "8.17.1", "ava": "6.2.0", From 2beebd6fc56b5c99991c5319fd543140d819f429 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 02:25:36 +0000 Subject: [PATCH 09/64] Bump eslint from 9.13.0 to 9.14.0 Bumps [eslint](https://github.com/eslint/eslint) from 9.13.0 to 9.14.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.13.0...v9.14.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 71329c1a0..c7a845c4b 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "ava": "6.2.0", "c8": "10.1.2", "character-entities": "2.0.2", - "eslint": "9.13.0", + "eslint": "9.14.0", "eslint-plugin-jsdoc": "50.4.3", "eslint-plugin-n": "17.12.0", "eslint-plugin-regexp": "2.6.0", From 975e25fcf0f1ccd5dcd2a82998f0c3031e9ba51c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 02:25:27 +0000 Subject: [PATCH 10/64] Bump webpack from 5.96.0 to 5.96.1 Bumps [webpack](https://github.com/webpack/webpack) from 5.96.0 to 5.96.1. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.96.0...v5.96.1) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c7a845c4b..ae0f8bf80 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "terser-webpack-plugin": "5.3.10", "toml": "3.0.0", "typescript": "5.6.3", - "webpack": "5.96.0", + "webpack": "5.96.1", "webpack-cli": "5.1.4" }, "keywords": [ From a418847399e9f73c14140c335d5acf2cc39580aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 02:48:29 +0000 Subject: [PATCH 11/64] Bump @stylistic/eslint-plugin from 2.10.0 to 2.10.1 Bumps [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) from 2.10.0 to 2.10.1. - [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases) - [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v2.10.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@stylistic/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ae0f8bf80..c4e3bbe0a 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ }, "devDependencies": { "@eslint/js": "9.14.0", - "@stylistic/eslint-plugin": "2.10.0", + "@stylistic/eslint-plugin": "2.10.1", "ajv": "8.17.1", "ava": "6.2.0", "c8": "10.1.2", From b91dfb539f2b20b7792e0398aa9ba1ec4090bbc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 03:00:10 +0000 Subject: [PATCH 12/64] Bump webpack from 5.96.0 to 5.96.1 in /micromark Bumps [webpack](https://github.com/webpack/webpack) from 5.96.0 to 5.96.1. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.96.0...v5.96.1) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- micromark/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micromark/package.json b/micromark/package.json index 281bccbc2..6098789d3 100644 --- a/micromark/package.json +++ b/micromark/package.json @@ -40,7 +40,7 @@ "micromark-extension-math": "3.1.0", "micromark-util-types": "2.0.0", "terser-webpack-plugin": "5.3.10", - "webpack": "5.96.0", + "webpack": "5.96.1", "webpack-cli": "5.1.4" } } From 3850a6dc6067aba3c18b3eb1e8502ca2a7fcd14d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Nov 2024 02:31:26 +0000 Subject: [PATCH 13/64] Bump eslint-plugin-n from 17.12.0 to 17.13.0 Bumps [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) from 17.12.0 to 17.13.0. - [Release notes](https://github.com/eslint-community/eslint-plugin-n/releases) - [Changelog](https://github.com/eslint-community/eslint-plugin-n/blob/master/CHANGELOG.md) - [Commits](https://github.com/eslint-community/eslint-plugin-n/compare/v17.12.0...v17.13.0) --- updated-dependencies: - dependency-name: eslint-plugin-n dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c4e3bbe0a..e8f767031 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "character-entities": "2.0.2", "eslint": "9.14.0", "eslint-plugin-jsdoc": "50.4.3", - "eslint-plugin-n": "17.12.0", + "eslint-plugin-n": "17.13.0", "eslint-plugin-regexp": "2.6.0", "eslint-plugin-unicorn": "56.0.0", "gemoji": "8.1.0", From 132ccbea033e3545862efbb46cc0157cf939ed7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Nov 2024 02:10:00 +0000 Subject: [PATCH 14/64] Bump json-schema-to-typescript from 15.0.2 to 15.0.3 Bumps [json-schema-to-typescript](https://github.com/bcherny/json-schema-to-typescript) from 15.0.2 to 15.0.3. - [Changelog](https://github.com/bcherny/json-schema-to-typescript/blob/master/CHANGELOG.md) - [Commits](https://github.com/bcherny/json-schema-to-typescript/commits) --- updated-dependencies: - dependency-name: json-schema-to-typescript dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e8f767031..0630b8502 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "gemoji": "8.1.0", "globby": "14.0.2", "js-yaml": "4.1.0", - "json-schema-to-typescript": "15.0.2", + "json-schema-to-typescript": "15.0.3", "jsonc-parser": "3.3.1", "markdown-it-for-inline": "2.0.1", "markdown-it-sub": "2.0.0", From 1737a6c67236946c2ca51cfe106ed9f58372b1b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Nov 2024 02:09:47 +0000 Subject: [PATCH 15/64] Bump eslint-plugin-n from 17.13.0 to 17.13.1 Bumps [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) from 17.13.0 to 17.13.1. - [Release notes](https://github.com/eslint-community/eslint-plugin-n/releases) - [Changelog](https://github.com/eslint-community/eslint-plugin-n/blob/master/CHANGELOG.md) - [Commits](https://github.com/eslint-community/eslint-plugin-n/compare/v17.13.0...v17.13.1) --- updated-dependencies: - dependency-name: eslint-plugin-n dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0630b8502..26264e458 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "character-entities": "2.0.2", "eslint": "9.14.0", "eslint-plugin-jsdoc": "50.4.3", - "eslint-plugin-n": "17.13.0", + "eslint-plugin-n": "17.13.1", "eslint-plugin-regexp": "2.6.0", "eslint-plugin-unicorn": "56.0.0", "gemoji": "8.1.0", From f29ca16c38ad01d0f13a011e803d2b0e951d78e9 Mon Sep 17 00:00:00 2001 From: David Anson Date: Tue, 12 Nov 2024 19:57:31 -0800 Subject: [PATCH 16/64] Update link to SublimeLinter-contrib-markdownlint due to persistent server outage. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0485b1b66..56e793321 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ as well as directives, footnotes, and math syntax - all implemented by [markdownlint-problem-matcher]: https://github.com/xt0rted/markdownlint-problem-matcher [nodejs-extensions]: https://github.com/Lombiq/NodeJs-Extensions [rubygems-mdl]: https://rubygems.org/gems/mdl -[sublimelinter]: https://packagecontrol.io/packages/SublimeLinter-contrib-markdownlint +[sublimelinter]: https://github.com/jonlabelle/SublimeLinter-contrib-markdownlint [super-linter]: https://github.com/super-linter/super-linter [vscode-markdownlint]: https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint From e07c66ae68dab221cdc4ebd878bba71f1b8e1db2 Mon Sep 17 00:00:00 2001 From: David Anson Date: Wed, 13 Nov 2024 19:45:55 -0800 Subject: [PATCH 17/64] Pin CI version of Node 23 to 23.1 as 23.2 has been broken for more than a day. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 90ef007ed..71575beba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: fail-fast: false matrix: os: [macos-latest, ubuntu-latest, windows-latest] - node-version: [ 18, 20, 22, 23 ] + node-version: [ 18, 20, 22, 23.1 ] steps: - uses: actions/checkout@v4 From 0092c5f189c942b5ea2bc9261628b35468cb8325 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 03:51:08 +0000 Subject: [PATCH 18/64] Bump micromark-util-types from 2.0.0 to 2.0.1 in /micromark Bumps [micromark-util-types](https://github.com/micromark/micromark) from 2.0.0 to 2.0.1. - [Release notes](https://github.com/micromark/micromark/releases) - [Commits](https://github.com/micromark/micromark/compare/micromark-util-types@2.0.0...micromark-build@2.0.1) --- updated-dependencies: - dependency-name: micromark-util-types dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- micromark/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micromark/package.json b/micromark/package.json index 6098789d3..f2e46f735 100644 --- a/micromark/package.json +++ b/micromark/package.json @@ -38,7 +38,7 @@ "micromark-extension-gfm-footnote": "2.1.0", "micromark-extension-gfm-table": "2.1.0", "micromark-extension-math": "3.1.0", - "micromark-util-types": "2.0.0", + "micromark-util-types": "2.0.1", "terser-webpack-plugin": "5.3.10", "webpack": "5.96.1", "webpack-cli": "5.1.4" From 1ace77f0b0efb5e1cfe6b4c46d4335d97133e3d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 03:51:10 +0000 Subject: [PATCH 19/64] Bump eslint-plugin-jsdoc from 50.4.3 to 50.5.0 Bumps [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) from 50.4.3 to 50.5.0. - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v50.4.3...v50.5.0) --- updated-dependencies: - dependency-name: eslint-plugin-jsdoc dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 26264e458..6bae34bae 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "c8": "10.1.2", "character-entities": "2.0.2", "eslint": "9.14.0", - "eslint-plugin-jsdoc": "50.4.3", + "eslint-plugin-jsdoc": "50.5.0", "eslint-plugin-n": "17.13.1", "eslint-plugin-regexp": "2.6.0", "eslint-plugin-unicorn": "56.0.0", From fe45e0110affd72bb1ee8892157c61fd0c12ff29 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 03:55:20 +0000 Subject: [PATCH 20/64] Bump micromark from 4.0.0 to 4.0.1 in /micromark Bumps [micromark](https://github.com/micromark/micromark) from 4.0.0 to 4.0.1. - [Release notes](https://github.com/micromark/micromark/releases) - [Commits](https://github.com/micromark/micromark/compare/4.0.0...4.0.1) --- updated-dependencies: - dependency-name: micromark dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- micromark/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micromark/package.json b/micromark/package.json index f2e46f735..722a991e1 100644 --- a/micromark/package.json +++ b/micromark/package.json @@ -32,7 +32,7 @@ ], "devDependencies": { "@microsoft/api-extractor": "7.47.11", - "micromark": "4.0.0", + "micromark": "4.0.1", "micromark-extension-directive": "3.0.2", "micromark-extension-gfm-autolink-literal": "2.1.0", "micromark-extension-gfm-footnote": "2.1.0", From a22b432d8aefbf991aba5ac78f4c22f34e1f8ff6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 02:41:22 +0000 Subject: [PATCH 21/64] Bump eslint-plugin-regexp from 2.6.0 to 2.7.0 Bumps [eslint-plugin-regexp](https://github.com/ota-meshi/eslint-plugin-regexp) from 2.6.0 to 2.7.0. - [Release notes](https://github.com/ota-meshi/eslint-plugin-regexp/releases) - [Changelog](https://github.com/ota-meshi/eslint-plugin-regexp/blob/master/CHANGELOG.md) - [Commits](https://github.com/ota-meshi/eslint-plugin-regexp/compare/v2.6.0...v2.7.0) --- updated-dependencies: - dependency-name: eslint-plugin-regexp dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6bae34bae..7fe924049 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "eslint": "9.14.0", "eslint-plugin-jsdoc": "50.5.0", "eslint-plugin-n": "17.13.1", - "eslint-plugin-regexp": "2.6.0", + "eslint-plugin-regexp": "2.7.0", "eslint-plugin-unicorn": "56.0.0", "gemoji": "8.1.0", "globby": "14.0.2", From a25af76bbbd1efdc160229da2ff2fced0309b287 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 02:06:32 +0000 Subject: [PATCH 22/64] Bump eslint-plugin-n from 17.13.1 to 17.13.2 Bumps [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) from 17.13.1 to 17.13.2. - [Release notes](https://github.com/eslint-community/eslint-plugin-n/releases) - [Changelog](https://github.com/eslint-community/eslint-plugin-n/blob/master/CHANGELOG.md) - [Commits](https://github.com/eslint-community/eslint-plugin-n/compare/v17.13.1...v17.13.2) --- updated-dependencies: - dependency-name: eslint-plugin-n dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7fe924049..d7ae32211 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "character-entities": "2.0.2", "eslint": "9.14.0", "eslint-plugin-jsdoc": "50.5.0", - "eslint-plugin-n": "17.13.1", + "eslint-plugin-n": "17.13.2", "eslint-plugin-regexp": "2.7.0", "eslint-plugin-unicorn": "56.0.0", "gemoji": "8.1.0", From 4853cf4c31ce887c30846bb55c0d4322847974f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 02:06:53 +0000 Subject: [PATCH 23/64] Bump @eslint/js from 9.14.0 to 9.15.0 Bumps [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) from 9.14.0 to 9.15.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.15.0/packages/js) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d7ae32211..c73f53e5d 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "markdownlint-micromark": "0.1.12" }, "devDependencies": { - "@eslint/js": "9.14.0", + "@eslint/js": "9.15.0", "@stylistic/eslint-plugin": "2.10.1", "ajv": "8.17.1", "ava": "6.2.0", From d5365433444c4147f2a3b31fdd777bb4fd5582c2 Mon Sep 17 00:00:00 2001 From: David Anson Date: Wed, 20 Nov 2024 04:33:58 +0000 Subject: [PATCH 24/64] Update test repo snapshots. --- .../markdownlint-test-repos-dotnet-docs.js.md | 39 +----------------- ...arkdownlint-test-repos-dotnet-docs.js.snap | Bin 855 -> 335 bytes 2 files changed, 1 insertion(+), 38 deletions(-) diff --git a/test/snapshots/markdownlint-test-repos-dotnet-docs.js.md b/test/snapshots/markdownlint-test-repos-dotnet-docs.js.md index 0e76004c7..79b115789 100644 --- a/test/snapshots/markdownlint-test-repos-dotnet-docs.js.md +++ b/test/snapshots/markdownlint-test-repos-dotnet-docs.js.md @@ -16,41 +16,4 @@ Generated by [AVA](https://avajs.dev). test-repos/dotnet-docs/SECURITY.md: 25: MD007/ul-indent Unordered list indentation [Expected: 0; Actual: 2]␊ test-repos/dotnet-docs/SECURITY.md: 26: MD007/ul-indent Unordered list indentation [Expected: 0; Actual: 2]␊ test-repos/dotnet-docs/SECURITY.md: 27: MD007/ul-indent Unordered list indentation [Expected: 0; Actual: 2]␊ - test-repos/dotnet-docs/SECURITY.md: 17: MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1]␊ - test-repos/dotnet-docs/docs/core/compatibility/windows-forms/5.0/invalid-args-cause-argumentoutofrangeexception.md: 30: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> | Property | Parameter name ..."]␊ - test-repos/dotnet-docs/docs/core/compatibility/windows-forms/5.0/null-args-cause-argumentnullexception.md: 29: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> | Method | Parameter name | ..."]␊ - test-repos/dotnet-docs/docs/core/compatibility/windows-forms/5.0/null-owner-causes-invalidoperationexception.md: 31: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> | Affected method or propert..."]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 19: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 185: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 225: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 235: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 243: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 258: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 301: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 323: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 333: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 342: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 395: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 507: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 515: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 523: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 535: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 543: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 550: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 585: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 592: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 606: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 614: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 631: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 639: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 665: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 672: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 682: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 690: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 697: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 704: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/framework/whats-new/obsolete-members.md: 711: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Type|Member|Message|"]␊ - test-repos/dotnet-docs/docs/fundamentals/code-analysis/quality-rules/index.md: 15: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> | Rule ID and warning | Desc..."]␊ - test-repos/dotnet-docs/docs/fundamentals/code-analysis/style-rules/index.md: 35: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> | Rule ID | Title | Option |"]␊ - test-repos/dotnet-docs/docs/standard/base-types/regular-expressions.md: 91: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Pattern|Interpretation|"]␊ - test-repos/dotnet-docs/docs/standard/base-types/regular-expressions.md: 113: MD058/blanks-around-tables Tables should be surrounded by blank lines [Context: "> |Pattern|Interpretation|"]` + test-repos/dotnet-docs/SECURITY.md: 17: MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1]` diff --git a/test/snapshots/markdownlint-test-repos-dotnet-docs.js.snap b/test/snapshots/markdownlint-test-repos-dotnet-docs.js.snap index 4e1de15533f19ef27bf1998c7f239db415d7c2e6..d9a5305475e6126468b28fa024598c6ab48b1218 100644 GIT binary patch literal 335 zcmV-V0kHl-RzVu@u<&1W0q_QOT-~&>z;?OeYha( zZjh6vLLZ9=00000000BM)3Hv&Fc1ddK!lLkn32%EKm?ZcDp^2B8}Vgil}xuV{1iKTaJX? zFloskF=>TU&hXk*mfUVHB`3ZL-^1WI=<47oI6Zs|2^~cZ*47Qds0*@rF`3Sa(MINw zj&qnzitpU?QmHI)~)(`z;7%4qm_EJE<9RekJhC}>&l~*`LmMj hzg`SAFHvvLzIH$>LtXeqS^asb`vBw0ER973000}1ov{D_ literal 855 zcmV-d1E~B#RzVeB$*5AIC-g!wrh^HECJc|{WH6N{`+EALrI_( zEMd;G><@NUQX|cRrT_f)0NAUG7q71_uix}=X%9COjp5oVu*6A159C{8SW1+8gB3yT&R` zvM@nFf5DAwjA8{aY<%|tC|2xQH-;H)gSHpW66|QfPX1&qd+A*bp7!BZdRYO1XI56g zMx)Wm6Nt5qG5@7By#HEbHXlgi5@_Sp_X^u5)#$bsd@mCDy@|uzcFy~aHPeBVo~>4$ z-?FNg>^!S`1OHg*D$LE+`5Up_NJ4I5D_nuj00FO{D!^m^D-C3)>wOLFvIA3M`9FHdF>l1^is z=@_F&9^*2e$GD8=`9Qhdprm8mPv`Rp7nf-=jgWLYiIDVAY5B0EBh1F9(+H!-bQWXu zIE|6?Ji--mI*)KaJxd~t)3fw{6sH@jWGH7#6Kcf@xU|yjQKR^`k)d47ePaMcXk_gA zQsh9fk6kqe*yTBsRt34oUXL}c#59C2FB@uYrURnZQd+0k?Psuz@2TE}s hqz* Date: Wed, 20 Nov 2024 04:43:04 +0000 Subject: [PATCH 25/64] Bump eslint-plugin-unicorn from 56.0.0 to 56.0.1 Bumps [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) from 56.0.0 to 56.0.1. - [Release notes](https://github.com/sindresorhus/eslint-plugin-unicorn/releases) - [Commits](https://github.com/sindresorhus/eslint-plugin-unicorn/compare/v56.0.0...v56.0.1) --- updated-dependencies: - dependency-name: eslint-plugin-unicorn dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c73f53e5d..251c6b8b1 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "eslint-plugin-jsdoc": "50.5.0", "eslint-plugin-n": "17.13.2", "eslint-plugin-regexp": "2.7.0", - "eslint-plugin-unicorn": "56.0.0", + "eslint-plugin-unicorn": "56.0.1", "gemoji": "8.1.0", "globby": "14.0.2", "js-yaml": "4.1.0", From 3812cba029a814c65b1f01f6a5d29dbcbc0ebdcc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2024 04:48:14 +0000 Subject: [PATCH 26/64] Bump eslint from 9.14.0 to 9.15.0 Bumps [eslint](https://github.com/eslint/eslint) from 9.14.0 to 9.15.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.14.0...v9.15.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 251c6b8b1..23249f4d5 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "ava": "6.2.0", "c8": "10.1.2", "character-entities": "2.0.2", - "eslint": "9.14.0", + "eslint": "9.15.0", "eslint-plugin-jsdoc": "50.5.0", "eslint-plugin-n": "17.13.2", "eslint-plugin-regexp": "2.7.0", From 587b830cb2d275307d75a06ec1a3e4f670da7169 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2024 04:48:56 +0000 Subject: [PATCH 27/64] Bump @stylistic/eslint-plugin from 2.10.1 to 2.11.0 Bumps [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) from 2.10.1 to 2.11.0. - [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases) - [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v2.11.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@stylistic/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 23249f4d5..75c4894e1 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ }, "devDependencies": { "@eslint/js": "9.15.0", - "@stylistic/eslint-plugin": "2.10.1", + "@stylistic/eslint-plugin": "2.11.0", "ajv": "8.17.1", "ava": "6.2.0", "c8": "10.1.2", From 770bbce5d42a91bd8a3853a4cddc5191807d1d99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2024 02:21:55 +0000 Subject: [PATCH 28/64] Bump eslint-plugin-n from 17.13.2 to 17.14.0 Bumps [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) from 17.13.2 to 17.14.0. - [Release notes](https://github.com/eslint-community/eslint-plugin-n/releases) - [Changelog](https://github.com/eslint-community/eslint-plugin-n/blob/master/CHANGELOG.md) - [Commits](https://github.com/eslint-community/eslint-plugin-n/compare/v17.13.2...v17.14.0) --- updated-dependencies: - dependency-name: eslint-plugin-n dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 75c4894e1..243823c7c 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "character-entities": "2.0.2", "eslint": "9.15.0", "eslint-plugin-jsdoc": "50.5.0", - "eslint-plugin-n": "17.13.2", + "eslint-plugin-n": "17.14.0", "eslint-plugin-regexp": "2.7.0", "eslint-plugin-unicorn": "56.0.1", "gemoji": "8.1.0", From 9fe9f801dc5069244a068d0d11d27f5ffe0d52dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2024 02:24:20 +0000 Subject: [PATCH 29/64] Bump @microsoft/api-extractor from 7.47.11 to 7.47.12 in /micromark Bumps [@microsoft/api-extractor](https://github.com/microsoft/rushstack/tree/HEAD/apps/api-extractor) from 7.47.11 to 7.47.12. - [Changelog](https://github.com/microsoft/rushstack/blob/main/apps/api-extractor/CHANGELOG.md) - [Commits](https://github.com/microsoft/rushstack/commits/@microsoft/api-extractor_v7.47.12/apps/api-extractor) --- updated-dependencies: - dependency-name: "@microsoft/api-extractor" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- micromark/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micromark/package.json b/micromark/package.json index 722a991e1..58c50af56 100644 --- a/micromark/package.json +++ b/micromark/package.json @@ -31,7 +31,7 @@ "README.md" ], "devDependencies": { - "@microsoft/api-extractor": "7.47.11", + "@microsoft/api-extractor": "7.47.12", "micromark": "4.0.1", "micromark-extension-directive": "3.0.2", "micromark-extension-gfm-autolink-literal": "2.1.0", From e815e1a458736bdb397f43cf1fe409f111e30ad6 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sat, 23 Nov 2024 19:04:28 -0800 Subject: [PATCH 30/64] Simplify README.md slightly by reducing redundancy. --- README.md | 78 +++---------------------------------------------------- 1 file changed, 4 insertions(+), 74 deletions(-) diff --git a/README.md b/README.md index 56e793321..1aa0d77c3 100644 --- a/README.md +++ b/README.md @@ -547,7 +547,7 @@ Type: `Object` implementing the [file system API][node-fs-api] In advanced scenarios, it may be desirable to bypass the default file system API. If a custom file system implementation is provided, `markdownlint` will use -that instead of invoking `require("fs")`. +that instead of using `node:fs`. Note: The only methods called are `readFile` and `readFileSync`. @@ -751,7 +751,7 @@ Type: *Optional* `Object` implementing the [file system API][file-system-api] In advanced scenarios, it may be desirable to bypass the default file system API. If a custom file system implementation is provided, `markdownlint` will use -that instead of invoking `require("fs")`. +that instead of invoking `node:fs`. Note: The only methods called are `readFile`, `readFileSync`, `access`, and `accessSync`. @@ -897,80 +897,10 @@ Output: ``` Integration with the [gulp](https://gulpjs.com/) build system is -straightforward: - -```javascript -const gulp = require("gulp"); -const through2 = require("through2"); -const markdownlint = require("markdownlint"); - -gulp.task("markdownlint", function task() { - return gulp.src("*.md", { "read": false }) - .pipe(through2.obj(function obj(file, enc, next) { - markdownlint( - { "files": [ file.relative ] }, - function callback(err, result) { - const resultString = (result || "").toString(); - if (resultString) { - console.log(resultString); - } - next(err, file); - }); - })); -}); -``` - -Output: - -```text -[00:00:00] Starting 'markdownlint'... -bad.md: 3: MD010/no-hard-tabs Hard tabs [Column: 17] -bad.md: 1: MD018/no-missing-space-atx No space after hash on atx style heading [Context: "#bad.md"] -bad.md: 3: MD018/no-missing-space-atx No space after hash on atx style heading [Context: "#This file fails some rules."] -bad.md: 1: MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "#bad.md"] -[00:00:00] Finished 'markdownlint' after 10 ms -``` +straightforward: [`gulpfile.js`](example/gulpfile.js). Integration with the [Grunt](https://gruntjs.com/) build system is similar: - -```javascript -const markdownlint = require("markdownlint"); - -module.exports = function wrapper(grunt) { - grunt.initConfig({ - "markdownlint": { - "example": { - "src": [ "*.md" ] - } - } - }); - - grunt.registerMultiTask("markdownlint", function task() { - const done = this.async(); - markdownlint( - { "files": this.filesSrc }, - function callback(err, result) { - const resultString = err || ((result || "").toString()); - if (resultString) { - grunt.fail.warn("\n" + resultString + "\n"); - } - done(!err || !resultString); - }); - }); -}; -``` - -Output: - -```text -Running "markdownlint:example" (markdownlint) task -Warning: -bad.md: 3: MD010/no-hard-tabs Hard tabs [Column: 17] -bad.md: 1: MD018/no-missing-space-atx No space after hash on atx style heading [Context: "#bad.md"] -bad.md: 3: MD018/no-missing-space-atx No space after hash on atx style heading [Context: "#This file fails some rules."] -bad.md: 1: MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "#bad.md"] - Use --force to continue. -``` +[`Gruntfile.js`](example/Gruntfile.js). ## Browser From 07ef2bf804ed959cd514e512de6fdcaa708b9ec4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 02:15:42 +0000 Subject: [PATCH 31/64] Bump typescript from 5.6.3 to 5.7.2 Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.6.3 to 5.7.2. - [Release notes](https://github.com/microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml) - [Commits](https://github.com/microsoft/TypeScript/compare/v5.6.3...v5.7.2) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 243823c7c..e39198e6c 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "npm-run-all": "4.1.5", "terser-webpack-plugin": "5.3.10", "toml": "3.0.0", - "typescript": "5.6.3", + "typescript": "5.7.2", "webpack": "5.96.1", "webpack-cli": "5.1.4" }, From 41dda9e0414465d4339690b47e2dd46424a0a4fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 02:13:41 +0000 Subject: [PATCH 32/64] Bump @microsoft/api-extractor from 7.47.12 to 7.48.0 in /micromark Bumps [@microsoft/api-extractor](https://github.com/microsoft/rushstack/tree/HEAD/apps/api-extractor) from 7.47.12 to 7.48.0. - [Changelog](https://github.com/microsoft/rushstack/blob/main/apps/api-extractor/CHANGELOG.md) - [Commits](https://github.com/microsoft/rushstack/commits/@microsoft/api-extractor_v7.48.0/apps/api-extractor) --- updated-dependencies: - dependency-name: "@microsoft/api-extractor" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- micromark/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/micromark/package.json b/micromark/package.json index 58c50af56..e711547ac 100644 --- a/micromark/package.json +++ b/micromark/package.json @@ -31,7 +31,7 @@ "README.md" ], "devDependencies": { - "@microsoft/api-extractor": "7.47.12", + "@microsoft/api-extractor": "7.48.0", "micromark": "4.0.1", "micromark-extension-directive": "3.0.2", "micromark-extension-gfm-autolink-literal": "2.1.0", From 191226f0700675fe24dfa57d3cda1314af7e7134 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Nov 2024 02:45:15 +0000 Subject: [PATCH 33/64] Bump eslint-plugin-jsdoc from 50.5.0 to 50.6.0 Bumps [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) from 50.5.0 to 50.6.0. - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v50.5.0...v50.6.0) --- updated-dependencies: - dependency-name: eslint-plugin-jsdoc dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e39198e6c..15968e7e6 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "c8": "10.1.2", "character-entities": "2.0.2", "eslint": "9.15.0", - "eslint-plugin-jsdoc": "50.5.0", + "eslint-plugin-jsdoc": "50.6.0", "eslint-plugin-n": "17.14.0", "eslint-plugin-regexp": "2.7.0", "eslint-plugin-unicorn": "56.0.1", From 1e71f6f44e39e3c0a0c6d4b00a71c829676c3931 Mon Sep 17 00:00:00 2001 From: David Anson Date: Thu, 28 Nov 2024 20:36:44 -0800 Subject: [PATCH 34/64] Convert markdownlint library to an ECMAScript module, replace markdownlint-micromark with micromark, stop publishing (large) markdownlint-browser.js, see https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c for guidance. --- .github/workflows/ci.yml | 8 - .gitignore | 9 +- .npmignore | 4 +- README.md | 20 +- demo/browser-exports.mjs | 9 + demo/default.htm | 2 - demo/default.js | 17 +- demo/markdownlint-browser.js | 7144 ----------------- demo/markdownlint-exports.js | 8 - demo/module-stub.cjs | 8 + .../{webpack.config.js => webpack.config.mjs} | 39 +- doc-build/build-rules.mjs | 6 +- doc/CustomRules.md | 8 +- eslint.config.mjs | 45 +- example/Gruntfile.cjs | 28 + example/Gruntfile.js | 28 - example/gulpfile.cjs | 24 + example/gulpfile.js | 23 - example/{standalone.js => standalone.mjs} | 11 +- example/typescript/type-check.ts | 32 +- helpers/.npmignore | 2 +- helpers/{helpers.js => helpers.cjs} | 14 +- helpers/micromark-helpers.cjs | 8 +- ...icromark-parse.cjs => micromark-parse.mjs} | 62 +- helpers/micromark-types.d.mts | 11 + helpers/package.json | 11 +- helpers/{shared.js => shared.cjs} | 0 helpers/test.cjs | 2 +- lib/{cache.js => cache.mjs} | 26 +- lib/configuration.d.ts | 2 +- lib/{constants.js => constants.mjs} | 10 +- lib/markdownit.cjs | 14 +- lib/{markdownlint.d.ts => markdownlint.d.mts} | 195 +- lib/{markdownlint.js => markdownlint.mjs} | 57 +- lib/{md001.js => md001.mjs} | 13 +- lib/{md003.js => md003.mjs} | 13 +- lib/{md004.js => md004.mjs} | 13 +- lib/{md005.js => md005.mjs} | 11 +- lib/{md007.js => md007.mjs} | 19 +- lib/{md009.js => md009.mjs} | 13 +- lib/{md010.js => md010.mjs} | 18 +- lib/{md011.js => md011.mjs} | 18 +- lib/{md012.js => md012.mjs} | 13 +- lib/{md013.js => md013.mjs} | 17 +- lib/{md014.js => md014.mjs} | 11 +- lib/{md018.js => md018.mjs} | 13 +- lib/{md019-md021.js => md019-md021.mjs} | 17 +- lib/{md020.js => md020.mjs} | 13 +- lib/{md022.js => md022.mjs} | 13 +- lib/{md023.js => md023.mjs} | 11 +- lib/{md024.js => md024.mjs} | 13 +- lib/{md025.js => md025.mjs} | 13 +- lib/{md026.js => md026.mjs} | 13 +- lib/{md027.js => md027.mjs} | 11 +- lib/{md028.js => md028.mjs} | 11 +- lib/{md029.js => md029.mjs} | 13 +- lib/{md030.js => md030.mjs} | 11 +- lib/{md031.js => md031.mjs} | 17 +- lib/{md032.js => md032.mjs} | 13 +- lib/{md033.js => md033.mjs} | 13 +- lib/{md034.js => md034.mjs} | 11 +- lib/{md035.js => md035.mjs} | 11 +- lib/{md036.js => md036.mjs} | 13 +- lib/{md037.js => md037.mjs} | 11 +- lib/{md038.js => md038.mjs} | 13 +- lib/{md039.js => md039.mjs} | 13 +- lib/{md040.js => md040.mjs} | 13 +- lib/{md041.js => md041.mjs} | 12 +- lib/{md042.js => md042.mjs} | 13 +- lib/{md043.js => md043.mjs} | 13 +- lib/{md044.js => md044.mjs} | 19 +- lib/{md045.js => md045.mjs} | 13 +- lib/{md046.js => md046.mjs} | 11 +- lib/{md047.js => md047.mjs} | 9 +- lib/{md048.js => md048.mjs} | 13 +- lib/{md049-md050.js => md049-md050.mjs} | 19 +- lib/{md051.js => md051.mjs} | 16 +- lib/{md052.js => md052.mjs} | 11 +- lib/{md053.js => md053.mjs} | 11 +- lib/{md054.js => md054.mjs} | 13 +- lib/{md055.js => md055.mjs} | 13 +- lib/{md056.js => md056.mjs} | 15 +- lib/{md058.js => md058.mjs} | 13 +- lib/rules.js | 74 - lib/rules.mjs | 118 + micromark/.npmignore | 6 - micromark/.npmrc | 2 - micromark/LICENSE | 21 - micromark/README.md | 10 - micromark/api-extractor.json | 40 - micromark/exports-html.mjs | 10 - micromark/exports.mjs | 14 - micromark/micromark.d.cts | 1758 ---- micromark/package.json | 46 - micromark/types.d.ts | 34 - micromark/webpack.config.js | 127 - package.json | 43 +- ...ig-example.js => build-config-example.mjs} | 19 +- ...nfig-schema.js => build-config-schema.mjs} | 31 +- scripts/index.js | 29 - scripts/index.mjs | 24 + test/esm-helpers.mjs | 38 + test/harness.mjs | 4 +- ...config.js => markdownlint-test-config.mjs} | 19 +- ....js => markdownlint-test-custom-rules.mjs} | 170 +- ...e.js => markdownlint-test-extra-parse.mjs} | 8 +- ...pe.js => markdownlint-test-extra-type.mjs} | 10 +- ...t-fixes.js => markdownlint-test-fixes.mjs} | 6 +- ...lpers.js => markdownlint-test-helpers.mjs} | 29 +- test/markdownlint-test-micromark.mjs | 10 +- ...llel.js => markdownlint-test-parallel.mjs} | 20 +- ...> markdownlint-test-repos-dotnet-docs.mjs} | 9 +- ...> markdownlint-test-repos-mdn-content.mjs} | 9 +- ...l.js => markdownlint-test-repos-small.mjs} | 9 +- ...t-repos.js => markdownlint-test-repos.mjs} | 25 +- ...js => markdownlint-test-result-object.mjs} | 12 +- ...ios.js => markdownlint-test-scenarios.mjs} | 21 +- test/markdownlint-test-worker.js | 16 - test/markdownlint-test-worker.mjs | 13 + ...downlint-test.js => markdownlint-test.mjs} | 92 +- test/profile-fixture.mjs | 2 +- .../{any-blockquote.js => any-blockquote.cjs} | 2 +- .../{every-n-lines.js => every-n-lines.cjs} | 2 +- test/rules/{first-line.js => first-line.cjs} | 2 +- .../rules/{letters-E-X.js => letters-E-X.cjs} | 2 +- ...lint-javascript.js => lint-javascript.cjs} | 2 +- test/rules/npm/package.json | 1 + test/rules/npm/sample-rule.js | 2 +- test/rules/{rules.js => rules.cjs} | 12 +- .../{validate-json.js => validate-json.cjs} | 2 +- ... => markdownlint-test-custom-rules.mjs.md} | 4 +- ...> markdownlint-test-custom-rules.mjs.snap} | Bin ...arkdownlint-test-repos-dotnet-docs.mjs.md} | 4 +- ...kdownlint-test-repos-dotnet-docs.mjs.snap} | Bin ...arkdownlint-test-repos-mdn-content.mjs.md} | 4 +- ...kdownlint-test-repos-mdn-content.mjs.snap} | Bin ...d => markdownlint-test-repos-small.mjs.md} | 4 +- ...=> markdownlint-test-repos-small.mjs.snap} | Bin ....md => markdownlint-test-scenarios.mjs.md} | 4 +- ...p => markdownlint-test-scenarios.mjs.snap} | Bin 140 files changed, 1087 insertions(+), 10428 deletions(-) create mode 100644 demo/browser-exports.mjs delete mode 100644 demo/markdownlint-browser.js delete mode 100644 demo/markdownlint-exports.js create mode 100644 demo/module-stub.cjs rename demo/{webpack.config.js => webpack.config.mjs} (70%) create mode 100644 example/Gruntfile.cjs delete mode 100644 example/Gruntfile.js create mode 100644 example/gulpfile.cjs delete mode 100644 example/gulpfile.js rename example/{standalone.js => standalone.mjs} (69%) rename helpers/{helpers.js => helpers.cjs} (96%) rename helpers/{micromark-parse.cjs => micromark-parse.mjs} (84%) create mode 100644 helpers/micromark-types.d.mts rename helpers/{shared.js => shared.cjs} (100%) rename lib/{cache.js => cache.mjs} (62%) rename lib/{constants.js => constants.mjs} (60%) rename lib/{markdownlint.d.ts => markdownlint.d.mts} (84%) rename lib/{markdownlint.js => markdownlint.mjs} (97%) rename lib/{md001.js => md001.mjs} (67%) rename lib/{md003.js => md003.mjs} (81%) rename lib/{md004.js => md004.mjs} (87%) rename lib/{md005.js => md005.mjs} (90%) rename lib/{md007.js => md007.mjs} (83%) rename lib/{md009.js => md009.mjs} (91%) rename lib/{md010.js => md010.mjs} (84%) rename lib/{md011.js => md011.mjs} (79%) rename lib/{md012.js => md012.mjs} (77%) rename lib/{md013.js => md013.mjs} (90%) rename lib/{md014.js => md014.mjs} (86%) rename lib/{md018.js => md018.mjs} (78%) rename lib/{md019-md021.js => md019-md021.mjs} (81%) rename lib/{md020.js => md020.mjs} (87%) rename lib/{md022.js => md022.mjs} (88%) rename lib/{md023.js => md023.mjs} (81%) rename lib/{md024.js => md024.mjs} (78%) rename lib/{md025.js => md025.mjs} (74%) rename lib/{md026.js => md026.mjs} (79%) rename lib/{md027.js => md027.mjs} (82%) rename lib/{md028.js => md028.mjs} (84%) rename lib/{md029.js => md029.mjs} (87%) rename lib/{md030.js => md030.mjs} (89%) rename lib/{md031.js => md031.mjs} (80%) rename lib/{md032.js => md032.mjs} (85%) rename lib/{md033.js => md033.mjs} (75%) rename lib/{md034.js => md034.mjs} (89%) rename lib/{md035.js => md035.mjs} (70%) rename lib/{md036.js => md036.mjs} (80%) rename lib/{md037.js => md037.mjs} (92%) rename lib/{md038.js => md038.mjs} (91%) rename lib/{md039.js => md039.mjs} (88%) rename lib/{md040.js => md040.mjs} (78%) rename lib/{md041.js => md041.mjs} (78%) rename lib/{md042.js => md042.mjs} (86%) rename lib/{md043.js => md043.mjs} (85%) rename lib/{md044.js => md044.mjs} (87%) rename lib/{md045.js => md045.mjs} (81%) rename lib/{md046.js => md046.mjs} (75%) rename lib/{md047.js => md047.mjs} (77%) rename lib/{md048.js => md048.mjs} (79%) rename lib/{md049-md050.js => md049-md050.mjs} (84%) rename lib/{md051.js => md051.mjs} (92%) rename lib/{md052.js => md052.mjs} (84%) rename lib/{md053.js => md053.mjs} (88%) rename lib/{md054.js => md054.mjs} (92%) rename lib/{md055.js => md055.mjs} (91%) rename lib/{md056.js => md056.mjs} (81%) rename lib/{md058.js => md058.mjs} (81%) delete mode 100644 lib/rules.js create mode 100644 lib/rules.mjs delete mode 100644 micromark/.npmignore delete mode 100644 micromark/.npmrc delete mode 100644 micromark/LICENSE delete mode 100644 micromark/README.md delete mode 100644 micromark/api-extractor.json delete mode 100644 micromark/exports-html.mjs delete mode 100644 micromark/exports.mjs delete mode 100644 micromark/micromark.d.cts delete mode 100644 micromark/package.json delete mode 100644 micromark/types.d.ts delete mode 100644 micromark/webpack.config.js rename schema/{build-config-example.js => build-config-example.mjs} (76%) rename schema/{build-config-schema.js => build-config-schema.mjs} (94%) delete mode 100644 scripts/index.js create mode 100644 scripts/index.mjs create mode 100644 test/esm-helpers.mjs rename test/{markdownlint-test-config.js => markdownlint-test-config.mjs} (96%) rename test/{markdownlint-test-custom-rules.js => markdownlint-test-custom-rules.mjs} (91%) rename test/{markdownlint-test-extra-parse.js => markdownlint-test-extra-parse.mjs} (61%) rename test/{markdownlint-test-extra-type.js => markdownlint-test-extra-type.mjs} (76%) rename test/{markdownlint-test-fixes.js => markdownlint-test-fixes.mjs} (98%) rename test/{markdownlint-test-helpers.js => markdownlint-test-helpers.mjs} (95%) rename test/{markdownlint-test-parallel.js => markdownlint-test-parallel.mjs} (63%) rename test/{markdownlint-test-repos-dotnet-docs.js => markdownlint-test-repos-dotnet-docs.mjs} (64%) rename test/{markdownlint-test-repos-mdn-content.js => markdownlint-test-repos-mdn-content.mjs} (64%) rename test/{markdownlint-test-repos-small.js => markdownlint-test-repos-small.mjs} (94%) rename test/{markdownlint-test-repos.js => markdownlint-test-repos.mjs} (75%) rename test/{markdownlint-test-result-object.js => markdownlint-test-result-object.mjs} (98%) rename test/{markdownlint-test-scenarios.js => markdownlint-test-scenarios.mjs} (88%) delete mode 100644 test/markdownlint-test-worker.js create mode 100644 test/markdownlint-test-worker.mjs rename test/{markdownlint-test.js => markdownlint-test.mjs} (93%) rename test/rules/{any-blockquote.js => any-blockquote.cjs} (96%) rename test/rules/{every-n-lines.js => every-n-lines.cjs} (88%) rename test/rules/{first-line.js => first-line.cjs} (85%) rename test/rules/{letters-E-X.js => letters-E-X.cjs} (93%) rename test/rules/{lint-javascript.js => lint-javascript.cjs} (94%) rename test/rules/{rules.js => rules.cjs} (57%) rename test/rules/{validate-json.js => validate-json.cjs} (94%) rename test/snapshots/{markdownlint-test-custom-rules.js.md => markdownlint-test-custom-rules.mjs.md} (99%) rename test/snapshots/{markdownlint-test-custom-rules.js.snap => markdownlint-test-custom-rules.mjs.snap} (100%) rename test/snapshots/{markdownlint-test-repos-dotnet-docs.js.md => markdownlint-test-repos-dotnet-docs.mjs.md} (98%) rename test/snapshots/{markdownlint-test-repos-dotnet-docs.js.snap => markdownlint-test-repos-dotnet-docs.mjs.snap} (100%) rename test/snapshots/{markdownlint-test-repos-mdn-content.js.md => markdownlint-test-repos-mdn-content.mjs.md} (92%) rename test/snapshots/{markdownlint-test-repos-mdn-content.js.snap => markdownlint-test-repos-mdn-content.mjs.snap} (100%) rename test/snapshots/{markdownlint-test-repos-small.js.md => markdownlint-test-repos-small.mjs.md} (99%) rename test/snapshots/{markdownlint-test-repos-small.js.snap => markdownlint-test-repos-small.mjs.snap} (100%) rename test/snapshots/{markdownlint-test-scenarios.js.md => markdownlint-test-scenarios.mjs.md} (99%) rename test/snapshots/{markdownlint-test-scenarios.js.snap => markdownlint-test-scenarios.mjs.snap} (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 71575beba..caf1600be 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,11 +30,3 @@ jobs: run: npm install --no-package-lock - name: Run CI Tests run: npm run ci - - name: Install markdownlint-micromark Dependencies - run: npm run install-micromark - - name: Build markdownlint-micromark - run: npm run build-micromark - - name: Install local markdownlint-micromark - run: npm install --no-package-lock ./micromark - - name: Test with local markdownlint-micromark - run: npm test diff --git a/.gitignore b/.gitignore index 7fbbcd55d..7a56a13be 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,7 @@ coverage demo/markdown-it.min.js +demo/markdownlint-browser.js demo/markdownlint-browser.min.js -demo/micromark-browser.js -demo/micromark-html-browser.js -micromark/micromark.cjs -micromark/micromark.dev.cjs -micromark/micromark-browser.js -micromark/micromark-browser.dev.js -micromark/micromark-html-browser.js -micromark/micromark-html-browser.dev.js node_modules !test/node_modules npm-debug.log diff --git a/.npmignore b/.npmignore index 0b1a6d4f0..a1867b2ad 100644 --- a/.npmignore +++ b/.npmignore @@ -5,13 +5,11 @@ .vscode coverage demo/* -!demo/markdownlint-browser.js doc-build eslint.config.mjs example -micromark npm-debug.log -schema/*.js +schema/*.mjs scripts test test-repos diff --git a/README.md b/README.md index 1aa0d77c3..b7d7ba1c2 100644 --- a/README.md +++ b/README.md @@ -798,12 +798,10 @@ function applyFixes(input, errors) { ... } Invoking `applyFixes` with the results of a call to lint can be done like so: ```javascript -const { "sync": markdownlintSync, applyFixes } = require("markdownlint"); +import markdownlint from "markdownlint"; -function fixMarkdownlintViolations(content) { - const fixResults = markdownlintSync({ strings: { content } }); - return applyFixes(content, fixResults.content); -} +const fixResults = markdownlint.sync({ "strings": { "content": original } }); +const fixed = markdownlint.applyFixes(original, fixResults.content); ``` ## Usage @@ -811,7 +809,7 @@ function fixMarkdownlintViolations(content) { Invoke `markdownlint` and use the `result` object's `toString` method: ```javascript -const markdownlint = require("markdownlint"); +import markdownlint from "markdownlint"; const options = { "files": [ "good.md", "bad.md" ], @@ -897,10 +895,10 @@ Output: ``` Integration with the [gulp](https://gulpjs.com/) build system is -straightforward: [`gulpfile.js`](example/gulpfile.js). +straightforward: [`gulpfile.cjs`](example/gulpfile.cjs). Integration with the [Grunt](https://gruntjs.com/) build system is similar: -[`Gruntfile.js`](example/Gruntfile.js). +[`Gruntfile.cjs`](example/Gruntfile.cjs). ## Browser @@ -912,11 +910,9 @@ Generate normal and minified scripts with: npm run build-demo ``` -Then reference `markdownlint` and `micromark` scripts: +Then reference the `markdownlint` script: ```html - - ``` @@ -928,7 +924,7 @@ const options = { "content": "Some Markdown to lint." } }; -const results = window.markdownlint.sync(options).toString(); +const results = window.markdownlint.markdownlint.sync(options).toString(); ``` ## Examples diff --git a/demo/browser-exports.mjs b/demo/browser-exports.mjs new file mode 100644 index 000000000..b1e8acf2d --- /dev/null +++ b/demo/browser-exports.mjs @@ -0,0 +1,9 @@ +// @ts-check + +export { default as markdownlint } from "../lib/markdownlint.mjs"; +export { compile, parse, postprocess, preprocess } from "micromark"; +export { directive, directiveHtml } from "micromark-extension-directive"; +export { gfmAutolinkLiteral, gfmAutolinkLiteralHtml } from "micromark-extension-gfm-autolink-literal"; +export { gfmFootnote, gfmFootnoteHtml } from "micromark-extension-gfm-footnote"; +export { gfmTable, gfmTableHtml } from "micromark-extension-gfm-table"; +export { math, mathHtml } from "micromark-extension-math"; diff --git a/demo/default.htm b/demo/default.htm index 32a8f2045..4c1bc442b 100644 --- a/demo/default.htm +++ b/demo/default.htm @@ -34,8 +34,6 @@ - - diff --git a/demo/default.js b/demo/default.js index 73eeaa653..27fffc510 100644 --- a/demo/default.js +++ b/demo/default.js @@ -3,9 +3,8 @@ (function main() { // Dependencies var markdownit = globalThis.markdownit; - var markdownlint = globalThis.markdownlint.library; - var micromark = globalThis.micromarkBrowser; - var micromarkHtml = globalThis.micromarkHtmlBrowser; + var markdownlint = globalThis.markdownlint.markdownlint; + var micromark = globalThis.markdownlint; // DOM elements var markdown = document.getElementById("markdown"); @@ -70,15 +69,15 @@ const compileOptions = { "allowDangerousHtml": true, "htmlExtensions": [ - micromarkHtml.directiveHtml({ "*": handleDirective }), - micromarkHtml.gfmAutolinkLiteralHtml(), - micromarkHtml.gfmFootnoteHtml(), - micromarkHtml.gfmTableHtml(), - micromarkHtml.mathHtml() + micromark.directiveHtml({ "*": handleDirective }), + micromark.gfmAutolinkLiteralHtml(), + micromark.gfmFootnoteHtml(), + micromark.gfmTableHtml(), + micromark.mathHtml() ] }; try { - return micromarkHtml.compile(compileOptions)(events); + return micromark.compile(compileOptions)(events); } catch (error) { return `[Exception: "${error}"]`; } diff --git a/demo/markdownlint-browser.js b/demo/markdownlint-browser.js deleted file mode 100644 index 5a3ee76a7..000000000 --- a/demo/markdownlint-browser.js +++ /dev/null @@ -1,7144 +0,0 @@ -/*! markdownlint 0.36.1 https://github.com/DavidAnson/markdownlint @license MIT */ -var markdownlint; -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "../helpers/helpers.js": -/*!*****************************!*\ - !*** ../helpers/helpers.js ***! - \*****************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const micromark = __webpack_require__(/*! ./micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); - -const { newLineRe, nextLinesRe } = __webpack_require__(/*! ./shared.js */ "../helpers/shared.js"); - -module.exports.newLineRe = newLineRe; -module.exports.nextLinesRe = nextLinesRe; - -/** @typedef {import("../lib/markdownlint.js").RuleOnError} RuleOnError */ -/** @typedef {import("../lib/markdownlint.js").RuleOnErrorFixInfo} RuleOnErrorFixInfo */ - -// Regular expression for matching common front matter (YAML and TOML) -module.exports.frontMatterRe = - /((^---[^\S\r\n\u2028\u2029]*$[\s\S]+?^---\s*)|(^\+\+\+[^\S\r\n\u2028\u2029]*$[\s\S]+?^(\+\+\+|\.\.\.)\s*)|(^\{[^\S\r\n\u2028\u2029]*$[\s\S]+?^\}\s*))(\r\n|\r|\n|$)/m; - -// Regular expression for matching the start of inline disable/enable comments -const inlineCommentStartRe = - /()/gi; -module.exports.inlineCommentStartRe = inlineCommentStartRe; - -// Regular expression for identifying an HTML entity at the end of a line -module.exports.endOfLineHtmlEntityRe = - /&(?:#\d+|#[xX][\da-fA-F]+|[a-zA-Z]{2,31}|blk\d{2}|emsp1[34]|frac\d{2}|sup\d|there4);$/; - -// Regular expression for identifying a GitHub emoji code at the end of a line -module.exports.endOfLineGemojiCodeRe = - /:(?:[abmovx]|[-+]1|100|1234|(?:1st|2nd|3rd)_place_medal|8ball|clock\d{1,4}|e-mail|non-potable_water|o2|t-rex|u5272|u5408|u55b6|u6307|u6708|u6709|u6e80|u7121|u7533|u7981|u7a7a|[a-z]{2,15}2?|[a-z]{1,14}(?:_[a-z\d]{1,16})+):$/; - -// All punctuation characters (normal and full-width) -const allPunctuation = ".,;:!?。,;:!?"; -module.exports.allPunctuation = allPunctuation; - -// All punctuation characters without question mark (normal and full-width) -module.exports.allPunctuationNoQuestion = allPunctuation.replace(/[??]/gu, ""); - -/** - * Returns true iff the input is a Number. - * - * @param {Object} obj Object of unknown type. - * @returns {boolean} True iff obj is a Number. - */ -function isNumber(obj) { - return typeof obj === "number"; -} -module.exports.isNumber = isNumber; - -/** - * Returns true iff the input is a String. - * - * @param {Object} obj Object of unknown type. - * @returns {boolean} True iff obj is a String. - */ -function isString(obj) { - return typeof obj === "string"; -} -module.exports.isString = isString; - -/** - * Returns true iff the input String is empty. - * - * @param {string} str String of unknown length. - * @returns {boolean} True iff the input String is empty. - */ -function isEmptyString(str) { - return str.length === 0; -} -module.exports.isEmptyString = isEmptyString; - -/** - * Returns true iff the input is an Object. - * - * @param {Object} obj Object of unknown type. - * @returns {boolean} True iff obj is an Object. - */ -function isObject(obj) { - return !!obj && (typeof obj === "object") && !Array.isArray(obj); -} -module.exports.isObject = isObject; - -/** - * Returns true iff the input is a URL. - * - * @param {Object} obj Object of unknown type. - * @returns {boolean} True iff obj is a URL. - */ -function isUrl(obj) { - return !!obj && (Object.getPrototypeOf(obj) === URL.prototype); -} -module.exports.isUrl = isUrl; - -/** - * Clones the input if it is an Array. - * - * @param {Object} arr Object of unknown type. - * @returns {Object} Clone of obj iff obj is an Array. - */ -function cloneIfArray(arr) { - return Array.isArray(arr) ? [ ...arr ] : arr; -} -module.exports.cloneIfArray = cloneIfArray; - -/** - * Clones the input if it is a URL. - * - * @param {Object} url Object of unknown type. - * @returns {Object} Clone of obj iff obj is a URL. - */ -function cloneIfUrl(url) { - return isUrl(url) ? new URL(url) : url; -} -module.exports.cloneIfUrl = cloneIfUrl; - -/** - * Gets a Regular Expression for matching the specified HTML attribute. - * - * @param {string} name HTML attribute name. - * @returns {RegExp} Regular Expression for matching. - */ -module.exports.getHtmlAttributeRe = function getHtmlAttributeRe(name) { - return new RegExp(`\\s${name}\\s*=\\s*['"]?([^'"\\s>]*)`, "iu"); -}; - -/** - * Returns true iff the input line is blank (contains nothing, whitespace, or - * comments (unclosed start/end comments allowed)). - * - * @param {string} line Input line. - * @returns {boolean} True iff line is blank. - */ -function isBlankLine(line) { - const startComment = ""; - const removeComments = (s) => { - while (true) { - const start = s.indexOf(startComment); - const end = s.indexOf(endComment); - if ((end !== -1) && ((start === -1) || (end < start))) { - // Unmatched end comment is first - s = s.slice(end + endComment.length); - } else if ((start !== -1) && (end !== -1)) { - // Start comment is before end comment - s = s.slice(0, start) + s.slice(end + endComment.length); - } else if ((start !== -1) && (end === -1)) { - // Unmatched start comment is last - s = s.slice(0, start); - } else { - // No more comments to remove - return s; - } - } - }; - return ( - !line || - !line.trim() || - !removeComments(line).replace(/>/g, "").trim() - ); -} -module.exports.isBlankLine = isBlankLine; - -// Replaces the content of properly-formatted CommonMark comments with "." -// This preserves the line/column information for the rest of the document -// https://spec.commonmark.org/0.29/#html-blocks -// https://spec.commonmark.org/0.29/#html-comment -const htmlCommentBegin = ""; -const safeCommentCharacter = "."; -const startsWithPipeRe = /^ *\|/; -const notCrLfRe = /[^\r\n]/g; -const notSpaceCrLfRe = /[^ \r\n]/g; -const trailingSpaceRe = / +[\r\n]/g; -const replaceTrailingSpace = (s) => s.replace(notCrLfRe, safeCommentCharacter); -module.exports.clearHtmlCommentText = function clearHtmlCommentText(text) { - let i = 0; - while ((i = text.indexOf(htmlCommentBegin, i)) !== -1) { - const j = text.indexOf(htmlCommentEnd, i + 2); - if (j === -1) { - // Un-terminated comments are treated as text - break; - } - // If the comment has content... - if (j > i + htmlCommentBegin.length) { - const content = text.slice(i + htmlCommentBegin.length, j); - const lastLf = text.lastIndexOf("\n", i) + 1; - const preText = text.slice(lastLf, i); - const isBlock = preText.trim().length === 0; - const couldBeTable = startsWithPipeRe.test(preText); - const spansTableCells = couldBeTable && content.includes("\n"); - const isValid = - isBlock || - !( - spansTableCells || - content.startsWith(">") || - content.startsWith("->") || - content.endsWith("-") || - content.includes("--") - ); - // If a valid block/inline comment... - if (isValid) { - const clearedContent = content - .replace(notSpaceCrLfRe, safeCommentCharacter) - .replace(trailingSpaceRe, replaceTrailingSpace); - text = - text.slice(0, i + htmlCommentBegin.length) + - clearedContent + - text.slice(j); - } - } - i = j + htmlCommentEnd.length; - } - return text; -}; - -// Escapes a string for use in a RegExp -module.exports.escapeForRegExp = function escapeForRegExp(str) { - return str.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&"); -}; - -/** - * Adds ellipsis to the left/right/middle of the specified text. - * - * @param {string} text Text to ellipsify. - * @param {boolean} [start] True iff the start of the text is important. - * @param {boolean} [end] True iff the end of the text is important. - * @returns {string} Ellipsified text. - */ -function ellipsify(text, start, end) { - if (text.length <= 30) { - // Nothing to do - } else if (start && end) { - text = text.slice(0, 15) + "..." + text.slice(-15); - } else if (end) { - text = "..." + text.slice(-30); - } else { - text = text.slice(0, 30) + "..."; - } - return text; -} -module.exports.ellipsify = ellipsify; - -/** - * Adds a generic error object via the onError callback. - * - * @param {RuleOnError} onError RuleOnError instance. - * @param {number} lineNumber Line number. - * @param {string} [detail] Error details. - * @param {string} [context] Error context. - * @param {number[]} [range] Column and length of error. - * @param {RuleOnErrorFixInfo} [fixInfo] RuleOnErrorFixInfo instance. - * @returns {void} - */ -function addError(onError, lineNumber, detail, context, range, fixInfo) { - onError({ - lineNumber, - detail, - context, - range, - fixInfo - }); -} -module.exports.addError = addError; - -/** - * Adds an error object with details conditionally via the onError callback. - * - * @param {RuleOnError} onError RuleOnError instance. - * @param {number} lineNumber Line number. - * @param {Object} expected Expected value. - * @param {Object} actual Actual value. - * @param {string} [detail] Error details. - * @param {string} [context] Error context. - * @param {number[]} [range] Column and length of error. - * @param {RuleOnErrorFixInfo} [fixInfo] RuleOnErrorFixInfo instance. - * @returns {void} - */ -function addErrorDetailIf( - onError, lineNumber, expected, actual, detail, context, range, fixInfo) { - if (expected !== actual) { - addError( - onError, - lineNumber, - "Expected: " + expected + "; Actual: " + actual + - (detail ? "; " + detail : ""), - context, - range, - fixInfo); - } -} -module.exports.addErrorDetailIf = addErrorDetailIf; - -/** - * Adds an error object with context via the onError callback. - * - * @param {RuleOnError} onError RuleOnError instance. - * @param {number} lineNumber Line number. - * @param {string} context Error context. - * @param {boolean} [start] True iff the start of the text is important. - * @param {boolean} [end] True iff the end of the text is important. - * @param {number[]} [range] Column and length of error. - * @param {RuleOnErrorFixInfo} [fixInfo] RuleOnErrorFixInfo instance. - * @returns {void} - */ -function addErrorContext( - onError, lineNumber, context, start, end, range, fixInfo) { - context = ellipsify(context, start, end); - addError(onError, lineNumber, undefined, context, range, fixInfo); -} -module.exports.addErrorContext = addErrorContext; - -/** - * Defines a range within a file (start line/column to end line/column, subset of MicromarkToken). - * - * @typedef {Object} FileRange - * @property {number} startLine Start line (1-based). - * @property {number} startColumn Start column (1-based). - * @property {number} endLine End line (1-based). - * @property {number} endColumn End column (1-based). - */ - -/** - * Returns whether line/column A is less than or equal to line/column B. - * - * @param {number} lineA Line A. - * @param {number} columnA Column A. - * @param {number} lineB Line B. - * @param {number} columnB Column B. - * @returns {boolean} True iff A is less than or equal to B. - */ -const positionLessThanOrEqual = (lineA, columnA, lineB, columnB) => ( - (lineA < lineB) || - ((lineA === lineB) && (columnA <= columnB)) -); - -/** - * Returns whether two ranges (or MicromarkTokens) overlap anywhere. - * - * @param {FileRange|import("../lib/markdownlint.js").MicromarkToken} rangeA Range A. - * @param {FileRange|import("../lib/markdownlint.js").MicromarkToken} rangeB Range B. - * @returns {boolean} True iff the two ranges overlap. - */ -module.exports.hasOverlap = function hasOverlap(rangeA, rangeB) { - const lte = positionLessThanOrEqual(rangeA.startLine, rangeA.startColumn, rangeB.startLine, rangeB.startColumn); - const first = lte ? rangeA : rangeB; - const second = lte ? rangeB : rangeA; - return positionLessThanOrEqual(second.startLine, second.startColumn, first.endLine, first.endColumn); -}; - -// Determines if the front matter includes a title -module.exports.frontMatterHasTitle = - function frontMatterHasTitle(frontMatterLines, frontMatterTitlePattern) { - const ignoreFrontMatter = - (frontMatterTitlePattern !== undefined) && !frontMatterTitlePattern; - const frontMatterTitleRe = - new RegExp( - String(frontMatterTitlePattern || "^\\s*\"?title\"?\\s*[:=]"), - "i" - ); - return !ignoreFrontMatter && - frontMatterLines.some((line) => frontMatterTitleRe.test(line)); - }; - -/** - * Returns an object with information about reference links and images. - * - * @param {import("../helpers/micromark-helpers.cjs").Token[]} tokens Micromark tokens. - * @returns {Object} Reference link/image data. - */ -function getReferenceLinkImageData(tokens) { - const normalizeReference = (s) => s.toLowerCase().trim().replace(/\s+/g, " "); - const references = new Map(); - const shortcuts = new Map(); - const addReferenceToDictionary = (token, label, isShortcut) => { - const referenceDatum = [ - token.startLine - 1, - token.startColumn - 1, - token.text.length - ]; - const reference = normalizeReference(label); - const dictionary = isShortcut ? shortcuts : references; - const referenceData = dictionary.get(reference) || []; - referenceData.push(referenceDatum); - dictionary.set(reference, referenceData); - }; - const definitions = new Map(); - const definitionLineIndices = []; - const duplicateDefinitions = []; - const filteredTokens = - micromark.filterByTypes( - tokens, - [ - // definitionLineIndices - "definition", "gfmFootnoteDefinition", - // definitions and definitionLineIndices - "definitionLabelString", "gfmFootnoteDefinitionLabelString", - // references and shortcuts - "gfmFootnoteCall", "image", "link", - // undefined link labels - "undefinedReferenceCollapsed", "undefinedReferenceFull", "undefinedReferenceShortcut" - ] - ); - for (const token of filteredTokens) { - let labelPrefix = ""; - // eslint-disable-next-line default-case - switch (token.type) { - case "definition": - case "gfmFootnoteDefinition": - // definitionLineIndices - for (let i = token.startLine; i <= token.endLine; i++) { - definitionLineIndices.push(i - 1); - } - break; - case "gfmFootnoteDefinitionLabelString": - labelPrefix = "^"; - case "definitionLabelString": // eslint-disable-line no-fallthrough - { - // definitions and definitionLineIndices - const reference = normalizeReference(`${labelPrefix}${token.text}`); - if (definitions.has(reference)) { - duplicateDefinitions.push([ reference, token.startLine - 1 ]); - } else { - const parent = - micromark.getParentOfType(token, [ "definition" ]); - const destinationString = parent && - micromark.getDescendantsByType(parent, [ "definitionDestination", "definitionDestinationRaw", "definitionDestinationString" ])[0]?.text; - definitions.set( - reference, - [ token.startLine - 1, destinationString ] - ); - } - } - break; - case "gfmFootnoteCall": - case "image": - case "link": - { - // Identify if shortcut or full/collapsed - let isShortcut = (token.children.length === 1); - const isFullOrCollapsed = (token.children.length === 2) && !token.children.some((t) => t.type === "resource"); - const [ labelText ] = micromark.getDescendantsByType(token, [ "label", "labelText" ]); - const [ referenceString ] = micromark.getDescendantsByType(token, [ "reference", "referenceString" ]); - let label = labelText?.text; - // Identify if footnote - if (!isShortcut && !isFullOrCollapsed) { - const [ footnoteCallMarker, footnoteCallString ] = token.children.filter( - (t) => [ "gfmFootnoteCallMarker", "gfmFootnoteCallString" ].includes(t.type) - ); - if (footnoteCallMarker && footnoteCallString) { - label = `${footnoteCallMarker.text}${footnoteCallString.text}`; - isShortcut = true; - } - } - // Track link (handle shortcuts separately due to ambiguity in "text [text] text") - if (isShortcut || isFullOrCollapsed) { - addReferenceToDictionary(token, referenceString?.text || label, isShortcut); - } - } - break; - case "undefinedReferenceCollapsed": - case "undefinedReferenceFull": - case "undefinedReferenceShortcut": - { - const undefinedReference = micromark.getDescendantsByType(token, [ "undefinedReference" ])[0]; - const label = undefinedReference.children.map((t) => t.text).join(""); - const isShortcut = (token.type === "undefinedReferenceShortcut"); - addReferenceToDictionary(token, label, isShortcut); - } - break; - } - } - return { - references, - shortcuts, - definitions, - duplicateDefinitions, - definitionLineIndices - }; -} -module.exports.getReferenceLinkImageData = getReferenceLinkImageData; - -/** - * Gets the most common line ending, falling back to the platform default. - * - * @param {string} input Markdown content to analyze. - * @param {Object} [os] Node.js "os" module. - * @returns {string} Preferred line ending. - */ -function getPreferredLineEnding(input, os) { - let cr = 0; - let lf = 0; - let crlf = 0; - const endings = input.match(newLineRe) || []; - for (const ending of endings) { - // eslint-disable-next-line default-case - switch (ending) { - case "\r": - cr++; - break; - case "\n": - lf++; - break; - case "\r\n": - crlf++; - break; - } - } - let preferredLineEnding = null; - if (!cr && !lf && !crlf) { - preferredLineEnding = (os && os.EOL) || "\n"; - } else if ((lf >= crlf) && (lf >= cr)) { - preferredLineEnding = "\n"; - } else if (crlf >= cr) { - preferredLineEnding = "\r\n"; - } else { - preferredLineEnding = "\r"; - } - return preferredLineEnding; -} -module.exports.getPreferredLineEnding = getPreferredLineEnding; - -/** - * Expands a path with a tilde to an absolute path. - * - * @param {string} file Path that may begin with a tilde. - * @param {Object} os Node.js "os" module. - * @returns {string} Absolute path (or original path). - */ -function expandTildePath(file, os) { - const homedir = os && os.homedir && os.homedir(); - return homedir ? file.replace(/^~($|\/|\\)/, `${homedir}$1`) : file; -} -module.exports.expandTildePath = expandTildePath; - - -/***/ }), - -/***/ "../helpers/shared.js": -/*!****************************!*\ - !*** ../helpers/shared.js ***! - \****************************/ -/***/ ((module) => { - -"use strict"; -// @ts-check - - - -// Symbol for identifing the flat tokens array from micromark parse -module.exports.flatTokensSymbol = Symbol("flat-tokens"); - -// Symbol for identifying the htmlFlow token from micromark parse -module.exports.htmlFlowSymbol = Symbol("html-flow"); - -// Regular expression for matching common newline characters -// See NEWLINES_RE in markdown-it/lib/rules_core/normalize.js -module.exports.newLineRe = /\r\n?|\n/g; - -// Regular expression for matching next lines -module.exports.nextLinesRe = /[\r\n][\s\S]*$/; - - -/***/ }), - -/***/ "../lib sync recursive": -/*!********************!*\ - !*** ../lib/ sync ***! - \********************/ -/***/ ((module) => { - -function webpackEmptyContext(req) { - var e = new Error("Cannot find module '" + req + "'"); - e.code = 'MODULE_NOT_FOUND'; - throw e; -} -webpackEmptyContext.keys = () => ([]); -webpackEmptyContext.resolve = webpackEmptyContext; -webpackEmptyContext.id = "../lib sync recursive"; -module.exports = webpackEmptyContext; - -/***/ }), - -/***/ "markdown-it": -/*!*****************************!*\ - !*** external "markdownit" ***! - \*****************************/ -/***/ ((module) => { - -"use strict"; -module.exports = markdownit; - -/***/ }), - -/***/ "markdownlint-micromark": -/*!***********************************!*\ - !*** external "micromarkBrowser" ***! - \***********************************/ -/***/ ((module) => { - -"use strict"; -module.exports = micromarkBrowser; - -/***/ }), - -/***/ "?d0ee": -/*!*************************!*\ - !*** node:fs (ignored) ***! - \*************************/ -/***/ (() => { - -/* (ignored) */ - -/***/ }), - -/***/ "?e6c4": -/*!*************************!*\ - !*** node:os (ignored) ***! - \*************************/ -/***/ (() => { - -/* (ignored) */ - -/***/ }), - -/***/ "?9a52": -/*!***************************!*\ - !*** node:path (ignored) ***! - \***************************/ -/***/ (() => { - -/* (ignored) */ - -/***/ }), - -/***/ "?39e5": -/*!***************************!*\ - !*** node:util (ignored) ***! - \***************************/ -/***/ (() => { - -/* (ignored) */ - -/***/ }), - -/***/ "./markdownlint-exports.js": -/*!*********************************!*\ - !*** ./markdownlint-exports.js ***! - \*********************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -module.exports = { - "library": __webpack_require__(/*! .. */ "../lib/markdownlint.js"), - "helpers": __webpack_require__(/*! ../helpers */ "../helpers/helpers.js") -}; - - -/***/ }), - -/***/ "../helpers/micromark-helpers.cjs": -/*!****************************************!*\ - !*** ../helpers/micromark-helpers.cjs ***! - \****************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { flatTokensSymbol, htmlFlowSymbol } = __webpack_require__(/*! ./shared.js */ "../helpers/shared.js"); - -/** @typedef {import("markdownlint-micromark").TokenType} TokenType */ -/** @typedef {import("../lib/markdownlint.js").MicromarkToken} Token */ - -/** - * Determines if a Micromark token is within an htmlFlow type. - * - * @param {Token} token Micromark token. - * @returns {boolean} True iff the token is within an htmlFlow type. - */ -function inHtmlFlow(token) { - return Boolean(token[htmlFlowSymbol]); -} - -/** - * Returns whether a token is an htmlFlow type containing an HTML comment. - * - * @param {Token} token Micromark token. - * @returns {boolean} True iff token is htmlFlow containing a comment. - */ -function isHtmlFlowComment(token) { - const { text, type } = token; - if ( - (type === "htmlFlow") && - text.startsWith("") - ) { - const comment = text.slice(4, -3); - return ( - !comment.startsWith(">") && - !comment.startsWith("->") && - !comment.endsWith("-") - // The following condition from the CommonMark specification is commented - // to avoid parsing HTML comments that include "--" because that is NOT a - // condition of the HTML specification. - // https://spec.commonmark.org/0.30/#raw-html - // https://html.spec.whatwg.org/multipage/syntax.html#comments - // && !comment.includes("--") - ); - } - return false; -} - -/** - * Adds a range of numbers to a set. - * - * @param {Set} set Set of numbers. - * @param {number} start Starting number. - * @param {number} end Ending number. - * @returns {void} - */ -function addRangeToSet(set, start, end) { - for (let i = start; i <= end; i++) { - set.add(i); - } -} - -/** - * @callback AllowedPredicate - * @param {Token} token Micromark token. - * @returns {boolean} True iff allowed. - */ - -/** - * @callback TransformPredicate - * @param {Token} token Micromark token. - * @returns {Token[]} Child tokens. - */ - -/** - * Filter a list of Micromark tokens by predicate. - * - * @param {Token[]} tokens Micromark tokens. - * @param {AllowedPredicate} [allowed] Allowed token predicate. - * @param {TransformPredicate} [transformChildren] Transform predicate. - * @returns {Token[]} Filtered tokens. - */ -function filterByPredicate(tokens, allowed, transformChildren) { - allowed = allowed || (() => true); - const result = []; - const queue = [ - { - "array": tokens, - "index": 0 - } - ]; - while (queue.length > 0) { - const current = queue[queue.length - 1]; - const { array, index } = current; - if (index < array.length) { - const token = array[current.index++]; - if (allowed(token)) { - result.push(token); - } - const { children } = token; - if (children.length > 0) { - const transformed = - transformChildren ? transformChildren(token) : children; - queue.push( - { - "array": transformed, - "index": 0 - } - ); - } - } else { - queue.pop(); - } - } - return result; -} - -/** - * Filter a list of Micromark tokens by type. - * - * @param {Token[]} tokens Micromark tokens. - * @param {TokenType[]} types Types to allow. - * @param {boolean} [htmlFlow] Whether to include htmlFlow content. - * @returns {Token[]} Filtered tokens. - */ -function filterByTypes(tokens, types, htmlFlow) { - const predicate = (token) => types.includes(token.type) && (htmlFlow || !inHtmlFlow(token)); - const flatTokens = tokens[flatTokensSymbol]; - if (flatTokens) { - return flatTokens.filter(predicate); - } - return filterByPredicate(tokens, predicate); -} - -/** - * Gets the blockquote prefix text (if any) for the specified line number. - * - * @param {Token[]} tokens Micromark tokens. - * @param {number} lineNumber Line number to examine. - * @param {number} [count] Number of times to repeat. - * @returns {string} Blockquote prefix text. - */ -function getBlockQuotePrefixText(tokens, lineNumber, count = 1) { - return filterByTypes(tokens, [ "blockQuotePrefix", "linePrefix" ]) - .filter((prefix) => prefix.startLine === lineNumber) - .map((prefix) => prefix.text) - .join("") - .trimEnd() - // eslint-disable-next-line unicorn/prefer-spread - .concat("\n") - .repeat(count); -}; - -/** - * Gets a list of nested Micromark token descendants by type path. - * - * @param {Token|Token[]} parent Micromark token parent or parents. - * @param {(TokenType|TokenType[])[]} typePath Micromark token type path. - * @returns {Token[]} Micromark token descendants. - */ -function getDescendantsByType(parent, typePath) { - let tokens = Array.isArray(parent) ? parent : [ parent ]; - for (const type of typePath) { - const predicate = (token) => Array.isArray(type) ? type.includes(token.type) : (type === token.type); - tokens = tokens.flatMap((t) => t.children.filter(predicate)); - } - return tokens; -} - -/** - * Gets the heading level of a Micromark heading tokan. - * - * @param {Token} heading Micromark heading token. - * @returns {number} Heading level. - */ -function getHeadingLevel(heading) { - let level = 1; - const headingSequence = heading.children.find( - (child) => [ "atxHeadingSequence", "setextHeadingLine" ].includes(child.type) - ); - // @ts-ignore - const { text } = headingSequence; - if (text[0] === "#") { - level = Math.min(text.length, 6); - } else if (text[0] === "-") { - level = 2; - } - return level; -} - -/** - * Gets the heading style of a Micromark heading tokan. - * - * @param {Token} heading Micromark heading token. - * @returns {"atx" | "atx_closed" | "setext"} Heading style. - */ -function getHeadingStyle(heading) { - if (heading.type === "setextHeading") { - return "setext"; - } - const atxHeadingSequenceLength = heading.children.filter( - (child) => child.type === "atxHeadingSequence" - ).length; - if (atxHeadingSequenceLength === 1) { - return "atx"; - } - return "atx_closed"; -} - -/** - * Gets the heading text of a Micromark heading token. - * - * @param {Token} heading Micromark heading token. - * @returns {string} Heading text. - */ -function getHeadingText(heading) { - const headingTexts = getDescendantsByType(heading, [ [ "atxHeadingText", "setextHeadingText" ] ]); - return headingTexts[0]?.text.replace(/[\r\n]+/g, " ") || ""; -} - -/** - * HTML tag information. - * - * @typedef {Object} HtmlTagInfo - * @property {boolean} close True iff close tag. - * @property {string} name Tag name. - */ - -/** - * Gets information about the tag in an HTML token. - * - * @param {Token} token Micromark token. - * @returns {HtmlTagInfo | null} HTML tag information. - */ -function getHtmlTagInfo(token) { - const htmlTagNameRe = /^<([^!>][^/\s>]*)/; - if (token.type === "htmlText") { - const match = htmlTagNameRe.exec(token.text); - if (match) { - const name = match[1]; - const close = name.startsWith("/"); - return { - close, - "name": close ? name.slice(1) : name - }; - } - } - return null; -} - -/** - * Gets the nearest parent of the specified type for a Micromark token. - * - * @param {Token} token Micromark token. - * @param {TokenType[]} types Types to allow. - * @returns {Token | null} Parent token. - */ -function getParentOfType(token, types) { - /** @type {Token | null} */ - let current = token; - while ((current = current.parent) && !types.includes(current.type)) { - // Empty - } - return current; -} - -/** - * Set containing token types that do not contain content. - * - * @type {Set} - */ -const nonContentTokens = new Set([ - "blockQuoteMarker", - "blockQuotePrefix", - "blockQuotePrefixWhitespace", - "lineEnding", - "lineEndingBlank", - "linePrefix", - "listItemIndent" -]); - -module.exports = { - addRangeToSet, - filterByPredicate, - filterByTypes, - getBlockQuotePrefixText, - getDescendantsByType, - getHeadingLevel, - getHeadingStyle, - getHeadingText, - getHtmlTagInfo, - getParentOfType, - inHtmlFlow, - isHtmlFlowComment, - nonContentTokens -}; - - -/***/ }), - -/***/ "../helpers/micromark-parse.cjs": -/*!**************************************!*\ - !*** ../helpers/micromark-parse.cjs ***! - \**************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const micromark = __webpack_require__(/*! markdownlint-micromark */ "markdownlint-micromark"); -const { isHtmlFlowComment } = __webpack_require__(/*! ./micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { flatTokensSymbol, htmlFlowSymbol, newLineRe } = __webpack_require__(/*! ./shared.js */ "../helpers/shared.js"); - -/** @typedef {import("markdownlint-micromark").Construct} Construct */ -/** @typedef {import("markdownlint-micromark").Event} Event */ -/** @typedef {import("markdownlint-micromark").ParseOptions} MicromarkParseOptions */ -/** @typedef {import("markdownlint-micromark").State} State */ -/** @typedef {import("markdownlint-micromark").Token} Token */ -/** @typedef {import("markdownlint-micromark").Tokenizer} Tokenizer */ -/** @typedef {import("../lib/markdownlint.js").MicromarkToken} MicromarkToken */ - -/** - * Parse options. - * - * @typedef {Object} ParseOptions - * @property {boolean} [freezeTokens] Whether to freeze output Tokens. - */ - -/** - * Parses a Markdown document and returns Micromark events. - * - * @param {string} markdown Markdown document. - * @param {MicromarkParseOptions} [micromarkParseOptions] Options for micromark. - * @returns {Event[]} Micromark events. - */ -function getEvents( - markdown, - micromarkParseOptions = {} -) { - // Customize extensions list to add useful extensions - const extensions = [ - micromark.directive(), - micromark.gfmAutolinkLiteral(), - micromark.gfmFootnote(), - micromark.gfmTable(), - micromark.math(), - ...(micromarkParseOptions.extensions || []) - ]; - - // // Shim labelEnd to identify undefined link labels - /** @type {Event[][]} */ - const artificialEventLists = []; - /** @type {Construct} */ - const labelEnd = - // @ts-ignore - micromark.labelEnd; - const tokenizeOriginal = labelEnd.tokenize; - - /** @type {Tokenizer} */ - function tokenizeShim(effects, okOriginal, nokOriginal) { - // eslint-disable-next-line consistent-this, unicorn/no-this-assignment, no-invalid-this - const tokenizeContext = this; - const events = tokenizeContext.events; - - /** @type {State} */ - const nokShim = (code) => { - // Find start of label (image or link) - let indexStart = events.length; - while (--indexStart >= 0) { - const event = events[indexStart]; - const [ kind, token ] = event; - if (kind === "enter") { - const { type } = token; - if ((type === "labelImage") || (type === "labelLink")) { - // Found it - break; - } - } - } - - // If found... - if (indexStart >= 0) { - // Create artificial enter/exit events and replicate all data/lineEnding events within - const eventStart = events[indexStart]; - const [ , eventStartToken ] = eventStart; - const eventEnd = events[events.length - 1]; - const [ , eventEndToken ] = eventEnd; - /** @type {Token} */ - const undefinedReferenceType = { - "type": "undefinedReferenceShortcut", - "start": eventStartToken.start, - "end": eventEndToken.end - }; - /** @type {Token} */ - const undefinedReference = { - "type": "undefinedReference", - "start": eventStartToken.start, - "end": eventEndToken.end - }; - const eventsToReplicate = events - .slice(indexStart) - .filter((event) => { - const [ , eventToken ] = event; - const { type } = eventToken; - return (type === "data") || (type === "lineEnding"); - }); - - // Determine the type of the undefined reference - const previousUndefinedEvent = (artificialEventLists.length > 0) && artificialEventLists[artificialEventLists.length - 1][0]; - const previousUndefinedToken = previousUndefinedEvent && previousUndefinedEvent[1]; - if ( - previousUndefinedToken && - (previousUndefinedToken.end.line === undefinedReferenceType.start.line) && - (previousUndefinedToken.end.column === undefinedReferenceType.start.column) - ) { - // Previous undefined reference event is immediately before this one - if (eventsToReplicate.length === 0) { - // The pair represent a collapsed reference (ex: [...][]) - previousUndefinedToken.type = "undefinedReferenceCollapsed"; - previousUndefinedToken.end = eventEndToken.end; - } else { - // The pair represent a full reference (ex: [...][...]) - undefinedReferenceType.type = "undefinedReferenceFull"; - undefinedReferenceType.start = previousUndefinedToken.start; - artificialEventLists.pop(); - } - } - - // Create artificial event list and replicate content - const text = eventsToReplicate - .filter((event) => event[0] === "enter") - .map((event) => tokenizeContext.sliceSerialize(event[1])) - .join("") - .trim(); - if ((text.length > 0) && !text.includes("]")) { - /** @type {Event[]} */ - const artificialEvents = []; - artificialEvents.push( - [ "enter", undefinedReferenceType, tokenizeContext ], - [ "enter", undefinedReference, tokenizeContext ] - ); - for (const event of eventsToReplicate) { - const [ kind, token ] = event; - // Copy token because the current object will get modified by the parser - artificialEvents.push([ kind, { ...token }, tokenizeContext ]); - } - artificialEvents.push( - [ "exit", undefinedReference, tokenizeContext ], - [ "exit", undefinedReferenceType, tokenizeContext ] - ); - artificialEventLists.push(artificialEvents); - } - } - - // Continue with original behavior - return nokOriginal(code); - }; - - // Shim nok handler of labelEnd's tokenize - return tokenizeOriginal.call(tokenizeContext, effects, okOriginal, nokShim); - } - - try { - // Shim labelEnd behavior to detect undefined references - labelEnd.tokenize = tokenizeShim; - - // Use micromark to parse document into Events - const encoding = undefined; - const eol = true; - const parseContext = micromark.parse({ ...micromarkParseOptions, extensions }); - const chunks = micromark.preprocess()(markdown, encoding, eol); - const events = micromark.postprocess(parseContext.document().write(chunks)); - - // Append artificial events and return all events - // eslint-disable-next-line unicorn/prefer-spread - return events.concat(...artificialEventLists); - } finally { - // Restore shimmed labelEnd behavior - labelEnd.tokenize = tokenizeOriginal; - } -} - -/** - * Parses a Markdown document and returns micromark tokens (internal). - * - * @param {string} markdown Markdown document. - * @param {ParseOptions} [parseOptions] Options. - * @param {MicromarkParseOptions} [micromarkParseOptions] Options for micromark. - * @param {number} [lineDelta] Offset for start/end line. - * @param {MicromarkToken} [ancestor] Parent of top-most tokens. - * @returns {MicromarkToken[]} Micromark tokens. - */ -function parseInternal( - markdown, - parseOptions = {}, - micromarkParseOptions = {}, - lineDelta = 0, - ancestor = undefined -) { - // Get options - const freezeTokens = Boolean(parseOptions.freezeTokens); - - // Use micromark to parse document into Events - const events = getEvents(markdown, micromarkParseOptions); - - // Create Token objects - const document = []; - let flatTokens = []; - /** @type {MicromarkToken} */ - const root = { - "type": "data", - "startLine": -1, - "startColumn": -1, - "endLine": -1, - "endColumn": -1, - "text": "ROOT", - "children": document, - "parent": null - }; - const history = [ root ]; - let current = root; - // eslint-disable-next-line jsdoc/valid-types - /** @type MicromarkParseOptions | null */ - let reparseOptions = null; - let lines = null; - let skipHtmlFlowChildren = false; - for (const event of events) { - const [ kind, token, context ] = event; - const { type, start, end } = token; - const { "column": startColumn, "line": startLine } = start; - const { "column": endColumn, "line": endLine } = end; - const text = context.sliceSerialize(token); - if ((kind === "enter") && !skipHtmlFlowChildren) { - const previous = current; - history.push(previous); - current = { - type, - "startLine": startLine + lineDelta, - startColumn, - "endLine": endLine + lineDelta, - endColumn, - text, - "children": [], - "parent": ((previous === root) ? (ancestor || null) : previous) - }; - if (ancestor) { - Object.defineProperty(current, htmlFlowSymbol, { "value": true }); - } - previous.children.push(current); - flatTokens.push(current); - if ((current.type === "htmlFlow") && !isHtmlFlowComment(current)) { - skipHtmlFlowChildren = true; - if (!reparseOptions || !lines) { - reparseOptions = { - ...micromarkParseOptions, - "extensions": [ - { - "disable": { - "null": [ "codeIndented", "htmlFlow" ] - } - } - ] - }; - lines = markdown.split(newLineRe); - } - const reparseMarkdown = lines - .slice(current.startLine - 1, current.endLine) - .join("\n"); - const tokens = parseInternal( - reparseMarkdown, - parseOptions, - reparseOptions, - current.startLine - 1, - current - ); - current.children = tokens; - // Avoid stack overflow of Array.push(...spread) - // eslint-disable-next-line unicorn/prefer-spread - flatTokens = flatTokens.concat(tokens[flatTokensSymbol]); - } - } else if (kind === "exit") { - if (type === "htmlFlow") { - skipHtmlFlowChildren = false; - } - if (!skipHtmlFlowChildren) { - if (freezeTokens) { - Object.freeze(current.children); - Object.freeze(current); - } - // @ts-ignore - current = history.pop(); - } - } - } - - // Return document - Object.defineProperty(document, flatTokensSymbol, { "value": flatTokens }); - if (freezeTokens) { - Object.freeze(document); - } - return document; -} - -/** - * Parses a Markdown document and returns micromark tokens. - * - * @param {string} markdown Markdown document. - * @param {ParseOptions} [parseOptions] Options. - * @returns {MicromarkToken[]} Micromark tokens. - */ -function parse(markdown, parseOptions) { - return parseInternal(markdown, parseOptions); -} - -module.exports = { - getEvents, - parse -}; - - -/***/ }), - -/***/ "../lib/cache.js": -/*!***********************!*\ - !*** ../lib/cache.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const helpers = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByTypes } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); - -/** @type {Map} */ -const map = new Map(); -let params = undefined; - -/** - * Initializes (resets) the cache. - * - * @param {import("./markdownlint").RuleParams} [p] Rule parameters object. - * @returns {void} - */ -function initialize(p) { - map.clear(); - params = p; -} - -/** - * Gets a cached object value - computes it and caches it. - * - * @param {string} name Cache object name. - * @param {Function} getValue Getter for object value. - * @returns {Object} Object value. - */ -function getCached(name, getValue) { - if (map.has(name)) { - return map.get(name); - } - const value = getValue(); - map.set(name, value); - return value; -} - -/** - * Filters a list of Micromark tokens by type and caches the result. - * - * @param {import("./markdownlint").MicromarkTokenType[]} types Types to allow. - * @param {boolean} [htmlFlow] Whether to include htmlFlow content. - * @returns {import("./markdownlint").MicromarkToken[]} Filtered tokens. - */ -function filterByTypesCached(types, htmlFlow) { - return getCached( - // eslint-disable-next-line prefer-rest-params - JSON.stringify(arguments), - () => filterByTypes(params.parsers.micromark.tokens, types, htmlFlow) - ); -} - -/** - * Gets a reference link and image data object. - * - * @returns {Object} Reference link and image data object. - */ -function getReferenceLinkImageData() { - return getCached( - getReferenceLinkImageData.name, - () => helpers.getReferenceLinkImageData(params.parsers.micromark.tokens) - ); -} - -module.exports = { - initialize, - filterByTypesCached, - getReferenceLinkImageData -}; - - -/***/ }), - -/***/ "../lib/constants.js": -/*!***************************!*\ - !*** ../lib/constants.js ***! - \***************************/ -/***/ ((module) => { - -"use strict"; -// @ts-check - - - -module.exports.deprecatedRuleNames = []; -module.exports.fixableRuleNames = [ - "MD004", "MD005", "MD007", "MD009", "MD010", "MD011", - "MD012", "MD014", "MD018", "MD019", "MD020", "MD021", - "MD022", "MD023", "MD026", "MD027", "MD030", "MD031", - "MD032", "MD034", "MD037", "MD038", "MD039", "MD044", - "MD047", "MD049", "MD050", "MD051", "MD053", "MD054", - "MD058" -]; -module.exports.homepage = "https://github.com/DavidAnson/markdownlint"; -module.exports.version = "0.36.1"; - - -/***/ }), - -/***/ "../lib/markdownit.cjs": -/*!*****************************!*\ - !*** ../lib/markdownit.cjs ***! - \*****************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { newLineRe } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); - -/** - * @callback InlineCodeSpanCallback - * @param {string} code Code content. - * @param {number} lineIndex Line index (0-based). - * @param {number} columnIndex Column index (0-based). - * @param {number} ticks Count of backticks. - * @returns {void} - */ - -/** - * Calls the provided function for each inline code span's content. - * - * @param {string} input Markdown content. - * @param {InlineCodeSpanCallback} handler Callback function taking (code, - * lineIndex, columnIndex, ticks). - * @returns {void} - */ -function forEachInlineCodeSpan(input, handler) { - const backtickRe = /`+/g; - let match = null; - const backticksLengthAndIndex = []; - while ((match = backtickRe.exec(input)) !== null) { - backticksLengthAndIndex.push([ match[0].length, match.index ]); - } - const newLinesIndex = []; - while ((match = newLineRe.exec(input)) !== null) { - newLinesIndex.push(match.index); - } - let lineIndex = 0; - let lineStartIndex = 0; - let k = 0; - for (let i = 0; i < backticksLengthAndIndex.length - 1; i++) { - const [ startLength, startIndex ] = backticksLengthAndIndex[i]; - if ((startIndex === 0) || (input[startIndex - 1] !== "\\")) { - for (let j = i + 1; j < backticksLengthAndIndex.length; j++) { - const [ endLength, endIndex ] = backticksLengthAndIndex[j]; - if (startLength === endLength) { - for (; k < newLinesIndex.length; k++) { - const newLineIndex = newLinesIndex[k]; - if (startIndex < newLineIndex) { - break; - } - lineIndex++; - lineStartIndex = newLineIndex + 1; - } - const columnIndex = startIndex - lineStartIndex + startLength; - handler( - input.slice(startIndex + startLength, endIndex), - lineIndex, - columnIndex, - startLength - ); - i = j; - break; - } - } - } - } -} - -/** - * Freeze all freeze-able members of a token and its children. - * - * @param {import("./markdownlint").MarkdownItToken} token A markdown-it token. - * @returns {void} - */ -function freezeToken(token) { - if (token.attrs) { - for (const attr of token.attrs) { - Object.freeze(attr); - } - Object.freeze(token.attrs); - } - if (token.children) { - for (const child of token.children) { - freezeToken(child); - } - Object.freeze(token.children); - } - if (token.map) { - Object.freeze(token.map); - } - Object.freeze(token); -} - -/** - * Annotate tokens with line/lineNumber and freeze them. - * - * @param {Object[]} tokens Array of markdown-it tokens. - * @param {string[]} lines Lines of Markdown content. - * @returns {void} - */ -function annotateAndFreezeTokens(tokens, lines) { - let trMap = null; - // eslint-disable-next-line jsdoc/valid-types - /** @type import("./markdownlint").MarkdownItToken[] */ - // @ts-ignore - const markdownItTokens = tokens; - for (const token of markdownItTokens) { - // Provide missing maps for table content - if (token.type === "tr_open") { - trMap = token.map; - } else if (token.type === "tr_close") { - trMap = null; - } - if (!token.map && trMap) { - token.map = [ ...trMap ]; - } - // Update token metadata - if (token.map) { - token.line = lines[token.map[0]]; - token.lineNumber = token.map[0] + 1; - // Trim bottom of token to exclude whitespace lines - while (token.map[1] && !((lines[token.map[1] - 1] || "").trim())) { - token.map[1]--; - } - } - // Annotate children with lineNumber - if (token.children) { - const codeSpanExtraLines = []; - if (token.children.some((child) => child.type === "code_inline")) { - forEachInlineCodeSpan(token.content, (code) => { - codeSpanExtraLines.push(code.split(newLineRe).length - 1); - }); - } - let lineNumber = token.lineNumber; - for (const child of token.children) { - child.lineNumber = lineNumber; - child.line = lines[lineNumber - 1]; - if ((child.type === "softbreak") || (child.type === "hardbreak")) { - lineNumber++; - } else if (child.type === "code_inline") { - lineNumber += codeSpanExtraLines.shift(); - } - } - } - freezeToken(token); - } - Object.freeze(tokens); -} - -/** - * Gets an array of markdown-it tokens for the input. - * - * @param {import("./markdownlint").Plugin[]} markdownItPlugins Additional plugins. - * @param {string} content Markdown content. - * @param {string[]} lines Lines of Markdown content. - * @returns {import("../lib/markdownlint").MarkdownItToken} Array of markdown-it tokens. - */ -function getMarkdownItTokens(markdownItPlugins, content, lines) { - const markdownit = __webpack_require__(/*! markdown-it */ "markdown-it"); - const md = markdownit({ "html": true }); - for (const plugin of markdownItPlugins) { - // @ts-ignore - md.use(...plugin); - } - const tokens = md.parse(content, {}); - annotateAndFreezeTokens(tokens, lines); - // @ts-ignore - return tokens; -}; - -module.exports = { - forEachInlineCodeSpan, - getMarkdownItTokens -}; - - -/***/ }), - -/***/ "../lib/markdownlint.js": -/*!******************************!*\ - !*** ../lib/markdownlint.js ***! - \******************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const path = __webpack_require__(/*! node:path */ "?9a52"); -const { promisify } = __webpack_require__(/*! node:util */ "?39e5"); -const micromark = __webpack_require__(/*! ../helpers/micromark-parse.cjs */ "../helpers/micromark-parse.cjs"); -const { version } = __webpack_require__(/*! ./constants */ "../lib/constants.js"); -const rules = __webpack_require__(/*! ./rules */ "../lib/rules.js"); -const helpers = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const cache = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// @ts-ignore -// eslint-disable-next-line camelcase, no-inline-comments, no-undef -const dynamicRequire = (typeof require === "undefined") ? __webpack_require__("../lib sync recursive") : /* c8 ignore next */ require; -// Capture native require implementation for dynamic loading of modules - -/** - * Validate the list of rules for structure and reuse. - * - * @param {Rule[]} ruleList List of rules. - * @param {boolean} synchronous Whether to execute synchronously. - * @returns {Error | null} Error message if validation fails. - */ -function validateRuleList(ruleList, synchronous) { - let result = null; - if (ruleList.length === rules.length) { - // No need to validate if only using built-in rules - return result; - } - const allIds = {}; - for (const [ index, rule ] of ruleList.entries()) { - const customIndex = index - rules.length; - // eslint-disable-next-line jsdoc/require-jsdoc - function newError(property, value) { - return new Error( - `Property '${property}' of custom rule at index ${customIndex} is incorrect: '${value}'.`); - } - for (const property of [ "names", "tags" ]) { - const value = rule[property]; - if (!result && - (!value || !Array.isArray(value) || (value.length === 0) || - !value.every(helpers.isString) || value.some(helpers.isEmptyString))) { - result = newError(property, value); - } - } - for (const propertyInfo of [ - [ "description", "string" ], - [ "function", "function" ] - ]) { - const property = propertyInfo[0]; - const value = rule[property]; - if (!result && (!value || (typeof value !== propertyInfo[1]))) { - result = newError(property, value); - } - } - if ( - !result && - (rule.parser !== undefined) && - (rule.parser !== "markdownit") && - (rule.parser !== "micromark") && - (rule.parser !== "none") - ) { - result = newError("parser", rule.parser); - } - if ( - !result && - rule.information && - !helpers.isUrl(rule.information) - ) { - result = newError("information", rule.information); - } - if ( - !result && - (rule.asynchronous !== undefined) && - (typeof rule.asynchronous !== "boolean") - ) { - result = newError("asynchronous", rule.asynchronous); - } - if (!result && rule.asynchronous && synchronous) { - result = new Error( - "Custom rule " + rule.names.join("/") + " at index " + customIndex + - " is asynchronous and can not be used in a synchronous context." - ); - } - if (!result) { - for (const name of rule.names) { - const nameUpper = name.toUpperCase(); - if (!result && (allIds[nameUpper] !== undefined)) { - result = new Error("Name '" + name + "' of custom rule at index " + - customIndex + " is already used as a name or tag."); - } - allIds[nameUpper] = true; - } - for (const tag of rule.tags) { - const tagUpper = tag.toUpperCase(); - if (!result && allIds[tagUpper]) { - result = new Error("Tag '" + tag + "' of custom rule at index " + - customIndex + " is already used as a name."); - } - allIds[tagUpper] = false; - } - } - } - return result; -} - -/** - * Creates a LintResults instance with toString for pretty display. - * - * @param {Rule[]} ruleList List of rules. - * @returns {LintResults} New LintResults instance. - */ -function newResults(ruleList) { - const lintResults = {}; - // eslint-disable-next-line jsdoc/require-jsdoc - function toString(useAlias) { - let ruleNameToRule = null; - const results = []; - const keys = Object.keys(lintResults); - keys.sort(); - for (const file of keys) { - const fileResults = lintResults[file]; - if (Array.isArray(fileResults)) { - for (const result of fileResults) { - const ruleMoniker = result.ruleNames ? - result.ruleNames.join("/") : - (result.ruleName + "/" + result.ruleAlias); - results.push( - file + ": " + - result.lineNumber + ": " + - ruleMoniker + " " + - result.ruleDescription + - (result.errorDetail ? - " [" + result.errorDetail + "]" : - "") + - (result.errorContext ? - " [Context: \"" + result.errorContext + "\"]" : - "")); - } - } else { - if (!ruleNameToRule) { - ruleNameToRule = {}; - for (const rule of ruleList) { - const ruleName = rule.names[0].toUpperCase(); - ruleNameToRule[ruleName] = rule; - } - } - for (const [ ruleName, ruleResults ] of Object.entries(fileResults)) { - const rule = ruleNameToRule[ruleName.toUpperCase()]; - for (const lineNumber of ruleResults) { - // @ts-ignore - const nameIndex = Math.min(useAlias ? 1 : 0, rule.names.length - 1); - const result = - file + ": " + - lineNumber + ": " + - // @ts-ignore - rule.names[nameIndex] + " " + - // @ts-ignore - rule.description; - results.push(result); - } - } - } - } - return results.join("\n"); - } - Object.defineProperty(lintResults, "toString", { "value": toString }); - // @ts-ignore - return lintResults; -} - -/** - * Remove front matter (if present at beginning of content). - * - * @param {string} content Markdown content. - * @param {RegExp | null} frontMatter Regular expression to match front matter. - * @returns {Object} Trimmed content and front matter lines. - */ -function removeFrontMatter(content, frontMatter) { - let frontMatterLines = []; - if (frontMatter) { - const frontMatterMatch = content.match(frontMatter); - if (frontMatterMatch && !frontMatterMatch.index) { - const contentMatched = frontMatterMatch[0]; - content = content.slice(contentMatched.length); - frontMatterLines = contentMatched.split(helpers.newLineRe); - if ((frontMatterLines.length > 0) && - (frontMatterLines[frontMatterLines.length - 1] === "")) { - frontMatterLines.length--; - } - } - } - return { - "content": content, - "frontMatterLines": frontMatterLines - }; -} - -/** - * Map rule names/tags to canonical rule name. - * - * @param {Rule[]} ruleList List of rules. - * @returns {Object.} Map of alias to rule name. - */ -function mapAliasToRuleNames(ruleList) { - const aliasToRuleNames = {}; - // const tagToRuleNames = {}; - for (const rule of ruleList) { - const ruleName = rule.names[0].toUpperCase(); - // The following is useful for updating README.md: - // console.log( - // "* **[" + ruleName + "](doc/Rules.md#" + ruleName.toLowerCase() + - // ")** *" + rule.names.slice(1).join("/") + "* - " + rule.description); - for (const name of rule.names) { - const nameUpper = name.toUpperCase(); - aliasToRuleNames[nameUpper] = [ ruleName ]; - } - for (const tag of rule.tags) { - const tagUpper = tag.toUpperCase(); - const ruleNames = aliasToRuleNames[tagUpper] || []; - ruleNames.push(ruleName); - aliasToRuleNames[tagUpper] = ruleNames; - // tagToRuleNames[tag] = ruleName; - } - } - // The following is useful for updating README.md: - // Object.keys(tagToRuleNames).sort().forEach(function forTag(tag) { - // console.log("* **" + tag + "** - " + - // aliasToRuleNames[tag.toUpperCase()].join(", ")); - // }); - // @ts-ignore - return aliasToRuleNames; -} - -/** - * Apply (and normalize) configuration object. - * - * @param {Rule[]} ruleList List of rules. - * @param {Configuration} config Configuration object. - * @param {Object.} aliasToRuleNames Map of alias to rule - * names. - * @returns {Configuration} Effective configuration. - */ -function getEffectiveConfig(ruleList, config, aliasToRuleNames) { - const defaultKey = Object.keys(config).filter( - (key) => key.toUpperCase() === "DEFAULT" - ); - const ruleDefault = (defaultKey.length === 0) || !!config[defaultKey[0]]; - /** @type {Configuration} */ - const effectiveConfig = {}; - for (const rule of ruleList) { - const ruleName = rule.names[0].toUpperCase(); - effectiveConfig[ruleName] = ruleDefault; - } - // for (const ruleName of deprecatedRuleNames) { - // effectiveConfig[ruleName] = false; - // } - for (const key of Object.keys(config)) { - let value = config[key]; - if (value) { - if (!(value instanceof Object)) { - value = {}; - } - } else { - value = false; - } - const keyUpper = key.toUpperCase(); - for (const ruleName of (aliasToRuleNames[keyUpper] || [])) { - effectiveConfig[ruleName] = value; - } - } - return effectiveConfig; -} - -/** - * Parse the content of a configuration file. - * - * @param {string} name Name of the configuration file. - * @param {string} content Configuration content. - * @param {ConfigurationParser[] | null} [parsers] Parsing function(s). - * @returns {Object} Configuration object and error message. - */ -function parseConfiguration(name, content, parsers) { - let config = null; - let message = ""; - const errors = []; - let index = 0; - // Try each parser - (parsers || [ JSON.parse ]).every((parser) => { - try { - config = parser(content); - } catch (error) { - errors.push(`Parser ${index++}: ${error.message}`); - } - return !config; - }); - // Message if unable to parse - if (!config) { - errors.unshift(`Unable to parse '${name}'`); - message = errors.join("; "); - } - return { - config, - message - }; -} - -/** - * Create a mapping of enabled rules per line. - * - * @param {Rule[]} ruleList List of rules. - * @param {string[]} lines List of content lines. - * @param {string[]} frontMatterLines List of front matter lines. - * @param {boolean} noInlineConfig Whether to allow inline configuration. - * @param {Configuration} config Configuration object. - * @param {ConfigurationParser[] | null} configParsers Configuration parsers. - * @param {Object.} aliasToRuleNames Map of alias to rule - * names. - * @returns {Object} Effective configuration and enabled rules per line number. - */ -function getEnabledRulesPerLineNumber( - ruleList, - lines, - frontMatterLines, - noInlineConfig, - config, - configParsers, - aliasToRuleNames) { - // Shared variables - let enabledRules = {}; - let capturedRules = {}; - const allRuleNames = []; - const enabledRulesPerLineNumber = new Array(1 + frontMatterLines.length); - // Helper functions - // eslint-disable-next-line jsdoc/require-jsdoc - function handleInlineConfig(input, forEachMatch, forEachLine) { - for (const [ lineIndex, line ] of input.entries()) { - if (!noInlineConfig) { - let match = null; - while ((match = helpers.inlineCommentStartRe.exec(line))) { - const action = match[2].toUpperCase(); - const startIndex = match.index + match[1].length; - const endIndex = line.indexOf("-->", startIndex); - if (endIndex === -1) { - break; - } - const parameter = line.slice(startIndex, endIndex); - forEachMatch(action, parameter, lineIndex + 1); - } - } - if (forEachLine) { - forEachLine(); - } - } - } - // eslint-disable-next-line jsdoc/require-jsdoc - function configureFile(action, parameter) { - if (action === "CONFIGURE-FILE") { - const { "config": parsed } = parseConfiguration( - "CONFIGURE-FILE", parameter, configParsers - ); - if (parsed) { - config = { - ...config, - ...parsed - }; - } - } - } - // eslint-disable-next-line jsdoc/require-jsdoc - function applyEnableDisable(action, parameter, state) { - state = { ...state }; - const enabled = (action.startsWith("ENABLE")); - const trimmed = parameter && parameter.trim(); - const items = trimmed ? trimmed.toUpperCase().split(/\s+/) : allRuleNames; - for (const nameUpper of items) { - for (const ruleName of (aliasToRuleNames[nameUpper] || [])) { - state[ruleName] = enabled; - } - } - return state; - } - // eslint-disable-next-line jsdoc/require-jsdoc - function enableDisableFile(action, parameter) { - if ((action === "ENABLE-FILE") || (action === "DISABLE-FILE")) { - enabledRules = applyEnableDisable(action, parameter, enabledRules); - } - } - // eslint-disable-next-line jsdoc/require-jsdoc - function captureRestoreEnableDisable(action, parameter) { - if (action === "CAPTURE") { - capturedRules = enabledRules; - } else if (action === "RESTORE") { - enabledRules = capturedRules; - } else if ((action === "ENABLE") || (action === "DISABLE")) { - enabledRules = applyEnableDisable(action, parameter, enabledRules); - } - } - // eslint-disable-next-line jsdoc/require-jsdoc - function updateLineState() { - enabledRulesPerLineNumber.push(enabledRules); - } - // eslint-disable-next-line jsdoc/require-jsdoc - function disableLineNextLine(action, parameter, lineNumber) { - const disableLine = (action === "DISABLE-LINE"); - const disableNextLine = (action === "DISABLE-NEXT-LINE"); - if (disableLine || disableNextLine) { - const nextLineNumber = - frontMatterLines.length + lineNumber + (disableNextLine ? 1 : 0); - enabledRulesPerLineNumber[nextLineNumber] = - applyEnableDisable( - action, - parameter, - enabledRulesPerLineNumber[nextLineNumber] - ); - } - } - // Handle inline comments - handleInlineConfig([ lines.join("\n") ], configureFile); - const effectiveConfig = getEffectiveConfig( - ruleList, config, aliasToRuleNames); - for (const rule of ruleList) { - const ruleName = rule.names[0].toUpperCase(); - allRuleNames.push(ruleName); - enabledRules[ruleName] = !!effectiveConfig[ruleName]; - } - capturedRules = enabledRules; - handleInlineConfig(lines, enableDisableFile); - handleInlineConfig(lines, captureRestoreEnableDisable, updateLineState); - handleInlineConfig(lines, disableLineNextLine); - // Create the list of rules that are used at least once - const enabledRuleList = []; - for (const [ index, ruleName ] of allRuleNames.entries()) { - if (enabledRulesPerLineNumber.some((enabledRulesForLine) => enabledRulesForLine[ruleName])) { - enabledRuleList.push(ruleList[index]); - } - } - // Return results - return { - effectiveConfig, - enabledRulesPerLineNumber, - enabledRuleList - }; -} - -/** - * Lints a string containing Markdown content. - * - * @param {Rule[]} ruleList List of rules. - * @param {Object.} aliasToRuleNames Map of alias to rule - * names. - * @param {string} name Identifier for the content. - * @param {string} content Markdown content. - * @param {Plugin[]} markdownItPlugins Additional plugins. - * @param {Configuration} config Configuration object. - * @param {ConfigurationParser[] | null} configParsers Configuration parsers. - * @param {RegExp | null} frontMatter Regular expression for front matter. - * @param {boolean} handleRuleFailures Whether to handle exceptions in rules. - * @param {boolean} noInlineConfig Whether to allow inline configuration. - * @param {number} resultVersion Version of the LintResults object to return. - * @param {LintContentCallback} callback Callback (err, result) function. - * @returns {void} - */ -function lintContent( - ruleList, - aliasToRuleNames, - name, - content, - markdownItPlugins, - config, - configParsers, - frontMatter, - handleRuleFailures, - noInlineConfig, - resultVersion, - callback) { - // Remove UTF-8 byte order marker (if present) - content = content.replace(/^\uFEFF/, ""); - // Remove front matter - const removeFrontMatterResult = removeFrontMatter(content, frontMatter); - const { frontMatterLines } = removeFrontMatterResult; - content = removeFrontMatterResult.content; - // Get enabled rules per line (with HTML comments present) - const { effectiveConfig, enabledRulesPerLineNumber, enabledRuleList } = - getEnabledRulesPerLineNumber( - ruleList, - content.split(helpers.newLineRe), - frontMatterLines, - noInlineConfig, - config, - configParsers, - aliasToRuleNames - ); - const needMarkdownItTokens = enabledRuleList.some( - (rule) => (rule.parser === "markdownit") || (rule.parser === undefined) - ); - const customRulesPresent = (ruleList.length !== rules.length); - // Parse content into parser tokens - const micromarkTokens = micromark.parse( - content, - { "freezeTokens": customRulesPresent } - ); - // Hide the content of HTML comments from rules - const preClearedContent = content; - content = helpers.clearHtmlCommentText(content); - // Parse content into lines and get markdown-it tokens - const lines = content.split(helpers.newLineRe); - const markdownitTokens = needMarkdownItTokens ? - (__webpack_require__(/*! ./markdownit.cjs */ "../lib/markdownit.cjs").getMarkdownItTokens)(markdownItPlugins, preClearedContent, lines) : - []; - // Create (frozen) parameters for rules - /** @type {MarkdownParsers} */ - // @ts-ignore - const parsersMarkdownIt = Object.freeze({ - "markdownit": Object.freeze({ - "tokens": markdownitTokens - }) - }); - /** @type {MarkdownParsers} */ - // @ts-ignore - const parsersMicromark = Object.freeze({ - "micromark": Object.freeze({ - "tokens": micromarkTokens - }) - }); - /** @type {MarkdownParsers} */ - // @ts-ignore - const parsersNone = Object.freeze({}); - const paramsBase = { - name, - version, - "lines": Object.freeze(lines), - "frontMatterLines": Object.freeze(frontMatterLines) - }; - cache.initialize({ - ...paramsBase, - "parsers": parsersMicromark, - "config": null - }); - // Function to run for each rule - let results = []; - /** - * @param {Rule} rule Rule. - * @returns {Promise | null} Promise. - */ - const forRule = (rule) => { - // Configure rule - const ruleName = rule.names[0].toUpperCase(); - const tokens = {}; - let parsers = parsersNone; - if (rule.parser === undefined) { - tokens.tokens = markdownitTokens; - parsers = parsersMarkdownIt; - } else if (rule.parser === "markdownit") { - parsers = parsersMarkdownIt; - } else if (rule.parser === "micromark") { - parsers = parsersMicromark; - } - const params = { - ...paramsBase, - ...tokens, - parsers, - "config": effectiveConfig[ruleName] - }; - // eslint-disable-next-line jsdoc/require-jsdoc - function throwError(property) { - throw new Error( - `Value of '${property}' passed to onError by '${ruleName}' is incorrect for '${name}'.`); - } - // eslint-disable-next-line jsdoc/require-jsdoc - function onError(errorInfo) { - if (!errorInfo || - !helpers.isNumber(errorInfo.lineNumber) || - (errorInfo.lineNumber < 1) || - (errorInfo.lineNumber > lines.length)) { - throwError("lineNumber"); - } - const lineNumber = errorInfo.lineNumber + frontMatterLines.length; - if (!enabledRulesPerLineNumber[lineNumber][ruleName]) { - return; - } - if (errorInfo.detail && - !helpers.isString(errorInfo.detail)) { - throwError("detail"); - } - if (errorInfo.context && - !helpers.isString(errorInfo.context)) { - throwError("context"); - } - if (errorInfo.information && - !helpers.isUrl(errorInfo.information)) { - throwError("information"); - } - if (errorInfo.range && - (!Array.isArray(errorInfo.range) || - (errorInfo.range.length !== 2) || - !helpers.isNumber(errorInfo.range[0]) || - (errorInfo.range[0] < 1) || - !helpers.isNumber(errorInfo.range[1]) || - (errorInfo.range[1] < 1) || - ((errorInfo.range[0] + errorInfo.range[1] - 1) > - lines[errorInfo.lineNumber - 1].length))) { - throwError("range"); - } - const fixInfo = errorInfo.fixInfo; - const cleanFixInfo = {}; - if (fixInfo) { - if (!helpers.isObject(fixInfo)) { - throwError("fixInfo"); - } - if (fixInfo.lineNumber !== undefined) { - if ((!helpers.isNumber(fixInfo.lineNumber) || - (fixInfo.lineNumber < 1) || - (fixInfo.lineNumber > lines.length))) { - throwError("fixInfo.lineNumber"); - } - cleanFixInfo.lineNumber = - fixInfo.lineNumber + frontMatterLines.length; - } - const effectiveLineNumber = fixInfo.lineNumber || errorInfo.lineNumber; - if (fixInfo.editColumn !== undefined) { - if ((!helpers.isNumber(fixInfo.editColumn) || - (fixInfo.editColumn < 1) || - (fixInfo.editColumn > - lines[effectiveLineNumber - 1].length + 1))) { - throwError("fixInfo.editColumn"); - } - cleanFixInfo.editColumn = fixInfo.editColumn; - } - if (fixInfo.deleteCount !== undefined) { - if ((!helpers.isNumber(fixInfo.deleteCount) || - (fixInfo.deleteCount < -1) || - (fixInfo.deleteCount > - lines[effectiveLineNumber - 1].length))) { - throwError("fixInfo.deleteCount"); - } - cleanFixInfo.deleteCount = fixInfo.deleteCount; - } - if (fixInfo.insertText !== undefined) { - if (!helpers.isString(fixInfo.insertText)) { - throwError("fixInfo.insertText"); - } - cleanFixInfo.insertText = fixInfo.insertText; - } - } - const information = errorInfo.information || rule.information; - results.push({ - lineNumber, - "ruleName": rule.names[0], - "ruleNames": rule.names, - "ruleDescription": rule.description, - "ruleInformation": information ? information.href : null, - "errorDetail": errorInfo.detail || null, - "errorContext": errorInfo.context || null, - "errorRange": errorInfo.range ? [ ...errorInfo.range ] : null, - "fixInfo": fixInfo ? cleanFixInfo : null - }); - } - // Call (possibly external) rule function to report errors - const catchCallsOnError = (error) => onError({ - "lineNumber": 1, - "detail": `This rule threw an exception: ${error.message || error}` - }); - const invokeRuleFunction = () => rule.function(params, onError); - if (rule.asynchronous) { - // Asynchronous rule, ensure it returns a Promise - const ruleFunctionPromise = - Promise.resolve().then(invokeRuleFunction); - return handleRuleFailures ? - ruleFunctionPromise.catch(catchCallsOnError) : - ruleFunctionPromise; - } - // Synchronous rule - try { - invokeRuleFunction(); - } catch (error) { - if (handleRuleFailures) { - catchCallsOnError(error); - } else { - throw error; - } - } - return null; - }; - // eslint-disable-next-line jsdoc/require-jsdoc - function formatResults() { - // Sort results by rule name by line number - results.sort((a, b) => ( - a.ruleName.localeCompare(b.ruleName) || - a.lineNumber - b.lineNumber - )); - if (resultVersion < 3) { - // Remove fixInfo and multiple errors for the same rule and line number - const noPrevious = { - "ruleName": null, - "lineNumber": -1 - }; - results = results.filter((error, index, array) => { - delete error.fixInfo; - const previous = array[index - 1] || noPrevious; - return ( - (error.ruleName !== previous.ruleName) || - (error.lineNumber !== previous.lineNumber) - ); - }); - } - if (resultVersion === 0) { - // Return a dictionary of rule->[line numbers] - const dictionary = {}; - for (const error of results) { - const ruleLines = dictionary[error.ruleName] || []; - ruleLines.push(error.lineNumber); - dictionary[error.ruleName] = ruleLines; - } - // @ts-ignore - results = dictionary; - } else if (resultVersion === 1) { - // Use ruleAlias instead of ruleNames - for (const error of results) { - error.ruleAlias = error.ruleNames[1] || error.ruleName; - delete error.ruleNames; - } - } else { - // resultVersion 2 or 3: Remove unwanted ruleName - for (const error of results) { - delete error.ruleName; - } - } - return results; - } - // Run all rules - const ruleListAsync = enabledRuleList.filter((rule) => rule.asynchronous); - const ruleListSync = enabledRuleList.filter((rule) => !rule.asynchronous); - const ruleListAsyncFirst = [ - ...ruleListAsync, - ...ruleListSync - ]; - const callbackSuccess = () => callback(null, formatResults()); - const callbackError = - (error) => callback(error instanceof Error ? error : new Error(error)); - try { - const ruleResults = ruleListAsyncFirst.map(forRule); - if (ruleListAsync.length > 0) { - Promise.all(ruleResults.slice(0, ruleListAsync.length)) - .then(callbackSuccess) - .catch(callbackError); - } else { - callbackSuccess(); - } - } catch (error) { - callbackError(error); - } finally { - cache.initialize(); - } -} - -/** - * Lints a file containing Markdown content. - * - * @param {Rule[]} ruleList List of rules. - * @param {Object.} aliasToRuleNames Map of alias to rule - * names. - * @param {string} file Path of file to lint. - * @param {Plugin[]} markdownItPlugins Additional plugins. - * @param {Configuration} config Configuration object. - * @param {ConfigurationParser[] | null} configParsers Configuration parsers. - * @param {RegExp | null} frontMatter Regular expression for front matter. - * @param {boolean} handleRuleFailures Whether to handle exceptions in rules. - * @param {boolean} noInlineConfig Whether to allow inline configuration. - * @param {number} resultVersion Version of the LintResults object to return. - * @param {Object} fs File system implementation. - * @param {boolean} synchronous Whether to execute synchronously. - * @param {LintContentCallback} callback Callback (err, result) function. - * @returns {void} - */ -function lintFile( - ruleList, - aliasToRuleNames, - file, - markdownItPlugins, - config, - configParsers, - frontMatter, - handleRuleFailures, - noInlineConfig, - resultVersion, - fs, - synchronous, - callback) { - // eslint-disable-next-line jsdoc/require-jsdoc - function lintContentWrapper(err, content) { - if (err) { - return callback(err); - } - return lintContent( - ruleList, - aliasToRuleNames, - file, - content, - markdownItPlugins, - config, - configParsers, - frontMatter, - handleRuleFailures, - noInlineConfig, - resultVersion, - callback - ); - } - // Make a/synchronous call to read file - if (synchronous) { - lintContentWrapper(null, fs.readFileSync(file, "utf8")); - } else { - fs.readFile(file, "utf8", lintContentWrapper); - } -} - -/** - * Lint files and strings specified in the Options object. - * - * @param {Options | null} options Options object. - * @param {boolean} synchronous Whether to execute synchronously. - * @param {LintCallback} callback Callback (err, result) function. - * @returns {void} - */ -function lintInput(options, synchronous, callback) { - // Normalize inputs - options = options || {}; - callback = callback || function noop() {}; - const customRuleList = - [ options.customRules || [] ] - .flat() - .map((rule) => ({ - "names": helpers.cloneIfArray(rule.names), - "description": rule.description, - "information": helpers.cloneIfUrl(rule.information), - "tags": helpers.cloneIfArray(rule.tags), - "parser": rule.parser, - "asynchronous": rule.asynchronous, - "function": rule.function - })); - // eslint-disable-next-line unicorn/prefer-spread - const ruleList = rules.concat(customRuleList); - const ruleErr = validateRuleList(ruleList, synchronous); - if (ruleErr) { - callback(ruleErr); - return; - } - let files = []; - if (Array.isArray(options.files)) { - files = [ ...options.files ]; - } else if (options.files) { - files = [ String(options.files) ]; - } - const strings = options.strings || {}; - const stringsKeys = Object.keys(strings); - const config = options.config || { "default": true }; - const configParsers = options.configParsers || null; - const frontMatter = (options.frontMatter === undefined) ? - helpers.frontMatterRe : - options.frontMatter; - const handleRuleFailures = !!options.handleRuleFailures; - const noInlineConfig = !!options.noInlineConfig; - const resultVersion = (options.resultVersion === undefined) ? - 3 : - options.resultVersion; - const markdownItPlugins = options.markdownItPlugins || []; - const fs = options.fs || __webpack_require__(/*! node:fs */ "?d0ee"); - const aliasToRuleNames = mapAliasToRuleNames(ruleList); - const results = newResults(ruleList); - let done = false; - let concurrency = 0; - // eslint-disable-next-line jsdoc/require-jsdoc - function lintWorker() { - let currentItem = null; - // eslint-disable-next-line jsdoc/require-jsdoc - function lintWorkerCallback(err, result) { - concurrency--; - if (err) { - done = true; - return callback(err); - } - results[currentItem] = result; - if (!synchronous) { - lintWorker(); - } - return null; - } - if (done) { - // Abort for error or nothing left to do - } else if (files.length > 0) { - // Lint next file - concurrency++; - currentItem = files.shift(); - lintFile( - ruleList, - aliasToRuleNames, - currentItem, - markdownItPlugins, - config, - configParsers, - frontMatter, - handleRuleFailures, - noInlineConfig, - resultVersion, - fs, - synchronous, - lintWorkerCallback - ); - } else if ((currentItem = stringsKeys.shift())) { - // Lint next string - concurrency++; - lintContent( - ruleList, - aliasToRuleNames, - currentItem, - strings[currentItem] || "", - markdownItPlugins, - config, - configParsers, - frontMatter, - handleRuleFailures, - noInlineConfig, - resultVersion, - lintWorkerCallback - ); - } else if (concurrency === 0) { - // Finish - done = true; - return callback(null, results); - } - return null; - } - if (synchronous) { - while (!done) { - lintWorker(); - } - } else { - // Testing on a Raspberry Pi 4 Model B with an artificial 5ms file access - // delay suggests that a concurrency factor of 8 can eliminate the impact - // of that delay (i.e., total time is the same as with no delay). - lintWorker(); - lintWorker(); - lintWorker(); - lintWorker(); - lintWorker(); - lintWorker(); - lintWorker(); - lintWorker(); - } -} - -/** - * Lint specified Markdown files. - * - * @param {Options | null} options Configuration options. - * @param {LintCallback} callback Callback (err, result) function. - * @returns {void} - */ -function markdownlint(options, callback) { - return lintInput(options, false, callback); -} - -const markdownlintPromisify = promisify && promisify(markdownlint); - -/** - * Lint specified Markdown files. - * - * @param {Options} options Configuration options. - * @returns {Promise} Results object. - */ -function markdownlintPromise(options) { - // @ts-ignore - return markdownlintPromisify(options); -} - -/** - * Lint specified Markdown files synchronously. - * - * @param {Options | null} options Configuration options. - * @returns {LintResults} Results object. - */ -function markdownlintSync(options) { - let results = null; - lintInput(options, true, function callback(error, res) { - if (error) { - throw error; - } - results = res; - }); - // @ts-ignore - return results; -} - -/** - * Resolve referenced "extends" path in a configuration file - * using path.resolve() with require.resolve() as a fallback. - * - * @param {string} configFile Configuration file name. - * @param {string} referenceId Referenced identifier to resolve. - * @param {Object} fs File system implementation. - * @param {ResolveConfigExtendsCallback} callback Callback (err, result) - * function. - * @returns {void} - */ -function resolveConfigExtends(configFile, referenceId, fs, callback) { - const configFileDirname = path.dirname(configFile); - const resolvedExtendsFile = path.resolve(configFileDirname, referenceId); - fs.access(resolvedExtendsFile, (err) => { - if (err) { - // Not a file, try require.resolve - try { - return callback(null, dynamicRequire.resolve( - referenceId, - { "paths": [ configFileDirname ] } - )); - } catch { - // Unable to resolve, use resolvedExtendsFile - } - } - return callback(null, resolvedExtendsFile); - }); -} - -/** - * Resolve referenced "extends" path in a configuration file - * using path.resolve() with require.resolve() as a fallback. - * - * @param {string} configFile Configuration file name. - * @param {string} referenceId Referenced identifier to resolve. - * @param {Object} fs File system implementation. - * @returns {string} Resolved path to file. - */ -function resolveConfigExtendsSync(configFile, referenceId, fs) { - const configFileDirname = path.dirname(configFile); - const resolvedExtendsFile = path.resolve(configFileDirname, referenceId); - try { - fs.accessSync(resolvedExtendsFile); - return resolvedExtendsFile; - } catch { - // Not a file, try require.resolve - } - try { - return dynamicRequire.resolve( - referenceId, - { "paths": [ configFileDirname ] } - ); - } catch { - // Unable to resolve, return resolvedExtendsFile - } - return resolvedExtendsFile; -} - -/** - * Extend specified configuration object. - * - * @param {Configuration} config Configuration object. - * @param {string} file Configuration file name. - * @param {ConfigurationParser[]} parsers Parsing - * function(s). - * @param {Object} fs File system implementation. - * @param {ReadConfigCallback} callback Callback (err, result) function. - * @returns {void} - */ -function extendConfig(config, file, parsers, fs, callback) { - const configExtends = config.extends; - if (configExtends) { - return resolveConfigExtends( - file, - helpers.expandTildePath(configExtends, __webpack_require__(/*! node:os */ "?e6c4")), - fs, - // eslint-disable-next-line no-use-before-define - (_, resolvedExtends) => readConfig( - // @ts-ignore - resolvedExtends, - parsers, - fs, - (err, extendsConfig) => { - if (err) { - return callback(err); - } - const result = { - ...extendsConfig, - ...config - }; - delete result.extends; - return callback(null, result); - } - ) - ); - } - return callback(null, config); -} - -const extendConfigPromisify = promisify && promisify(extendConfig); - -/** - * Extend specified configuration object. - * - * @param {Configuration} config Configuration object. - * @param {string} file Configuration file name. - * @param {ConfigurationParser[]} [parsers] Parsing function(s). - * @param {Object} [fs] File system implementation. - * @returns {Promise} Configuration object. - */ -function extendConfigPromise(config, file, parsers, fs) { - // @ts-ignore - return extendConfigPromisify(config, file, parsers, fs); -} - -/** - * Read specified configuration file. - * - * @param {string} file Configuration file name. - * @param {ConfigurationParser[] | ReadConfigCallback} parsers Parsing - * function(s). - * @param {Object} [fs] File system implementation. - * @param {ReadConfigCallback} [callback] Callback (err, result) function. - * @returns {void} - */ -function readConfig(file, parsers, fs, callback) { - if (!callback) { - if (fs) { - callback = fs; - fs = null; - } else { - // @ts-ignore - callback = parsers; - // @ts-ignore - parsers = null; - } - } - if (!fs) { - fs = __webpack_require__(/*! node:fs */ "?d0ee"); - } - // Read file - file = helpers.expandTildePath(file, __webpack_require__(/*! node:os */ "?e6c4")); - fs.readFile(file, "utf8", (err, content) => { - if (err) { - // @ts-ignore - return callback(err); - } - // Try to parse file - // @ts-ignore - const { config, message } = parseConfiguration(file, content, parsers); - if (!config) { - // @ts-ignore - return callback(new Error(message)); - } - // Extend configuration - // @ts-ignore - return extendConfig(config, file, parsers, fs, callback); - }); -} - -const readConfigPromisify = promisify && promisify(readConfig); - -/** - * Read specified configuration file. - * - * @param {string} file Configuration file name. - * @param {ConfigurationParser[]} [parsers] Parsing function(s). - * @param {Object} [fs] File system implementation. - * @returns {Promise} Configuration object. - */ -function readConfigPromise(file, parsers, fs) { - // @ts-ignore - return readConfigPromisify(file, parsers, fs); -} - -/** - * Read specified configuration file synchronously. - * - * @param {string} file Configuration file name. - * @param {ConfigurationParser[]} [parsers] Parsing function(s). - * @param {Object} [fs] File system implementation. - * @returns {Configuration} Configuration object. - * @throws An Error if processing fails. - */ -function readConfigSync(file, parsers, fs) { - if (!fs) { - fs = __webpack_require__(/*! node:fs */ "?d0ee"); - } - // Read file - const os = __webpack_require__(/*! node:os */ "?e6c4"); - file = helpers.expandTildePath(file, os); - const content = fs.readFileSync(file, "utf8"); - // Try to parse file - const { config, message } = parseConfiguration(file, content, parsers); - if (!config) { - throw new Error(message); - } - // Extend configuration - const configExtends = config.extends; - if (configExtends) { - delete config.extends; - const resolvedExtends = resolveConfigExtendsSync( - file, - helpers.expandTildePath(configExtends, os), - fs - ); - return { - ...readConfigSync(resolvedExtends, parsers, fs), - ...config - }; - } - return config; -} - -/** - * Normalizes the fields of a RuleOnErrorFixInfo instance. - * - * @param {RuleOnErrorFixInfo} fixInfo RuleOnErrorFixInfo instance. - * @param {number} [lineNumber] Line number. - * @returns {RuleOnErrorFixInfoNormalized} Normalized RuleOnErrorFixInfo instance. - */ -function normalizeFixInfo(fixInfo, lineNumber = 0) { - return { - "lineNumber": fixInfo.lineNumber || lineNumber, - "editColumn": fixInfo.editColumn || 1, - "deleteCount": fixInfo.deleteCount || 0, - "insertText": fixInfo.insertText || "" - }; -} - -/** - * Applies the specified fix to a Markdown content line. - * - * @param {string} line Line of Markdown content. - * @param {RuleOnErrorFixInfo} fixInfo RuleOnErrorFixInfo instance. - * @param {string} [lineEnding] Line ending to use. - * @returns {string | null} Fixed content or null if deleted. - */ -function applyFix(line, fixInfo, lineEnding = "\n") { - const { editColumn, deleteCount, insertText } = normalizeFixInfo(fixInfo); - const editIndex = editColumn - 1; - return (deleteCount === -1) ? - null : - line.slice(0, editIndex) + insertText.replace(/\n/g, lineEnding) + line.slice(editIndex + deleteCount); -} - -/** - * Applies as many of the specified fixes as possible to Markdown content. - * - * @param {string} input Lines of Markdown content. - * @param {RuleOnErrorInfo[]} errors RuleOnErrorInfo instances. - * @returns {string} Fixed content. - */ -function applyFixes(input, errors) { - const lineEnding = helpers.getPreferredLineEnding(input, __webpack_require__(/*! node:os */ "?e6c4")); - const lines = input.split(helpers.newLineRe); - // Normalize fixInfo objects - let fixInfos = errors - .filter((error) => error.fixInfo) - // @ts-ignore - .map((error) => normalizeFixInfo(error.fixInfo, error.lineNumber)); - // Sort bottom-to-top, line-deletes last, right-to-left, long-to-short - fixInfos.sort((a, b) => { - const aDeletingLine = (a.deleteCount === -1); - const bDeletingLine = (b.deleteCount === -1); - return ( - (b.lineNumber - a.lineNumber) || - (aDeletingLine ? 1 : (bDeletingLine ? -1 : 0)) || - (b.editColumn - a.editColumn) || - (b.insertText.length - a.insertText.length) - ); - }); - // Remove duplicate entries (needed for following collapse step) - // eslint-disable-next-line jsdoc/valid-types - /** @type RuleOnErrorFixInfo */ - let lastFixInfo = {}; - fixInfos = fixInfos.filter((fixInfo) => { - const unique = ( - (fixInfo.lineNumber !== lastFixInfo.lineNumber) || - (fixInfo.editColumn !== lastFixInfo.editColumn) || - (fixInfo.deleteCount !== lastFixInfo.deleteCount) || - (fixInfo.insertText !== lastFixInfo.insertText) - ); - lastFixInfo = fixInfo; - return unique; - }); - // Collapse insert/no-delete and no-insert/delete for same line/column - lastFixInfo = { - "lineNumber": -1 - }; - for (const fixInfo of fixInfos) { - if ( - (fixInfo.lineNumber === lastFixInfo.lineNumber) && - (fixInfo.editColumn === lastFixInfo.editColumn) && - !fixInfo.insertText && - (fixInfo.deleteCount > 0) && - lastFixInfo.insertText && - !lastFixInfo.deleteCount) { - fixInfo.insertText = lastFixInfo.insertText; - lastFixInfo.lineNumber = 0; - } - lastFixInfo = fixInfo; - } - fixInfos = fixInfos.filter((fixInfo) => fixInfo.lineNumber); - // Apply all (remaining/updated) fixes - let lastLineIndex = -1; - let lastEditIndex = -1; - for (const fixInfo of fixInfos) { - const { lineNumber, editColumn, deleteCount } = fixInfo; - const lineIndex = lineNumber - 1; - const editIndex = editColumn - 1; - if ( - (lineIndex !== lastLineIndex) || - (deleteCount === -1) || - ((editIndex + deleteCount) <= - (lastEditIndex - ((deleteCount > 0) ? 0 : 1))) - ) { - // @ts-ignore - lines[lineIndex] = applyFix(lines[lineIndex], fixInfo, lineEnding); - } - lastLineIndex = lineIndex; - lastEditIndex = editIndex; - } - // Return corrected input - return lines.filter((line) => line !== null).join(lineEnding); -} - -/** - * Gets the (semantic) version of the library. - * - * @returns {string} SemVer string. - */ -function getVersion() { - return version; -} - -// Export a/synchronous/Promise APIs -markdownlint.sync = markdownlintSync; -markdownlint.readConfig = readConfig; -markdownlint.readConfigSync = readConfigSync; -markdownlint.getVersion = getVersion; -markdownlint.promises = { - "markdownlint": markdownlintPromise, - "extendConfig": extendConfigPromise, - "readConfig": readConfigPromise -}; -markdownlint.applyFix = applyFix; -markdownlint.applyFixes = applyFixes; -module.exports = markdownlint; - -// Type declarations - -/** - * Function to implement rule logic. - * - * @callback RuleFunction - * @param {RuleParams} params Rule parameters. - * @param {RuleOnError} onError Error-reporting callback. - * @returns {void} - */ - -/* eslint-disable jsdoc/valid-types */ - -/** - * Rule parameters. - * - * @typedef {Object} RuleParams - * @property {string} name File/string name. - * @property {MarkdownParsers} parsers Markdown parser data. - * @property {readonly string[]} lines File/string lines. - * @property {readonly string[]} frontMatterLines Front matter lines. - * @property {RuleConfiguration} config Rule configuration. - * @property {string} version Version of the markdownlint library. - */ - -/* eslint-enable jsdoc/valid-types */ - -/** - * Markdown parser data. - * - * @typedef {Object} MarkdownParsers - * @property {ParserMarkdownIt} markdownit Markdown parser data from markdown-it (only present when Rule.parser is "markdownit"). - * @property {ParserMicromark} micromark Markdown parser data from micromark (only present when Rule.parser is "micromark"). - */ - -/** - * Markdown parser data from markdown-it. - * - * @typedef {Object} ParserMarkdownIt - * @property {MarkdownItToken[]} tokens Token objects from markdown-it. - */ - -/** - * Markdown parser data from micromark. - * - * @typedef {Object} ParserMicromark - * @property {MicromarkToken[]} tokens Token objects from micromark. - */ - -/** - * markdown-it token. - * - * @typedef {Object} MarkdownItToken - * @property {string[][]} attrs HTML attributes. - * @property {boolean} block Block-level token. - * @property {MarkdownItToken[]} children Child nodes. - * @property {string} content Tag contents. - * @property {boolean} hidden Ignore element. - * @property {string} info Fence info. - * @property {number} level Nesting level. - * @property {number[]} map Beginning/ending line numbers. - * @property {string} markup Markup text. - * @property {Object} meta Arbitrary data. - * @property {number} nesting Level change. - * @property {string} tag HTML tag name. - * @property {string} type Token type. - * @property {number} lineNumber Line number (1-based). - * @property {string} line Line content. - */ - -/** @typedef {import("markdownlint-micromark").TokenType} MicromarkTokenType */ - -/** - * micromark token. - * - * @typedef {Object} MicromarkToken - * @property {MicromarkTokenType} type Token type. - * @property {number} startLine Start line (1-based). - * @property {number} startColumn Start column (1-based). - * @property {number} endLine End line (1-based). - * @property {number} endColumn End column (1-based). - * @property {string} text Token text. - * @property {MicromarkToken[]} children Child tokens. - * @property {MicromarkToken | null} parent Parent token. - */ - -/** - * Error-reporting callback. - * - * @callback RuleOnError - * @param {RuleOnErrorInfo} onErrorInfo Error information. - * @returns {void} - */ - -/** - * Fix information for RuleOnError callback. - * - * @typedef {Object} RuleOnErrorInfo - * @property {number} lineNumber Line number (1-based). - * @property {string} [detail] Detail about the error. - * @property {string} [context] Context for the error. - * @property {URL} [information] Link to more information. - * @property {number[]} [range] Column number (1-based) and length. - * @property {RuleOnErrorFixInfo} [fixInfo] Fix information. - */ - -/** - * Fix information for RuleOnErrorInfo. - * - * @typedef {Object} RuleOnErrorFixInfo - * @property {number} [lineNumber] Line number (1-based). - * @property {number} [editColumn] Column of the fix (1-based). - * @property {number} [deleteCount] Count of characters to delete. - * @property {string} [insertText] Text to insert (after deleting). - */ - -/** - * RuleOnErrorInfo with all optional properties present. - * - * @typedef {Object} RuleOnErrorFixInfoNormalized - * @property {number} lineNumber Line number (1-based). - * @property {number} editColumn Column of the fix (1-based). - * @property {number} deleteCount Count of characters to delete. - * @property {string} insertText Text to insert (after deleting). - */ - -/** - * Rule definition. - * - * @typedef {Object} Rule - * @property {string[]} names Rule name(s). - * @property {string} description Rule description. - * @property {URL} [information] Link to more information. - * @property {string[]} tags Rule tag(s). - * @property {"markdownit" | "micromark" | "none"} parser Parser used. - * @property {boolean} [asynchronous] True if asynchronous. - * @property {RuleFunction} function Rule implementation. - */ - -/** - * Configuration options. - * - * @typedef {Object} Options - * @property {Configuration} [config] Configuration object. - * @property {ConfigurationParser[]} [configParsers] Configuration parsers. - * @property {Rule[] | Rule} [customRules] Custom rules. - * @property {string[] | string} [files] Files to lint. - * @property {RegExp | null} [frontMatter] Front matter pattern. - * @property {Object} [fs] File system implementation. - * @property {boolean} [handleRuleFailures] True to catch exceptions. - * @property {Plugin[]} [markdownItPlugins] Additional plugins. - * @property {boolean} [noInlineConfig] True to ignore HTML directives. - * @property {number} [resultVersion] Results object version. - * @property {Object.} [strings] Strings to lint. - */ - -/** - * A markdown-it plugin. - * - * @typedef {Array} Plugin - */ - -/** - * Function to pretty-print lint results. - * - * @callback ToStringCallback - * @param {boolean} [ruleAliases] True to use rule aliases. - * @returns {string} - */ - -/** - * Lint results (for resultVersion 3). - * - * @typedef {Object.} LintResults - * @property {ToStringCallback} toString String representation. - */ - -/** - * Lint error. - * - * @typedef {Object} LintError - * @property {number} lineNumber Line number (1-based). - * @property {string[]} ruleNames Rule name(s). - * @property {string} ruleDescription Rule description. - * @property {string} ruleInformation Link to more information. - * @property {string} errorDetail Detail about the error. - * @property {string} errorContext Context for the error. - * @property {number[]} errorRange Column number (1-based) and length. - * @property {FixInfo} [fixInfo] Fix information. - */ - -/** - * Fix information. - * - * @typedef {Object} FixInfo - * @property {number} [lineNumber] Line number (1-based). - * @property {number} [editColumn] Column of the fix (1-based). - * @property {number} [deleteCount] Count of characters to delete. - * @property {string} [insertText] Text to insert (after deleting). - */ - -/** - * Called with the result of linting a string or document. - * - * @callback LintContentCallback - * @param {Error | null} error Error iff failed. - * @param {LintError[]} [result] Result iff successful. - * @returns {void} - */ - -/** - * Called with the result of the lint function. - * - * @callback LintCallback - * @param {Error | null} error Error object iff failed. - * @param {LintResults} [results] Lint results iff succeeded. - * @returns {void} - */ - -/** - * Configuration object for linting rules. For the JSON schema, see - * {@link ../schema/markdownlint-config-schema.json}. - * - * @typedef {import("./configuration").Configuration} Configuration - */ - -/** - * Configuration object for linting rules strictly. For the JSON schema, see - * {@link ../schema/markdownlint-config-schema-strict.json}. - * - * @typedef {import("./configuration-strict").ConfigurationStrict} ConfigurationStrict - */ - -/** - * Rule configuration object. - * - * @typedef {boolean | Object} RuleConfiguration Rule configuration. - */ - -/** - * Parses a configuration string and returns a configuration object. - * - * @callback ConfigurationParser - * @param {string} text Configuration string. - * @returns {Configuration} - */ - -/** - * Called with the result of the readConfig function. - * - * @callback ReadConfigCallback - * @param {Error | null} err Error object or null. - * @param {Configuration} [config] Configuration object. - * @returns {void} - */ - -/** - * Called with the result of the resolveConfigExtends function. - * - * @callback ResolveConfigExtendsCallback - * @param {Error | null} err Error object or null. - * @param {string} [path] Resolved path to file. - * @returns {void} - */ - - -/***/ }), - -/***/ "../lib/md001.js": -/*!***********************!*\ - !*** ../lib/md001.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getHeadingLevel } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD001", "heading-increment" ], - "description": "Heading levels should only increment by one level at a time", - "tags": [ "headings" ], - "parser": "micromark", - "function": function MD001(params, onError) { - let prevLevel = Number.MAX_SAFE_INTEGER; - for (const heading of filterByTypesCached([ "atxHeading", "setextHeading" ])) { - const level = getHeadingLevel(heading); - if (level > prevLevel) { - addErrorDetailIf( - onError, - heading.startLine, - `h${prevLevel + 1}`, - `h${level}` - ); - } - prevLevel = level; - } - } -}; - - -/***/ }), - -/***/ "../lib/md003.js": -/*!***********************!*\ - !*** ../lib/md003.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getHeadingLevel, getHeadingStyle } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD003", "heading-style" ], - "description": "Heading style", - "tags": [ "headings" ], - "parser": "micromark", - "function": function MD003(params, onError) { - let style = String(params.config.style || "consistent"); - for (const heading of filterByTypesCached([ "atxHeading", "setextHeading" ])) { - const styleForToken = getHeadingStyle(heading); - if (style === "consistent") { - style = styleForToken; - } - if (styleForToken !== style) { - const h12 = getHeadingLevel(heading) <= 2; - const setextWithAtx = - (style === "setext_with_atx") && - ((h12 && (styleForToken === "setext")) || - (!h12 && (styleForToken === "atx"))); - const setextWithAtxClosed = - (style === "setext_with_atx_closed") && - ((h12 && (styleForToken === "setext")) || - (!h12 && (styleForToken === "atx_closed"))); - if (!setextWithAtx && !setextWithAtxClosed) { - let expected = style; - if (style === "setext_with_atx") { - expected = h12 ? "setext" : "atx"; - } else if (style === "setext_with_atx_closed") { - expected = h12 ? "setext" : "atx_closed"; - } - addErrorDetailIf( - onError, - heading.startLine, - expected, - styleForToken - ); - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md004.js": -/*!***********************!*\ - !*** ../lib/md004.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getDescendantsByType, getParentOfType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const markerToStyle = { - "-": "dash", - "+": "plus", - "*": "asterisk" -}; -const styleToMarker = { - "dash": "-", - "plus": "+", - "asterisk": "*" -}; -const differentItemStyle = { - "dash": "plus", - "plus": "asterisk", - "asterisk": "dash" -}; -const validStyles = new Set([ - "asterisk", - "consistent", - "dash", - "plus", - "sublist" -]); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD004", "ul-style" ], - "description": "Unordered list style", - "tags": [ "bullet", "ul" ], - "parser": "micromark", - "function": function MD004(params, onError) { - const style = String(params.config.style || "consistent"); - let expectedStyle = validStyles.has(style) ? style : "dash"; - const nestingStyles = []; - for (const listUnordered of filterByTypesCached([ "listUnordered" ])) { - let nesting = 0; - if (style === "sublist") { - /** @type {import("../helpers/micromark-helpers.cjs").Token | null} */ - let parent = listUnordered; - // @ts-ignore - while ((parent = getParentOfType(parent, [ "listOrdered", "listUnordered" ]))) { - nesting++; - } - } - const listItemMarkers = getDescendantsByType(listUnordered, [ "listItemPrefix", "listItemMarker" ]); - for (const listItemMarker of listItemMarkers) { - const itemStyle = markerToStyle[listItemMarker.text]; - if (style === "sublist") { - if (!nestingStyles[nesting]) { - nestingStyles[nesting] = - (itemStyle === nestingStyles[nesting - 1]) ? - differentItemStyle[itemStyle] : - itemStyle; - } - expectedStyle = nestingStyles[nesting]; - } else if (expectedStyle === "consistent") { - expectedStyle = itemStyle; - } - const column = listItemMarker.startColumn; - const length = listItemMarker.endColumn - listItemMarker.startColumn; - addErrorDetailIf( - onError, - listItemMarker.startLine, - expectedStyle, - itemStyle, - undefined, - undefined, - [ column, length ], - { - "editColumn": column, - "deleteCount": length, - "insertText": styleToMarker[expectedStyle] - } - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md005.js": -/*!***********************!*\ - !*** ../lib/md005.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError, addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD005", "list-indent" ], - "description": "Inconsistent indentation for list items at the same level", - "tags": [ "bullet", "ul", "indentation" ], - "parser": "micromark", - "function": function MD005(params, onError) { - for (const list of filterByTypesCached([ "listOrdered", "listUnordered" ])) { - const expectedIndent = list.startColumn - 1; - let expectedEnd = 0; - let endMatching = false; - const listItemPrefixes = - list.children.filter((token) => (token.type === "listItemPrefix")); - for (const listItemPrefix of listItemPrefixes) { - const lineNumber = listItemPrefix.startLine; - const actualIndent = listItemPrefix.startColumn - 1; - const range = [ 1, listItemPrefix.endColumn - 1 ]; - if (list.type === "listUnordered") { - addErrorDetailIf( - onError, - lineNumber, - expectedIndent, - actualIndent, - undefined, - undefined, - range - // No fixInfo; MD007 handles this scenario better - ); - } else { - const markerLength = listItemPrefix.text.trim().length; - const actualEnd = listItemPrefix.startColumn + markerLength - 1; - expectedEnd = expectedEnd || actualEnd; - if ((expectedIndent !== actualIndent) || endMatching) { - if (expectedEnd === actualEnd) { - endMatching = true; - } else { - const detail = endMatching ? - `Expected: (${expectedEnd}); Actual: (${actualEnd})` : - `Expected: ${expectedIndent}; Actual: ${actualIndent}`; - const expected = endMatching ? - expectedEnd - markerLength : - expectedIndent; - const actual = endMatching ? - actualEnd - markerLength : - actualIndent; - addError( - onError, - lineNumber, - detail, - undefined, - range, - { - "editColumn": Math.min(actual, expected) + 1, - "deleteCount": Math.max(actual - expected, 0), - "insertText": "".padEnd(Math.max(expected - actual, 0)) - } - ); - } - } - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md007.js": -/*!***********************!*\ - !*** ../lib/md007.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getParentOfType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("markdownlint-micromark").TokenType[] */ -const unorderedListTypes = - [ "blockQuotePrefix", "listItemPrefix", "listUnordered" ]; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("markdownlint-micromark").TokenType[] */ -const unorderedParentTypes = - [ "blockQuote", "listOrdered", "listUnordered" ]; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD007", "ul-indent" ], - "description": "Unordered list indentation", - "tags": [ "bullet", "ul", "indentation" ], - "parser": "micromark", - "function": function MD007(params, onError) { - const indent = Number(params.config.indent || 2); - const startIndented = !!params.config.start_indented; - const startIndent = Number(params.config.start_indent || indent); - const unorderedListNesting = new Map(); - let lastBlockQuotePrefix = null; - const tokens = filterByTypesCached(unorderedListTypes); - for (const token of tokens) { - const { endColumn, parent, startColumn, startLine, type } = token; - if (type === "blockQuotePrefix") { - lastBlockQuotePrefix = token; - } else if (type === "listUnordered") { - let nesting = 0; - /** @type {import("../helpers/micromark-helpers.cjs").Token | null} */ - let current = token; - while ( - // @ts-ignore - (current = getParentOfType(current, unorderedParentTypes)) - ) { - if (current.type === "listUnordered") { - nesting++; - // eslint-disable-next-line no-continue - continue; - } else if (current.type === "listOrdered") { - nesting = -1; - } - break; - } - if (nesting >= 0) { - unorderedListNesting.set(token, nesting); - } - } else { - // listItemPrefix - const nesting = unorderedListNesting.get(parent); - if (nesting !== undefined) { - // listItemPrefix for listUnordered - const expectedIndent = - (startIndented ? startIndent : 0) + (nesting * indent); - const blockQuoteAdjustment = - (lastBlockQuotePrefix?.endLine === startLine) ? - (lastBlockQuotePrefix.endColumn - 1) : - 0; - const actualIndent = startColumn - 1 - blockQuoteAdjustment; - const range = [ 1, endColumn - 1 ]; - const fixInfo = { - "editColumn": startColumn - actualIndent, - "deleteCount": Math.max(actualIndent - expectedIndent, 0), - "insertText": "".padEnd(Math.max(expectedIndent - actualIndent, 0)) - }; - addErrorDetailIf( - onError, - startLine, - expectedIndent, - actualIndent, - undefined, - undefined, - range, - fixInfo - ); - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md009.js": -/*!***********************!*\ - !*** ../lib/md009.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { addRangeToSet } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD009", "no-trailing-spaces" ], - "description": "Trailing spaces", - "tags": [ "whitespace" ], - "parser": "micromark", - "function": function MD009(params, onError) { - let brSpaces = params.config.br_spaces; - brSpaces = Number((brSpaces === undefined) ? 2 : brSpaces); - const listItemEmptyLines = !!params.config.list_item_empty_lines; - const strict = !!params.config.strict; - const codeBlockLineNumbers = new Set(); - for (const codeBlock of filterByTypesCached([ "codeFenced" ])) { - addRangeToSet(codeBlockLineNumbers, codeBlock.startLine + 1, codeBlock.endLine - 1); - } - for (const codeBlock of filterByTypesCached([ "codeIndented" ])) { - addRangeToSet(codeBlockLineNumbers, codeBlock.startLine, codeBlock.endLine); - } - const listItemLineNumbers = new Set(); - if (listItemEmptyLines) { - for (const listBlock of filterByTypesCached([ "listOrdered", "listUnordered" ])) { - addRangeToSet(listItemLineNumbers, listBlock.startLine, listBlock.endLine); - let trailingIndent = true; - for (let i = listBlock.children.length - 1; i >= 0; i--) { - const child = listBlock.children[i]; - switch (child.type) { - case "content": - trailingIndent = false; - break; - case "listItemIndent": - if (trailingIndent) { - listItemLineNumbers.delete(child.startLine); - } - break; - case "listItemPrefix": - trailingIndent = true; - break; - default: - break; - } - } - } - } - const paragraphLineNumbers = new Set(); - const codeInlineLineNumbers = new Set(); - if (strict) { - for (const paragraph of filterByTypesCached([ "paragraph" ])) { - addRangeToSet(paragraphLineNumbers, paragraph.startLine, paragraph.endLine - 1); - } - for (const codeText of filterByTypesCached([ "codeText" ])) { - addRangeToSet(codeInlineLineNumbers, codeText.startLine, codeText.endLine - 1); - } - } - const expected = (brSpaces < 2) ? 0 : brSpaces; - for (let lineIndex = 0; lineIndex < params.lines.length; lineIndex++) { - const line = params.lines[lineIndex]; - const lineNumber = lineIndex + 1; - const trailingSpaces = line.length - line.trimEnd().length; - if ( - trailingSpaces && - !codeBlockLineNumbers.has(lineNumber) && - !listItemLineNumbers.has(lineNumber) && - ( - (expected !== trailingSpaces) || - (strict && - (!paragraphLineNumbers.has(lineNumber) || - codeInlineLineNumbers.has(lineNumber))) - ) - ) { - const column = line.length - trailingSpaces + 1; - addError( - onError, - lineNumber, - "Expected: " + (expected === 0 ? "" : "0 or ") + - expected + "; Actual: " + trailingSpaces, - undefined, - [ column, trailingSpaces ], - { - "editColumn": column, - "deleteCount": trailingSpaces - } - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md010.js": -/*!***********************!*\ - !*** ../lib/md010.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError, hasOverlap } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getDescendantsByType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const tabRe = /\t+/g; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD010", "no-hard-tabs" ], - "description": "Hard tabs", - "tags": [ "whitespace", "hard_tab" ], - "parser": "micromark", - "function": function MD010(params, onError) { - const codeBlocks = params.config.code_blocks; - const includeCode = (codeBlocks === undefined) ? true : !!codeBlocks; - const ignoreCodeLanguages = new Set( - (params.config.ignore_code_languages || []) - .map((language) => language.toLowerCase()) - ); - const spacesPerTab = params.config.spaces_per_tab; - const spaceMultiplier = (spacesPerTab === undefined) ? - 1 : - Math.max(0, Number(spacesPerTab)); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../helpers/micromark-helpers.cjs").TokenType[] */ - const exclusionTypes = []; - if (includeCode) { - if (ignoreCodeLanguages.size > 0) { - exclusionTypes.push("codeFenced"); - } - } else { - exclusionTypes.push("codeFenced", "codeIndented", "codeText"); - } - const codeTokens = filterByTypesCached(exclusionTypes).filter((token) => { - if ((token.type === "codeFenced") && (ignoreCodeLanguages.size > 0)) { - const fenceInfos = getDescendantsByType(token, [ "codeFencedFence", "codeFencedFenceInfo" ]); - return fenceInfos.every((fenceInfo) => ignoreCodeLanguages.has(fenceInfo.text.toLowerCase())); - } - return true; - }); - const codeRanges = codeTokens.map((token) => { - const { type, startLine, startColumn, endLine, endColumn } = token; - const codeFenced = (type === "codeFenced"); - return { - "startLine": startLine + (codeFenced ? 1 : 0), - "startColumn": codeFenced ? 0 : startColumn, - "endLine": endLine - (codeFenced ? 1 : 0), - "endColumn": codeFenced ? Number.MAX_SAFE_INTEGER : endColumn - }; - }); - for (let lineIndex = 0; lineIndex < params.lines.length; lineIndex++) { - const line = params.lines[lineIndex]; - let match = null; - while ((match = tabRe.exec(line)) !== null) { - const lineNumber = lineIndex + 1; - const column = match.index + 1; - const length = match[0].length; - /** @type {import("../helpers").FileRange} */ - const range = { "startLine": lineNumber, "startColumn": column, "endLine": lineNumber, "endColumn": column + length - 1 }; - if (!codeRanges.some((codeRange) => hasOverlap(codeRange, range))) { - addError( - onError, - lineNumber, - "Column: " + column, - undefined, - [ column, length ], - { - "editColumn": column, - "deleteCount": length, - "insertText": "".padEnd(length * spaceMultiplier) - } - ); - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md011.js": -/*!***********************!*\ - !*** ../lib/md011.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError, hasOverlap } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { addRangeToSet } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const reversedLinkRe = - /(^|[^\\])\(([^()]+)\)\[([^\]^][^\]]*)\](?!\()/g; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD011", "no-reversed-links" ], - "description": "Reversed link syntax", - "tags": [ "links" ], - "parser": "micromark", - "function": function MD011(params, onError) { - const codeBlockLineNumbers = new Set(); - for (const codeBlock of filterByTypesCached([ "codeFenced", "codeIndented" ])) { - addRangeToSet(codeBlockLineNumbers, codeBlock.startLine, codeBlock.endLine); - } - const codeTexts = filterByTypesCached([ "codeText" ]); - for (const [ lineIndex, line ] of params.lines.entries()) { - const lineNumber = lineIndex + 1; - if (!codeBlockLineNumbers.has(lineNumber)) { - let match = null; - while ((match = reversedLinkRe.exec(line)) !== null) { - const [ reversedLink, preChar, linkText, linkDestination ] = match; - if ( - !linkText.endsWith("\\") && - !linkDestination.endsWith("\\") - ) { - const column = match.index + preChar.length + 1; - const length = match[0].length - preChar.length; - /** @type {import("../helpers").FileRange} */ - const range = { "startLine": lineNumber, "startColumn": column, "endLine": lineNumber, "endColumn": column + length - 1 }; - if (!codeTexts.some((codeText) => hasOverlap(codeText, range))) { - addError( - onError, - lineNumber, - reversedLink.slice(preChar.length), - undefined, - [ column, length ], - { - "editColumn": column, - "deleteCount": length, - "insertText": `[${linkText}](${linkDestination})` - } - ); - } - } - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md012.js": -/*!***********************!*\ - !*** ../lib/md012.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { addRangeToSet } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD012", "no-multiple-blanks" ], - "description": "Multiple consecutive blank lines", - "tags": [ "whitespace", "blank_lines" ], - "parser": "micromark", - "function": function MD012(params, onError) { - const maximum = Number(params.config.maximum || 1); - const { lines } = params; - const codeBlockLineNumbers = new Set(); - for (const codeBlock of filterByTypesCached([ "codeFenced", "codeIndented" ])) { - addRangeToSet(codeBlockLineNumbers, codeBlock.startLine, codeBlock.endLine); - } - let count = 0; - for (const [ lineIndex, line ] of lines.entries()) { - const inCode = codeBlockLineNumbers.has(lineIndex + 1); - count = (inCode || (line.trim().length > 0)) ? 0 : count + 1; - if (maximum < count) { - addErrorDetailIf( - onError, - lineIndex + 1, - maximum, - count, - undefined, - undefined, - undefined, - { - "deleteCount": -1 - } - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md013.js": -/*!***********************!*\ - !*** ../lib/md013.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getReferenceLinkImageData } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); -const { addRangeToSet, getDescendantsByType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const longLineRePrefix = "^.{"; -const longLineRePostfixRelaxed = "}.*\\s.*$"; -const longLineRePostfixStrict = "}.+$"; -const sternModeRe = /^(?:[#>\s]*\s)?\S*$/; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD013", "line-length" ], - "description": "Line length", - "tags": [ "line_length" ], - "parser": "micromark", - "function": function MD013(params, onError) { - const lineLength = Number(params.config.line_length || 80); - const headingLineLength = - Number(params.config.heading_line_length || lineLength); - const codeLineLength = - Number(params.config.code_block_line_length || lineLength); - const strict = !!params.config.strict; - const stern = !!params.config.stern; - const longLineRePostfix = - (strict || stern) ? longLineRePostfixStrict : longLineRePostfixRelaxed; - const longLineRe = - new RegExp(longLineRePrefix + lineLength + longLineRePostfix); - const longHeadingLineRe = - new RegExp(longLineRePrefix + headingLineLength + longLineRePostfix); - const longCodeLineRe = - new RegExp(longLineRePrefix + codeLineLength + longLineRePostfix); - const codeBlocks = params.config.code_blocks; - const includeCodeBlocks = (codeBlocks === undefined) ? true : !!codeBlocks; - const tables = params.config.tables; - const includeTables = (tables === undefined) ? true : !!tables; - const headings = params.config.headings; - const includeHeadings = (headings === undefined) ? true : !!headings; - const headingLineNumbers = new Set(); - for (const heading of filterByTypesCached([ "atxHeading", "setextHeading" ])) { - addRangeToSet(headingLineNumbers, heading.startLine, heading.endLine); - } - const codeBlockLineNumbers = new Set(); - for (const codeBlock of filterByTypesCached([ "codeFenced", "codeIndented" ])) { - addRangeToSet(codeBlockLineNumbers, codeBlock.startLine, codeBlock.endLine); - } - const tableLineNumbers = new Set(); - for (const table of filterByTypesCached([ "table" ])) { - addRangeToSet(tableLineNumbers, table.startLine, table.endLine); - } - const linkLineNumbers = new Set(); - for (const link of filterByTypesCached([ "autolink", "image", "link", "literalAutolink" ])) { - addRangeToSet(linkLineNumbers, link.startLine, link.endLine); - } - const paragraphDataLineNumbers = new Set(); - for (const paragraph of filterByTypesCached([ "paragraph" ])) { - for (const data of getDescendantsByType(paragraph, [ "data" ])) { - addRangeToSet(paragraphDataLineNumbers, data.startLine, data.endLine); - } - } - const linkOnlyLineNumbers = new Set(); - for (const lineNumber of linkLineNumbers) { - if (!paragraphDataLineNumbers.has(lineNumber)) { - linkOnlyLineNumbers.add(lineNumber); - } - } - const definitionLineIndices = new Set(getReferenceLinkImageData().definitionLineIndices); - for (let lineIndex = 0; lineIndex < params.lines.length; lineIndex++) { - const line = params.lines[lineIndex]; - const lineNumber = lineIndex + 1; - const isHeading = headingLineNumbers.has(lineNumber); - const inCode = codeBlockLineNumbers.has(lineNumber); - const inTable = tableLineNumbers.has(lineNumber); - const length = inCode ? - codeLineLength : - (isHeading ? headingLineLength : lineLength); - const lengthRe = inCode ? - longCodeLineRe : - (isHeading ? longHeadingLineRe : longLineRe); - if ((includeCodeBlocks || !inCode) && - (includeTables || !inTable) && - (includeHeadings || !isHeading) && - !definitionLineIndices.has(lineIndex) && - (strict || - (!(stern && sternModeRe.test(line)) && - !linkOnlyLineNumbers.has(lineNumber))) && - lengthRe.test(line)) { - addErrorDetailIf( - onError, - lineNumber, - length, - line.length, - undefined, - undefined, - [ length + 1, line.length - length ] - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md014.js": -/*!***********************!*\ - !*** ../lib/md014.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const dollarCommandRe = /^(\s*)(\$\s+)/; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD014", "commands-show-output" ], - "description": "Dollar signs used before commands without showing output", - "tags": [ "code" ], - "parser": "micromark", - "function": function MD014(params, onError) { - for (const codeBlock of filterByTypesCached([ "codeFenced", "codeIndented" ])) { - const codeFlowValues = codeBlock.children.filter((child) => child.type === "codeFlowValue"); - const dollarMatches = codeFlowValues - .map((codeFlowValue) => ({ - "result": codeFlowValue.text.match(dollarCommandRe), - "startColumn": codeFlowValue.startColumn, - "startLine": codeFlowValue.startLine, - "text": codeFlowValue.text - })) - .filter((dollarMatch) => dollarMatch.result); - if (dollarMatches.length === codeFlowValues.length) { - for (const dollarMatch of dollarMatches) { - // @ts-ignore - const column = dollarMatch.startColumn + dollarMatch.result[1].length; - // @ts-ignore - const length = dollarMatch.result[2].length; - addErrorContext( - onError, - dollarMatch.startLine, - dollarMatch.text, - undefined, - undefined, - [ column, length ], - { - "editColumn": column, - "deleteCount": length - } - ); - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md018.js": -/*!***********************!*\ - !*** ../lib/md018.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { addRangeToSet } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD018", "no-missing-space-atx" ], - "description": "No space after hash on atx style heading", - "tags": [ "headings", "atx", "spaces" ], - "parser": "micromark", - "function": function MD018(params, onError) { - const { lines } = params; - const ignoreBlockLineNumbers = new Set(); - for (const ignoreBlock of filterByTypesCached([ "codeFenced", "codeIndented", "htmlFlow" ])) { - addRangeToSet(ignoreBlockLineNumbers, ignoreBlock.startLine, ignoreBlock.endLine); - } - for (const [ lineIndex, line ] of lines.entries()) { - if ( - !ignoreBlockLineNumbers.has(lineIndex + 1) && - /^#+[^# \t]/.test(line) && - !/#\s*$/.test(line) && - !line.startsWith("#️⃣") - ) { - // @ts-ignore - const hashCount = /^#+/.exec(line)[0].length; - addErrorContext( - onError, - lineIndex + 1, - line.trim(), - undefined, - undefined, - [ 1, hashCount + 1 ], - { - "editColumn": hashCount + 1, - "insertText": " " - } - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md019-md021.js": -/*!*****************************!*\ - !*** ../lib/md019-md021.js ***! - \*****************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext } = __webpack_require__(/*! ../helpers/helpers */ "../helpers/helpers.js"); -const { getHeadingStyle } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -/** - * Validate heading sequence and whitespace length at start or end. - * - * @param {import("./markdownlint").RuleOnError} onError Error-reporting callback. - * @param {import("./markdownlint").MicromarkToken} heading ATX heading token. - * @param {number} delta Direction to scan. - * @returns {void} - */ -function validateHeadingSpaces(onError, heading, delta) { - const { children, startLine, text } = heading; - let index = (delta > 0) ? 0 : (children.length - 1); - while ( - children[index] && - (children[index].type !== "atxHeadingSequence") - ) { - index += delta; - } - const headingSequence = children[index]; - const whitespace = children[index + delta]; - if ( - (headingSequence?.type === "atxHeadingSequence") && - (whitespace?.type === "whitespace") && - (whitespace.text.length > 1) - ) { - const column = whitespace.startColumn + 1; - const length = whitespace.endColumn - column; - addErrorContext( - onError, - startLine, - text.trim(), - delta > 0, - delta < 0, - [ column, length ], - { - "editColumn": column, - "deleteCount": length - } - ); - } -} - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule[] */ -module.exports = [ - { - "names": [ "MD019", "no-multiple-space-atx" ], - "description": "Multiple spaces after hash on atx style heading", - "tags": [ "headings", "atx", "spaces" ], - "parser": "micromark", - "function": function MD019(params, onError) { - const atxHeadings = filterByTypesCached([ "atxHeading" ]) - .filter((heading) => getHeadingStyle(heading) === "atx"); - for (const atxHeading of atxHeadings) { - validateHeadingSpaces(onError, atxHeading, 1); - } - } - }, - { - "names": [ "MD021", "no-multiple-space-closed-atx" ], - "description": "Multiple spaces inside hashes on closed atx style heading", - "tags": [ "headings", "atx_closed", "spaces" ], - "parser": "micromark", - "function": function MD021(params, onError) { - const atxClosedHeadings = filterByTypesCached([ "atxHeading" ]) - .filter((heading) => getHeadingStyle(heading) === "atx_closed"); - for (const atxClosedHeading of atxClosedHeadings) { - validateHeadingSpaces(onError, atxClosedHeading, 1); - validateHeadingSpaces(onError, atxClosedHeading, -1); - } - } - } -]; - - -/***/ }), - -/***/ "../lib/md020.js": -/*!***********************!*\ - !*** ../lib/md020.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { addRangeToSet } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD020", "no-missing-space-closed-atx" ], - "description": "No space inside hashes on closed atx style heading", - "tags": [ "headings", "atx_closed", "spaces" ], - "parser": "micromark", - "function": function MD020(params, onError) { - const { lines } = params; - const ignoreBlockLineNumbers = new Set(); - for (const ignoreBlock of filterByTypesCached([ "codeFenced", "codeIndented", "htmlFlow" ])) { - addRangeToSet(ignoreBlockLineNumbers, ignoreBlock.startLine, ignoreBlock.endLine); - } - for (const [ lineIndex, line ] of lines.entries()) { - if (!ignoreBlockLineNumbers.has(lineIndex + 1)) { - const match = - /^(#+)([ \t]*)([^# \t\\]|[^# \t][^#]*?[^# \t\\])([ \t]*)((?:\\#)?)(#+)(\s*)$/.exec(line); - if (match) { - const [ - , - leftHash, - { "length": leftSpaceLength }, - content, - { "length": rightSpaceLength }, - rightEscape, - rightHash, - { "length": trailSpaceLength } - ] = match; - const leftHashLength = leftHash.length; - const rightHashLength = rightHash.length; - const left = !leftSpaceLength; - const right = !rightSpaceLength || !!rightEscape; - const rightEscapeReplacement = rightEscape ? `${rightEscape} ` : ""; - if (left || right) { - const range = left ? - [ - 1, - leftHashLength + 1 - ] : - [ - line.length - trailSpaceLength - rightHashLength, - rightHashLength + 1 - ]; - addErrorContext( - onError, - lineIndex + 1, - line.trim(), - left, - right, - range, - { - "editColumn": 1, - "deleteCount": line.length, - "insertText": - `${leftHash} ${content} ${rightEscapeReplacement}${rightHash}` - } - ); - } - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md022.js": -/*!***********************!*\ - !*** ../lib/md022.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf, isBlankLine } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getBlockQuotePrefixText, getHeadingLevel } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const defaultLines = 1; - -const getLinesFunction = (linesParam) => { - if (Array.isArray(linesParam)) { - const linesArray = new Array(6).fill(defaultLines); - for (const [ index, value ] of [ ...linesParam.entries() ].slice(0, 6)) { - linesArray[index] = value; - } - return (heading) => linesArray[getHeadingLevel(heading) - 1]; - } - // Coerce linesParam to a number - const lines = (linesParam === undefined) ? defaultLines : Number(linesParam); - return () => lines; -}; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD022", "blanks-around-headings" ], - "description": "Headings should be surrounded by blank lines", - "tags": [ "headings", "blank_lines" ], - "parser": "micromark", - "function": function MD022(params, onError) { - const getLinesAbove = getLinesFunction(params.config.lines_above); - const getLinesBelow = getLinesFunction(params.config.lines_below); - const { lines } = params; - const blockQuotePrefixes = filterByTypesCached([ "blockQuotePrefix", "linePrefix" ]); - for (const heading of filterByTypesCached([ "atxHeading", "setextHeading" ])) { - const { startLine, endLine } = heading; - const line = lines[startLine - 1].trim(); - - // Check lines above - const linesAbove = getLinesAbove(heading); - if (linesAbove >= 0) { - let actualAbove = 0; - for ( - let i = 0; - (i < linesAbove) && isBlankLine(lines[startLine - 2 - i]); - i++ - ) { - actualAbove++; - } - addErrorDetailIf( - onError, - startLine, - linesAbove, - actualAbove, - "Above", - line, - undefined, - { - "insertText": getBlockQuotePrefixText( - blockQuotePrefixes, - startLine - 1, - linesAbove - actualAbove - ) - } - ); - } - - // Check lines below - const linesBelow = getLinesBelow(heading); - if (linesBelow >= 0) { - let actualBelow = 0; - for ( - let i = 0; - (i < linesBelow) && isBlankLine(lines[endLine + i]); - i++ - ) { - actualBelow++; - } - addErrorDetailIf( - onError, - startLine, - linesBelow, - actualBelow, - "Below", - line, - undefined, - { - "lineNumber": endLine + 1, - "insertText": getBlockQuotePrefixText( - blockQuotePrefixes, - endLine + 1, - linesBelow - actualBelow - ) - } - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md023.js": -/*!***********************!*\ - !*** ../lib/md023.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD023", "heading-start-left" ], - "description": "Headings must start at the beginning of the line", - "tags": [ "headings", "spaces" ], - "parser": "micromark", - "function": function MD023(params, onError) { - const headings = filterByTypesCached([ "atxHeading", "linePrefix", "setextHeading" ]); - for (let i = 0; i < headings.length - 1; i++) { - if ( - (headings[i].type === "linePrefix") && - (headings[i + 1].type !== "linePrefix") && - (headings[i].startLine === headings[i + 1].startLine) - ) { - const { endColumn, startColumn, startLine } = headings[i]; - const length = endColumn - startColumn; - addErrorContext( - onError, - startLine, - params.lines[startLine - 1], - true, - false, - [ startColumn, length ], - { - "editColumn": startColumn, - "deleteCount": length - } - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md024.js": -/*!***********************!*\ - !*** ../lib/md024.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getHeadingLevel, getHeadingText } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD024", "no-duplicate-heading" ], - "description": "Multiple headings with the same content", - "tags": [ "headings" ], - "parser": "micromark", - "function": function MD024(params, onError) { - const siblingsOnly = !!params.config.siblings_only || false; - const knownContents = [ null, [] ]; - let lastLevel = 1; - let knownContent = knownContents[lastLevel]; - for (const heading of filterByTypesCached([ "atxHeading", "setextHeading" ])) { - const headingText = getHeadingText(heading); - if (siblingsOnly) { - const newLevel = getHeadingLevel(heading); - while (lastLevel < newLevel) { - lastLevel++; - knownContents[lastLevel] = []; - } - while (lastLevel > newLevel) { - knownContents[lastLevel] = []; - lastLevel--; - } - knownContent = knownContents[newLevel]; - } - // @ts-ignore - if (knownContent.includes(headingText)) { - addErrorContext( - onError, - heading.startLine, - headingText.trim() - ); - } else { - // @ts-ignore - knownContent.push(headingText); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md025.js": -/*!***********************!*\ - !*** ../lib/md025.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext, frontMatterHasTitle } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getHeadingLevel, getHeadingText } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD025", "single-title", "single-h1" ], - "description": "Multiple top-level headings in the same document", - "tags": [ "headings" ], - "parser": "micromark", - "function": function MD025(params, onError) { - const level = Number(params.config.level || 1); - const foundFrontMatterTitle = - frontMatterHasTitle( - params.frontMatterLines, - params.config.front_matter_title - ); - let hasTopLevelHeading = false; - for (const heading of filterByTypesCached([ "atxHeading", "setextHeading" ])) { - const headingLevel = getHeadingLevel(heading); - if (headingLevel === level) { - if (hasTopLevelHeading || foundFrontMatterTitle) { - const headingText = getHeadingText(heading); - addErrorContext( - onError, - heading.startLine, - headingText - ); - } else if (heading.startLine === 1) { - hasTopLevelHeading = true; - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md026.js": -/*!***********************!*\ - !*** ../lib/md026.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError, allPunctuationNoQuestion, endOfLineGemojiCodeRe, - endOfLineHtmlEntityRe, escapeForRegExp } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD026", "no-trailing-punctuation" ], - "description": "Trailing punctuation in heading", - "tags": [ "headings" ], - "parser": "micromark", - "function": function MD026(params, onError) { - let punctuation = params.config.punctuation; - punctuation = String( - (punctuation === undefined) ? allPunctuationNoQuestion : punctuation - ); - const trailingPunctuationRe = - new RegExp("\\s*[" + escapeForRegExp(punctuation) + "]+$"); - const headings = filterByTypesCached([ "atxHeadingText", "setextHeadingText" ]); - for (const heading of headings) { - const { endColumn, endLine, text } = heading; - const match = trailingPunctuationRe.exec(text); - if ( - match && - !endOfLineHtmlEntityRe.test(text) && - !endOfLineGemojiCodeRe.test(text) - ) { - const fullMatch = match[0]; - const length = fullMatch.length; - const column = endColumn - length; - addError( - onError, - endLine, - `Punctuation: '${fullMatch}'`, - undefined, - [ column, length ], - { - "editColumn": column, - "deleteCount": length - } - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md027.js": -/*!***********************!*\ - !*** ../lib/md027.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD027", "no-multiple-space-blockquote" ], - "description": "Multiple spaces after blockquote symbol", - "tags": [ "blockquote", "whitespace", "indentation" ], - "parser": "micromark", - "function": function MD027(params, onError) { - const { tokens } = params.parsers.micromark; - for (const token of filterByTypesCached([ "linePrefix" ])) { - const parent = token.parent; - const codeIndented = parent?.type === "codeIndented"; - const siblings = parent?.children || tokens; - if ( - !codeIndented && - (siblings[siblings.indexOf(token) - 1]?.type === "blockQuotePrefix") - ) { - const { startColumn, startLine, text } = token; - const { length } = text; - const line = params.lines[startLine - 1]; - addErrorContext( - onError, - startLine, - line, - undefined, - undefined, - [ startColumn, length ], - { - "editColumn": startColumn, - "deleteCount": length - } - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md028.js": -/*!***********************!*\ - !*** ../lib/md028.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const ignoreTypes = new Set([ "lineEnding", "listItemIndent", "linePrefix" ]); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD028", "no-blanks-blockquote" ], - "description": "Blank line inside blockquote", - "tags": [ "blockquote", "whitespace" ], - "parser": "micromark", - "function": function MD028(params, onError) { - for (const token of filterByTypesCached([ "blockQuote" ])) { - const errorLineNumbers = []; - const siblings = token.parent?.children || params.parsers.micromark.tokens; - for (let i = siblings.indexOf(token) + 1; i < siblings.length; i++) { - const sibling = siblings[i]; - const { startLine, type } = sibling; - if (type === "lineEndingBlank") { - // Possible blank between blockquotes - errorLineNumbers.push(startLine); - } else if (ignoreTypes.has(type)) { - // Ignore invisible formatting - } else if (type === "blockQuote") { - // Blockquote followed by blockquote - for (const lineNumber of errorLineNumbers) { - addError(onError, lineNumber); - } - break; - } else { - // Blockquote not followed by blockquote - break; - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md029.js": -/*!***********************!*\ - !*** ../lib/md029.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getDescendantsByType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const listStyleExamples = { - "one": "1/1/1", - "ordered": "1/2/3", - "zero": "0/0/0" -}; - -/** - * Gets the value of an ordered list item prefix token. - * - * @param {import("../helpers/micromark-helpers.cjs").Token} listItemPrefix List item prefix token. - * @returns {number} List item value. - */ -function getOrderedListItemValue(listItemPrefix) { - return Number(getDescendantsByType(listItemPrefix, [ "listItemValue" ])[0].text); -} - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD029", "ol-prefix" ], - "description": "Ordered list item prefix", - "tags": [ "ol" ], - "parser": "micromark", - "function": function MD029(params, onError) { - const style = String(params.config.style || "one_or_ordered"); - for (const listOrdered of filterByTypesCached([ "listOrdered" ])) { - const listItemPrefixes = getDescendantsByType(listOrdered, [ "listItemPrefix" ]); - let expected = 1; - let incrementing = false; - // Check for incrementing number pattern 1/2/3 or 0/1/2 - if (listItemPrefixes.length >= 2) { - const firstValue = getOrderedListItemValue(listItemPrefixes[0]); - const secondValue = getOrderedListItemValue(listItemPrefixes[1]); - if ((secondValue !== 1) || (firstValue === 0)) { - incrementing = true; - if (firstValue === 0) { - expected = 0; - } - } - } - // Determine effective style - let listStyle = style; - if (listStyle === "one_or_ordered") { - listStyle = incrementing ? "ordered" : "one"; - } else if (listStyle === "zero") { - expected = 0; - } else if (listStyle === "one") { - expected = 1; - } - // Validate each list item marker - for (const listItemPrefix of listItemPrefixes) { - const actual = getOrderedListItemValue(listItemPrefix); - addErrorDetailIf( - onError, - listItemPrefix.startLine, - expected, - actual, - "Style: " + listStyleExamples[listStyle], - undefined, - [ listItemPrefix.startColumn, listItemPrefix.endColumn - listItemPrefix.startColumn ] - ); - if (listStyle === "ordered") { - expected++; - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md030.js": -/*!***********************!*\ - !*** ../lib/md030.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD030", "list-marker-space" ], - "description": "Spaces after list markers", - "tags": [ "ol", "ul", "whitespace" ], - "parser": "micromark", - "function": function MD030(params, onError) { - const ulSingle = Number(params.config.ul_single || 1); - const olSingle = Number(params.config.ol_single || 1); - const ulMulti = Number(params.config.ul_multi || 1); - const olMulti = Number(params.config.ol_multi || 1); - for (const list of filterByTypesCached([ "listOrdered", "listUnordered" ])) { - const ordered = (list.type === "listOrdered"); - const listItemPrefixes = - list.children.filter((token) => (token.type === "listItemPrefix")); - const allSingleLine = - (list.endLine - list.startLine + 1) === listItemPrefixes.length; - const expectedSpaces = ordered ? - (allSingleLine ? olSingle : olMulti) : - (allSingleLine ? ulSingle : ulMulti); - for (const listItemPrefix of listItemPrefixes) { - const range = [ - listItemPrefix.startColumn, - listItemPrefix.endColumn - listItemPrefix.startColumn - ]; - const listItemPrefixWhitespaces = listItemPrefix.children.filter( - (token) => (token.type === "listItemPrefixWhitespace") - ); - for (const listItemPrefixWhitespace of listItemPrefixWhitespaces) { - const { endColumn, startColumn, startLine } = - listItemPrefixWhitespace; - const actualSpaces = endColumn - startColumn; - const fixInfo = { - "editColumn": startColumn, - "deleteCount": actualSpaces, - "insertText": "".padEnd(expectedSpaces) - }; - addErrorDetailIf( - onError, - startLine, - expectedSpaces, - actualSpaces, - undefined, - undefined, - range, - fixInfo - ); - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md031.js": -/*!***********************!*\ - !*** ../lib/md031.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext, isBlankLine } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getParentOfType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const codeFencePrefixRe = /^(.*?)[`~]/; - -// eslint-disable-next-line jsdoc/valid-types -/** @typedef {readonly string[]} ReadonlyStringArray */ - -/** - * Adds an error for the top or bottom of a code fence. - * - * @param {import("./markdownlint").RuleOnError} onError Error-reporting callback. - * @param {ReadonlyStringArray} lines Lines of Markdown content. - * @param {number} lineNumber Line number. - * @param {boolean} top True iff top fence. - * @returns {void} - */ -function addError(onError, lines, lineNumber, top) { - const line = lines[lineNumber - 1]; - const [ , prefix ] = line.match(codeFencePrefixRe) || []; - const fixInfo = (prefix === undefined) ? - null : - { - "lineNumber": lineNumber + (top ? 0 : 1), - "insertText": `${prefix.replace(/[^>]/g, " ").trim()}\n` - }; - addErrorContext( - onError, - lineNumber, - line.trim(), - undefined, - undefined, - undefined, - fixInfo - ); -} - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD031", "blanks-around-fences" ], - "description": "Fenced code blocks should be surrounded by blank lines", - "tags": [ "code", "blank_lines" ], - "parser": "micromark", - "function": function MD031(params, onError) { - const listItems = params.config.list_items; - const includeListItems = (listItems === undefined) ? true : !!listItems; - const { lines } = params; - for (const codeBlock of filterByTypesCached([ "codeFenced" ])) { - if (includeListItems || !(getParentOfType(codeBlock, [ "listOrdered", "listUnordered" ]))) { - if (!isBlankLine(lines[codeBlock.startLine - 2])) { - addError(onError, lines, codeBlock.startLine, true); - } - if (!isBlankLine(lines[codeBlock.endLine]) && !isBlankLine(lines[codeBlock.endLine - 1])) { - addError(onError, lines, codeBlock.endLine, false); - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md032.js": -/*!***********************!*\ - !*** ../lib/md032.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext, isBlankLine } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByPredicate, getBlockQuotePrefixText, nonContentTokens } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const isList = (token) => ( - (token.type === "listOrdered") || (token.type === "listUnordered") -); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD032", "blanks-around-lists" ], - "description": "Lists should be surrounded by blank lines", - "tags": [ "bullet", "ul", "ol", "blank_lines" ], - "parser": "micromark", - "function": function MD032(params, onError) { - const { lines, parsers } = params; - const blockQuotePrefixes = filterByTypesCached([ "blockQuotePrefix", "linePrefix" ]); - - // For every top-level list... - const topLevelLists = filterByPredicate( - parsers.micromark.tokens, - isList, - (token) => ( - (isList(token) || (token.type === "htmlFlow")) ? [] : token.children - ) - ); - for (const list of topLevelLists) { - - // Look for a blank line above the list - const firstLineNumber = list.startLine; - if (!isBlankLine(lines[firstLineNumber - 2])) { - addErrorContext( - onError, - firstLineNumber, - lines[firstLineNumber - 1].trim(), - undefined, - undefined, - undefined, - { - "insertText": getBlockQuotePrefixText(blockQuotePrefixes, firstLineNumber) - } - ); - } - - // Find the "visual" end of the list - let endLine = list.endLine; - const flattenedChildren = filterByPredicate(list.children); - for (const child of flattenedChildren.reverse()) { - if (!nonContentTokens.has(child.type)) { - endLine = child.endLine; - break; - } - } - - // Look for a blank line below the list - const lastLineNumber = endLine; - if (!isBlankLine(lines[lastLineNumber])) { - addErrorContext( - onError, - lastLineNumber, - lines[lastLineNumber - 1].trim(), - undefined, - undefined, - undefined, - { - "lineNumber": lastLineNumber + 1, - "insertText": getBlockQuotePrefixText(blockQuotePrefixes, lastLineNumber) - } - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md033.js": -/*!***********************!*\ - !*** ../lib/md033.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError, nextLinesRe } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getHtmlTagInfo } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD033", "no-inline-html" ], - "description": "Inline HTML", - "tags": [ "html" ], - "parser": "micromark", - "function": function MD033(params, onError) { - let allowedElements = params.config.allowed_elements; - allowedElements = Array.isArray(allowedElements) ? allowedElements : []; - allowedElements = allowedElements.map((element) => element.toLowerCase()); - for (const token of filterByTypesCached([ "htmlText" ], true)) { - const htmlTagInfo = getHtmlTagInfo(token); - if ( - htmlTagInfo && - !htmlTagInfo.close && - !allowedElements.includes(htmlTagInfo.name.toLowerCase()) - ) { - const range = [ - token.startColumn, - token.text.replace(nextLinesRe, "").length - ]; - addError( - onError, - token.startLine, - "Element: " + htmlTagInfo.name, - undefined, - range - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md034.js": -/*!***********************!*\ - !*** ../lib/md034.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByPredicate, getHtmlTagInfo, inHtmlFlow } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD034", "no-bare-urls" ], - "description": "Bare URL used", - "tags": [ "links", "url" ], - "parser": "micromark", - "function": function MD034(params, onError) { - const literalAutolinks = (tokens) => ( - filterByPredicate( - tokens, - (token) => { - if ((token.type === "literalAutolink") && !inHtmlFlow(token)) { - // Detect and ignore https://github.com/micromark/micromark/issues/164 - const siblings = token.parent?.children; - const index = siblings?.indexOf(token); - // @ts-ignore - const prev = siblings?.at(index - 1); - // @ts-ignore - const next = siblings?.at(index + 1); - return !( - prev && - next && - (prev.type === "data") && - (next.type === "data") && - prev.text.endsWith("<") && - next.text.startsWith(">") - ); - } - return false; - }, - (token) => { - // Ignore content of inline HTML tags - const { children } = token; - const result = []; - for (let i = 0; i < children.length; i++) { - const current = children[i]; - const openTagInfo = getHtmlTagInfo(current); - if (openTagInfo && !openTagInfo.close) { - let count = 1; - for (let j = i + 1; j < children.length; j++) { - const candidate = children[j]; - const closeTagInfo = getHtmlTagInfo(candidate); - if (closeTagInfo && (openTagInfo.name === closeTagInfo.name)) { - if (closeTagInfo.close) { - count--; - if (count === 0) { - i = j; - break; - } - } else { - count++; - } - } - } - } else { - result.push(current); - } - } - return result; - } - ) - ); - for (const token of literalAutolinks(params.parsers.micromark.tokens)) { - const range = [ - token.startColumn, - token.endColumn - token.startColumn - ]; - const fixInfo = { - "editColumn": range[0], - "deleteCount": range[1], - "insertText": `<${token.text}>` - }; - addErrorContext( - onError, - token.startLine, - token.text, - undefined, - undefined, - range, - fixInfo - ); - } - } -}; - - -/***/ }), - -/***/ "../lib/md035.js": -/*!***********************!*\ - !*** ../lib/md035.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD035", "hr-style" ], - "description": "Horizontal rule style", - "tags": [ "hr" ], - "parser": "micromark", - "function": function MD035(params, onError) { - let style = String(params.config.style || "consistent").trim(); - const thematicBreaks = filterByTypesCached([ "thematicBreak" ]); - for (const token of thematicBreaks) { - const { startLine, text } = token; - if (style === "consistent") { - style = text; - } - addErrorDetailIf(onError, startLine, style, text); - } - } -}; - - -/***/ }), - -/***/ "../lib/md036.js": -/*!***********************!*\ - !*** ../lib/md036.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext, allPunctuation } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getDescendantsByType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -/** @typedef {import("../helpers/micromark-helpers.cjs").TokenType} TokenType */ -/** @type {TokenType[][]} */ -const emphasisTypes = [ - [ "emphasis", "emphasisText" ], - [ "strong", "strongText" ] -]; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD036", "no-emphasis-as-heading" ], - "description": "Emphasis used instead of a heading", - "tags": [ "headings", "emphasis" ], - "parser": "micromark", - "function": function MD036(params, onError) { - let punctuation = params.config.punctuation; - punctuation = String((punctuation === undefined) ? allPunctuation : punctuation); - const punctuationRe = new RegExp("[" + punctuation + "]$"); - const paragraphTokens = - filterByTypesCached([ "paragraph" ]) - .filter((token) => - (token.parent?.type === "content") && !token.parent?.parent && (token.children.length === 1) - ); - for (const emphasisType of emphasisTypes) { - const textTokens = getDescendantsByType(paragraphTokens, emphasisType); - for (const textToken of textTokens) { - if ( - (textToken.children.length === 1) && - (textToken.children[0].type === "data") && - !punctuationRe.test(textToken.text) - ) { - addErrorContext(onError, textToken.startLine, textToken.text); - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md037.js": -/*!***********************!*\ - !*** ../lib/md037.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByPredicate, inHtmlFlow } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD037", "no-space-in-emphasis" ], - "description": "Spaces inside emphasis markers", - "tags": [ "whitespace", "emphasis" ], - "parser": "micromark", - "function": function MD037(params, onError) { - - // Initialize variables - const { lines, parsers } = params; - const emphasisTokensByMarker = new Map(); - for (const marker of [ "_", "__", "___", "*", "**", "***" ]) { - emphasisTokensByMarker.set(marker, []); - } - const tokens = filterByPredicate( - parsers.micromark.tokens, - (token) => token.children.some((child) => child.type === "data") - ); - for (const token of tokens) { - - // Build lists of bare tokens for each emphasis marker type - for (const emphasisTokens of emphasisTokensByMarker.values()) { - emphasisTokens.length = 0; - } - for (const child of token.children) { - const { text, type } = child; - if ((type === "data") && (text.length <= 3)) { - const emphasisTokens = emphasisTokensByMarker.get(text); - if (emphasisTokens && !inHtmlFlow(child)) { - emphasisTokens.push(child); - } - } - } - - // Process bare tokens for each emphasis marker type - for (const entry of emphasisTokensByMarker.entries()) { - const [ marker, emphasisTokens ] = entry; - for (let i = 0; i + 1 < emphasisTokens.length; i += 2) { - - // Process start token of start/end pair - const startToken = emphasisTokens[i]; - const startLine = lines[startToken.startLine - 1]; - const startSlice = startLine.slice(startToken.endColumn - 1); - const startMatch = startSlice.match(/^\s+\S/); - if (startMatch) { - const [ startSpaceCharacter ] = startMatch; - const startContext = `${marker}${startSpaceCharacter}`; - addError( - onError, - startToken.startLine, - undefined, - startContext, - [ startToken.startColumn, startContext.length ], - { - "editColumn": startToken.endColumn, - "deleteCount": startSpaceCharacter.length - 1 - } - ); - } - - // Process end token of start/end pair - const endToken = emphasisTokens[i + 1]; - const endLine = lines[endToken.startLine - 1]; - const endSlice = endLine.slice(0, endToken.startColumn - 1); - const endMatch = endSlice.match(/\S\s+$/); - if (endMatch) { - const [ endSpaceCharacter ] = endMatch; - const endContext = `${endSpaceCharacter}${marker}`; - addError( - onError, - endToken.startLine, - undefined, - endContext, - [ endToken.endColumn - endContext.length, endContext.length ], - { - "editColumn": - endToken.startColumn - (endSpaceCharacter.length - 1), - "deleteCount": endSpaceCharacter.length - 1 - } - ); - } - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md038.js": -/*!***********************!*\ - !*** ../lib/md038.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getDescendantsByType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const leftSpaceRe = /^\s(?:[^`]|$)/; -const rightSpaceRe = /[^`]\s$/; -const trimCodeText = (text, start, end) => { - text = text.replace(/^\s+$/, ""); - if (start) { - text = text.replace(/^\s+?(\s`|\S)/, "$1"); - } - if (end) { - text = text.replace(/(`\s|\S)\s+$/, "$1"); - } - return text; -}; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD038", "no-space-in-code" ], - "description": "Spaces inside code span elements", - "tags": [ "whitespace", "code" ], - "parser": "micromark", - "function": function MD038(params, onError) { - const codeTexts = filterByTypesCached([ "codeText" ]); - for (const codeText of codeTexts) { - const sequences = getDescendantsByType(codeText, [ "codeTextSequence" ]); - const startSequence = sequences[0]; - const endSequence = sequences[sequences.length - 1]; - const datas = getDescendantsByType(codeText, [ "codeTextData" ]); - const startData = datas[0]; - const endData = datas[datas.length - 1]; - if (startSequence && endSequence && startData && endData) { - const spaceLeft = leftSpaceRe.test(startData.text); - const spaceRight = rightSpaceRe.test(endData.text); - if (spaceLeft || spaceRight) { - let lineNumber = startSequence.startLine; - let range = undefined; - let fixInfo = undefined; - if (startSequence.startLine === endSequence.endLine) { - range = [ - startSequence.startColumn, - endSequence.endColumn - startSequence.startColumn - ]; - fixInfo = { - "editColumn": startSequence.endColumn, - "deleteCount": endSequence.startColumn - startSequence.endColumn, - "insertText": trimCodeText(startData.text, true, true) - }; - } else if (spaceLeft && (startSequence.endLine === startData.startLine)) { - range = [ - startSequence.startColumn, - startData.endColumn - startSequence.startColumn - ]; - fixInfo = { - "editColumn": startSequence.endColumn, - "deleteCount": startData.endColumn - startData.startColumn, - "insertText": trimCodeText(startData.text, true, false) - }; - } else if (spaceRight && (endData.text.trim().length > 0)) { - lineNumber = endSequence.endLine; - range = [ - endData.startColumn, - endSequence.endColumn - endData.startColumn - ]; - fixInfo = { - "editColumn": endData.startColumn, - "deleteCount": endData.endColumn - endData.startColumn, - "insertText": trimCodeText(endData.text, false, true) - }; - } - if (range) { - const context = params - .lines[lineNumber - 1] - .substring(range[0] - 1, range[0] - 1 + range[1]); - addErrorContext( - onError, - lineNumber, - context, - spaceLeft, - spaceRight, - range, - fixInfo - ); - } - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md039.js": -/*!***********************!*\ - !*** ../lib/md039.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getReferenceLinkImageData, filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -/** - * Adds an error for a label space issue. - * - * @param {import("./markdownlint").RuleOnError} onError Error-reporting callback. - * @param {import("../helpers/micromark-helpers.cjs").Token} label Label token. - * @param {import("../helpers/micromark-helpers.cjs").Token} labelText LabelText token. - * @param {boolean} isStart True iff error is at the start of the link. - */ -function addLabelSpaceError(onError, label, labelText, isStart) { - const match = labelText.text.match(isStart ? /^[^\S\r\n]+/ : /[^\S\r\n]+$/); - const range = match ? - [ - (isStart ? (labelText.startColumn) : (labelText.endColumn - match[0].length)), - match[0].length - ] : - undefined; - addErrorContext( - onError, - isStart ? (labelText.startLine + (match ? 0 : 1)) : (labelText.endLine - (match ? 0 : 1)), - label.text.replace(/\s+/g, " "), - isStart, - !isStart, - range, - range ? - { - "editColumn": range[0], - "deleteCount": range[1] - } : - undefined - ); -} - -/** - * Determines if a link is a valid link (and not a fake shortcut link due to parser tricks). - * - * @param {import("../helpers/micromark-helpers.cjs").Token} label Label token. - * @param {import("../helpers/micromark-helpers.cjs").Token} labelText LabelText token. - * @param {Map} definitions Map of link definitions. - * @returns {boolean} True iff the link is valid. - */ -function validLink(label, labelText, definitions) { - return (label.parent?.children.length !== 1) || definitions.has(labelText.text.trim()); -} - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD039", "no-space-in-links" ], - "description": "Spaces inside link text", - "tags": [ "whitespace", "links" ], - "parser": "micromark", - "function": function MD039(params, onError) { - const { definitions } = getReferenceLinkImageData(); - const labels = filterByTypesCached([ "label" ]) - .filter((label) => label.parent?.type === "link"); - for (const label of labels) { - const labelTexts = label.children.filter((child) => child.type === "labelText"); - for (const labelText of labelTexts) { - if ( - (labelText.text.trimStart().length !== labelText.text.length) && - validLink(label, labelText, definitions) - ) { - addLabelSpaceError(onError, label, labelText, true); - } - if ( - (labelText.text.trimEnd().length !== labelText.text.length) && - validLink(label, labelText, definitions) - ) { - addLabelSpaceError(onError, label, labelText, false); - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md040.js": -/*!***********************!*\ - !*** ../lib/md040.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError, addErrorContext } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getDescendantsByType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD040", "fenced-code-language" ], - "description": "Fenced code blocks should have a language specified", - "tags": [ "code", "language" ], - "parser": "micromark", - "function": function MD040(params, onError) { - let allowed = params.config.allowed_languages; - allowed = Array.isArray(allowed) ? allowed : []; - const languageOnly = !!params.config.language_only; - const fencedCodes = filterByTypesCached([ "codeFenced" ]); - for (const fencedCode of fencedCodes) { - const openingFence = getDescendantsByType(fencedCode, [ "codeFencedFence" ])[0]; - const { startLine, text } = openingFence; - const info = getDescendantsByType(openingFence, [ "codeFencedFenceInfo" ])[0]?.text; - if (!info) { - addErrorContext(onError, startLine, text); - } else if ((allowed.length > 0) && !allowed.includes(info)) { - addError(onError, startLine, `"${info}" is not allowed`); - } - if (languageOnly && getDescendantsByType(openingFence, [ "codeFencedFenceMeta" ]).length > 0) { - addError(onError, startLine, `Info string contains more than language: "${text}"`); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md041.js": -/*!***********************!*\ - !*** ../lib/md041.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext, frontMatterHasTitle } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByTypes, getHeadingLevel, getHtmlTagInfo, isHtmlFlowComment, nonContentTokens } = - __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD041", "first-line-heading", "first-line-h1" ], - "description": "First line in a file should be a top-level heading", - "tags": [ "headings" ], - "parser": "micromark", - "function": function MD041(params, onError) { - const level = Number(params.config.level || 1); - if (!frontMatterHasTitle(params.frontMatterLines, params.config.front_matter_title)) { - params.parsers.micromark.tokens - .filter((token) => !nonContentTokens.has(token.type) && !isHtmlFlowComment(token)) - .every((token) => { - let isError = true; - if ((token.type === "atxHeading") || (token.type === "setextHeading")) { - isError = (getHeadingLevel(token) !== level); - } else if (token.type === "htmlFlow") { - const htmlTexts = filterByTypes(token.children, [ "htmlText" ], true); - const tagInfo = (htmlTexts.length > 0) && getHtmlTagInfo(htmlTexts[0]); - isError = !tagInfo || (tagInfo.name.toLowerCase() !== `h${level}`); - } - if (isError) { - addErrorContext(onError, token.startLine, params.lines[token.startLine - 1]); - } - return false; - }); - } - } -}; - - -/***/ }), - -/***/ "../lib/md042.js": -/*!***********************!*\ - !*** ../lib/md042.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getDescendantsByType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { getReferenceLinkImageData, filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD042", "no-empty-links" ], - "description": "No empty links", - "tags": [ "links" ], - "parser": "micromark", - "function": function MD042(params, onError) { - const { definitions } = getReferenceLinkImageData(); - const isReferenceDefinitionHash = (token) => { - const definition = definitions.get(token.text.trim()); - return (definition && (definition[1] === "#")); - }; - const links = filterByTypesCached([ "link" ]); - for (const link of links) { - const labelText = getDescendantsByType(link, [ "label", "labelText" ]); - const reference = getDescendantsByType(link, [ "reference" ]); - const resource = getDescendantsByType(link, [ "resource" ]); - const referenceString = getDescendantsByType(reference, [ "referenceString" ]); - const resourceDestinationString = getDescendantsByType(resource, [ "resourceDestination", [ "resourceDestinationLiteral", "resourceDestinationRaw" ], "resourceDestinationString" ]); - const hasLabelText = labelText.length > 0; - const hasReference = reference.length > 0; - const hasResource = resource.length > 0; - const hasReferenceString = referenceString.length > 0; - const hasResourceDestinationString = resourceDestinationString.length > 0; - let error = false; - if ( - hasLabelText && - ((!hasReference && !hasResource) || (hasReference && !hasReferenceString)) - ) { - error = isReferenceDefinitionHash(labelText[0]); - } else if (hasReferenceString && !hasResourceDestinationString) { - error = isReferenceDefinitionHash(referenceString[0]); - } else if (!hasReferenceString && hasResourceDestinationString) { - error = (resourceDestinationString[0].text.trim() === "#"); - } else if (!hasReferenceString && !hasResourceDestinationString) { - error = true; - } - if (error) { - addErrorContext( - onError, - link.startLine, - link.text, - undefined, - undefined, - [ link.startColumn, link.endColumn - link.startColumn ] - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md043.js": -/*!***********************!*\ - !*** ../lib/md043.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext, addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getHeadingLevel, getHeadingText } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD043", "required-headings" ], - "description": "Required heading structure", - "tags": [ "headings" ], - "parser": "micromark", - "function": function MD043(params, onError) { - const requiredHeadings = params.config.headings; - if (!Array.isArray(requiredHeadings)) { - // Nothing to check; avoid doing any work - return; - } - const matchCase = params.config.match_case || false; - let i = 0; - let matchAny = false; - let hasError = false; - let anyHeadings = false; - const getExpected = () => requiredHeadings[i++] || "[None]"; - const handleCase = (str) => (matchCase ? str : str.toLowerCase()); - for (const heading of filterByTypesCached([ "atxHeading", "setextHeading" ])) { - if (!hasError) { - const headingText = getHeadingText(heading); - const headingLevel = getHeadingLevel(heading); - anyHeadings = true; - const actual = `${"".padEnd(headingLevel, "#")} ${headingText}`; - const expected = getExpected(); - if (expected === "*") { - const nextExpected = getExpected(); - if (handleCase(nextExpected) !== handleCase(actual)) { - matchAny = true; - i--; - } - } else if (expected === "+") { - matchAny = true; - } else if (handleCase(expected) === handleCase(actual)) { - matchAny = false; - } else if (matchAny) { - i--; - } else { - addErrorDetailIf( - onError, - heading.startLine, - expected, - actual - ); - hasError = true; - } - } - } - const extraHeadings = requiredHeadings.length - i; - if ( - !hasError && - ((extraHeadings > 1) || - ((extraHeadings === 1) && (requiredHeadings[i] !== "*"))) && - (anyHeadings || !requiredHeadings.every((heading) => heading === "*")) - ) { - addErrorContext( - onError, - params.lines.length, - requiredHeadings[i] - ); - } - } -}; - - -/***/ }), - -/***/ "../lib/md044.js": -/*!***********************!*\ - !*** ../lib/md044.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf, escapeForRegExp, hasOverlap } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByPredicate, filterByTypes } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { parse } = __webpack_require__(/*! ../helpers/micromark-parse.cjs */ "../helpers/micromark-parse.cjs"); - -const ignoredChildTypes = new Set( - [ "codeFencedFence", "definition", "reference", "resource" ] -); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD044", "proper-names" ], - "description": "Proper names should have the correct capitalization", - "tags": [ "spelling" ], - "parser": "micromark", - "function": function MD044(params, onError) { - let names = params.config.names; - names = Array.isArray(names) ? names : []; - names.sort((a, b) => (b.length - a.length) || a.localeCompare(b)); - if (names.length === 0) { - // Nothing to check; avoid doing any work - return; - } - const codeBlocks = params.config.code_blocks; - const includeCodeBlocks = - (codeBlocks === undefined) ? true : !!codeBlocks; - const htmlElements = params.config.html_elements; - const includeHtmlElements = - (htmlElements === undefined) ? true : !!htmlElements; - const scannedTypes = new Set([ "data" ]); - if (includeCodeBlocks) { - scannedTypes.add("codeFlowValue"); - scannedTypes.add("codeTextData"); - } - if (includeHtmlElements) { - scannedTypes.add("htmlFlowData"); - scannedTypes.add("htmlTextData"); - } - const contentTokens = - filterByPredicate( - params.parsers.micromark.tokens, - (token) => scannedTypes.has(token.type), - (token) => ( - token.children.filter((t) => !ignoredChildTypes.has(t.type)) - ) - ); - /** @type {import("../helpers").FileRange[]} */ - const exclusions = []; - const scannedTokens = new Set(); - for (const name of names) { - const escapedName = escapeForRegExp(name); - const startNamePattern = /^\W/.test(name) ? "" : "\\b_*"; - const endNamePattern = /\W$/.test(name) ? "" : "_*\\b"; - const namePattern = `(${startNamePattern})(${escapedName})${endNamePattern}`; - const nameRe = new RegExp(namePattern, "gi"); - for (const token of contentTokens) { - let match = null; - while ((match = nameRe.exec(token.text)) !== null) { - const [ , leftMatch, nameMatch ] = match; - const column = token.startColumn + match.index + leftMatch.length; - const length = nameMatch.length; - const lineNumber = token.startLine; - /** @type {import("../helpers").FileRange} */ - const nameRange = { - "startLine": lineNumber, - "startColumn": column, - "endLine": lineNumber, - "endColumn": column + length - 1 - }; - if ( - !names.includes(nameMatch) && - !exclusions.some((exclusion) => hasOverlap(exclusion, nameRange)) - ) { - /** @type {import("../helpers").FileRange[]} */ - let autolinkRanges = []; - if (!scannedTokens.has(token)) { - autolinkRanges = filterByTypes(parse(token.text), [ "literalAutolink" ]) - .map((tok) => ({ - "startLine": lineNumber, - "startColumn": token.startColumn + tok.startColumn - 1, - "endLine": lineNumber, - "endColumn": token.endColumn + tok.endColumn - 1 - })); - exclusions.push(...autolinkRanges); - scannedTokens.add(token); - } - if (!autolinkRanges.some((autolinkRange) => hasOverlap(autolinkRange, nameRange))) { - addErrorDetailIf( - onError, - token.startLine, - name, - nameMatch, - undefined, - undefined, - [ column, length ], - { - "editColumn": column, - "deleteCount": length, - "insertText": name - } - ); - } - } - exclusions.push(nameRange); - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md045.js": -/*!***********************!*\ - !*** ../lib/md045.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError, getHtmlAttributeRe, nextLinesRe } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getHtmlTagInfo, getDescendantsByType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const altRe = getHtmlAttributeRe("alt"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD045", "no-alt-text" ], - "description": "Images should have alternate text (alt text)", - "tags": [ "accessibility", "images" ], - "parser": "micromark", - "function": function MD045(params, onError) { - // Process Markdown images - const images = filterByTypesCached([ "image" ]); - for (const image of images) { - const labelTexts = getDescendantsByType(image, [ "label", "labelText" ]); - if (labelTexts.some((labelText) => labelText.text.length === 0)) { - const range = (image.startLine === image.endLine) ? - [ image.startColumn, image.endColumn - image.startColumn ] : - undefined; - addError( - onError, - image.startLine, - undefined, - undefined, - range - ); - } - } - - // Process HTML images - const htmlTexts = filterByTypesCached([ "htmlText" ], true); - for (const htmlText of htmlTexts) { - const { startColumn, startLine, text } = htmlText; - const htmlTagInfo = getHtmlTagInfo(htmlText); - if ( - htmlTagInfo && - !htmlTagInfo.close && - (htmlTagInfo.name.toLowerCase() === "img") && - !altRe.test(text) - ) { - const range = [ - startColumn, - text.replace(nextLinesRe, "").length - ]; - addError( - onError, - startLine, - undefined, - undefined, - range - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md046.js": -/*!***********************!*\ - !*** ../lib/md046.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const tokenTypeToStyle = { - "codeFenced": "fenced", - "codeIndented": "indented" -}; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD046", "code-block-style" ], - "description": "Code block style", - "tags": [ "code" ], - "parser": "micromark", - "function": function MD046(params, onError) { - let expectedStyle = String(params.config.style || "consistent"); - for (const token of filterByTypesCached([ "codeFenced", "codeIndented" ])) { - const { startLine, type } = token; - if (expectedStyle === "consistent") { - expectedStyle = tokenTypeToStyle[type]; - } - addErrorDetailIf( - onError, - startLine, - expectedStyle, - tokenTypeToStyle[type]); - } - } -}; - - -/***/ }), - -/***/ "../lib/md047.js": -/*!***********************!*\ - !*** ../lib/md047.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError, isBlankLine } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD047", "single-trailing-newline" ], - "description": "Files should end with a single newline character", - "tags": [ "blank_lines" ], - "parser": "none", - "function": function MD047(params, onError) { - const lastLineNumber = params.lines.length; - const lastLine = params.lines[lastLineNumber - 1]; - if (!isBlankLine(lastLine)) { - addError( - onError, - lastLineNumber, - undefined, - undefined, - [ lastLine.length, 1 ], - { - "insertText": "\n", - "editColumn": lastLine.length + 1 - } - ); - } - } -}; - - -/***/ }), - -/***/ "../lib/md048.js": -/*!***********************!*\ - !*** ../lib/md048.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getDescendantsByType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -/** - * Return the string representation of a fence markup character. - * - * @param {string} markup Fence string. - * @returns {"tilde" | "backtick"} String representation. - */ -function fencedCodeBlockStyleFor(markup) { - switch (markup[0]) { - case "~": - return "tilde"; - default: - return "backtick"; - } -}; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD048", "code-fence-style" ], - "description": "Code fence style", - "tags": [ "code" ], - "parser": "micromark", - "function": function MD048(params, onError) { - const style = String(params.config.style || "consistent"); - let expectedStyle = style; - const codeFenceds = filterByTypesCached([ "codeFenced" ]); - for (const codeFenced of codeFenceds) { - const codeFencedFenceSequence = - getDescendantsByType(codeFenced, [ "codeFencedFence", "codeFencedFenceSequence" ])[0]; - const { startLine, text } = codeFencedFenceSequence; - if (expectedStyle === "consistent") { - expectedStyle = fencedCodeBlockStyleFor(text); - } - addErrorDetailIf( - onError, - startLine, - expectedStyle, - fencedCodeBlockStyleFor(text) - ); - } - } -}; - - -/***/ }), - -/***/ "../lib/md049-md050.js": -/*!*****************************!*\ - !*** ../lib/md049-md050.js ***! - \*****************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByPredicate, getDescendantsByType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); - -const intrawordRe = /^\w$/; - -/** - * Return the string representation of a emphasis or strong markup character. - * - * @param {string} markup Emphasis or strong string. - * @returns {"asterisk" | "underscore"} String representation. - */ -function emphasisOrStrongStyleFor(markup) { - switch (markup[0]) { - case "*": - return "asterisk"; - default: - return "underscore"; - } -}; - -/** - * @param {import("./markdownlint").RuleParams} params Rule parameters. - * @param {import("./markdownlint").RuleOnError} onError Error-reporting callback. - * @param {import("markdownlint-micromark").TokenType} type Token type. - * @param {import("markdownlint-micromark").TokenType} typeSequence Token sequence type. - * @param {"*" | "**"} asterisk Asterisk kind. - * @param {"_" | "__"} underline Underline kind. - * @param {"asterisk" | "consistent" | "underscore"} style Style string. - */ -const impl = - (params, onError, type, typeSequence, asterisk, underline, style = "consistent") => { - const { lines, parsers } = params; - const emphasisTokens = filterByPredicate( - parsers.micromark.tokens, - (token) => token.type === type, - (token) => ((token.type === "htmlFlow") ? [] : token.children) - ); - for (const token of emphasisTokens) { - const sequences = getDescendantsByType(token, [ typeSequence ]); - const startSequence = sequences[0]; - const endSequence = sequences[sequences.length - 1]; - if (startSequence && endSequence) { - const markupStyle = emphasisOrStrongStyleFor(startSequence.text); - if (style === "consistent") { - style = markupStyle; - } - if (style !== markupStyle) { - const underscoreIntraword = (style === "underscore") && ( - intrawordRe.test( - lines[startSequence.startLine - 1][startSequence.startColumn - 2] - ) || - intrawordRe.test( - lines[endSequence.endLine - 1][endSequence.endColumn - 1] - ) - ); - if (!underscoreIntraword) { - for (const sequence of [ startSequence, endSequence ]) { - addError( - onError, - sequence.startLine, - `Expected: ${style}; Actual: ${markupStyle}`, - undefined, - [ sequence.startColumn, sequence.text.length ], - { - "editColumn": sequence.startColumn, - "deleteCount": sequence.text.length, - "insertText": (style === "asterisk") ? asterisk : underline - } - ); - } - } - } - } - } - }; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule[] */ -module.exports = [ - { - "names": [ "MD049", "emphasis-style" ], - "description": "Emphasis style", - "tags": [ "emphasis" ], - "parser": "micromark", - "function": function MD049(params, onError) { - return impl( - params, - onError, - "emphasis", - "emphasisSequence", - "*", - "_", - params.config.style || undefined - ); - } - }, - { - "names": [ "MD050", "strong-style" ], - "description": "Strong style", - "tags": [ "emphasis" ], - "parser": "micromark", - "function": function MD050(params, onError) { - return impl( - params, - onError, - "strong", - "strongSequence", - "**", - "__", - params.config.style || undefined - ); - } - } -]; - - -/***/ }), - -/***/ "../lib/md051.js": -/*!***********************!*\ - !*** ../lib/md051.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError, getHtmlAttributeRe } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByPredicate, filterByTypes, getHtmlTagInfo } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// Regular expression for identifying HTML anchor names -const idRe = getHtmlAttributeRe("id"); -const nameRe = getHtmlAttributeRe("name"); -const anchorRe = /\{(#[a-z\d]+(?:[-_][a-z\d]+)*)\}/gu; -const lineFragmentRe = /^#(?:L\d+(?:C\d+)?-L\d+(?:C\d+)?|L\d+)$/; - -// Sets for filtering heading tokens during conversion -const childrenExclude = new Set([ "image", "reference", "resource" ]); -const tokensInclude = new Set( - [ "characterEscapeValue", "codeTextData", "data", "mathTextData" ] -); - -/** - * Converts a Markdown heading into an HTML fragment according to the rules - * used by GitHub. - * - * @param {import("../helpers/micromark-helpers.cjs").Token} headingText Heading text token. - * @returns {string} Fragment string for heading. - */ -function convertHeadingToHTMLFragment(headingText) { - const inlineText = - filterByPredicate( - headingText.children, - (token) => tokensInclude.has(token.type), - (token) => (childrenExclude.has(token.type) ? [] : token.children) - ) - .map((token) => token.text) - .join(""); - return "#" + encodeURIComponent( - inlineText - .toLowerCase() - // RegExp source with Ruby's \p{Word} expanded into its General Categories - // https://github.com/gjtorikian/html-pipeline/blob/main/lib/html/pipeline/toc_filter.rb - // https://ruby-doc.org/core-3.0.2/Regexp.html - .replace( - /[^\p{Letter}\p{Mark}\p{Number}\p{Connector_Punctuation}\- ]/gu, - "" - ) - .replace(/ /gu, "-") - ); -} - -/** - * Unescapes the text of a String-type micromark Token. - * - * @param {import("../helpers/micromark-helpers.cjs").Token} token String-type micromark Token. - * @returns {string} Unescaped token text. - */ -function unescapeStringTokenText(token) { - return filterByTypes(token.children, [ "characterEscapeValue", "data" ]) - .map((child) => child.text) - .join(""); -} - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD051", "link-fragments" ], - "description": "Link fragments should be valid", - "tags": [ "links" ], - "parser": "micromark", - "function": function MD051(params, onError) { - const ignoreCase = params.config.ignore_case || false; - const fragments = new Map(); - - // Process headings - const headingTexts = filterByTypesCached([ "atxHeadingText", "setextHeadingText" ]); - for (const headingText of headingTexts) { - const fragment = convertHeadingToHTMLFragment(headingText); - if (fragment !== "#") { - const count = fragments.get(fragment) || 0; - if (count) { - fragments.set(`${fragment}-${count}`, 0); - } - fragments.set(fragment, count + 1); - let match = null; - while ((match = anchorRe.exec(headingText.text)) !== null) { - const [ , anchor ] = match; - if (!fragments.has(anchor)) { - fragments.set(anchor, 1); - } - } - } - } - - // Process HTML anchors - for (const token of filterByTypesCached([ "htmlText" ], true)) { - const htmlTagInfo = getHtmlTagInfo(token); - if (htmlTagInfo && !htmlTagInfo.close) { - const anchorMatch = idRe.exec(token.text) || - (htmlTagInfo.name.toLowerCase() === "a" && nameRe.exec(token.text)); - if (anchorMatch && anchorMatch.length > 0) { - fragments.set(`#${anchorMatch[1]}`, 0); - } - } - } - - // Process link and definition fragments - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../helpers/micromark-helpers.cjs").TokenType[][] */ - const parentChilds = [ - [ "link", "resourceDestinationString" ], - [ "definition", "definitionDestinationString" ] - ]; - for (const [ parentType, definitionType ] of parentChilds) { - const links = filterByTypesCached([ parentType ]); - for (const link of links) { - const definitions = filterByTypes(link.children, [ definitionType ]); - for (const definition of definitions) { - const { endColumn, startColumn } = definition; - const text = unescapeStringTokenText(definition); - const encodedText = `#${encodeURIComponent(text.slice(1))}`; - if ( - (text.length > 1) && - text.startsWith("#") && - !fragments.has(encodedText) && - !lineFragmentRe.test(encodedText) - ) { - let context = undefined; - let range = undefined; - let fixInfo = undefined; - if (link.startLine === link.endLine) { - context = link.text; - range = [ link.startColumn, link.endColumn - link.startColumn ]; - fixInfo = { - "editColumn": startColumn, - "deleteCount": endColumn - startColumn - }; - } - const textLower = text.toLowerCase(); - const mixedCaseKey = [ ...fragments.keys() ] - .find((key) => textLower === key.toLowerCase()); - if (mixedCaseKey) { - // @ts-ignore - (fixInfo || {}).insertText = mixedCaseKey; - if (!ignoreCase && (mixedCaseKey !== text)) { - addError( - onError, - link.startLine, - `Expected: ${mixedCaseKey}; Actual: ${text}`, - context, - range, - fixInfo - ); - } - } else { - addError( - onError, - link.startLine, - undefined, - context, - range - ); - } - } - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md052.js": -/*!***********************!*\ - !*** ../lib/md052.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getReferenceLinkImageData } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD052", "reference-links-images" ], - "description": - "Reference links and images should use a label that is defined", - "tags": [ "images", "links" ], - "parser": "none", - "function": function MD052(params, onError) { - const { config, lines } = params; - const shortcutSyntax = config.shortcut_syntax || false; - const { definitions, references, shortcuts } = getReferenceLinkImageData(); - const entries = shortcutSyntax ? - [ ...references.entries(), ...shortcuts.entries() ] : - references.entries(); - // Look for links/images that use an undefined link reference - for (const reference of entries) { - const [ label, datas ] = reference; - if (!definitions.has(label)) { - for (const data of datas) { - const [ lineIndex, index, length ] = data; - // Context will be incomplete if reporting for a multi-line link - const context = lines[lineIndex].slice(index, index + length); - addError( - onError, - lineIndex + 1, - `Missing link or image reference definition: "${label}"`, - context, - [ index + 1, context.length ] - ); - } - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md053.js": -/*!***********************!*\ - !*** ../lib/md053.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addError, ellipsify } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getReferenceLinkImageData } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const linkReferenceDefinitionRe = /^ {0,3}\[([^\]]*[^\\])\]:/; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD053", "link-image-reference-definitions" ], - "description": "Link and image reference definitions should be needed", - "tags": [ "images", "links" ], - "parser": "none", - "function": function MD053(params, onError) { - const ignored = new Set(params.config.ignored_definitions || [ "//" ]); - const lines = params.lines; - const { references, shortcuts, definitions, duplicateDefinitions } = - getReferenceLinkImageData(); - const singleLineDefinition = (line) => ( - line.replace(linkReferenceDefinitionRe, "").trim().length > 0 - ); - const deleteFixInfo = { - "deleteCount": -1 - }; - // Look for unused link references (unreferenced by any link/image) - for (const definition of definitions.entries()) { - const [ label, [ lineIndex ] ] = definition; - if ( - !ignored.has(label) && - !references.has(label) && - !shortcuts.has(label) - ) { - const line = lines[lineIndex]; - addError( - onError, - lineIndex + 1, - `Unused link or image reference definition: "${label}"`, - ellipsify(line), - [ 1, line.length ], - singleLineDefinition(line) ? deleteFixInfo : undefined - ); - } - } - // Look for duplicate link references (defined more than once) - for (const duplicateDefinition of duplicateDefinitions) { - const [ label, lineIndex ] = duplicateDefinition; - if (!ignored.has(label)) { - const line = lines[lineIndex]; - addError( - onError, - lineIndex + 1, - `Duplicate link or image reference definition: "${label}"`, - ellipsify(line), - [ 1, line.length ], - singleLineDefinition(line) ? deleteFixInfo : undefined - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md054.js": -/*!***********************!*\ - !*** ../lib/md054.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext, nextLinesRe } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getDescendantsByType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { getReferenceLinkImageData, filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const backslashEscapeRe = /\\([!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])/g; -const removeBackslashEscapes = (text) => text.replace(backslashEscapeRe, "$1"); -const autolinkDisallowedRe = /[ <>]/; -const autolinkAble = (destination) => { - try { - // eslint-disable-next-line no-new - new URL(destination); - } catch { - // Not an absolute URL - return false; - } - return !autolinkDisallowedRe.test(destination); -}; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD054", "link-image-style" ], - "description": "Link and image style", - "tags": [ "images", "links" ], - "parser": "micromark", - "function": (params, onError) => { - const config = params.config; - const autolink = (config.autolink === undefined) || !!config.autolink; - const inline = (config.inline === undefined) || !!config.inline; - const full = (config.full === undefined) || !!config.full; - const collapsed = (config.collapsed === undefined) || !!config.collapsed; - const shortcut = (config.shortcut === undefined) || !!config.shortcut; - const urlInline = (config.url_inline === undefined) || !!config.url_inline; - if (autolink && inline && full && collapsed && shortcut && urlInline) { - // Everything allowed, nothing to check - return; - } - const { definitions } = getReferenceLinkImageData(); - const links = filterByTypesCached([ "autolink", "image", "link" ]); - for (const link of links) { - let label = null; - let destination = null; - const { - endColumn, endLine, startColumn, startLine, text, type - } = link; - const image = (type === "image"); - let isError = false; - if (type === "autolink") { - // link kind is an autolink - destination = getDescendantsByType(link, [ [ "autolinkEmail", "autolinkProtocol" ] ])[0]?.text; - label = destination; - isError = !autolink && Boolean(destination); - } else { - // link type is "image" or "link" - label = getDescendantsByType(link, [ "label", "labelText" ])[0].text; - destination = - getDescendantsByType(link, [ "resource", "resourceDestination", [ "resourceDestinationLiteral", "resourceDestinationRaw" ], "resourceDestinationString" ])[0]?.text; - if (destination) { - // link kind is an inline link - const title = getDescendantsByType(link, [ "resource", "resourceTitle", "resourceTitleString" ])[0]?.text; - isError = !inline || ( - !urlInline && - autolink && - !image && - !title && - (label === destination) && - autolinkAble(destination) - ); - } else { - // link kind is a full/collapsed/shortcut reference link - const isShortcut = getDescendantsByType(link, [ "reference" ]).length === 0; - const referenceString = getDescendantsByType(link, [ "reference", "referenceString" ])[0]?.text; - const isCollapsed = (referenceString === undefined); - const definition = definitions.get(referenceString || label); - destination = definition && definition[1]; - isError = destination && - (isShortcut ? !shortcut : (isCollapsed ? !collapsed : !full)); - } - } - if (isError) { - let range = undefined; - let fixInfo = undefined; - if (startLine === endLine) { - range = [ startColumn, endColumn - startColumn ]; - let insertText = null; - const canInline = (inline && label); - const canAutolink = (autolink && !image && autolinkAble(destination)); - if (canInline && (urlInline || !canAutolink)) { - // Most useful form - const prefix = (image ? "!" : ""); - // @ts-ignore - const escapedLabel = label.replace(/[[\]]/g, "\\$&"); - const escapedDestination = destination.replace(/[()]/g, "\\$&"); - insertText = `${prefix}[${escapedLabel}](${escapedDestination})`; - } else if (canAutolink) { - // Simplest form - insertText = `<${removeBackslashEscapes(destination)}>`; - } - if (insertText) { - fixInfo = { - "editColumn": range[0], - insertText, - "deleteCount": range[1] - }; - } - } - addErrorContext( - onError, - startLine, - text.replace(nextLinesRe, ""), - undefined, - undefined, - range, - fixInfo - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md055.js": -/*!***********************!*\ - !*** ../lib/md055.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const whitespaceTypes = new Set([ "linePrefix", "whitespace" ]); -const ignoreWhitespace = (tokens) => tokens.filter( - (token) => !whitespaceTypes.has(token.type) -); -const firstOrNothing = (items) => items[0]; -const lastOrNothing = (items) => items[items.length - 1]; -const makeRange = (start, end) => [ start, end - start + 1 ]; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD055", "table-pipe-style" ], - "description": "Table pipe style", - "tags": [ "table" ], - "parser": "micromark", - "function": function MD055(params, onError) { - const style = String(params.config.style || "consistent"); - let expectedStyle = style; - let expectedLeadingPipe = - ((expectedStyle !== "no_leading_or_trailing") && (expectedStyle !== "trailing_only")); - let expectedTrailingPipe = - ((expectedStyle !== "no_leading_or_trailing") && (expectedStyle !== "leading_only")); - const rows = filterByTypesCached([ "tableDelimiterRow", "tableRow" ]); - for (const row of rows) { - // The following uses of first/lastOrNothing lack fallback handling - // because it seems not to be possible (i.e., 0% coverage) - const firstCell = firstOrNothing(row.children); - const leadingToken = firstOrNothing(ignoreWhitespace(firstCell.children)); - const actualLeadingPipe = (leadingToken.type === "tableCellDivider"); - const lastCell = lastOrNothing(row.children); - const trailingToken = lastOrNothing(ignoreWhitespace(lastCell.children)); - const actualTrailingPipe = (trailingToken.type === "tableCellDivider"); - const actualStyle = actualLeadingPipe ? - (actualTrailingPipe ? "leading_and_trailing" : "leading_only") : - (actualTrailingPipe ? "trailing_only" : "no_leading_or_trailing"); - if (expectedStyle === "consistent") { - expectedStyle = actualStyle; - expectedLeadingPipe = actualLeadingPipe; - expectedTrailingPipe = actualTrailingPipe; - } - if (actualLeadingPipe !== expectedLeadingPipe) { - addErrorDetailIf( - onError, - firstCell.startLine, - expectedStyle, - actualStyle, - `${expectedLeadingPipe ? "Missing" : "Unexpected"} leading pipe`, - undefined, - makeRange(row.startColumn, firstCell.startColumn) - ); - } - if (actualTrailingPipe !== expectedTrailingPipe) { - addErrorDetailIf( - onError, - lastCell.endLine, - expectedStyle, - actualStyle, - `${expectedTrailingPipe ? "Missing" : "Unexpected"} trailing pipe`, - undefined, - makeRange(lastCell.endColumn - 1, row.endColumn - 1) - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/md056.js": -/*!***********************!*\ - !*** ../lib/md056.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorDetailIf } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getParentOfType } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -const makeRange = (start, end) => [ start, end - start + 1 ]; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD056", "table-column-count" ], - "description": "Table column count", - "tags": [ "table" ], - "parser": "micromark", - "function": function MD056(params, onError) { - const rows = filterByTypesCached([ "tableDelimiterRow", "tableRow" ]); - let expectedCount = 0; - let currentTable = null; - for (const row of rows) { - const table = getParentOfType(row, [ "table" ]); - if (currentTable !== table) { - expectedCount = 0; - currentTable = table; - } - const cells = row.children.filter((child) => [ "tableData", "tableDelimiter", "tableHeader" ].includes(child.type)); - const actualCount = cells.length; - expectedCount ||= actualCount; - let detail = undefined; - let range = undefined; - if (actualCount < expectedCount) { - detail = "Too few cells, row will be missing data"; - range = [ row.endColumn - 1, 1 ]; - } else if (expectedCount < actualCount) { - detail = "Too many cells, extra data will be missing"; - range = makeRange(cells[expectedCount].startColumn, row.endColumn - 1); - } - addErrorDetailIf( - onError, - row.endLine, - expectedCount, - actualCount, - detail, - undefined, - range - ); - } - } -}; - - -/***/ }), - -/***/ "../lib/md058.js": -/*!***********************!*\ - !*** ../lib/md058.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { addErrorContext, isBlankLine } = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); -const { getBlockQuotePrefixText } = __webpack_require__(/*! ../helpers/micromark-helpers.cjs */ "../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = __webpack_require__(/*! ./cache */ "../lib/cache.js"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { - "names": [ "MD058", "blanks-around-tables" ], - "description": "Tables should be surrounded by blank lines", - "tags": [ "table" ], - "parser": "micromark", - "function": function MD058(params, onError) { - const { lines } = params; - const blockQuotePrefixes = filterByTypesCached([ "blockQuotePrefix", "linePrefix" ]); - - // For every table... - const tables = filterByTypesCached([ "table" ]); - for (const table of tables) { - - // Look for a blank line above the table - const firstLineNumber = table.startLine; - if (!isBlankLine(lines[firstLineNumber - 2])) { - addErrorContext( - onError, - firstLineNumber, - lines[firstLineNumber - 1].trim(), - undefined, - undefined, - undefined, - { - "insertText": getBlockQuotePrefixText(blockQuotePrefixes, firstLineNumber) - } - ); - } - - // Look for a blank line below the table - const lastLineNumber = table.endLine; - if (!isBlankLine(lines[lastLineNumber])) { - addErrorContext( - onError, - lastLineNumber, - lines[lastLineNumber - 1].trim(), - undefined, - undefined, - undefined, - { - "lineNumber": lastLineNumber + 1, - "insertText": getBlockQuotePrefixText(blockQuotePrefixes, lastLineNumber) - } - ); - } - } - } -}; - - -/***/ }), - -/***/ "../lib/rules.js": -/*!***********************!*\ - !*** ../lib/rules.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -const { homepage, version } = __webpack_require__(/*! ./constants */ "../lib/constants.js"); - -// @ts-ignore -const [ md019, md021 ] = __webpack_require__(/*! ./md019-md021 */ "../lib/md019-md021.js"); -// @ts-ignore -const [ md049, md050 ] = __webpack_require__(/*! ./md049-md050 */ "../lib/md049-md050.js"); - -const rules = [ - __webpack_require__(/*! ./md001 */ "../lib/md001.js"), - // md002: Deprecated and removed - __webpack_require__(/*! ./md003 */ "../lib/md003.js"), - __webpack_require__(/*! ./md004 */ "../lib/md004.js"), - __webpack_require__(/*! ./md005 */ "../lib/md005.js"), - // md006: Deprecated and removed - __webpack_require__(/*! ./md007 */ "../lib/md007.js"), - __webpack_require__(/*! ./md009 */ "../lib/md009.js"), - __webpack_require__(/*! ./md010 */ "../lib/md010.js"), - __webpack_require__(/*! ./md011 */ "../lib/md011.js"), - __webpack_require__(/*! ./md012 */ "../lib/md012.js"), - __webpack_require__(/*! ./md013 */ "../lib/md013.js"), - __webpack_require__(/*! ./md014 */ "../lib/md014.js"), - __webpack_require__(/*! ./md018 */ "../lib/md018.js"), - md019, - __webpack_require__(/*! ./md020 */ "../lib/md020.js"), - md021, - __webpack_require__(/*! ./md022 */ "../lib/md022.js"), - __webpack_require__(/*! ./md023 */ "../lib/md023.js"), - __webpack_require__(/*! ./md024 */ "../lib/md024.js"), - __webpack_require__(/*! ./md025 */ "../lib/md025.js"), - __webpack_require__(/*! ./md026 */ "../lib/md026.js"), - __webpack_require__(/*! ./md027 */ "../lib/md027.js"), - __webpack_require__(/*! ./md028 */ "../lib/md028.js"), - __webpack_require__(/*! ./md029 */ "../lib/md029.js"), - __webpack_require__(/*! ./md030 */ "../lib/md030.js"), - __webpack_require__(/*! ./md031 */ "../lib/md031.js"), - __webpack_require__(/*! ./md032 */ "../lib/md032.js"), - __webpack_require__(/*! ./md033 */ "../lib/md033.js"), - __webpack_require__(/*! ./md034 */ "../lib/md034.js"), - __webpack_require__(/*! ./md035 */ "../lib/md035.js"), - __webpack_require__(/*! ./md036 */ "../lib/md036.js"), - __webpack_require__(/*! ./md037 */ "../lib/md037.js"), - __webpack_require__(/*! ./md038 */ "../lib/md038.js"), - __webpack_require__(/*! ./md039 */ "../lib/md039.js"), - __webpack_require__(/*! ./md040 */ "../lib/md040.js"), - __webpack_require__(/*! ./md041 */ "../lib/md041.js"), - __webpack_require__(/*! ./md042 */ "../lib/md042.js"), - __webpack_require__(/*! ./md043 */ "../lib/md043.js"), - __webpack_require__(/*! ./md044 */ "../lib/md044.js"), - __webpack_require__(/*! ./md045 */ "../lib/md045.js"), - __webpack_require__(/*! ./md046 */ "../lib/md046.js"), - __webpack_require__(/*! ./md047 */ "../lib/md047.js"), - __webpack_require__(/*! ./md048 */ "../lib/md048.js"), - md049, - md050, - __webpack_require__(/*! ./md051 */ "../lib/md051.js"), - __webpack_require__(/*! ./md052 */ "../lib/md052.js"), - __webpack_require__(/*! ./md053 */ "../lib/md053.js"), - __webpack_require__(/*! ./md054 */ "../lib/md054.js"), - __webpack_require__(/*! ./md055 */ "../lib/md055.js"), - __webpack_require__(/*! ./md056 */ "../lib/md056.js"), - // md057: See https://github.com/markdownlint/markdownlint - __webpack_require__(/*! ./md058 */ "../lib/md058.js") -]; -for (const rule of rules) { - const name = rule.names[0].toLowerCase(); - // eslint-disable-next-line dot-notation - rule["information"] = - new URL(`${homepage}/blob/v${version}/doc/${name}.md`); -} -module.exports = rules; - - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module is referenced by other modules so it can't be inlined -/******/ var __webpack_exports__ = __webpack_require__("./markdownlint-exports.js"); -/******/ markdownlint = __webpack_exports__; -/******/ -/******/ })() -; \ No newline at end of file diff --git a/demo/markdownlint-exports.js b/demo/markdownlint-exports.js deleted file mode 100644 index ef6fc84d8..000000000 --- a/demo/markdownlint-exports.js +++ /dev/null @@ -1,8 +0,0 @@ -// @ts-check - -"use strict"; - -module.exports = { - "library": require(".."), - "helpers": require("../helpers") -}; diff --git a/demo/module-stub.cjs b/demo/module-stub.cjs new file mode 100644 index 000000000..fec94871b --- /dev/null +++ b/demo/module-stub.cjs @@ -0,0 +1,8 @@ +// @ts-check + +"use strict"; + +module.exports = { + // @ts-ignore + "createRequire": () => require +}; diff --git a/demo/webpack.config.js b/demo/webpack.config.mjs similarity index 70% rename from demo/webpack.config.js rename to demo/webpack.config.mjs index 274b14037..2b6d931a3 100644 --- a/demo/webpack.config.js +++ b/demo/webpack.config.mjs @@ -1,11 +1,14 @@ // @ts-check -"use strict"; - -const webpack = require("webpack"); -const TerserPlugin = require("terser-webpack-plugin"); +import { createRequire } from "node:module"; +const require = createRequire(import.meta.url); +import webpack from "webpack"; +import TerserPlugin from "terser-webpack-plugin"; +import { __dirname, importWithTypeJson } from "../test/esm-helpers.mjs"; +const libraryPackageJson = await importWithTypeJson(import.meta, "../package.json"); const nodeModulePrefixRe = /^node:/u; +// eslint-disable-next-line jsdoc/require-jsdoc function config(options) { const { entry, filename, mode, optimization, packageJson } = options; const { name, version, homepage, license } = packageJson; @@ -13,8 +16,7 @@ function config(options) { "devtool": false, "entry": entry, "externals": { - "markdown-it": "markdownit", - "markdownlint-micromark": "micromarkBrowser" + "markdown-it": "markdownit" }, "mode": mode, "module": { @@ -33,7 +35,7 @@ function config(options) { "name": name.replace(/(-\w)/g, (m) => m.slice(1).toUpperCase()), "type": "var" }, - "path": __dirname + "path": __dirname(import.meta) }, "plugins": [ new webpack.NormalModuleReplacementPlugin( @@ -52,7 +54,8 @@ function config(options) { "fs": false, "os": false, "path": false, - "util": false + "util": false, + "module": require.resolve("./module-stub.cjs") } } }; @@ -77,14 +80,10 @@ const modeProduction = { } }; const entryLibrary = { - "entry": "./markdownlint-exports.js", - "packageJson": require("../package.json") + "entry": "./browser-exports.mjs", + "packageJson": libraryPackageJson }; -// const entryHelpers = { -// "entry": "../helpers/helpers.js", -// "packageJson": require("../helpers/package.json") -// }; -module.exports = [ +export default [ config({ ...entryLibrary, ...modeDevelopment, @@ -95,14 +94,4 @@ module.exports = [ ...modeProduction, "filename": "markdownlint-browser.min.js" }) - // config({ - // ...entryHelpers, - // ...modeDevelopment, - // "filename": "markdownlint-rule-helpers-browser.js" - // }), - // config({ - // ...entryHelpers, - // ...modeProduction, - // "filename": "markdownlint-rule-helpers-browser.min.js" - // }) ]; diff --git a/doc-build/build-rules.mjs b/doc-build/build-rules.mjs index fc50934ae..f6852bd2e 100644 --- a/doc-build/build-rules.mjs +++ b/doc-build/build-rules.mjs @@ -1,8 +1,8 @@ import { readFile, writeFile } from "node:fs/promises"; import { EOL } from "node:os"; -import { default as rules } from "../lib/rules.js"; -import { newLineRe } from "../helpers/helpers.js"; -import { deprecatedRuleNames, fixableRuleNames } from "../lib/constants.js"; +import { default as rules } from "../lib/rules.mjs"; +import { newLineRe } from "../helpers/helpers.cjs"; +import { deprecatedRuleNames, fixableRuleNames } from "../lib/constants.mjs"; const maxLineLength = 80; diff --git a/doc/CustomRules.md b/doc/CustomRules.md index bbbe606fd..1136d2caa 100644 --- a/doc/CustomRules.md +++ b/doc/CustomRules.md @@ -36,7 +36,7 @@ A simple rule implementation using the `micromark` parser to report a violation for any use of blockquotes might look like: ```javascript -/** @type import("markdownlint").Rule */ +/** @type {import("markdownlint").Rule} */ module.exports = { "names": [ "any-blockquote-micromark" ], "description": "Rule that reports an error for any blockquote", @@ -61,7 +61,7 @@ module.exports = { That same rule implemented using the `markdown-it` parser might look like: ```javascript -/** @type import("markdownlint").Rule */ +/** @type {import("markdownlint").Rule} */ module.exports = { "names": [ "any-blockquote-markdown-it" ], "description": "Rule that reports an error for any blockquote", @@ -187,8 +187,8 @@ exception. [markdown-it-token]: https://markdown-it.github.io/markdown-it/#Token [markdownlint-rule]: https://www.npmjs.com/search?q=keywords:markdownlint-rule [micromark]: https://github.com/micromark/micromark -[micromark-token]: ../lib/markdownlint.d.ts +[micromark-token]: ../lib/markdownlint.d.mts [rule-helpers]: https://www.npmjs.com/package/markdownlint-rule-helpers [options-custom-rules]: ../README.md#optionscustomrules [test-rules]: ../test/rules -[tokens]: ../test/snapshots/markdownlint-test-custom-rules.js.md +[tokens]: ../test/snapshots/markdownlint-test-custom-rules.mjs.md diff --git a/eslint.config.mjs b/eslint.config.mjs index 3409c6e51..62d20d0ed 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -25,20 +25,11 @@ export default [ "demo/markdown-it.min.js", "demo/markdownlint-browser.js", "demo/markdownlint-browser.min.js", - "demo/micromark-browser.js", - "demo/micromark-html-browser.js", "example/typescript/type-check.js", - "micromark/micromark.cjs", - "micromark/micromark.dev.cjs", - "micromark/micromark-browser.js", - "micromark/micromark-browser.dev.js", "test-repos/**" ] }, { - "languageOptions": { - "sourceType": "commonjs" - }, "linterOptions": { "reportUnusedDisableDirectives": true }, @@ -88,7 +79,6 @@ export default [ "unicorn/no-null": "off", "unicorn/no-useless-undefined": "off", "unicorn/prefer-at": "off", - "unicorn/prefer-module": "off", "unicorn/prefer-string-raw": "off", "unicorn/prefer-string-replace-all": "off", "unicorn/prefer-string-slice": "off", @@ -107,15 +97,20 @@ export default [ }, { "files": [ - "**/*.mjs" + "**/*.js", + "**/*.cjs" ], "languageOptions": { - "sourceType": "module" + "sourceType": "commonjs", + "globals": { + "module": "readonly", + "require": "readonly" + } } }, { "files": [ - "demo/*.js" + "demo/default.js" ], "languageOptions": { "globals": { @@ -131,26 +126,42 @@ export default [ "no-invalid-this": "off", "no-shadow": "off", "no-var": "off", + "unicorn/prefer-module": "off", "unicorn/prefer-query-selector": "off" } }, { "files": [ - "example/*.js" + "example/*.cjs" ], + "languageOptions": { + "sourceType": "commonjs" + }, "rules": { "n/no-missing-require": "off", "no-console": "off", - "no-invalid-this": "off", + "no-invalid-this": "off" + } + }, + { + "files": [ + "example/standalone.mjs" + ], + "rules": { + "no-console": "off", "no-shadow": "off" } }, { "files": [ - "test/rules/**/*.js" + "test/rules/**/*.js", + "test/rules/**/*.cjs" ], + "languageOptions": { + "sourceType": "commonjs" + }, "rules": { - "jsdoc/valid-types": "off" + "unicorn/prefer-module": "off" } } ]; diff --git a/example/Gruntfile.cjs b/example/Gruntfile.cjs new file mode 100644 index 000000000..bbb2a6f58 --- /dev/null +++ b/example/Gruntfile.cjs @@ -0,0 +1,28 @@ +// @ts-check + +"use strict"; + +module.exports = function wrapper(grunt) { + grunt.initConfig({ + "markdownlint": { + "example": { + "src": [ "*.md" ] + } + } + }); + + grunt.registerMultiTask("markdownlint", function task() { + const done = this.async(); + import("markdownlint").then(({ "default": markdownlint }) => { + markdownlint( + { "files": this.filesSrc }, + function callback(err, result) { + const resultString = err || ((result || "").toString()); + if (resultString) { + grunt.fail.warn("\n" + resultString + "\n"); + } + done(!err || !resultString); + }); + }).catch(done); + }); +}; diff --git a/example/Gruntfile.js b/example/Gruntfile.js deleted file mode 100644 index 6da592328..000000000 --- a/example/Gruntfile.js +++ /dev/null @@ -1,28 +0,0 @@ -// @ts-check - -"use strict"; - -const markdownlint = require("../lib/markdownlint"); - -module.exports = function wrapper(grunt) { - grunt.initConfig({ - "markdownlint": { - "example": { - "src": [ "*.md" ] - } - } - }); - - grunt.registerMultiTask("markdownlint", function task() { - const done = this.async(); - markdownlint( - { "files": this.filesSrc }, - function callback(err, result) { - const resultString = err || ((result || "").toString()); - if (resultString) { - grunt.fail.warn("\n" + resultString + "\n"); - } - done(!err || !resultString); - }); - }); -}; diff --git a/example/gulpfile.cjs b/example/gulpfile.cjs new file mode 100644 index 000000000..fda31268c --- /dev/null +++ b/example/gulpfile.cjs @@ -0,0 +1,24 @@ +// @ts-check + +"use strict"; + +const gulp = require("gulp"); +const through2 = require("through2"); + +// Simple task wrapper +gulp.task("markdownlint", function task() { + return gulp.src("*.md", { "read": false }) + .pipe(through2.obj(function obj(file, enc, next) { + import("markdownlint").then(({ "default": markdownlint }) => { + markdownlint( + { "files": [ file.relative ] }, + function callback(err, result) { + const resultString = (result || "").toString(); + if (resultString) { + console.log(resultString); + } + next(err, file); + }); + }).catch(next); + })); +}); diff --git a/example/gulpfile.js b/example/gulpfile.js deleted file mode 100644 index 7548cbb6d..000000000 --- a/example/gulpfile.js +++ /dev/null @@ -1,23 +0,0 @@ -// @ts-check - -"use strict"; - -const gulp = require("gulp"); -const through2 = require("through2"); -const markdownlint = require("../lib/markdownlint"); - -// Simple task wrapper -gulp.task("markdownlint", function task() { - return gulp.src("*.md", { "read": false }) - .pipe(through2.obj(function obj(file, enc, next) { - markdownlint( - { "files": [ file.relative ] }, - function callback(err, result) { - const resultString = (result || "").toString(); - if (resultString) { - console.log(resultString); - } - next(err, file); - }); - })); -}); diff --git a/example/standalone.js b/example/standalone.mjs similarity index 69% rename from example/standalone.js rename to example/standalone.mjs index 7f198fe84..804a5094d 100644 --- a/example/standalone.js +++ b/example/standalone.mjs @@ -1,8 +1,6 @@ // @ts-check -"use strict"; - -const markdownlint = require("../lib/markdownlint"); +import markdownlint from "markdownlint"; const options = { "files": [ "good.md", "bad.md" ], @@ -19,6 +17,7 @@ console.log(result.toString()); // Makes an asynchronous call markdownlint(options, function callback(err, result) { if (!err) { + // @ts-ignore console.log(result.toString()); } }); @@ -29,3 +28,9 @@ markdownlint(options, function callback(err, result) { console.dir(result, { "colors": true, "depth": null }); } }); + +// Fixes all supported violations in Markdown content +const original = "# Heading"; +const fixResults = markdownlint.sync({ "strings": { "content": original } }); +const fixed = markdownlint.applyFixes(original, fixResults.content); +console.log(fixed); diff --git a/example/typescript/type-check.ts b/example/typescript/type-check.ts index eb9c13b1a..1ab5cea15 100644 --- a/example/typescript/type-check.ts +++ b/example/typescript/type-check.ts @@ -1,25 +1,27 @@ -// Attempt to validate all the type declarations in markdownlint.d.ts +// Attempt to validate all the type declarations in markdownlint.d.mts -import markdownlint from "../.."; +import { default as markdownlint, Configuration, ConfigurationStrict, LintResults, Options, Rule, RuleParams, RuleOnError, RuleOnErrorInfo } from "../../lib/markdownlint.mjs"; -const assert = require("assert"); +import assert from "assert"; +// @ts-expect-error TS7016: Could not find a declaration file for module 'markdown-it-sub'. +import markdownItSub from "markdown-it-sub"; const markdownlintJsonPath = "../../.markdownlint.json"; const version: string = markdownlint.getVersion(); assert(/^\d+\.\d+\.\d+$/.test(version)); -function assertConfiguration(config: markdownlint.Configuration) { +function assertConfiguration(config: Configuration) { assert(!!config); assert.deepEqual(config["line-length"], { "strict": true, "code_blocks": false }); // config assignment is covered by markdownlint.Options } -function assertConfigurationCallback(err: Error | null, config?: markdownlint.Configuration) { +function assertConfigurationCallback(err: Error | null, config?: Configuration) { assert(!err); config && assertConfiguration(config); } -function assertLintResults(results: markdownlint.LintResults) { +function assertLintResults(results: LintResults) { assert(!!results); assert.equal(results["string"].length, 1); assert.equal(results["string"][0].lineNumber, 1); @@ -60,7 +62,7 @@ function assertLintResults(results: markdownlint.LintResults) { }; } -function assertLintResultsCallback(err: Error | null, results?: markdownlint.LintResults) { +function assertLintResultsCallback(err: Error | null, results?: LintResults) { assert(!err); results && assertLintResults(results); } @@ -76,7 +78,7 @@ markdownlint.readConfig(markdownlintJsonPath, [ JSON.parse ], assertConfiguratio assertConfigurationCallback(null, await markdownlint.promises.readConfig(markdownlintJsonPath, [ JSON.parse ])) })(); -let options: markdownlint.Options; +let options: Options; options = { "files": [ "../bad.md" ], "strings": { @@ -93,7 +95,7 @@ options = { "frontMatter": /---/, "handleRuleFailures": false, "noInlineConfig": false, - "markdownItPlugins": [ [ require("markdown-it-sub") ] ] + "markdownItPlugins": [ [ markdownItSub ] ] }; assertLintResults(markdownlint.sync(options)); @@ -109,16 +111,16 @@ markdownlint(options, assertLintResultsCallback); assertLintResultsCallback(null, await markdownlint.promises.markdownlint(options)); })(); -const testRule: markdownlint.Rule = { +const testRule: Rule = { "names": [ "test-rule" ], "description": "Test rule", "information": new URL("https://example.com/rule-information"), "tags": [ "test-tag" ], "parser": "none", - "function": function rule(params: markdownlint.RuleParams, onError: markdownlint.RuleOnError) { + "function": function rule(params: RuleParams, onError: RuleOnError) { assert(!!params); assert(!!onError); - let ruleParams: markdownlint.RuleParams; + let ruleParams: RuleParams; ruleParams = { "name": "name", "parsers": { @@ -140,7 +142,7 @@ const testRule: markdownlint.Rule = { "version": "1.2.3" }; assert(ruleParams); - let ruleOnErrorInfo: markdownlint.RuleOnErrorInfo; + let ruleOnErrorInfo: RuleOnErrorInfo; ruleOnErrorInfo = { "lineNumber": 1, "detail": "detail", @@ -196,7 +198,7 @@ assert.equal( "# Heading\n" ); -const configuration: markdownlint.Configuration = { +const configuration: Configuration = { "custom-rule": true, "no-hard-tabs": false, "heading-style": { @@ -204,7 +206,7 @@ const configuration: markdownlint.Configuration = { } }; assert(configuration); -const configurationStrict: markdownlint.ConfigurationStrict = { +const configurationStrict: ConfigurationStrict = { // "custom-rule": true, "no-hard-tabs": false, "heading-style": { diff --git a/helpers/.npmignore b/helpers/.npmignore index daa602947..73c5a2779 100644 --- a/helpers/.npmignore +++ b/helpers/.npmignore @@ -1 +1 @@ -test.js +test.cjs diff --git a/helpers/helpers.js b/helpers/helpers.cjs similarity index 96% rename from helpers/helpers.js rename to helpers/helpers.cjs index f52e48bd7..f35f94291 100644 --- a/helpers/helpers.js +++ b/helpers/helpers.cjs @@ -4,13 +4,17 @@ const micromark = require("./micromark-helpers.cjs"); -const { newLineRe, nextLinesRe } = require("./shared.js"); +const { newLineRe, nextLinesRe } = require("./shared.cjs"); module.exports.newLineRe = newLineRe; module.exports.nextLinesRe = nextLinesRe; -/** @typedef {import("../lib/markdownlint.js").RuleOnError} RuleOnError */ -/** @typedef {import("../lib/markdownlint.js").RuleOnErrorFixInfo} RuleOnErrorFixInfo */ +// @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 +/** @typedef {import("../lib/markdownlint.mjs").RuleOnError} RuleOnError */ +// @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 +/** @typedef {import("../lib/markdownlint.mjs").RuleOnErrorFixInfo} RuleOnErrorFixInfo */ +// @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 +/** @typedef {import("../lib/markdownlint.mjs").MicromarkToken} MicromarkToken */ // Regular expression for matching common front matter (YAML and TOML) module.exports.frontMatterRe = @@ -336,8 +340,8 @@ const positionLessThanOrEqual = (lineA, columnA, lineB, columnB) => ( /** * Returns whether two ranges (or MicromarkTokens) overlap anywhere. * - * @param {FileRange|import("../lib/markdownlint.js").MicromarkToken} rangeA Range A. - * @param {FileRange|import("../lib/markdownlint.js").MicromarkToken} rangeB Range B. + * @param {FileRange|MicromarkToken} rangeA Range A. + * @param {FileRange|MicromarkToken} rangeB Range B. * @returns {boolean} True iff the two ranges overlap. */ module.exports.hasOverlap = function hasOverlap(rangeA, rangeB) { diff --git a/helpers/micromark-helpers.cjs b/helpers/micromark-helpers.cjs index 6b4ff09c1..230279d9a 100644 --- a/helpers/micromark-helpers.cjs +++ b/helpers/micromark-helpers.cjs @@ -2,10 +2,12 @@ "use strict"; -const { flatTokensSymbol, htmlFlowSymbol } = require("./shared.js"); +const { flatTokensSymbol, htmlFlowSymbol } = require("./shared.cjs"); -/** @typedef {import("markdownlint-micromark").TokenType} TokenType */ -/** @typedef {import("../lib/markdownlint.js").MicromarkToken} Token */ +// @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 +/** @typedef {import("micromark-util-types").TokenType} TokenType */ +// @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 +/** @typedef {import("../lib/markdownlint.mjs").MicromarkToken} Token */ /** * Determines if a Micromark token is within an htmlFlow type. diff --git a/helpers/micromark-parse.cjs b/helpers/micromark-parse.mjs similarity index 84% rename from helpers/micromark-parse.cjs rename to helpers/micromark-parse.mjs index 0ca3373ed..27eedfb45 100644 --- a/helpers/micromark-parse.cjs +++ b/helpers/micromark-parse.mjs @@ -1,18 +1,24 @@ // @ts-check -"use strict"; +import { directive } from "micromark-extension-directive"; +import { gfmAutolinkLiteral } from "micromark-extension-gfm-autolink-literal"; +import { gfmFootnote } from "micromark-extension-gfm-footnote"; +import { gfmTable } from "micromark-extension-gfm-table"; +import { math } from "micromark-extension-math"; +import { parse as micromarkParse, postprocess as micromarkPostprocess, preprocess as micromarkPreprocess } from "micromark"; +// micromark-core-commonmark is not a dependency because this instance must match what's used by micromark +// eslint-disable-next-line n/no-extraneous-import +import { labelEnd } from "micromark-core-commonmark"; +import { isHtmlFlowComment } from "./micromark-helpers.cjs"; +import { flatTokensSymbol, htmlFlowSymbol, newLineRe } from "./shared.cjs"; -const micromark = require("markdownlint-micromark"); -const { isHtmlFlowComment } = require("./micromark-helpers.cjs"); -const { flatTokensSymbol, htmlFlowSymbol, newLineRe } = require("./shared.js"); - -/** @typedef {import("markdownlint-micromark").Construct} Construct */ -/** @typedef {import("markdownlint-micromark").Event} Event */ -/** @typedef {import("markdownlint-micromark").ParseOptions} MicromarkParseOptions */ -/** @typedef {import("markdownlint-micromark").State} State */ -/** @typedef {import("markdownlint-micromark").Token} Token */ -/** @typedef {import("markdownlint-micromark").Tokenizer} Tokenizer */ -/** @typedef {import("../lib/markdownlint.js").MicromarkToken} MicromarkToken */ +/** @typedef {import("micromark-util-types").Event} Event */ +/** @typedef {import("micromark-util-types").ParseOptions} MicromarkParseOptions */ +/** @typedef {import("micromark-util-types").State} State */ +/** @typedef {import("micromark-util-types").Token} Token */ +/** @typedef {import("micromark-util-types").Tokenizer} Tokenizer */ +/** @typedef {import("./micromark-types.d.mts")} */ +/** @typedef {import("../lib/markdownlint.mjs").MicromarkToken} MicromarkToken */ /** * Parse options. @@ -28,27 +34,23 @@ const { flatTokensSymbol, htmlFlowSymbol, newLineRe } = require("./shared.js"); * @param {MicromarkParseOptions} [micromarkParseOptions] Options for micromark. * @returns {Event[]} Micromark events. */ -function getEvents( +export function getEvents( markdown, micromarkParseOptions = {} ) { // Customize extensions list to add useful extensions const extensions = [ - micromark.directive(), - micromark.gfmAutolinkLiteral(), - micromark.gfmFootnote(), - micromark.gfmTable(), - micromark.math(), + directive(), + gfmAutolinkLiteral(), + gfmFootnote(), + gfmTable(), + math(), ...(micromarkParseOptions.extensions || []) ]; // // Shim labelEnd to identify undefined link labels /** @type {Event[][]} */ const artificialEventLists = []; - /** @type {Construct} */ - const labelEnd = - // @ts-ignore - micromark.labelEnd; const tokenizeOriginal = labelEnd.tokenize; /** @type {Tokenizer} */ @@ -162,9 +164,9 @@ function getEvents( // Use micromark to parse document into Events const encoding = undefined; const eol = true; - const parseContext = micromark.parse({ ...micromarkParseOptions, extensions }); - const chunks = micromark.preprocess()(markdown, encoding, eol); - const events = micromark.postprocess(parseContext.document().write(chunks)); + const parseContext = micromarkParse({ ...micromarkParseOptions, extensions }); + const chunks = micromarkPreprocess()(markdown, encoding, eol); + const events = micromarkPostprocess(parseContext.document().write(chunks)); // Append artificial events and return all events // eslint-disable-next-line unicorn/prefer-spread @@ -214,8 +216,7 @@ function parseInternal( }; const history = [ root ]; let current = root; - // eslint-disable-next-line jsdoc/valid-types - /** @type MicromarkParseOptions | null */ + /** @type {MicromarkParseOptions | null} */ let reparseOptions = null; let lines = null; let skipHtmlFlowChildren = false; @@ -303,11 +304,6 @@ function parseInternal( * @param {ParseOptions} [parseOptions] Options. * @returns {MicromarkToken[]} Micromark tokens. */ -function parse(markdown, parseOptions) { +export function parse(markdown, parseOptions) { return parseInternal(markdown, parseOptions); } - -module.exports = { - getEvents, - parse -}; diff --git a/helpers/micromark-types.d.mts b/helpers/micromark-types.d.mts new file mode 100644 index 000000000..6afc9d0ed --- /dev/null +++ b/helpers/micromark-types.d.mts @@ -0,0 +1,11 @@ +export {}; + +// Augment TokenTypeMap with markdownlint-specific types. +declare module "micromark-util-types" { + export interface TokenTypeMap { + undefinedReference: "undefinedReference" + undefinedReferenceCollapsed: "undefinedReferenceCollapsed" + undefinedReferenceFull: "undefinedReferenceFull" + undefinedReferenceShortcut: "undefinedReferenceShortcut" + } +} diff --git a/helpers/package.json b/helpers/package.json index 4790473f4..e047d252e 100644 --- a/helpers/package.json +++ b/helpers/package.json @@ -2,9 +2,9 @@ "name": "markdownlint-rule-helpers", "version": "0.27.0", "description": "A collection of markdownlint helper functions for custom rules", - "main": "./helpers.js", + "main": "./helpers.cjs", "exports": { - ".": "./helpers.js", + ".": "./helpers.cjs", "./micromark": "./micromark-helpers.cjs" }, "author": "David Anson (https://dlaa.me/)", @@ -20,7 +20,12 @@ "node": ">=18" }, "dependencies": { - "markdownlint-micromark": "0.1.2" + "micromark": "4.0.0", + "micromark-extension-directive": "3.0.2", + "micromark-extension-gfm-autolink-literal": "2.1.0", + "micromark-extension-gfm-footnote": "2.1.0", + "micromark-extension-gfm-table": "2.1.0", + "micromark-extension-math": "3.1.0" }, "keywords": [ "markdownlint", diff --git a/helpers/shared.js b/helpers/shared.cjs similarity index 100% rename from helpers/shared.js rename to helpers/shared.cjs diff --git a/helpers/test.cjs b/helpers/test.cjs index 340ae99d9..cf501b5c0 100644 --- a/helpers/test.cjs +++ b/helpers/test.cjs @@ -7,7 +7,7 @@ const test = require("ava").default; const { "exports": packageExports, name } = require("../helpers/package.json"); const exportMappings = new Map([ - [ ".", "../helpers/helpers.js" ], + [ ".", "../helpers/helpers.cjs" ], [ "./micromark", "../helpers/micromark-helpers.cjs" ] ]); diff --git a/lib/cache.js b/lib/cache.mjs similarity index 62% rename from lib/cache.js rename to lib/cache.mjs index 8d53f33f2..c4af0e977 100644 --- a/lib/cache.js +++ b/lib/cache.mjs @@ -1,9 +1,7 @@ // @ts-check -"use strict"; - -const helpers = require("../helpers"); -const { filterByTypes } = require("../helpers/micromark-helpers.cjs"); +import { getReferenceLinkImageData as helpersGetReferenceLinkImageData } from "../helpers/helpers.cjs"; +import { filterByTypes } from "../helpers/micromark-helpers.cjs"; /** @type {Map} */ const map = new Map(); @@ -12,10 +10,10 @@ let params = undefined; /** * Initializes (resets) the cache. * - * @param {import("./markdownlint").RuleParams} [p] Rule parameters object. + * @param {import("./markdownlint.mjs").RuleParams} [p] Rule parameters object. * @returns {void} */ -function initialize(p) { +export function initialize(p) { map.clear(); params = p; } @@ -39,11 +37,11 @@ function getCached(name, getValue) { /** * Filters a list of Micromark tokens by type and caches the result. * - * @param {import("./markdownlint").MicromarkTokenType[]} types Types to allow. + * @param {import("./markdownlint.mjs").MicromarkTokenType[]} types Types to allow. * @param {boolean} [htmlFlow] Whether to include htmlFlow content. - * @returns {import("./markdownlint").MicromarkToken[]} Filtered tokens. + * @returns {import("./markdownlint.mjs").MicromarkToken[]} Filtered tokens. */ -function filterByTypesCached(types, htmlFlow) { +export function filterByTypesCached(types, htmlFlow) { return getCached( // eslint-disable-next-line prefer-rest-params JSON.stringify(arguments), @@ -56,15 +54,9 @@ function filterByTypesCached(types, htmlFlow) { * * @returns {Object} Reference link and image data object. */ -function getReferenceLinkImageData() { +export function getReferenceLinkImageData() { return getCached( getReferenceLinkImageData.name, - () => helpers.getReferenceLinkImageData(params.parsers.micromark.tokens) + () => helpersGetReferenceLinkImageData(params.parsers.micromark.tokens) ); } - -module.exports = { - initialize, - filterByTypesCached, - getReferenceLinkImageData -}; diff --git a/lib/configuration.d.ts b/lib/configuration.d.ts index 2406f8758..f69918738 100644 --- a/lib/configuration.d.ts +++ b/lib/configuration.d.ts @@ -1,4 +1,4 @@ -import { ConfigurationStrict } from "./configuration-strict"; +import type { ConfigurationStrict } from "./configuration-strict.d.ts"; export interface Configuration extends ConfigurationStrict { /** diff --git a/lib/constants.js b/lib/constants.mjs similarity index 60% rename from lib/constants.js rename to lib/constants.mjs index cdfbfae47..b83a7d9b5 100644 --- a/lib/constants.js +++ b/lib/constants.mjs @@ -1,9 +1,7 @@ // @ts-check -"use strict"; - -module.exports.deprecatedRuleNames = []; -module.exports.fixableRuleNames = [ +export const deprecatedRuleNames = []; +export const fixableRuleNames = [ "MD004", "MD005", "MD007", "MD009", "MD010", "MD011", "MD012", "MD014", "MD018", "MD019", "MD020", "MD021", "MD022", "MD023", "MD026", "MD027", "MD030", "MD031", @@ -11,5 +9,5 @@ module.exports.fixableRuleNames = [ "MD047", "MD049", "MD050", "MD051", "MD053", "MD054", "MD058" ]; -module.exports.homepage = "https://github.com/DavidAnson/markdownlint"; -module.exports.version = "0.36.1"; +export const homepage = "https://github.com/DavidAnson/markdownlint"; +export const version = "0.36.1"; diff --git a/lib/markdownit.cjs b/lib/markdownit.cjs index 5c6349a82..5651dc081 100644 --- a/lib/markdownit.cjs +++ b/lib/markdownit.cjs @@ -4,6 +4,11 @@ const { newLineRe } = require("../helpers"); +// @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 +/** @typedef {import("./markdownlint.mjs").MarkdownItToken} MarkdownItToken */ +// @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 +/** @typedef {import("./markdownlint.mjs").Plugin} Plugin */ + /** * @callback InlineCodeSpanCallback * @param {string} code Code content. @@ -67,7 +72,7 @@ function forEachInlineCodeSpan(input, handler) { /** * Freeze all freeze-able members of a token and its children. * - * @param {import("./markdownlint").MarkdownItToken} token A markdown-it token. + * @param {MarkdownItToken} token A markdown-it token. * @returns {void} */ function freezeToken(token) { @@ -98,8 +103,7 @@ function freezeToken(token) { */ function annotateAndFreezeTokens(tokens, lines) { let trMap = null; - // eslint-disable-next-line jsdoc/valid-types - /** @type import("./markdownlint").MarkdownItToken[] */ + /** @type {MarkdownItToken[]} */ // @ts-ignore const markdownItTokens = tokens; for (const token of markdownItTokens) { @@ -148,10 +152,10 @@ function annotateAndFreezeTokens(tokens, lines) { /** * Gets an array of markdown-it tokens for the input. * - * @param {import("./markdownlint").Plugin[]} markdownItPlugins Additional plugins. + * @param {Plugin[]} markdownItPlugins Additional plugins. * @param {string} content Markdown content. * @param {string[]} lines Lines of Markdown content. - * @returns {import("../lib/markdownlint").MarkdownItToken} Array of markdown-it tokens. + * @returns {MarkdownItToken} Array of markdown-it tokens. */ function getMarkdownItTokens(markdownItPlugins, content, lines) { const markdownit = require("markdown-it"); diff --git a/lib/markdownlint.d.ts b/lib/markdownlint.d.mts similarity index 84% rename from lib/markdownlint.d.ts rename to lib/markdownlint.d.mts index d12abe6be..55b425110 100644 --- a/lib/markdownlint.d.ts +++ b/lib/markdownlint.d.mts @@ -1,79 +1,12 @@ -export = markdownlint; -/** - * Lint specified Markdown files. - * - * @param {Options | null} options Configuration options. - * @param {LintCallback} callback Callback (err, result) function. - * @returns {void} - */ -declare function markdownlint(options: Options | null, callback: LintCallback): void; -declare namespace markdownlint { - export { markdownlintSync as sync, readConfig, readConfigSync, getVersion, promises, applyFix, applyFixes, RuleFunction, RuleParams, MarkdownParsers, ParserMarkdownIt, ParserMicromark, MarkdownItToken, MicromarkTokenType, MicromarkToken, RuleOnError, RuleOnErrorInfo, RuleOnErrorFixInfo, RuleOnErrorFixInfoNormalized, Rule, Options, Plugin, ToStringCallback, LintResults, LintError, FixInfo, LintContentCallback, LintCallback, Configuration, ConfigurationStrict, RuleConfiguration, ConfigurationParser, ReadConfigCallback, ResolveConfigExtendsCallback }; -} -/** - * Lint specified Markdown files synchronously. - * - * @param {Options | null} options Configuration options. - * @returns {LintResults} Results object. - */ -declare function markdownlintSync(options: Options | null): LintResults; -/** - * Read specified configuration file. - * - * @param {string} file Configuration file name. - * @param {ConfigurationParser[] | ReadConfigCallback} parsers Parsing - * function(s). - * @param {Object} [fs] File system implementation. - * @param {ReadConfigCallback} [callback] Callback (err, result) function. - * @returns {void} - */ -declare function readConfig(file: string, parsers: ConfigurationParser[] | ReadConfigCallback, fs?: any, callback?: ReadConfigCallback): void; -/** - * Read specified configuration file synchronously. - * - * @param {string} file Configuration file name. - * @param {ConfigurationParser[]} [parsers] Parsing function(s). - * @param {Object} [fs] File system implementation. - * @returns {Configuration} Configuration object. - * @throws An Error if processing fails. - */ -declare function readConfigSync(file: string, parsers?: ConfigurationParser[], fs?: any): Configuration; -/** - * Gets the (semantic) version of the library. - * - * @returns {string} SemVer string. - */ -declare function getVersion(): string; -declare namespace promises { - export { markdownlintPromise as markdownlint }; - export { extendConfigPromise as extendConfig }; - export { readConfigPromise as readConfig }; -} -/** - * Applies the specified fix to a Markdown content line. - * - * @param {string} line Line of Markdown content. - * @param {RuleOnErrorFixInfo} fixInfo RuleOnErrorFixInfo instance. - * @param {string} [lineEnding] Line ending to use. - * @returns {string | null} Fixed content or null if deleted. - */ -declare function applyFix(line: string, fixInfo: RuleOnErrorFixInfo, lineEnding?: string): string | null; -/** - * Applies as many of the specified fixes as possible to Markdown content. - * - * @param {string} input Lines of Markdown content. - * @param {RuleOnErrorInfo[]} errors RuleOnErrorInfo instances. - * @returns {string} Fixed content. - */ -declare function applyFixes(input: string, errors: RuleOnErrorInfo[]): string; +export default markdownlint; /** * Function to implement rule logic. */ -type RuleFunction = (params: RuleParams, onError: RuleOnError) => void; +export type RuleFunction = (params: RuleParams, onError: RuleOnError) => void; /** * Rule parameters. */ -type RuleParams = { +export type RuleParams = { /** * File/string name. */ @@ -102,7 +35,7 @@ type RuleParams = { /** * Markdown parser data. */ -type MarkdownParsers = { +export type MarkdownParsers = { /** * Markdown parser data from markdown-it (only present when Rule.parser is "markdownit"). */ @@ -115,7 +48,7 @@ type MarkdownParsers = { /** * Markdown parser data from markdown-it. */ -type ParserMarkdownIt = { +export type ParserMarkdownIt = { /** * Token objects from markdown-it. */ @@ -124,7 +57,7 @@ type ParserMarkdownIt = { /** * Markdown parser data from micromark. */ -type ParserMicromark = { +export type ParserMicromark = { /** * Token objects from micromark. */ @@ -133,7 +66,7 @@ type ParserMicromark = { /** * markdown-it token. */ -type MarkdownItToken = { +export type MarkdownItToken = { /** * HTML attributes. */ @@ -195,11 +128,11 @@ type MarkdownItToken = { */ line: string; }; -type MicromarkTokenType = import("markdownlint-micromark").TokenType; +export type MicromarkTokenType = import("micromark-util-types").TokenType; /** * micromark token. */ -type MicromarkToken = { +export type MicromarkToken = { /** * Token type. */ @@ -236,11 +169,11 @@ type MicromarkToken = { /** * Error-reporting callback. */ -type RuleOnError = (onErrorInfo: RuleOnErrorInfo) => void; +export type RuleOnError = (onErrorInfo: RuleOnErrorInfo) => void; /** * Fix information for RuleOnError callback. */ -type RuleOnErrorInfo = { +export type RuleOnErrorInfo = { /** * Line number (1-based). */ @@ -269,7 +202,7 @@ type RuleOnErrorInfo = { /** * Fix information for RuleOnErrorInfo. */ -type RuleOnErrorFixInfo = { +export type RuleOnErrorFixInfo = { /** * Line number (1-based). */ @@ -290,7 +223,7 @@ type RuleOnErrorFixInfo = { /** * RuleOnErrorInfo with all optional properties present. */ -type RuleOnErrorFixInfoNormalized = { +export type RuleOnErrorFixInfoNormalized = { /** * Line number (1-based). */ @@ -311,7 +244,7 @@ type RuleOnErrorFixInfoNormalized = { /** * Rule definition. */ -type Rule = { +export type Rule = { /** * Rule name(s). */ @@ -344,7 +277,7 @@ type Rule = { /** * Configuration options. */ -type Options = { +export type Options = { /** * Configuration object. */ @@ -395,21 +328,21 @@ type Options = { /** * A markdown-it plugin. */ -type Plugin = any[]; +export type Plugin = any[]; /** * Function to pretty-print lint results. */ -type ToStringCallback = (ruleAliases?: boolean) => string; +export type ToStringCallback = (ruleAliases?: boolean) => string; /** * Lint results (for resultVersion 3). */ -type LintResults = { +export type LintResults = { [x: string]: LintError[]; }; /** * Lint error. */ -type LintError = { +export type LintError = { /** * Line number (1-based). */ @@ -446,7 +379,7 @@ type LintError = { /** * Fix information. */ -type FixInfo = { +export type FixInfo = { /** * Line number (1-based). */ @@ -467,37 +400,92 @@ type FixInfo = { /** * Called with the result of linting a string or document. */ -type LintContentCallback = (error: Error | null, result?: LintError[]) => void; +export type LintContentCallback = (error: Error | null, result?: LintError[]) => void; /** * Called with the result of the lint function. */ -type LintCallback = (error: Error | null, results?: LintResults) => void; +export type LintCallback = (error: Error | null, results?: LintResults) => void; /** * Configuration object for linting rules. For the JSON schema, see * {@link ../schema/markdownlint-config-schema.json}. */ -type Configuration = import("./configuration").Configuration; +export type Configuration = import("./configuration.d.ts").Configuration; /** * Configuration object for linting rules strictly. For the JSON schema, see * {@link ../schema/markdownlint-config-schema-strict.json}. */ -type ConfigurationStrict = import("./configuration-strict").ConfigurationStrict; +export type ConfigurationStrict = import("./configuration-strict.d.ts").ConfigurationStrict; /** * Rule configuration. */ -type RuleConfiguration = boolean | any; +export type RuleConfiguration = boolean | any; /** * Parses a configuration string and returns a configuration object. */ -type ConfigurationParser = (text: string) => Configuration; +export type ConfigurationParser = (text: string) => Configuration; /** * Called with the result of the readConfig function. */ -type ReadConfigCallback = (err: Error | null, config?: Configuration) => void; +export type ReadConfigCallback = (err: Error | null, config?: Configuration) => void; /** * Called with the result of the resolveConfigExtends function. */ -type ResolveConfigExtendsCallback = (err: Error | null, path?: string) => void; +export type ResolveConfigExtendsCallback = (err: Error | null, path?: string) => void; +/** + * Lint specified Markdown files. + * + * @param {Options | null} options Configuration options. + * @param {LintCallback} callback Callback (err, result) function. + * @returns {void} + */ +declare function markdownlint(options: Options | null, callback: LintCallback): void; +declare namespace markdownlint { + export { markdownlintSync as sync }; + export { readConfig }; + export { readConfigSync }; + export { getVersion }; + export namespace promises { + export { markdownlintPromise as markdownlint }; + export { extendConfigPromise as extendConfig }; + export { readConfigPromise as readConfig }; + } + export { applyFix }; + export { applyFixes }; +} +/** + * Lint specified Markdown files synchronously. + * + * @param {Options | null} options Configuration options. + * @returns {LintResults} Results object. + */ +declare function markdownlintSync(options: Options | null): LintResults; +/** + * Read specified configuration file. + * + * @param {string} file Configuration file name. + * @param {ConfigurationParser[] | ReadConfigCallback} parsers Parsing + * function(s). + * @param {Object} [fs] File system implementation. + * @param {ReadConfigCallback} [callback] Callback (err, result) function. + * @returns {void} + */ +declare function readConfig(file: string, parsers: ConfigurationParser[] | ReadConfigCallback, fs?: any, callback?: ReadConfigCallback): void; +/** + * Read specified configuration file synchronously. + * + * @param {string} file Configuration file name. + * @param {ConfigurationParser[]} [parsers] Parsing function(s). + * @param {Object} [fs] File system implementation. + * @returns {Configuration} Configuration object. + * @throws An Error if processing fails. + */ +declare function readConfigSync(file: string, parsers?: ConfigurationParser[], fs?: any): Configuration; +/** + * Gets the (semantic) version of the library. + * + * @returns {string} SemVer string. + */ +declare function getVersion(): string; /** * Lint specified Markdown files. * @@ -524,3 +512,20 @@ declare function extendConfigPromise(config: Configuration, file: string, parser * @returns {Promise} Configuration object. */ declare function readConfigPromise(file: string, parsers?: ConfigurationParser[], fs?: any): Promise; +/** + * Applies the specified fix to a Markdown content line. + * + * @param {string} line Line of Markdown content. + * @param {RuleOnErrorFixInfo} fixInfo RuleOnErrorFixInfo instance. + * @param {string} [lineEnding] Line ending to use. + * @returns {string | null} Fixed content or null if deleted. + */ +declare function applyFix(line: string, fixInfo: RuleOnErrorFixInfo, lineEnding?: string): string | null; +/** + * Applies as many of the specified fixes as possible to Markdown content. + * + * @param {string} input Lines of Markdown content. + * @param {RuleOnErrorInfo[]} errors RuleOnErrorInfo instances. + * @returns {string} Fixed content. + */ +declare function applyFixes(input: string, errors: RuleOnErrorInfo[]): string; diff --git a/lib/markdownlint.js b/lib/markdownlint.mjs similarity index 97% rename from lib/markdownlint.js rename to lib/markdownlint.mjs index 685f0911b..9e2d505b5 100644 --- a/lib/markdownlint.js +++ b/lib/markdownlint.mjs @@ -1,19 +1,16 @@ // @ts-check -"use strict"; - -const path = require("node:path"); -const { promisify } = require("node:util"); -const micromark = require("../helpers/micromark-parse.cjs"); -const { version } = require("./constants"); -const rules = require("./rules"); -const helpers = require("../helpers"); -const cache = require("./cache"); - -// @ts-ignore -// eslint-disable-next-line camelcase, no-inline-comments, no-undef -const dynamicRequire = (typeof __non_webpack_require__ === "undefined") ? require : /* c8 ignore next */ __non_webpack_require__; -// Capture native require implementation for dynamic loading of modules +import * as nodeFs from "node:fs"; +import { createRequire } from "node:module"; +const dynamicRequire = createRequire(import.meta.url); +import * as os from "node:os"; +import path from "node:path"; +import { promisify } from "node:util"; +import { initialize as cacheInitialize } from "./cache.mjs"; +import { version } from "./constants.mjs"; +import rules from "./rules.mjs"; +import { parse as micromarkParse } from "../helpers/micromark-parse.mjs"; +import * as helpers from "../helpers/helpers.cjs"; /** * Validate the list of rules for structure and reuse. @@ -497,7 +494,7 @@ function lintContent( ); const customRulesPresent = (ruleList.length !== rules.length); // Parse content into parser tokens - const micromarkTokens = micromark.parse( + const micromarkTokens = micromarkParse( content, { "freezeTokens": customRulesPresent } ); @@ -507,7 +504,7 @@ function lintContent( // Parse content into lines and get markdown-it tokens const lines = content.split(helpers.newLineRe); const markdownitTokens = needMarkdownItTokens ? - require("./markdownit.cjs").getMarkdownItTokens(markdownItPlugins, preClearedContent, lines) : + dynamicRequire("./markdownit.cjs").getMarkdownItTokens(markdownItPlugins, preClearedContent, lines) : []; // Create (frozen) parameters for rules /** @type {MarkdownParsers} */ @@ -533,7 +530,7 @@ function lintContent( "lines": Object.freeze(lines), "frontMatterLines": Object.freeze(frontMatterLines) }; - cache.initialize({ + cacheInitialize({ ...paramsBase, "parsers": parsersMicromark, "config": null @@ -751,7 +748,7 @@ function lintContent( } catch (error) { callbackError(error); } finally { - cache.initialize(); + cacheInitialize(); } } @@ -866,7 +863,7 @@ function lintInput(options, synchronous, callback) { 3 : options.resultVersion; const markdownItPlugins = options.markdownItPlugins || []; - const fs = options.fs || require("node:fs"); + const fs = options.fs || nodeFs; const aliasToRuleNames = mapAliasToRuleNames(ruleList); const results = newResults(ruleList); let done = false; @@ -1068,7 +1065,7 @@ function extendConfig(config, file, parsers, fs, callback) { if (configExtends) { return resolveConfigExtends( file, - helpers.expandTildePath(configExtends, require("node:os")), + helpers.expandTildePath(configExtends, os), fs, // eslint-disable-next-line no-use-before-define (_, resolvedExtends) => readConfig( @@ -1132,10 +1129,10 @@ function readConfig(file, parsers, fs, callback) { } } if (!fs) { - fs = require("node:fs"); + fs = nodeFs; } // Read file - file = helpers.expandTildePath(file, require("node:os")); + file = helpers.expandTildePath(file, os); fs.readFile(file, "utf8", (err, content) => { if (err) { // @ts-ignore @@ -1180,10 +1177,9 @@ function readConfigPromise(file, parsers, fs) { */ function readConfigSync(file, parsers, fs) { if (!fs) { - fs = require("node:fs"); + fs = nodeFs; } // Read file - const os = require("node:os"); file = helpers.expandTildePath(file, os); const content = fs.readFileSync(file, "utf8"); // Try to parse file @@ -1248,7 +1244,7 @@ function applyFix(line, fixInfo, lineEnding = "\n") { * @returns {string} Fixed content. */ function applyFixes(input, errors) { - const lineEnding = helpers.getPreferredLineEnding(input, require("node:os")); + const lineEnding = helpers.getPreferredLineEnding(input, os); const lines = input.split(helpers.newLineRe); // Normalize fixInfo objects let fixInfos = errors @@ -1267,8 +1263,7 @@ function applyFixes(input, errors) { ); }); // Remove duplicate entries (needed for following collapse step) - // eslint-disable-next-line jsdoc/valid-types - /** @type RuleOnErrorFixInfo */ + /** @type {RuleOnErrorFixInfo} */ let lastFixInfo = {}; fixInfos = fixInfos.filter((fixInfo) => { const unique = ( @@ -1342,7 +1337,7 @@ markdownlint.promises = { }; markdownlint.applyFix = applyFix; markdownlint.applyFixes = applyFixes; -module.exports = markdownlint; +export default markdownlint; // Type declarations @@ -1414,7 +1409,7 @@ module.exports = markdownlint; * @property {string} line Line content. */ -/** @typedef {import("markdownlint-micromark").TokenType} MicromarkTokenType */ +/** @typedef {import("micromark-util-types").TokenType} MicromarkTokenType */ /** * micromark token. @@ -1567,14 +1562,14 @@ module.exports = markdownlint; * Configuration object for linting rules. For the JSON schema, see * {@link ../schema/markdownlint-config-schema.json}. * - * @typedef {import("./configuration").Configuration} Configuration + * @typedef {import("./configuration.d.ts").Configuration} Configuration */ /** * Configuration object for linting rules strictly. For the JSON schema, see * {@link ../schema/markdownlint-config-schema-strict.json}. * - * @typedef {import("./configuration-strict").ConfigurationStrict} ConfigurationStrict + * @typedef {import("./configuration-strict.d.ts").ConfigurationStrict} ConfigurationStrict */ /** diff --git a/lib/md001.js b/lib/md001.mjs similarity index 67% rename from lib/md001.js rename to lib/md001.mjs index 1befb179c..b36db6a62 100644 --- a/lib/md001.js +++ b/lib/md001.mjs @@ -1,14 +1,11 @@ // @ts-check -"use strict"; +import { addErrorDetailIf } from "../helpers/helpers.cjs"; +import { getHeadingLevel } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addErrorDetailIf } = require("../helpers"); -const { getHeadingLevel } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD001", "heading-increment" ], "description": "Heading levels should only increment by one level at a time", "tags": [ "headings" ], diff --git a/lib/md003.js b/lib/md003.mjs similarity index 81% rename from lib/md003.js rename to lib/md003.mjs index a4c21f6bb..6ed1d048b 100644 --- a/lib/md003.js +++ b/lib/md003.mjs @@ -1,14 +1,11 @@ // @ts-check -"use strict"; +import { addErrorDetailIf } from "../helpers/helpers.cjs"; +import { getHeadingLevel, getHeadingStyle } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addErrorDetailIf } = require("../helpers"); -const { getHeadingLevel, getHeadingStyle } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD003", "heading-style" ], "description": "Heading style", "tags": [ "headings" ], diff --git a/lib/md004.js b/lib/md004.mjs similarity index 87% rename from lib/md004.js rename to lib/md004.mjs index 79e06eb7d..1679736f3 100644 --- a/lib/md004.js +++ b/lib/md004.mjs @@ -1,10 +1,8 @@ // @ts-check -"use strict"; - -const { addErrorDetailIf } = require("../helpers"); -const { getDescendantsByType, getParentOfType } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +import { addErrorDetailIf } from "../helpers/helpers.cjs"; +import { getDescendantsByType, getParentOfType } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; const markerToStyle = { "-": "dash", @@ -29,9 +27,8 @@ const validStyles = new Set([ "sublist" ]); -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD004", "ul-style" ], "description": "Unordered list style", "tags": [ "bullet", "ul" ], diff --git a/lib/md005.js b/lib/md005.mjs similarity index 90% rename from lib/md005.js rename to lib/md005.mjs index e439ba3aa..0c79e2a9f 100644 --- a/lib/md005.js +++ b/lib/md005.mjs @@ -1,13 +1,10 @@ // @ts-check -"use strict"; +import { addError, addErrorDetailIf } from "../helpers/helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addError, addErrorDetailIf } = require("../helpers"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD005", "list-indent" ], "description": "Inconsistent indentation for list items at the same level", "tags": [ "bullet", "ul", "indentation" ], diff --git a/lib/md007.js b/lib/md007.mjs similarity index 83% rename from lib/md007.js rename to lib/md007.mjs index 8d9078562..37ec553b9 100644 --- a/lib/md007.js +++ b/lib/md007.mjs @@ -1,23 +1,18 @@ // @ts-check -"use strict"; +import { addErrorDetailIf } from "../helpers/helpers.cjs"; +import { getParentOfType } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addErrorDetailIf } = require("../helpers"); -const { getParentOfType } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("markdownlint-micromark").TokenType[] */ +/** @type {import("micromark-util-types").TokenType[]} */ const unorderedListTypes = [ "blockQuotePrefix", "listItemPrefix", "listUnordered" ]; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("markdownlint-micromark").TokenType[] */ +/** @type {import("micromark-util-types").TokenType[]} */ const unorderedParentTypes = [ "blockQuote", "listOrdered", "listUnordered" ]; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD007", "ul-indent" ], "description": "Unordered list indentation", "tags": [ "bullet", "ul", "indentation" ], diff --git a/lib/md009.js b/lib/md009.mjs similarity index 91% rename from lib/md009.js rename to lib/md009.mjs index f51f31392..f9de27178 100644 --- a/lib/md009.js +++ b/lib/md009.mjs @@ -1,14 +1,11 @@ // @ts-check -"use strict"; +import { addError } from "../helpers/helpers.cjs"; +import { addRangeToSet } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addError } = require("../helpers"); -const { addRangeToSet } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD009", "no-trailing-spaces" ], "description": "Trailing spaces", "tags": [ "whitespace" ], diff --git a/lib/md010.js b/lib/md010.mjs similarity index 84% rename from lib/md010.js rename to lib/md010.mjs index 61e1aa46d..2f6858c10 100644 --- a/lib/md010.js +++ b/lib/md010.mjs @@ -1,16 +1,13 @@ // @ts-check -"use strict"; - -const { addError, hasOverlap } = require("../helpers"); -const { getDescendantsByType } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +import { addError, hasOverlap } from "../helpers/helpers.cjs"; +import { getDescendantsByType } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; const tabRe = /\t+/g; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD010", "no-hard-tabs" ], "description": "Hard tabs", "tags": [ "whitespace", "hard_tab" ], @@ -26,8 +23,7 @@ module.exports = { const spaceMultiplier = (spacesPerTab === undefined) ? 1 : Math.max(0, Number(spacesPerTab)); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../helpers/micromark-helpers.cjs").TokenType[] */ + /** @type {import("../helpers/micromark-helpers.cjs").TokenType[]} */ const exclusionTypes = []; if (includeCode) { if (ignoreCodeLanguages.size > 0) { @@ -60,7 +56,7 @@ module.exports = { const lineNumber = lineIndex + 1; const column = match.index + 1; const length = match[0].length; - /** @type {import("../helpers").FileRange} */ + /** @type {import("../helpers/helpers.cjs").FileRange} */ const range = { "startLine": lineNumber, "startColumn": column, "endLine": lineNumber, "endColumn": column + length - 1 }; if (!codeRanges.some((codeRange) => hasOverlap(codeRange, range))) { addError( diff --git a/lib/md011.js b/lib/md011.mjs similarity index 79% rename from lib/md011.js rename to lib/md011.mjs index 126c56a5a..f13e60bc3 100644 --- a/lib/md011.js +++ b/lib/md011.mjs @@ -1,17 +1,13 @@ // @ts-check -"use strict"; +import { addError, hasOverlap } from "../helpers/helpers.cjs"; +import { addRangeToSet } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addError, hasOverlap } = require("../helpers"); -const { addRangeToSet } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +const reversedLinkRe = /(^|[^\\])\(([^()]+)\)\[([^\]^][^\]]*)\](?!\()/g; -const reversedLinkRe = - /(^|[^\\])\(([^()]+)\)\[([^\]^][^\]]*)\](?!\()/g; - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD011", "no-reversed-links" ], "description": "Reversed link syntax", "tags": [ "links" ], @@ -34,7 +30,7 @@ module.exports = { ) { const column = match.index + preChar.length + 1; const length = match[0].length - preChar.length; - /** @type {import("../helpers").FileRange} */ + /** @type {import("../helpers/helpers.cjs").FileRange} */ const range = { "startLine": lineNumber, "startColumn": column, "endLine": lineNumber, "endColumn": column + length - 1 }; if (!codeTexts.some((codeText) => hasOverlap(codeText, range))) { addError( diff --git a/lib/md012.js b/lib/md012.mjs similarity index 77% rename from lib/md012.js rename to lib/md012.mjs index 817263618..1d48a47a0 100644 --- a/lib/md012.js +++ b/lib/md012.mjs @@ -1,14 +1,11 @@ // @ts-check -"use strict"; +import { addErrorDetailIf } from "../helpers/helpers.cjs"; +import { addRangeToSet } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addErrorDetailIf } = require("../helpers"); -const { addRangeToSet } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD012", "no-multiple-blanks" ], "description": "Multiple consecutive blank lines", "tags": [ "whitespace", "blank_lines" ], diff --git a/lib/md013.js b/lib/md013.mjs similarity index 90% rename from lib/md013.js rename to lib/md013.mjs index 67cac7566..a2333a06e 100644 --- a/lib/md013.js +++ b/lib/md013.mjs @@ -1,20 +1,19 @@ // @ts-check -"use strict"; - -const { addErrorDetailIf } = require("../helpers"); -const { getReferenceLinkImageData } = require("./cache"); -const { addRangeToSet, getDescendantsByType } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +import { addErrorDetailIf } from "../helpers/helpers.cjs"; +import { filterByTypesCached, getReferenceLinkImageData } from "./cache.mjs"; +import { addRangeToSet, getDescendantsByType } from "../helpers/micromark-helpers.cjs"; const longLineRePrefix = "^.{"; const longLineRePostfixRelaxed = "}.*\\s.*$"; const longLineRePostfixStrict = "}.+$"; const sternModeRe = /^(?:[#>\s]*\s)?\S*$/; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @typedef {import("micromark-extension-gfm-autolink-literal")} */ +/** @typedef {import("micromark-extension-gfm-table")} */ + +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD013", "line-length" ], "description": "Line length", "tags": [ "line_length" ], diff --git a/lib/md014.js b/lib/md014.mjs similarity index 86% rename from lib/md014.js rename to lib/md014.mjs index 532ecd72a..9d42e5f60 100644 --- a/lib/md014.js +++ b/lib/md014.mjs @@ -1,15 +1,12 @@ // @ts-check -"use strict"; - -const { addErrorContext } = require("../helpers"); -const { filterByTypesCached } = require("./cache"); +import { addErrorContext } from "../helpers/helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; const dollarCommandRe = /^(\s*)(\$\s+)/; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD014", "commands-show-output" ], "description": "Dollar signs used before commands without showing output", "tags": [ "code" ], diff --git a/lib/md018.js b/lib/md018.mjs similarity index 78% rename from lib/md018.js rename to lib/md018.mjs index 271eceb83..5e9fbf94d 100644 --- a/lib/md018.js +++ b/lib/md018.mjs @@ -1,14 +1,11 @@ // @ts-check -"use strict"; +import { addErrorContext } from "../helpers/helpers.cjs"; +import { addRangeToSet } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addErrorContext } = require("../helpers"); -const { addRangeToSet } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD018", "no-missing-space-atx" ], "description": "No space after hash on atx style heading", "tags": [ "headings", "atx", "spaces" ], diff --git a/lib/md019-md021.js b/lib/md019-md021.mjs similarity index 81% rename from lib/md019-md021.js rename to lib/md019-md021.mjs index 4811936f4..954a45a16 100644 --- a/lib/md019-md021.js +++ b/lib/md019-md021.mjs @@ -1,16 +1,14 @@ // @ts-check -"use strict"; - -const { addErrorContext } = require("../helpers/helpers"); -const { getHeadingStyle } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +import { addErrorContext } from "../helpers/helpers.cjs"; +import { getHeadingStyle } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; /** * Validate heading sequence and whitespace length at start or end. * - * @param {import("./markdownlint").RuleOnError} onError Error-reporting callback. - * @param {import("./markdownlint").MicromarkToken} heading ATX heading token. + * @param {import("./markdownlint.mjs").RuleOnError} onError Error-reporting callback. + * @param {import("./markdownlint.mjs").MicromarkToken} heading ATX heading token. * @param {number} delta Direction to scan. * @returns {void} */ @@ -47,9 +45,8 @@ function validateHeadingSpaces(onError, heading, delta) { } } -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule[] */ -module.exports = [ +/** @type {import("./markdownlint.mjs").Rule[]} */ +export default [ { "names": [ "MD019", "no-multiple-space-atx" ], "description": "Multiple spaces after hash on atx style heading", diff --git a/lib/md020.js b/lib/md020.mjs similarity index 87% rename from lib/md020.js rename to lib/md020.mjs index 5bd2a099b..37584c3cf 100644 --- a/lib/md020.js +++ b/lib/md020.mjs @@ -1,14 +1,11 @@ // @ts-check -"use strict"; +import { addErrorContext } from "../helpers/helpers.cjs"; +import { addRangeToSet } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addErrorContext } = require("../helpers"); -const { addRangeToSet } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD020", "no-missing-space-closed-atx" ], "description": "No space inside hashes on closed atx style heading", "tags": [ "headings", "atx_closed", "spaces" ], diff --git a/lib/md022.js b/lib/md022.mjs similarity index 88% rename from lib/md022.js rename to lib/md022.mjs index dbe2e0205..f1ae5b8ce 100644 --- a/lib/md022.js +++ b/lib/md022.mjs @@ -1,10 +1,8 @@ // @ts-check -"use strict"; - -const { addErrorDetailIf, isBlankLine } = require("../helpers"); -const { getBlockQuotePrefixText, getHeadingLevel } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +import { addErrorDetailIf, isBlankLine } from "../helpers/helpers.cjs"; +import { getBlockQuotePrefixText, getHeadingLevel } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; const defaultLines = 1; @@ -21,9 +19,8 @@ const getLinesFunction = (linesParam) => { return () => lines; }; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD022", "blanks-around-headings" ], "description": "Headings should be surrounded by blank lines", "tags": [ "headings", "blank_lines" ], diff --git a/lib/md023.js b/lib/md023.mjs similarity index 81% rename from lib/md023.js rename to lib/md023.mjs index f00dacf55..c251ccdf3 100644 --- a/lib/md023.js +++ b/lib/md023.mjs @@ -1,13 +1,10 @@ // @ts-check -"use strict"; +import { addErrorContext } from "../helpers/helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addErrorContext } = require("../helpers"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD023", "heading-start-left" ], "description": "Headings must start at the beginning of the line", "tags": [ "headings", "spaces" ], diff --git a/lib/md024.js b/lib/md024.mjs similarity index 78% rename from lib/md024.js rename to lib/md024.mjs index e43b326dc..2ecaefe89 100644 --- a/lib/md024.js +++ b/lib/md024.mjs @@ -1,14 +1,11 @@ // @ts-check -"use strict"; +import { addErrorContext } from "../helpers/helpers.cjs"; +import { getHeadingLevel, getHeadingText } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addErrorContext } = require("../helpers"); -const { getHeadingLevel, getHeadingText } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD024", "no-duplicate-heading" ], "description": "Multiple headings with the same content", "tags": [ "headings" ], diff --git a/lib/md025.js b/lib/md025.mjs similarity index 74% rename from lib/md025.js rename to lib/md025.mjs index d7350be55..70ed09b60 100644 --- a/lib/md025.js +++ b/lib/md025.mjs @@ -1,14 +1,11 @@ // @ts-check -"use strict"; +import { addErrorContext, frontMatterHasTitle } from "../helpers/helpers.cjs"; +import { getHeadingLevel, getHeadingText } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addErrorContext, frontMatterHasTitle } = require("../helpers"); -const { getHeadingLevel, getHeadingText } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD025", "single-title", "single-h1" ], "description": "Multiple top-level headings in the same document", "tags": [ "headings" ], diff --git a/lib/md026.js b/lib/md026.mjs similarity index 79% rename from lib/md026.js rename to lib/md026.mjs index 1ab4b6b02..bde45188b 100644 --- a/lib/md026.js +++ b/lib/md026.mjs @@ -1,14 +1,11 @@ // @ts-check -"use strict"; +import { addError, allPunctuationNoQuestion, endOfLineGemojiCodeRe, + endOfLineHtmlEntityRe, escapeForRegExp } from "../helpers/helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addError, allPunctuationNoQuestion, endOfLineGemojiCodeRe, - endOfLineHtmlEntityRe, escapeForRegExp } = require("../helpers"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD026", "no-trailing-punctuation" ], "description": "Trailing punctuation in heading", "tags": [ "headings" ], diff --git a/lib/md027.js b/lib/md027.mjs similarity index 82% rename from lib/md027.js rename to lib/md027.mjs index 6c19b1a20..df39c0c2a 100644 --- a/lib/md027.js +++ b/lib/md027.mjs @@ -1,13 +1,10 @@ // @ts-check -"use strict"; +import { addErrorContext } from "../helpers/helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addErrorContext } = require("../helpers"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD027", "no-multiple-space-blockquote" ], "description": "Multiple spaces after blockquote symbol", "tags": [ "blockquote", "whitespace", "indentation" ], diff --git a/lib/md028.js b/lib/md028.mjs similarity index 84% rename from lib/md028.js rename to lib/md028.mjs index 8ca3c2a23..b81b368f0 100644 --- a/lib/md028.js +++ b/lib/md028.mjs @@ -1,15 +1,12 @@ // @ts-check -"use strict"; - -const { addError } = require("../helpers"); -const { filterByTypesCached } = require("./cache"); +import { addError } from "../helpers/helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; const ignoreTypes = new Set([ "lineEnding", "listItemIndent", "linePrefix" ]); -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD028", "no-blanks-blockquote" ], "description": "Blank line inside blockquote", "tags": [ "blockquote", "whitespace" ], diff --git a/lib/md029.js b/lib/md029.mjs similarity index 87% rename from lib/md029.js rename to lib/md029.mjs index 5cf34c1f3..39fda4abc 100644 --- a/lib/md029.js +++ b/lib/md029.mjs @@ -1,10 +1,8 @@ // @ts-check -"use strict"; - -const { addErrorDetailIf } = require("../helpers"); -const { getDescendantsByType } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +import { addErrorDetailIf } from "../helpers/helpers.cjs"; +import { getDescendantsByType } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; const listStyleExamples = { "one": "1/1/1", @@ -22,9 +20,8 @@ function getOrderedListItemValue(listItemPrefix) { return Number(getDescendantsByType(listItemPrefix, [ "listItemValue" ])[0].text); } -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD029", "ol-prefix" ], "description": "Ordered list item prefix", "tags": [ "ol" ], diff --git a/lib/md030.js b/lib/md030.mjs similarity index 89% rename from lib/md030.js rename to lib/md030.mjs index 7defdd90f..82f0b9745 100644 --- a/lib/md030.js +++ b/lib/md030.mjs @@ -1,13 +1,10 @@ // @ts-check -"use strict"; +import { addErrorDetailIf } from "../helpers/helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addErrorDetailIf } = require("../helpers"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD030", "list-marker-space" ], "description": "Spaces after list markers", "tags": [ "ol", "ul", "whitespace" ], diff --git a/lib/md031.js b/lib/md031.mjs similarity index 80% rename from lib/md031.js rename to lib/md031.mjs index fff6031b7..a741fd5af 100644 --- a/lib/md031.js +++ b/lib/md031.mjs @@ -1,10 +1,8 @@ // @ts-check -"use strict"; - -const { addErrorContext, isBlankLine } = require("../helpers"); -const { getParentOfType } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +import { addErrorContext, isBlankLine } from "../helpers/helpers.cjs"; +import { getParentOfType } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; const codeFencePrefixRe = /^(.*?)[`~]/; @@ -14,7 +12,7 @@ const codeFencePrefixRe = /^(.*?)[`~]/; /** * Adds an error for the top or bottom of a code fence. * - * @param {import("./markdownlint").RuleOnError} onError Error-reporting callback. + * @param {import("./markdownlint.mjs").RuleOnError} onError Error-reporting callback. * @param {ReadonlyStringArray} lines Lines of Markdown content. * @param {number} lineNumber Line number. * @param {boolean} top True iff top fence. @@ -24,7 +22,7 @@ function addError(onError, lines, lineNumber, top) { const line = lines[lineNumber - 1]; const [ , prefix ] = line.match(codeFencePrefixRe) || []; const fixInfo = (prefix === undefined) ? - null : + undefined : { "lineNumber": lineNumber + (top ? 0 : 1), "insertText": `${prefix.replace(/[^>]/g, " ").trim()}\n` @@ -40,9 +38,8 @@ function addError(onError, lines, lineNumber, top) { ); } -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD031", "blanks-around-fences" ], "description": "Fenced code blocks should be surrounded by blank lines", "tags": [ "code", "blank_lines" ], diff --git a/lib/md032.js b/lib/md032.mjs similarity index 85% rename from lib/md032.js rename to lib/md032.mjs index a1d6b32c9..5337cca72 100644 --- a/lib/md032.js +++ b/lib/md032.mjs @@ -1,18 +1,15 @@ // @ts-check -"use strict"; - -const { addErrorContext, isBlankLine } = require("../helpers"); -const { filterByPredicate, getBlockQuotePrefixText, nonContentTokens } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +import { addErrorContext, isBlankLine } from "../helpers/helpers.cjs"; +import { filterByPredicate, getBlockQuotePrefixText, nonContentTokens } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; const isList = (token) => ( (token.type === "listOrdered") || (token.type === "listUnordered") ); -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD032", "blanks-around-lists" ], "description": "Lists should be surrounded by blank lines", "tags": [ "bullet", "ul", "ol", "blank_lines" ], diff --git a/lib/md033.js b/lib/md033.mjs similarity index 75% rename from lib/md033.js rename to lib/md033.mjs index e0906b404..dd76308cf 100644 --- a/lib/md033.js +++ b/lib/md033.mjs @@ -1,14 +1,11 @@ // @ts-check -"use strict"; +import { addError, nextLinesRe } from "../helpers/helpers.cjs"; +import { getHtmlTagInfo } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addError, nextLinesRe } = require("../helpers"); -const { getHtmlTagInfo } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD033", "no-inline-html" ], "description": "Inline HTML", "tags": [ "html" ], diff --git a/lib/md034.js b/lib/md034.mjs similarity index 89% rename from lib/md034.js rename to lib/md034.mjs index c8a5dc7f4..4215e2b93 100644 --- a/lib/md034.js +++ b/lib/md034.mjs @@ -1,13 +1,12 @@ // @ts-check -"use strict"; +import { addErrorContext } from "../helpers/helpers.cjs"; +import { filterByPredicate, getHtmlTagInfo, inHtmlFlow } from "../helpers/micromark-helpers.cjs"; -const { addErrorContext } = require("../helpers"); -const { filterByPredicate, getHtmlTagInfo, inHtmlFlow } = require("../helpers/micromark-helpers.cjs"); +/** @typedef {import("micromark-extension-gfm-autolink-literal")} */ -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD034", "no-bare-urls" ], "description": "Bare URL used", "tags": [ "links", "url" ], diff --git a/lib/md035.js b/lib/md035.mjs similarity index 70% rename from lib/md035.js rename to lib/md035.mjs index 23192212a..81fde3d46 100644 --- a/lib/md035.js +++ b/lib/md035.mjs @@ -1,13 +1,10 @@ // @ts-check -"use strict"; +import { addErrorDetailIf } from "../helpers/helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addErrorDetailIf } = require("../helpers"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD035", "hr-style" ], "description": "Horizontal rule style", "tags": [ "hr" ], diff --git a/lib/md036.js b/lib/md036.mjs similarity index 80% rename from lib/md036.js rename to lib/md036.mjs index 95f83e270..1dd4a86f7 100644 --- a/lib/md036.js +++ b/lib/md036.mjs @@ -1,10 +1,8 @@ // @ts-check -"use strict"; - -const { addErrorContext, allPunctuation } = require("../helpers"); -const { getDescendantsByType } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +import { addErrorContext, allPunctuation } from "../helpers/helpers.cjs"; +import { getDescendantsByType } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; /** @typedef {import("../helpers/micromark-helpers.cjs").TokenType} TokenType */ /** @type {TokenType[][]} */ @@ -13,9 +11,8 @@ const emphasisTypes = [ [ "strong", "strongText" ] ]; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD036", "no-emphasis-as-heading" ], "description": "Emphasis used instead of a heading", "tags": [ "headings", "emphasis" ], diff --git a/lib/md037.js b/lib/md037.mjs similarity index 92% rename from lib/md037.js rename to lib/md037.mjs index 3dfe667ad..09befcaa0 100644 --- a/lib/md037.js +++ b/lib/md037.mjs @@ -1,13 +1,10 @@ // @ts-check -"use strict"; +import { addError } from "../helpers/helpers.cjs"; +import { filterByPredicate, inHtmlFlow } from "../helpers/micromark-helpers.cjs"; -const { addError } = require("../helpers"); -const { filterByPredicate, inHtmlFlow } = require("../helpers/micromark-helpers.cjs"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD037", "no-space-in-emphasis" ], "description": "Spaces inside emphasis markers", "tags": [ "whitespace", "emphasis" ], diff --git a/lib/md038.js b/lib/md038.mjs similarity index 91% rename from lib/md038.js rename to lib/md038.mjs index 404d1f14d..1664cd277 100644 --- a/lib/md038.js +++ b/lib/md038.mjs @@ -1,10 +1,8 @@ // @ts-check -"use strict"; - -const { addErrorContext } = require("../helpers"); -const { getDescendantsByType } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +import { addErrorContext } from "../helpers/helpers.cjs"; +import { getDescendantsByType } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; const leftSpaceRe = /^\s(?:[^`]|$)/; const rightSpaceRe = /[^`]\s$/; @@ -19,9 +17,8 @@ const trimCodeText = (text, start, end) => { return text; }; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD038", "no-space-in-code" ], "description": "Spaces inside code span elements", "tags": [ "whitespace", "code" ], diff --git a/lib/md039.js b/lib/md039.mjs similarity index 88% rename from lib/md039.js rename to lib/md039.mjs index 56c3aedc4..26dd28865 100644 --- a/lib/md039.js +++ b/lib/md039.mjs @@ -1,14 +1,12 @@ // @ts-check -"use strict"; - -const { addErrorContext } = require("../helpers"); -const { getReferenceLinkImageData, filterByTypesCached } = require("./cache"); +import { addErrorContext } from "../helpers/helpers.cjs"; +import { getReferenceLinkImageData, filterByTypesCached } from "./cache.mjs"; /** * Adds an error for a label space issue. * - * @param {import("./markdownlint").RuleOnError} onError Error-reporting callback. + * @param {import("./markdownlint.mjs").RuleOnError} onError Error-reporting callback. * @param {import("../helpers/micromark-helpers.cjs").Token} label Label token. * @param {import("../helpers/micromark-helpers.cjs").Token} labelText LabelText token. * @param {boolean} isStart True iff error is at the start of the link. @@ -49,9 +47,8 @@ function validLink(label, labelText, definitions) { return (label.parent?.children.length !== 1) || definitions.has(labelText.text.trim()); } -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD039", "no-space-in-links" ], "description": "Spaces inside link text", "tags": [ "whitespace", "links" ], diff --git a/lib/md040.js b/lib/md040.mjs similarity index 78% rename from lib/md040.js rename to lib/md040.mjs index 69ae47e16..3bc1dfbdc 100644 --- a/lib/md040.js +++ b/lib/md040.mjs @@ -1,14 +1,11 @@ // @ts-check -"use strict"; +import { addError, addErrorContext } from "../helpers/helpers.cjs"; +import { getDescendantsByType } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addError, addErrorContext } = require("../helpers"); -const { getDescendantsByType } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD040", "fenced-code-language" ], "description": "Fenced code blocks should have a language specified", "tags": [ "code", "language" ], diff --git a/lib/md041.js b/lib/md041.mjs similarity index 78% rename from lib/md041.js rename to lib/md041.mjs index d44223a3e..35764c94e 100644 --- a/lib/md041.js +++ b/lib/md041.mjs @@ -1,14 +1,10 @@ // @ts-check -"use strict"; +import { addErrorContext, frontMatterHasTitle } from "../helpers/helpers.cjs"; +import { filterByTypes, getHeadingLevel, getHtmlTagInfo, isHtmlFlowComment, nonContentTokens } from "../helpers/micromark-helpers.cjs"; -const { addErrorContext, frontMatterHasTitle } = require("../helpers"); -const { filterByTypes, getHeadingLevel, getHtmlTagInfo, isHtmlFlowComment, nonContentTokens } = - require("../helpers/micromark-helpers.cjs"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD041", "first-line-heading", "first-line-h1" ], "description": "First line in a file should be a top-level heading", "tags": [ "headings" ], diff --git a/lib/md042.js b/lib/md042.mjs similarity index 86% rename from lib/md042.js rename to lib/md042.mjs index efc65d1c3..6e005fb00 100644 --- a/lib/md042.js +++ b/lib/md042.mjs @@ -1,14 +1,11 @@ // @ts-check -"use strict"; +import { addErrorContext } from "../helpers/helpers.cjs"; +import { getDescendantsByType } from "../helpers/micromark-helpers.cjs"; +import { getReferenceLinkImageData, filterByTypesCached } from "./cache.mjs"; -const { addErrorContext } = require("../helpers"); -const { getDescendantsByType } = require("../helpers/micromark-helpers.cjs"); -const { getReferenceLinkImageData, filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD042", "no-empty-links" ], "description": "No empty links", "tags": [ "links" ], diff --git a/lib/md043.js b/lib/md043.mjs similarity index 85% rename from lib/md043.js rename to lib/md043.mjs index eafe9f0bc..e7c8036c6 100644 --- a/lib/md043.js +++ b/lib/md043.mjs @@ -1,14 +1,11 @@ // @ts-check -"use strict"; +import { addErrorContext, addErrorDetailIf } from "../helpers/helpers.cjs"; +import { getHeadingLevel, getHeadingText } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addErrorContext, addErrorDetailIf } = require("../helpers"); -const { getHeadingLevel, getHeadingText } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD043", "required-headings" ], "description": "Required heading structure", "tags": [ "headings" ], diff --git a/lib/md044.js b/lib/md044.mjs similarity index 87% rename from lib/md044.js rename to lib/md044.mjs index 320731d25..19001a249 100644 --- a/lib/md044.js +++ b/lib/md044.mjs @@ -1,18 +1,15 @@ // @ts-check -"use strict"; - -const { addErrorDetailIf, escapeForRegExp, hasOverlap } = require("../helpers"); -const { filterByPredicate, filterByTypes } = require("../helpers/micromark-helpers.cjs"); -const { parse } = require("../helpers/micromark-parse.cjs"); +import { addErrorDetailIf, escapeForRegExp, hasOverlap } from "../helpers/helpers.cjs"; +import { filterByPredicate, filterByTypes } from "../helpers/micromark-helpers.cjs"; +import { parse } from "../helpers/micromark-parse.mjs"; const ignoredChildTypes = new Set( [ "codeFencedFence", "definition", "reference", "resource" ] ); -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD044", "proper-names" ], "description": "Proper names should have the correct capitalization", "tags": [ "spelling" ], @@ -48,7 +45,7 @@ module.exports = { token.children.filter((t) => !ignoredChildTypes.has(t.type)) ) ); - /** @type {import("../helpers").FileRange[]} */ + /** @type {import("../helpers/helpers.cjs").FileRange[]} */ const exclusions = []; const scannedTokens = new Set(); for (const name of names) { @@ -64,7 +61,7 @@ module.exports = { const column = token.startColumn + match.index + leftMatch.length; const length = nameMatch.length; const lineNumber = token.startLine; - /** @type {import("../helpers").FileRange} */ + /** @type {import("../helpers/helpers.cjs").FileRange} */ const nameRange = { "startLine": lineNumber, "startColumn": column, @@ -75,7 +72,7 @@ module.exports = { !names.includes(nameMatch) && !exclusions.some((exclusion) => hasOverlap(exclusion, nameRange)) ) { - /** @type {import("../helpers").FileRange[]} */ + /** @type {import("../helpers/helpers.cjs").FileRange[]} */ let autolinkRanges = []; if (!scannedTokens.has(token)) { autolinkRanges = filterByTypes(parse(token.text), [ "literalAutolink" ]) diff --git a/lib/md045.js b/lib/md045.mjs similarity index 81% rename from lib/md045.js rename to lib/md045.mjs index 5d1abcb44..a54ca6957 100644 --- a/lib/md045.js +++ b/lib/md045.mjs @@ -1,16 +1,13 @@ // @ts-check -"use strict"; - -const { addError, getHtmlAttributeRe, nextLinesRe } = require("../helpers"); -const { getHtmlTagInfo, getDescendantsByType } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +import { addError, getHtmlAttributeRe, nextLinesRe } from "../helpers/helpers.cjs"; +import { getHtmlTagInfo, getDescendantsByType } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; const altRe = getHtmlAttributeRe("alt"); -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD045", "no-alt-text" ], "description": "Images should have alternate text (alt text)", "tags": [ "accessibility", "images" ], diff --git a/lib/md046.js b/lib/md046.mjs similarity index 75% rename from lib/md046.js rename to lib/md046.mjs index 4b6cb8a7d..264a02737 100644 --- a/lib/md046.js +++ b/lib/md046.mjs @@ -1,18 +1,15 @@ // @ts-check -"use strict"; - -const { addErrorDetailIf } = require("../helpers"); -const { filterByTypesCached } = require("./cache"); +import { addErrorDetailIf } from "../helpers/helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; const tokenTypeToStyle = { "codeFenced": "fenced", "codeIndented": "indented" }; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD046", "code-block-style" ], "description": "Code block style", "tags": [ "code" ], diff --git a/lib/md047.js b/lib/md047.mjs similarity index 77% rename from lib/md047.js rename to lib/md047.mjs index 85288821d..f1272ff17 100644 --- a/lib/md047.js +++ b/lib/md047.mjs @@ -1,12 +1,9 @@ // @ts-check -"use strict"; +import { addError, isBlankLine } from "../helpers/helpers.cjs"; -const { addError, isBlankLine } = require("../helpers"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD047", "single-trailing-newline" ], "description": "Files should end with a single newline character", "tags": [ "blank_lines" ], diff --git a/lib/md048.js b/lib/md048.mjs similarity index 79% rename from lib/md048.js rename to lib/md048.mjs index 5b46833dd..f70e437da 100644 --- a/lib/md048.js +++ b/lib/md048.mjs @@ -1,10 +1,8 @@ // @ts-check -"use strict"; - -const { addErrorDetailIf } = require("../helpers"); -const { getDescendantsByType } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +import { addErrorDetailIf } from "../helpers/helpers.cjs"; +import { getDescendantsByType } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; /** * Return the string representation of a fence markup character. @@ -21,9 +19,8 @@ function fencedCodeBlockStyleFor(markup) { } }; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD048", "code-fence-style" ], "description": "Code fence style", "tags": [ "code" ], diff --git a/lib/md049-md050.js b/lib/md049-md050.mjs similarity index 84% rename from lib/md049-md050.js rename to lib/md049-md050.mjs index a117b077c..f641cb896 100644 --- a/lib/md049-md050.js +++ b/lib/md049-md050.mjs @@ -1,9 +1,7 @@ // @ts-check -"use strict"; - -const { addError } = require("../helpers"); -const { filterByPredicate, getDescendantsByType } = require("../helpers/micromark-helpers.cjs"); +import { addError } from "../helpers/helpers.cjs"; +import { filterByPredicate, getDescendantsByType } from "../helpers/micromark-helpers.cjs"; const intrawordRe = /^\w$/; @@ -23,10 +21,10 @@ function emphasisOrStrongStyleFor(markup) { }; /** - * @param {import("./markdownlint").RuleParams} params Rule parameters. - * @param {import("./markdownlint").RuleOnError} onError Error-reporting callback. - * @param {import("markdownlint-micromark").TokenType} type Token type. - * @param {import("markdownlint-micromark").TokenType} typeSequence Token sequence type. + * @param {import("./markdownlint.mjs").RuleParams} params Rule parameters. + * @param {import("./markdownlint.mjs").RuleOnError} onError Error-reporting callback. + * @param {import("micromark-util-types").TokenType} type Token type. + * @param {import("micromark-util-types").TokenType} typeSequence Token sequence type. * @param {"*" | "**"} asterisk Asterisk kind. * @param {"_" | "__"} underline Underline kind. * @param {"asterisk" | "consistent" | "underscore"} style Style string. @@ -78,9 +76,8 @@ const impl = } }; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule[] */ -module.exports = [ +/** @type {import("./markdownlint.mjs").Rule[]} */ +export default [ { "names": [ "MD049", "emphasis-style" ], "description": "Emphasis style", diff --git a/lib/md051.js b/lib/md051.mjs similarity index 92% rename from lib/md051.js rename to lib/md051.mjs index e3eef0d80..51a40c7f7 100644 --- a/lib/md051.js +++ b/lib/md051.mjs @@ -1,10 +1,8 @@ // @ts-check -"use strict"; - -const { addError, getHtmlAttributeRe } = require("../helpers"); -const { filterByPredicate, filterByTypes, getHtmlTagInfo } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +import { addError, getHtmlAttributeRe } from "../helpers/helpers.cjs"; +import { filterByPredicate, filterByTypes, getHtmlTagInfo } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; // Regular expression for identifying HTML anchor names const idRe = getHtmlAttributeRe("id"); @@ -60,9 +58,8 @@ function unescapeStringTokenText(token) { .join(""); } -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD051", "link-fragments" ], "description": "Link fragments should be valid", "tags": [ "links" ], @@ -104,8 +101,7 @@ module.exports = { } // Process link and definition fragments - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../helpers/micromark-helpers.cjs").TokenType[][] */ + /** @type {import("../helpers/micromark-helpers.cjs").TokenType[][]} */ const parentChilds = [ [ "link", "resourceDestinationString" ], [ "definition", "definitionDestinationString" ] diff --git a/lib/md052.js b/lib/md052.mjs similarity index 84% rename from lib/md052.js rename to lib/md052.mjs index 26ed5383f..883ea256c 100644 --- a/lib/md052.js +++ b/lib/md052.mjs @@ -1,13 +1,10 @@ // @ts-check -"use strict"; +import { addError } from "../helpers/helpers.cjs"; +import { getReferenceLinkImageData } from "./cache.mjs"; -const { addError } = require("../helpers"); -const { getReferenceLinkImageData } = require("./cache"); - -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD052", "reference-links-images" ], "description": "Reference links and images should use a label that is defined", diff --git a/lib/md053.js b/lib/md053.mjs similarity index 88% rename from lib/md053.js rename to lib/md053.mjs index 67de4316a..fc724b73e 100644 --- a/lib/md053.js +++ b/lib/md053.mjs @@ -1,15 +1,12 @@ // @ts-check -"use strict"; - -const { addError, ellipsify } = require("../helpers"); -const { getReferenceLinkImageData } = require("./cache"); +import { addError, ellipsify } from "../helpers/helpers.cjs"; +import { getReferenceLinkImageData } from "./cache.mjs"; const linkReferenceDefinitionRe = /^ {0,3}\[([^\]]*[^\\])\]:/; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD053", "link-image-reference-definitions" ], "description": "Link and image reference definitions should be needed", "tags": [ "images", "links" ], diff --git a/lib/md054.js b/lib/md054.mjs similarity index 92% rename from lib/md054.js rename to lib/md054.mjs index 21c147d68..ec509a476 100644 --- a/lib/md054.js +++ b/lib/md054.mjs @@ -1,10 +1,8 @@ // @ts-check -"use strict"; - -const { addErrorContext, nextLinesRe } = require("../helpers"); -const { getDescendantsByType } = require("../helpers/micromark-helpers.cjs"); -const { getReferenceLinkImageData, filterByTypesCached } = require("./cache"); +import { addErrorContext, nextLinesRe } from "../helpers/helpers.cjs"; +import { getDescendantsByType } from "../helpers/micromark-helpers.cjs"; +import { getReferenceLinkImageData, filterByTypesCached } from "./cache.mjs"; const backslashEscapeRe = /\\([!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])/g; const removeBackslashEscapes = (text) => text.replace(backslashEscapeRe, "$1"); @@ -20,9 +18,8 @@ const autolinkAble = (destination) => { return !autolinkDisallowedRe.test(destination); }; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD054", "link-image-style" ], "description": "Link and image style", "tags": [ "images", "links" ], diff --git a/lib/md055.js b/lib/md055.mjs similarity index 91% rename from lib/md055.js rename to lib/md055.mjs index a4d0f1ee9..10b1f281f 100644 --- a/lib/md055.js +++ b/lib/md055.mjs @@ -1,9 +1,7 @@ // @ts-check -"use strict"; - -const { addErrorDetailIf } = require("../helpers"); -const { filterByTypesCached } = require("./cache"); +import { addErrorDetailIf } from "../helpers/helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; const whitespaceTypes = new Set([ "linePrefix", "whitespace" ]); const ignoreWhitespace = (tokens) => tokens.filter( @@ -13,9 +11,10 @@ const firstOrNothing = (items) => items[0]; const lastOrNothing = (items) => items[items.length - 1]; const makeRange = (start, end) => [ start, end - start + 1 ]; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @typedef {import("micromark-extension-gfm-table")} */ + +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD055", "table-pipe-style" ], "description": "Table pipe style", "tags": [ "table" ], diff --git a/lib/md056.js b/lib/md056.mjs similarity index 81% rename from lib/md056.js rename to lib/md056.mjs index 0a58860dc..d6f1a32b1 100644 --- a/lib/md056.js +++ b/lib/md056.mjs @@ -1,16 +1,15 @@ // @ts-check -"use strict"; - -const { addErrorDetailIf } = require("../helpers"); -const { getParentOfType } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +import { addErrorDetailIf } from "../helpers/helpers.cjs"; +import { getParentOfType } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; const makeRange = (start, end) => [ start, end - start + 1 ]; -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @typedef {import("micromark-extension-gfm-table")} */ + +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD056", "table-column-count" ], "description": "Table column count", "tags": [ "table" ], diff --git a/lib/md058.js b/lib/md058.mjs similarity index 81% rename from lib/md058.js rename to lib/md058.mjs index 423674231..4c1ee28f3 100644 --- a/lib/md058.js +++ b/lib/md058.mjs @@ -1,14 +1,13 @@ // @ts-check -"use strict"; +import { addErrorContext, isBlankLine } from "../helpers/helpers.cjs"; +import { getBlockQuotePrefixText } from "../helpers/micromark-helpers.cjs"; +import { filterByTypesCached } from "./cache.mjs"; -const { addErrorContext, isBlankLine } = require("../helpers"); -const { getBlockQuotePrefixText } = require("../helpers/micromark-helpers.cjs"); -const { filterByTypesCached } = require("./cache"); +/** @typedef {import("micromark-extension-gfm-table")} */ -// eslint-disable-next-line jsdoc/valid-types -/** @type import("./markdownlint").Rule */ -module.exports = { +/** @type {import("./markdownlint.mjs").Rule} */ +export default { "names": [ "MD058", "blanks-around-tables" ], "description": "Tables should be surrounded by blank lines", "tags": [ "table" ], diff --git a/lib/rules.js b/lib/rules.js deleted file mode 100644 index cbdbd9fbb..000000000 --- a/lib/rules.js +++ /dev/null @@ -1,74 +0,0 @@ -// @ts-check - -"use strict"; - -const { homepage, version } = require("./constants"); - -// @ts-ignore -const [ md019, md021 ] = require("./md019-md021"); -// @ts-ignore -const [ md049, md050 ] = require("./md049-md050"); - -const rules = [ - require("./md001"), - // md002: Deprecated and removed - require("./md003"), - require("./md004"), - require("./md005"), - // md006: Deprecated and removed - require("./md007"), - require("./md009"), - require("./md010"), - require("./md011"), - require("./md012"), - require("./md013"), - require("./md014"), - require("./md018"), - md019, - require("./md020"), - md021, - require("./md022"), - require("./md023"), - require("./md024"), - require("./md025"), - require("./md026"), - require("./md027"), - require("./md028"), - require("./md029"), - require("./md030"), - require("./md031"), - require("./md032"), - require("./md033"), - require("./md034"), - require("./md035"), - require("./md036"), - require("./md037"), - require("./md038"), - require("./md039"), - require("./md040"), - require("./md041"), - require("./md042"), - require("./md043"), - require("./md044"), - require("./md045"), - require("./md046"), - require("./md047"), - require("./md048"), - md049, - md050, - require("./md051"), - require("./md052"), - require("./md053"), - require("./md054"), - require("./md055"), - require("./md056"), - // md057: See https://github.com/markdownlint/markdownlint - require("./md058") -]; -for (const rule of rules) { - const name = rule.names[0].toLowerCase(); - // eslint-disable-next-line dot-notation - rule["information"] = - new URL(`${homepage}/blob/v${version}/doc/${name}.md`); -} -module.exports = rules; diff --git a/lib/rules.mjs b/lib/rules.mjs new file mode 100644 index 000000000..ccdcdd563 --- /dev/null +++ b/lib/rules.mjs @@ -0,0 +1,118 @@ +// @ts-check + +import { homepage, version } from "./constants.mjs"; + +import md001 from "./md001.mjs"; +import md003 from "./md003.mjs"; +import md004 from "./md004.mjs"; +import md005 from "./md005.mjs"; +import md007 from "./md007.mjs"; +import md009 from "./md009.mjs"; +import md010 from "./md010.mjs"; +import md011 from "./md011.mjs"; +import md012 from "./md012.mjs"; +import md013 from "./md013.mjs"; +import md014 from "./md014.mjs"; +import md018 from "./md018.mjs"; +import md019md021 from "./md019-md021.mjs"; +const [ md019, md021 ] = md019md021; +import md020 from "./md020.mjs"; +import md022 from "./md022.mjs"; +import md023 from "./md023.mjs"; +import md024 from "./md024.mjs"; +import md025 from "./md025.mjs"; +import md026 from "./md026.mjs"; +import md027 from "./md027.mjs"; +import md028 from "./md028.mjs"; +import md029 from "./md029.mjs"; +import md030 from "./md030.mjs"; +import md031 from "./md031.mjs"; +import md032 from "./md032.mjs"; +import md033 from "./md033.mjs"; +import md034 from "./md034.mjs"; +import md035 from "./md035.mjs"; +import md036 from "./md036.mjs"; +import md037 from "./md037.mjs"; +import md038 from "./md038.mjs"; +import md039 from "./md039.mjs"; +import md040 from "./md040.mjs"; +import md041 from "./md041.mjs"; +import md042 from "./md042.mjs"; +import md043 from "./md043.mjs"; +import md044 from "./md044.mjs"; +import md045 from "./md045.mjs"; +import md046 from "./md046.mjs"; +import md047 from "./md047.mjs"; +import md048 from "./md048.mjs"; +import md049md050 from "./md049-md050.mjs"; +const [ md049, md050 ] = md049md050; +import md051 from "./md051.mjs"; +import md052 from "./md052.mjs"; +import md053 from "./md053.mjs"; +import md054 from "./md054.mjs"; +import md055 from "./md055.mjs"; +import md056 from "./md056.mjs"; +import md058 from "./md058.mjs"; + +const rules = [ + md001, + // md002: Deprecated and removed + md003, + md004, + md005, + // md006: Deprecated and removed + md007, + md009, + md010, + md011, + md012, + md013, + md014, + md018, + md019, + md020, + md021, + md022, + md023, + md024, + md025, + md026, + md027, + md028, + md029, + md030, + md031, + md032, + md033, + md034, + md035, + md036, + md037, + md038, + md039, + md040, + md041, + md042, + md043, + md044, + md045, + md046, + md047, + md048, + md049, + md050, + md051, + md052, + md053, + md054, + md055, + md056, + // md057: See https://github.com/markdownlint/markdownlint + md058 +]; +for (const rule of rules) { + const name = rule.names[0].toLowerCase(); + // eslint-disable-next-line dot-notation + rule["information"] = new URL(`${homepage}/blob/v${version}/doc/${name}.md`); +} +export default rules; diff --git a/micromark/.npmignore b/micromark/.npmignore deleted file mode 100644 index 4947c297c..000000000 --- a/micromark/.npmignore +++ /dev/null @@ -1,6 +0,0 @@ -exports.mjs -exports-html.mjs -micromark.dev.cjs -micromark-browser.dev.js -micromark-html-browser.dev.js -webpack.config.js diff --git a/micromark/.npmrc b/micromark/.npmrc deleted file mode 100644 index 3757b3046..000000000 --- a/micromark/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -ignore-scripts=true -package-lock=false diff --git a/micromark/LICENSE b/micromark/LICENSE deleted file mode 100644 index 71ff07a3e..000000000 --- a/micromark/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) David Anson - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/micromark/README.md b/micromark/README.md deleted file mode 100644 index a9834c41c..000000000 --- a/micromark/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# markdownlint-micromark - -> A trivial package that re-exports some [`micromark`][micromark] functionality -> as a CommonJS module - -This package is unlikely to be of any use beyond a specific scenario used by -[`markdownlint`][markdownlint]. - -[markdownlint]: https://github.com/DavidAnson/markdownlint -[micromark]: https://github.com/micromark/micromark diff --git a/micromark/api-extractor.json b/micromark/api-extractor.json deleted file mode 100644 index 105981e25..000000000 --- a/micromark/api-extractor.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "projectFolder": ".", - "mainEntryPointFilePath": "/types.d.ts", - "bundledPackages": [ "*" ], - "newlineKind": "os", - "compiler": { - "overrideTsconfig": {} - }, - "apiReport": { - "enabled": false - }, - "docModel": { - "enabled": false - }, - "dtsRollup": { - "enabled": true, - "untrimmedFilePath": "/micromark.d.cts" - }, - "tsdocMetadata": { - "enabled": false - }, - "messages": { - "compilerMessageReporting": { - "default": { - "logLevel": "warning" - } - }, - "extractorMessageReporting": { - "default": { - "logLevel": "warning" - } - }, - "tsdocMessageReporting": { - "default": { - "logLevel": "warning" - } - } - } -} diff --git a/micromark/exports-html.mjs b/micromark/exports-html.mjs deleted file mode 100644 index 88d29bf7d..000000000 --- a/micromark/exports-html.mjs +++ /dev/null @@ -1,10 +0,0 @@ -// @ts-check - -/* eslint-disable n/no-missing-import */ - -export { compile } from "micromark"; -export { directiveHtml } from "micromark-extension-directive"; -export { gfmAutolinkLiteralHtml } from "micromark-extension-gfm-autolink-literal"; -export { gfmFootnoteHtml } from "micromark-extension-gfm-footnote"; -export { gfmTableHtml } from "micromark-extension-gfm-table"; -export { mathHtml } from "micromark-extension-math"; diff --git a/micromark/exports.mjs b/micromark/exports.mjs deleted file mode 100644 index fcf10df53..000000000 --- a/micromark/exports.mjs +++ /dev/null @@ -1,14 +0,0 @@ -// @ts-check - -/* eslint-disable n/no-missing-import */ - -export { directive } from "micromark-extension-directive"; -export { gfmAutolinkLiteral } from "micromark-extension-gfm-autolink-literal"; -export { gfmFootnote } from "micromark-extension-gfm-footnote"; -export { gfmTable } from "micromark-extension-gfm-table"; -export { math } from "micromark-extension-math"; -export { parse } from "micromark"; -export { postprocess } from "micromark"; -export { preprocess } from "micromark"; -// micromark-core-commonmark is not a dev/dependency because this instance must match what's used by micromark -export { labelEnd } from "micromark-core-commonmark"; diff --git a/micromark/micromark.d.cts b/micromark/micromark.d.cts deleted file mode 100644 index 276805703..000000000 --- a/micromark/micromark.d.cts +++ /dev/null @@ -1,1758 +0,0 @@ -/** - * Attempt deals with several values, and tries to parse according to those - * values. - * - * If a value resulted in `ok`, it worked, the tokens that were made are used, - * and `ok` is switched to. - * If the result is `nok`, the attempt failed, so we revert to the original - * state, and `nok` is used. - * - * @param construct - * Construct(s) to try. - * @param ok - * State to move to when successful. - * @param nok - * State to move to when unsuccessful. - * @returns - * Next state. - */ -declare type Attempt = ( -construct: Array | Construct | ConstructRecord, -ok: State, -nok?: State | undefined -) => State - -/** - * Directive attribute. - */ -declare interface Attributes { - /** - * Key to value. - */ - [key: string]: string -} - -/** - * Generate a back label dynamically. - * - * For the following markdown: - * - * ```markdown - * Alpha[^micromark], bravo[^micromark], and charlie[^remark]. - * - * [^remark]: things about remark - * [^micromark]: things about micromark - * ``` - * - * This function will be called with: - * - * * `0` and `0` for the backreference from `things about micromark` to - * `alpha`, as it is the first used definition, and the first call to it - * * `0` and `1` for the backreference from `things about micromark` to - * `bravo`, as it is the first used definition, and the second call to it - * * `1` and `0` for the backreference from `things about remark` to - * `charlie`, as it is the second used definition - * - * @param referenceIndex - * Index of the definition in the order that they are first referenced, - * 0-indexed. - * @param rereferenceIndex - * Index of calls to the same definition, 0-indexed. - * @returns - * Back label to use when linking back from definitions to their reference. - */ -declare type BackLabelTemplate = ( -referenceIndex: number, -rereferenceIndex: number -) => string - -/** - * A chunk is either a character code or a slice of a buffer in the form of a - * string. - * - * Chunks are used because strings are more efficient storage that character - * codes, but limited in what they can represent. - */ -declare type Chunk = Code | string - -declare type Chunk_2 = Chunk - -/** - * A character code. - * - * This is often the same as what `String#charCodeAt()` yields but micromark - * adds meaning to certain other values. - * - * `null` represents the end of the input stream (called eof). - * Negative integers are used instead of certain sequences of characters (such - * as line endings and tabs). - */ -declare type Code = number | null - -declare type Compile = Compile_2 - -/** - * @param {CompileOptions | null | undefined} [options] - * @returns {Compile} - */ -export declare function compile(options?: CompileOptions_2 | null | undefined): Compile - -/** - * Serialize micromark events as HTML. - */ -declare type Compile_2 = (events: Array) => string - -/** - * HTML compiler context. - */ -declare type CompileContext = { - /** - * Configuration passed by the user. - */ - options: CompileOptions - - /** - * Set data into the key-value store. - * - * @param key - * Key. - * @param value - * Value. - * @returns - * Nothing. - */ - setData: ( - key: Key, - value?: CompileData[Key] - ) => undefined - - /** - * Get data from the key-value store. - * - * @param key - * Key. - * @returns - * Value at `key` in compile data. - */ - getData: (key: Key) => CompileData[Key] - - /** - * Output an extra line ending if the previous value wasn’t EOF/EOL. - * - * @returns - * Nothing. - */ - lineEndingIfNeeded: () => undefined - - /** - * Make a value safe for injection in HTML (except w/ `ignoreEncode`). - * - * @param value - * Raw value. - * @returns - * Safe value. - */ - encode: (value: string) => string - - /** - * Capture some of the output data. - * - * @returns - * Nothing. - */ - buffer: () => undefined - - /** - * Stop capturing and access the output data. - * - * @returns - * Captured data. - */ - resume: () => string - - /** - * Output raw data. - * - * @param value - * Raw value. - * @returns - * Nothing. - */ - raw: (value: string) => undefined - - /** - * Output (parts of) HTML tags. - * - * @param value - * Raw value. - * @returns - * Nothing. - */ - tag: (value: string) => undefined - - /** - * Get the string value of a token. - * - * @param token - * Start/end in stream. - * @param expandTabs - * Whether to expand tabs. - * @returns - * Serialized chunks. - */ - sliceSerialize: TokenizeContext['sliceSerialize'] -} - -/** - * State tracked to compile events as HTML. - */ -export declare interface CompileData { - /** - * Whether the last emitted value was a tag. - */ - lastWasTag?: boolean | undefined - - /** - * Whether the first list item is expected, used by lists. - */ - expectFirstItem?: boolean | undefined - - /** - * Whether to slurp the next line ending (resets itself on the next line - * ending). - */ - slurpOneLineEnding?: boolean | undefined - - /** - * Whether to slurp all future line endings (has to be unset manually). - */ - slurpAllLineEndings?: boolean | undefined - - /** - * Whether we’re in fenced code, used by code (fenced). - */ - fencedCodeInside?: boolean | undefined - - /** - * Number of fences that were seen, used by code (fenced). - */ - fencesCount?: number | undefined - - /** - * Whether we’ve seen code data, used by code (fenced, indented). - */ - flowCodeSeenData?: boolean | undefined - - /** - * Ignore encoding unsafe characters, used for example for URLs which are - * first percent encoded, or by HTML when supporting it. - */ - ignoreEncode?: boolean | undefined - - /** - * Current heading rank, used by heading (atx, setext). - */ - headingRank?: number | undefined - - /** - * Whether we’re in code data, used by code (text). - */ - inCodeText?: boolean | undefined - - /** - * Current character reference kind. - */ - characterReferenceType?: string | undefined - - /** - * Stack of containers, whether they’re tight or not. - */ - tightStack: Array - - /** - * Collected definitions. - */ - definitions: Record -} - -/** - * Compile options. - */ -declare interface CompileOptions { - /** - * Whether to allow (dangerous) HTML (`boolean`, default: `false`). - * - * The default is `false`, which still parses the HTML according to - * `CommonMark` but shows the HTML as text instead of as elements. - * - * Pass `true` for trusted content to get actual HTML elements. - */ - allowDangerousHtml?: boolean | null | undefined - - /** - * Whether to allow dangerous protocols in links and images (`boolean`, - * default: `false`). - * - * The default is `false`, which drops URLs in links and images that use - * dangerous protocols. - * - * Pass `true` for trusted content to support all protocols. - * - * URLs that have no protocol (which means it’s relative to the current page, - * such as `./some/page.html`) and URLs that have a safe protocol (for - * images: `http`, `https`; for links: `http`, `https`, `irc`, `ircs`, - * `mailto`, `xmpp`), are safe. - * All other URLs are dangerous and dropped. - */ - allowDangerousProtocol?: boolean | null | undefined - - /** - * Default line ending to use when compiling to HTML, for line endings not in - * `value`. - * - * Generally, `micromark` copies line endings (`\r`, `\n`, `\r\n`) in the - * markdown document over to the compiled HTML. - * In some cases, such as `> a`, CommonMark requires that extra line endings - * are added: `

\n

a

\n
`. - * - * To create that line ending, the document is checked for the first line - * ending that is used. - * If there is no line ending, `defaultLineEnding` is used. - * If that isn’t configured, `\n` is used. - */ - defaultLineEnding?: LineEnding | null | undefined - - /** - * Array of HTML extensions (default: `[]`). - */ - htmlExtensions?: Array | null | undefined -} - -declare type CompileOptions_2 = CompileOptions - -/** - * An object describing how to parse a markdown construct. - */ -export declare type Construct = { - /** - * Set up a state machine to handle character codes streaming in. - */ - tokenize: Tokenizer - - /** - * Guard whether the previous character can come before the construct. - */ - previous?: Previous | undefined - - /** - * For containers, a continuation construct. - */ - continuation?: Construct | undefined - - /** - * For containers, a final hook. - */ - exit?: Exiter | undefined - - /** - * Name of the construct, used to toggle constructs off. - * - * Named constructs must not be `partial`. - */ - name?: string | undefined - - /** - * Whether this construct represents a partial construct. - * - * Partial constructs must not have a `name`. - */ - partial?: boolean | undefined - - /** - * Resolve the events parsed by `tokenize`. - * - * For example, if we’re currently parsing a link title and this construct - * parses character references, then `resolve` is called with the events - * ranging from the start to the end of a character reference each time one is - * found. - */ - resolve?: Resolver | undefined - - /** - * Resolve the events from the start of the content (which includes other - * constructs) to the last one parsed by `tokenize`. - * - * For example, if we’re currently parsing a link title and this construct - * parses character references, then `resolveTo` is called with the events - * ranging from the start of the link title to the end of a character - * reference each time one is found. - */ - resolveTo?: Resolver | undefined - - /** - * Resolve all events when the content is complete, from the start to the end. - * Only used if `tokenize` is successful once in the content. - * - * For example, if we’re currently parsing a link title and this construct - * parses character references, then `resolveAll` is called *if* at least one - * character reference is found, ranging from the start to the end of the link - * title to the end. - */ - resolveAll?: Resolver | undefined - - /** - * Concrete constructs cannot be interrupted by more containers. - * - * For example, when parsing the document (containers, such as block quotes - * and lists) and this construct is parsing fenced code: - * - * ````markdown - * > ```js - * > - list? - * ```` - * - * …then `- list?` cannot form if this fenced code construct is concrete. - * - * An example of a construct that is not concrete is a GFM table: - * - * ````markdown - * | a | - * | - | - * > | b | - * ```` - * - * …`b` is not part of the table. - */ - concrete?: boolean | undefined - - /** - * Whether the construct, when in a `ConstructRecord`, precedes over existing - * constructs for the same character code when merged. - * - * The default is that new constructs precede over existing ones. - */ - add?: 'after' | 'before' | undefined -} - -/** - * Several constructs, mapped from their initial codes. - */ -declare type ConstructRecord = Record< -string, -Array | Construct | undefined -> - -/** - * Deal with the character and move to the next. - * - * @param code - * Current code. - */ -declare type Consume = (code: Code) => undefined - -/** - * State shared between container calls. - */ -declare interface ContainerState { - /** - * Special field to close the current flow (or containers). - */ - _closeFlow?: boolean | undefined - - /** - * Used by block quotes. - */ - open?: boolean | undefined - - /** - * Current marker, used by lists. - */ - marker?: Code | undefined - - /** - * Current token type, used by lists. - */ - type?: TokenType | undefined - - /** - * Current size, used by lists. - */ - size?: number | undefined - - /** - * Whether there first line is blank, used by lists. - */ - initialBlankLine?: boolean | undefined - - /** - * Whether there are further blank lines, used by lists. - */ - furtherBlankLines?: boolean | undefined -} - -/** - * Enumeration of the content types. - * - * Technically `document` is also a content type, which includes containers - * (lists, block quotes) and flow. - * As `ContentType` is used on tokens to define the type of subcontent but - * `document` is the highest level of content, so it’s not listed here. - * - * Containers in markdown come from the margin and include more constructs - * on the lines that define them. - * Take for example a block quote with a paragraph inside it (such as - * `> asd`). - * - * `flow` represents the sections, such as headings, code, and content, which - * is also parsed per line - * An example is HTML, which has a certain starting condition (such as - * ` - * ``` - * - * The above example shows that elements are made available by browsers, by - * their ID, on the `window` object. - * This is a security risk because you might be expecting some other variable - * at that place. - * It can also break polyfills. - * Using a prefix solves these problems. - */ - clobberPrefix?: string | null | undefined - /** - * Textual label to use for the footnotes section (default: `'Footnotes'`). - * - * Change it when the markdown is not in English. - * - * This label is typically hidden visually (assuming a `sr-only` CSS class - * is defined that does that) and so affects screen readers only. - * If you do have such a class, but want to show this section to everyone, - * pass different attributes with the `labelAttributes` option. - */ - label?: string | null | undefined - /** - * Attributes to use on the footnote label (default: `'class="sr-only"'`). - * - * Change it to show the label and add other attributes. - * - * This label is typically hidden visually (assuming an `sr-only` CSS class - * is defined that does that) and so affects screen readers only. - * If you do have such a class, but want to show this section to everyone, - * pass an empty string. - * You can also add different attributes. - * - * > 👉 **Note**: `id="footnote-label"` is always added, because footnote - * > calls use it with `aria-describedby` to provide an accessible label. - */ - labelAttributes?: string | null | undefined - /** - * HTML tag name to use for the footnote label element (default: `'h2'`). - * - * Change it to match your document structure. - * - * This label is typically hidden visually (assuming a `sr-only` CSS class - * is defined that does that) and so affects screen readers only. - * If you do have such a class, but want to show this section to everyone, - * pass different attributes with the `labelAttributes` option. - */ - labelTagName?: string | null | undefined - /** - * Textual label to describe the backreference back to references (default: - * `defaultBackLabel`). - * - * The default value is: - * - * ```js - * function defaultBackLabel(referenceIndex, rereferenceIndex) { - * return ( - * 'Back to reference ' + - * (referenceIndex + 1) + - * (rereferenceIndex > 1 ? '-' + rereferenceIndex : '') - * ) - * } - * ``` - * - * Change it when the markdown is not in English. - * - * This label is used in the `aria-label` attribute on each backreference - * (the `↩` links). - * It affects users of assistive technology. - */ - backLabel?: BackLabelTemplate | string | null | undefined -} - -/** - * Configuration for HTML output. - * - * > 👉 **Note**: passed to `katex.renderToString`. - * > `displayMode` is overwritten by this plugin, to `false` for math in - * > text (inline), and `true` for math in flow (block). - */ -declare interface HtmlOptions_3 extends Object { - /** - * The field `displayMode` cannot be passed to `micromark-extension-math`. - * It is overwritten by it, - * to `false` for math in text (inline) and `true` for math in flow (block). - */ - displayMode?: never -} - -/** - * Type of line ending in markdown. - */ -declare type LineEnding = '\r' | '\n' | '\r\n' - -/** - * Create an extension for `micromark` to enable math syntax. - * - * @param {Options | null | undefined} [options={}] - * Configuration (default: `{}`). - * @returns {Extension} - * Extension for `micromark` that can be passed in `extensions`, to - * enable math syntax. - */ -export declare function math(options?: Options | null | undefined): Extension; - -/** - * Create an extension for `micromark` to support math when serializing to - * HTML. - * - * > 👉 **Note**: this uses KaTeX to render math. - * - * @param {Options | null | undefined} [options={}] - * Configuration (default: `{}`). - * @returns {HtmlExtension} - * Extension for `micromark` that can be passed in `htmlExtensions`, to - * support math when serializing to HTML. - */ -export declare function mathHtml(options?: HtmlOptions_3 | null | undefined): HtmlExtension; - -/** - * Configuration. - */ -declare interface Options { - /** - * Whether to support math (text) with a single dollar (default: `true`). - * - * Single dollars work in Pandoc and many other places, but often interfere - * with “normal” dollars in text. - * If you turn this off, you can use two or more dollars for text math. - */ - singleDollarTextMath?: boolean | null | undefined -} - -/** - * @param {ParseOptions | null | undefined} [options] - * @returns {ParseContext} - */ -export declare function parse(options?: ParseOptions_2 | null | undefined): ParseContext_2 - -/** - * A context object that helps w/ parsing markdown. - */ -declare interface ParseContext { - /** - * All constructs. - */ - constructs: FullNormalizedExtension - - /** - * Create a content tokenizer. - */ - content: Create - - /** - * Create a document tokenizer. - */ - document: Create - - /** - * Create a flow tokenizer. - */ - flow: Create - - /** - * Create a string tokenizer. - */ - string: Create - - /** - * Create a text tokenizer. - */ - text: Create - - /** - * List of defined identifiers. - */ - defined: Array - - /** - * Map of line numbers to whether they are lazy (as opposed to the line before - * them). - * Take for example: - * - * ```markdown - * > a - * b - * ``` - * - * L1 here is not lazy, L2 is. - */ - lazy: Record -} - -declare type ParseContext_2 = ParseContext - -/** - * Config defining how to parse. - */ -export declare interface ParseOptions { - /** - * Array of syntax extensions (default: `[]`). - */ - extensions?: Array | null | undefined -} - -declare type ParseOptions_2 = ParseOptions - -/** - * A location in the document (`line`/`column`/`offset`) and chunk (`_index`, - * `_bufferIndex`). - * - * `_bufferIndex` is `-1` when `_index` points to a code chunk and it’s a - * non-negative integer when pointing to a string chunk. - * - * The interface for the location in the document comes from unist `Point`: - * - */ -declare type Point = { - /** - * Position in a string chunk (or `-1` when pointing to a numeric chunk). - */ - _bufferIndex: number - - /** - * Position in a list of chunks. - */ - _index: number - - /** - * 1-indexed column number. - */ - column: number - - /** - * 1-indexed line number. - */ - line: number - - /** - * 0-indexed position in the document. - */ - offset: number -} - -/** - * @param {Array} events - * @returns {Array} - */ -export declare function postprocess( -events: Array -): Array - -/** - * @returns {Preprocessor} - */ -export declare function preprocess(): Preprocessor - -declare type Preprocessor = ( -value: Value, -encoding?: Encoding | null | undefined, -end?: boolean | null | undefined -) => Array - -/** - * Guard whether `code` can come before the construct. - * - * In certain cases a construct can hook into many potential start characters. - * Instead of setting up an attempt to parse that construct for most - * characters, this is a speedy way to reduce that. - * - * @param this - * Tokenize context. - * @param code - * Previous code. - * @returns - * Whether `code` is allowed before. - */ -declare type Previous = (this: TokenizeContext, code: Code) => boolean - -/** - * A resolver handles and cleans events coming from `tokenize`. - * - * @param events - * List of events. - * @param context - * Tokenize context. - * @returns - * The given, modified, events. - */ -declare type Resolver = ( -events: Array, -context: TokenizeContext -) => Array - -/** - * The main unit in the state machine: a function that gets a character code - * and has certain effects. - * - * A state function should return another function: the next - * state-as-a-function to go to. - * - * But there is one case where they return `undefined`: for the eof character - * code (at the end of a value). - * The reason being: well, there isn’t any state that makes sense, so - * `undefined` works well. - * Practically that has also helped: if for some reason it was a mistake, then - * an exception is throw because there is no next function, meaning it - * surfaces early. - * - * @param code - * Current code. - * @returns - * Next state. - */ -export declare type State = (code: Code) => State | undefined - -/** - * A token: a span of chunks. - * - * Tokens are what the core of micromark produces: the built in HTML compiler - * or other tools can turn them into different things. - * - * Tokens are essentially names attached to a slice of chunks, such as - * `lineEndingBlank` for certain line endings, or `codeFenced` for a whole - * fenced code. - * - * Sometimes, more info is attached to tokens, such as `_open` and `_close` - * by `attention` (strong, emphasis) to signal whether the sequence can open - * or close an attention run. - * - * Linked tokens are used because outer constructs are parsed first. - * Take for example: - * - * ```markdown - * > *a - * b*. - * ``` - * - * 1. The block quote marker and the space after it is parsed first - * 2. The rest of the line is a `chunkFlow` token - * 3. The two spaces on the second line are a `linePrefix` - * 4. The rest of the line is another `chunkFlow` token - * - * The two `chunkFlow` tokens are linked together. - * The chunks they span are then passed through the flow tokenizer. - */ -export declare interface Token { - /** - * Token type. - */ - type: TokenType - - /** - * Point where the token starts. - */ - start: Point - - /** - * Point where the token ends. - */ - end: Point - - /** - * The previous token in a list of linked tokens. - */ - previous?: Token | undefined - - /** - * The next token in a list of linked tokens. - */ - next?: Token | undefined - - /** - * Declares a token as having content of a certain type. - */ - contentType?: ContentType | undefined - - /** - * Connected tokenizer. - * - * Used when dealing with linked tokens. - * A child tokenizer is needed to tokenize them, which is stored on those - * tokens. - */ - _tokenizer?: TokenizeContext | undefined - - /** - * Field to help parse attention. - * - * Depending on the character before sequences (`**`), the sequence can open, - * close, both, or none. - */ - _open?: boolean | undefined - - /** - * Field to help parse attention. - * - * Depending on the character before sequences (`**`), the sequence can open, - * close, both, or none. - */ - _close?: boolean | undefined - - /** - * Field to help parse GFM task lists. - * - * This boolean is used internally to figure out if a token is in the first - * content of a list item construct. - */ - _isInFirstContentOfListItem?: boolean | undefined - - /** - * Field to help parse containers. - * - * This boolean is used internally to figure out if a token is a container - * token. - */ - _container?: boolean | undefined - - /** - * Field to help parse lists. - * - * This boolean is used internally to figure out if a list is loose or not. - */ - _loose?: boolean | undefined - - /** - * Field to help parse links. - * - * This boolean is used internally to figure out if a link opening - * can’t be used (because links in links are incorrect). - */ - _inactive?: boolean | undefined - - /** - * Field to help parse links. - * - * This boolean is used internally to figure out if a link opening is - * balanced: it’s not a link opening but has a balanced closing. - */ - _balanced?: boolean | undefined -} - -/** - * A context object that helps w/ tokenizing markdown constructs. - */ -declare interface TokenizeContext { - /** - * The previous code. - */ - previous: Code - - /** - * Current code. - */ - code: Code - - /** - * Whether we’re currently interrupting. - * - * Take for example: - * - * ```markdown - * a - * # b - * ``` - * - * At 2:1, we’re “interrupting”. - */ - interrupt?: boolean | undefined - - /** - * The current construct. - * - * Constructs that are not `partial` are set here. - */ - currentConstruct?: Construct | undefined - - /** - * share state set when parsing containers. - * - * Containers are parsed in separate phases: their first line (`tokenize`), - * continued lines (`continuation.tokenize`), and finally `exit`. - * This record can be used to store some information between these hooks. - */ - containerState?: ContainerState | undefined - - /** - * Current list of events. - */ - events: Array - - /** - * The relevant parsing context. - */ - parser: ParseContext - - /** - * Get the chunks that span a token (or location). - * - * @param token - * Start/end in stream. - * @returns - * List of chunks. - */ - sliceStream: (token: Pick) => Array - - /** - * Get the source text that spans a token (or location). - * - * @param token - * Start/end in stream. - * @param expandTabs - * Whether to expand tabs. - * @returns - * Serialized chunks. - */ - sliceSerialize: ( - token: Pick, - expandTabs?: boolean | undefined - ) => string - - /** - * Get the current place. - * - * @returns - * Current point. - */ - now: () => Point - - /** - * Define a skip - * - * As containers (block quotes, lists), “nibble” a prefix from the margins, - * where a line starts after that prefix is defined here. - * When the tokenizers moves after consuming a line ending corresponding to - * the line number in the given point, the tokenizer shifts past the prefix - * based on the column in the shifted point. - * - * @param point - * Skip. - * @returns - * Nothing. - */ - defineSkip: (point: Point) => undefined - - /** - * Write a slice of chunks. - * - * The eof code (`null`) can be used to signal the end of the stream. - * - * @param slice - * Chunks. - * @returns - * Events. - */ - write: (slice: Array) => Array - - /** - * Internal boolean shared with `micromark-extension-gfm-task-list-item` to - * signal whether the tokenizer is tokenizing the first content of a list item - * construct. - */ - _gfmTasklistFirstContentOfListItem?: boolean | undefined - - // To do: next major: remove `_gfmTableDynamicInterruptHack` (no longer - // needed in micromark-extension-gfm-table@1.0.6). - /** - * Internal boolean shared with `micromark-extension-gfm-table` whose body - * rows are not affected by normal interruption rules. - * “Normal” rules are, for example, that an empty list item can’t interrupt: - * - * ````markdown - * a - * * - * ```` - * - * The above is one paragraph. - * These rules don’t apply to table body rows: - * - * ````markdown - * | a | - * | - | - * * - * ```` - * - * The above list interrupts the table. - */ - _gfmTableDynamicInterruptHack?: boolean -} - -/** - * A tokenize function sets up a state machine to handle character codes streaming in. - * - * @param this - * Tokenize context. - * @param effects - * Effects. - * @param ok - * State to go to when successful. - * @param nok - * State to go to when unsuccessful. - * @returns - * First state. - */ -export declare type Tokenizer = ( -this: TokenizeContext, -effects: Effects, -ok: State, -nok: State -) => State - -/** - * Enum of allowed token types. - */ -export declare type TokenType = keyof TokenTypeMap - -/** - * Map of allowed token types. - */ -export declare interface TokenTypeMap { - // Note: these are compiled away. - attentionSequence: 'attentionSequence' // To do: remove. - space: 'space' // To do: remove. - - data: 'data' - whitespace: 'whitespace' - lineEnding: 'lineEnding' - lineEndingBlank: 'lineEndingBlank' - linePrefix: 'linePrefix' - lineSuffix: 'lineSuffix' - atxHeading: 'atxHeading' - atxHeadingSequence: 'atxHeadingSequence' - atxHeadingText: 'atxHeadingText' - autolink: 'autolink' - autolinkEmail: 'autolinkEmail' - autolinkMarker: 'autolinkMarker' - autolinkProtocol: 'autolinkProtocol' - characterEscape: 'characterEscape' - characterEscapeValue: 'characterEscapeValue' - characterReference: 'characterReference' - characterReferenceMarker: 'characterReferenceMarker' - characterReferenceMarkerNumeric: 'characterReferenceMarkerNumeric' - characterReferenceMarkerHexadecimal: 'characterReferenceMarkerHexadecimal' - characterReferenceValue: 'characterReferenceValue' - codeFenced: 'codeFenced' - codeFencedFence: 'codeFencedFence' - codeFencedFenceSequence: 'codeFencedFenceSequence' - codeFencedFenceInfo: 'codeFencedFenceInfo' - codeFencedFenceMeta: 'codeFencedFenceMeta' - codeFlowValue: 'codeFlowValue' - codeIndented: 'codeIndented' - codeText: 'codeText' - codeTextData: 'codeTextData' - codeTextPadding: 'codeTextPadding' - codeTextSequence: 'codeTextSequence' - content: 'content' - definition: 'definition' - definitionDestination: 'definitionDestination' - definitionDestinationLiteral: 'definitionDestinationLiteral' - definitionDestinationLiteralMarker: 'definitionDestinationLiteralMarker' - definitionDestinationRaw: 'definitionDestinationRaw' - definitionDestinationString: 'definitionDestinationString' - definitionLabel: 'definitionLabel' - definitionLabelMarker: 'definitionLabelMarker' - definitionLabelString: 'definitionLabelString' - definitionMarker: 'definitionMarker' - definitionTitle: 'definitionTitle' - definitionTitleMarker: 'definitionTitleMarker' - definitionTitleString: 'definitionTitleString' - emphasis: 'emphasis' - emphasisSequence: 'emphasisSequence' - emphasisText: 'emphasisText' - escapeMarker: 'escapeMarker' - hardBreakEscape: 'hardBreakEscape' - hardBreakTrailing: 'hardBreakTrailing' - htmlFlow: 'htmlFlow' - htmlFlowData: 'htmlFlowData' - htmlText: 'htmlText' - htmlTextData: 'htmlTextData' - image: 'image' - label: 'label' - labelText: 'labelText' - labelLink: 'labelLink' - labelImage: 'labelImage' - labelMarker: 'labelMarker' - labelImageMarker: 'labelImageMarker' - labelEnd: 'labelEnd' - link: 'link' - paragraph: 'paragraph' - reference: 'reference' - referenceMarker: 'referenceMarker' - referenceString: 'referenceString' - resource: 'resource' - resourceDestination: 'resourceDestination' - resourceDestinationLiteral: 'resourceDestinationLiteral' - resourceDestinationLiteralMarker: 'resourceDestinationLiteralMarker' - resourceDestinationRaw: 'resourceDestinationRaw' - resourceDestinationString: 'resourceDestinationString' - resourceMarker: 'resourceMarker' - resourceTitle: 'resourceTitle' - resourceTitleMarker: 'resourceTitleMarker' - resourceTitleString: 'resourceTitleString' - setextHeading: 'setextHeading' - setextHeadingText: 'setextHeadingText' - setextHeadingLine: 'setextHeadingLine' - setextHeadingLineSequence: 'setextHeadingLineSequence' - strong: 'strong' - strongSequence: 'strongSequence' - strongText: 'strongText' - thematicBreak: 'thematicBreak' - thematicBreakSequence: 'thematicBreakSequence' - blockQuote: 'blockQuote' - blockQuotePrefix: 'blockQuotePrefix' - blockQuoteMarker: 'blockQuoteMarker' - blockQuotePrefixWhitespace: 'blockQuotePrefixWhitespace' - listOrdered: 'listOrdered' - listUnordered: 'listUnordered' - listItemIndent: 'listItemIndent' - listItemMarker: 'listItemMarker' - listItemPrefix: 'listItemPrefix' - listItemPrefixWhitespace: 'listItemPrefixWhitespace' - listItemValue: 'listItemValue' - chunkDocument: 'chunkDocument' - chunkContent: 'chunkContent' - chunkFlow: 'chunkFlow' - chunkText: 'chunkText' - chunkString: 'chunkString' -} - -declare type Value = Value_2 - -/** - * Contents of the file. - * - * Can either be text, or a `Uint8Array` like structure. - */ -declare type Value_2 = Uint8Array | string - -export { } - -// Source: node_modules/micromark-extension-directive/index.d.ts - -export declare interface TokenTypeMap { - directiveContainer: 'directiveContainer' - directiveContainerAttributes: 'directiveContainerAttributes' - directiveContainerAttributesMarker: 'directiveContainerAttributesMarker' - directiveContainerAttribute: 'directiveContainerAttribute' - directiveContainerAttributeId: 'directiveContainerAttributeId' - directiveContainerAttributeIdValue: 'directiveContainerAttributeIdValue' - directiveContainerAttributeClass: 'directiveContainerAttributeClass' - directiveContainerAttributeClassValue: 'directiveContainerAttributeClassValue' - directiveContainerAttributeName: 'directiveContainerAttributeName' - directiveContainerAttributeInitializerMarker: 'directiveContainerAttributeInitializerMarker' - directiveContainerAttributeValueLiteral: 'directiveContainerAttributeValueLiteral' - directiveContainerAttributeValue: 'directiveContainerAttributeValue' - directiveContainerAttributeValueMarker: 'directiveContainerAttributeValueMarker' - directiveContainerAttributeValueData: 'directiveContainerAttributeValueData' - directiveContainerContent: 'directiveContainerContent' - directiveContainerFence: 'directiveContainerFence' - directiveContainerLabel: 'directiveContainerLabel' - directiveContainerLabelMarker: 'directiveContainerLabelMarker' - directiveContainerLabelString: 'directiveContainerLabelString' - directiveContainerName: 'directiveContainerName' - directiveContainerSequence: 'directiveContainerSequence' - - directiveLeaf: 'directiveLeaf' - directiveLeafAttributes: 'directiveLeafAttributes' - directiveLeafAttributesMarker: 'directiveLeafAttributesMarker' - directiveLeafAttribute: 'directiveLeafAttribute' - directiveLeafAttributeId: 'directiveLeafAttributeId' - directiveLeafAttributeIdValue: 'directiveLeafAttributeIdValue' - directiveLeafAttributeClass: 'directiveLeafAttributeClass' - directiveLeafAttributeClassValue: 'directiveLeafAttributeClassValue' - directiveLeafAttributeName: 'directiveLeafAttributeName' - directiveLeafAttributeInitializerMarker: 'directiveLeafAttributeInitializerMarker' - directiveLeafAttributeValueLiteral: 'directiveLeafAttributeValueLiteral' - directiveLeafAttributeValue: 'directiveLeafAttributeValue' - directiveLeafAttributeValueMarker: 'directiveLeafAttributeValueMarker' - directiveLeafAttributeValueData: 'directiveLeafAttributeValueData' - directiveLeafLabel: 'directiveLeafLabel' - directiveLeafLabelMarker: 'directiveLeafLabelMarker' - directiveLeafLabelString: 'directiveLeafLabelString' - directiveLeafName: 'directiveLeafName' - directiveLeafSequence: 'directiveLeafSequence' - - directiveText: 'directiveText' - directiveTextAttributes: 'directiveTextAttributes' - directiveTextAttributesMarker: 'directiveTextAttributesMarker' - directiveTextAttribute: 'directiveTextAttribute' - directiveTextAttributeId: 'directiveTextAttributeId' - directiveTextAttributeIdValue: 'directiveTextAttributeIdValue' - directiveTextAttributeClass: 'directiveTextAttributeClass' - directiveTextAttributeClassValue: 'directiveTextAttributeClassValue' - directiveTextAttributeName: 'directiveTextAttributeName' - directiveTextAttributeInitializerMarker: 'directiveTextAttributeInitializerMarker' - directiveTextAttributeValueLiteral: 'directiveTextAttributeValueLiteral' - directiveTextAttributeValue: 'directiveTextAttributeValue' - directiveTextAttributeValueMarker: 'directiveTextAttributeValueMarker' - directiveTextAttributeValueData: 'directiveTextAttributeValueData' - directiveTextLabel: 'directiveTextLabel' - directiveTextLabelMarker: 'directiveTextLabelMarker' - directiveTextLabelString: 'directiveTextLabelString' - directiveTextMarker: 'directiveTextMarker' - directiveTextName: 'directiveTextName' -} - -// Source: node_modules/micromark-extension-gfm-autolink-literal/index.d.ts - -export declare interface TokenTypeMap { - literalAutolink: 'literalAutolink' - literalAutolinkEmail: 'literalAutolinkEmail' - literalAutolinkHttp: 'literalAutolinkHttp' - literalAutolinkWww: 'literalAutolinkWww' -} - -// Source: node_modules/micromark-extension-gfm-footnote/index.d.ts - -export declare interface TokenTypeMap { - gfmFootnoteCall: 'gfmFootnoteCall' - gfmFootnoteCallLabelMarker: 'gfmFootnoteCallLabelMarker' - gfmFootnoteCallMarker: 'gfmFootnoteCallMarker' - gfmFootnoteCallString: 'gfmFootnoteCallString' - gfmFootnoteDefinition: 'gfmFootnoteDefinition' - gfmFootnoteDefinitionIndent: 'gfmFootnoteDefinitionIndent' - gfmFootnoteDefinitionLabel: 'gfmFootnoteDefinitionLabel' - gfmFootnoteDefinitionLabelMarker: 'gfmFootnoteDefinitionLabelMarker' - gfmFootnoteDefinitionLabelString: 'gfmFootnoteDefinitionLabelString' - gfmFootnoteDefinitionMarker: 'gfmFootnoteDefinitionMarker' - gfmFootnoteDefinitionWhitespace: 'gfmFootnoteDefinitionWhitespace' -} - -// Source: node_modules/micromark-extension-gfm-table/index.d.ts - -export declare interface TokenTypeMap { - table: 'table' - tableBody: 'tableBody' - tableCellDivider: 'tableCellDivider' - tableContent: 'tableContent' - tableData: 'tableData' - tableDelimiter: 'tableDelimiter' - tableDelimiterFiller: 'tableDelimiterFiller' - tableDelimiterMarker: 'tableDelimiterMarker' - tableDelimiterRow: 'tableDelimiterRow' - tableHead: 'tableHead' - tableHeader: 'tableHeader' - tableRow: 'tableRow' -} - -// Source: node_modules/micromark-extension-math/index.d.ts - -export declare interface TokenTypeMap { - mathFlow: 'mathFlow' - mathFlowFence: 'mathFlowFence' - mathFlowFenceMeta: 'mathFlowFenceMeta' - mathFlowFenceSequence: 'mathFlowFenceSequence' - mathFlowValue: 'mathFlowValue' - mathText: 'mathText' - mathTextData: 'mathTextData' - mathTextPadding: 'mathTextPadding' - mathTextSequence: 'mathTextSequence' -} - -// Source: Custom types generated by markdownlint in getEvents - -export declare interface TokenTypeMap { - undefinedReference: 'undefinedReference' - undefinedReferenceCollapsed: 'undefinedReferenceCollapsed' - undefinedReferenceFull: 'undefinedReferenceFull' - undefinedReferenceShortcut: 'undefinedReferenceShortcut' -} diff --git a/micromark/package.json b/micromark/package.json deleted file mode 100644 index e711547ac..000000000 --- a/micromark/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "markdownlint-micromark", - "version": "0.1.12", - "description": "A trivial package that re-exports some micromark functionality as a CommonJS module", - "type": "commonjs", - "exports": "./micromark.cjs", - "types": "./micromark.d.cts", - "author": "David Anson (https://dlaa.me/)", - "license": "MIT", - "homepage": "https://github.com/DavidAnson/markdownlint", - "repository": { - "type": "git", - "url": "git+https://github.com/DavidAnson/markdownlint.git" - }, - "bugs": "https://github.com/DavidAnson/markdownlint/issues", - "funding": "https://github.com/sponsors/DavidAnson", - "scripts": { - "build": "webpack --stats minimal", - "types": "api-extractor run --local" - }, - "engines": { - "node": ">=18" - }, - "files": [ - "LICENSE", - "micromark-browser.js", - "micromark-html-browser.js", - "micromark.cjs", - "micromark.d.cts", - "package.json", - "README.md" - ], - "devDependencies": { - "@microsoft/api-extractor": "7.48.0", - "micromark": "4.0.1", - "micromark-extension-directive": "3.0.2", - "micromark-extension-gfm-autolink-literal": "2.1.0", - "micromark-extension-gfm-footnote": "2.1.0", - "micromark-extension-gfm-table": "2.1.0", - "micromark-extension-math": "3.1.0", - "micromark-util-types": "2.0.1", - "terser-webpack-plugin": "5.3.10", - "webpack": "5.96.1", - "webpack-cli": "5.1.4" - } -} diff --git a/micromark/types.d.ts b/micromark/types.d.ts deleted file mode 100644 index e146e23e3..000000000 --- a/micromark/types.d.ts +++ /dev/null @@ -1,34 +0,0 @@ -// Manually update due to api-extractor limitations including: -// - https://github.com/microsoft/rushstack/issues/1709 -// - ERROR: Failed to fetch entity for import() type node: import('micromark-util-types').ParseContext -// - Unwillingness to treat "katex" as one of bundledPackages -// -// 1. npm install -// 2. Comment-out micromark-util-types/ParseContext in micromark/node_modules/micromark-extension-gfm-footnote/index.d.ts -// 3. npm run types -// 4. Remove "import type { KatexOptions } from 'katex';" in micromark/micromark.d.cts -// 5. Replace "KatexOptions" with "Object" in micromark/micromark.d.cts -// 6. Append "declare module 'micromark-util-types' { interface TokenTypeMap { ... } }" in micromark/micromark.d.cts from: -// - micromark/node_modules/micromark-extension-directive/index.d.ts -// - micromark/node_modules/micromark-extension-gfm-autolink-literal/index.d.ts -// - micromark/node_modules/micromark-extension-gfm-footnote/index.d.ts -// - micromark/node_modules/micromark-extension-gfm-table/index.d.ts -// - micromark/node_modules/micromark-extension-math/index.d.ts -// - export declare interface TokenTypeMap { -// undefinedReference: 'undefinedReference' -// undefinedReferenceCollapsed: 'undefinedReferenceCollapsed' -// undefinedReferenceFull: 'undefinedReferenceFull' -// undefinedReferenceShortcut: 'undefinedReferenceShortcut' -// } -// 7. Update version number in package.json and stage changes -// 8. Test: npm run build, npm pack, npm install ./micromark/markdownlint-micromark-0.1.11.tgz, npm run ci, verify types like gfmFootnote* in getReferenceLinkImageData(...) -// 9. Publish: git clean -dfx, npm install, npm run build, npm publish ., git push - -export type { directive, directiveHtml } from "micromark-extension-directive"; -export type { gfmAutolinkLiteral, gfmAutolinkLiteralHtml } from "micromark-extension-gfm-autolink-literal"; -export type { gfmFootnote, gfmFootnoteHtml } from "micromark-extension-gfm-footnote"; -export type { gfmTable, gfmTableHtml } from "micromark-extension-gfm-table"; -export type { math, mathHtml } from "micromark-extension-math"; -export type { compile, parse, postprocess, preprocess } from "micromark"; - -export type { CompileData, Construct, Event, ParseOptions, State, Token, TokenType, TokenTypeMap, Tokenizer } from "micromark-util-types"; diff --git a/micromark/webpack.config.js b/micromark/webpack.config.js deleted file mode 100644 index 3cc2c28bd..000000000 --- a/micromark/webpack.config.js +++ /dev/null @@ -1,127 +0,0 @@ -// @ts-check - -"use strict"; - -const webpack = require("webpack"); -const TerserPlugin = require("terser-webpack-plugin"); -const { name, version, homepage } = require("./package.json"); - -const htmlEntry = "./exports-html.mjs"; -const htmlName = "micromarkHtmlBrowser"; - -const base = { - "entry": "./exports.mjs", - "output": { - "path": __dirname - }, - "plugins": [ - new webpack.BannerPlugin({ - "banner": `${name} ${version} ${homepage}` - }) - ] -}; - -const commonjs = { - ...base, - "output": { - ...base.output, - "library": { - "type": "commonjs" - } - }, - "target": "node" -}; - -const web = { - ...base, - "output": { - ...base.output, - "library": { - "name": "micromarkBrowser", - "type": "var" - } - }, - "target": "web" -}; - -const production = { - "mode": "production", - "optimization": { - "minimizer": [ - new TerserPlugin({ - "extractComments": false, - "terserOptions": { - "compress": { - "passes": 2 - } - } - }) - ] - } -}; - -const development = { - "devtool": false, - "mode": "development" -}; - -module.exports = [ - { - ...commonjs, - ...production, - "output": { - ...commonjs.output, - "filename": "micromark.cjs" - } - }, - { - ...commonjs, - ...development, - "output": { - ...commonjs.output, - "filename": "micromark.dev.cjs" - } - }, - { - ...web, - ...production, - "output": { - ...web.output, - "filename": "micromark-browser.js" - } - }, - { - ...web, - ...development, - "output": { - ...web.output, - "filename": "micromark-browser.dev.js" - } - }, - { - ...web, - ...production, - "entry": htmlEntry, - "output": { - ...web.output, - "library": { - ...web.output.library, - "name": htmlName - }, - "filename": "micromark-html-browser.js" - } - }, - { - ...web, - ...development, - "entry": htmlEntry, - "output": { - ...web.output, - "library": { - ...web.output.library, - "name": htmlName - }, - "filename": "micromark-html-browser.dev.js" - } - } -]; diff --git a/package.json b/package.json index 15968e7e6..aabf26b61 100644 --- a/package.json +++ b/package.json @@ -2,17 +2,16 @@ "name": "markdownlint", "version": "0.36.1", "description": "A Node.js style checker and lint tool for Markdown/CommonMark files.", - "type": "commonjs", - "main": "./lib/markdownlint.js", + "type": "module", "exports": { - ".": "./lib/markdownlint.js", - "./helpers": "./helpers/helpers.js", + ".": "./lib/markdownlint.mjs", + "./helpers": "./helpers/helpers.cjs", "./style/all": "./style/all.json", "./style/cirosantilli": "./style/cirosantilli.json", "./style/prettier": "./style/prettier.json", "./style/relaxed": "./style/relaxed.json" }, - "types": "./lib/markdownlint.d.ts", + "types": "./lib/markdownlint.d.mts", "author": "David Anson (https://dlaa.me/)", "license": "MIT", "homepage": "https://github.com/DavidAnson/markdownlint", @@ -24,13 +23,12 @@ "funding": "https://github.com/sponsors/DavidAnson", "scripts": { "build-config": "npm run build-config-schema && npm run build-config-example", - "build-config-example": "node schema/build-config-example.js", - "build-config-schema": "node schema/build-config-schema.js", - "build-declaration": "tsc --allowJs --declaration --emitDeclarationOnly --module commonjs --outDir dts --resolveJsonModule --target es2015 lib/markdownlint.js && node scripts copy dts/lib/markdownlint.d.ts lib/markdownlint.d.ts && node scripts remove dts", - "build-demo": "node scripts copy node_modules/markdown-it/dist/markdown-it.min.js demo/markdown-it.min.js && node scripts copy node_modules/markdownlint-micromark/micromark-browser.js demo/micromark-browser.js && node scripts copy node_modules/markdownlint-micromark/micromark-html-browser.js demo/micromark-html-browser.js && cd demo && webpack --no-stats", + "build-config-example": "node schema/build-config-example.mjs", + "build-config-schema": "node schema/build-config-schema.mjs", + "build-declaration": "tsc --allowJs --declaration --emitDeclarationOnly --module nodenext --outDir dts --target es2015 lib/markdownlint.mjs && node scripts/index.mjs copy dts/lib/markdownlint.d.mts lib/markdownlint.d.mts && node scripts/index.mjs remove dts", + "build-demo": "node scripts/index.mjs copy node_modules/markdown-it/dist/markdown-it.min.js demo/markdown-it.min.js && cd demo && webpack --no-stats", "build-docs": "node doc-build/build-rules.mjs", "build-example": "npm install --no-save --ignore-scripts grunt grunt-cli gulp through2", - "build-micromark": "cd micromark && npm run build", "ci": "npm-run-all --continue-on-error --parallel lint serial-config-docs serial-declaration-demo test-cover && git diff --exit-code", "clone-test-repos-apache-airflow": "cd test-repos && git clone https://github.com/apache/airflow apache-airflow --depth 1 --no-tags --quiet", "clone-test-repos-dotnet-docs": "cd test-repos && git clone https://github.com/dotnet/docs dotnet-docs --depth 1 --no-tags --quiet", @@ -45,20 +43,17 @@ "clone-test-repos-webpack-webpack-js-org": "cd test-repos && git clone https://github.com/webpack/webpack.js.org webpack-webpack-js-org --depth 1 --no-tags --quiet", "clone-test-repos": "mkdir test-repos && cd test-repos && npm run clone-test-repos-apache-airflow && npm run clone-test-repos-dotnet-docs && npm run clone-test-repos-electron-electron && npm run clone-test-repos-eslint-eslint && npm run clone-test-repos-mdn-content && npm run clone-test-repos-mkdocs-mkdocs && npm run clone-test-repos-mochajs-mocha && npm run clone-test-repos-pi-hole-docs && npm run clone-test-repos-v8-v8-dev && npm run clone-test-repos-webhintio-hint && npm run clone-test-repos-webpack-webpack-js-org", "declaration": "npm run build-declaration && npm run test-declaration", - "example": "cd example && node standalone.js && grunt markdownlint --force && gulp markdownlint", - "docker-npm-install": "docker run --rm --tty --name npm-install --volume $PWD:/home/workdir --workdir /home/workdir --user node node:latest npm install", - "docker-npm-run-upgrade": "docker run --rm --tty --name npm-run-upgrade --volume $PWD:/home/workdir --workdir /home/workdir --user node node:latest npm run upgrade", - "install-micromark": "cd micromark && npm install", + "example": "cd example && node standalone.mjs && grunt markdownlint --force && gulp markdownlint", "lint": "eslint --max-warnings 0", - "lint-test-repos": "ava --timeout=10m test/markdownlint-test-repos-*.js", + "lint-test-repos": "ava --timeout=10m test/markdownlint-test-repos-*.mjs", "serial-config-docs": "npm run build-config && npm run build-docs", "serial-declaration-demo": "npm run build-declaration && npm-run-all --continue-on-error --parallel build-demo test-declaration", - "test": "ava --timeout=30s test/markdownlint-test.js test/markdownlint-test-config.js test/markdownlint-test-custom-rules.js test/markdownlint-test-fixes.js test/markdownlint-test-helpers.js test/markdownlint-test-micromark.mjs test/markdownlint-test-result-object.js test/markdownlint-test-scenarios.js helpers/test.cjs", + "test": "ava --timeout=30s test/markdownlint-test.mjs test/markdownlint-test-config.mjs test/markdownlint-test-custom-rules.mjs test/markdownlint-test-fixes.mjs test/markdownlint-test-helpers.mjs test/markdownlint-test-micromark.mjs test/markdownlint-test-result-object.mjs test/markdownlint-test-scenarios.mjs helpers/test.cjs", "test-cover": "c8 --100 npm test", - "test-declaration": "cd example/typescript && tsc --module nodenext && tsc --module commonjs && node type-check.js", - "test-extra": "ava --timeout=10m test/markdownlint-test-extra-parse.js test/markdownlint-test-extra-type.js", - "update-snapshots": "ava --update-snapshots test/markdownlint-test-custom-rules.js test/markdownlint-test-micromark.mjs test/markdownlint-test-scenarios.js", - "update-snapshots-test-repos": "ava --timeout=10m --update-snapshots test/markdownlint-test-repos-*.js", + "test-declaration": "cd example/typescript && tsc --module commonjs && tsc --module nodenext && node type-check.js", + "test-extra": "ava --timeout=10m test/markdownlint-test-extra-parse.mjs test/markdownlint-test-extra-type.mjs", + "update-snapshots": "ava --update-snapshots test/markdownlint-test-custom-rules.mjs test/markdownlint-test-micromark.mjs test/markdownlint-test-scenarios.mjs", + "update-snapshots-test-repos": "ava --timeout=10m --update-snapshots test/markdownlint-test-repos-*.mjs", "upgrade": "npx --yes npm-check-updates --upgrade" }, "engines": { @@ -66,7 +61,13 @@ }, "dependencies": { "markdown-it": "14.1.0", - "markdownlint-micromark": "0.1.12" + "micromark": "4.0.0", + "micromark-extension-directive": "3.0.2", + "micromark-extension-gfm-autolink-literal": "2.1.0", + "micromark-extension-gfm-footnote": "2.1.0", + "micromark-extension-gfm-table": "2.1.0", + "micromark-extension-math": "3.1.0", + "micromark-util-types": "2.0.0" }, "devDependencies": { "@eslint/js": "9.15.0", diff --git a/schema/build-config-example.js b/schema/build-config-example.mjs similarity index 76% rename from schema/build-config-example.js rename to schema/build-config-example.mjs index bc75f7e19..7b09f6a14 100644 --- a/schema/build-config-example.js +++ b/schema/build-config-example.mjs @@ -1,11 +1,10 @@ // @ts-check -"use strict"; - -const fs = require("node:fs"); -const path = require("node:path"); -const yaml = require("js-yaml"); -const configSchema = require("./markdownlint-config-schema.json"); +import fs from "node:fs/promises"; +import path from "node:path"; +import yaml from "js-yaml"; +import { __dirname, importWithTypeJson } from "../test/esm-helpers.mjs"; +const configSchema = await importWithTypeJson(import.meta, "../schema/markdownlint-config-schema.json"); const configExample = {}; for (const rule in configSchema.properties) { @@ -35,8 +34,8 @@ const transformComments = (input, commentPrefix) => ( ); const configStringJson = JSON.stringify(configExample, null, 2); -fs.writeFileSync( - path.join(__dirname, ".markdownlint.jsonc"), +await fs.writeFile( + path.join(__dirname(import.meta), ".markdownlint.jsonc"), transformComments(configStringJson, "//"), "utf8" ); @@ -49,8 +48,8 @@ const configStringYaml = yaml.dump( "quotingType": "\"" } ); -fs.writeFileSync( - path.join(__dirname, ".markdownlint.yaml"), +await fs.writeFile( + path.join(__dirname(import.meta), ".markdownlint.yaml"), transformComments(configStringYaml, "#"), "utf8" ); diff --git a/schema/build-config-schema.js b/schema/build-config-schema.mjs similarity index 94% rename from schema/build-config-schema.js rename to schema/build-config-schema.mjs index b967ad1c0..ee91cbece 100644 --- a/schema/build-config-schema.js +++ b/schema/build-config-schema.mjs @@ -1,13 +1,12 @@ // @ts-check -"use strict"; - -const fs = require("node:fs"); -const path = require("node:path"); -/** @type {import("../lib/markdownlint").Rule[]} */ -const rules = require("../lib/rules"); -const jsonSchemaToTypeScript = require("json-schema-to-typescript"); -const { version } = require("../lib/constants"); +import fs from "node:fs/promises"; +import path from "node:path"; +/** @type {import("../lib/markdownlint.mjs").Rule[]} */ +import rules from "../lib/rules.mjs"; +import jsonSchemaToTypeScript from "json-schema-to-typescript"; +import { version } from "../lib/constants.mjs"; +import { __dirname } from "../test/esm-helpers.mjs"; const schemaName = "markdownlint-config-schema.json"; const schemaUri = `https://raw.githubusercontent.com/DavidAnson/markdownlint/v${version}/schema/${schemaName}`; @@ -586,8 +585,8 @@ for (const [ tag, tagTags ] of Object.entries(tags)) { } // Write schema -const schemaFile = path.join(__dirname, schemaName); -fs.writeFileSync(schemaFile, JSON.stringify(schema, null, " ")); +const schemaFile = path.join(__dirname(import.meta), schemaName); +await fs.writeFile(schemaFile, JSON.stringify(schema, null, " ")); // Create and write strict schema const schemaStrict = { @@ -595,15 +594,15 @@ const schemaStrict = { "$id": schemaStrictUri, "additionalProperties": false }; -const schemaFileStrict = path.join(__dirname, schemaStrictName); -fs.writeFileSync(schemaFileStrict, JSON.stringify(schemaStrict, null, " ")); +const schemaFileStrict = path.join(__dirname(import.meta), schemaStrictName); +await fs.writeFile(schemaFileStrict, JSON.stringify(schemaStrict, null, " ")); // Write TypeScript declaration file -const declarationStrictName = path.join(__dirname, "..", "lib", "configuration-strict.d.ts"); +const declarationStrictName = path.join(__dirname(import.meta), "..", "lib", "configuration-strict.d.ts"); schemaStrict.title = "ConfigurationStrict"; -jsonSchemaToTypeScript.compile( +const declaration = await jsonSchemaToTypeScript.compile( // @ts-ignore schemaStrict, "UNUSED" - // eslint-disable-next-line unicorn/prefer-top-level-await -).then((declaration) => fs.writeFileSync(declarationStrictName, declaration)); +); +await fs.writeFile(declarationStrictName, declaration); diff --git a/scripts/index.js b/scripts/index.js deleted file mode 100644 index 03ef88a07..000000000 --- a/scripts/index.js +++ /dev/null @@ -1,29 +0,0 @@ -// @ts-check - -"use strict"; - -const fs = require("node:fs").promises; - -const [ command, ...args ] = process.argv.slice(2); - -// eslint-disable-next-line unicorn/prefer-top-level-await -(async() => { - if (command === "copy") { - const [ src, dest ] = args; - await fs.copyFile(src, dest); - } else if (command === "delete") { - const { globby } = await import("globby"); - await Promise.all( - args.flatMap( - (glob) => globby(glob) - .then( - (files) => files.map((file) => fs.unlink(file)) - ) - ) - ); - } else if (command === "remove") { - await Promise.all(args.map((dir) => fs.rm(dir, { "recursive": true }))); - } else { - throw new Error(`Unsupported command: ${command}`); - } -})(); diff --git a/scripts/index.mjs b/scripts/index.mjs new file mode 100644 index 000000000..9e9ff6b4e --- /dev/null +++ b/scripts/index.mjs @@ -0,0 +1,24 @@ +// @ts-check + +import fs from "node:fs/promises"; +import { globby } from "globby"; + +const [ command, ...args ] = process.argv.slice(2); + +if (command === "copy") { + const [ src, dest ] = args; + await fs.copyFile(src, dest); +} else if (command === "delete") { + await Promise.all( + args.flatMap( + (glob) => globby(glob) + .then( + (files) => files.map((file) => fs.unlink(file)) + ) + ) + ); +} else if (command === "remove") { + await Promise.all(args.map((dir) => fs.rm(dir, { "recursive": true }))); +} else { + throw new Error(`Unsupported command: ${command}`); +} diff --git a/test/esm-helpers.mjs b/test/esm-helpers.mjs new file mode 100644 index 000000000..be66c9940 --- /dev/null +++ b/test/esm-helpers.mjs @@ -0,0 +1,38 @@ +// @ts-check + +import fs from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +/** + * Gets the file name of the current module. + * Shims import.meta.filename for Node 18. + * + * @param {Object} meta ESM import.meta object. + * @returns {string} File name. + */ +// eslint-disable-next-line no-underscore-dangle +export const __filename = (meta) => fileURLToPath(meta.url); + +/** + * Gets the directory name of the current module. + * Shims import.meta.dirname for Node 18. + * + * @param {Object} meta ESM import.meta object. + * @returns {string} Directory name. + */ +// eslint-disable-next-line no-underscore-dangle +export const __dirname = (meta) => path.dirname(__filename(meta)); + +/** + * Imports a file as JSON. + * Avoids "ExperimentalWarning: Importing JSON modules is an experimental feature and might change at any time". + * + * @param {Object} meta ESM import.meta object. + * @param {string} file JSON file to import. + * @returns {Promise} JSON object. + */ +export const importWithTypeJson = async(meta, file) => ( + // @ts-ignore + JSON.parse(await fs.readFile(path.resolve(__dirname(meta), file))) +); diff --git a/test/harness.mjs b/test/harness.mjs index 712e5ede3..65fe54d4e 100644 --- a/test/harness.mjs +++ b/test/harness.mjs @@ -1,6 +1,6 @@ import { readFile } from "node:fs/promises"; -import { parse } from "../helpers/micromark-parse.cjs"; -import library from "../lib/markdownlint.js"; +import { parse } from "../helpers/micromark-parse.mjs"; +import library from "../lib/markdownlint.mjs"; const markdownlint = library.promises.markdownlint; /* eslint-disable no-await-in-loop, no-console */ diff --git a/test/markdownlint-test-config.js b/test/markdownlint-test-config.mjs similarity index 96% rename from test/markdownlint-test-config.js rename to test/markdownlint-test-config.mjs index 123f165f8..eb1308ec5 100644 --- a/test/markdownlint-test-config.js +++ b/test/markdownlint-test-config.mjs @@ -1,13 +1,14 @@ // @ts-check -"use strict"; +import { createRequire } from "node:module"; +const require = createRequire(import.meta.url); +import os from "node:os"; +import path from "node:path"; +import test from "ava"; +import markdownlint from "../lib/markdownlint.mjs"; +import { __dirname } from "./esm-helpers.mjs"; -const os = require("node:os"); -const path = require("node:path"); -const test = require("ava").default; -const markdownlint = require("../lib/markdownlint"); - -const sameFileSystem = (path.relative(os.homedir(), __dirname) !== __dirname); +const sameFileSystem = (path.relative(os.homedir(), __dirname(import.meta)) !== __dirname(import.meta)); test("configSingle", (t) => new Promise((resolve) => { t.plan(2); @@ -22,7 +23,7 @@ test("configSingle", (t) => new Promise((resolve) => { test("configAbsolute", (t) => new Promise((resolve) => { t.plan(2); - markdownlint.readConfig(path.join(__dirname, "config", "config-child.json"), + markdownlint.readConfig(path.join(__dirname(import.meta), "config", "config-child.json"), function callback(err, actual) { t.falsy(err); const expected = require("./config/config-child.json"); @@ -268,7 +269,7 @@ test("configSingleSync", (t) => { test("configAbsoluteSync", (t) => { t.plan(1); const actual = markdownlint.readConfigSync( - path.join(__dirname, "config", "config-child.json")); + path.join(__dirname(import.meta), "config", "config-child.json")); const expected = require("./config/config-child.json"); t.deepEqual(actual, expected, "Config object not correct."); }); diff --git a/test/markdownlint-test-custom-rules.js b/test/markdownlint-test-custom-rules.mjs similarity index 91% rename from test/markdownlint-test-custom-rules.js rename to test/markdownlint-test-custom-rules.mjs index ec805ed51..c6cf367d5 100644 --- a/test/markdownlint-test-custom-rules.js +++ b/test/markdownlint-test-custom-rules.mjs @@ -1,19 +1,20 @@ // @ts-check -"use strict"; - -const fs = require("node:fs").promises; -const test = require("ava").default; -const markdownlint = require("../lib/markdownlint"); -const customRules = require("./rules/rules.js"); -const { homepage, version } = require("../package.json"); -const { newLineRe } = require("../helpers/helpers.js"); +import fs from "node:fs/promises"; +import { createRequire } from "node:module"; +const require = createRequire(import.meta.url); +import test from "ava"; +import markdownlint from "../lib/markdownlint.mjs"; +import customRules from "./rules/rules.cjs"; +import { newLineRe } from "../helpers/helpers.cjs"; +import { __filename, importWithTypeJson } from "./esm-helpers.mjs"; +const packageJson = await importWithTypeJson(import.meta, "../package.json"); +const { homepage, version } = packageJson; test("customRulesV0", (t) => new Promise((resolve) => { t.plan(4); const customRulesMd = "./test/custom-rules.md"; - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": customRules.all, "files": [ customRulesMd ], @@ -85,8 +86,7 @@ test("customRulesV0", (t) => new Promise((resolve) => { test("customRulesV1", (t) => new Promise((resolve) => { t.plan(3); const customRulesMd = "./test/custom-rules.md"; - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": customRules.all, "files": [ customRulesMd ], @@ -217,8 +217,7 @@ test("customRulesV1", (t) => new Promise((resolve) => { test("customRulesV2", (t) => new Promise((resolve) => { t.plan(3); const customRulesMd = "./test/custom-rules.md"; - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": customRules.all, "files": [ customRulesMd ], @@ -339,8 +338,7 @@ test("customRulesV2", (t) => new Promise((resolve) => { test("customRulesConfig", (t) => new Promise((resolve) => { t.plan(2); const customRulesMd = "./test/custom-rules.md"; - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": customRules.all, "files": [ customRulesMd ], @@ -370,8 +368,7 @@ test("customRulesConfig", (t) => new Promise((resolve) => { test("customRulesNpmPackage", (t) => new Promise((resolve) => { t.plan(2); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ require("./rules/npm"), @@ -434,8 +431,7 @@ test("customRulesBadProperty", (t) => { for (const propertyValue of propertyValues) { const badRule = { ...customRules.firstLine }; badRule[propertyName] = propertyValue; - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ badRule ] }; @@ -456,8 +452,7 @@ test("customRulesBadProperty", (t) => { test("customRulesUsedNameName", (t) => new Promise((resolve) => { t.plan(4); markdownlint({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name", "NO-missing-SPACE-atx" ], @@ -483,8 +478,7 @@ test("customRulesUsedNameName", (t) => new Promise((resolve) => { test("customRulesUsedNameTag", (t) => new Promise((resolve) => { t.plan(4); markdownlint({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name", "HtMl" ], @@ -509,8 +503,7 @@ test("customRulesUsedNameTag", (t) => new Promise((resolve) => { test("customRulesUsedTagName", (t) => new Promise((resolve) => { t.plan(4); markdownlint({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "filler" ], @@ -542,8 +535,7 @@ test("customRulesUsedTagName", (t) => new Promise((resolve) => { test("customRulesParserUndefined", (t) => { t.plan(5); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ // @ts-ignore @@ -570,8 +562,7 @@ test("customRulesParserUndefined", (t) => { test("customRulesParserNone", (t) => { t.plan(2); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -595,8 +586,7 @@ test("customRulesParserNone", (t) => { test("customRulesParserMarkdownIt", (t) => { t.plan(5); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -623,8 +613,7 @@ test("customRulesParserMarkdownIt", (t) => { test("customRulesParserMicromark", (t) => { t.plan(5); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -651,8 +640,7 @@ test("customRulesParserMicromark", (t) => { test("customRulesMarkdownItParamsTokensSameObject", (t) => { t.plan(1); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ // @ts-ignore @@ -676,8 +664,7 @@ test("customRulesMarkdownItParamsTokensSameObject", (t) => { test("customRulesMarkdownItTokensSnapshot", (t) => { t.plan(1); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -703,8 +690,7 @@ test("customRulesMarkdownItTokensSnapshot", (t) => { test("customRulesMicromarkTokensSnapshot", (t) => { t.plan(1); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -730,8 +716,7 @@ test("customRulesMicromarkTokensSnapshot", (t) => { test("customRulesDefinitionStatic", (t) => new Promise((resolve) => { t.plan(2); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -781,8 +766,7 @@ test("customRulesThrowForFile", (t) => new Promise((resolve) => { t.plan(4); const exceptionMessage = "Test exception message"; markdownlint({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -812,8 +796,7 @@ test("customRulesThrowForFileSync", (t) => { t.throws( function customRuleThrowsCall() { markdownlint.sync({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -839,8 +822,7 @@ test("customRulesThrowForString", (t) => new Promise((resolve) => { t.plan(4); const exceptionMessage = "Test exception message"; markdownlint({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -872,8 +854,7 @@ test("customRulesThrowForStringSync", (t) => { t.throws( function customRuleThrowsCall() { markdownlint.sync({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -900,8 +881,7 @@ test("customRulesThrowForStringSync", (t) => { test("customRulesOnErrorNull", (t) => new Promise((resolve) => { t.plan(4); markdownlint({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -934,8 +914,7 @@ test("customRulesOnErrorNull", (t) => new Promise((resolve) => { test("customRulesOnErrorNullSync", (t) => { t.plan(1); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -1026,8 +1005,7 @@ test("customRulesOnErrorBad", (t) => { badObject[propertyName] = propertyValue; propertyNames = propertyName; } - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -1099,8 +1077,7 @@ test("customRulesOnErrorInvalid", (t) => { badObject[propertyName] = propertyValue; propertyNames = propertyName; } - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -1175,8 +1152,7 @@ test("customRulesOnErrorValid", (t) => { } else { goodObject[propertyName] = propertyValue; } - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -1201,8 +1177,7 @@ test("customRulesOnErrorValid", (t) => { test("customRulesOnErrorLazy", (t) => new Promise((resolve) => { t.plan(2); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -1259,8 +1234,7 @@ test("customRulesOnErrorModified", (t) => new Promise((resolve) => { "insertText": "text" } }; - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -1313,8 +1287,7 @@ test("customRulesOnErrorModified", (t) => new Promise((resolve) => { test("customRulesOnErrorInvalidHandled", (t) => new Promise((resolve) => { t.plan(2); markdownlint({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1357,8 +1330,7 @@ test("customRulesOnErrorInvalidHandled", (t) => new Promise((resolve) => { test("customRulesOnErrorInvalidHandledSync", (t) => { t.plan(1); const actualResult = markdownlint.sync({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1398,8 +1370,7 @@ test("customRulesOnErrorInvalidHandledSync", (t) => { test("customRulesVersion", (t) => new Promise((resolve) => { t.plan(2); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -1422,8 +1393,7 @@ test("customRulesVersion", (t) => new Promise((resolve) => { test("customRulesFileName", (t) => new Promise((resolve) => { t.plan(2); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -1446,8 +1416,7 @@ test("customRulesFileName", (t) => new Promise((resolve) => { test("customRulesStringName", (t) => new Promise((resolve) => { t.plan(2); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -1473,8 +1442,7 @@ test("customRulesStringName", (t) => new Promise((resolve) => { test("customRulesOnErrorInformationNotRuleNotError", (t) => { t.plan(1); const actualResult = markdownlint.sync({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1498,8 +1466,7 @@ test("customRulesOnErrorInformationNotRuleNotError", (t) => { test("customRulesOnErrorInformationRuleNotError", (t) => { t.plan(1); const actualResult = markdownlint.sync({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1528,8 +1495,7 @@ test("customRulesOnErrorInformationRuleNotError", (t) => { test("customRulesOnErrorInformationNotRuleError", (t) => { t.plan(1); const actualResult = markdownlint.sync({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1558,8 +1524,7 @@ test("customRulesOnErrorInformationNotRuleError", (t) => { test("customRulesOnErrorInformationRuleError", (t) => { t.plan(1); const actualResult = markdownlint.sync({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1589,8 +1554,7 @@ test("customRulesOnErrorInformationRuleError", (t) => { test("customRulesOnErrorInformationRuleErrorUndefined", (t) => { t.plan(1); const actualResult = markdownlint.sync({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1620,8 +1584,7 @@ test("customRulesOnErrorInformationRuleErrorUndefined", (t) => { test("customRulesOnErrorInformationRuleErrorMultiple", (t) => { t.plan(6); const actualResult = markdownlint.sync({ - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1697,8 +1660,7 @@ test("customRulesDoc", (t) => new Promise((resolve) => { test("customRulesLintJavaScript", (t) => new Promise((resolve) => { t.plan(2); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": customRules.lintJavaScript, "files": "test/lint-javascript.md" @@ -1726,8 +1688,7 @@ test("customRulesLintJavaScript", (t) => new Promise((resolve) => { test("customRulesValidateJson", (t) => new Promise((resolve) => { t.plan(3); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": customRules.validateJson, "files": "test/validate-json.md" @@ -1760,8 +1721,7 @@ test("customRulesValidateJson", (t) => new Promise((resolve) => { test("customRulesAsyncThrowsInSyncContext", (t) => { t.plan(1); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -1805,8 +1765,7 @@ test("customRulesParamsAreFrozen", (t) => { } } }; - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -1840,8 +1799,7 @@ test("customRulesParamsAreStable", (t) => { t.plan(4); const config1 = { "value1": 10 }; const config2 = { "value2": 20 }; - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "config": { "MD010": true, @@ -1907,8 +1865,7 @@ test("customRulesParamsAreStable", (t) => { test("customRulesAsyncReadFiles", (t) => { t.plan(3); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -1919,7 +1876,7 @@ test("customRulesAsyncReadFiles", (t) => { "asynchronous": true, "parser": "none", "function": - (params, onError) => fs.readFile(__filename, "utf8").then( + (params, onError) => fs.readFile(__filename(import.meta), "utf8").then( (content) => { t.true(content.length > 0); onError({ @@ -1939,7 +1896,7 @@ test("customRulesAsyncReadFiles", (t) => { "parser": "none", "function": async(params, onError) => { - const content = await fs.readFile(__filename, "utf8"); + const content = await fs.readFile(__filename(import.meta), "utf8"); t.true(content.length > 0); onError({ "lineNumber": 1, @@ -1996,8 +1953,7 @@ test("customRulesAsyncReadFiles", (t) => { test("customRulesAsyncIgnoresSyncReturn", (t) => { t.plan(1); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -2088,8 +2044,7 @@ for (const flavor of [ ] ]) { const [ name, func ] = flavor; - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule[] */ + /** @type {import("../lib/markdownlint.mjs").Rule[]} */ const customRule = [ { "names": [ "name" ], @@ -2202,7 +2157,7 @@ for (const flavor of [ ], [ "customRulesAsyncDeferredString", - () => fs.readFile(__filename, "utf8").then( + () => fs.readFile(__filename(import.meta), "utf8").then( () => { throw errorMessage; } @@ -2210,7 +2165,7 @@ for (const flavor of [ ], [ "customRulesAsyncDeferredError", - () => fs.readFile(__filename, "utf8").then( + () => fs.readFile(__filename(import.meta), "utf8").then( () => { throw new Error(errorMessage); } @@ -2226,8 +2181,7 @@ for (const flavor of [ ] ]) { const [ name, func ] = flavor; - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Rule */ + /** @type {import("../lib/markdownlint.mjs").Rule} */ const customRule = { "names": [ "name" ], "description": "description", diff --git a/test/markdownlint-test-extra-parse.js b/test/markdownlint-test-extra-parse.mjs similarity index 61% rename from test/markdownlint-test-extra-parse.js rename to test/markdownlint-test-extra-parse.mjs index 9552566ad..976014484 100644 --- a/test/markdownlint-test-extra-parse.js +++ b/test/markdownlint-test-extra-parse.mjs @@ -1,14 +1,12 @@ // @ts-check -"use strict"; - -const test = require("ava").default; -const markdownlint = require("../lib/markdownlint"); +import test from "ava"; +import { globby } from "globby"; +import markdownlint from "../lib/markdownlint.mjs"; // Parses all Markdown files in all package dependencies test("parseAllFiles", async(t) => { t.plan(1); - const { globby } = await import("globby"); const files = await globby("**/*.{md,markdown}"); await markdownlint.promises.markdownlint({ files }); t.pass(); diff --git a/test/markdownlint-test-extra-type.js b/test/markdownlint-test-extra-type.mjs similarity index 76% rename from test/markdownlint-test-extra-type.js rename to test/markdownlint-test-extra-type.mjs index 59b094a46..e18b36cb0 100644 --- a/test/markdownlint-test-extra-type.js +++ b/test/markdownlint-test-extra-type.mjs @@ -1,11 +1,9 @@ // @ts-check -"use strict"; - -const fs = require("node:fs"); -const path = require("node:path"); -const test = require("ava").default; -const markdownlint = require("../lib/markdownlint"); +import fs from "node:fs"; +import path from "node:path"; +import test from "ava"; +import markdownlint from "../lib/markdownlint.mjs"; // Simulates typing each test file to validate handling of partial input const files = fs diff --git a/test/markdownlint-test-fixes.js b/test/markdownlint-test-fixes.mjs similarity index 98% rename from test/markdownlint-test-fixes.js rename to test/markdownlint-test-fixes.mjs index 94ef5f7e0..4db880d32 100644 --- a/test/markdownlint-test-fixes.js +++ b/test/markdownlint-test-fixes.mjs @@ -1,9 +1,7 @@ // @ts-check -"use strict"; - -const test = require("ava").default; -const markdownlint = require("../lib/markdownlint"); +import test from "ava"; +import markdownlint from "../lib/markdownlint.mjs"; test("applyFix", (t) => { t.plan(4); diff --git a/test/markdownlint-test-helpers.js b/test/markdownlint-test-helpers.mjs similarity index 95% rename from test/markdownlint-test-helpers.js rename to test/markdownlint-test-helpers.mjs index abc2f9072..0284e859d 100644 --- a/test/markdownlint-test-helpers.js +++ b/test/markdownlint-test-helpers.mjs @@ -1,14 +1,15 @@ // @ts-check -"use strict"; - -const os = require("node:os"); -const path = require("node:path"); -const test = require("ava").default; -const helpers = require("../helpers"); -const libMarkdownlint = require("../lib/markdownlint"); +import os from "node:os"; +import path from "node:path"; +import test from "ava"; +import { characterEntities } from "character-entities"; +import { gemoji } from "gemoji"; +import helpers from "../helpers/helpers.cjs"; +import libMarkdownlint from "../lib/markdownlint.mjs"; const { markdownlint } = libMarkdownlint.promises; -const { forEachInlineCodeSpan } = require("../lib/markdownit.cjs"); +import { forEachInlineCodeSpan } from "../lib/markdownit.cjs"; +import { getReferenceLinkImageData } from "../lib/cache.mjs"; test("clearHtmlCommentTextValid", (t) => { t.plan(1); @@ -386,8 +387,7 @@ test("expandTildePath", (t) => { test("getReferenceLinkImageData().shortcuts", (t) => { t.plan(1); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -397,7 +397,6 @@ test("getReferenceLinkImageData().shortcuts", (t) => { "parser": "none", "function": () => { - const { getReferenceLinkImageData } = require("../lib/cache"); const { shortcuts } = getReferenceLinkImageData(); t.is(shortcuts.size, 0, [ ...shortcuts.keys() ].join(", ")); } @@ -419,8 +418,7 @@ Empty bracket pair: [text4[]] return markdownlint(options).then(() => null); }); -test("endOfLineHtmlEntityRe", async(t) => { - const { characterEntities } = await import("character-entities"); +test("endOfLineHtmlEntityRe", (t) => { const entities = Object.keys(characterEntities); t.plan(entities.length); for (const entity of entities) { @@ -428,8 +426,7 @@ test("endOfLineHtmlEntityRe", async(t) => { } }); -test("endOfLineGemojiCodeRe", async(t) => { - const { gemoji } = await import("gemoji"); +test("endOfLineGemojiCodeRe", (t) => { const emojis = gemoji.flatMap((i) => i.names); t.plan(emojis.length); for (const emoji of emojis) { @@ -447,7 +444,7 @@ test("ellipsify", (t) => { test("hasOverlap", (t) => { t.plan(32); - /** @type {import("../helpers").FileRange[][]} */ + /** @type {import("../helpers/helpers.cjs").FileRange[][]} */ const trueTestCases = [ // Same line [ diff --git a/test/markdownlint-test-micromark.mjs b/test/markdownlint-test-micromark.mjs index 7abe21394..fa44360cd 100644 --- a/test/markdownlint-test-micromark.mjs +++ b/test/markdownlint-test-micromark.mjs @@ -2,9 +2,9 @@ import fs from "node:fs/promises"; import test from "ava"; -import { newLineRe } from "../helpers/helpers.js"; +import { newLineRe } from "../helpers/helpers.cjs"; import { filterByPredicate, filterByTypes } from "../helpers/micromark-helpers.cjs"; -import { getEvents, parse } from "../helpers/micromark-parse.cjs"; +import { getEvents, parse } from "../helpers/micromark-parse.mjs"; const testContent = new Promise((resolve, reject) => { fs @@ -49,8 +49,7 @@ test("getEvents/filterByPredicate", async(t) => { test("filterByTypes, htmlFlow false", async(t) => { t.plan(7); const tokens = await testTokens; - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../micromark/micromark.cjs").TokenType[] */ + /** @type {import("micromark-util-types").TokenType[]} */ const types = [ "atxHeadingText", "codeText", "htmlText", "setextHeadingText" ]; const filtered = filterByTypes(tokens, types); // Using flat tokens @@ -67,8 +66,7 @@ test("filterByTypes, htmlFlow false", async(t) => { test("filterByTypes, htmlFlow true", async(t) => { t.plan(9); const tokens = await testTokens; - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../micromark/micromark.cjs").TokenType[] */ + /** @type {import("micromark-util-types").TokenType[]} */ const types = [ "atxHeadingText", "codeText", "htmlText", "setextHeadingText" ]; // Using flat tokens const filtered = filterByTypes(tokens, types, true); diff --git a/test/markdownlint-test-parallel.js b/test/markdownlint-test-parallel.mjs similarity index 63% rename from test/markdownlint-test-parallel.js rename to test/markdownlint-test-parallel.mjs index d0f0a6383..615b464e6 100644 --- a/test/markdownlint-test-parallel.js +++ b/test/markdownlint-test-parallel.mjs @@ -1,19 +1,19 @@ // @ts-check -"use strict"; - // eslint-disable-next-line n/no-unsupported-features/node-builtins -const { availableParallelism } = require("node:os"); -const { Worker } = require("node:worker_threads"); -const markdownlintSync = require("../lib/markdownlint").sync; +import { availableParallelism } from "node:os"; +import { Worker } from "node:worker_threads"; +import { __filename } from "./esm-helpers.mjs"; +import markdownlint from "../lib/markdownlint.mjs"; +const markdownlintSync = markdownlint.sync; /** * Lint specified Markdown files (using multiple threads). * - * @param {import("../lib/markdownlint").Options} options Configuration options. - * @returns {Promise} Results object. + * @param {import("../lib/markdownlint.mjs").Options} options Configuration options. + * @returns {Promise} Results object. */ -function markdownlintParallel(options) { +export function markdownlintParallel(options) { const workerCount = availableParallelism(); const files = options.files || []; const chunkSize = Math.ceil(files.length / workerCount); @@ -24,7 +24,7 @@ function markdownlintParallel(options) { ...options, "files": files.slice(i * chunkSize, (i + 1) * chunkSize) }; - const worker = new Worker(__filename.replace(/parallel\.js$/, "worker.js"), { workerData }); + const worker = new Worker(__filename(import.meta).replace(/parallel\.mjs$/, "worker.mjs"), { workerData }); worker.on("message", resolve); worker.on("error", reject); })); @@ -40,5 +40,3 @@ function markdownlintParallel(options) { return combinedResults; }); } - -module.exports = markdownlintParallel; diff --git a/test/markdownlint-test-repos-dotnet-docs.js b/test/markdownlint-test-repos-dotnet-docs.mjs similarity index 64% rename from test/markdownlint-test-repos-dotnet-docs.js rename to test/markdownlint-test-repos-dotnet-docs.mjs index 87decdf21..b3a1ec419 100644 --- a/test/markdownlint-test-repos-dotnet-docs.js +++ b/test/markdownlint-test-repos-dotnet-docs.mjs @@ -1,10 +1,9 @@ // @ts-check -"use strict"; - -const { join } = require("node:path").posix; -const test = require("ava").default; -const { lintTestRepo } = require("./markdownlint-test-repos"); +import path from "node:path"; +const { join } = path.posix; +import test from "ava"; +import { lintTestRepo } from "./markdownlint-test-repos.mjs"; test("https://github.com/dotnet/docs", (t) => { const rootDir = "./test-repos/dotnet-docs"; diff --git a/test/markdownlint-test-repos-mdn-content.js b/test/markdownlint-test-repos-mdn-content.mjs similarity index 64% rename from test/markdownlint-test-repos-mdn-content.js rename to test/markdownlint-test-repos-mdn-content.mjs index 08f103fe8..71d579684 100644 --- a/test/markdownlint-test-repos-mdn-content.js +++ b/test/markdownlint-test-repos-mdn-content.mjs @@ -1,10 +1,9 @@ // @ts-check -"use strict"; - -const { join } = require("node:path").posix; -const test = require("ava").default; -const { lintTestRepo } = require("./markdownlint-test-repos"); +import path from "node:path"; +const { join } = path.posix; +import test from "ava"; +import { lintTestRepo } from "./markdownlint-test-repos.mjs"; test("https://github.com/mdn/content", (t) => { const rootDir = "./test-repos/mdn-content"; diff --git a/test/markdownlint-test-repos-small.js b/test/markdownlint-test-repos-small.mjs similarity index 94% rename from test/markdownlint-test-repos-small.js rename to test/markdownlint-test-repos-small.mjs index 812a39799..541654efe 100644 --- a/test/markdownlint-test-repos-small.js +++ b/test/markdownlint-test-repos-small.mjs @@ -1,10 +1,9 @@ // @ts-check -"use strict"; - -const { join } = require("node:path").posix; -const test = require("ava").default; -const { excludeGlobs, lintTestRepo } = require("./markdownlint-test-repos"); +import path from "node:path"; +const { join } = path.posix; +import test from "ava"; +import { excludeGlobs, lintTestRepo } from "./markdownlint-test-repos.mjs"; // Run markdownlint the same way the corresponding repositories do diff --git a/test/markdownlint-test-repos.js b/test/markdownlint-test-repos.mjs similarity index 75% rename from test/markdownlint-test-repos.js rename to test/markdownlint-test-repos.mjs index 7c8143311..1ff5bc39a 100644 --- a/test/markdownlint-test-repos.js +++ b/test/markdownlint-test-repos.mjs @@ -1,12 +1,13 @@ // @ts-check -"use strict"; - -const { join } = require("node:path").posix; -const jsoncParser = require("jsonc-parser"); -const jsYaml = require("js-yaml"); -const { markdownlint, readConfig } = require("../lib/markdownlint").promises; -const markdownlintParallel = require("./markdownlint-test-parallel"); +import path from "node:path"; +const { join } = path.posix; +import { globby } from "globby"; +import jsoncParser from "jsonc-parser"; +import jsYaml from "js-yaml"; +import library from "../lib/markdownlint.mjs"; +const { markdownlint, readConfig } = library.promises; +import { markdownlintParallel } from "./markdownlint-test-parallel.mjs"; /** * Lints a test repository. @@ -17,9 +18,8 @@ const markdownlintParallel = require("./markdownlint-test-parallel"); * @param {boolean} [parallel] True to lint in parallel. * @returns {Promise} Test result. */ -async function lintTestRepo(t, globPatterns, configPath, parallel) { +export function lintTestRepo(t, globPatterns, configPath, parallel) { t.plan(1); - const { globby } = await import("globby"); const jsoncParse = (json) => { const config = jsoncParser.parse(json, [], { "allowTrailingComma": true }); return config.config || config; @@ -59,11 +59,6 @@ async function lintTestRepo(t, globPatterns, configPath, parallel) { * @param {...string} globs Globs to exclude. * @returns {string[]} Array of excluded globs. */ -function excludeGlobs(rootDir, ...globs) { +export function excludeGlobs(rootDir, ...globs) { return globs.map((glob) => "!" + join(rootDir, glob)); } - -module.exports = { - excludeGlobs, - lintTestRepo -}; diff --git a/test/markdownlint-test-result-object.js b/test/markdownlint-test-result-object.mjs similarity index 98% rename from test/markdownlint-test-result-object.js rename to test/markdownlint-test-result-object.mjs index 7118f431b..3f4b549df 100644 --- a/test/markdownlint-test-result-object.js +++ b/test/markdownlint-test-result-object.mjs @@ -1,12 +1,10 @@ // @ts-check -"use strict"; - -const test = require("ava").default; -const packageJson = require("../package.json"); -const markdownlint = require("../lib/markdownlint"); -const homepage = packageJson.homepage; -const version = packageJson.version; +import test from "ava"; +import markdownlint from "../lib/markdownlint.mjs"; +import { importWithTypeJson } from "./esm-helpers.mjs"; +const packageJson = await importWithTypeJson(import.meta, "../package.json"); +const { homepage, version } = packageJson; test("resultObjectToStringNotEnumerable", (t) => new Promise((resolve) => { t.plan(2); diff --git a/test/markdownlint-test-scenarios.js b/test/markdownlint-test-scenarios.mjs similarity index 88% rename from test/markdownlint-test-scenarios.js rename to test/markdownlint-test-scenarios.mjs index ae563db57..76f60f870 100644 --- a/test/markdownlint-test-scenarios.js +++ b/test/markdownlint-test-scenarios.mjs @@ -1,15 +1,13 @@ // @ts-check -"use strict"; - -const fs = require("node:fs").promises; -const path = require("node:path"); -const test = require("ava").default; -const libMarkdownlint = require("../lib/markdownlint"); +import fs from "node:fs/promises"; +import path from "node:path"; +import test from "ava"; +import libMarkdownlint from "../lib/markdownlint.mjs"; const { applyFixes, promises } = libMarkdownlint; const { markdownlint } = promises; -const helpers = require("../helpers"); -const constants = require("../lib/constants"); +import helpers from "../helpers/helpers.cjs"; +import { fixableRuleNames } from "../lib/constants.mjs"; const numericalSortCompareFn = (a, b) => a - b; @@ -75,7 +73,7 @@ function createTestForFile(file) { indices.push(error.lineNumber); } t.true( - !error.fixInfo || constants.fixableRuleNames.includes(rule), + !error.fixInfo || fixableRuleNames.includes(rule), `Fixable rule ${rule} is not tagged as such.` ); } @@ -104,9 +102,8 @@ function createTestForFile(file) { ); } -const files = require("node:fs") - .readdirSync("./test") - .filter((file) => /\.md$/.test(file)); +const dir = await fs.readdir("./test"); +const files = dir.filter((file) => /\.md$/.test(file)); for (const file of files) { // @ts-ignore test( diff --git a/test/markdownlint-test-worker.js b/test/markdownlint-test-worker.js deleted file mode 100644 index 5ddee358f..000000000 --- a/test/markdownlint-test-worker.js +++ /dev/null @@ -1,16 +0,0 @@ -// @ts-check - -"use strict"; - -const { parentPort, workerData } = require("node:worker_threads"); -const markdownlint = require("../lib/markdownlint").promises.markdownlint; - -// eslint-disable-next-line unicorn/prefer-top-level-await -markdownlint(workerData).then((lintResults) => { - // @ts-ignore - parentPort - // eslint-disable-next-line unicorn/require-post-message-target-origin - .postMessage(lintResults); - // eslint-disable-next-line n/no-process-exit - process.exit(); -}); diff --git a/test/markdownlint-test-worker.mjs b/test/markdownlint-test-worker.mjs new file mode 100644 index 000000000..a2c7a9db1 --- /dev/null +++ b/test/markdownlint-test-worker.mjs @@ -0,0 +1,13 @@ +// @ts-check + +import { parentPort, workerData } from "node:worker_threads"; +import library from "../lib/markdownlint.mjs"; +const { markdownlint } = library.promises; + +const lintResults = await markdownlint(workerData); +// @ts-ignore +parentPort + // eslint-disable-next-line unicorn/require-post-message-target-origin + .postMessage(lintResults); +// eslint-disable-next-line n/no-process-exit +process.exit(); diff --git a/test/markdownlint-test.js b/test/markdownlint-test.mjs similarity index 93% rename from test/markdownlint-test.js rename to test/markdownlint-test.mjs index df907687a..99431b90b 100644 --- a/test/markdownlint-test.js +++ b/test/markdownlint-test.mjs @@ -1,24 +1,26 @@ // @ts-check -"use strict"; - -const fs = require("node:fs"); -const path = require("node:path"); -const Ajv = require("ajv"); -const jsoncParser = require("jsonc-parser"); -const jsYaml = require("js-yaml"); -const md = require("markdown-it")(); -const pluginInline = require("markdown-it-for-inline"); -const pluginSub = require("markdown-it-sub"); -const pluginSup = require("markdown-it-sup"); -const test = require("ava").default; -const { "exports": packageExports, homepage, name, version } = require("../package.json"); -const markdownlint = require("../lib/markdownlint"); -const constants = require("../lib/constants"); -const rules = require("../lib/rules"); -const customRules = require("./rules/rules.js"); -const configSchema = require("../schema/markdownlint-config-schema.json"); -const configSchemaStrict = require("../schema/markdownlint-config-schema-strict.json"); +import fs from "node:fs"; +import { createRequire } from "node:module"; +const require = createRequire(import.meta.url); +import path from "node:path"; +import Ajv from "ajv"; +import { globby } from "globby"; +import jsoncParser from "jsonc-parser"; +import jsYaml from "js-yaml"; +import markdownIt from "markdown-it"; +import pluginInline from "markdown-it-for-inline"; +import pluginSub from "markdown-it-sub"; +import pluginSup from "markdown-it-sup"; +import test from "ava"; +import markdownlint from "../lib/markdownlint.mjs"; +import * as constants from "../lib/constants.mjs"; +import rules from "../lib/rules.mjs"; +import customRules from "./rules/rules.cjs"; +import { __dirname, importWithTypeJson } from "./esm-helpers.mjs"; +const packageJson = await importWithTypeJson(import.meta, "../package.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 deprecatedRuleNames = new Set(constants.deprecatedRuleNames); const ajvOptions = { @@ -82,7 +84,7 @@ test("projectFiles", (t) => { return import("globby") .then((module) => module.globby(projectFiles)) .then((files) => { - t.is(files.length, 61); + t.is(files.length, 60); const options = { files, "config": require("../.markdownlint.json") @@ -109,7 +111,7 @@ test("projectFilesExtendedAscii", (t) => { "!doc/md036.md" ])) .then((files) => { - t.is(files.length, 57); + t.is(files.length, 56); const options = { files, "config": require("../.markdownlint.json"), @@ -450,7 +452,7 @@ test("styleFiles", async(t) => { t.truthy(require(path.join("../style", file)), "Unable to load/parse."); const exportValue = `./style/${file}`; const exportKey = exportValue.replace(/\.json$/, ""); - t.is(packageExports[exportKey], exportValue); + t.is(packageJson.exports[exportKey], exportValue); } }); @@ -884,7 +886,7 @@ test("readme", async(t) => { let seenTags = false; let inTags = false; // @ts-ignore - for (const token of md.parse(contents, {})) { + for (const token of markdownIt().parse(contents, {})) { if ( (token.type === "bullet_list_open") && (token.level === 0) @@ -954,7 +956,6 @@ test("validateJsonUsingConfigSchemaStrict", async(t) => { "test/invalid-ul-style-style.md", "test/wrong-types-in-config-file.md" ]); - const { globby } = await import("globby"); const files = await globby([ "*.md", "doc/*.md", @@ -1035,14 +1036,14 @@ test("validateConfigExampleJson", (t) => { const validateSchema = ajv.compile(configSchema); t.is( configSchema.$id.replace(/^.*\/v(?\d+\.\d+\.\d+)\/.*$/u, "$"), - version + packageJson.version ); t.is(configSchema.$id, configSchema.properties.$schema.default); // Validate JSONC const fileJson = ".markdownlint.jsonc"; const dataJson = fs.readFileSync( - path.join(__dirname, "../schema", fileJson), + path.join(__dirname(import.meta), "../schema", fileJson), "utf8" ); const jsonObject = jsoncParser.parse(dataJson); @@ -1055,7 +1056,7 @@ test("validateConfigExampleJson", (t) => { // Validate YAML const fileYaml = ".markdownlint.yaml"; const dataYaml = fs.readFileSync( - path.join(__dirname, "../schema", fileYaml), + path.join(__dirname(import.meta), "../schema", fileYaml), "utf8" ); const yamlObject = jsYaml.load(dataYaml); @@ -1074,7 +1075,7 @@ test("allBuiltInRulesHaveValidUrl", (t) => { t.is( // @ts-ignore rule.information.href, - `${homepage}/blob/v${version}/doc/${ruleName}.md` + `${packageJson.homepage}/blob/v${packageJson.version}/doc/${ruleName}.md` ); } }); @@ -1087,12 +1088,12 @@ test("someCustomRulesHaveValidUrl", (t) => { if (rule === customRules.anyBlockquote) { t.is( rule.information?.href, - `${homepage}/blob/main/test/rules/any-blockquote.js` + `${packageJson.homepage}/blob/main/test/rules/any-blockquote.js` ); } else if (rule === customRules.lettersEX) { t.is( rule.information?.href, - `${homepage}/blob/main/test/rules/letters-E-X.js` + `${packageJson.homepage}/blob/main/test/rules/letters-E-X.js` ); } } @@ -1205,8 +1206,7 @@ Text with: [^footnote] test("token-map-spans", (t) => { t.plan(38); - // eslint-disable-next-line jsdoc/valid-types - /** @type import("../lib/markdownlint").Options */ + /** @type {import("../lib/markdownlint.mjs").Options} */ const options = { "customRules": [ { @@ -1351,21 +1351,21 @@ test("configParsersTOML", async(t) => { test("getVersion", (t) => { t.plan(1); const actual = markdownlint.getVersion(); - const expected = version; + const expected = packageJson.version; t.is(actual, expected, "Version string not correct."); }); test("constants", (t) => { t.plan(2); // @ts-ignore - t.is(constants.homepage, homepage); + t.is(constants.homepage, packageJson.homepage); // @ts-ignore - t.is(constants.version, version); + t.is(constants.version, packageJson.version); }); const exportMappings = new Map([ - [ ".", "../lib/markdownlint.js" ], - [ "./helpers", "../helpers/helpers.js" ], + [ ".", "../lib/markdownlint.mjs" ], + [ "./helpers", "../helpers/helpers.cjs" ], [ "./style/all", "../style/all.json" ], [ "./style/cirosantilli", "../style/cirosantilli.json" ], [ "./style/prettier", "../style/prettier.json" ], @@ -1374,16 +1374,22 @@ const exportMappings = new Map([ test("exportMappings", (t) => { t.deepEqual( - Object.keys(packageExports), + Object.keys(packageJson.exports), [ ...exportMappings.keys() ] ); }); +// const commonJsRe = /\.js$/u; +const jsonRe = /\.json$/u; +const importOptionsJson = { "with": { "type": "json" } }; + for (const [ exportName, exportPath ] of exportMappings) { - test(exportName, (t) => { - t.is( - require(exportName.replace(/^\./u, name)), - require(exportPath) - ); + test(exportName, async(t) => { + // const commonJs = !commonJsRe.test(exportPath); + const json = jsonRe.test(exportPath); + const importOptions = json ? importOptionsJson : undefined; + const importExportName = await import(exportName.replace(/^\./u, packageJson.name), importOptions); + const importExportPath = await import(exportPath, importOptions); + t.is(importExportName, importExportPath); }); } diff --git a/test/profile-fixture.mjs b/test/profile-fixture.mjs index 9dbad7b7b..ca191235d 100644 --- a/test/profile-fixture.mjs +++ b/test/profile-fixture.mjs @@ -1,5 +1,5 @@ import { readFile } from "node:fs/promises"; -import library from "../lib/markdownlint.js"; +import library from "../lib/markdownlint.mjs"; const markdownlint = library.promises.markdownlint; const strings = { diff --git a/test/rules/any-blockquote.js b/test/rules/any-blockquote.cjs similarity index 96% rename from test/rules/any-blockquote.js rename to test/rules/any-blockquote.cjs index 0362242a8..f1b16085f 100644 --- a/test/rules/any-blockquote.js +++ b/test/rules/any-blockquote.cjs @@ -2,7 +2,7 @@ "use strict"; -/** @type import("../../lib/markdownlint").Rule[] */ +/** @type {import("../../lib/markdownlint.mjs").Rule[]} */ module.exports = [ // micromark parser (preferred) diff --git a/test/rules/every-n-lines.js b/test/rules/every-n-lines.cjs similarity index 88% rename from test/rules/every-n-lines.js rename to test/rules/every-n-lines.cjs index 337ad5518..5f579f61d 100644 --- a/test/rules/every-n-lines.js +++ b/test/rules/every-n-lines.cjs @@ -2,7 +2,7 @@ "use strict"; -/** @type import("../../lib/markdownlint").Rule */ +/** @type {import("../../lib/markdownlint.mjs").Rule} */ module.exports = { "names": [ "every-n-lines" ], "description": "Rule that reports an error every N lines", diff --git a/test/rules/first-line.js b/test/rules/first-line.cjs similarity index 85% rename from test/rules/first-line.js rename to test/rules/first-line.cjs index e80e2aa64..8b979d16e 100644 --- a/test/rules/first-line.js +++ b/test/rules/first-line.cjs @@ -2,7 +2,7 @@ "use strict"; -/** @type import("../../lib/markdownlint").Rule */ +/** @type {import("../../lib/markdownlint.mjs").Rule} */ module.exports = { "names": [ "first-line" ], "description": "Rule that reports an error for the first line", diff --git a/test/rules/letters-E-X.js b/test/rules/letters-E-X.cjs similarity index 93% rename from test/rules/letters-E-X.js rename to test/rules/letters-E-X.cjs index d6b6b339d..45733d6f4 100644 --- a/test/rules/letters-E-X.js +++ b/test/rules/letters-E-X.cjs @@ -2,7 +2,7 @@ "use strict"; -/** @type import("../../lib/markdownlint").Rule */ +/** @type {import("../../lib/markdownlint.mjs").Rule} */ module.exports = { "names": [ "letters-E-X", "letter-E-letter-X", "contains-ex" ], "description": "Rule that reports an error for lines with the letters 'EX'", diff --git a/test/rules/lint-javascript.js b/test/rules/lint-javascript.cjs similarity index 94% rename from test/rules/lint-javascript.js rename to test/rules/lint-javascript.cjs index 9a10812d7..911c78f7a 100644 --- a/test/rules/lint-javascript.js +++ b/test/rules/lint-javascript.cjs @@ -7,7 +7,7 @@ const eslint = require("eslint"); const linter = new eslint.Linter(); const languageJavaScript = /js|javascript/i; -/** @type import("../../lib/markdownlint").Rule */ +/** @type {import("../../lib/markdownlint.mjs").Rule} */ module.exports = { "names": [ "lint-javascript" ], "description": "Rule that lints JavaScript code", diff --git a/test/rules/npm/package.json b/test/rules/npm/package.json index bbbf5eefb..d7a764ea8 100644 --- a/test/rules/npm/package.json +++ b/test/rules/npm/package.json @@ -2,6 +2,7 @@ "name": "markdownlint-rule-sample", "version": "0.0.1", "description": "Package for markdownlint custom rule sample", + "type": "commonjs", "main": "sample-rule.js", "author": "David Anson (https://dlaa.me/)", "homepage": "https://github.com/DavidAnson/markdownlint", diff --git a/test/rules/npm/sample-rule.js b/test/rules/npm/sample-rule.js index 56681ddd0..f15bd322a 100644 --- a/test/rules/npm/sample-rule.js +++ b/test/rules/npm/sample-rule.js @@ -2,7 +2,7 @@ "use strict"; -/** @type import("../../../lib/markdownlint").Rule */ +/** @type {import("../../../lib/markdownlint.mjs").Rule} */ module.exports = { "names": [ "sample-rule" ], "description": "Sample rule", diff --git a/test/rules/rules.js b/test/rules/rules.cjs similarity index 57% rename from test/rules/rules.js rename to test/rules/rules.cjs index 6b7650d2f..b344b63b7 100644 --- a/test/rules/rules.js +++ b/test/rules/rules.cjs @@ -2,22 +2,22 @@ "use strict"; -const anyBlockquote = require("./any-blockquote"); +const anyBlockquote = require("./any-blockquote.cjs"); module.exports.anyBlockquote = anyBlockquote[1]; -const everyNLines = require("./every-n-lines"); +const everyNLines = require("./every-n-lines.cjs"); module.exports.everyNLines = everyNLines; -const firstLine = require("./first-line"); +const firstLine = require("./first-line.cjs"); module.exports.firstLine = firstLine; -const lettersEX = require("./letters-E-X"); +const lettersEX = require("./letters-E-X.cjs"); module.exports.lettersEX = lettersEX; -const lintJavaScript = require("./lint-javascript"); +const lintJavaScript = require("./lint-javascript.cjs"); module.exports.lintJavaScript = lintJavaScript; -const validateJson = require("./validate-json"); +const validateJson = require("./validate-json.cjs"); module.exports.validateJson = validateJson; module.exports.all = [ diff --git a/test/rules/validate-json.js b/test/rules/validate-json.cjs similarity index 94% rename from test/rules/validate-json.js rename to test/rules/validate-json.cjs index 4a88e1ad6..11c8ed7b2 100644 --- a/test/rules/validate-json.js +++ b/test/rules/validate-json.cjs @@ -4,7 +4,7 @@ const { parse, printParseErrorCode } = require("jsonc-parser"); -/** @type import("../../lib/markdownlint").Rule */ +/** @type {import("../../lib/markdownlint.mjs").Rule} */ module.exports = { "names": [ "validate-json" ], "description": "Rule that validates JSON code", diff --git a/test/snapshots/markdownlint-test-custom-rules.js.md b/test/snapshots/markdownlint-test-custom-rules.mjs.md similarity index 99% rename from test/snapshots/markdownlint-test-custom-rules.js.md rename to test/snapshots/markdownlint-test-custom-rules.mjs.md index 32e2c57c7..abf7e9ea5 100644 --- a/test/snapshots/markdownlint-test-custom-rules.js.md +++ b/test/snapshots/markdownlint-test-custom-rules.mjs.md @@ -1,6 +1,6 @@ -# Snapshot report for `test/markdownlint-test-custom-rules.js` +# Snapshot report for `test/markdownlint-test-custom-rules.mjs` -The actual snapshot is saved in `markdownlint-test-custom-rules.js.snap`. +The actual snapshot is saved in `markdownlint-test-custom-rules.mjs.snap`. Generated by [AVA](https://avajs.dev). diff --git a/test/snapshots/markdownlint-test-custom-rules.js.snap b/test/snapshots/markdownlint-test-custom-rules.mjs.snap similarity index 100% rename from test/snapshots/markdownlint-test-custom-rules.js.snap rename to test/snapshots/markdownlint-test-custom-rules.mjs.snap diff --git a/test/snapshots/markdownlint-test-repos-dotnet-docs.js.md b/test/snapshots/markdownlint-test-repos-dotnet-docs.mjs.md similarity index 98% rename from test/snapshots/markdownlint-test-repos-dotnet-docs.js.md rename to test/snapshots/markdownlint-test-repos-dotnet-docs.mjs.md index 79b115789..98553d4b6 100644 --- a/test/snapshots/markdownlint-test-repos-dotnet-docs.js.md +++ b/test/snapshots/markdownlint-test-repos-dotnet-docs.mjs.md @@ -1,6 +1,6 @@ -# Snapshot report for `test/markdownlint-test-repos-dotnet-docs.js` +# Snapshot report for `test/markdownlint-test-repos-dotnet-docs.mjs` -The actual snapshot is saved in `markdownlint-test-repos-dotnet-docs.js.snap`. +The actual snapshot is saved in `markdownlint-test-repos-dotnet-docs.mjs.snap`. Generated by [AVA](https://avajs.dev). diff --git a/test/snapshots/markdownlint-test-repos-dotnet-docs.js.snap b/test/snapshots/markdownlint-test-repos-dotnet-docs.mjs.snap similarity index 100% rename from test/snapshots/markdownlint-test-repos-dotnet-docs.js.snap rename to test/snapshots/markdownlint-test-repos-dotnet-docs.mjs.snap diff --git a/test/snapshots/markdownlint-test-repos-mdn-content.js.md b/test/snapshots/markdownlint-test-repos-mdn-content.mjs.md similarity index 92% rename from test/snapshots/markdownlint-test-repos-mdn-content.js.md rename to test/snapshots/markdownlint-test-repos-mdn-content.mjs.md index 61c39483d..ce511ed6e 100644 --- a/test/snapshots/markdownlint-test-repos-mdn-content.js.md +++ b/test/snapshots/markdownlint-test-repos-mdn-content.mjs.md @@ -1,6 +1,6 @@ -# Snapshot report for `test/markdownlint-test-repos-mdn-content.js` +# Snapshot report for `test/markdownlint-test-repos-mdn-content.mjs` -The actual snapshot is saved in `markdownlint-test-repos-mdn-content.js.snap`. +The actual snapshot is saved in `markdownlint-test-repos-mdn-content.mjs.snap`. Generated by [AVA](https://avajs.dev). diff --git a/test/snapshots/markdownlint-test-repos-mdn-content.js.snap b/test/snapshots/markdownlint-test-repos-mdn-content.mjs.snap similarity index 100% rename from test/snapshots/markdownlint-test-repos-mdn-content.js.snap rename to test/snapshots/markdownlint-test-repos-mdn-content.mjs.snap diff --git a/test/snapshots/markdownlint-test-repos-small.js.md b/test/snapshots/markdownlint-test-repos-small.mjs.md similarity index 99% rename from test/snapshots/markdownlint-test-repos-small.js.md rename to test/snapshots/markdownlint-test-repos-small.mjs.md index 11feae1bf..d2ec5a21f 100644 --- a/test/snapshots/markdownlint-test-repos-small.js.md +++ b/test/snapshots/markdownlint-test-repos-small.mjs.md @@ -1,6 +1,6 @@ -# Snapshot report for `test/markdownlint-test-repos-small.js` +# Snapshot report for `test/markdownlint-test-repos-small.mjs` -The actual snapshot is saved in `markdownlint-test-repos-small.js.snap`. +The actual snapshot is saved in `markdownlint-test-repos-small.mjs.snap`. Generated by [AVA](https://avajs.dev). diff --git a/test/snapshots/markdownlint-test-repos-small.js.snap b/test/snapshots/markdownlint-test-repos-small.mjs.snap similarity index 100% rename from test/snapshots/markdownlint-test-repos-small.js.snap rename to test/snapshots/markdownlint-test-repos-small.mjs.snap diff --git a/test/snapshots/markdownlint-test-scenarios.js.md b/test/snapshots/markdownlint-test-scenarios.mjs.md similarity index 99% rename from test/snapshots/markdownlint-test-scenarios.js.md rename to test/snapshots/markdownlint-test-scenarios.mjs.md index 6d3649651..bc383b6e3 100644 --- a/test/snapshots/markdownlint-test-scenarios.js.md +++ b/test/snapshots/markdownlint-test-scenarios.mjs.md @@ -1,6 +1,6 @@ -# Snapshot report for `test/markdownlint-test-scenarios.js` +# Snapshot report for `test/markdownlint-test-scenarios.mjs` -The actual snapshot is saved in `markdownlint-test-scenarios.js.snap`. +The actual snapshot is saved in `markdownlint-test-scenarios.mjs.snap`. Generated by [AVA](https://avajs.dev). diff --git a/test/snapshots/markdownlint-test-scenarios.js.snap b/test/snapshots/markdownlint-test-scenarios.mjs.snap similarity index 100% rename from test/snapshots/markdownlint-test-scenarios.js.snap rename to test/snapshots/markdownlint-test-scenarios.mjs.snap From 3599f694bab3d14ae56fd0f1f49e5afd4a2a05b0 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sat, 30 Nov 2024 20:42:14 -0800 Subject: [PATCH 35/64] Move micromark-parse.mjs from helpers to library, remove all dependencies from helpers. --- helpers/package.json | 8 -------- lib/markdownlint.mjs | 2 +- lib/md044.mjs | 2 +- {helpers => lib}/micromark-parse.mjs | 4 ++-- {helpers => lib}/micromark-types.d.mts | 0 test/harness.mjs | 2 +- test/markdownlint-test-micromark.mjs | 2 +- 7 files changed, 6 insertions(+), 14 deletions(-) rename {helpers => lib}/micromark-parse.mjs (98%) rename {helpers => lib}/micromark-types.d.mts (100%) diff --git a/helpers/package.json b/helpers/package.json index e047d252e..60c19c812 100644 --- a/helpers/package.json +++ b/helpers/package.json @@ -19,14 +19,6 @@ "engines": { "node": ">=18" }, - "dependencies": { - "micromark": "4.0.0", - "micromark-extension-directive": "3.0.2", - "micromark-extension-gfm-autolink-literal": "2.1.0", - "micromark-extension-gfm-footnote": "2.1.0", - "micromark-extension-gfm-table": "2.1.0", - "micromark-extension-math": "3.1.0" - }, "keywords": [ "markdownlint", "markdownlint-rule" diff --git a/lib/markdownlint.mjs b/lib/markdownlint.mjs index 9e2d505b5..a98846b02 100644 --- a/lib/markdownlint.mjs +++ b/lib/markdownlint.mjs @@ -9,7 +9,7 @@ import { promisify } from "node:util"; import { initialize as cacheInitialize } from "./cache.mjs"; import { version } from "./constants.mjs"; import rules from "./rules.mjs"; -import { parse as micromarkParse } from "../helpers/micromark-parse.mjs"; +import { parse as micromarkParse } from "./micromark-parse.mjs"; import * as helpers from "../helpers/helpers.cjs"; /** diff --git a/lib/md044.mjs b/lib/md044.mjs index 19001a249..de8b6432d 100644 --- a/lib/md044.mjs +++ b/lib/md044.mjs @@ -2,7 +2,7 @@ import { addErrorDetailIf, escapeForRegExp, hasOverlap } from "../helpers/helpers.cjs"; import { filterByPredicate, filterByTypes } from "../helpers/micromark-helpers.cjs"; -import { parse } from "../helpers/micromark-parse.mjs"; +import { parse } from "./micromark-parse.mjs"; const ignoredChildTypes = new Set( [ "codeFencedFence", "definition", "reference", "resource" ] diff --git a/helpers/micromark-parse.mjs b/lib/micromark-parse.mjs similarity index 98% rename from helpers/micromark-parse.mjs rename to lib/micromark-parse.mjs index 27eedfb45..afa496405 100644 --- a/helpers/micromark-parse.mjs +++ b/lib/micromark-parse.mjs @@ -9,8 +9,8 @@ import { parse as micromarkParse, postprocess as micromarkPostprocess, preproces // micromark-core-commonmark is not a dependency because this instance must match what's used by micromark // eslint-disable-next-line n/no-extraneous-import import { labelEnd } from "micromark-core-commonmark"; -import { isHtmlFlowComment } from "./micromark-helpers.cjs"; -import { flatTokensSymbol, htmlFlowSymbol, newLineRe } from "./shared.cjs"; +import { isHtmlFlowComment } from "../helpers/micromark-helpers.cjs"; +import { flatTokensSymbol, htmlFlowSymbol, newLineRe } from "../helpers/shared.cjs"; /** @typedef {import("micromark-util-types").Event} Event */ /** @typedef {import("micromark-util-types").ParseOptions} MicromarkParseOptions */ diff --git a/helpers/micromark-types.d.mts b/lib/micromark-types.d.mts similarity index 100% rename from helpers/micromark-types.d.mts rename to lib/micromark-types.d.mts diff --git a/test/harness.mjs b/test/harness.mjs index 65fe54d4e..e9eebe423 100644 --- a/test/harness.mjs +++ b/test/harness.mjs @@ -1,5 +1,5 @@ import { readFile } from "node:fs/promises"; -import { parse } from "../helpers/micromark-parse.mjs"; +import { parse } from "../lib/micromark-parse.mjs"; import library from "../lib/markdownlint.mjs"; const markdownlint = library.promises.markdownlint; diff --git a/test/markdownlint-test-micromark.mjs b/test/markdownlint-test-micromark.mjs index fa44360cd..7810128f8 100644 --- a/test/markdownlint-test-micromark.mjs +++ b/test/markdownlint-test-micromark.mjs @@ -4,7 +4,7 @@ import fs from "node:fs/promises"; import test from "ava"; import { newLineRe } from "../helpers/helpers.cjs"; import { filterByPredicate, filterByTypes } from "../helpers/micromark-helpers.cjs"; -import { getEvents, parse } from "../helpers/micromark-parse.mjs"; +import { getEvents, parse } from "../lib/micromark-parse.mjs"; const testContent = new Promise((resolve, reject) => { fs From 789190962c235628becf15a9594811388b651758 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sat, 30 Nov 2024 21:44:37 -0800 Subject: [PATCH 36/64] Remove import of node:util and manually implement promisify (improves browser scenario), improve JSDoc typing. --- README.md | 2 +- demo/webpack.config.mjs | 1 - lib/markdownlint.d.mts | 10 +++---- lib/markdownlint.mjs | 48 ++++++++++++++++++++----------- test/markdownlint-test-config.mjs | 26 ++++++++++++++++- 5 files changed, 62 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index b7d7ba1c2..16a85eac0 100644 --- a/README.md +++ b/README.md @@ -676,7 +676,7 @@ Asynchronous API: * Read specified configuration file. * * @param {string} file Configuration file name. - * @param {ConfigurationParser[] | ReadConfigCallback} parsers Parsing function. + * @param {ConfigurationParser[] | ReadConfigCallback} [parsers] Parsing function(s). * @param {Object} [fs] File system implementation. * @param {ReadConfigCallback} [callback] Callback (err, result) function. * @returns {void} diff --git a/demo/webpack.config.mjs b/demo/webpack.config.mjs index 2b6d931a3..d3edca6d1 100644 --- a/demo/webpack.config.mjs +++ b/demo/webpack.config.mjs @@ -54,7 +54,6 @@ function config(options) { "fs": false, "os": false, "path": false, - "util": false, "module": require.resolve("./module-stub.cjs") } } diff --git a/lib/markdownlint.d.mts b/lib/markdownlint.d.mts index 55b425110..900f2be3f 100644 --- a/lib/markdownlint.d.mts +++ b/lib/markdownlint.d.mts @@ -463,13 +463,13 @@ declare function markdownlintSync(options: Options | null): LintResults; * Read specified configuration file. * * @param {string} file Configuration file name. - * @param {ConfigurationParser[] | ReadConfigCallback} parsers Parsing + * @param {ConfigurationParser[] | ReadConfigCallback} [parsers] Parsing * function(s). * @param {Object} [fs] File system implementation. * @param {ReadConfigCallback} [callback] Callback (err, result) function. * @returns {void} */ -declare function readConfig(file: string, parsers: ConfigurationParser[] | ReadConfigCallback, fs?: any, callback?: ReadConfigCallback): void; +declare function readConfig(file: string, parsers?: ConfigurationParser[] | ReadConfigCallback, fs?: any, callback?: ReadConfigCallback): void; /** * Read specified configuration file synchronously. * @@ -498,11 +498,11 @@ declare function markdownlintPromise(options: Options): Promise; * * @param {Configuration} config Configuration object. * @param {string} file Configuration file name. - * @param {ConfigurationParser[]} [parsers] Parsing function(s). - * @param {Object} [fs] File system implementation. + * @param {ConfigurationParser[] | undefined} parsers Parsing function(s). + * @param {Object} fs File system implementation. * @returns {Promise} Configuration object. */ -declare function extendConfigPromise(config: Configuration, file: string, parsers?: ConfigurationParser[], fs?: any): Promise; +declare function extendConfigPromise(config: Configuration, file: string, parsers: ConfigurationParser[] | undefined, fs: any): Promise; /** * Read specified configuration file. * diff --git a/lib/markdownlint.mjs b/lib/markdownlint.mjs index a98846b02..a40cb8497 100644 --- a/lib/markdownlint.mjs +++ b/lib/markdownlint.mjs @@ -5,7 +5,6 @@ import { createRequire } from "node:module"; const dynamicRequire = createRequire(import.meta.url); import * as os from "node:os"; import path from "node:path"; -import { promisify } from "node:util"; import { initialize as cacheInitialize } from "./cache.mjs"; import { version } from "./constants.mjs"; import rules from "./rules.mjs"; @@ -959,8 +958,6 @@ function markdownlint(options, callback) { return lintInput(options, false, callback); } -const markdownlintPromisify = promisify && promisify(markdownlint); - /** * Lint specified Markdown files. * @@ -968,8 +965,15 @@ const markdownlintPromisify = promisify && promisify(markdownlint); * @returns {Promise} Results object. */ function markdownlintPromise(options) { - // @ts-ignore - return markdownlintPromisify(options); + return new Promise((resolve, reject) => { + markdownlint(options, (error, results) => { + if (error || !results) { + reject(error); + } else { + resolve(results); + } + }); + }); } /** @@ -1054,7 +1058,7 @@ function resolveConfigExtendsSync(configFile, referenceId, fs) { * * @param {Configuration} config Configuration object. * @param {string} file Configuration file name. - * @param {ConfigurationParser[]} parsers Parsing + * @param {ConfigurationParser[] | undefined} parsers Parsing * function(s). * @param {Object} fs File system implementation. * @param {ReadConfigCallback} callback Callback (err, result) function. @@ -1090,27 +1094,32 @@ function extendConfig(config, file, parsers, fs, callback) { return callback(null, config); } -const extendConfigPromisify = promisify && promisify(extendConfig); - /** * Extend specified configuration object. * * @param {Configuration} config Configuration object. * @param {string} file Configuration file name. - * @param {ConfigurationParser[]} [parsers] Parsing function(s). - * @param {Object} [fs] File system implementation. + * @param {ConfigurationParser[] | undefined} parsers Parsing function(s). + * @param {Object} fs File system implementation. * @returns {Promise} Configuration object. */ function extendConfigPromise(config, file, parsers, fs) { - // @ts-ignore - return extendConfigPromisify(config, file, parsers, fs); + return new Promise((resolve, reject) => { + extendConfig(config, file, parsers, fs, (error, results) => { + if (error || !results) { + reject(error); + } else { + resolve(results); + } + }); + }); } /** * Read specified configuration file. * * @param {string} file Configuration file name. - * @param {ConfigurationParser[] | ReadConfigCallback} parsers Parsing + * @param {ConfigurationParser[] | ReadConfigCallback} [parsers] Parsing * function(s). * @param {Object} [fs] File system implementation. * @param {ReadConfigCallback} [callback] Callback (err, result) function. @@ -1151,8 +1160,6 @@ function readConfig(file, parsers, fs, callback) { }); } -const readConfigPromisify = promisify && promisify(readConfig); - /** * Read specified configuration file. * @@ -1162,8 +1169,15 @@ const readConfigPromisify = promisify && promisify(readConfig); * @returns {Promise} Configuration object. */ function readConfigPromise(file, parsers, fs) { - // @ts-ignore - return readConfigPromisify(file, parsers, fs); + return new Promise((resolve, reject) => { + readConfig(file, parsers, fs, (error, results) => { + if (error || !results) { + reject(error); + } else { + resolve(results); + } + }); + }); } /** diff --git a/test/markdownlint-test-config.mjs b/test/markdownlint-test-config.mjs index eb1308ec5..e421661f0 100644 --- a/test/markdownlint-test-config.mjs +++ b/test/markdownlint-test-config.mjs @@ -1,5 +1,6 @@ // @ts-check +import fs from "node:fs"; import { createRequire } from "node:module"; const require = createRequire(import.meta.url); import os from "node:os"; @@ -516,7 +517,10 @@ test("extendSinglePromise", (t) => new Promise((resolve) => { t.plan(1); const expected = require("./config/config-child.json"); markdownlint.promises.extendConfig( - expected, "./test/config/config-child.json" + expected, + "./test/config/config-child.json", + undefined, + fs ) .then((actual) => { t.deepEqual(actual, expected, "Config object not correct."); @@ -524,6 +528,26 @@ test("extendSinglePromise", (t) => new Promise((resolve) => { }); })); +test("extendBadPromise", (t) => new Promise((resolve) => { + t.plan(2); + markdownlint.promises.extendConfig( + { + "extends": "missing.json" + }, + "./test/config/missing.json", + undefined, + fs + ) + .then( + null, + (error) => { + t.truthy(error, "Did not get an error for bad input."); + t.true(error instanceof Error, "Error not instance of Error."); + resolve(); + } + ); +})); + test("extendCustomFileSystemPromise", (t) => new Promise((resolve) => { t.plan(4); const file = path.resolve("/dir/file.json"); From 8f66aafe2842ceec872eef99c67aef0a72f952de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 02:56:59 +0000 Subject: [PATCH 37/64] Bump micromark from 4.0.0 to 4.0.1 Bumps [micromark](https://github.com/micromark/micromark) from 4.0.0 to 4.0.1. - [Release notes](https://github.com/micromark/micromark/releases) - [Commits](https://github.com/micromark/micromark/compare/4.0.0...4.0.1) --- updated-dependencies: - dependency-name: micromark dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aabf26b61..b7a466a0d 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ }, "dependencies": { "markdown-it": "14.1.0", - "micromark": "4.0.0", + "micromark": "4.0.1", "micromark-extension-directive": "3.0.2", "micromark-extension-gfm-autolink-literal": "2.1.0", "micromark-extension-gfm-footnote": "2.1.0", From 4965ee84e4bc05f0ad5a87cfe3f0d4f355df1c5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 02:57:32 +0000 Subject: [PATCH 38/64] Bump micromark-util-types from 2.0.0 to 2.0.1 Bumps [micromark-util-types](https://github.com/micromark/micromark) from 2.0.0 to 2.0.1. - [Release notes](https://github.com/micromark/micromark/releases) - [Commits](https://github.com/micromark/micromark/compare/micromark-util-types@2.0.0...micromark-build@2.0.1) --- updated-dependencies: - dependency-name: micromark-util-types dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b7a466a0d..aaa9c8874 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "micromark-extension-gfm-footnote": "2.1.0", "micromark-extension-gfm-table": "2.1.0", "micromark-extension-math": "3.1.0", - "micromark-util-types": "2.0.0" + "micromark-util-types": "2.0.1" }, "devDependencies": { "@eslint/js": "9.15.0", From 69242b3aa64405b37b1a4c417ff8cfe81dc17809 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 02:57:23 +0000 Subject: [PATCH 39/64] Bump @eslint/js from 9.15.0 to 9.16.0 Bumps [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) from 9.15.0 to 9.16.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.16.0/packages/js) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aaa9c8874..6f272640d 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "micromark-util-types": "2.0.1" }, "devDependencies": { - "@eslint/js": "9.15.0", + "@eslint/js": "9.16.0", "@stylistic/eslint-plugin": "2.11.0", "ajv": "8.17.1", "ava": "6.2.0", From 853c142291584612e6cba75bf67a60b2ce96991b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 05:30:19 +0000 Subject: [PATCH 40/64] Bump eslint from 9.15.0 to 9.16.0 Bumps [eslint](https://github.com/eslint/eslint) from 9.15.0 to 9.16.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.15.0...v9.16.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6f272640d..e1103ed00 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "ava": "6.2.0", "c8": "10.1.2", "character-entities": "2.0.2", - "eslint": "9.15.0", + "eslint": "9.16.0", "eslint-plugin-jsdoc": "50.6.0", "eslint-plugin-n": "17.14.0", "eslint-plugin-regexp": "2.7.0", From e41f034befaeb73db2f004c1ae92b0a610da0105 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 02:07:14 +0000 Subject: [PATCH 41/64] Bump webpack from 5.96.1 to 5.97.0 Bumps [webpack](https://github.com/webpack/webpack) from 5.96.1 to 5.97.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.96.1...v5.97.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e1103ed00..ce1dad348 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "terser-webpack-plugin": "5.3.10", "toml": "3.0.0", "typescript": "5.7.2", - "webpack": "5.96.1", + "webpack": "5.97.0", "webpack-cli": "5.1.4" }, "keywords": [ From 8da43dd24691ea47cda7f0b9e6ad4d82db286071 Mon Sep 17 00:00:00 2001 From: David Anson Date: Tue, 3 Dec 2024 19:58:28 -0800 Subject: [PATCH 42/64] Update to use named exports via / /async /promise /sync, simplify references via self-referencing, refine examples. --- README.md | 76 +++++---- demo/browser-exports.mjs | 3 +- demo/default.js | 6 +- doc/CustomRules.md | 4 +- eslint.config.mjs | 2 +- example/Gruntfile.cjs | 4 +- example/gulpfile.cjs | 4 +- example/standalone.mjs | 59 ++++--- example/typescript/type-check.ts | 44 ++--- helpers/helpers.cjs | 13 +- helpers/micromark-helpers.cjs | 6 +- lib/cache.mjs | 6 +- lib/exports-async.d.mts | 1 + lib/exports-async.mjs | 3 + lib/exports-promise.d.mts | 1 + lib/exports-promise.mjs | 3 + lib/exports-sync.d.mts | 1 + lib/exports-sync.mjs | 3 + lib/exports.d.mts | 28 +++ lib/exports.mjs | 31 ++++ lib/markdownit.cjs | 4 +- lib/markdownlint.d.mts | 183 +++++++++----------- lib/markdownlint.mjs | 47 ++---- lib/md001.mjs | 2 +- lib/md003.mjs | 2 +- lib/md004.mjs | 4 +- lib/md005.mjs | 2 +- lib/md007.mjs | 4 +- lib/md009.mjs | 2 +- lib/md010.mjs | 4 +- lib/md011.mjs | 2 +- lib/md012.mjs | 2 +- lib/md013.mjs | 2 +- lib/md014.mjs | 2 +- lib/md018.mjs | 2 +- lib/md019-md021.mjs | 6 +- lib/md020.mjs | 2 +- lib/md022.mjs | 2 +- lib/md023.mjs | 2 +- lib/md024.mjs | 2 +- lib/md025.mjs | 2 +- lib/md026.mjs | 2 +- lib/md027.mjs | 2 +- lib/md028.mjs | 2 +- lib/md029.mjs | 4 +- lib/md030.mjs | 2 +- lib/md031.mjs | 4 +- lib/md032.mjs | 2 +- lib/md033.mjs | 2 +- lib/md034.mjs | 2 +- lib/md035.mjs | 2 +- lib/md036.mjs | 4 +- lib/md037.mjs | 2 +- lib/md038.mjs | 2 +- lib/md039.mjs | 12 +- lib/md040.mjs | 2 +- lib/md041.mjs | 2 +- lib/md042.mjs | 2 +- lib/md043.mjs | 2 +- lib/md044.mjs | 2 +- lib/md045.mjs | 2 +- lib/md046.mjs | 2 +- lib/md047.mjs | 2 +- lib/md048.mjs | 2 +- lib/md049-md050.mjs | 6 +- lib/md051.mjs | 8 +- lib/md052.mjs | 2 +- lib/md053.mjs | 2 +- lib/md054.mjs | 2 +- lib/md055.mjs | 2 +- lib/md056.mjs | 2 +- lib/md058.mjs | 2 +- lib/micromark-parse.mjs | 2 +- lib/types.d.mts | 12 ++ package.json | 9 +- schema/build-config-schema.mjs | 2 +- test/harness.mjs | 5 +- test/markdownlint-test-config.mjs | 72 ++++---- test/markdownlint-test-custom-rules.mjs | 206 ++++++++++++----------- test/markdownlint-test-extra-parse.mjs | 4 +- test/markdownlint-test-extra-type.mjs | 4 +- test/markdownlint-test-fixes.mjs | 6 +- test/markdownlint-test-helpers.mjs | 7 +- test/markdownlint-test-parallel.mjs | 9 +- test/markdownlint-test-repos.mjs | 5 +- test/markdownlint-test-result-object.mjs | 25 +-- test/markdownlint-test-scenarios.mjs | 9 +- test/markdownlint-test-worker.mjs | 5 +- test/markdownlint-test.mjs | 102 +++++------ test/profile-fixture.mjs | 5 +- test/rules/any-blockquote.cjs | 2 +- test/rules/every-n-lines.cjs | 2 +- test/rules/first-line.cjs | 2 +- test/rules/letters-E-X.cjs | 2 +- test/rules/lint-javascript.cjs | 2 +- test/rules/validate-json.cjs | 2 +- 96 files changed, 627 insertions(+), 540 deletions(-) create mode 100644 lib/exports-async.d.mts create mode 100644 lib/exports-async.mjs create mode 100644 lib/exports-promise.d.mts create mode 100644 lib/exports-promise.mjs create mode 100644 lib/exports-sync.d.mts create mode 100644 lib/exports-sync.mjs create mode 100644 lib/exports.d.mts create mode 100644 lib/exports.mjs create mode 100644 lib/types.d.mts diff --git a/README.md b/README.md index 16a85eac0..01797a119 100644 --- a/README.md +++ b/README.md @@ -312,42 +312,41 @@ alternate formats. ### Linting -Standard asynchronous API: +Asynchronous API via `import { lint } from "markdownlint/async"`: ```javascript /** * Lint specified Markdown files. * - * @param {Options} options Configuration options. + * @param {Options | null} options Configuration options. * @param {LintCallback} callback Callback (err, result) function. * @returns {void} */ -function markdownlint(options, callback) { ... } +function lint(options, callback) { ... } ``` -Synchronous API (for build scripts, etc.): +Synchronous API via `import { lint } from "markdownlint/sync"`: ```javascript /** - * Lint specified Markdown files synchronously. + * Lint specified Markdown files. * - * @param {Options} options Configuration options. + * @param {Options | null} options Configuration options. * @returns {LintResults} Results object. */ -function markdownlint.sync(options) { ... } +function lint(options) { ... } ``` -Promise API (in the `promises` namespace like Node.js's -[`fs` Promises API](https://nodejs.org/api/fs.html#fs_fs_promises_api)): +Promise API via `import { lint } from "markdownlint/promise"`: ```javascript /** * Lint specified Markdown files. * - * @param {Options} options Configuration options. + * @param {Options | null} options Configuration options. * @returns {Promise} Results object. */ -function markdownlint(options) { ... } +function lint(options) { ... } ``` #### options @@ -669,7 +668,7 @@ By default, configuration files are parsed as JSON (and named `.markdownlint.json`). Custom parsers can be provided to handle other formats like JSONC, YAML, and TOML. -Asynchronous API: +Asynchronous API via `import { readConfig } from "markdownlint/async"`: ```javascript /** @@ -684,22 +683,21 @@ Asynchronous API: function readConfig(file, parsers, fs, callback) { ... } ``` -Synchronous API: +Synchronous API via `import { readConfig } from "markdownlint/sync"`: ```javascript /** - * Read specified configuration file synchronously. + * Read specified configuration file. * * @param {string} file Configuration file name. * @param {ConfigurationParser[]} [parsers] Parsing function(s). * @param {Object} [fs] File system implementation. * @returns {Configuration} Configuration object. */ -function readConfigSync(file, parsers, fs) { ... } +function readConfig(file, parsers, fs) { ... } ``` -Promise API (in the `promises` namespace like Node.js's -[`fs` Promises API](https://nodejs.org/api/fs.html#fs_promises_api)): +Promise API via `import { readConfig } from "markdownlint/promise"`: ```javascript /** @@ -772,7 +770,8 @@ Configuration object. Rules that can be fixed automatically include a `fixInfo` property which is outlined in the [documentation for custom rules](doc/CustomRules.md#authoring). -To apply fixes consistently, the `applyFix`/`applyFixes` methods may be used: +To apply fixes consistently, the `applyFix`/`applyFixes` methods may be used via +`import { applyFix, applyFixes } from "markdownlint"`: ```javascript /** @@ -798,18 +797,19 @@ function applyFixes(input, errors) { ... } Invoking `applyFixes` with the results of a call to lint can be done like so: ```javascript -import markdownlint from "markdownlint"; +import { applyFixes } from "markdownlint"; +import { lint as lintSync } from "markdownlint/sync"; -const fixResults = markdownlint.sync({ "strings": { "content": original } }); -const fixed = markdownlint.applyFixes(original, fixResults.content); +const results = lintSync({ "strings": { "content": original } }); +const fixed = applyFixes(original, results.content); ``` ## Usage -Invoke `markdownlint` and use the `result` object's `toString` method: +Invoke `lint` and use the `result` object's `toString` method: ```javascript -import markdownlint from "markdownlint"; +import { lint as lintAsync } from "markdownlint/async"; const options = { "files": [ "good.md", "bad.md" ], @@ -819,9 +819,9 @@ const options = { } }; -markdownlint(options, function callback(err, result) { - if (!err) { - console.log(result.toString()); +lintAsync(options, function callback(error, results) { + if (!error && results) { + console.log(results.toString()); } }); ``` @@ -839,21 +839,22 @@ bad.md: 3: MD018/no-missing-space-atx No space after hash on atx style heading [ bad.md: 1: MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "#bad.md"] ``` -Or invoke `markdownlint.sync` for a synchronous call: +Or as a synchronous call: ```javascript -const result = markdownlint.sync(options); -console.log(result.toString()); +import { lint as lintSync } from "markdownlint/sync"; + +const results = lintSync(options); +console.log(results.toString()); ``` -To examine the `result` object directly: +To examine the `result` object directly via a `Promise`-based call: ```javascript -markdownlint(options, function callback(err, result) { - if (!err) { - console.dir(result, { "colors": true, "depth": null }); - } -}); +import { lint as lintPromise } from "markdownlint/promise"; + +const results = await lintPromise(options); +console.dir(results, { "colors": true, "depth": null }); ``` Output: @@ -910,7 +911,7 @@ Generate normal and minified scripts with: npm run build-demo ``` -Then reference the `markdownlint` script: +Then reference the `markdownlint-browser` script: ```html @@ -924,7 +925,8 @@ const options = { "content": "Some Markdown to lint." } }; -const results = window.markdownlint.markdownlint.sync(options).toString(); + +const results = globalThis.markdownlint.lintSync(options).toString(); ``` ## Examples diff --git a/demo/browser-exports.mjs b/demo/browser-exports.mjs index b1e8acf2d..42adabcbd 100644 --- a/demo/browser-exports.mjs +++ b/demo/browser-exports.mjs @@ -1,6 +1,7 @@ // @ts-check -export { default as markdownlint } from "../lib/markdownlint.mjs"; +export { applyFixes, getVersion } from "markdownlint"; +export { lint as lintSync } from "markdownlint/sync"; export { compile, parse, postprocess, preprocess } from "micromark"; export { directive, directiveHtml } from "micromark-extension-directive"; export { gfmAutolinkLiteral, gfmAutolinkLiteralHtml } from "micromark-extension-gfm-autolink-literal"; diff --git a/demo/default.js b/demo/default.js index 27fffc510..2a78a3af4 100644 --- a/demo/default.js +++ b/demo/default.js @@ -3,8 +3,8 @@ (function main() { // Dependencies var markdownit = globalThis.markdownit; - var markdownlint = globalThis.markdownlint.markdownlint; - var micromark = globalThis.markdownlint; + var markdownlint = globalThis.markdownlint; + var micromark = markdownlint; // DOM elements var markdown = document.getElementById("markdown"); @@ -112,7 +112,7 @@ }, "handleRuleFailures": true }; - allLintErrors = markdownlint.sync(options).content; + allLintErrors = markdownlint.lintSync(options).content; violations.innerHTML = allLintErrors.map(function mapResult(result) { var ruleName = result.ruleNames.slice(0, 2).join(" / "); return "" + diff --git a/doc/CustomRules.md b/doc/CustomRules.md index 1136d2caa..8f696ac47 100644 --- a/doc/CustomRules.md +++ b/doc/CustomRules.md @@ -160,8 +160,8 @@ implementation that is resolved when the rule completes. (The value passed to reported via the `onError` function just like for synchronous rules. **Note**: Asynchronous rules cannot be referenced in a synchronous calling -context (i.e., `markdownlint.sync(...)`). Attempting to do so throws an -exception. +context (i.e., `import { lint } from "markdownlint/sync"`). Attempting to do so +throws an exception. ## Examples diff --git a/eslint.config.mjs b/eslint.config.mjs index 62d20d0ed..2bf6cec78 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -149,7 +149,7 @@ export default [ ], "rules": { "no-console": "off", - "no-shadow": "off" + "no-constant-condition": "off" } }, { diff --git a/example/Gruntfile.cjs b/example/Gruntfile.cjs index bbb2a6f58..571d403df 100644 --- a/example/Gruntfile.cjs +++ b/example/Gruntfile.cjs @@ -13,8 +13,8 @@ module.exports = function wrapper(grunt) { grunt.registerMultiTask("markdownlint", function task() { const done = this.async(); - import("markdownlint").then(({ "default": markdownlint }) => { - markdownlint( + import("markdownlint/async").then(({ lint }) => { + lint( { "files": this.filesSrc }, function callback(err, result) { const resultString = err || ((result || "").toString()); diff --git a/example/gulpfile.cjs b/example/gulpfile.cjs index fda31268c..25dcdd58d 100644 --- a/example/gulpfile.cjs +++ b/example/gulpfile.cjs @@ -9,8 +9,8 @@ const through2 = require("through2"); gulp.task("markdownlint", function task() { return gulp.src("*.md", { "read": false }) .pipe(through2.obj(function obj(file, enc, next) { - import("markdownlint").then(({ "default": markdownlint }) => { - markdownlint( + import("markdownlint/async").then(({ lint }) => { + lint( { "files": [ file.relative ] }, function callback(err, result) { const resultString = (result || "").toString(); diff --git a/example/standalone.mjs b/example/standalone.mjs index 804a5094d..a1eed89c1 100644 --- a/example/standalone.mjs +++ b/example/standalone.mjs @@ -1,6 +1,9 @@ // @ts-check -import markdownlint from "markdownlint"; +import { applyFixes } from "markdownlint"; +import { lint as lintAsync } from "markdownlint/async"; +import { lint as lintPromise } from "markdownlint/promise"; +import { lint as lintSync } from "markdownlint/sync"; const options = { "files": [ "good.md", "bad.md" ], @@ -10,27 +13,39 @@ const options = { } }; -// Makes a synchronous call, using result.toString for pretty formatting -const result = markdownlint.sync(options); -console.log(result.toString()); +if (true) { -// Makes an asynchronous call -markdownlint(options, function callback(err, result) { - if (!err) { - // @ts-ignore - console.log(result.toString()); - } -}); + // Makes a synchronous call, uses result.toString for pretty formatting + const results = lintSync(options); + console.log(results.toString()); -// Displays the result object directly -markdownlint(options, function callback(err, result) { - if (!err) { - console.dir(result, { "colors": true, "depth": null }); - } -}); +} + +if (true) { + + // Makes an asynchronous call, uses result.toString for pretty formatting + lintAsync(options, function callback(error, results) { + if (!error && results) { + console.log(results.toString()); + } + }); + +} + +if (true) { + + // Makes a Promise-based asynchronous call, displays the result object directly + const results = await lintPromise(options); + console.dir(results, { "colors": true, "depth": null }); + +} + +if (true) { + + // Fixes all supported violations in Markdown content + const original = "# Heading"; + const results = lintSync({ "strings": { "content": original } }); + const fixed = applyFixes(original, results.content); + console.log(fixed); -// Fixes all supported violations in Markdown content -const original = "# Heading"; -const fixResults = markdownlint.sync({ "strings": { "content": original } }); -const fixed = markdownlint.applyFixes(original, fixResults.content); -console.log(fixed); +} diff --git a/example/typescript/type-check.ts b/example/typescript/type-check.ts index 1ab5cea15..725deade2 100644 --- a/example/typescript/type-check.ts +++ b/example/typescript/type-check.ts @@ -1,13 +1,17 @@ -// Attempt to validate all the type declarations in markdownlint.d.mts +// Attempt to validate important type declarations -import { default as markdownlint, Configuration, ConfigurationStrict, LintResults, Options, Rule, RuleParams, RuleOnError, RuleOnErrorInfo } from "../../lib/markdownlint.mjs"; +import { Configuration, ConfigurationStrict, LintResults, Options, Rule, RuleParams, RuleOnError, RuleOnErrorInfo } from "../../lib/exports.mjs"; +import { applyFix, applyFixes, getVersion } from "../../lib/exports.mjs"; +import { lint as lintAsync, readConfig as readConfigAsync } from "../../lib/exports-async.mjs"; +import { lint as lintPromise, readConfig as readConfigPromise } from "../../lib/exports-promise.mjs"; +import { lint as lintSync, readConfig as readConfigSync } from "../../lib/exports-sync.mjs"; import assert from "assert"; // @ts-expect-error TS7016: Could not find a declaration file for module 'markdown-it-sub'. import markdownItSub from "markdown-it-sub"; const markdownlintJsonPath = "../../.markdownlint.json"; -const version: string = markdownlint.getVersion(); +const version: string = getVersion(); assert(/^\d+\.\d+\.\d+$/.test(version)); function assertConfiguration(config: Configuration) { @@ -67,15 +71,15 @@ function assertLintResultsCallback(err: Error | null, results?: LintResults) { results && assertLintResults(results); } -assertConfiguration(markdownlint.readConfigSync(markdownlintJsonPath)); -assertConfiguration(markdownlint.readConfigSync(markdownlintJsonPath, [ JSON.parse ])); +assertConfiguration(readConfigSync(markdownlintJsonPath)); +assertConfiguration(readConfigSync(markdownlintJsonPath, [ JSON.parse ])); -markdownlint.readConfig(markdownlintJsonPath, assertConfigurationCallback); -markdownlint.readConfig(markdownlintJsonPath, [ JSON.parse ], assertConfigurationCallback); +readConfigAsync(markdownlintJsonPath, assertConfigurationCallback); +readConfigAsync(markdownlintJsonPath, [ JSON.parse ], assertConfigurationCallback); (async () => { - assertConfigurationCallback(null, await markdownlint.promises.readConfig(markdownlintJsonPath)); - assertConfigurationCallback(null, await markdownlint.promises.readConfig(markdownlintJsonPath, [ JSON.parse ])) + assertConfigurationCallback(null, await readConfigPromise(markdownlintJsonPath)); + assertConfigurationCallback(null, await readConfigPromise(markdownlintJsonPath, [ JSON.parse ])) })(); let options: Options; @@ -98,17 +102,17 @@ options = { "markdownItPlugins": [ [ markdownItSub ] ] }; -assertLintResults(markdownlint.sync(options)); -markdownlint(options, assertLintResultsCallback); +assertLintResults(lintSync(options)); +lintAsync(options, assertLintResultsCallback); (async () => { - assertLintResultsCallback(null, await markdownlint.promises.markdownlint(options)); + assertLintResultsCallback(null, await lintPromise(options)); })(); options.files = "../bad.md"; -assertLintResults(markdownlint.sync(options)); -markdownlint(options, assertLintResultsCallback); +assertLintResults(lintSync(options)); +lintAsync(options, assertLintResultsCallback); (async () => { - assertLintResultsCallback(null, await markdownlint.promises.markdownlint(options)); + assertLintResultsCallback(null, await lintPromise(options)); })(); const testRule: Rule = { @@ -162,14 +166,14 @@ const testRule: Rule = { }; options.customRules = [ testRule ]; -assertLintResults(markdownlint.sync(options)); -markdownlint(options, assertLintResultsCallback); +assertLintResults(lintSync(options)); +lintAsync(options, assertLintResultsCallback); (async () => { - assertLintResultsCallback(null, await markdownlint.promises.markdownlint(options)); + assertLintResultsCallback(null, await lintPromise(options)); })(); assert.equal( - markdownlint.applyFix( + applyFix( "# Fixing\n", { "insertText": "Head", @@ -182,7 +186,7 @@ assert.equal( ); assert.equal( - markdownlint.applyFixes( + applyFixes( "# Fixing\n", [ { diff --git a/helpers/helpers.cjs b/helpers/helpers.cjs index f35f94291..5b5f6491f 100644 --- a/helpers/helpers.cjs +++ b/helpers/helpers.cjs @@ -10,13 +10,18 @@ module.exports.newLineRe = newLineRe; module.exports.nextLinesRe = nextLinesRe; // @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 -/** @typedef {import("../lib/markdownlint.mjs").RuleOnError} RuleOnError */ +/** @typedef {import("markdownlint").RuleOnError} RuleOnError */ // @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 -/** @typedef {import("../lib/markdownlint.mjs").RuleOnErrorFixInfo} RuleOnErrorFixInfo */ +/** @typedef {import("markdownlint").RuleOnErrorFixInfo} RuleOnErrorFixInfo */ // @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 -/** @typedef {import("../lib/markdownlint.mjs").MicromarkToken} MicromarkToken */ +/** @typedef {import("markdownlint").MicromarkToken} MicromarkToken */ +// eslint-disable-next-line jsdoc/valid-types +/** @typedef {import("micromark-extension-gfm-footnote", { with: { "resolution-mode": "import" } })} */ +// eslint-disable-next-line jsdoc/valid-types +/** @typedef {import("../lib/micromark-types.d.mts", { with: { "resolution-mode": "import" } })} */ // Regular expression for matching common front matter (YAML and TOML) +// @ts-ignore module.exports.frontMatterRe = /((^---[^\S\r\n\u2028\u2029]*$[\s\S]+?^---\s*)|(^\+\+\+[^\S\r\n\u2028\u2029]*$[\s\S]+?^(\+\+\+|\.\.\.)\s*)|(^\{[^\S\r\n\u2028\u2029]*$[\s\S]+?^\}\s*))(\r\n|\r|\n|$)/m; @@ -368,7 +373,7 @@ module.exports.frontMatterHasTitle = /** * Returns an object with information about reference links and images. * - * @param {import("../helpers/micromark-helpers.cjs").Token[]} tokens Micromark tokens. + * @param {MicromarkToken[]} tokens Micromark tokens. * @returns {Object} Reference link/image data. */ function getReferenceLinkImageData(tokens) { diff --git a/helpers/micromark-helpers.cjs b/helpers/micromark-helpers.cjs index 230279d9a..bed42c862 100644 --- a/helpers/micromark-helpers.cjs +++ b/helpers/micromark-helpers.cjs @@ -4,10 +4,10 @@ const { flatTokensSymbol, htmlFlowSymbol } = require("./shared.cjs"); +// eslint-disable-next-line jsdoc/valid-types +/** @typedef {import("micromark-util-types", { with: { "resolution-mode": "import" } }).TokenType} TokenType */ // @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 -/** @typedef {import("micromark-util-types").TokenType} TokenType */ -// @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 -/** @typedef {import("../lib/markdownlint.mjs").MicromarkToken} Token */ +/** @typedef {import("markdownlint").MicromarkToken} Token */ /** * Determines if a Micromark token is within an htmlFlow type. diff --git a/lib/cache.mjs b/lib/cache.mjs index c4af0e977..9d19b0a4a 100644 --- a/lib/cache.mjs +++ b/lib/cache.mjs @@ -10,7 +10,7 @@ let params = undefined; /** * Initializes (resets) the cache. * - * @param {import("./markdownlint.mjs").RuleParams} [p] Rule parameters object. + * @param {import("markdownlint").RuleParams} [p] Rule parameters object. * @returns {void} */ export function initialize(p) { @@ -37,9 +37,9 @@ function getCached(name, getValue) { /** * Filters a list of Micromark tokens by type and caches the result. * - * @param {import("./markdownlint.mjs").MicromarkTokenType[]} types Types to allow. + * @param {import("markdownlint").MicromarkTokenType[]} types Types to allow. * @param {boolean} [htmlFlow] Whether to include htmlFlow content. - * @returns {import("./markdownlint.mjs").MicromarkToken[]} Filtered tokens. + * @returns {import("markdownlint").MicromarkToken[]} Filtered tokens. */ export function filterByTypesCached(types, htmlFlow) { return getCached( diff --git a/lib/exports-async.d.mts b/lib/exports-async.d.mts new file mode 100644 index 000000000..72e1d8c6d --- /dev/null +++ b/lib/exports-async.d.mts @@ -0,0 +1 @@ +export { lintAsync as lint, readConfigAsync as readConfig } from "./markdownlint.mjs"; diff --git a/lib/exports-async.mjs b/lib/exports-async.mjs new file mode 100644 index 000000000..a39022472 --- /dev/null +++ b/lib/exports-async.mjs @@ -0,0 +1,3 @@ +// @ts-check + +export { lintAsync as lint, readConfigAsync as readConfig } from "./markdownlint.mjs"; diff --git a/lib/exports-promise.d.mts b/lib/exports-promise.d.mts new file mode 100644 index 000000000..27ef95d26 --- /dev/null +++ b/lib/exports-promise.d.mts @@ -0,0 +1 @@ +export { extendConfigPromise as extendConfig, lintPromise as lint, readConfigPromise as readConfig } from "./markdownlint.mjs"; diff --git a/lib/exports-promise.mjs b/lib/exports-promise.mjs new file mode 100644 index 000000000..5ba296908 --- /dev/null +++ b/lib/exports-promise.mjs @@ -0,0 +1,3 @@ +// @ts-check + +export { extendConfigPromise as extendConfig, lintPromise as lint, readConfigPromise as readConfig } from "./markdownlint.mjs"; diff --git a/lib/exports-sync.d.mts b/lib/exports-sync.d.mts new file mode 100644 index 000000000..8a26d4281 --- /dev/null +++ b/lib/exports-sync.d.mts @@ -0,0 +1 @@ +export { lintSync as lint, readConfigSync as readConfig } from "./markdownlint.mjs"; diff --git a/lib/exports-sync.mjs b/lib/exports-sync.mjs new file mode 100644 index 000000000..636fc94ec --- /dev/null +++ b/lib/exports-sync.mjs @@ -0,0 +1,3 @@ +// @ts-check + +export { lintSync as lint, readConfigSync as readConfig } from "./markdownlint.mjs"; diff --git a/lib/exports.d.mts b/lib/exports.d.mts new file mode 100644 index 000000000..74f6dab1a --- /dev/null +++ b/lib/exports.d.mts @@ -0,0 +1,28 @@ +export type Configuration = import("./markdownlint.mjs").Configuration; +export type ConfigurationParser = import("./markdownlint.mjs").ConfigurationParser; +export type ConfigurationStrict = import("./markdownlint.mjs").ConfigurationStrict; +export type FixInfo = import("./markdownlint.mjs").FixInfo; +export type LintCallback = import("./markdownlint.mjs").LintCallback; +export type LintContentCallback = import("./markdownlint.mjs").LintContentCallback; +export type LintError = import("./markdownlint.mjs").LintError; +export type LintResults = import("./markdownlint.mjs").LintResults; +export type MarkdownItToken = import("./markdownlint.mjs").MarkdownItToken; +export type MarkdownParsers = import("./markdownlint.mjs").MarkdownParsers; +export type MicromarkToken = import("./markdownlint.mjs").MicromarkToken; +export type MicromarkTokenType = import("./markdownlint.mjs").MicromarkTokenType; +export type Options = import("./markdownlint.mjs").Options; +export type ParserMarkdownIt = import("./markdownlint.mjs").ParserMarkdownIt; +export type ParserMicromark = import("./markdownlint.mjs").ParserMicromark; +export type Plugin = import("./markdownlint.mjs").Plugin; +export type ReadConfigCallback = import("./markdownlint.mjs").ReadConfigCallback; +export type ResolveConfigExtendsCallback = import("./markdownlint.mjs").ResolveConfigExtendsCallback; +export type Rule = import("./markdownlint.mjs").Rule; +export type RuleConfiguration = import("./markdownlint.mjs").RuleConfiguration; +export type RuleFunction = import("./markdownlint.mjs").RuleFunction; +export type RuleOnError = import("./markdownlint.mjs").RuleOnError; +export type RuleOnErrorFixInfo = import("./markdownlint.mjs").RuleOnErrorFixInfo; +export type RuleOnErrorFixInfoNormalized = import("./markdownlint.mjs").RuleOnErrorFixInfoNormalized; +export type RuleOnErrorInfo = import("./markdownlint.mjs").RuleOnErrorInfo; +export type RuleParams = import("./markdownlint.mjs").RuleParams; +export type ToStringCallback = import("./markdownlint.mjs").ToStringCallback; +export { applyFix, applyFixes, getVersion } from "./markdownlint.mjs"; diff --git a/lib/exports.mjs b/lib/exports.mjs new file mode 100644 index 000000000..8fdef2e2a --- /dev/null +++ b/lib/exports.mjs @@ -0,0 +1,31 @@ +// @ts-check + +export { applyFix, applyFixes, getVersion } from "./markdownlint.mjs"; + +/** @typedef {import("./markdownlint.mjs").Configuration} Configuration */ +/** @typedef {import("./markdownlint.mjs").ConfigurationParser} ConfigurationParser */ +/** @typedef {import("./markdownlint.mjs").ConfigurationStrict} ConfigurationStrict */ +/** @typedef {import("./markdownlint.mjs").FixInfo} FixInfo */ +/** @typedef {import("./markdownlint.mjs").LintCallback} LintCallback */ +/** @typedef {import("./markdownlint.mjs").LintContentCallback} LintContentCallback */ +/** @typedef {import("./markdownlint.mjs").LintError} LintError */ +/** @typedef {import("./markdownlint.mjs").LintResults} LintResults */ +/** @typedef {import("./markdownlint.mjs").MarkdownItToken} MarkdownItToken */ +/** @typedef {import("./markdownlint.mjs").MarkdownParsers} MarkdownParsers */ +/** @typedef {import("./markdownlint.mjs").MicromarkToken} MicromarkToken */ +/** @typedef {import("./markdownlint.mjs").MicromarkTokenType} MicromarkTokenType */ +/** @typedef {import("./markdownlint.mjs").Options} Options */ +/** @typedef {import("./markdownlint.mjs").ParserMarkdownIt} ParserMarkdownIt */ +/** @typedef {import("./markdownlint.mjs").ParserMicromark} ParserMicromark */ +/** @typedef {import("./markdownlint.mjs").Plugin} Plugin */ +/** @typedef {import("./markdownlint.mjs").ReadConfigCallback} ReadConfigCallback */ +/** @typedef {import("./markdownlint.mjs").ResolveConfigExtendsCallback} ResolveConfigExtendsCallback */ +/** @typedef {import("./markdownlint.mjs").Rule} Rule */ +/** @typedef {import("./markdownlint.mjs").RuleConfiguration} RuleConfiguration */ +/** @typedef {import("./markdownlint.mjs").RuleFunction} RuleFunction */ +/** @typedef {import("./markdownlint.mjs").RuleOnError} RuleOnError */ +/** @typedef {import("./markdownlint.mjs").RuleOnErrorFixInfo} RuleOnErrorFixInfo */ +/** @typedef {import("./markdownlint.mjs").RuleOnErrorFixInfoNormalized} RuleOnErrorFixInfoNormalized */ +/** @typedef {import("./markdownlint.mjs").RuleOnErrorInfo} RuleOnErrorInfo */ +/** @typedef {import("./markdownlint.mjs").RuleParams} RuleParams */ +/** @typedef {import("./markdownlint.mjs").ToStringCallback} ToStringCallback */ diff --git a/lib/markdownit.cjs b/lib/markdownit.cjs index 5651dc081..62db38262 100644 --- a/lib/markdownit.cjs +++ b/lib/markdownit.cjs @@ -5,9 +5,9 @@ const { newLineRe } = require("../helpers"); // @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 -/** @typedef {import("./markdownlint.mjs").MarkdownItToken} MarkdownItToken */ +/** @typedef {import("markdownlint").MarkdownItToken} MarkdownItToken */ // @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 -/** @typedef {import("./markdownlint.mjs").Plugin} Plugin */ +/** @typedef {import("markdownlint").Plugin} Plugin */ /** * @callback InlineCodeSpanCallback diff --git a/lib/markdownlint.d.mts b/lib/markdownlint.d.mts index 900f2be3f..e4d01230e 100644 --- a/lib/markdownlint.d.mts +++ b/lib/markdownlint.d.mts @@ -1,4 +1,87 @@ -export default markdownlint; +/** + * Lint specified Markdown files. + * + * @param {Options | null} options Configuration options. + * @param {LintCallback} callback Callback (err, result) function. + * @returns {void} + */ +export function lintAsync(options: Options | null, callback: LintCallback): void; +/** + * Lint specified Markdown files. + * + * @param {Options | null} options Configuration options. + * @returns {Promise} Results object. + */ +export function lintPromise(options: Options | null): Promise; +/** + * Lint specified Markdown files. + * + * @param {Options | null} options Configuration options. + * @returns {LintResults} Results object. + */ +export function lintSync(options: Options | null): LintResults; +/** + * Extend specified configuration object. + * + * @param {Configuration} config Configuration object. + * @param {string} file Configuration file name. + * @param {ConfigurationParser[] | undefined} parsers Parsing function(s). + * @param {Object} fs File system implementation. + * @returns {Promise} Configuration object. + */ +export function extendConfigPromise(config: Configuration, file: string, parsers: ConfigurationParser[] | undefined, fs: any): Promise; +/** + * Read specified configuration file. + * + * @param {string} file Configuration file name. + * @param {ConfigurationParser[] | ReadConfigCallback} [parsers] Parsing + * function(s). + * @param {Object} [fs] File system implementation. + * @param {ReadConfigCallback} [callback] Callback (err, result) function. + * @returns {void} + */ +export function readConfigAsync(file: string, parsers?: ConfigurationParser[] | ReadConfigCallback, fs?: any, callback?: ReadConfigCallback): void; +/** + * Read specified configuration file. + * + * @param {string} file Configuration file name. + * @param {ConfigurationParser[]} [parsers] Parsing function(s). + * @param {Object} [fs] File system implementation. + * @returns {Promise} Configuration object. + */ +export function readConfigPromise(file: string, parsers?: ConfigurationParser[], fs?: any): Promise; +/** + * Read specified configuration file. + * + * @param {string} file Configuration file name. + * @param {ConfigurationParser[]} [parsers] Parsing function(s). + * @param {Object} [fs] File system implementation. + * @returns {Configuration} Configuration object. + */ +export function readConfigSync(file: string, parsers?: ConfigurationParser[], fs?: any): Configuration; +/** + * Applies the specified fix to a Markdown content line. + * + * @param {string} line Line of Markdown content. + * @param {RuleOnErrorFixInfo} fixInfo RuleOnErrorFixInfo instance. + * @param {string} [lineEnding] Line ending to use. + * @returns {string | null} Fixed content or null if deleted. + */ +export function applyFix(line: string, fixInfo: RuleOnErrorFixInfo, lineEnding?: string): string | null; +/** + * Applies as many of the specified fixes as possible to Markdown content. + * + * @param {string} input Lines of Markdown content. + * @param {RuleOnErrorInfo[]} errors RuleOnErrorInfo instances. + * @returns {string} Fixed content. + */ +export function applyFixes(input: string, errors: RuleOnErrorInfo[]): string; +/** + * Gets the (semantic) version of the library. + * + * @returns {string} SemVer string. + */ +export function getVersion(): string; /** * Function to implement rule logic. */ @@ -431,101 +514,3 @@ export type ReadConfigCallback = (err: Error | null, config?: Configuration) => * Called with the result of the resolveConfigExtends function. */ export type ResolveConfigExtendsCallback = (err: Error | null, path?: string) => void; -/** - * Lint specified Markdown files. - * - * @param {Options | null} options Configuration options. - * @param {LintCallback} callback Callback (err, result) function. - * @returns {void} - */ -declare function markdownlint(options: Options | null, callback: LintCallback): void; -declare namespace markdownlint { - export { markdownlintSync as sync }; - export { readConfig }; - export { readConfigSync }; - export { getVersion }; - export namespace promises { - export { markdownlintPromise as markdownlint }; - export { extendConfigPromise as extendConfig }; - export { readConfigPromise as readConfig }; - } - export { applyFix }; - export { applyFixes }; -} -/** - * Lint specified Markdown files synchronously. - * - * @param {Options | null} options Configuration options. - * @returns {LintResults} Results object. - */ -declare function markdownlintSync(options: Options | null): LintResults; -/** - * Read specified configuration file. - * - * @param {string} file Configuration file name. - * @param {ConfigurationParser[] | ReadConfigCallback} [parsers] Parsing - * function(s). - * @param {Object} [fs] File system implementation. - * @param {ReadConfigCallback} [callback] Callback (err, result) function. - * @returns {void} - */ -declare function readConfig(file: string, parsers?: ConfigurationParser[] | ReadConfigCallback, fs?: any, callback?: ReadConfigCallback): void; -/** - * Read specified configuration file synchronously. - * - * @param {string} file Configuration file name. - * @param {ConfigurationParser[]} [parsers] Parsing function(s). - * @param {Object} [fs] File system implementation. - * @returns {Configuration} Configuration object. - * @throws An Error if processing fails. - */ -declare function readConfigSync(file: string, parsers?: ConfigurationParser[], fs?: any): Configuration; -/** - * Gets the (semantic) version of the library. - * - * @returns {string} SemVer string. - */ -declare function getVersion(): string; -/** - * Lint specified Markdown files. - * - * @param {Options} options Configuration options. - * @returns {Promise} Results object. - */ -declare function markdownlintPromise(options: Options): Promise; -/** - * Extend specified configuration object. - * - * @param {Configuration} config Configuration object. - * @param {string} file Configuration file name. - * @param {ConfigurationParser[] | undefined} parsers Parsing function(s). - * @param {Object} fs File system implementation. - * @returns {Promise} Configuration object. - */ -declare function extendConfigPromise(config: Configuration, file: string, parsers: ConfigurationParser[] | undefined, fs: any): Promise; -/** - * Read specified configuration file. - * - * @param {string} file Configuration file name. - * @param {ConfigurationParser[]} [parsers] Parsing function(s). - * @param {Object} [fs] File system implementation. - * @returns {Promise} Configuration object. - */ -declare function readConfigPromise(file: string, parsers?: ConfigurationParser[], fs?: any): Promise; -/** - * Applies the specified fix to a Markdown content line. - * - * @param {string} line Line of Markdown content. - * @param {RuleOnErrorFixInfo} fixInfo RuleOnErrorFixInfo instance. - * @param {string} [lineEnding] Line ending to use. - * @returns {string | null} Fixed content or null if deleted. - */ -declare function applyFix(line: string, fixInfo: RuleOnErrorFixInfo, lineEnding?: string): string | null; -/** - * Applies as many of the specified fixes as possible to Markdown content. - * - * @param {string} input Lines of Markdown content. - * @param {RuleOnErrorInfo[]} errors RuleOnErrorInfo instances. - * @returns {string} Fixed content. - */ -declare function applyFixes(input: string, errors: RuleOnErrorInfo[]): string; diff --git a/lib/markdownlint.mjs b/lib/markdownlint.mjs index a40cb8497..6ff36222b 100644 --- a/lib/markdownlint.mjs +++ b/lib/markdownlint.mjs @@ -954,19 +954,19 @@ function lintInput(options, synchronous, callback) { * @param {LintCallback} callback Callback (err, result) function. * @returns {void} */ -function markdownlint(options, callback) { +export function lintAsync(options, callback) { return lintInput(options, false, callback); } /** * Lint specified Markdown files. * - * @param {Options} options Configuration options. + * @param {Options | null} options Configuration options. * @returns {Promise} Results object. */ -function markdownlintPromise(options) { +export function lintPromise(options) { return new Promise((resolve, reject) => { - markdownlint(options, (error, results) => { + lintAsync(options, (error, results) => { if (error || !results) { reject(error); } else { @@ -977,12 +977,12 @@ function markdownlintPromise(options) { } /** - * Lint specified Markdown files synchronously. + * Lint specified Markdown files. * * @param {Options | null} options Configuration options. * @returns {LintResults} Results object. */ -function markdownlintSync(options) { +export function lintSync(options) { let results = null; lintInput(options, true, function callback(error, res) { if (error) { @@ -1072,7 +1072,7 @@ function extendConfig(config, file, parsers, fs, callback) { helpers.expandTildePath(configExtends, os), fs, // eslint-disable-next-line no-use-before-define - (_, resolvedExtends) => readConfig( + (_, resolvedExtends) => readConfigAsync( // @ts-ignore resolvedExtends, parsers, @@ -1103,7 +1103,7 @@ function extendConfig(config, file, parsers, fs, callback) { * @param {Object} fs File system implementation. * @returns {Promise} Configuration object. */ -function extendConfigPromise(config, file, parsers, fs) { +export function extendConfigPromise(config, file, parsers, fs) { return new Promise((resolve, reject) => { extendConfig(config, file, parsers, fs, (error, results) => { if (error || !results) { @@ -1125,7 +1125,7 @@ function extendConfigPromise(config, file, parsers, fs) { * @param {ReadConfigCallback} [callback] Callback (err, result) function. * @returns {void} */ -function readConfig(file, parsers, fs, callback) { +export function readConfigAsync(file, parsers, fs, callback) { if (!callback) { if (fs) { callback = fs; @@ -1168,9 +1168,9 @@ function readConfig(file, parsers, fs, callback) { * @param {Object} [fs] File system implementation. * @returns {Promise} Configuration object. */ -function readConfigPromise(file, parsers, fs) { +export function readConfigPromise(file, parsers, fs) { return new Promise((resolve, reject) => { - readConfig(file, parsers, fs, (error, results) => { + readConfigAsync(file, parsers, fs, (error, results) => { if (error || !results) { reject(error); } else { @@ -1181,15 +1181,14 @@ function readConfigPromise(file, parsers, fs) { } /** - * Read specified configuration file synchronously. + * Read specified configuration file. * * @param {string} file Configuration file name. * @param {ConfigurationParser[]} [parsers] Parsing function(s). * @param {Object} [fs] File system implementation. * @returns {Configuration} Configuration object. - * @throws An Error if processing fails. */ -function readConfigSync(file, parsers, fs) { +export function readConfigSync(file, parsers, fs) { if (!fs) { fs = nodeFs; } @@ -1242,7 +1241,7 @@ function normalizeFixInfo(fixInfo, lineNumber = 0) { * @param {string} [lineEnding] Line ending to use. * @returns {string | null} Fixed content or null if deleted. */ -function applyFix(line, fixInfo, lineEnding = "\n") { +export function applyFix(line, fixInfo, lineEnding = "\n") { const { editColumn, deleteCount, insertText } = normalizeFixInfo(fixInfo); const editIndex = editColumn - 1; return (deleteCount === -1) ? @@ -1257,7 +1256,7 @@ function applyFix(line, fixInfo, lineEnding = "\n") { * @param {RuleOnErrorInfo[]} errors RuleOnErrorInfo instances. * @returns {string} Fixed content. */ -function applyFixes(input, errors) { +export function applyFixes(input, errors) { const lineEnding = helpers.getPreferredLineEnding(input, os); const lines = input.split(helpers.newLineRe); // Normalize fixInfo objects @@ -1335,24 +1334,10 @@ function applyFixes(input, errors) { * * @returns {string} SemVer string. */ -function getVersion() { +export function getVersion() { return version; } -// Export a/synchronous/Promise APIs -markdownlint.sync = markdownlintSync; -markdownlint.readConfig = readConfig; -markdownlint.readConfigSync = readConfigSync; -markdownlint.getVersion = getVersion; -markdownlint.promises = { - "markdownlint": markdownlintPromise, - "extendConfig": extendConfigPromise, - "readConfig": readConfigPromise -}; -markdownlint.applyFix = applyFix; -markdownlint.applyFixes = applyFixes; -export default markdownlint; - // Type declarations /** diff --git a/lib/md001.mjs b/lib/md001.mjs index b36db6a62..0413d3556 100644 --- a/lib/md001.mjs +++ b/lib/md001.mjs @@ -4,7 +4,7 @@ import { addErrorDetailIf } from "../helpers/helpers.cjs"; import { getHeadingLevel } from "../helpers/micromark-helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD001", "heading-increment" ], "description": "Heading levels should only increment by one level at a time", diff --git a/lib/md003.mjs b/lib/md003.mjs index 6ed1d048b..d06068daa 100644 --- a/lib/md003.mjs +++ b/lib/md003.mjs @@ -4,7 +4,7 @@ import { addErrorDetailIf } from "../helpers/helpers.cjs"; import { getHeadingLevel, getHeadingStyle } from "../helpers/micromark-helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD003", "heading-style" ], "description": "Heading style", diff --git a/lib/md004.mjs b/lib/md004.mjs index 1679736f3..c56e3ad80 100644 --- a/lib/md004.mjs +++ b/lib/md004.mjs @@ -27,7 +27,7 @@ const validStyles = new Set([ "sublist" ]); -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD004", "ul-style" ], "description": "Unordered list style", @@ -40,7 +40,7 @@ export default { for (const listUnordered of filterByTypesCached([ "listUnordered" ])) { let nesting = 0; if (style === "sublist") { - /** @type {import("../helpers/micromark-helpers.cjs").Token | null} */ + /** @type {import("markdownlint").MicromarkToken | null} */ let parent = listUnordered; // @ts-ignore while ((parent = getParentOfType(parent, [ "listOrdered", "listUnordered" ]))) { diff --git a/lib/md005.mjs b/lib/md005.mjs index 0c79e2a9f..33374a7b6 100644 --- a/lib/md005.mjs +++ b/lib/md005.mjs @@ -3,7 +3,7 @@ import { addError, addErrorDetailIf } from "../helpers/helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD005", "list-indent" ], "description": "Inconsistent indentation for list items at the same level", diff --git a/lib/md007.mjs b/lib/md007.mjs index 37ec553b9..6b38447c3 100644 --- a/lib/md007.mjs +++ b/lib/md007.mjs @@ -11,7 +11,7 @@ const unorderedListTypes = const unorderedParentTypes = [ "blockQuote", "listOrdered", "listUnordered" ]; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD007", "ul-indent" ], "description": "Unordered list indentation", @@ -30,7 +30,7 @@ export default { lastBlockQuotePrefix = token; } else if (type === "listUnordered") { let nesting = 0; - /** @type {import("../helpers/micromark-helpers.cjs").Token | null} */ + /** @type {import("markdownlint").MicromarkToken | null} */ let current = token; while ( // @ts-ignore diff --git a/lib/md009.mjs b/lib/md009.mjs index f9de27178..55394ad63 100644 --- a/lib/md009.mjs +++ b/lib/md009.mjs @@ -4,7 +4,7 @@ import { addError } from "../helpers/helpers.cjs"; import { addRangeToSet } from "../helpers/micromark-helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD009", "no-trailing-spaces" ], "description": "Trailing spaces", diff --git a/lib/md010.mjs b/lib/md010.mjs index 2f6858c10..36ad10174 100644 --- a/lib/md010.mjs +++ b/lib/md010.mjs @@ -6,7 +6,7 @@ import { filterByTypesCached } from "./cache.mjs"; const tabRe = /\t+/g; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD010", "no-hard-tabs" ], "description": "Hard tabs", @@ -23,7 +23,7 @@ export default { const spaceMultiplier = (spacesPerTab === undefined) ? 1 : Math.max(0, Number(spacesPerTab)); - /** @type {import("../helpers/micromark-helpers.cjs").TokenType[]} */ + /** @type {import("markdownlint").MicromarkTokenType[]} */ const exclusionTypes = []; if (includeCode) { if (ignoreCodeLanguages.size > 0) { diff --git a/lib/md011.mjs b/lib/md011.mjs index f13e60bc3..32df13d6e 100644 --- a/lib/md011.mjs +++ b/lib/md011.mjs @@ -6,7 +6,7 @@ import { filterByTypesCached } from "./cache.mjs"; const reversedLinkRe = /(^|[^\\])\(([^()]+)\)\[([^\]^][^\]]*)\](?!\()/g; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD011", "no-reversed-links" ], "description": "Reversed link syntax", diff --git a/lib/md012.mjs b/lib/md012.mjs index 1d48a47a0..2ec4a84e5 100644 --- a/lib/md012.mjs +++ b/lib/md012.mjs @@ -4,7 +4,7 @@ import { addErrorDetailIf } from "../helpers/helpers.cjs"; import { addRangeToSet } from "../helpers/micromark-helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD012", "no-multiple-blanks" ], "description": "Multiple consecutive blank lines", diff --git a/lib/md013.mjs b/lib/md013.mjs index a2333a06e..0d1b24ead 100644 --- a/lib/md013.mjs +++ b/lib/md013.mjs @@ -12,7 +12,7 @@ const sternModeRe = /^(?:[#>\s]*\s)?\S*$/; /** @typedef {import("micromark-extension-gfm-autolink-literal")} */ /** @typedef {import("micromark-extension-gfm-table")} */ -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD013", "line-length" ], "description": "Line length", diff --git a/lib/md014.mjs b/lib/md014.mjs index 9d42e5f60..351d2f407 100644 --- a/lib/md014.mjs +++ b/lib/md014.mjs @@ -5,7 +5,7 @@ import { filterByTypesCached } from "./cache.mjs"; const dollarCommandRe = /^(\s*)(\$\s+)/; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD014", "commands-show-output" ], "description": "Dollar signs used before commands without showing output", diff --git a/lib/md018.mjs b/lib/md018.mjs index 5e9fbf94d..8575d0488 100644 --- a/lib/md018.mjs +++ b/lib/md018.mjs @@ -4,7 +4,7 @@ import { addErrorContext } from "../helpers/helpers.cjs"; import { addRangeToSet } from "../helpers/micromark-helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD018", "no-missing-space-atx" ], "description": "No space after hash on atx style heading", diff --git a/lib/md019-md021.mjs b/lib/md019-md021.mjs index 954a45a16..ef579d471 100644 --- a/lib/md019-md021.mjs +++ b/lib/md019-md021.mjs @@ -7,8 +7,8 @@ import { filterByTypesCached } from "./cache.mjs"; /** * Validate heading sequence and whitespace length at start or end. * - * @param {import("./markdownlint.mjs").RuleOnError} onError Error-reporting callback. - * @param {import("./markdownlint.mjs").MicromarkToken} heading ATX heading token. + * @param {import("markdownlint").RuleOnError} onError Error-reporting callback. + * @param {import("markdownlint").MicromarkToken} heading ATX heading token. * @param {number} delta Direction to scan. * @returns {void} */ @@ -45,7 +45,7 @@ function validateHeadingSpaces(onError, heading, delta) { } } -/** @type {import("./markdownlint.mjs").Rule[]} */ +/** @type {import("markdownlint").Rule[]} */ export default [ { "names": [ "MD019", "no-multiple-space-atx" ], diff --git a/lib/md020.mjs b/lib/md020.mjs index 37584c3cf..3b45d2a3c 100644 --- a/lib/md020.mjs +++ b/lib/md020.mjs @@ -4,7 +4,7 @@ import { addErrorContext } from "../helpers/helpers.cjs"; import { addRangeToSet } from "../helpers/micromark-helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD020", "no-missing-space-closed-atx" ], "description": "No space inside hashes on closed atx style heading", diff --git a/lib/md022.mjs b/lib/md022.mjs index f1ae5b8ce..bc82429b5 100644 --- a/lib/md022.mjs +++ b/lib/md022.mjs @@ -19,7 +19,7 @@ const getLinesFunction = (linesParam) => { return () => lines; }; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD022", "blanks-around-headings" ], "description": "Headings should be surrounded by blank lines", diff --git a/lib/md023.mjs b/lib/md023.mjs index c251ccdf3..bfb91beb8 100644 --- a/lib/md023.mjs +++ b/lib/md023.mjs @@ -3,7 +3,7 @@ import { addErrorContext } from "../helpers/helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD023", "heading-start-left" ], "description": "Headings must start at the beginning of the line", diff --git a/lib/md024.mjs b/lib/md024.mjs index 2ecaefe89..e10f7281a 100644 --- a/lib/md024.mjs +++ b/lib/md024.mjs @@ -4,7 +4,7 @@ import { addErrorContext } from "../helpers/helpers.cjs"; import { getHeadingLevel, getHeadingText } from "../helpers/micromark-helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD024", "no-duplicate-heading" ], "description": "Multiple headings with the same content", diff --git a/lib/md025.mjs b/lib/md025.mjs index 70ed09b60..f0b83a34b 100644 --- a/lib/md025.mjs +++ b/lib/md025.mjs @@ -4,7 +4,7 @@ import { addErrorContext, frontMatterHasTitle } from "../helpers/helpers.cjs"; import { getHeadingLevel, getHeadingText } from "../helpers/micromark-helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD025", "single-title", "single-h1" ], "description": "Multiple top-level headings in the same document", diff --git a/lib/md026.mjs b/lib/md026.mjs index bde45188b..273481101 100644 --- a/lib/md026.mjs +++ b/lib/md026.mjs @@ -4,7 +4,7 @@ import { addError, allPunctuationNoQuestion, endOfLineGemojiCodeRe, endOfLineHtmlEntityRe, escapeForRegExp } from "../helpers/helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD026", "no-trailing-punctuation" ], "description": "Trailing punctuation in heading", diff --git a/lib/md027.mjs b/lib/md027.mjs index df39c0c2a..bc9a4f59e 100644 --- a/lib/md027.mjs +++ b/lib/md027.mjs @@ -3,7 +3,7 @@ import { addErrorContext } from "../helpers/helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD027", "no-multiple-space-blockquote" ], "description": "Multiple spaces after blockquote symbol", diff --git a/lib/md028.mjs b/lib/md028.mjs index b81b368f0..1f4ce9eba 100644 --- a/lib/md028.mjs +++ b/lib/md028.mjs @@ -5,7 +5,7 @@ import { filterByTypesCached } from "./cache.mjs"; const ignoreTypes = new Set([ "lineEnding", "listItemIndent", "linePrefix" ]); -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD028", "no-blanks-blockquote" ], "description": "Blank line inside blockquote", diff --git a/lib/md029.mjs b/lib/md029.mjs index 39fda4abc..f87e55134 100644 --- a/lib/md029.mjs +++ b/lib/md029.mjs @@ -13,14 +13,14 @@ const listStyleExamples = { /** * Gets the value of an ordered list item prefix token. * - * @param {import("../helpers/micromark-helpers.cjs").Token} listItemPrefix List item prefix token. + * @param {import("markdownlint").MicromarkToken} listItemPrefix List item prefix token. * @returns {number} List item value. */ function getOrderedListItemValue(listItemPrefix) { return Number(getDescendantsByType(listItemPrefix, [ "listItemValue" ])[0].text); } -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD029", "ol-prefix" ], "description": "Ordered list item prefix", diff --git a/lib/md030.mjs b/lib/md030.mjs index 82f0b9745..6e7ee9e65 100644 --- a/lib/md030.mjs +++ b/lib/md030.mjs @@ -3,7 +3,7 @@ import { addErrorDetailIf } from "../helpers/helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD030", "list-marker-space" ], "description": "Spaces after list markers", diff --git a/lib/md031.mjs b/lib/md031.mjs index a741fd5af..3494561f7 100644 --- a/lib/md031.mjs +++ b/lib/md031.mjs @@ -12,7 +12,7 @@ const codeFencePrefixRe = /^(.*?)[`~]/; /** * Adds an error for the top or bottom of a code fence. * - * @param {import("./markdownlint.mjs").RuleOnError} onError Error-reporting callback. + * @param {import("markdownlint").RuleOnError} onError Error-reporting callback. * @param {ReadonlyStringArray} lines Lines of Markdown content. * @param {number} lineNumber Line number. * @param {boolean} top True iff top fence. @@ -38,7 +38,7 @@ function addError(onError, lines, lineNumber, top) { ); } -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD031", "blanks-around-fences" ], "description": "Fenced code blocks should be surrounded by blank lines", diff --git a/lib/md032.mjs b/lib/md032.mjs index 5337cca72..5dc23cdd3 100644 --- a/lib/md032.mjs +++ b/lib/md032.mjs @@ -8,7 +8,7 @@ const isList = (token) => ( (token.type === "listOrdered") || (token.type === "listUnordered") ); -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD032", "blanks-around-lists" ], "description": "Lists should be surrounded by blank lines", diff --git a/lib/md033.mjs b/lib/md033.mjs index dd76308cf..d353c0d61 100644 --- a/lib/md033.mjs +++ b/lib/md033.mjs @@ -4,7 +4,7 @@ import { addError, nextLinesRe } from "../helpers/helpers.cjs"; import { getHtmlTagInfo } from "../helpers/micromark-helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD033", "no-inline-html" ], "description": "Inline HTML", diff --git a/lib/md034.mjs b/lib/md034.mjs index 4215e2b93..a33e4978e 100644 --- a/lib/md034.mjs +++ b/lib/md034.mjs @@ -5,7 +5,7 @@ import { filterByPredicate, getHtmlTagInfo, inHtmlFlow } from "../helpers/microm /** @typedef {import("micromark-extension-gfm-autolink-literal")} */ -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD034", "no-bare-urls" ], "description": "Bare URL used", diff --git a/lib/md035.mjs b/lib/md035.mjs index 81fde3d46..13f79124d 100644 --- a/lib/md035.mjs +++ b/lib/md035.mjs @@ -3,7 +3,7 @@ import { addErrorDetailIf } from "../helpers/helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD035", "hr-style" ], "description": "Horizontal rule style", diff --git a/lib/md036.mjs b/lib/md036.mjs index 1dd4a86f7..c30ffc96e 100644 --- a/lib/md036.mjs +++ b/lib/md036.mjs @@ -4,14 +4,14 @@ import { addErrorContext, allPunctuation } from "../helpers/helpers.cjs"; import { getDescendantsByType } from "../helpers/micromark-helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @typedef {import("../helpers/micromark-helpers.cjs").TokenType} TokenType */ +/** @typedef {import("markdownlint").MicromarkTokenType} TokenType */ /** @type {TokenType[][]} */ const emphasisTypes = [ [ "emphasis", "emphasisText" ], [ "strong", "strongText" ] ]; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD036", "no-emphasis-as-heading" ], "description": "Emphasis used instead of a heading", diff --git a/lib/md037.mjs b/lib/md037.mjs index 09befcaa0..e2be28479 100644 --- a/lib/md037.mjs +++ b/lib/md037.mjs @@ -3,7 +3,7 @@ import { addError } from "../helpers/helpers.cjs"; import { filterByPredicate, inHtmlFlow } from "../helpers/micromark-helpers.cjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD037", "no-space-in-emphasis" ], "description": "Spaces inside emphasis markers", diff --git a/lib/md038.mjs b/lib/md038.mjs index 1664cd277..263b8eb79 100644 --- a/lib/md038.mjs +++ b/lib/md038.mjs @@ -17,7 +17,7 @@ const trimCodeText = (text, start, end) => { return text; }; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD038", "no-space-in-code" ], "description": "Spaces inside code span elements", diff --git a/lib/md039.mjs b/lib/md039.mjs index 26dd28865..691a5aff1 100644 --- a/lib/md039.mjs +++ b/lib/md039.mjs @@ -6,9 +6,9 @@ import { getReferenceLinkImageData, filterByTypesCached } from "./cache.mjs"; /** * Adds an error for a label space issue. * - * @param {import("./markdownlint.mjs").RuleOnError} onError Error-reporting callback. - * @param {import("../helpers/micromark-helpers.cjs").Token} label Label token. - * @param {import("../helpers/micromark-helpers.cjs").Token} labelText LabelText token. + * @param {import("markdownlint").RuleOnError} onError Error-reporting callback. + * @param {import("markdownlint").MicromarkToken} label Label token. + * @param {import("markdownlint").MicromarkToken} labelText LabelText token. * @param {boolean} isStart True iff error is at the start of the link. */ function addLabelSpaceError(onError, label, labelText, isStart) { @@ -38,8 +38,8 @@ function addLabelSpaceError(onError, label, labelText, isStart) { /** * Determines if a link is a valid link (and not a fake shortcut link due to parser tricks). * - * @param {import("../helpers/micromark-helpers.cjs").Token} label Label token. - * @param {import("../helpers/micromark-helpers.cjs").Token} labelText LabelText token. + * @param {import("markdownlint").MicromarkToken} label Label token. + * @param {import("markdownlint").MicromarkToken} labelText LabelText token. * @param {Map} definitions Map of link definitions. * @returns {boolean} True iff the link is valid. */ @@ -47,7 +47,7 @@ function validLink(label, labelText, definitions) { return (label.parent?.children.length !== 1) || definitions.has(labelText.text.trim()); } -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD039", "no-space-in-links" ], "description": "Spaces inside link text", diff --git a/lib/md040.mjs b/lib/md040.mjs index 3bc1dfbdc..26e3d6258 100644 --- a/lib/md040.mjs +++ b/lib/md040.mjs @@ -4,7 +4,7 @@ import { addError, addErrorContext } from "../helpers/helpers.cjs"; import { getDescendantsByType } from "../helpers/micromark-helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD040", "fenced-code-language" ], "description": "Fenced code blocks should have a language specified", diff --git a/lib/md041.mjs b/lib/md041.mjs index 35764c94e..89a9a0a95 100644 --- a/lib/md041.mjs +++ b/lib/md041.mjs @@ -3,7 +3,7 @@ import { addErrorContext, frontMatterHasTitle } from "../helpers/helpers.cjs"; import { filterByTypes, getHeadingLevel, getHtmlTagInfo, isHtmlFlowComment, nonContentTokens } from "../helpers/micromark-helpers.cjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD041", "first-line-heading", "first-line-h1" ], "description": "First line in a file should be a top-level heading", diff --git a/lib/md042.mjs b/lib/md042.mjs index 6e005fb00..2127a548b 100644 --- a/lib/md042.mjs +++ b/lib/md042.mjs @@ -4,7 +4,7 @@ import { addErrorContext } from "../helpers/helpers.cjs"; import { getDescendantsByType } from "../helpers/micromark-helpers.cjs"; import { getReferenceLinkImageData, filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD042", "no-empty-links" ], "description": "No empty links", diff --git a/lib/md043.mjs b/lib/md043.mjs index e7c8036c6..7342b190f 100644 --- a/lib/md043.mjs +++ b/lib/md043.mjs @@ -4,7 +4,7 @@ import { addErrorContext, addErrorDetailIf } from "../helpers/helpers.cjs"; import { getHeadingLevel, getHeadingText } from "../helpers/micromark-helpers.cjs"; import { filterByTypesCached } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD043", "required-headings" ], "description": "Required heading structure", diff --git a/lib/md044.mjs b/lib/md044.mjs index de8b6432d..8e586b3fa 100644 --- a/lib/md044.mjs +++ b/lib/md044.mjs @@ -8,7 +8,7 @@ const ignoredChildTypes = new Set( [ "codeFencedFence", "definition", "reference", "resource" ] ); -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD044", "proper-names" ], "description": "Proper names should have the correct capitalization", diff --git a/lib/md045.mjs b/lib/md045.mjs index a54ca6957..a6219aa25 100644 --- a/lib/md045.mjs +++ b/lib/md045.mjs @@ -6,7 +6,7 @@ import { filterByTypesCached } from "./cache.mjs"; const altRe = getHtmlAttributeRe("alt"); -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD045", "no-alt-text" ], "description": "Images should have alternate text (alt text)", diff --git a/lib/md046.mjs b/lib/md046.mjs index 264a02737..f30abb97c 100644 --- a/lib/md046.mjs +++ b/lib/md046.mjs @@ -8,7 +8,7 @@ const tokenTypeToStyle = { "codeIndented": "indented" }; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD046", "code-block-style" ], "description": "Code block style", diff --git a/lib/md047.mjs b/lib/md047.mjs index f1272ff17..a78b16724 100644 --- a/lib/md047.mjs +++ b/lib/md047.mjs @@ -2,7 +2,7 @@ import { addError, isBlankLine } from "../helpers/helpers.cjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD047", "single-trailing-newline" ], "description": "Files should end with a single newline character", diff --git a/lib/md048.mjs b/lib/md048.mjs index f70e437da..6265a3c2c 100644 --- a/lib/md048.mjs +++ b/lib/md048.mjs @@ -19,7 +19,7 @@ function fencedCodeBlockStyleFor(markup) { } }; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD048", "code-fence-style" ], "description": "Code fence style", diff --git a/lib/md049-md050.mjs b/lib/md049-md050.mjs index f641cb896..45fb7882d 100644 --- a/lib/md049-md050.mjs +++ b/lib/md049-md050.mjs @@ -21,8 +21,8 @@ function emphasisOrStrongStyleFor(markup) { }; /** - * @param {import("./markdownlint.mjs").RuleParams} params Rule parameters. - * @param {import("./markdownlint.mjs").RuleOnError} onError Error-reporting callback. + * @param {import("markdownlint").RuleParams} params Rule parameters. + * @param {import("markdownlint").RuleOnError} onError Error-reporting callback. * @param {import("micromark-util-types").TokenType} type Token type. * @param {import("micromark-util-types").TokenType} typeSequence Token sequence type. * @param {"*" | "**"} asterisk Asterisk kind. @@ -76,7 +76,7 @@ const impl = } }; -/** @type {import("./markdownlint.mjs").Rule[]} */ +/** @type {import("markdownlint").Rule[]} */ export default [ { "names": [ "MD049", "emphasis-style" ], diff --git a/lib/md051.mjs b/lib/md051.mjs index 51a40c7f7..65e51a9e9 100644 --- a/lib/md051.mjs +++ b/lib/md051.mjs @@ -20,7 +20,7 @@ const tokensInclude = new Set( * Converts a Markdown heading into an HTML fragment according to the rules * used by GitHub. * - * @param {import("../helpers/micromark-helpers.cjs").Token} headingText Heading text token. + * @param {import("markdownlint").MicromarkToken} headingText Heading text token. * @returns {string} Fragment string for heading. */ function convertHeadingToHTMLFragment(headingText) { @@ -49,7 +49,7 @@ function convertHeadingToHTMLFragment(headingText) { /** * Unescapes the text of a String-type micromark Token. * - * @param {import("../helpers/micromark-helpers.cjs").Token} token String-type micromark Token. + * @param {import("markdownlint").MicromarkToken} token String-type micromark Token. * @returns {string} Unescaped token text. */ function unescapeStringTokenText(token) { @@ -58,7 +58,7 @@ function unescapeStringTokenText(token) { .join(""); } -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD051", "link-fragments" ], "description": "Link fragments should be valid", @@ -101,7 +101,7 @@ export default { } // Process link and definition fragments - /** @type {import("../helpers/micromark-helpers.cjs").TokenType[][]} */ + /** @type {import("markdownlint").MicromarkTokenType[][]} */ const parentChilds = [ [ "link", "resourceDestinationString" ], [ "definition", "definitionDestinationString" ] diff --git a/lib/md052.mjs b/lib/md052.mjs index 883ea256c..975c45c67 100644 --- a/lib/md052.mjs +++ b/lib/md052.mjs @@ -3,7 +3,7 @@ import { addError } from "../helpers/helpers.cjs"; import { getReferenceLinkImageData } from "./cache.mjs"; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD052", "reference-links-images" ], "description": diff --git a/lib/md053.mjs b/lib/md053.mjs index fc724b73e..4ee3f82d4 100644 --- a/lib/md053.mjs +++ b/lib/md053.mjs @@ -5,7 +5,7 @@ import { getReferenceLinkImageData } from "./cache.mjs"; const linkReferenceDefinitionRe = /^ {0,3}\[([^\]]*[^\\])\]:/; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD053", "link-image-reference-definitions" ], "description": "Link and image reference definitions should be needed", diff --git a/lib/md054.mjs b/lib/md054.mjs index ec509a476..37f88193a 100644 --- a/lib/md054.mjs +++ b/lib/md054.mjs @@ -18,7 +18,7 @@ const autolinkAble = (destination) => { return !autolinkDisallowedRe.test(destination); }; -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD054", "link-image-style" ], "description": "Link and image style", diff --git a/lib/md055.mjs b/lib/md055.mjs index 10b1f281f..ed6c26b53 100644 --- a/lib/md055.mjs +++ b/lib/md055.mjs @@ -13,7 +13,7 @@ const makeRange = (start, end) => [ start, end - start + 1 ]; /** @typedef {import("micromark-extension-gfm-table")} */ -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD055", "table-pipe-style" ], "description": "Table pipe style", diff --git a/lib/md056.mjs b/lib/md056.mjs index d6f1a32b1..c1da47c15 100644 --- a/lib/md056.mjs +++ b/lib/md056.mjs @@ -8,7 +8,7 @@ const makeRange = (start, end) => [ start, end - start + 1 ]; /** @typedef {import("micromark-extension-gfm-table")} */ -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD056", "table-column-count" ], "description": "Table column count", diff --git a/lib/md058.mjs b/lib/md058.mjs index 4c1ee28f3..4d00857a3 100644 --- a/lib/md058.mjs +++ b/lib/md058.mjs @@ -6,7 +6,7 @@ import { filterByTypesCached } from "./cache.mjs"; /** @typedef {import("micromark-extension-gfm-table")} */ -/** @type {import("./markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ export default { "names": [ "MD058", "blanks-around-tables" ], "description": "Tables should be surrounded by blank lines", diff --git a/lib/micromark-parse.mjs b/lib/micromark-parse.mjs index afa496405..d848f5d1d 100644 --- a/lib/micromark-parse.mjs +++ b/lib/micromark-parse.mjs @@ -17,8 +17,8 @@ import { flatTokensSymbol, htmlFlowSymbol, newLineRe } from "../helpers/shared.c /** @typedef {import("micromark-util-types").State} State */ /** @typedef {import("micromark-util-types").Token} Token */ /** @typedef {import("micromark-util-types").Tokenizer} Tokenizer */ +/** @typedef {import("markdownlint").MicromarkToken} MicromarkToken */ /** @typedef {import("./micromark-types.d.mts")} */ -/** @typedef {import("../lib/markdownlint.mjs").MicromarkToken} MicromarkToken */ /** * Parse options. diff --git a/lib/types.d.mts b/lib/types.d.mts new file mode 100644 index 000000000..2ca3e4d35 --- /dev/null +++ b/lib/types.d.mts @@ -0,0 +1,12 @@ +declare module "markdownlint" { + export * from "./exports.mjs"; +} +declare module "markdownlint/async" { + export * from "./exports-async.mjs"; +} +declare module "markdownlint/promise" { + export * from "./exports-promise.mjs"; +} +declare module "markdownlint/sync" { + export * from "./exports-sync.mjs"; +} diff --git a/package.json b/package.json index ce1dad348..851dbc5cf 100644 --- a/package.json +++ b/package.json @@ -4,14 +4,17 @@ "description": "A Node.js style checker and lint tool for Markdown/CommonMark files.", "type": "module", "exports": { - ".": "./lib/markdownlint.mjs", + ".": "./lib/exports.mjs", + "./async": "./lib/exports-async.mjs", + "./promise": "./lib/exports-promise.mjs", + "./sync": "./lib/exports-sync.mjs", "./helpers": "./helpers/helpers.cjs", "./style/all": "./style/all.json", "./style/cirosantilli": "./style/cirosantilli.json", "./style/prettier": "./style/prettier.json", "./style/relaxed": "./style/relaxed.json" }, - "types": "./lib/markdownlint.d.mts", + "types": "./lib/types.d.mts", "author": "David Anson (https://dlaa.me/)", "license": "MIT", "homepage": "https://github.com/DavidAnson/markdownlint", @@ -25,7 +28,7 @@ "build-config": "npm run build-config-schema && npm run build-config-example", "build-config-example": "node schema/build-config-example.mjs", "build-config-schema": "node schema/build-config-schema.mjs", - "build-declaration": "tsc --allowJs --declaration --emitDeclarationOnly --module nodenext --outDir dts --target es2015 lib/markdownlint.mjs && node scripts/index.mjs copy dts/lib/markdownlint.d.mts lib/markdownlint.d.mts && node scripts/index.mjs remove dts", + "build-declaration": "tsc --allowJs --checkJs --declaration --emitDeclarationOnly --module nodenext --outDir dts --rootDir . --target es2015 lib/exports.mjs lib/exports-async.mjs lib/exports-promise.mjs lib/exports-sync.mjs lib/markdownlint.mjs && node scripts/index.mjs copy dts/lib/exports.d.mts lib/exports.d.mts && node scripts/index.mjs copy dts/lib/exports-async.d.mts lib/exports-async.d.mts && node scripts/index.mjs copy dts/lib/exports-promise.d.mts lib/exports-promise.d.mts && node scripts/index.mjs copy dts/lib/exports-sync.d.mts lib/exports-sync.d.mts && node scripts/index.mjs copy dts/lib/markdownlint.d.mts lib/markdownlint.d.mts && node scripts/index.mjs remove dts", "build-demo": "node scripts/index.mjs copy node_modules/markdown-it/dist/markdown-it.min.js demo/markdown-it.min.js && cd demo && webpack --no-stats", "build-docs": "node doc-build/build-rules.mjs", "build-example": "npm install --no-save --ignore-scripts grunt grunt-cli gulp through2", diff --git a/schema/build-config-schema.mjs b/schema/build-config-schema.mjs index ee91cbece..dd4a9bcaa 100644 --- a/schema/build-config-schema.mjs +++ b/schema/build-config-schema.mjs @@ -2,7 +2,7 @@ import fs from "node:fs/promises"; import path from "node:path"; -/** @type {import("../lib/markdownlint.mjs").Rule[]} */ +/** @type {import("markdownlint").Rule[]} */ import rules from "../lib/rules.mjs"; import jsonSchemaToTypeScript from "json-schema-to-typescript"; import { version } from "../lib/constants.mjs"; diff --git a/test/harness.mjs b/test/harness.mjs index e9eebe423..92ae78012 100644 --- a/test/harness.mjs +++ b/test/harness.mjs @@ -1,7 +1,6 @@ import { readFile } from "node:fs/promises"; +import { lint } from "markdownlint/promise"; import { parse } from "../lib/micromark-parse.mjs"; -import library from "../lib/markdownlint.mjs"; -const markdownlint = library.promises.markdownlint; /* eslint-disable no-await-in-loop, no-console */ @@ -43,7 +42,7 @@ for (const file of files) { let results = null; performance.mark("profile-start"); for (let i = 0; i < count; i++) { - results = await markdownlint({ + results = await lint({ "files": [ file ] }); } diff --git a/test/markdownlint-test-config.mjs b/test/markdownlint-test-config.mjs index e421661f0..524e095f4 100644 --- a/test/markdownlint-test-config.mjs +++ b/test/markdownlint-test-config.mjs @@ -6,14 +6,16 @@ const require = createRequire(import.meta.url); import os from "node:os"; import path from "node:path"; import test from "ava"; -import markdownlint from "../lib/markdownlint.mjs"; +import { readConfig as readConfigAsync } from "markdownlint/async"; +import { extendConfig, readConfig as readConfigPromise } from "markdownlint/promise"; +import { readConfig as readConfigSync } from "markdownlint/sync"; import { __dirname } from "./esm-helpers.mjs"; const sameFileSystem = (path.relative(os.homedir(), __dirname(import.meta)) !== __dirname(import.meta)); test("configSingle", (t) => new Promise((resolve) => { t.plan(2); - markdownlint.readConfig("./test/config/config-child.json", + readConfigAsync("./test/config/config-child.json", function callback(err, actual) { t.falsy(err); const expected = require("./config/config-child.json"); @@ -24,7 +26,7 @@ test("configSingle", (t) => new Promise((resolve) => { test("configAbsolute", (t) => new Promise((resolve) => { t.plan(2); - markdownlint.readConfig(path.join(__dirname(import.meta), "config", "config-child.json"), + readConfigAsync(path.join(__dirname(import.meta), "config", "config-child.json"), function callback(err, actual) { t.falsy(err); const expected = require("./config/config-child.json"); @@ -36,7 +38,7 @@ test("configAbsolute", (t) => new Promise((resolve) => { if (sameFileSystem) { test("configTilde", (t) => new Promise((resolve) => { t.plan(2); - markdownlint.readConfig( + readConfigAsync( `~/${path.relative(os.homedir(), "./test/config/config-child.json")}`, function callback(err, actual) { t.falsy(err); @@ -49,7 +51,7 @@ if (sameFileSystem) { test("configMultiple", (t) => new Promise((resolve) => { t.plan(2); - markdownlint.readConfig("./test/config/config-grandparent.json", + readConfigAsync("./test/config/config-grandparent.json", function callback(err, actual) { t.falsy(err); const expected = { @@ -66,7 +68,7 @@ test("configMultiple", (t) => new Promise((resolve) => { test("configMultipleWithRequireResolve", (t) => new Promise((resolve) => { t.plan(2); - markdownlint.readConfig("./test/config/config-packageparent.json", + readConfigAsync("./test/config/config-packageparent.json", function callback(err, actual) { t.falsy(err); const expected = { @@ -108,7 +110,7 @@ test("configCustomFileSystem", (t) => new Promise((resolve) => { return t.fail(p); } }; - markdownlint.readConfig( + readConfigAsync( file, // @ts-ignore null, @@ -128,7 +130,7 @@ test("configCustomFileSystem", (t) => new Promise((resolve) => { test("configBadFile", (t) => new Promise((resolve) => { t.plan(4); - markdownlint.readConfig("./test/config/config-badfile.json", + readConfigAsync("./test/config/config-badfile.json", function callback(err, result) { t.truthy(err, "Did not get an error for bad file."); t.true(err instanceof Error, "Error not instance of Error."); @@ -141,7 +143,7 @@ test("configBadFile", (t) => new Promise((resolve) => { test("configBadChildFile", (t) => new Promise((resolve) => { t.plan(4); - markdownlint.readConfig("./test/config/config-badchildfile.json", + readConfigAsync("./test/config/config-badchildfile.json", function callback(err, result) { t.truthy(err, "Did not get an error for bad child file."); t.true(err instanceof Error, "Error not instance of Error."); @@ -155,7 +157,7 @@ test("configBadChildFile", (t) => new Promise((resolve) => { test("configBadChildPackage", (t) => new Promise((resolve) => { t.plan(4); - markdownlint.readConfig("./test/config/config-badchildpackage.json", + readConfigAsync("./test/config/config-badchildpackage.json", function callback(err, result) { t.truthy(err, "Did not get an error for bad child package."); t.true(err instanceof Error, "Error not instance of Error."); @@ -169,7 +171,7 @@ test("configBadChildPackage", (t) => new Promise((resolve) => { test("configBadJson", (t) => new Promise((resolve) => { t.plan(3); - markdownlint.readConfig("./test/config/config-badjson.json", + readConfigAsync("./test/config/config-badjson.json", function callback(err, result) { t.truthy(err, "Did not get an error for bad JSON."); t.true(err instanceof Error, "Error not instance of Error."); @@ -180,7 +182,7 @@ test("configBadJson", (t) => new Promise((resolve) => { test("configBadChildJson", (t) => new Promise((resolve) => { t.plan(3); - markdownlint.readConfig("./test/config/config-badchildjson.json", + readConfigAsync("./test/config/config-badchildjson.json", function callback(err, result) { t.truthy(err, "Did not get an error for bad child JSON."); t.true(err instanceof Error, "Error not instance of Error."); @@ -191,7 +193,7 @@ test("configBadChildJson", (t) => new Promise((resolve) => { test("configSingleYaml", (t) => new Promise((resolve) => { t.plan(2); - markdownlint.readConfig( + readConfigAsync( "./test/config/config-child.yaml", // @ts-ignore [ require("js-yaml").load ], @@ -205,7 +207,7 @@ test("configSingleYaml", (t) => new Promise((resolve) => { test("configMultipleYaml", (t) => new Promise((resolve) => { t.plan(2); - markdownlint.readConfig( + readConfigAsync( "./test/config/config-grandparent.yaml", // @ts-ignore [ require("js-yaml").load ], @@ -225,7 +227,7 @@ test("configMultipleYaml", (t) => new Promise((resolve) => { test("configMultipleHybrid", (t) => new Promise((resolve) => { t.plan(2); - markdownlint.readConfig( + readConfigAsync( "./test/config/config-grandparent-hybrid.yaml", // @ts-ignore [ JSON.parse, require("toml").parse, require("js-yaml").load ], @@ -245,7 +247,7 @@ test("configMultipleHybrid", (t) => new Promise((resolve) => { test("configBadHybrid", (t) => new Promise((resolve) => { t.plan(4); - markdownlint.readConfig( + readConfigAsync( "./test/config/config-badcontent.txt", // @ts-ignore [ JSON.parse, require("toml").parse, require("js-yaml").load ], @@ -262,14 +264,14 @@ test("configBadHybrid", (t) => new Promise((resolve) => { test("configSingleSync", (t) => { t.plan(1); - const actual = markdownlint.readConfigSync("./test/config/config-child.json"); + const actual = readConfigSync("./test/config/config-child.json"); const expected = require("./config/config-child.json"); t.deepEqual(actual, expected, "Config object not correct."); }); test("configAbsoluteSync", (t) => { t.plan(1); - const actual = markdownlint.readConfigSync( + const actual = readConfigSync( path.join(__dirname(import.meta), "config", "config-child.json")); const expected = require("./config/config-child.json"); t.deepEqual(actual, expected, "Config object not correct."); @@ -278,7 +280,7 @@ test("configAbsoluteSync", (t) => { if (sameFileSystem) { test("configTildeSync", (t) => { t.plan(1); - const actual = markdownlint.readConfigSync( + const actual = readConfigSync( `~/${path.relative(os.homedir(), "./test/config/config-child.json")}`); const expected = require("./config/config-child.json"); t.deepEqual(actual, expected, "Config object not correct."); @@ -288,7 +290,7 @@ if (sameFileSystem) { test("configMultipleSync", (t) => { t.plan(1); const actual = - markdownlint.readConfigSync("./test/config/config-grandparent.json"); + readConfigSync("./test/config/config-grandparent.json"); const expected = { ...require("./config/config-child.json"), ...require("./config/config-parent.json"), @@ -303,7 +305,7 @@ test("configBadFileSync", (t) => { t.plan(1); t.throws( function badFileCall() { - markdownlint.readConfigSync("./test/config/config-badfile.json"); + readConfigSync("./test/config/config-badfile.json"); }, { "message": /ENOENT/ @@ -316,7 +318,7 @@ test("configBadChildFileSync", (t) => { t.plan(1); t.throws( function badChildFileCall() { - markdownlint.readConfigSync("./test/config/config-badchildfile.json"); + readConfigSync("./test/config/config-badchildfile.json"); }, { "message": /ENOENT/ @@ -329,7 +331,7 @@ test("configBadJsonSync", (t) => { t.plan(1); t.throws( function badJsonCall() { - markdownlint.readConfigSync("./test/config/config-badjson.json"); + readConfigSync("./test/config/config-badjson.json"); }, { "message": @@ -343,7 +345,7 @@ test("configBadChildJsonSync", (t) => { t.plan(1); t.throws( function badChildJsonCall() { - markdownlint.readConfigSync("./test/config/config-badchildjson.json"); + readConfigSync("./test/config/config-badchildjson.json"); }, { "message": @@ -355,7 +357,7 @@ test("configBadChildJsonSync", (t) => { test("configSingleYamlSync", (t) => { t.plan(1); - const actual = markdownlint.readConfigSync( + const actual = readConfigSync( // @ts-ignore "./test/config/config-child.yaml", [ require("js-yaml").load ]); const expected = require("./config/config-child.json"); @@ -364,7 +366,7 @@ test("configSingleYamlSync", (t) => { test("configMultipleYamlSync", (t) => { t.plan(1); - const actual = markdownlint.readConfigSync( + const actual = readConfigSync( // @ts-ignore "./test/config/config-grandparent.yaml", [ require("js-yaml").load ]); const expected = { @@ -379,7 +381,7 @@ test("configMultipleYamlSync", (t) => { test("configMultipleHybridSync", (t) => { t.plan(1); - const actual = markdownlint.readConfigSync( + const actual = readConfigSync( "./test/config/config-grandparent-hybrid.yaml", // @ts-ignore [ JSON.parse, require("toml").parse, require("js-yaml").load ]); @@ -420,7 +422,7 @@ test("configCustomFileSystemSync", (t) => { return t.fail(p); } }; - const actual = markdownlint.readConfigSync(file, undefined, fsApi); + const actual = readConfigSync(file, undefined, fsApi); const expected = { ...extendedContent, ...fileContent @@ -434,7 +436,7 @@ test("configBadHybridSync", (t) => { t.plan(1); t.throws( function badHybridCall() { - markdownlint.readConfigSync( + readConfigSync( "./test/config/config-badcontent.txt", // @ts-ignore [ JSON.parse, require("toml").parse, require("js-yaml").load ]); @@ -448,7 +450,7 @@ test("configBadHybridSync", (t) => { test("configSinglePromise", (t) => new Promise((resolve) => { t.plan(1); - markdownlint.promises.readConfig("./test/config/config-child.json") + readConfigPromise("./test/config/config-child.json") .then((actual) => { const expected = require("./config/config-child.json"); t.deepEqual(actual, expected, "Config object not correct."); @@ -487,7 +489,7 @@ test("configCustomFileSystemPromise", (t) => new Promise((resolve) => { } } }; - markdownlint.promises.readConfig(file, undefined, fsApi) + readConfigPromise(file, undefined, fsApi) .then((actual) => { const expected = { ...extendedContent, @@ -502,7 +504,7 @@ test("configCustomFileSystemPromise", (t) => new Promise((resolve) => { test("configBadFilePromise", (t) => new Promise((resolve) => { t.plan(2); - markdownlint.promises.readConfig("./test/config/config-badfile.json") + readConfigPromise("./test/config/config-badfile.json") .then( null, (error) => { @@ -516,7 +518,7 @@ test("configBadFilePromise", (t) => new Promise((resolve) => { test("extendSinglePromise", (t) => new Promise((resolve) => { t.plan(1); const expected = require("./config/config-child.json"); - markdownlint.promises.extendConfig( + extendConfig( expected, "./test/config/config-child.json", undefined, @@ -530,7 +532,7 @@ test("extendSinglePromise", (t) => new Promise((resolve) => { test("extendBadPromise", (t) => new Promise((resolve) => { t.plan(2); - markdownlint.promises.extendConfig( + extendConfig( { "extends": "missing.json" }, @@ -576,7 +578,7 @@ test("extendCustomFileSystemPromise", (t) => new Promise((resolve) => { } } }; - markdownlint.promises.extendConfig(fileContent, file, undefined, fsApi) + extendConfig(fileContent, file, undefined, fsApi) .then((actual) => { t.truthy(fileContent.extends); const expected = { diff --git a/test/markdownlint-test-custom-rules.mjs b/test/markdownlint-test-custom-rules.mjs index c6cf367d5..9e640f1f0 100644 --- a/test/markdownlint-test-custom-rules.mjs +++ b/test/markdownlint-test-custom-rules.mjs @@ -4,7 +4,9 @@ import fs from "node:fs/promises"; import { createRequire } from "node:module"; const require = createRequire(import.meta.url); import test from "ava"; -import markdownlint from "../lib/markdownlint.mjs"; +import { lint as lintAsync } from "markdownlint/async"; +import { lint as lintPromise } from "markdownlint/promise"; +import { lint as lintSync } from "markdownlint/sync"; import customRules from "./rules/rules.cjs"; import { newLineRe } from "../helpers/helpers.cjs"; import { __filename, importWithTypeJson } from "./esm-helpers.mjs"; @@ -14,13 +16,13 @@ const { homepage, version } = packageJson; test("customRulesV0", (t) => new Promise((resolve) => { t.plan(4); const customRulesMd = "./test/custom-rules.md"; - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": customRules.all, "files": [ customRulesMd ], "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = {}; expectedResult[customRulesMd] = { @@ -86,13 +88,13 @@ test("customRulesV0", (t) => new Promise((resolve) => { test("customRulesV1", (t) => new Promise((resolve) => { t.plan(3); const customRulesMd = "./test/custom-rules.md"; - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": customRules.all, "files": [ customRulesMd ], "resultVersion": 1 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = {}; expectedResult[customRulesMd] = [ @@ -217,13 +219,13 @@ test("customRulesV1", (t) => new Promise((resolve) => { test("customRulesV2", (t) => new Promise((resolve) => { t.plan(3); const customRulesMd = "./test/custom-rules.md"; - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": customRules.all, "files": [ customRulesMd ], "resultVersion": 2 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = {}; expectedResult[customRulesMd] = [ @@ -338,7 +340,7 @@ test("customRulesV2", (t) => new Promise((resolve) => { test("customRulesConfig", (t) => new Promise((resolve) => { t.plan(2); const customRulesMd = "./test/custom-rules.md"; - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": customRules.all, "files": [ customRulesMd ], @@ -351,7 +353,7 @@ test("customRulesConfig", (t) => new Promise((resolve) => { }, "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = {}; expectedResult[customRulesMd] = { @@ -368,7 +370,7 @@ test("customRulesConfig", (t) => new Promise((resolve) => { test("customRulesNpmPackage", (t) => new Promise((resolve) => { t.plan(2); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ require("./rules/npm"), @@ -379,7 +381,7 @@ test("customRulesNpmPackage", (t) => new Promise((resolve) => { }, "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = {}; expectedResult.string = { @@ -431,13 +433,13 @@ test("customRulesBadProperty", (t) => { for (const propertyValue of propertyValues) { const badRule = { ...customRules.firstLine }; badRule[propertyName] = propertyValue; - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ badRule ] }; t.throws( function badRuleCall() { - markdownlint.sync(options); + lintSync(options); }, { "message": @@ -451,8 +453,8 @@ test("customRulesBadProperty", (t) => { test("customRulesUsedNameName", (t) => new Promise((resolve) => { t.plan(4); - markdownlint({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + lintAsync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name", "NO-missing-SPACE-atx" ], @@ -477,8 +479,8 @@ test("customRulesUsedNameName", (t) => new Promise((resolve) => { test("customRulesUsedNameTag", (t) => new Promise((resolve) => { t.plan(4); - markdownlint({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + lintAsync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name", "HtMl" ], @@ -502,8 +504,8 @@ test("customRulesUsedNameTag", (t) => new Promise((resolve) => { test("customRulesUsedTagName", (t) => new Promise((resolve) => { t.plan(4); - markdownlint({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + lintAsync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "filler" ], @@ -535,7 +537,7 @@ test("customRulesUsedTagName", (t) => new Promise((resolve) => { test("customRulesParserUndefined", (t) => { t.plan(5); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ // @ts-ignore @@ -557,12 +559,12 @@ test("customRulesParserUndefined", (t) => { "string": "# Heading\n" } }; - return markdownlint.promises.markdownlint(options).then(() => null); + return lintPromise(options).then(() => null); }); test("customRulesParserNone", (t) => { t.plan(2); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -581,12 +583,12 @@ test("customRulesParserNone", (t) => { "string": "# Heading\n" } }; - return markdownlint.promises.markdownlint(options).then(() => null); + return lintPromise(options).then(() => null); }); test("customRulesParserMarkdownIt", (t) => { t.plan(5); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -608,12 +610,12 @@ test("customRulesParserMarkdownIt", (t) => { "string": "# Heading\n" } }; - return markdownlint.promises.markdownlint(options).then(() => null); + return lintPromise(options).then(() => null); }); test("customRulesParserMicromark", (t) => { t.plan(5); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -635,12 +637,12 @@ test("customRulesParserMicromark", (t) => { "string": "# Heading\n" } }; - return markdownlint.promises.markdownlint(options).then(() => null); + return lintPromise(options).then(() => null); }); test("customRulesMarkdownItParamsTokensSameObject", (t) => { t.plan(1); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ // @ts-ignore @@ -659,12 +661,12 @@ test("customRulesMarkdownItParamsTokensSameObject", (t) => { "string": "# Heading\n" } }; - return markdownlint.promises.markdownlint(options).then(() => null); + return lintPromise(options).then(() => null); }); test("customRulesMarkdownItTokensSnapshot", (t) => { t.plan(1); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -684,13 +686,13 @@ test("customRulesMarkdownItTokensSnapshot", (t) => { .readFile("./test/every-markdown-syntax.md", "utf8") .then((content) => { options.strings = { "content": content.split(newLineRe).join("\n") }; - return markdownlint.promises.markdownlint(options).then(() => null); + return lintPromise(options).then(() => null); }); }); test("customRulesMicromarkTokensSnapshot", (t) => { t.plan(1); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -710,13 +712,13 @@ test("customRulesMicromarkTokensSnapshot", (t) => { .readFile("./test/every-markdown-syntax.md", "utf8") .then((content) => { options.strings = { "content": content.split(newLineRe).join("\n") }; - return markdownlint.promises.markdownlint(options).then(() => null); + return lintPromise(options).then(() => null); }); }); test("customRulesDefinitionStatic", (t) => new Promise((resolve) => { t.plan(2); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -741,7 +743,7 @@ test("customRulesDefinitionStatic", (t) => new Promise((resolve) => { "string": "# Heading\n" } }; - markdownlint(options, (err, actualResult) => { + lintAsync(options, (err, actualResult) => { t.falsy(err); const expectedResult = { "string": [ @@ -765,8 +767,8 @@ test("customRulesDefinitionStatic", (t) => new Promise((resolve) => { test("customRulesThrowForFile", (t) => new Promise((resolve) => { t.plan(4); const exceptionMessage = "Test exception message"; - markdownlint({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + lintAsync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -795,8 +797,8 @@ test("customRulesThrowForFileSync", (t) => { const exceptionMessage = "Test exception message"; t.throws( function customRuleThrowsCall() { - markdownlint.sync({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + lintSync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -821,8 +823,8 @@ test("customRulesThrowForFileSync", (t) => { test("customRulesThrowForString", (t) => new Promise((resolve) => { t.plan(4); const exceptionMessage = "Test exception message"; - markdownlint({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + lintAsync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -853,8 +855,8 @@ test("customRulesThrowForStringSync", (t) => { const exceptionMessage = "Test exception message"; t.throws( function customRuleThrowsCall() { - markdownlint.sync({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + lintSync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -880,8 +882,8 @@ test("customRulesThrowForStringSync", (t) => { test("customRulesOnErrorNull", (t) => new Promise((resolve) => { t.plan(4); - markdownlint({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + lintAsync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -914,7 +916,7 @@ test("customRulesOnErrorNull", (t) => new Promise((resolve) => { test("customRulesOnErrorNullSync", (t) => { t.plan(1); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -934,7 +936,7 @@ test("customRulesOnErrorNullSync", (t) => { }; t.throws( function nullErrorCall() { - markdownlint.sync(options); + lintSync(options); }, { "message": "Value of 'lineNumber' passed to onError by 'NAME' is incorrect for 'string'." @@ -1005,7 +1007,7 @@ test("customRulesOnErrorBad", (t) => { badObject[propertyName] = propertyValue; propertyNames = propertyName; } - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -1024,7 +1026,7 @@ test("customRulesOnErrorBad", (t) => { }; t.throws( function badErrorCall() { - markdownlint.sync(options); + lintSync(options); }, { "message": @@ -1077,7 +1079,7 @@ test("customRulesOnErrorInvalid", (t) => { badObject[propertyName] = propertyValue; propertyNames = propertyName; } - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -1096,7 +1098,7 @@ test("customRulesOnErrorInvalid", (t) => { }; t.throws( function invalidErrorCall() { - markdownlint.sync(options); + lintSync(options); }, { "message": @@ -1152,7 +1154,7 @@ test("customRulesOnErrorValid", (t) => { } else { goodObject[propertyName] = propertyValue; } - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -1169,7 +1171,7 @@ test("customRulesOnErrorValid", (t) => { "string": "Text\ntext" } }; - markdownlint.sync(options); + lintSync(options); t.truthy(true); } } @@ -1177,7 +1179,7 @@ test("customRulesOnErrorValid", (t) => { test("customRulesOnErrorLazy", (t) => new Promise((resolve) => { t.plan(2); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -1199,7 +1201,7 @@ test("customRulesOnErrorLazy", (t) => new Promise((resolve) => { "string": "# Heading\n" } }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "string": [ @@ -1234,7 +1236,7 @@ test("customRulesOnErrorModified", (t) => new Promise((resolve) => { "insertText": "text" } }; - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -1259,7 +1261,7 @@ test("customRulesOnErrorModified", (t) => new Promise((resolve) => { "string": "# Heading\n" } }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "string": [ @@ -1286,8 +1288,8 @@ test("customRulesOnErrorModified", (t) => new Promise((resolve) => { test("customRulesOnErrorInvalidHandled", (t) => new Promise((resolve) => { t.plan(2); - markdownlint({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + lintAsync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1329,8 +1331,8 @@ test("customRulesOnErrorInvalidHandled", (t) => new Promise((resolve) => { test("customRulesOnErrorInvalidHandledSync", (t) => { t.plan(1); - const actualResult = markdownlint.sync({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + const actualResult = lintSync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1370,7 +1372,7 @@ test("customRulesOnErrorInvalidHandledSync", (t) => { test("customRulesVersion", (t) => new Promise((resolve) => { t.plan(2); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -1385,7 +1387,7 @@ test("customRulesVersion", (t) => new Promise((resolve) => { ], "files": "doc/CustomRules.md" }; - markdownlint(options, function callback(err) { + lintAsync(options, function callback(err) { t.falsy(err); resolve(); }); @@ -1393,7 +1395,7 @@ test("customRulesVersion", (t) => new Promise((resolve) => { test("customRulesFileName", (t) => new Promise((resolve) => { t.plan(2); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -1408,7 +1410,7 @@ test("customRulesFileName", (t) => new Promise((resolve) => { ], "files": "doc/CustomRules.md" }; - markdownlint(options, function callback(err) { + lintAsync(options, function callback(err) { t.falsy(err); resolve(); }); @@ -1416,7 +1418,7 @@ test("customRulesFileName", (t) => new Promise((resolve) => { test("customRulesStringName", (t) => new Promise((resolve) => { t.plan(2); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -1433,7 +1435,7 @@ test("customRulesStringName", (t) => new Promise((resolve) => { "string": "# Heading" } }; - markdownlint(options, function callback(err) { + lintAsync(options, function callback(err) { t.falsy(err); resolve(); }); @@ -1441,8 +1443,8 @@ test("customRulesStringName", (t) => new Promise((resolve) => { test("customRulesOnErrorInformationNotRuleNotError", (t) => { t.plan(1); - const actualResult = markdownlint.sync({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + const actualResult = lintSync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1465,8 +1467,8 @@ test("customRulesOnErrorInformationNotRuleNotError", (t) => { test("customRulesOnErrorInformationRuleNotError", (t) => { t.plan(1); - const actualResult = markdownlint.sync({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + const actualResult = lintSync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1494,8 +1496,8 @@ test("customRulesOnErrorInformationRuleNotError", (t) => { test("customRulesOnErrorInformationNotRuleError", (t) => { t.plan(1); - const actualResult = markdownlint.sync({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + const actualResult = lintSync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1523,8 +1525,8 @@ test("customRulesOnErrorInformationNotRuleError", (t) => { test("customRulesOnErrorInformationRuleError", (t) => { t.plan(1); - const actualResult = markdownlint.sync({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + const actualResult = lintSync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1553,8 +1555,8 @@ test("customRulesOnErrorInformationRuleError", (t) => { test("customRulesOnErrorInformationRuleErrorUndefined", (t) => { t.plan(1); - const actualResult = markdownlint.sync({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + const actualResult = lintSync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1583,8 +1585,8 @@ test("customRulesOnErrorInformationRuleErrorUndefined", (t) => { test("customRulesOnErrorInformationRuleErrorMultiple", (t) => { t.plan(6); - const actualResult = markdownlint.sync({ - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + const actualResult = lintSync({ + /** @type {import("markdownlint").Rule[]} */ "customRules": [ { "names": [ "name" ], @@ -1645,7 +1647,7 @@ test("customRulesOnErrorInformationRuleErrorMultiple", (t) => { test("customRulesDoc", (t) => new Promise((resolve) => { t.plan(2); - markdownlint({ + lintAsync({ "files": "./doc/CustomRules.md", "config": { "MD013": { "line_length": 200 } @@ -1660,12 +1662,12 @@ test("customRulesDoc", (t) => new Promise((resolve) => { test("customRulesLintJavaScript", (t) => new Promise((resolve) => { t.plan(2); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": customRules.lintJavaScript, "files": "test/lint-javascript.md" }; - markdownlint(options, (err, actual) => { + lintAsync(options, (err, actual) => { t.falsy(err); const expected = { "test/lint-javascript.md": [ @@ -1688,12 +1690,12 @@ test("customRulesLintJavaScript", (t) => new Promise((resolve) => { test("customRulesValidateJson", (t) => new Promise((resolve) => { t.plan(3); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": customRules.validateJson, "files": "test/validate-json.md" }; - markdownlint(options, (err, actual) => { + lintAsync(options, (err, actual) => { t.falsy(err); const expected = { "test/validate-json.md": [ @@ -1721,7 +1723,7 @@ test("customRulesValidateJson", (t) => new Promise((resolve) => { test("customRulesAsyncThrowsInSyncContext", (t) => { t.plan(1); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -1738,7 +1740,7 @@ test("customRulesAsyncThrowsInSyncContext", (t) => { } }; t.throws( - () => markdownlint.sync(options), + () => lintSync(options), { "message": "Custom rule name1/name2 at index 0 is asynchronous and " + "can not be used in a synchronous context." @@ -1765,7 +1767,7 @@ test("customRulesParamsAreFrozen", (t) => { } } }; - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -1792,14 +1794,14 @@ test("customRulesParamsAreFrozen", (t) => { ], "files": [ "README.md" ] }; - return markdownlint.promises.markdownlint(options).then(() => null); + return lintPromise(options).then(() => null); }); test("customRulesParamsAreStable", (t) => { t.plan(4); const config1 = { "value1": 10 }; const config2 = { "value2": 20 }; - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "config": { "MD010": true, @@ -1860,12 +1862,12 @@ test("customRulesParamsAreStable", (t) => { "string": "# Heading" } }; - return markdownlint.promises.markdownlint(options).then(() => null); + return lintPromise(options).then(() => null); }); test("customRulesAsyncReadFiles", (t) => { t.plan(3); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -1947,13 +1949,13 @@ test("customRulesAsyncReadFiles", (t) => { } ] }; - return markdownlint.promises.markdownlint(options) + return lintPromise(options) .then((actual) => t.deepEqual(actual, expected, "Unexpected issues.")); }); test("customRulesAsyncIgnoresSyncReturn", (t) => { t.plan(1); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -2011,7 +2013,7 @@ test("customRulesAsyncIgnoresSyncReturn", (t) => { } ] }; - return markdownlint.promises.markdownlint(options) + return lintPromise(options) .then((actual) => t.deepEqual(actual, expected, "Unexpected issues.")); }); @@ -2044,7 +2046,7 @@ for (const flavor of [ ] ]) { const [ name, func ] = flavor; - /** @type {import("../lib/markdownlint.mjs").Rule[]} */ + /** @type {import("markdownlint").Rule[]} */ const customRule = [ { "names": [ "name" ], @@ -2074,7 +2076,7 @@ for (const flavor of [ test(`${name}${subname}UnhandledAsync`, (t) => new Promise((resolve) => { t.plan(4); - markdownlint({ + lintAsync({ // @ts-ignore "customRules": customRule, // @ts-ignore @@ -2093,7 +2095,7 @@ for (const flavor of [ test(`${name}${subname}HandledAsync`, (t) => new Promise((resolve) => { t.plan(2); - markdownlint({ + lintAsync({ // @ts-ignore "customRules": customRule, // @ts-ignore @@ -2111,7 +2113,7 @@ for (const flavor of [ test(`${name}${subname}UnhandledSync`, (t) => { t.plan(1); t.throws( - () => markdownlint.sync({ + () => lintSync({ // @ts-ignore "customRules": customRule, // @ts-ignore @@ -2128,7 +2130,7 @@ for (const flavor of [ test(`${name}${subname}HandledSync`, (t) => { t.plan(1); - const actualResult = markdownlint.sync({ + const actualResult = lintSync({ // @ts-ignore "customRules": customRule, // @ts-ignore @@ -2181,7 +2183,7 @@ for (const flavor of [ ] ]) { const [ name, func ] = flavor; - /** @type {import("../lib/markdownlint.mjs").Rule} */ + /** @type {import("markdownlint").Rule} */ const customRule = { "names": [ "name" ], "description": "description", @@ -2196,7 +2198,7 @@ for (const flavor of [ test(`${name}${subname}Unhandled`, (t) => new Promise((resolve) => { t.plan(4); - markdownlint({ + lintAsync({ // @ts-ignore "customRules": [ customRule ], // @ts-ignore @@ -2215,7 +2217,7 @@ for (const flavor of [ test(`${name}${subname}Handled`, (t) => new Promise((resolve) => { t.plan(2); - markdownlint({ + lintAsync({ // @ts-ignore "customRules": [ customRule ], // @ts-ignore diff --git a/test/markdownlint-test-extra-parse.mjs b/test/markdownlint-test-extra-parse.mjs index 976014484..84fe3de31 100644 --- a/test/markdownlint-test-extra-parse.mjs +++ b/test/markdownlint-test-extra-parse.mjs @@ -2,12 +2,12 @@ import test from "ava"; import { globby } from "globby"; -import markdownlint from "../lib/markdownlint.mjs"; +import { lint } from "markdownlint/promise"; // Parses all Markdown files in all package dependencies test("parseAllFiles", async(t) => { t.plan(1); const files = await globby("**/*.{md,markdown}"); - await markdownlint.promises.markdownlint({ files }); + await lint({ files }); t.pass(); }); diff --git a/test/markdownlint-test-extra-type.mjs b/test/markdownlint-test-extra-type.mjs index e18b36cb0..f5b0c2308 100644 --- a/test/markdownlint-test-extra-type.mjs +++ b/test/markdownlint-test-extra-type.mjs @@ -3,7 +3,7 @@ import fs from "node:fs"; import path from "node:path"; import test from "ava"; -import markdownlint from "../lib/markdownlint.mjs"; +import { lint } from "markdownlint/sync"; // Simulates typing each test file to validate handling of partial input const files = fs @@ -18,7 +18,7 @@ for (const file of files) { } test.serial(`type ${file}`, (t) => { t.plan(1); - markdownlint.sync({ + lint({ // @ts-ignore strings, "resultVersion": 0 diff --git a/test/markdownlint-test-fixes.mjs b/test/markdownlint-test-fixes.mjs index 4db880d32..6cf6407da 100644 --- a/test/markdownlint-test-fixes.mjs +++ b/test/markdownlint-test-fixes.mjs @@ -1,7 +1,7 @@ // @ts-check import test from "ava"; -import markdownlint from "../lib/markdownlint.mjs"; +import { applyFix, applyFixes } from "markdownlint"; test("applyFix", (t) => { t.plan(4); @@ -46,7 +46,7 @@ test("applyFix", (t) => { for (const testCase of testCases) { const [ line, fixInfo, lineEnding, expected ] = testCase; // @ts-ignore - const actual = markdownlint.applyFix(line, fixInfo, lineEnding); + const actual = applyFix(line, fixInfo, lineEnding); t.is(actual, String(expected), "Incorrect fix applied."); } }); @@ -524,7 +524,7 @@ test("applyFixes", (t) => { for (const testCase of testCases) { const [ input, errors, expected ] = testCase; // @ts-ignore - const actual = markdownlint.applyFixes(input, errors); + const actual = applyFixes(input, errors); t.is(actual, String(expected), "Incorrect fix applied."); } }); diff --git a/test/markdownlint-test-helpers.mjs b/test/markdownlint-test-helpers.mjs index 0284e859d..64ff908f6 100644 --- a/test/markdownlint-test-helpers.mjs +++ b/test/markdownlint-test-helpers.mjs @@ -6,8 +6,7 @@ import test from "ava"; import { characterEntities } from "character-entities"; import { gemoji } from "gemoji"; import helpers from "../helpers/helpers.cjs"; -import libMarkdownlint from "../lib/markdownlint.mjs"; -const { markdownlint } = libMarkdownlint.promises; +import { lint } from "markdownlint/promise"; import { forEachInlineCodeSpan } from "../lib/markdownit.cjs"; import { getReferenceLinkImageData } from "../lib/cache.mjs"; @@ -387,7 +386,7 @@ test("expandTildePath", (t) => { test("getReferenceLinkImageData().shortcuts", (t) => { t.plan(1); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -415,7 +414,7 @@ Empty bracket pair: [text4[]] ` } }; - return markdownlint(options).then(() => null); + return lint(options).then(() => null); }); test("endOfLineHtmlEntityRe", (t) => { diff --git a/test/markdownlint-test-parallel.mjs b/test/markdownlint-test-parallel.mjs index 615b464e6..e9bc26c0c 100644 --- a/test/markdownlint-test-parallel.mjs +++ b/test/markdownlint-test-parallel.mjs @@ -3,15 +3,14 @@ // eslint-disable-next-line n/no-unsupported-features/node-builtins import { availableParallelism } from "node:os"; import { Worker } from "node:worker_threads"; +import { lint } from "markdownlint/sync"; import { __filename } from "./esm-helpers.mjs"; -import markdownlint from "../lib/markdownlint.mjs"; -const markdownlintSync = markdownlint.sync; /** * Lint specified Markdown files (using multiple threads). * - * @param {import("../lib/markdownlint.mjs").Options} options Configuration options. - * @returns {Promise} Results object. + * @param {import("markdownlint").Options} options Configuration options. + * @returns {Promise} Results object. */ export function markdownlintParallel(options) { const workerCount = availableParallelism(); @@ -30,7 +29,7 @@ export function markdownlintParallel(options) { })); } return Promise.all(promises).then((workerResults) => { - const combinedResults = markdownlintSync(null); + const combinedResults = lint(null); for (const workerResult of workerResults) { // eslint-disable-next-line guard-for-in for (const result in workerResult) { diff --git a/test/markdownlint-test-repos.mjs b/test/markdownlint-test-repos.mjs index 1ff5bc39a..13d36fe9f 100644 --- a/test/markdownlint-test-repos.mjs +++ b/test/markdownlint-test-repos.mjs @@ -5,8 +5,7 @@ const { join } = path.posix; import { globby } from "globby"; import jsoncParser from "jsonc-parser"; import jsYaml from "js-yaml"; -import library from "../lib/markdownlint.mjs"; -const { markdownlint, readConfig } = library.promises; +import { lint, readConfig } from "markdownlint/promise"; import { markdownlintParallel } from "./markdownlint-test-parallel.mjs"; /** @@ -39,7 +38,7 @@ export function lintTestRepo(t, globPatterns, configPath, parallel) { v ]) ); - return (parallel ? markdownlintParallel : markdownlint)({ + return (parallel ? markdownlintParallel : lint)({ files, config }).then((results) => { diff --git a/test/markdownlint-test-result-object.mjs b/test/markdownlint-test-result-object.mjs index 3f4b549df..a67e37318 100644 --- a/test/markdownlint-test-result-object.mjs +++ b/test/markdownlint-test-result-object.mjs @@ -1,7 +1,8 @@ // @ts-check import test from "ava"; -import markdownlint from "../lib/markdownlint.mjs"; +import { lint as lintAsync } from "markdownlint/async"; +import { lint as lintSync } from "markdownlint/sync"; import { importWithTypeJson } from "./esm-helpers.mjs"; const packageJson = await importWithTypeJson(import.meta, "../package.json"); const { homepage, version } = packageJson; @@ -13,7 +14,7 @@ test("resultObjectToStringNotEnumerable", (t) => new Promise((resolve) => { "string": "# Heading" } }; - markdownlint(options, function callback(err, result) { + lintAsync(options, function callback(err, result) { t.falsy(err); // eslint-disable-next-line guard-for-in for (const property in result) { @@ -36,7 +37,7 @@ test("resultFormattingV0", (t) => new Promise((resolve) => { "noInlineConfig": true, "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "./test/atx_heading_spacing.md": { @@ -95,7 +96,7 @@ test("resultFormattingSyncV0", (t) => { "noInlineConfig": true, "resultVersion": 0 }; - const actualResult = markdownlint.sync(options); + const actualResult = lintSync(options); const expectedResult = { "./test/atx_heading_spacing.md": { "MD018": [ 1 ], @@ -154,7 +155,7 @@ test("resultFormattingV1", (t) => new Promise((resolve) => { "noInlineConfig": true, "resultVersion": 1 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "truncate": [ @@ -258,7 +259,7 @@ test("resultFormattingV2", (t) => new Promise((resolve) => { "noInlineConfig": true, "resultVersion": 2 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "truncate": [ @@ -352,7 +353,7 @@ test("resultFormattingV3", (t) => new Promise((resolve) => { }, "resultVersion": 3 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "input": [ @@ -467,7 +468,7 @@ test("onePerLineResultVersion0", (t) => new Promise((resolve) => { }, "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "input": { @@ -488,7 +489,7 @@ test("onePerLineResultVersion1", (t) => new Promise((resolve) => { }, "resultVersion": 1 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "input": [ @@ -519,7 +520,7 @@ test("onePerLineResultVersion2", (t) => new Promise((resolve) => { }, "resultVersion": 2 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "input": [ @@ -548,7 +549,7 @@ test("manyPerLineResultVersion3", (t) => new Promise((resolve) => { }, "resultVersion": 3 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "input": [ @@ -597,7 +598,7 @@ test("frontMatterResultVersion3", (t) => new Promise((resolve) => { }, "resultVersion": 3 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "input": [ diff --git a/test/markdownlint-test-scenarios.mjs b/test/markdownlint-test-scenarios.mjs index 76f60f870..c98b4f9c1 100644 --- a/test/markdownlint-test-scenarios.mjs +++ b/test/markdownlint-test-scenarios.mjs @@ -3,9 +3,8 @@ import fs from "node:fs/promises"; import path from "node:path"; import test from "ava"; -import libMarkdownlint from "../lib/markdownlint.mjs"; -const { applyFixes, promises } = libMarkdownlint; -const { markdownlint } = promises; +import { lint } from "markdownlint/promise"; +import { applyFixes } from "markdownlint"; import helpers from "../helpers/helpers.cjs"; import { fixableRuleNames } from "../lib/constants.mjs"; @@ -22,7 +21,7 @@ function createTestForFile(file) { // Read and lint Markdown test file Promise.all([ fs.readFile(file, "utf8"), - markdownlint({ + lint({ "files": [ file ] }) ]) @@ -89,7 +88,7 @@ function createTestForFile(file) { fixed }); // Identify missing fixes - return markdownlint({ + return lint({ "strings": { "input": fixed } diff --git a/test/markdownlint-test-worker.mjs b/test/markdownlint-test-worker.mjs index a2c7a9db1..7678aa357 100644 --- a/test/markdownlint-test-worker.mjs +++ b/test/markdownlint-test-worker.mjs @@ -1,10 +1,9 @@ // @ts-check import { parentPort, workerData } from "node:worker_threads"; -import library from "../lib/markdownlint.mjs"; -const { markdownlint } = library.promises; +import { lint } from "markdownlint/promise"; -const lintResults = await markdownlint(workerData); +const lintResults = await lint(workerData); // @ts-ignore parentPort // eslint-disable-next-line unicorn/require-post-message-target-origin diff --git a/test/markdownlint-test.mjs b/test/markdownlint-test.mjs index 99431b90b..d37d9b4a6 100644 --- a/test/markdownlint-test.mjs +++ b/test/markdownlint-test.mjs @@ -13,7 +13,10 @@ import pluginInline from "markdown-it-for-inline"; import pluginSub from "markdown-it-sub"; import pluginSup from "markdown-it-sup"; import test from "ava"; -import markdownlint from "../lib/markdownlint.mjs"; +import { getVersion } from "markdownlint"; +import { lint as lintAsync } from "markdownlint/async"; +import { lint as lintPromise } from "markdownlint/promise"; +import { lint as lintSync } from "markdownlint/sync"; import * as constants from "../lib/constants.mjs"; import rules from "../lib/rules.mjs"; import customRules from "./rules/rules.cjs"; @@ -36,7 +39,7 @@ test("simpleAsync", (t) => new Promise((resolve) => { }; const expected = "content: 1: MD047/single-trailing-newline " + "Files should end with a single newline character"; - markdownlint(options, (err, actual) => { + lintAsync(options, (err, actual) => { t.falsy(err); // @ts-ignore t.is(actual.toString(), expected, "Unexpected results."); @@ -53,7 +56,7 @@ test("simpleSync", (t) => { }; const expected = "content: 1: MD047/single-trailing-newline " + "Files should end with a single newline character"; - const actual = markdownlint.sync(options).toString(); + const actual = lintSync(options).toString(); t.is(actual, expected, "Unexpected results."); }); @@ -66,7 +69,7 @@ test("simplePromise", (t) => { }; const expected = "content: 1: MD047/single-trailing-newline " + "Files should end with a single newline character"; - return markdownlint.promises.markdownlint(options).then((actual) => { + return lintPromise(options).then((actual) => { t.is(actual.toString(), expected, "Unexpected results."); }); }); @@ -90,7 +93,7 @@ test("projectFiles", (t) => { "config": require("../.markdownlint.json") }; // @ts-ignore - return markdownlint.promises.markdownlint(options).then((actual) => { + return lintPromise(options).then((actual) => { const expected = {}; for (const file of files) { expected[file] = []; @@ -118,7 +121,7 @@ test("projectFilesExtendedAscii", (t) => { "customRules": [ require("markdownlint-rule-extended-ascii") ] }; // @ts-ignore - return markdownlint.promises.markdownlint(options).then((actual) => { + return lintPromise(options).then((actual) => { const expected = {}; for (const file of files) { expected[file] = []; @@ -142,7 +145,7 @@ test("stringInputLineEndings", (t) => new Promise((resolve) => { }, "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "cr": { "MD018": [ 3 ] }, @@ -168,7 +171,7 @@ test("inputOnlyNewline", (t) => new Promise((resolve) => { "default": false } }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "cr": [], @@ -193,7 +196,7 @@ test("defaultTrue", (t) => new Promise((resolve) => { "noInlineConfig": true, "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "./test/atx_heading_spacing.md": { @@ -224,7 +227,7 @@ test("defaultFalse", (t) => new Promise((resolve) => { "noInlineConfig": true, "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "./test/atx_heading_spacing.md": {}, @@ -247,7 +250,7 @@ test("defaultUndefined", (t) => new Promise((resolve) => { "noInlineConfig": true, "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "./test/atx_heading_spacing.md": { @@ -279,7 +282,7 @@ test("disableRules", (t) => new Promise((resolve) => { }, "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "./test/atx_heading_spacing.md": { @@ -308,7 +311,7 @@ test("enableRules", (t) => new Promise((resolve) => { "noInlineConfig": true, "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "./test/atx_heading_spacing.md": { @@ -340,7 +343,7 @@ test("enableRulesMixedCase", (t) => new Promise((resolve) => { "noInlineConfig": true, "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "./test/atx_heading_spacing.md": { @@ -371,7 +374,7 @@ test("disableTag", (t) => new Promise((resolve) => { "noInlineConfig": true, "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "./test/atx_heading_spacing.md": { @@ -401,7 +404,7 @@ test("enableTag", (t) => new Promise((resolve) => { }, "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "./test/atx_heading_spacing.md": { @@ -430,7 +433,7 @@ test("enableTagMixedCase", (t) => new Promise((resolve) => { }, "resultVersion": 0 }; - markdownlint(options, function callback(err, actualResult) { + lintAsync(options, function callback(err, actualResult) { t.falsy(err); const expectedResult = { "./test/atx_heading_spacing.md": { @@ -464,7 +467,7 @@ test("styleAll", async(t) => { "noInlineConfig": true, "resultVersion": 0 }; - const actualResult = await markdownlint.promises.markdownlint(options); + const actualResult = await lintPromise(options); const expectedResult = { "./test/break-all-the-rules.md": { "MD001": [ 3 ], @@ -527,7 +530,7 @@ test("styleRelaxed", async(t) => { "noInlineConfig": true, "resultVersion": 0 }; - const actualResult = await markdownlint.promises.markdownlint(options); + const actualResult = await lintPromise(options); const expectedResult = { "./test/break-all-the-rules.md": { "MD001": [ 3 ], @@ -569,7 +572,7 @@ test("styleRelaxed", async(t) => { test("nullFrontMatter", (t) => new Promise((resolve) => { t.plan(2); - markdownlint({ + lintAsync({ "strings": { "content": "---\n\t\n---\n# Heading\n" }, @@ -592,7 +595,7 @@ test("nullFrontMatter", (t) => new Promise((resolve) => { test("customFrontMatter", (t) => new Promise((resolve) => { t.plan(2); - markdownlint({ + lintAsync({ "strings": { "content": "\n\t\n\n# Heading\n" }, @@ -613,7 +616,7 @@ test("customFrontMatter", (t) => new Promise((resolve) => { test("noInlineConfig", (t) => new Promise((resolve) => { t.plan(2); - markdownlint({ + lintAsync({ "strings": { "content": [ "# Heading", @@ -646,7 +649,7 @@ test("noInlineConfig", (t) => new Promise((resolve) => { test("readmeHeadings", (t) => new Promise((resolve) => { t.plan(2); - markdownlint({ + lintAsync({ "files": "README.md", "noInlineConfig": true, "config": { @@ -713,7 +716,7 @@ test("filesArrayNotModified", (t) => new Promise((resolve) => { "./test/first_heading_bad_atx.md" ]; const expectedFiles = [ ...files ]; - markdownlint({ "files": files }, function callback(err) { + lintAsync({ "files": files }, function callback(err) { t.falsy(err); t.deepEqual(files, expectedFiles, "Files modified."); resolve(); @@ -722,7 +725,7 @@ test("filesArrayNotModified", (t) => new Promise((resolve) => { test("filesArrayAsString", (t) => new Promise((resolve) => { t.plan(2); - markdownlint({ + lintAsync({ "files": "README.md", "noInlineConfig": true, "config": { @@ -739,7 +742,7 @@ test("filesArrayAsString", (t) => new Promise((resolve) => { test("missingOptions", (t) => new Promise((resolve) => { t.plan(2); - markdownlint(null, function callback(err, result) { + lintAsync(null, function callback(err, result) { t.falsy(err); t.deepEqual( result, @@ -752,7 +755,7 @@ test("missingOptions", (t) => new Promise((resolve) => { test("missingFilesAndStrings", (t) => new Promise((resolve) => { t.plan(2); - markdownlint({}, function callback(err, result) { + lintAsync({}, function callback(err, result) { t.falsy(err); t.truthy(result, "Did not get result for missing files/strings."); resolve(); @@ -762,12 +765,12 @@ test("missingFilesAndStrings", (t) => new Promise((resolve) => { test("missingCallback", (t) => { t.plan(0); // @ts-ignore - markdownlint(); + lintAsync(); }); test("badFile", (t) => new Promise((resolve) => { t.plan(4); - markdownlint({ + lintAsync({ "files": [ "./badFile" ] }, function callback(err, result) { t.truthy(err, "Did not get an error for bad file."); @@ -783,7 +786,7 @@ test("badFileSync", (t) => { t.plan(1); t.throws( function badFileCall() { - markdownlint.sync({ + lintSync({ "files": [ "./badFile" ] }); }, @@ -796,7 +799,7 @@ test("badFileSync", (t) => { test("badFilePromise", (t) => new Promise((resolve) => { t.plan(3); - markdownlint.promises.markdownlint({ + lintPromise({ "files": [ "./badFile" ] }).then( null, @@ -811,7 +814,7 @@ test("badFilePromise", (t) => new Promise((resolve) => { test("missingStringValue", (t) => new Promise((resolve) => { t.plan(2); - markdownlint({ + lintAsync({ "strings": { // @ts-ignore "undefined": undefined, @@ -840,7 +843,7 @@ test("customFileSystemSync", (t) => { return "# Heading"; } }; - const result = markdownlint.sync({ + const result = lintSync({ "files": file, "fs": fsApi }); @@ -856,7 +859,7 @@ test("customFileSystemAsync", (t) => new Promise((resolve) => { cb(null, "# Heading"); } }; - markdownlint({ + lintAsync({ "files": file, "fs": fsApi }, function callback(err, result) { @@ -1101,7 +1104,7 @@ test("someCustomRulesHaveValidUrl", (t) => { test("markdownItPluginsSingle", (t) => new Promise((resolve) => { t.plan(4); - markdownlint({ + lintAsync({ "strings": { "string": "# Heading\n\nText\n" }, @@ -1120,7 +1123,7 @@ test("markdownItPluginsSingle", (t) => new Promise((resolve) => { test("markdownItPluginsMultiple", (t) => new Promise((resolve) => { t.plan(4); - markdownlint({ + lintAsync({ "strings": { "string": "# Heading\n\nText H~2~0 text 29^th^ text\n" }, @@ -1142,7 +1145,7 @@ test("markdownItPluginsMultiple", (t) => new Promise((resolve) => { test("markdownItPluginsNoMarkdownIt", (t) => new Promise((resolve) => { t.plan(2); - markdownlint({ + lintAsync({ "strings": { "string": "# Heading\n\nText\n" }, @@ -1159,7 +1162,7 @@ test("markdownItPluginsNoMarkdownIt", (t) => new Promise((resolve) => { test("markdownItPluginsUnusedUncalled", (t) => new Promise((resolve) => { t.plan(2); - markdownlint({ + lintAsync({ "config": { "default": false }, @@ -1181,7 +1184,7 @@ test("markdownItPluginsUnusedUncalled", (t) => new Promise((resolve) => { test("Pandoc footnote", (t) => new Promise((resolve) => { t.plan(2); - markdownlint({ + lintAsync({ "strings": { "string": `# Heading @@ -1206,7 +1209,7 @@ Text with: [^footnote] test("token-map-spans", (t) => { t.plan(38); - /** @type {import("../lib/markdownlint.mjs").Options} */ + /** @type {import("markdownlint").Options} */ const options = { "customRules": [ { @@ -1239,7 +1242,7 @@ test("token-map-spans", (t) => { ], "files": [ "./test/token-map-spans.md" ] }; - markdownlint.sync(options); + lintSync(options); }); test("configParsersInvalid", async(t) => { @@ -1258,7 +1261,7 @@ test("configParsersInvalid", async(t) => { }; const expected = "content: 1: MD041/first-line-heading/first-line-h1 " + "First line in a file should be a top-level heading [Context: \"Text\"]"; - const actual = await markdownlint.promises.markdownlint(options); + const actual = await lintPromise(options); t.is(actual.toString(), expected, "Unexpected results."); }); @@ -1278,7 +1281,7 @@ test("configParsersJSON", async(t) => { ].join("\n") } }; - const actual = await markdownlint.promises.markdownlint(options); + const actual = await lintPromise(options); t.is(actual.toString(), "", "Unexpected results."); }); @@ -1300,7 +1303,7 @@ test("configParsersJSONC", async(t) => { }, "configParsers": [ jsoncParser.parse ] }; - const actual = await markdownlint.promises.markdownlint(options); + const actual = await lintPromise(options); t.is(actual.toString(), "", "Unexpected results."); }); @@ -1321,7 +1324,7 @@ test("configParsersYAML", async(t) => { "configParsers": [ jsYaml.load ] }; // @ts-ignore - const actual = await markdownlint.promises.markdownlint(options); + const actual = await lintPromise(options); t.is(actual.toString(), "", "Unexpected results."); }); @@ -1344,13 +1347,13 @@ test("configParsersTOML", async(t) => { require("toml").parse ] }; - const actual = await markdownlint.promises.markdownlint(options); + const actual = await lintPromise(options); t.is(actual.toString(), "", "Unexpected results."); }); test("getVersion", (t) => { t.plan(1); - const actual = markdownlint.getVersion(); + const actual = getVersion(); const expected = packageJson.version; t.is(actual, expected, "Version string not correct."); }); @@ -1364,7 +1367,10 @@ test("constants", (t) => { }); const exportMappings = new Map([ - [ ".", "../lib/markdownlint.mjs" ], + [ ".", "../lib/exports.mjs" ], + [ "./async", "../lib/exports-async.mjs" ], + [ "./promise", "../lib/exports-promise.mjs" ], + [ "./sync", "../lib/exports-sync.mjs" ], [ "./helpers", "../helpers/helpers.cjs" ], [ "./style/all", "../style/all.json" ], [ "./style/cirosantilli", "../style/cirosantilli.json" ], diff --git a/test/profile-fixture.mjs b/test/profile-fixture.mjs index ca191235d..7a00cdcff 100644 --- a/test/profile-fixture.mjs +++ b/test/profile-fixture.mjs @@ -1,6 +1,5 @@ import { readFile } from "node:fs/promises"; -import library from "../lib/markdownlint.mjs"; -const markdownlint = library.promises.markdownlint; +import { lint } from "markdownlint/promise"; const strings = { "CHANGELOG": await readFile("CHANGELOG.md", "utf8"), @@ -14,7 +13,7 @@ const strings = { const start = new Date(); for (let i = 0; i < 250; i++) { // eslint-disable-next-line no-await-in-loop - await markdownlint({ strings }); + await lint({ strings }); } const end = new Date(); // eslint-disable-next-line no-console diff --git a/test/rules/any-blockquote.cjs b/test/rules/any-blockquote.cjs index f1b16085f..5e4f5f1b9 100644 --- a/test/rules/any-blockquote.cjs +++ b/test/rules/any-blockquote.cjs @@ -2,7 +2,7 @@ "use strict"; -/** @type {import("../../lib/markdownlint.mjs").Rule[]} */ +/** @type {import("markdownlint").Rule[]} */ module.exports = [ // micromark parser (preferred) diff --git a/test/rules/every-n-lines.cjs b/test/rules/every-n-lines.cjs index 5f579f61d..e44ce3ba4 100644 --- a/test/rules/every-n-lines.cjs +++ b/test/rules/every-n-lines.cjs @@ -2,7 +2,7 @@ "use strict"; -/** @type {import("../../lib/markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ module.exports = { "names": [ "every-n-lines" ], "description": "Rule that reports an error every N lines", diff --git a/test/rules/first-line.cjs b/test/rules/first-line.cjs index 8b979d16e..56e536c10 100644 --- a/test/rules/first-line.cjs +++ b/test/rules/first-line.cjs @@ -2,7 +2,7 @@ "use strict"; -/** @type {import("../../lib/markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ module.exports = { "names": [ "first-line" ], "description": "Rule that reports an error for the first line", diff --git a/test/rules/letters-E-X.cjs b/test/rules/letters-E-X.cjs index 45733d6f4..c90233401 100644 --- a/test/rules/letters-E-X.cjs +++ b/test/rules/letters-E-X.cjs @@ -2,7 +2,7 @@ "use strict"; -/** @type {import("../../lib/markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ module.exports = { "names": [ "letters-E-X", "letter-E-letter-X", "contains-ex" ], "description": "Rule that reports an error for lines with the letters 'EX'", diff --git a/test/rules/lint-javascript.cjs b/test/rules/lint-javascript.cjs index 911c78f7a..d9ae1a524 100644 --- a/test/rules/lint-javascript.cjs +++ b/test/rules/lint-javascript.cjs @@ -7,7 +7,7 @@ const eslint = require("eslint"); const linter = new eslint.Linter(); const languageJavaScript = /js|javascript/i; -/** @type {import("../../lib/markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ module.exports = { "names": [ "lint-javascript" ], "description": "Rule that lints JavaScript code", diff --git a/test/rules/validate-json.cjs b/test/rules/validate-json.cjs index 11c8ed7b2..9dd1c6682 100644 --- a/test/rules/validate-json.cjs +++ b/test/rules/validate-json.cjs @@ -4,7 +4,7 @@ const { parse, printParseErrorCode } = require("jsonc-parser"); -/** @type {import("../../lib/markdownlint.mjs").Rule} */ +/** @type {import("markdownlint").Rule} */ module.exports = { "names": [ "validate-json" ], "description": "Rule that validates JSON code", From b404c8bf16ab0a7b89fc35134c7c94850a5151c4 Mon Sep 17 00:00:00 2001 From: David Anson Date: Wed, 4 Dec 2024 23:23:56 -0800 Subject: [PATCH 43/64] Add README documentation for getVersion, leave promise/extendConfig undocumented (unsupported). --- README.md | 25 +++++++++++++++++++++++++ example/standalone.mjs | 5 ++++- test/markdownlint-test.mjs | 1 + 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 01797a119..8b0c90c9a 100644 --- a/README.md +++ b/README.md @@ -804,6 +804,31 @@ const results = lintSync({ "strings": { "content": original } }); const fixed = applyFixes(original, results.content); ``` +### Miscellaneous + +To get the [semantic version][semver] of the library, the `getVersion` method +can be used: + +```javascript +/** + * Gets the (semantic) version of the library. + * + * @returns {string} SemVer string. + */ +function getVersion() { ... } +``` + +Invoking `getVersion` is simple: + +```javascript +import { getVersion } from "markdownlint"; + +// Displays the library version +console.log(getVersion()); +``` + +[semver]: https://semver.org + ## Usage Invoke `lint` and use the `result` object's `toString` method: diff --git a/example/standalone.mjs b/example/standalone.mjs index a1eed89c1..2614e14bd 100644 --- a/example/standalone.mjs +++ b/example/standalone.mjs @@ -1,10 +1,13 @@ // @ts-check -import { applyFixes } from "markdownlint"; +import { applyFixes, getVersion } from "markdownlint"; import { lint as lintAsync } from "markdownlint/async"; import { lint as lintPromise } from "markdownlint/promise"; import { lint as lintSync } from "markdownlint/sync"; +// Displays the library version +console.log(getVersion()); + const options = { "files": [ "good.md", "bad.md" ], "strings": { diff --git a/test/markdownlint-test.mjs b/test/markdownlint-test.mjs index d37d9b4a6..96e0d49fd 100644 --- a/test/markdownlint-test.mjs +++ b/test/markdownlint-test.mjs @@ -692,6 +692,7 @@ test("readmeHeadings", (t) => new Promise((resolve) => { "#### callback", "#### result", "### Fixing", + "### Miscellaneous", "## Usage", "## Browser", "## Examples", From ce7efbd9e1584cab00ba044b8fff3f24f5cc6ecd Mon Sep 17 00:00:00 2001 From: David Anson Date: Wed, 4 Dec 2024 23:33:22 -0800 Subject: [PATCH 44/64] Update CHANGELOG.md for ESM, add links for guidance. --- .github/dictionary.txt | 1 + CHANGELOG.md | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/.github/dictionary.txt b/.github/dictionary.txt index ede5ef0c7..a6a2e0905 100644 --- a/.github/dictionary.txt +++ b/.github/dictionary.txt @@ -30,6 +30,7 @@ Config config. CVE-\d+-\d+ docs-util +ECMAScript ES2015 ES6 ESLint diff --git a/CHANGELOG.md b/CHANGELOG.md index ab8f7d515..a53e7d239 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.37.0 + +- Convert to ECMAScript module, for guidance see: + - + - + ## 0.36.1 - Fix behavior of MD054 From fd7fb925a950a59f4434f2e15285bbe3e8916782 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2024 02:40:07 +0000 Subject: [PATCH 45/64] Bump webpack from 5.97.0 to 5.97.1 Bumps [webpack](https://github.com/webpack/webpack) from 5.97.0 to 5.97.1. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.97.0...v5.97.1) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 851dbc5cf..7286b963c 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "terser-webpack-plugin": "5.3.10", "toml": "3.0.0", "typescript": "5.7.2", - "webpack": "5.97.0", + "webpack": "5.97.1", "webpack-cli": "5.1.4" }, "keywords": [ From 2449163ffbb8881c72366de34adb77a057088d01 Mon Sep 17 00:00:00 2001 From: David Anson Date: Thu, 5 Dec 2024 22:14:17 -0800 Subject: [PATCH 46/64] Add engine-strict=true to .npmrc to catch Node versioning issues with dependencies. --- .npmrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.npmrc b/.npmrc index 3757b3046..68353c60f 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,3 @@ +engine-strict=true ignore-scripts=true package-lock=false From 6e52643f8cb9a1a6cc5a835b490b65b923af3b6c Mon Sep 17 00:00:00 2001 From: David Anson Date: Thu, 5 Dec 2024 23:00:55 -0800 Subject: [PATCH 47/64] Update CHANGELOG.md for breaking changes, remove outdated comments from test file. --- CHANGELOG.md | 3 ++- test/markdownlint-test.mjs | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a53e7d239..8610ec659 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,10 @@ ## 0.37.0 -- Convert to ECMAScript module, for guidance see: +- Convert module to ECMAScript (breaking change) - - +- Convert module to named exports (breaking change) ## 0.36.1 diff --git a/test/markdownlint-test.mjs b/test/markdownlint-test.mjs index 96e0d49fd..3a85630a8 100644 --- a/test/markdownlint-test.mjs +++ b/test/markdownlint-test.mjs @@ -1386,13 +1386,11 @@ test("exportMappings", (t) => { ); }); -// const commonJsRe = /\.js$/u; const jsonRe = /\.json$/u; const importOptionsJson = { "with": { "type": "json" } }; for (const [ exportName, exportPath ] of exportMappings) { test(exportName, async(t) => { - // const commonJs = !commonJsRe.test(exportPath); const json = jsonRe.test(exportPath); const importOptions = json ? importOptionsJson : undefined; const importExportName = await import(exportName.replace(/^\./u, packageJson.name), importOptions); From 62073a8fde79c7ec37032b260dfd3b94cba4ffbc Mon Sep 17 00:00:00 2001 From: David Anson Date: Sat, 7 Dec 2024 18:12:13 -0800 Subject: [PATCH 48/64] Update to version 0.37.0. --- helpers/README.md | 4 +- lib/configuration-strict.d.ts | 208 ++++++++--------- lib/constants.mjs | 2 +- package.json | 2 +- schema/.markdownlint.jsonc | 102 ++++----- schema/.markdownlint.yaml | 102 ++++----- schema/markdownlint-config-schema-strict.json | 212 +++++++++--------- schema/markdownlint-config-schema.json | 212 +++++++++--------- 8 files changed, 422 insertions(+), 422 deletions(-) diff --git a/helpers/README.md b/helpers/README.md index d38ec6507..830f83875 100644 --- a/helpers/README.md +++ b/helpers/README.md @@ -22,8 +22,8 @@ be useful to custom rule authors and may avoid duplicating code. *None* - The entire body of code is tested to 100% coverage by the core `markdownlint` project, so there are no additional tests here. -[custom-rules]: https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/CustomRules.md +[custom-rules]: https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/CustomRules.md [jsdoc]: https://en.m.wikipedia.org/wiki/JSDoc [markdown]: https://en.wikipedia.org/wiki/Markdown [markdownlint]: https://github.com/DavidAnson/markdownlint -[rules]: https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/Rules.md +[rules]: https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/Rules.md diff --git a/lib/configuration-strict.d.ts b/lib/configuration-strict.d.ts index 99f2a321b..5b2aa72eb 100644 --- a/lib/configuration-strict.d.ts +++ b/lib/configuration-strict.d.ts @@ -19,15 +19,15 @@ export interface ConfigurationStrict { */ extends?: string | null; /** - * MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md001.md + * MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md */ MD001?: boolean; /** - * MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md001.md + * MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md */ "heading-increment"?: boolean; /** - * MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md003.md + * MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md */ MD003?: | boolean @@ -38,7 +38,7 @@ export interface ConfigurationStrict { style?: "consistent" | "atx" | "atx_closed" | "setext" | "setext_with_atx" | "setext_with_atx_closed"; }; /** - * MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md003.md + * MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md */ "heading-style"?: | boolean @@ -49,7 +49,7 @@ export interface ConfigurationStrict { style?: "consistent" | "atx" | "atx_closed" | "setext" | "setext_with_atx" | "setext_with_atx_closed"; }; /** - * MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md004.md + * MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md */ MD004?: | boolean @@ -60,7 +60,7 @@ export interface ConfigurationStrict { style?: "consistent" | "asterisk" | "plus" | "dash" | "sublist"; }; /** - * MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md004.md + * MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md */ "ul-style"?: | boolean @@ -71,15 +71,15 @@ export interface ConfigurationStrict { style?: "consistent" | "asterisk" | "plus" | "dash" | "sublist"; }; /** - * MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md005.md + * MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md */ MD005?: boolean; /** - * MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md005.md + * MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md */ "list-indent"?: boolean; /** - * MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md007.md + * MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md */ MD007?: | boolean @@ -98,7 +98,7 @@ export interface ConfigurationStrict { start_indent?: number; }; /** - * MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md007.md + * MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md */ "ul-indent"?: | boolean @@ -117,7 +117,7 @@ export interface ConfigurationStrict { start_indent?: number; }; /** - * MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md009.md + * MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md */ MD009?: | boolean @@ -136,7 +136,7 @@ export interface ConfigurationStrict { strict?: boolean; }; /** - * MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md009.md + * MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md */ "no-trailing-spaces"?: | boolean @@ -155,7 +155,7 @@ export interface ConfigurationStrict { strict?: boolean; }; /** - * MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md010.md + * MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md */ MD010?: | boolean @@ -174,7 +174,7 @@ export interface ConfigurationStrict { spaces_per_tab?: number; }; /** - * MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md010.md + * MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md */ "no-hard-tabs"?: | boolean @@ -193,15 +193,15 @@ export interface ConfigurationStrict { spaces_per_tab?: number; }; /** - * MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md011.md + * MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md */ MD011?: boolean; /** - * MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md011.md + * MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md */ "no-reversed-links"?: boolean; /** - * MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md012.md + * MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md */ MD012?: | boolean @@ -212,7 +212,7 @@ export interface ConfigurationStrict { maximum?: number; }; /** - * MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md012.md + * MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md */ "no-multiple-blanks"?: | boolean @@ -223,7 +223,7 @@ export interface ConfigurationStrict { maximum?: number; }; /** - * MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md013.md + * MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md */ MD013?: | boolean @@ -262,7 +262,7 @@ export interface ConfigurationStrict { stern?: boolean; }; /** - * MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md013.md + * MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md */ "line-length"?: | boolean @@ -301,47 +301,47 @@ export interface ConfigurationStrict { stern?: boolean; }; /** - * MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md014.md + * MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md */ MD014?: boolean; /** - * MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md014.md + * MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md */ "commands-show-output"?: boolean; /** - * MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md018.md + * MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md */ MD018?: boolean; /** - * MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md018.md + * MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md */ "no-missing-space-atx"?: boolean; /** - * MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md019.md + * MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md */ MD019?: boolean; /** - * MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md019.md + * MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md */ "no-multiple-space-atx"?: boolean; /** - * MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/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.37.0/doc/md020.md */ MD020?: boolean; /** - * MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/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.37.0/doc/md020.md */ "no-missing-space-closed-atx"?: boolean; /** - * MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/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.37.0/doc/md021.md */ MD021?: boolean; /** - * MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/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.37.0/doc/md021.md */ "no-multiple-space-closed-atx"?: boolean; /** - * MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md022.md + * MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md */ MD022?: | boolean @@ -356,7 +356,7 @@ export interface ConfigurationStrict { lines_below?: number | number[]; }; /** - * MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md022.md + * MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md */ "blanks-around-headings"?: | boolean @@ -371,15 +371,15 @@ export interface ConfigurationStrict { lines_below?: number | number[]; }; /** - * MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md023.md + * MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md */ MD023?: boolean; /** - * MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md023.md + * MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md */ "heading-start-left"?: boolean; /** - * MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md024.md + * MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md */ MD024?: | boolean @@ -390,7 +390,7 @@ export interface ConfigurationStrict { siblings_only?: boolean; }; /** - * MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md024.md + * MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md */ "no-duplicate-heading"?: | boolean @@ -401,7 +401,7 @@ export interface ConfigurationStrict { siblings_only?: boolean; }; /** - * MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md025.md + * MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md */ MD025?: | boolean @@ -416,7 +416,7 @@ export interface ConfigurationStrict { front_matter_title?: string; }; /** - * MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md025.md + * MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md */ "single-title"?: | boolean @@ -431,7 +431,7 @@ export interface ConfigurationStrict { front_matter_title?: string; }; /** - * MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md025.md + * MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md */ "single-h1"?: | boolean @@ -446,7 +446,7 @@ export interface ConfigurationStrict { front_matter_title?: string; }; /** - * MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md026.md + * MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md */ MD026?: | boolean @@ -457,7 +457,7 @@ export interface ConfigurationStrict { punctuation?: string; }; /** - * MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md026.md + * MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md */ "no-trailing-punctuation"?: | boolean @@ -468,23 +468,23 @@ export interface ConfigurationStrict { punctuation?: string; }; /** - * MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md027.md + * MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md */ MD027?: boolean; /** - * MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md027.md + * MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md */ "no-multiple-space-blockquote"?: boolean; /** - * MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md028.md + * MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md */ MD028?: boolean; /** - * MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md028.md + * MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md */ "no-blanks-blockquote"?: boolean; /** - * MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md029.md + * MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md */ MD029?: | boolean @@ -495,7 +495,7 @@ export interface ConfigurationStrict { style?: "one" | "ordered" | "one_or_ordered" | "zero"; }; /** - * MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md029.md + * MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md */ "ol-prefix"?: | boolean @@ -506,7 +506,7 @@ export interface ConfigurationStrict { style?: "one" | "ordered" | "one_or_ordered" | "zero"; }; /** - * MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md030.md + * MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md */ MD030?: | boolean @@ -529,7 +529,7 @@ export interface ConfigurationStrict { ol_multi?: number; }; /** - * MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md030.md + * MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md */ "list-marker-space"?: | boolean @@ -552,7 +552,7 @@ export interface ConfigurationStrict { ol_multi?: number; }; /** - * MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md031.md + * MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md */ MD031?: | boolean @@ -563,7 +563,7 @@ export interface ConfigurationStrict { list_items?: boolean; }; /** - * MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md031.md + * MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md */ "blanks-around-fences"?: | boolean @@ -574,15 +574,15 @@ export interface ConfigurationStrict { list_items?: boolean; }; /** - * MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md032.md + * MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md */ MD032?: boolean; /** - * MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md032.md + * MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md */ "blanks-around-lists"?: boolean; /** - * MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md033.md + * MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md */ MD033?: | boolean @@ -593,7 +593,7 @@ export interface ConfigurationStrict { allowed_elements?: string[]; }; /** - * MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md033.md + * MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md */ "no-inline-html"?: | boolean @@ -604,15 +604,15 @@ export interface ConfigurationStrict { allowed_elements?: string[]; }; /** - * MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md034.md + * MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md */ MD034?: boolean; /** - * MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md034.md + * MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md */ "no-bare-urls"?: boolean; /** - * MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md035.md + * MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md */ MD035?: | boolean @@ -623,7 +623,7 @@ export interface ConfigurationStrict { style?: string; }; /** - * MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md035.md + * MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md */ "hr-style"?: | boolean @@ -634,7 +634,7 @@ export interface ConfigurationStrict { style?: string; }; /** - * MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md036.md + * MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md */ MD036?: | boolean @@ -645,7 +645,7 @@ export interface ConfigurationStrict { punctuation?: string; }; /** - * MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md036.md + * MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md */ "no-emphasis-as-heading"?: | boolean @@ -656,31 +656,31 @@ export interface ConfigurationStrict { punctuation?: string; }; /** - * MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md037.md + * MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md */ MD037?: boolean; /** - * MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md037.md + * MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md */ "no-space-in-emphasis"?: boolean; /** - * MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md038.md + * MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md */ MD038?: boolean; /** - * MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md038.md + * MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md */ "no-space-in-code"?: boolean; /** - * MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md039.md + * MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md */ MD039?: boolean; /** - * MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md039.md + * MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md */ "no-space-in-links"?: boolean; /** - * MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md040.md + * MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md */ MD040?: | boolean @@ -695,7 +695,7 @@ export interface ConfigurationStrict { language_only?: boolean; }; /** - * MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md040.md + * MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md */ "fenced-code-language"?: | boolean @@ -710,7 +710,7 @@ export interface ConfigurationStrict { language_only?: boolean; }; /** - * MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md041.md + * MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md */ MD041?: | boolean @@ -725,7 +725,7 @@ export interface ConfigurationStrict { front_matter_title?: string; }; /** - * MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md041.md + * MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md */ "first-line-heading"?: | boolean @@ -740,7 +740,7 @@ export interface ConfigurationStrict { front_matter_title?: string; }; /** - * MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md041.md + * MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md */ "first-line-h1"?: | boolean @@ -755,15 +755,15 @@ export interface ConfigurationStrict { front_matter_title?: string; }; /** - * MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md042.md + * MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md */ MD042?: boolean; /** - * MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md042.md + * MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md */ "no-empty-links"?: boolean; /** - * MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md043.md + * MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md */ MD043?: | boolean @@ -778,7 +778,7 @@ export interface ConfigurationStrict { match_case?: boolean; }; /** - * MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md043.md + * MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md */ "required-headings"?: | boolean @@ -793,7 +793,7 @@ export interface ConfigurationStrict { match_case?: boolean; }; /** - * MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md044.md + * MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md */ MD044?: | boolean @@ -812,7 +812,7 @@ export interface ConfigurationStrict { html_elements?: boolean; }; /** - * MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md044.md + * MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md */ "proper-names"?: | boolean @@ -831,15 +831,15 @@ export interface ConfigurationStrict { html_elements?: boolean; }; /** - * MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md045.md + * MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md */ MD045?: boolean; /** - * MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md045.md + * MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md */ "no-alt-text"?: boolean; /** - * MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md046.md + * MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md */ MD046?: | boolean @@ -850,7 +850,7 @@ export interface ConfigurationStrict { style?: "consistent" | "fenced" | "indented"; }; /** - * MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md046.md + * MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md */ "code-block-style"?: | boolean @@ -861,15 +861,15 @@ export interface ConfigurationStrict { style?: "consistent" | "fenced" | "indented"; }; /** - * MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md047.md + * MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md */ MD047?: boolean; /** - * MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md047.md + * MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md */ "single-trailing-newline"?: boolean; /** - * MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md048.md + * MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md */ MD048?: | boolean @@ -880,7 +880,7 @@ export interface ConfigurationStrict { style?: "consistent" | "backtick" | "tilde"; }; /** - * MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md048.md + * MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md */ "code-fence-style"?: | boolean @@ -891,7 +891,7 @@ export interface ConfigurationStrict { style?: "consistent" | "backtick" | "tilde"; }; /** - * MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md049.md + * MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md */ MD049?: | boolean @@ -902,7 +902,7 @@ export interface ConfigurationStrict { style?: "consistent" | "asterisk" | "underscore"; }; /** - * MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md049.md + * MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md */ "emphasis-style"?: | boolean @@ -913,7 +913,7 @@ export interface ConfigurationStrict { style?: "consistent" | "asterisk" | "underscore"; }; /** - * MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md050.md + * MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md */ MD050?: | boolean @@ -924,7 +924,7 @@ export interface ConfigurationStrict { style?: "consistent" | "asterisk" | "underscore"; }; /** - * MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md050.md + * MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md */ "strong-style"?: | boolean @@ -935,7 +935,7 @@ export interface ConfigurationStrict { style?: "consistent" | "asterisk" | "underscore"; }; /** - * MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md051.md + * MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md */ MD051?: | boolean @@ -946,7 +946,7 @@ export interface ConfigurationStrict { ignore_case?: boolean; }; /** - * MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md051.md + * MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md */ "link-fragments"?: | boolean @@ -957,7 +957,7 @@ export interface ConfigurationStrict { ignore_case?: boolean; }; /** - * MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md052.md + * MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md */ MD052?: | boolean @@ -968,7 +968,7 @@ export interface ConfigurationStrict { shortcut_syntax?: boolean; }; /** - * MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md052.md + * MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md */ "reference-links-images"?: | boolean @@ -979,7 +979,7 @@ export interface ConfigurationStrict { shortcut_syntax?: boolean; }; /** - * MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md053.md + * MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md */ MD053?: | boolean @@ -990,7 +990,7 @@ export interface ConfigurationStrict { ignored_definitions?: string[]; }; /** - * MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md053.md + * MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md */ "link-image-reference-definitions"?: | boolean @@ -1001,7 +1001,7 @@ export interface ConfigurationStrict { ignored_definitions?: string[]; }; /** - * MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md054.md + * MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md */ MD054?: | boolean @@ -1032,7 +1032,7 @@ export interface ConfigurationStrict { url_inline?: boolean; }; /** - * MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md054.md + * MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md */ "link-image-style"?: | boolean @@ -1063,7 +1063,7 @@ export interface ConfigurationStrict { url_inline?: boolean; }; /** - * MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md055.md + * MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md */ MD055?: | boolean @@ -1074,7 +1074,7 @@ export interface ConfigurationStrict { style?: "consistent" | "leading_only" | "trailing_only" | "leading_and_trailing" | "no_leading_or_trailing"; }; /** - * MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md055.md + * MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md */ "table-pipe-style"?: | boolean @@ -1085,19 +1085,19 @@ export interface ConfigurationStrict { style?: "consistent" | "leading_only" | "trailing_only" | "leading_and_trailing" | "no_leading_or_trailing"; }; /** - * MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md056.md + * MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md */ MD056?: boolean; /** - * MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md056.md + * MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md */ "table-column-count"?: boolean; /** - * MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md058.md + * MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md */ MD058?: boolean; /** - * MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md058.md + * MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md */ "blanks-around-tables"?: boolean; /** diff --git a/lib/constants.mjs b/lib/constants.mjs index b83a7d9b5..3afa9b6b4 100644 --- a/lib/constants.mjs +++ b/lib/constants.mjs @@ -10,4 +10,4 @@ export const fixableRuleNames = [ "MD058" ]; export const homepage = "https://github.com/DavidAnson/markdownlint"; -export const version = "0.36.1"; +export const version = "0.37.0"; diff --git a/package.json b/package.json index 7286b963c..8c86521fe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "markdownlint", - "version": "0.36.1", + "version": "0.37.0", "description": "A Node.js style checker and lint tool for Markdown/CommonMark files.", "type": "module", "exports": { diff --git a/schema/.markdownlint.jsonc b/schema/.markdownlint.jsonc index 0db3f8717..4584b2dd3 100644 --- a/schema/.markdownlint.jsonc +++ b/schema/.markdownlint.jsonc @@ -7,25 +7,25 @@ // Path to configuration file to extend "extends": null, - // MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md001.md + // MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md "MD001": true, - // MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md003.md + // MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md "MD003": { // Heading style "style": "consistent" }, - // MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md004.md + // MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md "MD004": { // List style "style": "consistent" }, - // MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md005.md + // MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md "MD005": true, - // MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md007.md + // MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md "MD007": { // Spaces for indent "indent": 2, @@ -35,7 +35,7 @@ "start_indent": 2 }, - // MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md009.md + // MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md "MD009": { // Spaces for line break "br_spaces": 2, @@ -45,7 +45,7 @@ "strict": false }, - // MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md010.md + // MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md "MD010": { // Include code blocks "code_blocks": true, @@ -55,16 +55,16 @@ "spaces_per_tab": 1 }, - // MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md011.md + // MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md "MD011": true, - // MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md012.md + // MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md "MD012": { // Consecutive blank lines "maximum": 1 }, - // MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md013.md + // MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md "MD013": { // Number of characters "line_length": 80, @@ -84,22 +84,22 @@ "stern": false }, - // MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md014.md + // MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md "MD014": true, - // MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md018.md + // MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md "MD018": true, - // MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md019.md + // MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md "MD019": true, - // MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/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.37.0/doc/md020.md "MD020": true, - // MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/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.37.0/doc/md021.md "MD021": true, - // MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md022.md + // MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md "MD022": { // Blank lines above heading "lines_above": 1, @@ -107,16 +107,16 @@ "lines_below": 1 }, - // MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md023.md + // MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md "MD023": true, - // MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md024.md + // MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md "MD024": { // Only check sibling headings "siblings_only": false }, - // MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md025.md + // MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md "MD025": { // Heading level "level": 1, @@ -124,25 +124,25 @@ "front_matter_title": "^\\s*title\\s*[:=]" }, - // MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md026.md + // MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md "MD026": { // Punctuation characters "punctuation": ".,;:!。,;:!" }, - // MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md027.md + // MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md "MD027": true, - // MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md028.md + // MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md "MD028": true, - // MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md029.md + // MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md "MD029": { // List style "style": "one_or_ordered" }, - // MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md030.md + // MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md "MD030": { // Spaces for single-line unordered list items "ul_single": 1, @@ -154,46 +154,46 @@ "ol_multi": 1 }, - // MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md031.md + // MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md "MD031": { // Include list items "list_items": true }, - // MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md032.md + // MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md "MD032": true, - // MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md033.md + // MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md "MD033": { // Allowed elements "allowed_elements": [] }, - // MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md034.md + // MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md "MD034": true, - // MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md035.md + // MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md "MD035": { // Horizontal rule style "style": "consistent" }, - // MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md036.md + // MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md "MD036": { // Punctuation characters "punctuation": ".,;:!?。,;:!?" }, - // MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md037.md + // MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md "MD037": true, - // MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md038.md + // MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md "MD038": true, - // MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md039.md + // MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md "MD039": true, - // MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md040.md + // MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md "MD040": { // List of languages "allowed_languages": [], @@ -201,7 +201,7 @@ "language_only": false }, - // MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md041.md + // MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md "MD041": { // Heading level "level": 1, @@ -209,10 +209,10 @@ "front_matter_title": "^\\s*title\\s*[:=]" }, - // MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md042.md + // MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md "MD042": true, - // MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md043.md + // MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md "MD043": { // List of headings "headings": [], @@ -220,7 +220,7 @@ "match_case": false }, - // MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md044.md + // MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md "MD044": { // List of proper names "names": [], @@ -230,49 +230,49 @@ "html_elements": true }, - // MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md045.md + // MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md "MD045": true, - // MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md046.md + // MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md "MD046": { // Block style "style": "consistent" }, - // MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md047.md + // MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md "MD047": true, - // MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md048.md + // MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md "MD048": { // Code fence style "style": "consistent" }, - // MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md049.md + // MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md "MD049": { // Emphasis style "style": "consistent" }, - // MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md050.md + // MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md "MD050": { // Strong style "style": "consistent" }, - // MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md051.md + // MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md "MD051": { // Ignore case of fragments "ignore_case": false }, - // MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md052.md + // MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md "MD052": { // Include shortcut syntax "shortcut_syntax": false }, - // MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md053.md + // MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md "MD053": { // Ignored definitions "ignored_definitions": [ @@ -280,7 +280,7 @@ ] }, - // MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md054.md + // MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md "MD054": { // Allow autolinks "autolink": true, @@ -296,15 +296,15 @@ "url_inline": true }, - // MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md055.md + // MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md "MD055": { // Table pipe style "style": "consistent" }, - // MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md056.md + // MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md "MD056": true, - // MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md058.md + // MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md "MD058": true } \ No newline at end of file diff --git a/schema/.markdownlint.yaml b/schema/.markdownlint.yaml index 272cac242..cc4cfb8dc 100644 --- a/schema/.markdownlint.yaml +++ b/schema/.markdownlint.yaml @@ -6,23 +6,23 @@ default: true # Path to configuration file to extend extends: null -# MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md001.md +# MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md MD001: true -# MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md003.md +# MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md MD003: # Heading style style: "consistent" -# MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md004.md +# MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md MD004: # List style style: "consistent" -# MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md005.md +# MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md MD005: true -# MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md007.md +# MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md MD007: # Spaces for indent indent: 2 @@ -31,7 +31,7 @@ MD007: # Spaces for first level indent (when start_indented is set) start_indent: 2 -# MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md009.md +# MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md MD009: # Spaces for line break br_spaces: 2 @@ -40,7 +40,7 @@ MD009: # Include unnecessary breaks strict: false -# MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md010.md +# MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md MD010: # Include code blocks code_blocks: true @@ -49,15 +49,15 @@ MD010: # Number of spaces for each hard tab spaces_per_tab: 1 -# MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md011.md +# MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md MD011: true -# MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md012.md +# MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md MD012: # Consecutive blank lines maximum: 1 -# MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md013.md +# MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md MD013: # Number of characters line_length: 80 @@ -76,60 +76,60 @@ MD013: # Stern length checking stern: false -# MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md014.md +# MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md MD014: true -# MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md018.md +# MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md MD018: true -# MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md019.md +# MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md MD019: true -# MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/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.37.0/doc/md020.md MD020: true -# MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/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.37.0/doc/md021.md MD021: true -# MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md022.md +# MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md MD022: # Blank lines above heading lines_above: 1 # Blank lines below heading lines_below: 1 -# MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md023.md +# MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md MD023: true -# MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md024.md +# MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md MD024: # Only check sibling headings siblings_only: false -# MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md025.md +# MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md MD025: # Heading level level: 1 # RegExp for matching title in front matter front_matter_title: "^\\s*title\\s*[:=]" -# MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md026.md +# MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md MD026: # Punctuation characters punctuation: ".,;:!。,;:!" -# MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md027.md +# MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md MD027: true -# MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md028.md +# MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md MD028: true -# MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md029.md +# MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md MD029: # List style style: "one_or_ordered" -# MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md030.md +# MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md MD030: # Spaces for single-line unordered list items ul_single: 1 @@ -140,66 +140,66 @@ MD030: # Spaces for multi-line ordered list items ol_multi: 1 -# MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md031.md +# MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md MD031: # Include list items list_items: true -# MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md032.md +# MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md MD032: true -# MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md033.md +# MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md MD033: # Allowed elements allowed_elements: [] -# MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md034.md +# MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md MD034: true -# MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md035.md +# MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md MD035: # Horizontal rule style style: "consistent" -# MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md036.md +# MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md MD036: # Punctuation characters punctuation: ".,;:!?。,;:!?" -# MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md037.md +# MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md MD037: true -# MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md038.md +# MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md MD038: true -# MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md039.md +# MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md MD039: true -# MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md040.md +# MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md MD040: # List of languages allowed_languages: [] # Require language only language_only: false -# MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md041.md +# MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md MD041: # Heading level level: 1 # RegExp for matching title in front matter front_matter_title: "^\\s*title\\s*[:=]" -# MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md042.md +# MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md MD042: true -# MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md043.md +# MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md MD043: # List of headings headings: [] # Match case of headings match_case: false -# MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md044.md +# MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md MD044: # List of proper names names: [] @@ -208,49 +208,49 @@ MD044: # Include HTML elements html_elements: true -# MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md045.md +# MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md MD045: true -# MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md046.md +# MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md MD046: # Block style style: "consistent" -# MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md047.md +# MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md MD047: true -# MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md048.md +# MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md MD048: # Code fence style style: "consistent" -# MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md049.md +# MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md MD049: # Emphasis style style: "consistent" -# MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md050.md +# MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md MD050: # Strong style style: "consistent" -# MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md051.md +# MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md MD051: # Ignore case of fragments ignore_case: false -# MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md052.md +# MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md MD052: # Include shortcut syntax shortcut_syntax: false -# MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md053.md +# MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md MD053: # Ignored definitions ignored_definitions: - "//" -# MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md054.md +# MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md MD054: # Allow autolinks autolink: true @@ -265,13 +265,13 @@ MD054: # Allow URLs as inline links url_inline: true -# MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md055.md +# MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md MD055: # Table pipe style style: "consistent" -# MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md056.md +# MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md MD056: true -# MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md058.md +# MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md MD058: true diff --git a/schema/markdownlint-config-schema-strict.json b/schema/markdownlint-config-schema-strict.json index 7ec18c8ca..5fdecd321 100644 --- a/schema/markdownlint-config-schema-strict.json +++ b/schema/markdownlint-config-schema-strict.json @@ -1,13 +1,13 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.36.1/schema/markdownlint-config-schema-strict.json", + "$id": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.37.0/schema/markdownlint-config-schema-strict.json", "title": "markdownlint configuration schema", "type": "object", "properties": { "$schema": { "description": "JSON Schema URI (expected by some editors)", "type": "string", - "default": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.36.1/schema/markdownlint-config-schema.json" + "default": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.37.0/schema/markdownlint-config-schema.json" }, "default": { "description": "Default state for all rules", @@ -23,17 +23,17 @@ "default": null }, "MD001": { - "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md001.md", + "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md", "type": "boolean", "default": true }, "heading-increment": { - "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md001.md", + "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md", "type": "boolean", "default": true }, "MD003": { - "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md003.md", + "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md", "type": [ "boolean", "object" @@ -57,7 +57,7 @@ "additionalProperties": false }, "heading-style": { - "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md003.md", + "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md", "type": [ "boolean", "object" @@ -81,7 +81,7 @@ "additionalProperties": false }, "MD004": { - "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md004.md", + "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md", "type": [ "boolean", "object" @@ -104,7 +104,7 @@ "additionalProperties": false }, "ul-style": { - "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md004.md", + "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md", "type": [ "boolean", "object" @@ -127,17 +127,17 @@ "additionalProperties": false }, "MD005": { - "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md005.md", + "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md", "type": "boolean", "default": true }, "list-indent": { - "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md005.md", + "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md", "type": "boolean", "default": true }, "MD007": { - "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md007.md", + "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md", "type": [ "boolean", "object" @@ -165,7 +165,7 @@ "additionalProperties": false }, "ul-indent": { - "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md007.md", + "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md", "type": [ "boolean", "object" @@ -193,7 +193,7 @@ "additionalProperties": false }, "MD009": { - "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md009.md", + "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md", "type": [ "boolean", "object" @@ -220,7 +220,7 @@ "additionalProperties": false }, "no-trailing-spaces": { - "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md009.md", + "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md", "type": [ "boolean", "object" @@ -247,7 +247,7 @@ "additionalProperties": false }, "MD010": { - "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md010.md", + "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md", "type": [ "boolean", "object" @@ -277,7 +277,7 @@ "additionalProperties": false }, "no-hard-tabs": { - "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md010.md", + "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md", "type": [ "boolean", "object" @@ -307,17 +307,17 @@ "additionalProperties": false }, "MD011": { - "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md011.md", + "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md", "type": "boolean", "default": true }, "no-reversed-links": { - "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md011.md", + "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md", "type": "boolean", "default": true }, "MD012": { - "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md012.md", + "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md", "type": [ "boolean", "object" @@ -334,7 +334,7 @@ "additionalProperties": false }, "no-multiple-blanks": { - "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md012.md", + "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md", "type": [ "boolean", "object" @@ -351,7 +351,7 @@ "additionalProperties": false }, "MD013": { - "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md013.md", + "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md", "type": [ "boolean", "object" @@ -405,7 +405,7 @@ "additionalProperties": false }, "line-length": { - "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md013.md", + "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md", "type": [ "boolean", "object" @@ -459,57 +459,57 @@ "additionalProperties": false }, "MD014": { - "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md014.md", + "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md", "type": "boolean", "default": true }, "commands-show-output": { - "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md014.md", + "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md", "type": "boolean", "default": true }, "MD018": { - "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md018.md", + "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md", "type": "boolean", "default": true }, "no-missing-space-atx": { - "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md018.md", + "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md", "type": "boolean", "default": true }, "MD019": { - "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md019.md", + "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md", "type": "boolean", "default": true }, "no-multiple-space-atx": { - "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md019.md", + "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md", "type": "boolean", "default": true }, "MD020": { - "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md020.md", + "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md020.md", "type": "boolean", "default": true }, "no-missing-space-closed-atx": { - "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md020.md", + "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md020.md", "type": "boolean", "default": true }, "MD021": { - "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md021.md", + "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md021.md", "type": "boolean", "default": true }, "no-multiple-space-closed-atx": { - "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md021.md", + "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md021.md", "type": "boolean", "default": true }, "MD022": { - "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md022.md", + "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md", "type": [ "boolean", "object" @@ -544,7 +544,7 @@ "additionalProperties": false }, "blanks-around-headings": { - "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md022.md", + "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md", "type": [ "boolean", "object" @@ -579,17 +579,17 @@ "additionalProperties": false }, "MD023": { - "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md023.md", + "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md", "type": "boolean", "default": true }, "heading-start-left": { - "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md023.md", + "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md", "type": "boolean", "default": true }, "MD024": { - "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md024.md", + "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md", "type": [ "boolean", "object" @@ -605,7 +605,7 @@ "additionalProperties": false }, "no-duplicate-heading": { - "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md024.md", + "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md", "type": [ "boolean", "object" @@ -621,7 +621,7 @@ "additionalProperties": false }, "MD025": { - "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md025.md", + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md", "type": [ "boolean", "object" @@ -644,7 +644,7 @@ "additionalProperties": false }, "single-title": { - "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md025.md", + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md", "type": [ "boolean", "object" @@ -667,7 +667,7 @@ "additionalProperties": false }, "single-h1": { - "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md025.md", + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md", "type": [ "boolean", "object" @@ -690,7 +690,7 @@ "additionalProperties": false }, "MD026": { - "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md026.md", + "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md", "type": [ "boolean", "object" @@ -706,7 +706,7 @@ "additionalProperties": false }, "no-trailing-punctuation": { - "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md026.md", + "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md", "type": [ "boolean", "object" @@ -722,27 +722,27 @@ "additionalProperties": false }, "MD027": { - "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md027.md", + "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md", "type": "boolean", "default": true }, "no-multiple-space-blockquote": { - "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md027.md", + "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md", "type": "boolean", "default": true }, "MD028": { - "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md028.md", + "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md", "type": "boolean", "default": true }, "no-blanks-blockquote": { - "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md028.md", + "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md", "type": "boolean", "default": true }, "MD029": { - "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md029.md", + "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md", "type": [ "boolean", "object" @@ -764,7 +764,7 @@ "additionalProperties": false }, "ol-prefix": { - "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md029.md", + "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md", "type": [ "boolean", "object" @@ -786,7 +786,7 @@ "additionalProperties": false }, "MD030": { - "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md030.md", + "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md", "type": [ "boolean", "object" @@ -821,7 +821,7 @@ "additionalProperties": false }, "list-marker-space": { - "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md030.md", + "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md", "type": [ "boolean", "object" @@ -856,7 +856,7 @@ "additionalProperties": false }, "MD031": { - "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md031.md", + "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md", "type": [ "boolean", "object" @@ -872,7 +872,7 @@ "additionalProperties": false }, "blanks-around-fences": { - "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md031.md", + "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md", "type": [ "boolean", "object" @@ -888,17 +888,17 @@ "additionalProperties": false }, "MD032": { - "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md032.md", + "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md", "type": "boolean", "default": true }, "blanks-around-lists": { - "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md032.md", + "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md", "type": "boolean", "default": true }, "MD033": { - "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md033.md", + "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md", "type": [ "boolean", "object" @@ -917,7 +917,7 @@ "additionalProperties": false }, "no-inline-html": { - "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md033.md", + "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md", "type": [ "boolean", "object" @@ -936,17 +936,17 @@ "additionalProperties": false }, "MD034": { - "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md034.md", + "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md", "type": "boolean", "default": true }, "no-bare-urls": { - "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md034.md", + "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md", "type": "boolean", "default": true }, "MD035": { - "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md035.md", + "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md", "type": [ "boolean", "object" @@ -962,7 +962,7 @@ "additionalProperties": false }, "hr-style": { - "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md035.md", + "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md", "type": [ "boolean", "object" @@ -978,7 +978,7 @@ "additionalProperties": false }, "MD036": { - "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md036.md", + "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md", "type": [ "boolean", "object" @@ -994,7 +994,7 @@ "additionalProperties": false }, "no-emphasis-as-heading": { - "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md036.md", + "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md", "type": [ "boolean", "object" @@ -1010,37 +1010,37 @@ "additionalProperties": false }, "MD037": { - "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md037.md", + "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md", "type": "boolean", "default": true }, "no-space-in-emphasis": { - "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md037.md", + "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md", "type": "boolean", "default": true }, "MD038": { - "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md038.md", + "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md", "type": "boolean", "default": true }, "no-space-in-code": { - "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md038.md", + "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md", "type": "boolean", "default": true }, "MD039": { - "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md039.md", + "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md", "type": "boolean", "default": true }, "no-space-in-links": { - "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md039.md", + "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md", "type": "boolean", "default": true }, "MD040": { - "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md040.md", + "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md", "type": [ "boolean", "object" @@ -1064,7 +1064,7 @@ "additionalProperties": false }, "fenced-code-language": { - "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md040.md", + "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md", "type": [ "boolean", "object" @@ -1088,7 +1088,7 @@ "additionalProperties": false }, "MD041": { - "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md041.md", + "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md", "type": [ "boolean", "object" @@ -1111,7 +1111,7 @@ "additionalProperties": false }, "first-line-heading": { - "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md041.md", + "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md", "type": [ "boolean", "object" @@ -1134,7 +1134,7 @@ "additionalProperties": false }, "first-line-h1": { - "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md041.md", + "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md", "type": [ "boolean", "object" @@ -1157,17 +1157,17 @@ "additionalProperties": false }, "MD042": { - "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md042.md", + "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md", "type": "boolean", "default": true }, "no-empty-links": { - "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md042.md", + "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md", "type": "boolean", "default": true }, "MD043": { - "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md043.md", + "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md", "type": [ "boolean", "object" @@ -1192,7 +1192,7 @@ "additionalProperties": false }, "required-headings": { - "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md043.md", + "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md", "type": [ "boolean", "object" @@ -1217,7 +1217,7 @@ "additionalProperties": false }, "MD044": { - "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md044.md", + "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md", "type": [ "boolean", "object" @@ -1246,7 +1246,7 @@ "additionalProperties": false }, "proper-names": { - "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md044.md", + "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md", "type": [ "boolean", "object" @@ -1275,17 +1275,17 @@ "additionalProperties": false }, "MD045": { - "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md045.md", + "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md", "type": "boolean", "default": true }, "no-alt-text": { - "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md045.md", + "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md", "type": "boolean", "default": true }, "MD046": { - "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md046.md", + "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md", "type": [ "boolean", "object" @@ -1306,7 +1306,7 @@ "additionalProperties": false }, "code-block-style": { - "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md046.md", + "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md", "type": [ "boolean", "object" @@ -1327,17 +1327,17 @@ "additionalProperties": false }, "MD047": { - "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md047.md", + "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md", "type": "boolean", "default": true }, "single-trailing-newline": { - "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md047.md", + "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md", "type": "boolean", "default": true }, "MD048": { - "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md048.md", + "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md", "type": [ "boolean", "object" @@ -1358,7 +1358,7 @@ "additionalProperties": false }, "code-fence-style": { - "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md048.md", + "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md", "type": [ "boolean", "object" @@ -1379,7 +1379,7 @@ "additionalProperties": false }, "MD049": { - "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md049.md", + "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md", "type": [ "boolean", "object" @@ -1400,7 +1400,7 @@ "additionalProperties": false }, "emphasis-style": { - "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md049.md", + "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md", "type": [ "boolean", "object" @@ -1421,7 +1421,7 @@ "additionalProperties": false }, "MD050": { - "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md050.md", + "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md", "type": [ "boolean", "object" @@ -1442,7 +1442,7 @@ "additionalProperties": false }, "strong-style": { - "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md050.md", + "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md", "type": [ "boolean", "object" @@ -1463,7 +1463,7 @@ "additionalProperties": false }, "MD051": { - "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md051.md", + "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md", "type": [ "boolean", "object" @@ -1479,7 +1479,7 @@ "additionalProperties": false }, "link-fragments": { - "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md051.md", + "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md", "type": [ "boolean", "object" @@ -1495,7 +1495,7 @@ "additionalProperties": false }, "MD052": { - "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md052.md", + "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md", "type": [ "boolean", "object" @@ -1511,7 +1511,7 @@ "additionalProperties": false }, "reference-links-images": { - "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md052.md", + "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md", "type": [ "boolean", "object" @@ -1527,7 +1527,7 @@ "additionalProperties": false }, "MD053": { - "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md053.md", + "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md", "type": [ "boolean", "object" @@ -1548,7 +1548,7 @@ "additionalProperties": false }, "link-image-reference-definitions": { - "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md053.md", + "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md", "type": [ "boolean", "object" @@ -1569,7 +1569,7 @@ "additionalProperties": false }, "MD054": { - "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md054.md", + "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md", "type": [ "boolean", "object" @@ -1610,7 +1610,7 @@ "additionalProperties": false }, "link-image-style": { - "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md054.md", + "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md", "type": [ "boolean", "object" @@ -1651,7 +1651,7 @@ "additionalProperties": false }, "MD055": { - "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md055.md", + "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md", "type": [ "boolean", "object" @@ -1674,7 +1674,7 @@ "additionalProperties": false }, "table-pipe-style": { - "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md055.md", + "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md", "type": [ "boolean", "object" @@ -1697,22 +1697,22 @@ "additionalProperties": false }, "MD056": { - "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md056.md", + "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md", "type": "boolean", "default": true }, "table-column-count": { - "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md056.md", + "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md", "type": "boolean", "default": true }, "MD058": { - "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md058.md", + "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md", "type": "boolean", "default": true }, "blanks-around-tables": { - "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md058.md", + "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md", "type": "boolean", "default": true }, diff --git a/schema/markdownlint-config-schema.json b/schema/markdownlint-config-schema.json index 31753a701..cf7dea4f5 100644 --- a/schema/markdownlint-config-schema.json +++ b/schema/markdownlint-config-schema.json @@ -1,13 +1,13 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.36.1/schema/markdownlint-config-schema.json", + "$id": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.37.0/schema/markdownlint-config-schema.json", "title": "markdownlint configuration schema", "type": "object", "properties": { "$schema": { "description": "JSON Schema URI (expected by some editors)", "type": "string", - "default": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.36.1/schema/markdownlint-config-schema.json" + "default": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.37.0/schema/markdownlint-config-schema.json" }, "default": { "description": "Default state for all rules", @@ -23,17 +23,17 @@ "default": null }, "MD001": { - "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md001.md", + "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md", "type": "boolean", "default": true }, "heading-increment": { - "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md001.md", + "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md", "type": "boolean", "default": true }, "MD003": { - "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md003.md", + "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md", "type": [ "boolean", "object" @@ -57,7 +57,7 @@ "additionalProperties": false }, "heading-style": { - "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md003.md", + "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md", "type": [ "boolean", "object" @@ -81,7 +81,7 @@ "additionalProperties": false }, "MD004": { - "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md004.md", + "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md", "type": [ "boolean", "object" @@ -104,7 +104,7 @@ "additionalProperties": false }, "ul-style": { - "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md004.md", + "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md", "type": [ "boolean", "object" @@ -127,17 +127,17 @@ "additionalProperties": false }, "MD005": { - "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md005.md", + "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md", "type": "boolean", "default": true }, "list-indent": { - "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md005.md", + "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md", "type": "boolean", "default": true }, "MD007": { - "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md007.md", + "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md", "type": [ "boolean", "object" @@ -165,7 +165,7 @@ "additionalProperties": false }, "ul-indent": { - "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md007.md", + "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md", "type": [ "boolean", "object" @@ -193,7 +193,7 @@ "additionalProperties": false }, "MD009": { - "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md009.md", + "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md", "type": [ "boolean", "object" @@ -220,7 +220,7 @@ "additionalProperties": false }, "no-trailing-spaces": { - "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md009.md", + "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md", "type": [ "boolean", "object" @@ -247,7 +247,7 @@ "additionalProperties": false }, "MD010": { - "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md010.md", + "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md", "type": [ "boolean", "object" @@ -277,7 +277,7 @@ "additionalProperties": false }, "no-hard-tabs": { - "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md010.md", + "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md", "type": [ "boolean", "object" @@ -307,17 +307,17 @@ "additionalProperties": false }, "MD011": { - "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md011.md", + "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md", "type": "boolean", "default": true }, "no-reversed-links": { - "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md011.md", + "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md", "type": "boolean", "default": true }, "MD012": { - "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md012.md", + "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md", "type": [ "boolean", "object" @@ -334,7 +334,7 @@ "additionalProperties": false }, "no-multiple-blanks": { - "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md012.md", + "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md", "type": [ "boolean", "object" @@ -351,7 +351,7 @@ "additionalProperties": false }, "MD013": { - "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md013.md", + "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md", "type": [ "boolean", "object" @@ -405,7 +405,7 @@ "additionalProperties": false }, "line-length": { - "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md013.md", + "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md", "type": [ "boolean", "object" @@ -459,57 +459,57 @@ "additionalProperties": false }, "MD014": { - "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md014.md", + "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md", "type": "boolean", "default": true }, "commands-show-output": { - "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md014.md", + "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md", "type": "boolean", "default": true }, "MD018": { - "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md018.md", + "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md", "type": "boolean", "default": true }, "no-missing-space-atx": { - "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md018.md", + "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md", "type": "boolean", "default": true }, "MD019": { - "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md019.md", + "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md", "type": "boolean", "default": true }, "no-multiple-space-atx": { - "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md019.md", + "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md", "type": "boolean", "default": true }, "MD020": { - "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md020.md", + "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md020.md", "type": "boolean", "default": true }, "no-missing-space-closed-atx": { - "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md020.md", + "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md020.md", "type": "boolean", "default": true }, "MD021": { - "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md021.md", + "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md021.md", "type": "boolean", "default": true }, "no-multiple-space-closed-atx": { - "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md021.md", + "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md021.md", "type": "boolean", "default": true }, "MD022": { - "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md022.md", + "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md", "type": [ "boolean", "object" @@ -544,7 +544,7 @@ "additionalProperties": false }, "blanks-around-headings": { - "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md022.md", + "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md", "type": [ "boolean", "object" @@ -579,17 +579,17 @@ "additionalProperties": false }, "MD023": { - "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md023.md", + "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md", "type": "boolean", "default": true }, "heading-start-left": { - "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md023.md", + "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md", "type": "boolean", "default": true }, "MD024": { - "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md024.md", + "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md", "type": [ "boolean", "object" @@ -605,7 +605,7 @@ "additionalProperties": false }, "no-duplicate-heading": { - "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md024.md", + "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md", "type": [ "boolean", "object" @@ -621,7 +621,7 @@ "additionalProperties": false }, "MD025": { - "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md025.md", + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md", "type": [ "boolean", "object" @@ -644,7 +644,7 @@ "additionalProperties": false }, "single-title": { - "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md025.md", + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md", "type": [ "boolean", "object" @@ -667,7 +667,7 @@ "additionalProperties": false }, "single-h1": { - "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md025.md", + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md", "type": [ "boolean", "object" @@ -690,7 +690,7 @@ "additionalProperties": false }, "MD026": { - "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md026.md", + "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md", "type": [ "boolean", "object" @@ -706,7 +706,7 @@ "additionalProperties": false }, "no-trailing-punctuation": { - "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md026.md", + "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md", "type": [ "boolean", "object" @@ -722,27 +722,27 @@ "additionalProperties": false }, "MD027": { - "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md027.md", + "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md", "type": "boolean", "default": true }, "no-multiple-space-blockquote": { - "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md027.md", + "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md", "type": "boolean", "default": true }, "MD028": { - "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md028.md", + "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md", "type": "boolean", "default": true }, "no-blanks-blockquote": { - "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md028.md", + "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md", "type": "boolean", "default": true }, "MD029": { - "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md029.md", + "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md", "type": [ "boolean", "object" @@ -764,7 +764,7 @@ "additionalProperties": false }, "ol-prefix": { - "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md029.md", + "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md", "type": [ "boolean", "object" @@ -786,7 +786,7 @@ "additionalProperties": false }, "MD030": { - "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md030.md", + "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md", "type": [ "boolean", "object" @@ -821,7 +821,7 @@ "additionalProperties": false }, "list-marker-space": { - "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md030.md", + "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md", "type": [ "boolean", "object" @@ -856,7 +856,7 @@ "additionalProperties": false }, "MD031": { - "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md031.md", + "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md", "type": [ "boolean", "object" @@ -872,7 +872,7 @@ "additionalProperties": false }, "blanks-around-fences": { - "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md031.md", + "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md", "type": [ "boolean", "object" @@ -888,17 +888,17 @@ "additionalProperties": false }, "MD032": { - "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md032.md", + "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md", "type": "boolean", "default": true }, "blanks-around-lists": { - "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md032.md", + "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md", "type": "boolean", "default": true }, "MD033": { - "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md033.md", + "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md", "type": [ "boolean", "object" @@ -917,7 +917,7 @@ "additionalProperties": false }, "no-inline-html": { - "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md033.md", + "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md", "type": [ "boolean", "object" @@ -936,17 +936,17 @@ "additionalProperties": false }, "MD034": { - "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md034.md", + "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md", "type": "boolean", "default": true }, "no-bare-urls": { - "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md034.md", + "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md", "type": "boolean", "default": true }, "MD035": { - "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md035.md", + "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md", "type": [ "boolean", "object" @@ -962,7 +962,7 @@ "additionalProperties": false }, "hr-style": { - "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md035.md", + "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md", "type": [ "boolean", "object" @@ -978,7 +978,7 @@ "additionalProperties": false }, "MD036": { - "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md036.md", + "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md", "type": [ "boolean", "object" @@ -994,7 +994,7 @@ "additionalProperties": false }, "no-emphasis-as-heading": { - "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md036.md", + "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md", "type": [ "boolean", "object" @@ -1010,37 +1010,37 @@ "additionalProperties": false }, "MD037": { - "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md037.md", + "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md", "type": "boolean", "default": true }, "no-space-in-emphasis": { - "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md037.md", + "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md", "type": "boolean", "default": true }, "MD038": { - "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md038.md", + "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md", "type": "boolean", "default": true }, "no-space-in-code": { - "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md038.md", + "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md", "type": "boolean", "default": true }, "MD039": { - "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md039.md", + "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md", "type": "boolean", "default": true }, "no-space-in-links": { - "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md039.md", + "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md", "type": "boolean", "default": true }, "MD040": { - "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md040.md", + "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md", "type": [ "boolean", "object" @@ -1064,7 +1064,7 @@ "additionalProperties": false }, "fenced-code-language": { - "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md040.md", + "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md", "type": [ "boolean", "object" @@ -1088,7 +1088,7 @@ "additionalProperties": false }, "MD041": { - "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md041.md", + "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md", "type": [ "boolean", "object" @@ -1111,7 +1111,7 @@ "additionalProperties": false }, "first-line-heading": { - "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md041.md", + "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md", "type": [ "boolean", "object" @@ -1134,7 +1134,7 @@ "additionalProperties": false }, "first-line-h1": { - "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md041.md", + "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md", "type": [ "boolean", "object" @@ -1157,17 +1157,17 @@ "additionalProperties": false }, "MD042": { - "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md042.md", + "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md", "type": "boolean", "default": true }, "no-empty-links": { - "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md042.md", + "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md", "type": "boolean", "default": true }, "MD043": { - "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md043.md", + "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md", "type": [ "boolean", "object" @@ -1192,7 +1192,7 @@ "additionalProperties": false }, "required-headings": { - "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md043.md", + "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md", "type": [ "boolean", "object" @@ -1217,7 +1217,7 @@ "additionalProperties": false }, "MD044": { - "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md044.md", + "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md", "type": [ "boolean", "object" @@ -1246,7 +1246,7 @@ "additionalProperties": false }, "proper-names": { - "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md044.md", + "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md", "type": [ "boolean", "object" @@ -1275,17 +1275,17 @@ "additionalProperties": false }, "MD045": { - "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md045.md", + "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md", "type": "boolean", "default": true }, "no-alt-text": { - "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md045.md", + "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md", "type": "boolean", "default": true }, "MD046": { - "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md046.md", + "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md", "type": [ "boolean", "object" @@ -1306,7 +1306,7 @@ "additionalProperties": false }, "code-block-style": { - "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md046.md", + "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md", "type": [ "boolean", "object" @@ -1327,17 +1327,17 @@ "additionalProperties": false }, "MD047": { - "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md047.md", + "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md", "type": "boolean", "default": true }, "single-trailing-newline": { - "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md047.md", + "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md", "type": "boolean", "default": true }, "MD048": { - "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md048.md", + "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md", "type": [ "boolean", "object" @@ -1358,7 +1358,7 @@ "additionalProperties": false }, "code-fence-style": { - "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md048.md", + "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md", "type": [ "boolean", "object" @@ -1379,7 +1379,7 @@ "additionalProperties": false }, "MD049": { - "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md049.md", + "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md", "type": [ "boolean", "object" @@ -1400,7 +1400,7 @@ "additionalProperties": false }, "emphasis-style": { - "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md049.md", + "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md", "type": [ "boolean", "object" @@ -1421,7 +1421,7 @@ "additionalProperties": false }, "MD050": { - "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md050.md", + "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md", "type": [ "boolean", "object" @@ -1442,7 +1442,7 @@ "additionalProperties": false }, "strong-style": { - "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md050.md", + "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md", "type": [ "boolean", "object" @@ -1463,7 +1463,7 @@ "additionalProperties": false }, "MD051": { - "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md051.md", + "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md", "type": [ "boolean", "object" @@ -1479,7 +1479,7 @@ "additionalProperties": false }, "link-fragments": { - "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md051.md", + "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md", "type": [ "boolean", "object" @@ -1495,7 +1495,7 @@ "additionalProperties": false }, "MD052": { - "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md052.md", + "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md", "type": [ "boolean", "object" @@ -1511,7 +1511,7 @@ "additionalProperties": false }, "reference-links-images": { - "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md052.md", + "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md", "type": [ "boolean", "object" @@ -1527,7 +1527,7 @@ "additionalProperties": false }, "MD053": { - "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md053.md", + "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md", "type": [ "boolean", "object" @@ -1548,7 +1548,7 @@ "additionalProperties": false }, "link-image-reference-definitions": { - "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md053.md", + "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md", "type": [ "boolean", "object" @@ -1569,7 +1569,7 @@ "additionalProperties": false }, "MD054": { - "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md054.md", + "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md", "type": [ "boolean", "object" @@ -1610,7 +1610,7 @@ "additionalProperties": false }, "link-image-style": { - "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md054.md", + "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md", "type": [ "boolean", "object" @@ -1651,7 +1651,7 @@ "additionalProperties": false }, "MD055": { - "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md055.md", + "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md", "type": [ "boolean", "object" @@ -1674,7 +1674,7 @@ "additionalProperties": false }, "table-pipe-style": { - "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md055.md", + "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md", "type": [ "boolean", "object" @@ -1697,22 +1697,22 @@ "additionalProperties": false }, "MD056": { - "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md056.md", + "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md", "type": "boolean", "default": true }, "table-column-count": { - "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md056.md", + "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md", "type": "boolean", "default": true }, "MD058": { - "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md058.md", + "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md", "type": "boolean", "default": true }, "blanks-around-tables": { - "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.36.1/doc/md058.md", + "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md", "type": "boolean", "default": true }, From 015b34ff09a8ba618a6d09b863ae1b0fd86f3516 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sat, 7 Dec 2024 18:23:52 -0800 Subject: [PATCH 49/64] Update helpers to version 0.28.0. --- helpers/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpers/package.json b/helpers/package.json index 60c19c812..a5ef55520 100644 --- a/helpers/package.json +++ b/helpers/package.json @@ -1,6 +1,6 @@ { "name": "markdownlint-rule-helpers", - "version": "0.27.0", + "version": "0.28.0", "description": "A collection of markdownlint helper functions for custom rules", "main": "./helpers.cjs", "exports": { From 898c573f29f8942fb0b2f9cbfb330d9fe935eb08 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sun, 8 Dec 2024 18:35:05 -0800 Subject: [PATCH 50/64] Un-pin Node 23 version in ci.yml. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index caf1600be..f88082fd8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: fail-fast: false matrix: os: [macos-latest, ubuntu-latest, windows-latest] - node-version: [ 18, 20, 22, 23.1 ] + node-version: [ 18, 20, 22, 23 ] steps: - uses: actions/checkout@v4 From ed3cd80babce87538588bf26d47ae8e320486a54 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 02:34:36 +0000 Subject: [PATCH 51/64] Bump @stylistic/eslint-plugin from 2.11.0 to 2.12.0 Bumps [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) from 2.11.0 to 2.12.0. - [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases) - [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v2.12.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@stylistic/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8c86521fe..0fc56a918 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ }, "devDependencies": { "@eslint/js": "9.16.0", - "@stylistic/eslint-plugin": "2.11.0", + "@stylistic/eslint-plugin": "2.12.0", "ajv": "8.17.1", "ava": "6.2.0", "c8": "10.1.2", From 14d8db70f6c2179dbc6d5d725eea0a8b407d5865 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 02:21:14 +0000 Subject: [PATCH 52/64] Bump eslint-plugin-n from 17.14.0 to 17.15.0 Bumps [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) from 17.14.0 to 17.15.0. - [Release notes](https://github.com/eslint-community/eslint-plugin-n/releases) - [Changelog](https://github.com/eslint-community/eslint-plugin-n/blob/master/CHANGELOG.md) - [Commits](https://github.com/eslint-community/eslint-plugin-n/compare/v17.14.0...v17.15.0) --- updated-dependencies: - dependency-name: eslint-plugin-n dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0fc56a918..8cb0fe1bc 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "character-entities": "2.0.2", "eslint": "9.16.0", "eslint-plugin-jsdoc": "50.6.0", - "eslint-plugin-n": "17.14.0", + "eslint-plugin-n": "17.15.0", "eslint-plugin-regexp": "2.7.0", "eslint-plugin-unicorn": "56.0.1", "gemoji": "8.1.0", From 259f19a5587002b59bd048c2a00b30a087af6414 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 02:20:54 +0000 Subject: [PATCH 53/64] Bump c8 from 10.1.2 to 10.1.3 Bumps [c8](https://github.com/bcoe/c8) from 10.1.2 to 10.1.3. - [Release notes](https://github.com/bcoe/c8/releases) - [Changelog](https://github.com/bcoe/c8/blob/main/CHANGELOG.md) - [Commits](https://github.com/bcoe/c8/compare/v10.1.2...v10.1.3) --- updated-dependencies: - dependency-name: c8 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8cb0fe1bc..c36e9fb4e 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "@stylistic/eslint-plugin": "2.12.0", "ajv": "8.17.1", "ava": "6.2.0", - "c8": "10.1.2", + "c8": "10.1.3", "character-entities": "2.0.2", "eslint": "9.16.0", "eslint-plugin-jsdoc": "50.6.0", From 6737ace933793b334a4bdecf4c126dce35d973fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 03:11:16 +0000 Subject: [PATCH 54/64] Bump eslint-plugin-jsdoc from 50.6.0 to 50.6.1 Bumps [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) from 50.6.0 to 50.6.1. - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.0...v50.6.1) --- updated-dependencies: - dependency-name: eslint-plugin-jsdoc dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c36e9fb4e..09ffc7828 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "c8": "10.1.3", "character-entities": "2.0.2", "eslint": "9.16.0", - "eslint-plugin-jsdoc": "50.6.0", + "eslint-plugin-jsdoc": "50.6.1", "eslint-plugin-n": "17.15.0", "eslint-plugin-regexp": "2.7.0", "eslint-plugin-unicorn": "56.0.1", From 8b26129d55e8a3ebcc790341ad3db6a905731be1 Mon Sep 17 00:00:00 2001 From: David Anson Date: Tue, 10 Dec 2024 21:47:06 -0800 Subject: [PATCH 55/64] Convert types.d.mts from ambient module declaration to module augmentation which enables VS Code to handle `@type {import("markdownlint").Rule}` (https://www.typescriptlang.org/docs/handbook/modules/reference.html#ambient-modules), fix broken markdownlint @typedefs in helpers/*.cjs. --- helpers/helpers.cjs | 6 +++--- helpers/micromark-helpers.cjs | 2 +- lib/types.d.mts | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/helpers/helpers.cjs b/helpers/helpers.cjs index 5b5f6491f..6b42f0ab6 100644 --- a/helpers/helpers.cjs +++ b/helpers/helpers.cjs @@ -10,11 +10,11 @@ module.exports.newLineRe = newLineRe; module.exports.nextLinesRe = nextLinesRe; // @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 -/** @typedef {import("markdownlint").RuleOnError} RuleOnError */ +/** @typedef {import("../lib/exports.mjs").RuleOnError} RuleOnError */ // @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 -/** @typedef {import("markdownlint").RuleOnErrorFixInfo} RuleOnErrorFixInfo */ +/** @typedef {import("../lib/exports.mjs").RuleOnErrorFixInfo} RuleOnErrorFixInfo */ // @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 -/** @typedef {import("markdownlint").MicromarkToken} MicromarkToken */ +/** @typedef {import("../lib/exports.mjs").MicromarkToken} MicromarkToken */ // eslint-disable-next-line jsdoc/valid-types /** @typedef {import("micromark-extension-gfm-footnote", { with: { "resolution-mode": "import" } })} */ // eslint-disable-next-line jsdoc/valid-types diff --git a/helpers/micromark-helpers.cjs b/helpers/micromark-helpers.cjs index bed42c862..842c8210a 100644 --- a/helpers/micromark-helpers.cjs +++ b/helpers/micromark-helpers.cjs @@ -7,7 +7,7 @@ const { flatTokensSymbol, htmlFlowSymbol } = require("./shared.cjs"); // eslint-disable-next-line jsdoc/valid-types /** @typedef {import("micromark-util-types", { with: { "resolution-mode": "import" } }).TokenType} TokenType */ // @ts-expect-error https://github.com/microsoft/TypeScript/issues/52529 -/** @typedef {import("markdownlint").MicromarkToken} Token */ +/** @typedef {import("../lib/exports.mjs").MicromarkToken} Token */ /** * Determines if a Micromark token is within an htmlFlow type. diff --git a/lib/types.d.mts b/lib/types.d.mts index 2ca3e4d35..462a7d271 100644 --- a/lib/types.d.mts +++ b/lib/types.d.mts @@ -1,3 +1,4 @@ +export {}; declare module "markdownlint" { export * from "./exports.mjs"; } From 65eeb4c8d9799436b994ecc1296c6e29241d1e96 Mon Sep 17 00:00:00 2001 From: David Anson Date: Tue, 10 Dec 2024 21:56:14 -0800 Subject: [PATCH 56/64] Suppress (hidden) expected Webpack warnings due to dynamic require and bundle size. --- demo/webpack.config.mjs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/demo/webpack.config.mjs b/demo/webpack.config.mjs index d3edca6d1..f8e6ecd4a 100644 --- a/demo/webpack.config.mjs +++ b/demo/webpack.config.mjs @@ -56,7 +56,18 @@ function config(options) { "path": false, "module": require.resolve("./module-stub.cjs") } - } + }, + "ignoreWarnings": [ + { + "message": /(asset|entrypoint) size limit/ + }, + { + "message": /dependencies cannot be statically extracted/ + }, + { + "message": /lazy load some parts of your application/ + } + ] }; } From a009407088120f12e3a752b27af45e9527d7f2ef Mon Sep 17 00:00:00 2001 From: David Anson Date: Sun, 8 Dec 2024 21:04:32 -0800 Subject: [PATCH 57/64] Add support for "browser" condition (e.g., as used by Webpack) by stubbing-away Node imports (fixes #1441). --- demo/webpack.config.mjs | 26 ------------------- lib/markdownlint.mjs | 8 +++--- .../node-imports-browser-module.cjs | 1 - lib/node-imports-browser.mjs | 22 ++++++++++++++++ lib/node-imports-node.mjs | 14 ++++++++++ package.json | 6 +++++ 6 files changed, 45 insertions(+), 32 deletions(-) rename demo/module-stub.cjs => lib/node-imports-browser-module.cjs (84%) create mode 100644 lib/node-imports-browser.mjs create mode 100644 lib/node-imports-node.mjs diff --git a/demo/webpack.config.mjs b/demo/webpack.config.mjs index f8e6ecd4a..de05a6024 100644 --- a/demo/webpack.config.mjs +++ b/demo/webpack.config.mjs @@ -1,12 +1,9 @@ // @ts-check -import { createRequire } from "node:module"; -const require = createRequire(import.meta.url); import webpack from "webpack"; import TerserPlugin from "terser-webpack-plugin"; import { __dirname, importWithTypeJson } from "../test/esm-helpers.mjs"; const libraryPackageJson = await importWithTypeJson(import.meta, "../package.json"); -const nodeModulePrefixRe = /^node:/u; // eslint-disable-next-line jsdoc/require-jsdoc function config(options) { @@ -19,14 +16,6 @@ function config(options) { "markdown-it": "markdownit" }, "mode": mode, - "module": { - "rules": [ - { - "test": /\.[cm]?js$/, - "exclude": /node_modules/ - } - ] - }, "name": name, "optimization": optimization, "output": { @@ -38,25 +27,10 @@ function config(options) { "path": __dirname(import.meta) }, "plugins": [ - new webpack.NormalModuleReplacementPlugin( - nodeModulePrefixRe, - (resource) => { - const module = resource.request.replace(nodeModulePrefixRe, ""); - resource.request = module; - } - ), new webpack.BannerPlugin({ "banner": `${name} ${version} ${homepage} @license ${license}` }) ], - "resolve": { - "fallback": { - "fs": false, - "os": false, - "path": false, - "module": require.resolve("./module-stub.cjs") - } - }, "ignoreWarnings": [ { "message": /(asset|entrypoint) size limit/ diff --git a/lib/markdownlint.mjs b/lib/markdownlint.mjs index 6ff36222b..8ae980196 100644 --- a/lib/markdownlint.mjs +++ b/lib/markdownlint.mjs @@ -1,10 +1,8 @@ // @ts-check -import * as nodeFs from "node:fs"; -import { createRequire } from "node:module"; -const dynamicRequire = createRequire(import.meta.url); -import * as os from "node:os"; -import path from "node:path"; +// @ts-ignore +import { fs as nodeFs, module, os, path } from "#node-imports"; +const dynamicRequire = module.createRequire(import.meta.url); import { initialize as cacheInitialize } from "./cache.mjs"; import { version } from "./constants.mjs"; import rules from "./rules.mjs"; diff --git a/demo/module-stub.cjs b/lib/node-imports-browser-module.cjs similarity index 84% rename from demo/module-stub.cjs rename to lib/node-imports-browser-module.cjs index fec94871b..a48161571 100644 --- a/demo/module-stub.cjs +++ b/lib/node-imports-browser-module.cjs @@ -3,6 +3,5 @@ "use strict"; module.exports = { - // @ts-ignore "createRequire": () => require }; diff --git a/lib/node-imports-browser.mjs b/lib/node-imports-browser.mjs new file mode 100644 index 000000000..ecd8d01ff --- /dev/null +++ b/lib/node-imports-browser.mjs @@ -0,0 +1,22 @@ +// @ts-check + +const getError = () => new Error("Node APIs are not available in browser context."); +const throwForSync = () => { + throw getError(); +}; + +export const fs = { + "access": (path, callback) => callback(getError()), + "accessSync": throwForSync, + "readFile": (path, options, callback) => callback(getError()), + "readFileSync": throwForSync +}; + +export { default as module } from "./node-imports-browser-module.cjs"; + +export const os = {}; + +export const path = { + "dirname": throwForSync, + "resolve": throwForSync +}; diff --git a/lib/node-imports-node.mjs b/lib/node-imports-node.mjs new file mode 100644 index 000000000..694165776 --- /dev/null +++ b/lib/node-imports-node.mjs @@ -0,0 +1,14 @@ +// @ts-check + +import { access, accessSync, readFile, readFileSync } from "node:fs"; +export const fs = { access, accessSync, readFile, readFileSync }; + +import { createRequire } from "node:module"; +export const module = { createRequire }; + +import { EOL, homedir } from "node:os"; +export const os = { EOL, homedir }; + +// eslint-disable-next-line unicorn/import-style +import { dirname, resolve } from "node:path"; +export const path = { dirname, resolve }; diff --git a/package.json b/package.json index 09ffc7828..57466f9db 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,12 @@ "./style/prettier": "./style/prettier.json", "./style/relaxed": "./style/relaxed.json" }, + "imports": { + "#node-imports": { + "browser": "./lib/node-imports-browser.mjs", + "default": "./lib/node-imports-node.mjs" + } + }, "types": "./lib/types.d.mts", "author": "David Anson (https://dlaa.me/)", "license": "MIT", From c9d32c33b0c5e5813540425ecd0c4b7ea0383b3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 02:56:06 +0000 Subject: [PATCH 58/64] Bump @stylistic/eslint-plugin from 2.12.0 to 2.12.1 Bumps [@stylistic/eslint-plugin](https://github.com/eslint-stylistic/eslint-stylistic/tree/HEAD/packages/eslint-plugin) from 2.12.0 to 2.12.1. - [Release notes](https://github.com/eslint-stylistic/eslint-stylistic/releases) - [Changelog](https://github.com/eslint-stylistic/eslint-stylistic/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint-stylistic/eslint-stylistic/commits/v2.12.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@stylistic/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 57466f9db..8c6c8e00d 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ }, "devDependencies": { "@eslint/js": "9.16.0", - "@stylistic/eslint-plugin": "2.12.0", + "@stylistic/eslint-plugin": "2.12.1", "ajv": "8.17.1", "ava": "6.2.0", "c8": "10.1.3", From faa9c6cbb42c21bf1b524e0403dc23170fda8ccd Mon Sep 17 00:00:00 2001 From: David Anson Date: Sat, 14 Dec 2024 20:05:04 -0800 Subject: [PATCH 59/64] Remove outdated /micromark configuration for Dependabot. --- .github/dependabot.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 32794a252..52925e52f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -11,9 +11,3 @@ updates: interval: "daily" target-branch: "next" versioning-strategy: "increase" - - package-ecosystem: "npm" - directory: "/micromark" - schedule: - interval: "daily" - target-branch: "next" - versioning-strategy: "increase" From a46b5879006510ddd6dec6bddcde7426ec7b7eba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Dec 2024 04:06:10 +0000 Subject: [PATCH 60/64] Bump eslint from 9.16.0 to 9.17.0 Bumps [eslint](https://github.com/eslint/eslint) from 9.16.0 to 9.17.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.16.0...v9.17.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8c6c8e00d..2a5e75749 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "ava": "6.2.0", "c8": "10.1.3", "character-entities": "2.0.2", - "eslint": "9.16.0", + "eslint": "9.17.0", "eslint-plugin-jsdoc": "50.6.1", "eslint-plugin-n": "17.15.0", "eslint-plugin-regexp": "2.7.0", From 5056da0f93197df24839faefb36db2f719807647 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Dec 2024 04:06:34 +0000 Subject: [PATCH 61/64] Bump @eslint/js from 9.16.0 to 9.17.0 Bumps [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) from 9.16.0 to 9.17.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.17.0/packages/js) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2a5e75749..e5c980f2c 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "micromark-util-types": "2.0.1" }, "devDependencies": { - "@eslint/js": "9.16.0", + "@eslint/js": "9.17.0", "@stylistic/eslint-plugin": "2.12.1", "ajv": "8.17.1", "ava": "6.2.0", From dc26c506887ca42585a55aaed3414fcc65330305 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Dec 2024 04:06:22 +0000 Subject: [PATCH 62/64] Bump terser-webpack-plugin from 5.3.10 to 5.3.11 Bumps [terser-webpack-plugin](https://github.com/webpack-contrib/terser-webpack-plugin) from 5.3.10 to 5.3.11. - [Release notes](https://github.com/webpack-contrib/terser-webpack-plugin/releases) - [Changelog](https://github.com/webpack-contrib/terser-webpack-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/terser-webpack-plugin/compare/v5.3.10...v5.3.11) --- updated-dependencies: - dependency-name: terser-webpack-plugin dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e5c980f2c..eea9df847 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "markdown-it-sup": "2.0.0", "markdownlint-rule-extended-ascii": "0.1.0", "npm-run-all": "4.1.5", - "terser-webpack-plugin": "5.3.10", + "terser-webpack-plugin": "5.3.11", "toml": "3.0.0", "typescript": "5.7.2", "webpack": "5.97.1", From af086995edeebfb97eaee64da70d8e0771383102 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sat, 14 Dec 2024 20:15:46 -0800 Subject: [PATCH 63/64] Update to version 0.37.1. --- CHANGELOG.md | 4 + helpers/README.md | 4 +- lib/configuration-strict.d.ts | 208 ++++++++--------- lib/constants.mjs | 2 +- package.json | 2 +- schema/.markdownlint.jsonc | 102 ++++----- schema/.markdownlint.yaml | 102 ++++----- schema/markdownlint-config-schema-strict.json | 212 +++++++++--------- schema/markdownlint-config-schema.json | 212 +++++++++--------- 9 files changed, 426 insertions(+), 422 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8610ec659..a9169f115 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.37.1 + +- Add support for "browser" condition (as used by Webpack) + ## 0.37.0 - Convert module to ECMAScript (breaking change) diff --git a/helpers/README.md b/helpers/README.md index 830f83875..c95c4a45e 100644 --- a/helpers/README.md +++ b/helpers/README.md @@ -22,8 +22,8 @@ be useful to custom rule authors and may avoid duplicating code. *None* - The entire body of code is tested to 100% coverage by the core `markdownlint` project, so there are no additional tests here. -[custom-rules]: https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/CustomRules.md +[custom-rules]: https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/CustomRules.md [jsdoc]: https://en.m.wikipedia.org/wiki/JSDoc [markdown]: https://en.wikipedia.org/wiki/Markdown [markdownlint]: https://github.com/DavidAnson/markdownlint -[rules]: https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/Rules.md +[rules]: https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/Rules.md diff --git a/lib/configuration-strict.d.ts b/lib/configuration-strict.d.ts index 5b2aa72eb..7d233f5f6 100644 --- a/lib/configuration-strict.d.ts +++ b/lib/configuration-strict.d.ts @@ -19,15 +19,15 @@ export interface ConfigurationStrict { */ extends?: string | null; /** - * MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md + * MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md001.md */ MD001?: boolean; /** - * MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md + * MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md001.md */ "heading-increment"?: boolean; /** - * MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md + * MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md003.md */ MD003?: | boolean @@ -38,7 +38,7 @@ export interface ConfigurationStrict { style?: "consistent" | "atx" | "atx_closed" | "setext" | "setext_with_atx" | "setext_with_atx_closed"; }; /** - * MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md + * MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md003.md */ "heading-style"?: | boolean @@ -49,7 +49,7 @@ export interface ConfigurationStrict { style?: "consistent" | "atx" | "atx_closed" | "setext" | "setext_with_atx" | "setext_with_atx_closed"; }; /** - * MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md + * MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md004.md */ MD004?: | boolean @@ -60,7 +60,7 @@ export interface ConfigurationStrict { style?: "consistent" | "asterisk" | "plus" | "dash" | "sublist"; }; /** - * MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md + * MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md004.md */ "ul-style"?: | boolean @@ -71,15 +71,15 @@ export interface ConfigurationStrict { style?: "consistent" | "asterisk" | "plus" | "dash" | "sublist"; }; /** - * MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md + * MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md005.md */ MD005?: boolean; /** - * MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md + * MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md005.md */ "list-indent"?: boolean; /** - * MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md + * MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md007.md */ MD007?: | boolean @@ -98,7 +98,7 @@ export interface ConfigurationStrict { start_indent?: number; }; /** - * MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md + * MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md007.md */ "ul-indent"?: | boolean @@ -117,7 +117,7 @@ export interface ConfigurationStrict { start_indent?: number; }; /** - * MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md + * MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md009.md */ MD009?: | boolean @@ -136,7 +136,7 @@ export interface ConfigurationStrict { strict?: boolean; }; /** - * MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md + * MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md009.md */ "no-trailing-spaces"?: | boolean @@ -155,7 +155,7 @@ export interface ConfigurationStrict { strict?: boolean; }; /** - * MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md + * MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md010.md */ MD010?: | boolean @@ -174,7 +174,7 @@ export interface ConfigurationStrict { spaces_per_tab?: number; }; /** - * MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md + * MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md010.md */ "no-hard-tabs"?: | boolean @@ -193,15 +193,15 @@ export interface ConfigurationStrict { spaces_per_tab?: number; }; /** - * MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md + * MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md011.md */ MD011?: boolean; /** - * MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md + * MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md011.md */ "no-reversed-links"?: boolean; /** - * MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md + * MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md012.md */ MD012?: | boolean @@ -212,7 +212,7 @@ export interface ConfigurationStrict { maximum?: number; }; /** - * MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md + * MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md012.md */ "no-multiple-blanks"?: | boolean @@ -223,7 +223,7 @@ export interface ConfigurationStrict { maximum?: number; }; /** - * MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md + * MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md013.md */ MD013?: | boolean @@ -262,7 +262,7 @@ export interface ConfigurationStrict { stern?: boolean; }; /** - * MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md + * MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md013.md */ "line-length"?: | boolean @@ -301,47 +301,47 @@ export interface ConfigurationStrict { stern?: boolean; }; /** - * MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md + * MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md014.md */ MD014?: boolean; /** - * MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md + * MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md014.md */ "commands-show-output"?: boolean; /** - * MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md + * MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md018.md */ MD018?: boolean; /** - * MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md + * MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md018.md */ "no-missing-space-atx"?: boolean; /** - * MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md + * MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md019.md */ MD019?: boolean; /** - * MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md + * MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md019.md */ "no-multiple-space-atx"?: boolean; /** - * MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.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.37.1/doc/md020.md */ MD020?: boolean; /** - * MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.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.37.1/doc/md020.md */ "no-missing-space-closed-atx"?: boolean; /** - * MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.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.37.1/doc/md021.md */ MD021?: boolean; /** - * MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.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.37.1/doc/md021.md */ "no-multiple-space-closed-atx"?: boolean; /** - * MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md + * MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md022.md */ MD022?: | boolean @@ -356,7 +356,7 @@ export interface ConfigurationStrict { lines_below?: number | number[]; }; /** - * MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md + * MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md022.md */ "blanks-around-headings"?: | boolean @@ -371,15 +371,15 @@ export interface ConfigurationStrict { lines_below?: number | number[]; }; /** - * MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md + * MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md023.md */ MD023?: boolean; /** - * MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md + * MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md023.md */ "heading-start-left"?: boolean; /** - * MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md + * MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md024.md */ MD024?: | boolean @@ -390,7 +390,7 @@ export interface ConfigurationStrict { siblings_only?: boolean; }; /** - * MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md + * MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md024.md */ "no-duplicate-heading"?: | boolean @@ -401,7 +401,7 @@ export interface ConfigurationStrict { siblings_only?: boolean; }; /** - * MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md + * MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md025.md */ MD025?: | boolean @@ -416,7 +416,7 @@ export interface ConfigurationStrict { front_matter_title?: string; }; /** - * MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md + * MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md025.md */ "single-title"?: | boolean @@ -431,7 +431,7 @@ export interface ConfigurationStrict { front_matter_title?: string; }; /** - * MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md + * MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md025.md */ "single-h1"?: | boolean @@ -446,7 +446,7 @@ export interface ConfigurationStrict { front_matter_title?: string; }; /** - * MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md + * MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md026.md */ MD026?: | boolean @@ -457,7 +457,7 @@ export interface ConfigurationStrict { punctuation?: string; }; /** - * MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md + * MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md026.md */ "no-trailing-punctuation"?: | boolean @@ -468,23 +468,23 @@ export interface ConfigurationStrict { punctuation?: string; }; /** - * MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md + * MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md027.md */ MD027?: boolean; /** - * MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md + * MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md027.md */ "no-multiple-space-blockquote"?: boolean; /** - * MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md + * MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md028.md */ MD028?: boolean; /** - * MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md + * MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md028.md */ "no-blanks-blockquote"?: boolean; /** - * MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md + * MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md029.md */ MD029?: | boolean @@ -495,7 +495,7 @@ export interface ConfigurationStrict { style?: "one" | "ordered" | "one_or_ordered" | "zero"; }; /** - * MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md + * MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md029.md */ "ol-prefix"?: | boolean @@ -506,7 +506,7 @@ export interface ConfigurationStrict { style?: "one" | "ordered" | "one_or_ordered" | "zero"; }; /** - * MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md + * MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md030.md */ MD030?: | boolean @@ -529,7 +529,7 @@ export interface ConfigurationStrict { ol_multi?: number; }; /** - * MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md + * MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md030.md */ "list-marker-space"?: | boolean @@ -552,7 +552,7 @@ export interface ConfigurationStrict { ol_multi?: number; }; /** - * MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md + * MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md031.md */ MD031?: | boolean @@ -563,7 +563,7 @@ export interface ConfigurationStrict { list_items?: boolean; }; /** - * MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md + * MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md031.md */ "blanks-around-fences"?: | boolean @@ -574,15 +574,15 @@ export interface ConfigurationStrict { list_items?: boolean; }; /** - * MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md + * MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md032.md */ MD032?: boolean; /** - * MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md + * MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md032.md */ "blanks-around-lists"?: boolean; /** - * MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md + * MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md033.md */ MD033?: | boolean @@ -593,7 +593,7 @@ export interface ConfigurationStrict { allowed_elements?: string[]; }; /** - * MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md + * MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md033.md */ "no-inline-html"?: | boolean @@ -604,15 +604,15 @@ export interface ConfigurationStrict { allowed_elements?: string[]; }; /** - * MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md + * MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md034.md */ MD034?: boolean; /** - * MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md + * MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md034.md */ "no-bare-urls"?: boolean; /** - * MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md + * MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md035.md */ MD035?: | boolean @@ -623,7 +623,7 @@ export interface ConfigurationStrict { style?: string; }; /** - * MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md + * MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md035.md */ "hr-style"?: | boolean @@ -634,7 +634,7 @@ export interface ConfigurationStrict { style?: string; }; /** - * MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md + * MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md036.md */ MD036?: | boolean @@ -645,7 +645,7 @@ export interface ConfigurationStrict { punctuation?: string; }; /** - * MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md + * MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md036.md */ "no-emphasis-as-heading"?: | boolean @@ -656,31 +656,31 @@ export interface ConfigurationStrict { punctuation?: string; }; /** - * MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md + * MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md037.md */ MD037?: boolean; /** - * MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md + * MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md037.md */ "no-space-in-emphasis"?: boolean; /** - * MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md + * MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md038.md */ MD038?: boolean; /** - * MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md + * MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md038.md */ "no-space-in-code"?: boolean; /** - * MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md + * MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md039.md */ MD039?: boolean; /** - * MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md + * MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md039.md */ "no-space-in-links"?: boolean; /** - * MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md + * MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md040.md */ MD040?: | boolean @@ -695,7 +695,7 @@ export interface ConfigurationStrict { language_only?: boolean; }; /** - * MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md + * MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md040.md */ "fenced-code-language"?: | boolean @@ -710,7 +710,7 @@ export interface ConfigurationStrict { language_only?: boolean; }; /** - * MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md + * MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md041.md */ MD041?: | boolean @@ -725,7 +725,7 @@ export interface ConfigurationStrict { front_matter_title?: string; }; /** - * MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md + * MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md041.md */ "first-line-heading"?: | boolean @@ -740,7 +740,7 @@ export interface ConfigurationStrict { front_matter_title?: string; }; /** - * MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md + * MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md041.md */ "first-line-h1"?: | boolean @@ -755,15 +755,15 @@ export interface ConfigurationStrict { front_matter_title?: string; }; /** - * MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md + * MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md042.md */ MD042?: boolean; /** - * MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md + * MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md042.md */ "no-empty-links"?: boolean; /** - * MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md + * MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md043.md */ MD043?: | boolean @@ -778,7 +778,7 @@ export interface ConfigurationStrict { match_case?: boolean; }; /** - * MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md + * MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md043.md */ "required-headings"?: | boolean @@ -793,7 +793,7 @@ export interface ConfigurationStrict { match_case?: boolean; }; /** - * MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md + * MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md044.md */ MD044?: | boolean @@ -812,7 +812,7 @@ export interface ConfigurationStrict { html_elements?: boolean; }; /** - * MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md + * MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md044.md */ "proper-names"?: | boolean @@ -831,15 +831,15 @@ export interface ConfigurationStrict { html_elements?: boolean; }; /** - * MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md + * MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md045.md */ MD045?: boolean; /** - * MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md + * MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md045.md */ "no-alt-text"?: boolean; /** - * MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md + * MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md046.md */ MD046?: | boolean @@ -850,7 +850,7 @@ export interface ConfigurationStrict { style?: "consistent" | "fenced" | "indented"; }; /** - * MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md + * MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md046.md */ "code-block-style"?: | boolean @@ -861,15 +861,15 @@ export interface ConfigurationStrict { style?: "consistent" | "fenced" | "indented"; }; /** - * MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md + * MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md047.md */ MD047?: boolean; /** - * MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md + * MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md047.md */ "single-trailing-newline"?: boolean; /** - * MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md + * MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md048.md */ MD048?: | boolean @@ -880,7 +880,7 @@ export interface ConfigurationStrict { style?: "consistent" | "backtick" | "tilde"; }; /** - * MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md + * MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md048.md */ "code-fence-style"?: | boolean @@ -891,7 +891,7 @@ export interface ConfigurationStrict { style?: "consistent" | "backtick" | "tilde"; }; /** - * MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md + * MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md049.md */ MD049?: | boolean @@ -902,7 +902,7 @@ export interface ConfigurationStrict { style?: "consistent" | "asterisk" | "underscore"; }; /** - * MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md + * MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md049.md */ "emphasis-style"?: | boolean @@ -913,7 +913,7 @@ export interface ConfigurationStrict { style?: "consistent" | "asterisk" | "underscore"; }; /** - * MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md + * MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md050.md */ MD050?: | boolean @@ -924,7 +924,7 @@ export interface ConfigurationStrict { style?: "consistent" | "asterisk" | "underscore"; }; /** - * MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md + * MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md050.md */ "strong-style"?: | boolean @@ -935,7 +935,7 @@ export interface ConfigurationStrict { style?: "consistent" | "asterisk" | "underscore"; }; /** - * MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md + * MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md051.md */ MD051?: | boolean @@ -946,7 +946,7 @@ export interface ConfigurationStrict { ignore_case?: boolean; }; /** - * MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md + * MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md051.md */ "link-fragments"?: | boolean @@ -957,7 +957,7 @@ export interface ConfigurationStrict { ignore_case?: boolean; }; /** - * MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md + * MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md052.md */ MD052?: | boolean @@ -968,7 +968,7 @@ export interface ConfigurationStrict { shortcut_syntax?: boolean; }; /** - * MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md + * MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md052.md */ "reference-links-images"?: | boolean @@ -979,7 +979,7 @@ export interface ConfigurationStrict { shortcut_syntax?: boolean; }; /** - * MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md + * MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md053.md */ MD053?: | boolean @@ -990,7 +990,7 @@ export interface ConfigurationStrict { ignored_definitions?: string[]; }; /** - * MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md + * MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md053.md */ "link-image-reference-definitions"?: | boolean @@ -1001,7 +1001,7 @@ export interface ConfigurationStrict { ignored_definitions?: string[]; }; /** - * MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md + * MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md054.md */ MD054?: | boolean @@ -1032,7 +1032,7 @@ export interface ConfigurationStrict { url_inline?: boolean; }; /** - * MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md + * MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md054.md */ "link-image-style"?: | boolean @@ -1063,7 +1063,7 @@ export interface ConfigurationStrict { url_inline?: boolean; }; /** - * MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md + * MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md055.md */ MD055?: | boolean @@ -1074,7 +1074,7 @@ export interface ConfigurationStrict { style?: "consistent" | "leading_only" | "trailing_only" | "leading_and_trailing" | "no_leading_or_trailing"; }; /** - * MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md + * MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md055.md */ "table-pipe-style"?: | boolean @@ -1085,19 +1085,19 @@ export interface ConfigurationStrict { style?: "consistent" | "leading_only" | "trailing_only" | "leading_and_trailing" | "no_leading_or_trailing"; }; /** - * MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md + * MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md056.md */ MD056?: boolean; /** - * MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md + * MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md056.md */ "table-column-count"?: boolean; /** - * MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md + * MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md058.md */ MD058?: boolean; /** - * MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md + * MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md058.md */ "blanks-around-tables"?: boolean; /** diff --git a/lib/constants.mjs b/lib/constants.mjs index 3afa9b6b4..e60d6ec9d 100644 --- a/lib/constants.mjs +++ b/lib/constants.mjs @@ -10,4 +10,4 @@ export const fixableRuleNames = [ "MD058" ]; export const homepage = "https://github.com/DavidAnson/markdownlint"; -export const version = "0.37.0"; +export const version = "0.37.1"; diff --git a/package.json b/package.json index eea9df847..9a3281580 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "markdownlint", - "version": "0.37.0", + "version": "0.37.1", "description": "A Node.js style checker and lint tool for Markdown/CommonMark files.", "type": "module", "exports": { diff --git a/schema/.markdownlint.jsonc b/schema/.markdownlint.jsonc index 4584b2dd3..fcd48046e 100644 --- a/schema/.markdownlint.jsonc +++ b/schema/.markdownlint.jsonc @@ -7,25 +7,25 @@ // Path to configuration file to extend "extends": null, - // MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md + // MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md001.md "MD001": true, - // MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md + // MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md003.md "MD003": { // Heading style "style": "consistent" }, - // MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md + // MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md004.md "MD004": { // List style "style": "consistent" }, - // MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md + // MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md005.md "MD005": true, - // MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md + // MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md007.md "MD007": { // Spaces for indent "indent": 2, @@ -35,7 +35,7 @@ "start_indent": 2 }, - // MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md + // MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md009.md "MD009": { // Spaces for line break "br_spaces": 2, @@ -45,7 +45,7 @@ "strict": false }, - // MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md + // MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md010.md "MD010": { // Include code blocks "code_blocks": true, @@ -55,16 +55,16 @@ "spaces_per_tab": 1 }, - // MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md + // MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md011.md "MD011": true, - // MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md + // MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md012.md "MD012": { // Consecutive blank lines "maximum": 1 }, - // MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md + // MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md013.md "MD013": { // Number of characters "line_length": 80, @@ -84,22 +84,22 @@ "stern": false }, - // MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md + // MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md014.md "MD014": true, - // MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md + // MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md018.md "MD018": true, - // MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md + // MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md019.md "MD019": true, - // MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.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.37.1/doc/md020.md "MD020": true, - // MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.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.37.1/doc/md021.md "MD021": true, - // MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md + // MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md022.md "MD022": { // Blank lines above heading "lines_above": 1, @@ -107,16 +107,16 @@ "lines_below": 1 }, - // MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md + // MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md023.md "MD023": true, - // MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md + // MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md024.md "MD024": { // Only check sibling headings "siblings_only": false }, - // MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md + // MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md025.md "MD025": { // Heading level "level": 1, @@ -124,25 +124,25 @@ "front_matter_title": "^\\s*title\\s*[:=]" }, - // MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md + // MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md026.md "MD026": { // Punctuation characters "punctuation": ".,;:!。,;:!" }, - // MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md + // MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md027.md "MD027": true, - // MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md + // MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md028.md "MD028": true, - // MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md + // MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md029.md "MD029": { // List style "style": "one_or_ordered" }, - // MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md + // MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md030.md "MD030": { // Spaces for single-line unordered list items "ul_single": 1, @@ -154,46 +154,46 @@ "ol_multi": 1 }, - // MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md + // MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md031.md "MD031": { // Include list items "list_items": true }, - // MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md + // MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md032.md "MD032": true, - // MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md + // MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md033.md "MD033": { // Allowed elements "allowed_elements": [] }, - // MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md + // MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md034.md "MD034": true, - // MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md + // MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md035.md "MD035": { // Horizontal rule style "style": "consistent" }, - // MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md + // MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md036.md "MD036": { // Punctuation characters "punctuation": ".,;:!?。,;:!?" }, - // MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md + // MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md037.md "MD037": true, - // MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md + // MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md038.md "MD038": true, - // MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md + // MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md039.md "MD039": true, - // MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md + // MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md040.md "MD040": { // List of languages "allowed_languages": [], @@ -201,7 +201,7 @@ "language_only": false }, - // MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md + // MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md041.md "MD041": { // Heading level "level": 1, @@ -209,10 +209,10 @@ "front_matter_title": "^\\s*title\\s*[:=]" }, - // MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md + // MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md042.md "MD042": true, - // MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md + // MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md043.md "MD043": { // List of headings "headings": [], @@ -220,7 +220,7 @@ "match_case": false }, - // MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md + // MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md044.md "MD044": { // List of proper names "names": [], @@ -230,49 +230,49 @@ "html_elements": true }, - // MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md + // MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md045.md "MD045": true, - // MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md + // MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md046.md "MD046": { // Block style "style": "consistent" }, - // MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md + // MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md047.md "MD047": true, - // MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md + // MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md048.md "MD048": { // Code fence style "style": "consistent" }, - // MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md + // MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md049.md "MD049": { // Emphasis style "style": "consistent" }, - // MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md + // MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md050.md "MD050": { // Strong style "style": "consistent" }, - // MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md + // MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md051.md "MD051": { // Ignore case of fragments "ignore_case": false }, - // MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md + // MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md052.md "MD052": { // Include shortcut syntax "shortcut_syntax": false }, - // MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md + // MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md053.md "MD053": { // Ignored definitions "ignored_definitions": [ @@ -280,7 +280,7 @@ ] }, - // MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md + // MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md054.md "MD054": { // Allow autolinks "autolink": true, @@ -296,15 +296,15 @@ "url_inline": true }, - // MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md + // MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md055.md "MD055": { // Table pipe style "style": "consistent" }, - // MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md + // MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md056.md "MD056": true, - // MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md + // MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md058.md "MD058": true } \ No newline at end of file diff --git a/schema/.markdownlint.yaml b/schema/.markdownlint.yaml index cc4cfb8dc..bebb1255c 100644 --- a/schema/.markdownlint.yaml +++ b/schema/.markdownlint.yaml @@ -6,23 +6,23 @@ default: true # Path to configuration file to extend extends: null -# MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md +# MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md001.md MD001: true -# MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md +# MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md003.md MD003: # Heading style style: "consistent" -# MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md +# MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md004.md MD004: # List style style: "consistent" -# MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md +# MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md005.md MD005: true -# MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md +# MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md007.md MD007: # Spaces for indent indent: 2 @@ -31,7 +31,7 @@ MD007: # Spaces for first level indent (when start_indented is set) start_indent: 2 -# MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md +# MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md009.md MD009: # Spaces for line break br_spaces: 2 @@ -40,7 +40,7 @@ MD009: # Include unnecessary breaks strict: false -# MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md +# MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md010.md MD010: # Include code blocks code_blocks: true @@ -49,15 +49,15 @@ MD010: # Number of spaces for each hard tab spaces_per_tab: 1 -# MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md +# MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md011.md MD011: true -# MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md +# MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md012.md MD012: # Consecutive blank lines maximum: 1 -# MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md +# MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md013.md MD013: # Number of characters line_length: 80 @@ -76,60 +76,60 @@ MD013: # Stern length checking stern: false -# MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md +# MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md014.md MD014: true -# MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md +# MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md018.md MD018: true -# MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md +# MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md019.md MD019: true -# MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.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.37.1/doc/md020.md MD020: true -# MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.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.37.1/doc/md021.md MD021: true -# MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md +# MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md022.md MD022: # Blank lines above heading lines_above: 1 # Blank lines below heading lines_below: 1 -# MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md +# MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md023.md MD023: true -# MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md +# MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md024.md MD024: # Only check sibling headings siblings_only: false -# MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md +# MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md025.md MD025: # Heading level level: 1 # RegExp for matching title in front matter front_matter_title: "^\\s*title\\s*[:=]" -# MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md +# MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md026.md MD026: # Punctuation characters punctuation: ".,;:!。,;:!" -# MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md +# MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md027.md MD027: true -# MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md +# MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md028.md MD028: true -# MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md +# MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md029.md MD029: # List style style: "one_or_ordered" -# MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md +# MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md030.md MD030: # Spaces for single-line unordered list items ul_single: 1 @@ -140,66 +140,66 @@ MD030: # Spaces for multi-line ordered list items ol_multi: 1 -# MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md +# MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md031.md MD031: # Include list items list_items: true -# MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md +# MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md032.md MD032: true -# MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md +# MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md033.md MD033: # Allowed elements allowed_elements: [] -# MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md +# MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md034.md MD034: true -# MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md +# MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md035.md MD035: # Horizontal rule style style: "consistent" -# MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md +# MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md036.md MD036: # Punctuation characters punctuation: ".,;:!?。,;:!?" -# MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md +# MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md037.md MD037: true -# MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md +# MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md038.md MD038: true -# MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md +# MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md039.md MD039: true -# MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md +# MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md040.md MD040: # List of languages allowed_languages: [] # Require language only language_only: false -# MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md +# MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md041.md MD041: # Heading level level: 1 # RegExp for matching title in front matter front_matter_title: "^\\s*title\\s*[:=]" -# MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md +# MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md042.md MD042: true -# MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md +# MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md043.md MD043: # List of headings headings: [] # Match case of headings match_case: false -# MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md +# MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md044.md MD044: # List of proper names names: [] @@ -208,49 +208,49 @@ MD044: # Include HTML elements html_elements: true -# MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md +# MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md045.md MD045: true -# MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md +# MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md046.md MD046: # Block style style: "consistent" -# MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md +# MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md047.md MD047: true -# MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md +# MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md048.md MD048: # Code fence style style: "consistent" -# MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md +# MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md049.md MD049: # Emphasis style style: "consistent" -# MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md +# MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md050.md MD050: # Strong style style: "consistent" -# MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md +# MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md051.md MD051: # Ignore case of fragments ignore_case: false -# MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md +# MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md052.md MD052: # Include shortcut syntax shortcut_syntax: false -# MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md +# MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md053.md MD053: # Ignored definitions ignored_definitions: - "//" -# MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md +# MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md054.md MD054: # Allow autolinks autolink: true @@ -265,13 +265,13 @@ MD054: # Allow URLs as inline links url_inline: true -# MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md +# MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md055.md MD055: # Table pipe style style: "consistent" -# MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md +# MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md056.md MD056: true -# MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md +# MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md058.md MD058: true diff --git a/schema/markdownlint-config-schema-strict.json b/schema/markdownlint-config-schema-strict.json index 5fdecd321..128bf5930 100644 --- a/schema/markdownlint-config-schema-strict.json +++ b/schema/markdownlint-config-schema-strict.json @@ -1,13 +1,13 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.37.0/schema/markdownlint-config-schema-strict.json", + "$id": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.37.1/schema/markdownlint-config-schema-strict.json", "title": "markdownlint configuration schema", "type": "object", "properties": { "$schema": { "description": "JSON Schema URI (expected by some editors)", "type": "string", - "default": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.37.0/schema/markdownlint-config-schema.json" + "default": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.37.1/schema/markdownlint-config-schema.json" }, "default": { "description": "Default state for all rules", @@ -23,17 +23,17 @@ "default": null }, "MD001": { - "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md", + "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md001.md", "type": "boolean", "default": true }, "heading-increment": { - "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md", + "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md001.md", "type": "boolean", "default": true }, "MD003": { - "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md", + "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md003.md", "type": [ "boolean", "object" @@ -57,7 +57,7 @@ "additionalProperties": false }, "heading-style": { - "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md", + "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md003.md", "type": [ "boolean", "object" @@ -81,7 +81,7 @@ "additionalProperties": false }, "MD004": { - "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md", + "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md004.md", "type": [ "boolean", "object" @@ -104,7 +104,7 @@ "additionalProperties": false }, "ul-style": { - "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md", + "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md004.md", "type": [ "boolean", "object" @@ -127,17 +127,17 @@ "additionalProperties": false }, "MD005": { - "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md", + "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md005.md", "type": "boolean", "default": true }, "list-indent": { - "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md", + "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md005.md", "type": "boolean", "default": true }, "MD007": { - "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md", + "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md007.md", "type": [ "boolean", "object" @@ -165,7 +165,7 @@ "additionalProperties": false }, "ul-indent": { - "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md", + "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md007.md", "type": [ "boolean", "object" @@ -193,7 +193,7 @@ "additionalProperties": false }, "MD009": { - "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md", + "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md009.md", "type": [ "boolean", "object" @@ -220,7 +220,7 @@ "additionalProperties": false }, "no-trailing-spaces": { - "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md", + "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md009.md", "type": [ "boolean", "object" @@ -247,7 +247,7 @@ "additionalProperties": false }, "MD010": { - "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md", + "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md010.md", "type": [ "boolean", "object" @@ -277,7 +277,7 @@ "additionalProperties": false }, "no-hard-tabs": { - "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md", + "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md010.md", "type": [ "boolean", "object" @@ -307,17 +307,17 @@ "additionalProperties": false }, "MD011": { - "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md", + "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md011.md", "type": "boolean", "default": true }, "no-reversed-links": { - "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md", + "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md011.md", "type": "boolean", "default": true }, "MD012": { - "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md", + "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md012.md", "type": [ "boolean", "object" @@ -334,7 +334,7 @@ "additionalProperties": false }, "no-multiple-blanks": { - "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md", + "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md012.md", "type": [ "boolean", "object" @@ -351,7 +351,7 @@ "additionalProperties": false }, "MD013": { - "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md", + "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md013.md", "type": [ "boolean", "object" @@ -405,7 +405,7 @@ "additionalProperties": false }, "line-length": { - "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md", + "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md013.md", "type": [ "boolean", "object" @@ -459,57 +459,57 @@ "additionalProperties": false }, "MD014": { - "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md", + "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md014.md", "type": "boolean", "default": true }, "commands-show-output": { - "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md", + "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md014.md", "type": "boolean", "default": true }, "MD018": { - "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md", + "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md018.md", "type": "boolean", "default": true }, "no-missing-space-atx": { - "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md", + "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md018.md", "type": "boolean", "default": true }, "MD019": { - "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md", + "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md019.md", "type": "boolean", "default": true }, "no-multiple-space-atx": { - "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md", + "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md019.md", "type": "boolean", "default": true }, "MD020": { - "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md020.md", + "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md020.md", "type": "boolean", "default": true }, "no-missing-space-closed-atx": { - "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md020.md", + "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md020.md", "type": "boolean", "default": true }, "MD021": { - "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md021.md", + "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md021.md", "type": "boolean", "default": true }, "no-multiple-space-closed-atx": { - "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md021.md", + "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md021.md", "type": "boolean", "default": true }, "MD022": { - "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md", + "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md022.md", "type": [ "boolean", "object" @@ -544,7 +544,7 @@ "additionalProperties": false }, "blanks-around-headings": { - "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md", + "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md022.md", "type": [ "boolean", "object" @@ -579,17 +579,17 @@ "additionalProperties": false }, "MD023": { - "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md", + "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md023.md", "type": "boolean", "default": true }, "heading-start-left": { - "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md", + "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md023.md", "type": "boolean", "default": true }, "MD024": { - "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md", + "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md024.md", "type": [ "boolean", "object" @@ -605,7 +605,7 @@ "additionalProperties": false }, "no-duplicate-heading": { - "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md", + "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md024.md", "type": [ "boolean", "object" @@ -621,7 +621,7 @@ "additionalProperties": false }, "MD025": { - "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md", + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md025.md", "type": [ "boolean", "object" @@ -644,7 +644,7 @@ "additionalProperties": false }, "single-title": { - "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md", + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md025.md", "type": [ "boolean", "object" @@ -667,7 +667,7 @@ "additionalProperties": false }, "single-h1": { - "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md", + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md025.md", "type": [ "boolean", "object" @@ -690,7 +690,7 @@ "additionalProperties": false }, "MD026": { - "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md", + "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md026.md", "type": [ "boolean", "object" @@ -706,7 +706,7 @@ "additionalProperties": false }, "no-trailing-punctuation": { - "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md", + "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md026.md", "type": [ "boolean", "object" @@ -722,27 +722,27 @@ "additionalProperties": false }, "MD027": { - "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md", + "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md027.md", "type": "boolean", "default": true }, "no-multiple-space-blockquote": { - "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md", + "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md027.md", "type": "boolean", "default": true }, "MD028": { - "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md", + "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md028.md", "type": "boolean", "default": true }, "no-blanks-blockquote": { - "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md", + "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md028.md", "type": "boolean", "default": true }, "MD029": { - "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md", + "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md029.md", "type": [ "boolean", "object" @@ -764,7 +764,7 @@ "additionalProperties": false }, "ol-prefix": { - "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md", + "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md029.md", "type": [ "boolean", "object" @@ -786,7 +786,7 @@ "additionalProperties": false }, "MD030": { - "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md", + "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md030.md", "type": [ "boolean", "object" @@ -821,7 +821,7 @@ "additionalProperties": false }, "list-marker-space": { - "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md", + "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md030.md", "type": [ "boolean", "object" @@ -856,7 +856,7 @@ "additionalProperties": false }, "MD031": { - "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md", + "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md031.md", "type": [ "boolean", "object" @@ -872,7 +872,7 @@ "additionalProperties": false }, "blanks-around-fences": { - "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md", + "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md031.md", "type": [ "boolean", "object" @@ -888,17 +888,17 @@ "additionalProperties": false }, "MD032": { - "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md", + "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md032.md", "type": "boolean", "default": true }, "blanks-around-lists": { - "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md", + "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md032.md", "type": "boolean", "default": true }, "MD033": { - "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md", + "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md033.md", "type": [ "boolean", "object" @@ -917,7 +917,7 @@ "additionalProperties": false }, "no-inline-html": { - "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md", + "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md033.md", "type": [ "boolean", "object" @@ -936,17 +936,17 @@ "additionalProperties": false }, "MD034": { - "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md", + "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md034.md", "type": "boolean", "default": true }, "no-bare-urls": { - "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md", + "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md034.md", "type": "boolean", "default": true }, "MD035": { - "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md", + "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md035.md", "type": [ "boolean", "object" @@ -962,7 +962,7 @@ "additionalProperties": false }, "hr-style": { - "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md", + "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md035.md", "type": [ "boolean", "object" @@ -978,7 +978,7 @@ "additionalProperties": false }, "MD036": { - "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md", + "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md036.md", "type": [ "boolean", "object" @@ -994,7 +994,7 @@ "additionalProperties": false }, "no-emphasis-as-heading": { - "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md", + "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md036.md", "type": [ "boolean", "object" @@ -1010,37 +1010,37 @@ "additionalProperties": false }, "MD037": { - "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md", + "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md037.md", "type": "boolean", "default": true }, "no-space-in-emphasis": { - "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md", + "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md037.md", "type": "boolean", "default": true }, "MD038": { - "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md", + "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md038.md", "type": "boolean", "default": true }, "no-space-in-code": { - "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md", + "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md038.md", "type": "boolean", "default": true }, "MD039": { - "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md", + "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md039.md", "type": "boolean", "default": true }, "no-space-in-links": { - "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md", + "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md039.md", "type": "boolean", "default": true }, "MD040": { - "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md", + "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md040.md", "type": [ "boolean", "object" @@ -1064,7 +1064,7 @@ "additionalProperties": false }, "fenced-code-language": { - "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md", + "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md040.md", "type": [ "boolean", "object" @@ -1088,7 +1088,7 @@ "additionalProperties": false }, "MD041": { - "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md", + "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md041.md", "type": [ "boolean", "object" @@ -1111,7 +1111,7 @@ "additionalProperties": false }, "first-line-heading": { - "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md", + "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md041.md", "type": [ "boolean", "object" @@ -1134,7 +1134,7 @@ "additionalProperties": false }, "first-line-h1": { - "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md", + "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md041.md", "type": [ "boolean", "object" @@ -1157,17 +1157,17 @@ "additionalProperties": false }, "MD042": { - "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md", + "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md042.md", "type": "boolean", "default": true }, "no-empty-links": { - "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md", + "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md042.md", "type": "boolean", "default": true }, "MD043": { - "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md", + "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md043.md", "type": [ "boolean", "object" @@ -1192,7 +1192,7 @@ "additionalProperties": false }, "required-headings": { - "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md", + "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md043.md", "type": [ "boolean", "object" @@ -1217,7 +1217,7 @@ "additionalProperties": false }, "MD044": { - "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md", + "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md044.md", "type": [ "boolean", "object" @@ -1246,7 +1246,7 @@ "additionalProperties": false }, "proper-names": { - "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md", + "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md044.md", "type": [ "boolean", "object" @@ -1275,17 +1275,17 @@ "additionalProperties": false }, "MD045": { - "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md", + "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md045.md", "type": "boolean", "default": true }, "no-alt-text": { - "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md", + "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md045.md", "type": "boolean", "default": true }, "MD046": { - "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md", + "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md046.md", "type": [ "boolean", "object" @@ -1306,7 +1306,7 @@ "additionalProperties": false }, "code-block-style": { - "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md", + "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md046.md", "type": [ "boolean", "object" @@ -1327,17 +1327,17 @@ "additionalProperties": false }, "MD047": { - "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md", + "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md047.md", "type": "boolean", "default": true }, "single-trailing-newline": { - "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md", + "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md047.md", "type": "boolean", "default": true }, "MD048": { - "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md", + "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md048.md", "type": [ "boolean", "object" @@ -1358,7 +1358,7 @@ "additionalProperties": false }, "code-fence-style": { - "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md", + "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md048.md", "type": [ "boolean", "object" @@ -1379,7 +1379,7 @@ "additionalProperties": false }, "MD049": { - "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md", + "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md049.md", "type": [ "boolean", "object" @@ -1400,7 +1400,7 @@ "additionalProperties": false }, "emphasis-style": { - "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md", + "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md049.md", "type": [ "boolean", "object" @@ -1421,7 +1421,7 @@ "additionalProperties": false }, "MD050": { - "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md", + "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md050.md", "type": [ "boolean", "object" @@ -1442,7 +1442,7 @@ "additionalProperties": false }, "strong-style": { - "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md", + "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md050.md", "type": [ "boolean", "object" @@ -1463,7 +1463,7 @@ "additionalProperties": false }, "MD051": { - "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md", + "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md051.md", "type": [ "boolean", "object" @@ -1479,7 +1479,7 @@ "additionalProperties": false }, "link-fragments": { - "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md", + "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md051.md", "type": [ "boolean", "object" @@ -1495,7 +1495,7 @@ "additionalProperties": false }, "MD052": { - "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md", + "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md052.md", "type": [ "boolean", "object" @@ -1511,7 +1511,7 @@ "additionalProperties": false }, "reference-links-images": { - "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md", + "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md052.md", "type": [ "boolean", "object" @@ -1527,7 +1527,7 @@ "additionalProperties": false }, "MD053": { - "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md", + "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md053.md", "type": [ "boolean", "object" @@ -1548,7 +1548,7 @@ "additionalProperties": false }, "link-image-reference-definitions": { - "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md", + "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md053.md", "type": [ "boolean", "object" @@ -1569,7 +1569,7 @@ "additionalProperties": false }, "MD054": { - "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md", + "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md054.md", "type": [ "boolean", "object" @@ -1610,7 +1610,7 @@ "additionalProperties": false }, "link-image-style": { - "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md", + "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md054.md", "type": [ "boolean", "object" @@ -1651,7 +1651,7 @@ "additionalProperties": false }, "MD055": { - "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md", + "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md055.md", "type": [ "boolean", "object" @@ -1674,7 +1674,7 @@ "additionalProperties": false }, "table-pipe-style": { - "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md", + "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md055.md", "type": [ "boolean", "object" @@ -1697,22 +1697,22 @@ "additionalProperties": false }, "MD056": { - "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md", + "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md056.md", "type": "boolean", "default": true }, "table-column-count": { - "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md", + "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md056.md", "type": "boolean", "default": true }, "MD058": { - "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md", + "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md058.md", "type": "boolean", "default": true }, "blanks-around-tables": { - "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md", + "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md058.md", "type": "boolean", "default": true }, diff --git a/schema/markdownlint-config-schema.json b/schema/markdownlint-config-schema.json index cf7dea4f5..01d494ddf 100644 --- a/schema/markdownlint-config-schema.json +++ b/schema/markdownlint-config-schema.json @@ -1,13 +1,13 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.37.0/schema/markdownlint-config-schema.json", + "$id": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.37.1/schema/markdownlint-config-schema.json", "title": "markdownlint configuration schema", "type": "object", "properties": { "$schema": { "description": "JSON Schema URI (expected by some editors)", "type": "string", - "default": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.37.0/schema/markdownlint-config-schema.json" + "default": "https://raw.githubusercontent.com/DavidAnson/markdownlint/v0.37.1/schema/markdownlint-config-schema.json" }, "default": { "description": "Default state for all rules", @@ -23,17 +23,17 @@ "default": null }, "MD001": { - "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md", + "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md001.md", "type": "boolean", "default": true }, "heading-increment": { - "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md001.md", + "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md001.md", "type": "boolean", "default": true }, "MD003": { - "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md", + "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md003.md", "type": [ "boolean", "object" @@ -57,7 +57,7 @@ "additionalProperties": false }, "heading-style": { - "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md003.md", + "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md003.md", "type": [ "boolean", "object" @@ -81,7 +81,7 @@ "additionalProperties": false }, "MD004": { - "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md", + "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md004.md", "type": [ "boolean", "object" @@ -104,7 +104,7 @@ "additionalProperties": false }, "ul-style": { - "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md004.md", + "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md004.md", "type": [ "boolean", "object" @@ -127,17 +127,17 @@ "additionalProperties": false }, "MD005": { - "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md", + "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md005.md", "type": "boolean", "default": true }, "list-indent": { - "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md005.md", + "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md005.md", "type": "boolean", "default": true }, "MD007": { - "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md", + "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md007.md", "type": [ "boolean", "object" @@ -165,7 +165,7 @@ "additionalProperties": false }, "ul-indent": { - "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md007.md", + "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md007.md", "type": [ "boolean", "object" @@ -193,7 +193,7 @@ "additionalProperties": false }, "MD009": { - "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md", + "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md009.md", "type": [ "boolean", "object" @@ -220,7 +220,7 @@ "additionalProperties": false }, "no-trailing-spaces": { - "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md009.md", + "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md009.md", "type": [ "boolean", "object" @@ -247,7 +247,7 @@ "additionalProperties": false }, "MD010": { - "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md", + "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md010.md", "type": [ "boolean", "object" @@ -277,7 +277,7 @@ "additionalProperties": false }, "no-hard-tabs": { - "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md010.md", + "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md010.md", "type": [ "boolean", "object" @@ -307,17 +307,17 @@ "additionalProperties": false }, "MD011": { - "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md", + "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md011.md", "type": "boolean", "default": true }, "no-reversed-links": { - "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md011.md", + "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md011.md", "type": "boolean", "default": true }, "MD012": { - "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md", + "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md012.md", "type": [ "boolean", "object" @@ -334,7 +334,7 @@ "additionalProperties": false }, "no-multiple-blanks": { - "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md012.md", + "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md012.md", "type": [ "boolean", "object" @@ -351,7 +351,7 @@ "additionalProperties": false }, "MD013": { - "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md", + "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md013.md", "type": [ "boolean", "object" @@ -405,7 +405,7 @@ "additionalProperties": false }, "line-length": { - "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md013.md", + "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md013.md", "type": [ "boolean", "object" @@ -459,57 +459,57 @@ "additionalProperties": false }, "MD014": { - "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md", + "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md014.md", "type": "boolean", "default": true }, "commands-show-output": { - "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md014.md", + "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md014.md", "type": "boolean", "default": true }, "MD018": { - "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md", + "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md018.md", "type": "boolean", "default": true }, "no-missing-space-atx": { - "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md018.md", + "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md018.md", "type": "boolean", "default": true }, "MD019": { - "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md", + "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md019.md", "type": "boolean", "default": true }, "no-multiple-space-atx": { - "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md019.md", + "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md019.md", "type": "boolean", "default": true }, "MD020": { - "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md020.md", + "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md020.md", "type": "boolean", "default": true }, "no-missing-space-closed-atx": { - "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md020.md", + "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md020.md", "type": "boolean", "default": true }, "MD021": { - "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md021.md", + "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md021.md", "type": "boolean", "default": true }, "no-multiple-space-closed-atx": { - "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md021.md", + "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md021.md", "type": "boolean", "default": true }, "MD022": { - "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md", + "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md022.md", "type": [ "boolean", "object" @@ -544,7 +544,7 @@ "additionalProperties": false }, "blanks-around-headings": { - "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md022.md", + "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md022.md", "type": [ "boolean", "object" @@ -579,17 +579,17 @@ "additionalProperties": false }, "MD023": { - "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md", + "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md023.md", "type": "boolean", "default": true }, "heading-start-left": { - "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md023.md", + "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md023.md", "type": "boolean", "default": true }, "MD024": { - "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md", + "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md024.md", "type": [ "boolean", "object" @@ -605,7 +605,7 @@ "additionalProperties": false }, "no-duplicate-heading": { - "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md024.md", + "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md024.md", "type": [ "boolean", "object" @@ -621,7 +621,7 @@ "additionalProperties": false }, "MD025": { - "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md", + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md025.md", "type": [ "boolean", "object" @@ -644,7 +644,7 @@ "additionalProperties": false }, "single-title": { - "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md", + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md025.md", "type": [ "boolean", "object" @@ -667,7 +667,7 @@ "additionalProperties": false }, "single-h1": { - "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md025.md", + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md025.md", "type": [ "boolean", "object" @@ -690,7 +690,7 @@ "additionalProperties": false }, "MD026": { - "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md", + "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md026.md", "type": [ "boolean", "object" @@ -706,7 +706,7 @@ "additionalProperties": false }, "no-trailing-punctuation": { - "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md026.md", + "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md026.md", "type": [ "boolean", "object" @@ -722,27 +722,27 @@ "additionalProperties": false }, "MD027": { - "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md", + "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md027.md", "type": "boolean", "default": true }, "no-multiple-space-blockquote": { - "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md027.md", + "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md027.md", "type": "boolean", "default": true }, "MD028": { - "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md", + "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md028.md", "type": "boolean", "default": true }, "no-blanks-blockquote": { - "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md028.md", + "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md028.md", "type": "boolean", "default": true }, "MD029": { - "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md", + "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md029.md", "type": [ "boolean", "object" @@ -764,7 +764,7 @@ "additionalProperties": false }, "ol-prefix": { - "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md029.md", + "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md029.md", "type": [ "boolean", "object" @@ -786,7 +786,7 @@ "additionalProperties": false }, "MD030": { - "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md", + "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md030.md", "type": [ "boolean", "object" @@ -821,7 +821,7 @@ "additionalProperties": false }, "list-marker-space": { - "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md030.md", + "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md030.md", "type": [ "boolean", "object" @@ -856,7 +856,7 @@ "additionalProperties": false }, "MD031": { - "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md", + "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md031.md", "type": [ "boolean", "object" @@ -872,7 +872,7 @@ "additionalProperties": false }, "blanks-around-fences": { - "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md031.md", + "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md031.md", "type": [ "boolean", "object" @@ -888,17 +888,17 @@ "additionalProperties": false }, "MD032": { - "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md", + "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md032.md", "type": "boolean", "default": true }, "blanks-around-lists": { - "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md032.md", + "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md032.md", "type": "boolean", "default": true }, "MD033": { - "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md", + "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md033.md", "type": [ "boolean", "object" @@ -917,7 +917,7 @@ "additionalProperties": false }, "no-inline-html": { - "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md033.md", + "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md033.md", "type": [ "boolean", "object" @@ -936,17 +936,17 @@ "additionalProperties": false }, "MD034": { - "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md", + "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md034.md", "type": "boolean", "default": true }, "no-bare-urls": { - "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md034.md", + "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md034.md", "type": "boolean", "default": true }, "MD035": { - "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md", + "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md035.md", "type": [ "boolean", "object" @@ -962,7 +962,7 @@ "additionalProperties": false }, "hr-style": { - "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md035.md", + "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md035.md", "type": [ "boolean", "object" @@ -978,7 +978,7 @@ "additionalProperties": false }, "MD036": { - "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md", + "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md036.md", "type": [ "boolean", "object" @@ -994,7 +994,7 @@ "additionalProperties": false }, "no-emphasis-as-heading": { - "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md036.md", + "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md036.md", "type": [ "boolean", "object" @@ -1010,37 +1010,37 @@ "additionalProperties": false }, "MD037": { - "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md", + "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md037.md", "type": "boolean", "default": true }, "no-space-in-emphasis": { - "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md037.md", + "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md037.md", "type": "boolean", "default": true }, "MD038": { - "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md", + "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md038.md", "type": "boolean", "default": true }, "no-space-in-code": { - "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md038.md", + "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md038.md", "type": "boolean", "default": true }, "MD039": { - "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md", + "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md039.md", "type": "boolean", "default": true }, "no-space-in-links": { - "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md039.md", + "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md039.md", "type": "boolean", "default": true }, "MD040": { - "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md", + "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md040.md", "type": [ "boolean", "object" @@ -1064,7 +1064,7 @@ "additionalProperties": false }, "fenced-code-language": { - "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md040.md", + "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md040.md", "type": [ "boolean", "object" @@ -1088,7 +1088,7 @@ "additionalProperties": false }, "MD041": { - "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md", + "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md041.md", "type": [ "boolean", "object" @@ -1111,7 +1111,7 @@ "additionalProperties": false }, "first-line-heading": { - "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md", + "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md041.md", "type": [ "boolean", "object" @@ -1134,7 +1134,7 @@ "additionalProperties": false }, "first-line-h1": { - "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md041.md", + "description": "MD041/first-line-heading/first-line-h1 : First line in a file should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md041.md", "type": [ "boolean", "object" @@ -1157,17 +1157,17 @@ "additionalProperties": false }, "MD042": { - "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md", + "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md042.md", "type": "boolean", "default": true }, "no-empty-links": { - "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md042.md", + "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md042.md", "type": "boolean", "default": true }, "MD043": { - "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md", + "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md043.md", "type": [ "boolean", "object" @@ -1192,7 +1192,7 @@ "additionalProperties": false }, "required-headings": { - "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md043.md", + "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md043.md", "type": [ "boolean", "object" @@ -1217,7 +1217,7 @@ "additionalProperties": false }, "MD044": { - "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md", + "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md044.md", "type": [ "boolean", "object" @@ -1246,7 +1246,7 @@ "additionalProperties": false }, "proper-names": { - "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md044.md", + "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md044.md", "type": [ "boolean", "object" @@ -1275,17 +1275,17 @@ "additionalProperties": false }, "MD045": { - "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md", + "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md045.md", "type": "boolean", "default": true }, "no-alt-text": { - "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md045.md", + "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md045.md", "type": "boolean", "default": true }, "MD046": { - "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md", + "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md046.md", "type": [ "boolean", "object" @@ -1306,7 +1306,7 @@ "additionalProperties": false }, "code-block-style": { - "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md046.md", + "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md046.md", "type": [ "boolean", "object" @@ -1327,17 +1327,17 @@ "additionalProperties": false }, "MD047": { - "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md", + "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md047.md", "type": "boolean", "default": true }, "single-trailing-newline": { - "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md047.md", + "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md047.md", "type": "boolean", "default": true }, "MD048": { - "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md", + "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md048.md", "type": [ "boolean", "object" @@ -1358,7 +1358,7 @@ "additionalProperties": false }, "code-fence-style": { - "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md048.md", + "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md048.md", "type": [ "boolean", "object" @@ -1379,7 +1379,7 @@ "additionalProperties": false }, "MD049": { - "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md", + "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md049.md", "type": [ "boolean", "object" @@ -1400,7 +1400,7 @@ "additionalProperties": false }, "emphasis-style": { - "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md049.md", + "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md049.md", "type": [ "boolean", "object" @@ -1421,7 +1421,7 @@ "additionalProperties": false }, "MD050": { - "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md", + "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md050.md", "type": [ "boolean", "object" @@ -1442,7 +1442,7 @@ "additionalProperties": false }, "strong-style": { - "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md050.md", + "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md050.md", "type": [ "boolean", "object" @@ -1463,7 +1463,7 @@ "additionalProperties": false }, "MD051": { - "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md", + "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md051.md", "type": [ "boolean", "object" @@ -1479,7 +1479,7 @@ "additionalProperties": false }, "link-fragments": { - "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md051.md", + "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md051.md", "type": [ "boolean", "object" @@ -1495,7 +1495,7 @@ "additionalProperties": false }, "MD052": { - "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md", + "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md052.md", "type": [ "boolean", "object" @@ -1511,7 +1511,7 @@ "additionalProperties": false }, "reference-links-images": { - "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md052.md", + "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md052.md", "type": [ "boolean", "object" @@ -1527,7 +1527,7 @@ "additionalProperties": false }, "MD053": { - "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md", + "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md053.md", "type": [ "boolean", "object" @@ -1548,7 +1548,7 @@ "additionalProperties": false }, "link-image-reference-definitions": { - "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md053.md", + "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md053.md", "type": [ "boolean", "object" @@ -1569,7 +1569,7 @@ "additionalProperties": false }, "MD054": { - "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md", + "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md054.md", "type": [ "boolean", "object" @@ -1610,7 +1610,7 @@ "additionalProperties": false }, "link-image-style": { - "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md054.md", + "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md054.md", "type": [ "boolean", "object" @@ -1651,7 +1651,7 @@ "additionalProperties": false }, "MD055": { - "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md", + "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md055.md", "type": [ "boolean", "object" @@ -1674,7 +1674,7 @@ "additionalProperties": false }, "table-pipe-style": { - "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md055.md", + "description": "MD055/table-pipe-style : Table pipe style : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md055.md", "type": [ "boolean", "object" @@ -1697,22 +1697,22 @@ "additionalProperties": false }, "MD056": { - "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md", + "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md056.md", "type": "boolean", "default": true }, "table-column-count": { - "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md056.md", + "description": "MD056/table-column-count : Table column count : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md056.md", "type": "boolean", "default": true }, "MD058": { - "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md", + "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md058.md", "type": "boolean", "default": true }, "blanks-around-tables": { - "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.0/doc/md058.md", + "description": "MD058/blanks-around-tables : Tables should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.37.1/doc/md058.md", "type": "boolean", "default": true }, From e959c1e5226857bf5435f78c0ff2e99ae96d33a3 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sat, 14 Dec 2024 20:21:53 -0800 Subject: [PATCH 64/64] Correct spelling (case) of "webpack" in CHANGELOG.md. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9169f115..d03e6c635 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## 0.37.1 -- Add support for "browser" condition (as used by Webpack) +- Add support for "browser" condition (as used by webpack) ## 0.37.0