From 15d39ccc30f41e1202b85fdd4618afb8bb91b213 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sat, 16 Sep 2023 22:08:01 -0700 Subject: [PATCH 01/46] Fix inconsistent test behavior by preventing new tests validateMarkdownlintConfigSchema and validateMarkdownlintCli2ConfigSchema from scanning files under the node_modules directory (fixes #215). --- test/markdownlint-cli2-test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/markdownlint-cli2-test.js b/test/markdownlint-cli2-test.js index b5371ab1..de1c4780 100644 --- a/test/markdownlint-cli2-test.js +++ b/test/markdownlint-cli2-test.js @@ -57,13 +57,14 @@ test("README files", (t) => { }); test("validateMarkdownlintConfigSchema", async (t) => { - t.plan(25); + t.plan(23); const schema = require("../schema/markdownlint-config-schema.json"); const { "default": stripJsonComments } = await import("strip-json-comments"); const { globby } = await import("globby"); const files = await globby( [ "**/*.markdownlint.(json|jsonc)", + "!node_modules/**", "!**/*invalid*/**", "!**/invalid*" ], @@ -90,6 +91,7 @@ test("validateMarkdownlintCli2ConfigSchema", async (t) => { const files = await globby( [ "**/*.markdownlint-cli2.(json|jsonc)", + "!node_modules/**", "!**/*invalid*/**", "!**/invalid*", "!test/customRules/dir/subdir2/.markdownlint-cli2.jsonc" From b4178433bba4c7eb543b2204fa6bb13e3fa760c9 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sun, 17 Sep 2023 10:51:00 -0700 Subject: [PATCH 02/46] Prevent possible race condition in new tests validateMarkdownlintConfigSchema and validateMarkdownlintCli2ConfigSchema (refs #215). --- test/markdownlint-cli2-test.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/markdownlint-cli2-test.js b/test/markdownlint-cli2-test.js index de1c4780..6e2f824d 100644 --- a/test/markdownlint-cli2-test.js +++ b/test/markdownlint-cli2-test.js @@ -65,6 +65,7 @@ test("validateMarkdownlintConfigSchema", async (t) => { [ "**/*.markdownlint.(json|jsonc)", "!node_modules/**", + "!**/*-copy-*/**", "!**/*invalid*/**", "!**/invalid*" ], @@ -92,6 +93,7 @@ test("validateMarkdownlintCli2ConfigSchema", async (t) => { [ "**/*.markdownlint-cli2.(json|jsonc)", "!node_modules/**", + "!**/*-copy-*/**", "!**/*invalid*/**", "!**/invalid*", "!test/customRules/dir/subdir2/.markdownlint-cli2.jsonc" From 130692b2c588aa91e15f1fbf8af50e0dc08ecea8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 15:41:52 +0000 Subject: [PATCH 03/46] Bump eslint from 8.49.0 to 8.50.0 Bumps [eslint](https://github.com/eslint/eslint) from 8.49.0 to 8.50.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/v8.49.0...v8.50.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 1ac4bdf7..ac9127dc 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "cpy": "10.1.0", "cpy-cli": "5.0.0", "del": "7.1.0", - "eslint": "8.49.0", + "eslint": "8.50.0", "eslint-plugin-n": "16.1.0", "eslint-plugin-unicorn": "48.0.1", "execa": "8.0.1", From f8aa239277b3bb90be175189a3064254f6ef7fce Mon Sep 17 00:00:00 2001 From: David Anson Date: Tue, 26 Sep 2023 22:05:56 -0700 Subject: [PATCH 04/46] Convert JSON schema validation to use @hyperjump/json-schema, validate against specific schema version, newly validate schema definitions. --- package.json | 4 +- test/markdownlint-cli2-test.js | 67 +++++++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index ac9127dc..bc63db02 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "eslint-plugin-n": "16.1.0", "eslint-plugin-unicorn": "48.0.1", "execa": "8.0.1", + "@hyperjump/json-schema": "1.6.0", "markdown-it-emoji": "2.0.2", "markdown-it-for-inline": "0.1.1", "markdownlint-cli2-formatter-codequality": "0.0.4", @@ -95,8 +96,7 @@ "markdownlint-cli2-formatter-sarif": "0.0.1", "markdownlint-cli2-formatter-summarize": "0.0.6", "markdownlint-rule-titlecase": "0.1.0", - "npm-run-all": "4.1.5", - "tv4": "1.3.0" + "npm-run-all": "4.1.5" }, "keywords": [ "markdown", diff --git a/test/markdownlint-cli2-test.js b/test/markdownlint-cli2-test.js index 6e2f824d..9c81b0b8 100644 --- a/test/markdownlint-cli2-test.js +++ b/test/markdownlint-cli2-test.js @@ -5,10 +5,21 @@ const fs = require("node:fs/promises"); const path = require("node:path"); const test = require("ava").default; -const tv4 = require("tv4"); const { "main": markdownlintCli2 } = require("../markdownlint-cli2.js"); const FsMock = require("./fs-mock"); +const jsonSchemaVersion = "http://json-schema.org/draft-07/schema#"; +// eslint-disable-next-line max-len +const markdownlintConfigSchemaUri = "https://raw.githubusercontent.com/DavidAnson/markdownlint-cli2/main/schema/markdownlint-config-schema.json"; +const markdownlintConfigSchemaDefinition = + require("../schema/markdownlint-config-schema.json"); +// @ts-ignore +markdownlintConfigSchemaDefinition.$schema = jsonSchemaVersion; +// eslint-disable-next-line max-len +const markdownlintCli2ConfigSchemaUri = "https://raw.githubusercontent.com/DavidAnson/markdownlint-cli2/main/schema/markdownlint-cli2-config-schema.json"; +const markdownlintCli2ConfigSchemaDefinition = + require("../schema/markdownlint-cli2-config-schema.json"); + const outputFormatterLengthIs = (t, length) => (options) => { const { results } = options; t.is(Object.keys(results).length, length, JSON.stringify(results, null, 2)); @@ -57,8 +68,23 @@ test("README files", (t) => { }); test("validateMarkdownlintConfigSchema", async (t) => { - t.plan(23); - const schema = require("../schema/markdownlint-config-schema.json"); + t.plan(24); + + // Validate schema + const { addSchema, validate } = + // eslint-disable-next-line n/file-extension-in-import + await import("@hyperjump/json-schema/draft-07"); + const schemaResult = await validate( + jsonSchemaVersion, + markdownlintConfigSchemaDefinition, + "BASIC" + ); + t.true(schemaResult.valid); + + // Validate instances + // @ts-ignore + addSchema(markdownlintConfigSchemaDefinition, markdownlintConfigSchemaUri); + const validateConfigSchema = await validate(markdownlintConfigSchemaUri); const { "default": stripJsonComments } = await import("strip-json-comments"); const { globby } = await import("globby"); const files = await globby( @@ -76,17 +102,37 @@ test("validateMarkdownlintConfigSchema", async (t) => { return Promise.all(files.map(async (file) => { const content = await fs.readFile(file, "utf8"); const json = JSON.parse(stripJsonComments(content)); + const instanceResult = validateConfigSchema(json, "BASIC"); t.true( - // @ts-ignore - tv4.validate(json, schema), - `${file}\n${JSON.stringify(tv4.error, null, 2)}` + instanceResult.valid, + `${file}\n${JSON.stringify(instanceResult, null, 2)}` ); })); }); test("validateMarkdownlintCli2ConfigSchema", async (t) => { - t.plan(81); - const schema = require("../schema/markdownlint-cli2-config-schema.json"); + t.plan(82); + + // Validate schema + const { addSchema, validate } = + // eslint-disable-next-line n/file-extension-in-import + await import("@hyperjump/json-schema/draft-07"); + const schemaResult = await validate( + jsonSchemaVersion, + markdownlintCli2ConfigSchemaDefinition, + "BASIC" + ); + t.true(schemaResult.valid); + + // Validate instances + // @ts-ignore + addSchema(markdownlintConfigSchemaDefinition, markdownlintConfigSchemaUri); + addSchema( + // @ts-ignore + markdownlintCli2ConfigSchemaDefinition, + markdownlintCli2ConfigSchemaUri + ); + const validateConfigSchema = await validate(markdownlintCli2ConfigSchemaUri); const { "default": stripJsonComments } = await import("strip-json-comments"); const { globby } = await import("globby"); const files = await globby( @@ -105,9 +151,10 @@ test("validateMarkdownlintCli2ConfigSchema", async (t) => { return Promise.all(files.map(async (file) => { const content = await fs.readFile(file, "utf8"); const json = JSON.parse(stripJsonComments(content)); + const instanceResult = validateConfigSchema(json, "BASIC"); t.true( - tv4.validate(json, schema), - `${file}\n${JSON.stringify(tv4.error, null, 2)}` + instanceResult.valid, + `${file}\n${JSON.stringify(instanceResult, null, 2)}` ); })); }); From 59d869763e15b4fae15a167016b219a670c67414 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sun, 1 Oct 2023 22:46:14 -0700 Subject: [PATCH 05/46] Add test case for outputFormatters referencing packages from a local node_modules directory. --- .gitignore | 1 + test/markdownlint-cli2-test-cases.js | 7 +++++ test/markdownlint-cli2-test.js | 2 +- .../.markdownlint-cli2.jsonc | 6 ++++ .../package.json | 14 +++++++++ .../sample-formatter.cjs | 11 +++++++ .../package.json | 14 +++++++++ .../sample-formatter.mjs | 9 ++++++ test/outputFormatters-module/viewme.md | 14 +++++++++ .../markdownlint-cli2-test-exec.js.md | 28 ++++++++++++++++++ .../markdownlint-cli2-test-exec.js.snap | Bin 14039 -> 14109 bytes .../markdownlint-cli2-test-main.js.md | 28 ++++++++++++++++++ .../markdownlint-cli2-test-main.js.snap | Bin 12229 -> 12329 bytes 13 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 test/outputFormatters-module/.markdownlint-cli2.jsonc create mode 100644 test/outputFormatters-module/node_modules/output-formatter-sample-commonjs/package.json create mode 100644 test/outputFormatters-module/node_modules/output-formatter-sample-commonjs/sample-formatter.cjs create mode 100644 test/outputFormatters-module/node_modules/output-formatter-sample-module/package.json create mode 100644 test/outputFormatters-module/node_modules/output-formatter-sample-module/sample-formatter.mjs create mode 100644 test/outputFormatters-module/viewme.md diff --git a/.gitignore b/.gitignore index 3469a76f..40e89dca 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ coverage node_modules npm-debug.log !test/customRules/node_modules +!test/outputFormatters-module/node_modules webworker/markdownlint-cli2-webworker.js diff --git a/test/markdownlint-cli2-test-cases.js b/test/markdownlint-cli2-test-cases.js index 0be2ebd2..5f1a093b 100644 --- a/test/markdownlint-cli2-test-cases.js +++ b/test/markdownlint-cli2-test-cases.js @@ -962,6 +962,13 @@ const testCases = ({ "usesRequire": true }); + testCase({ + "name": "outputFormatters-module", + "args": [ "**/*.md" ], + "exitCode": 1, + "usesRequire": true + }); + testCase({ "name": "outputFormatters-missing", "args": [ ".*" ], diff --git a/test/markdownlint-cli2-test.js b/test/markdownlint-cli2-test.js index 9c81b0b8..934f9ebe 100644 --- a/test/markdownlint-cli2-test.js +++ b/test/markdownlint-cli2-test.js @@ -111,7 +111,7 @@ test("validateMarkdownlintConfigSchema", async (t) => { }); test("validateMarkdownlintCli2ConfigSchema", async (t) => { - t.plan(82); + t.plan(83); // Validate schema const { addSchema, validate } = diff --git a/test/outputFormatters-module/.markdownlint-cli2.jsonc b/test/outputFormatters-module/.markdownlint-cli2.jsonc new file mode 100644 index 00000000..f64f929a --- /dev/null +++ b/test/outputFormatters-module/.markdownlint-cli2.jsonc @@ -0,0 +1,6 @@ +{ + "outputFormatters": [ + [ "output-formatter-sample-commonjs" ], + [ "./node_modules/output-formatter-sample-module/sample-formatter.mjs" ] + ] +} diff --git a/test/outputFormatters-module/node_modules/output-formatter-sample-commonjs/package.json b/test/outputFormatters-module/node_modules/output-formatter-sample-commonjs/package.json new file mode 100644 index 00000000..07e21a2e --- /dev/null +++ b/test/outputFormatters-module/node_modules/output-formatter-sample-commonjs/package.json @@ -0,0 +1,14 @@ +{ + "name": "output-formatter-sample-commonjs", + "version": "0.0.1", + "description": "Package for markdownlint output formatter sample (commonjs)", + "main": "sample-formatter.cjs", + "type": "commonjs", + "author": "David Anson (https://dlaa.me/)", + "homepage": "https://github.com/DavidAnson/markdownlint", + "license": "MIT", + "keywords": [ + "markdownlint-cli2-formatter" + ], + "private": true +} diff --git a/test/outputFormatters-module/node_modules/output-formatter-sample-commonjs/sample-formatter.cjs b/test/outputFormatters-module/node_modules/output-formatter-sample-commonjs/sample-formatter.cjs new file mode 100644 index 00000000..52bceed5 --- /dev/null +++ b/test/outputFormatters-module/node_modules/output-formatter-sample-commonjs/sample-formatter.cjs @@ -0,0 +1,11 @@ +// @ts-check + +"use strict"; + +module.exports = (options, params) => { + const { logError, results } = options; + for (const result of results) { + const { fileName, lineNumber, ruleNames } = result; + logError(`cjs: ${fileName} ${lineNumber} ${ruleNames.join("/")}`); + } +}; diff --git a/test/outputFormatters-module/node_modules/output-formatter-sample-module/package.json b/test/outputFormatters-module/node_modules/output-formatter-sample-module/package.json new file mode 100644 index 00000000..7289f975 --- /dev/null +++ b/test/outputFormatters-module/node_modules/output-formatter-sample-module/package.json @@ -0,0 +1,14 @@ +{ + "name": "output-formatter-sample-module", + "version": "0.0.1", + "description": "Package for markdownlint output formatter sample (module)", + "main": "sample-formatter.mjs", + "type": "module", + "author": "David Anson (https://dlaa.me/)", + "homepage": "https://github.com/DavidAnson/markdownlint", + "license": "MIT", + "keywords": [ + "markdownlint-cli2-formatter" + ], + "private": true +} diff --git a/test/outputFormatters-module/node_modules/output-formatter-sample-module/sample-formatter.mjs b/test/outputFormatters-module/node_modules/output-formatter-sample-module/sample-formatter.mjs new file mode 100644 index 00000000..567f2a79 --- /dev/null +++ b/test/outputFormatters-module/node_modules/output-formatter-sample-module/sample-formatter.mjs @@ -0,0 +1,9 @@ +// @ts-check + +export default (options, params) => { + const { logError, results } = options; + for (const result of results) { + const { fileName, lineNumber, ruleNames } = result; + logError(`mjs: ${fileName} ${lineNumber} ${ruleNames.join("/")}`); + } +}; diff --git a/test/outputFormatters-module/viewme.md b/test/outputFormatters-module/viewme.md new file mode 100644 index 00000000..d60ebf5a --- /dev/null +++ b/test/outputFormatters-module/viewme.md @@ -0,0 +1,14 @@ +# Title + +> Tagline + + +# Description + +Text text text +Text text text +Text text text + +## Summary + +Text text text \ No newline at end of file diff --git a/test/snapshots/markdownlint-cli2-test-exec.js.md b/test/snapshots/markdownlint-cli2-test-exec.js.md index d1708093..288fc94d 100644 --- a/test/snapshots/markdownlint-cli2-test-exec.js.md +++ b/test/snapshots/markdownlint-cli2-test-exec.js.md @@ -6578,6 +6578,34 @@ Generated by [AVA](https://avajs.dev). `, } +## outputFormatters-module (exec) + +> Snapshot 1 + + { + exitCode: 1, + formatterCodeQuality: '', + formatterJson: '', + formatterJunit: '', + formatterSarif: '', + stderr: `cjs: viewme.md 3 MD009/no-trailing-spaces␊ + cjs: viewme.md 5 MD012/no-multiple-blanks␊ + cjs: viewme.md 6 MD025/single-title/single-h1␊ + cjs: viewme.md 12 MD019/no-multiple-space-atx␊ + cjs: viewme.md 14 MD047/single-trailing-newline␊ + mjs: viewme.md 3 MD009/no-trailing-spaces␊ + mjs: viewme.md 5 MD012/no-multiple-blanks␊ + mjs: viewme.md 6 MD025/single-title/single-h1␊ + mjs: viewme.md 12 MD019/no-multiple-space-atx␊ + mjs: viewme.md 14 MD047/single-trailing-newline␊ + `, + stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ + Finding: **/*.md␊ + Linting: 1 file(s)␊ + Summary: 5 error(s)␊ + `, + } + ## outputFormatters-missing (exec) > Snapshot 1 diff --git a/test/snapshots/markdownlint-cli2-test-exec.js.snap b/test/snapshots/markdownlint-cli2-test-exec.js.snap index 209b5415e9d2c9af7389ae0d78530cd9ac624a34..358d4c6d53118057a203423f7b74037ed525121b 100644 GIT binary patch literal 14109 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 diff --git a/test/snapshots/markdownlint-cli2-test-main.js.md b/test/snapshots/markdownlint-cli2-test-main.js.md index 56750e06..6e248b1f 100644 --- a/test/snapshots/markdownlint-cli2-test-main.js.md +++ b/test/snapshots/markdownlint-cli2-test-main.js.md @@ -4525,6 +4525,34 @@ Generated by [AVA](https://avajs.dev). `, } +## outputFormatters-module (main) + +> Snapshot 1 + + { + exitCode: 1, + formatterCodeQuality: '', + formatterJson: '', + formatterJunit: '', + formatterSarif: '', + stderr: `cjs: viewme.md 3 MD009/no-trailing-spaces␊ + cjs: viewme.md 5 MD012/no-multiple-blanks␊ + cjs: viewme.md 6 MD025/single-title/single-h1␊ + cjs: viewme.md 12 MD019/no-multiple-space-atx␊ + cjs: viewme.md 14 MD047/single-trailing-newline␊ + mjs: viewme.md 3 MD009/no-trailing-spaces␊ + mjs: viewme.md 5 MD012/no-multiple-blanks␊ + mjs: viewme.md 6 MD025/single-title/single-h1␊ + mjs: viewme.md 12 MD019/no-multiple-space-atx␊ + mjs: viewme.md 14 MD047/single-trailing-newline␊ + `, + stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ + Finding: **/*.md␊ + Linting: 1 file(s)␊ + Summary: 5 error(s)␊ + `, + } + ## outputFormatters-missing (main) > Snapshot 1 diff --git a/test/snapshots/markdownlint-cli2-test-main.js.snap b/test/snapshots/markdownlint-cli2-test-main.js.snap index 5d978a453ef112dd625b6a9d83a2915cb2ba8de3..83a626f62fb9373feed5c9458f63ec568946829b 100644 GIT binary patch literal 12329 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 Date: Mon, 2 Oct 2023 22:50:28 -0700 Subject: [PATCH 06/46] Add test case for markdownItPlugins referencing packages from a local node_modules directory. --- .gitignore | 1 + .../module/.markdownlint-cli2.jsonc | 5 +++++ test/markdownItPlugins/module/link.md | 3 +++ .../custom-markdown-it-plugin.cjs | 13 +++++++++++++ .../custom-markdown-it-plugin/package.json | 11 +++++++++++ test/markdownlint-cli2-test.js | 2 +- .../markdownlint-cli2-test-exec.js.md | 2 +- .../markdownlint-cli2-test-exec.js.snap | Bin 14109 -> 14109 bytes .../snapshots/markdownlint-cli2-test-fs.js.md | 5 +++-- .../markdownlint-cli2-test-fs.js.snap | Bin 5571 -> 5574 bytes .../markdownlint-cli2-test-main.js.md | 7 ++++--- .../markdownlint-cli2-test-main.js.snap | Bin 12329 -> 12331 bytes 12 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 test/markdownItPlugins/module/.markdownlint-cli2.jsonc create mode 100644 test/markdownItPlugins/module/link.md create mode 100644 test/markdownItPlugins/module/node_modules/custom-markdown-it-plugin/custom-markdown-it-plugin.cjs create mode 100644 test/markdownItPlugins/module/node_modules/custom-markdown-it-plugin/package.json diff --git a/.gitignore b/.gitignore index 40e89dca..8bbb9958 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,6 @@ coverage node_modules npm-debug.log !test/customRules/node_modules +!test/markdownItPlugins/module/node_modules !test/outputFormatters-module/node_modules webworker/markdownlint-cli2-webworker.js diff --git a/test/markdownItPlugins/module/.markdownlint-cli2.jsonc b/test/markdownItPlugins/module/.markdownlint-cli2.jsonc new file mode 100644 index 00000000..25dd953c --- /dev/null +++ b/test/markdownItPlugins/module/.markdownlint-cli2.jsonc @@ -0,0 +1,5 @@ +{ + "markdownItPlugins": [ + [ "custom-markdown-it-plugin" ] + ] +} diff --git a/test/markdownItPlugins/module/link.md b/test/markdownItPlugins/module/link.md new file mode 100644 index 00000000..88b7f3b6 --- /dev/null +++ b/test/markdownItPlugins/module/link.md @@ -0,0 +1,3 @@ +# Heading + +Text [ link ](https://example.com) diff --git a/test/markdownItPlugins/module/node_modules/custom-markdown-it-plugin/custom-markdown-it-plugin.cjs b/test/markdownItPlugins/module/node_modules/custom-markdown-it-plugin/custom-markdown-it-plugin.cjs new file mode 100644 index 00000000..ef60bf1f --- /dev/null +++ b/test/markdownItPlugins/module/node_modules/custom-markdown-it-plugin/custom-markdown-it-plugin.cjs @@ -0,0 +1,13 @@ +// @ts-check + +"use strict"; + +module.exports = (md) => { + md.core.ruler.push("custom-markdown-it-plugin", (state) => { + for (const token of state.tokens.filter(t => t.type === "inline")) { + for (const child of token.children.filter(c => c.type === "text")) { + child.content = child.content.trim(); + } + } + }); +}; diff --git a/test/markdownItPlugins/module/node_modules/custom-markdown-it-plugin/package.json b/test/markdownItPlugins/module/node_modules/custom-markdown-it-plugin/package.json new file mode 100644 index 00000000..765773ea --- /dev/null +++ b/test/markdownItPlugins/module/node_modules/custom-markdown-it-plugin/package.json @@ -0,0 +1,11 @@ +{ + "name": "custom-markdown-it-plugin", + "version": "0.0.1", + "description": "Package for custom markdown-it plugin (commonjs)", + "main": "custom-markdown-it-plugin.cjs", + "type": "commonjs", + "author": "David Anson (https://dlaa.me/)", + "homepage": "https://github.com/DavidAnson/markdownlint", + "license": "MIT", + "private": true +} diff --git a/test/markdownlint-cli2-test.js b/test/markdownlint-cli2-test.js index 934f9ebe..cfde663e 100644 --- a/test/markdownlint-cli2-test.js +++ b/test/markdownlint-cli2-test.js @@ -111,7 +111,7 @@ test("validateMarkdownlintConfigSchema", async (t) => { }); test("validateMarkdownlintCli2ConfigSchema", async (t) => { - t.plan(83); + t.plan(84); // Validate schema const { addSchema, validate } = diff --git a/test/snapshots/markdownlint-cli2-test-exec.js.md b/test/snapshots/markdownlint-cli2-test-exec.js.md index 288fc94d..bc75c062 100644 --- a/test/snapshots/markdownlint-cli2-test-exec.js.md +++ b/test/snapshots/markdownlint-cli2-test-exec.js.md @@ -3868,7 +3868,7 @@ Generated by [AVA](https://avajs.dev). `, stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ Finding: **/*.md␊ - Linting: 5 file(s)␊ + Linting: 6 file(s)␊ Summary: 4 error(s)␊ `, } diff --git a/test/snapshots/markdownlint-cli2-test-exec.js.snap b/test/snapshots/markdownlint-cli2-test-exec.js.snap index 358d4c6d53118057a203423f7b74037ed525121b..ca23f4865928e881e9d21d7ab6916bee531e899d 100644 GIT binary patch delta 75 zcmV-R0JQ&|Zk=v2K~_N^Q*L2!b7*gLAa*kf0|0v4EV@H}^wllT@NU!oV%8+<4bg`( hfz1Sa^AwSkpZu{h#T)@~v-lhx8VC^a|LvN<1OVfvB2WMT delta 75 zcmV-R0JQ&|Zk=v2K~_N^Q*L2!b7*gLAa*kf0|1qGOnf(wR>?X6h&ulY2<)Na4E5!o h`&QjCiv0>J%HOdv#T)^0v-lhx8VEF@lB=4)1OR}*ACmw8 diff --git a/test/snapshots/markdownlint-cli2-test-fs.js.md b/test/snapshots/markdownlint-cli2-test-fs.js.md index af3daf56..4f60bd3b 100644 --- a/test/snapshots/markdownlint-cli2-test-fs.js.md +++ b/test/snapshots/markdownlint-cli2-test-fs.js.md @@ -2026,6 +2026,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `file/link.md:3:6 MD039/no-space-in-links Spaces inside link text [Context: "[ link ]"]␊ function/link.md:3:6 MD039/no-space-in-links Spaces inside link text [Context: "[ link ]"]␊ + module/link.md:3:6 MD039/no-space-in-links Spaces inside link text [Context: "[ link ]"]␊ multiple/emoji.md:3:15 MD044/proper-names Proper names should have the correct capitalization [Expected: SMILE; Actual: smile]␊ multiple/emoji.md:5:13 MD044/proper-names Proper names should have the correct capitalization [Expected: FROWNING; Actual: frowning]␊ multiple/emoji.md:15 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ @@ -2034,8 +2035,8 @@ Generated by [AVA](https://avajs.dev). `, stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ Finding: **/*.md␊ - Linting: 5 file(s)␊ - Summary: 7 error(s)␊ + Linting: 6 file(s)␊ + Summary: 8 error(s)␊ `, } diff --git a/test/snapshots/markdownlint-cli2-test-fs.js.snap b/test/snapshots/markdownlint-cli2-test-fs.js.snap index 36ce68621cfaa10d7419e0780731159223d41cfc..54e48d94e9413ba0ef692a746fb2b4c6f2a1fedf 100644 GIT binary patch delta 3901 zcmY++cRUo1Y?Le9vD!&%v9 zpX@Wr@ALcp9^c3J`+YqBdHwT#cT4w5E9yJy3)($(3kdRh7AzQ|L`zOqs5D67kZCYp zUoZ~1_jaU3hc*Xh|0O?(SZ+}ioA|9cLs1H_odFT##V`y~FZU#7SkQ}@ydh&$eR7e` zyJGmNGn%ask&!D1n-8&2TjRS}p@NlZqDrdL80v+c_!{5yq*_hRoU}Z?VY@&?rT!6L zaA5Dx_!YjzMi(>~bmY3}x49!r`bw9;h{Xn6vhiNgVC~A9o9O~BAA4_}jg9@86mbYK zFI&3OJ)H{*DtoeSJ{VMXyHn?|P)7Dg*08p#W);zQ*vifZHl6r=>=M0Q=$Ges`#JAK zvD%+@=}lD7qHDfZ@Lqj)c*ny$lOC%Mg_eF5@HV4gbZ*!`GD!<=u_)s@p)h4v-GvG^! ztKkT{*ZdUknMd@E|f*8jc|gAaf9w21Xx&kwDm341O zoXe6ii;w@}3X+`?ir-AI2xSxkwg+k^ru zy);3xnHq5iKMd2Y0DB`PKs&b6x17p%AZH#Na2%=kR##RgEHj3?@F@$0TvowFhMw6-V&r`xA)Z$-X0v`R8X06hV%z?`ow3B zsw$YrNHEknLY@tJ7sL1!>rIK2Y0U<*CKfv_28y{rWgI}^5Gx|ziYu`150h@U~9Q~%Z{xN4?{X;l5&P9zuEIF;Ula6kUD5Ln(E0Kj>k(TRxo?)|xO=)j^aEyAN=b7N2$>g5gN&o6 zOm?Vi00e4++V4Es`uF_VMQ?jyz=U9ZTCb^Y3~eO)+m)HPYvHw}n@Cm-IRNzl)Zq6(!$&mB}Ho(D7FnDbk#3HVEoYp~Btnd{%U@rkM3p2{1<` zrjP0L%20^m{c@vYS9P#(DS)umYvNxrW9Qhv)x4kWB70Fg{&#TY8!`=aMA2)*1$N_& z3uOO~*oOtOZ^m30Bs0cJzA2N>?z%_&=syE-YL*+H^k0+zKfz_JR1~;5YGVmlt1^N8 z<#Imtb|98bJqmzzg69qwsz24_4bMk?uJqtn@M!`5rFLvLdskwiMgIqnj^HG^bKX=` ze^5U)2)lnXAQ7r}TmPkHa={IXemVLt_h~`_uH&#+lx}l**@{otT1Cqr+?__T*PPZ< zU(TgIoG4d>P*J1ZiAIu#0yeqgcgw?FJkMWm!Oj~~*&{R(UoiwgZuzWlhc+X>G%n{@ zh!d+N*6#Kn-X7Kqb3i&5Io%m}99eHoYzwTl`2^FaJ9U}=dCt5(&HSRO=n>mNWzy;n zGW_rLuA0%y;dteo?=im_xW-y@M#KHr$)4^Q(3*4)C#1KlZ?)Ic?6V7fvT1&ue}Dca zRZ?IgNAYw8Cb%D8D~<4MiMK_cwOA4BI*R;Jb3Q{%LZQm&vS0^}uW1n$!hR)ph04^3?{IhLZ!>vnp*MWS{aSWMZgoSFgS> z)_y_hI^5H-gf61;fv<1&u6+eu-<$mX)+&tSPw#-9NMyf7Dj1k8Sh;mKxNjF)0~D1o ze{@Kz6z_`@)-lA<2Smv?R!8sG+6Bbw+rtN(LR7@I$V1xx>Sw0+ey=n|=iCrApsn8u z6IpaFAc7fz6_2axw!K}pvH@@`%Ce)&A2`BwY5XK zIKrB1)@bd|S`psXpa`s(bf>AvUQI&V#q+-AQ2 zJ@PEm9w&b8h3Qs(eevL)vBlRZ`MP*cCTz;}$uKT$_up`0l;$gN*zLGf63k%3pd`l{ zXS!+277M25R|xG{WSJIK^E<#|J&|seW*Cl!l@dw>GmW; zOIJgOfG37fu{MSYr(iXE;HjDi=!TUn_w~YLg8cO%doh%)Fv=0ek9xp^>X1>kF!R#X z@G_V5^5OO}VI3VOsk)>#iCEw=7=ucUcq{i!h+ZOwA7koE0wQi;8{aFmS6i+ySV{zY zSzefnT+$LATIR_*tVr4HdFg~JZQ@Uu3M7y4CsPHzMA04VE~046yxAGehNoCo%VX+HzS%%(X`rFQocZl^*7ueHwljJTacNkJt8Lz7RfIL7c*4%mR!c2QzDb-3-Qz=uaE;AsKV-@ixp#K5fe6<1y zTiye$r5FC-L>ab=M8t#!cUsmgM)d(Sq?=q(qjH@mf!HX(4reFx%@rZu6FR{x57}%w zB2Of<8HlUjP4q6=sf7k&7A83-&B-=`W-I=O^*oIRWCc}AcT#Oca`X26!Ia~gFftnu zyhNhpy%oQ*9*{3-b@Z)_MpwO14JN=l?!F6mUiFPF7V>!%G83wC)QV^9P`YI~aHmi< zB&}QfMEzl!A(1LYo_4^Hy=RlAi9hv~E?dk|Uwi$dg`6(UL^Gz0h<^zJx381*(&n_Z zh>4&LIw zTGbo2)0Cu7#>qi@T_C*|vv*%)7OY=Md&7^TYQq=v%ItJ8@{!i8JA6x=ZpWl4*Fq=L zExN{nn_uK2T4Xk@b?DAaKJ#A7siUT4&6t*_X*Ty4w$P3}g}?O7jVkz_qj+qTEN;@* zBgKsCdpERip?w3EN0(&`9||mme{N3aa*b0RMA7ZAw|L}5^R;ScPo-n#QR21tS08McIuH+iWwS3j)6j@=C^P09 zBI!L=bo08VH)$@{M+FZx2Cw*VqhtF$+3KJnnK+m49%e{E25o>762fpBXyX@uW`nF{ zFao?lo-jxN1dsxZe1Hg~4x=|f3;CW=2FMZ4wIqkcGpYiPkW5TGv|?+eSJEdByE-V5 zN=({Rg`Bi0c$f|{gsBq%LaH&R01I%t9ruv^%%1?Q$d@dRc;$b1%MIw9|h zBjlMug82dqa+XDseNc*0QHj<=cTM{B3^Sx&&YI~e8p*{f20$Wju}aWqvoFCS-C0Le zx~}|?L9A+k~Fk0h09J#}00lTtBWmF``4V&sV>Ot?2r|gFQA_}b>lX?8C zIuZI&yiSc74pfTVc=wC)hJS0kCB&$+B)oi?R`Rg(iLcK{MCsWEwrFdt%y~ia;)8<% z8JFLI>V?5qxprSDh)gPpug?4Di*In5V->2*E6-lzl_m^yZ+Kn}jQ2d%qtf0_hbgE4 z;T^}re_kxK98Ru-L0-z;{J`u$Y?;ws zHf+Lx7yK=deW&D`E^2%M9NSDsxXH~84on!-wu8gP*30tD`p?X2IrGlK#Bx{-pPT$c zS9s(dKhHbR`s*pR7ZJlhL8ZK~Qr>?-XVzbJsjoMM?5L`mYX6%!h(DQ#Q>hH{UurIW zeP~mADwk;vplC-3UmGDCWqkRBV-CEbxUuwW6N?KM3uY@i{9gh2*s@_I(V$?#e-w#m vjPlQVUaynt*b|(IBV5T;(*1F)g>1lB2}!F4)A(<@R{-mSySD7Z0J8r9iS>k+ delta 3898 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 diff --git a/test/snapshots/markdownlint-cli2-test-main.js.md b/test/snapshots/markdownlint-cli2-test-main.js.md index 6e248b1f..0b103a89 100644 --- a/test/snapshots/markdownlint-cli2-test-main.js.md +++ b/test/snapshots/markdownlint-cli2-test-main.js.md @@ -2714,7 +2714,7 @@ Generated by [AVA](https://avajs.dev). `, stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ Finding: **/*.md␊ - Linting: 5 file(s)␊ + Linting: 6 file(s)␊ Summary: 4 error(s)␊ `, } @@ -5006,6 +5006,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `file/link.md:3:6 MD039/no-space-in-links Spaces inside link text [Context: "[ link ]"]␊ function/link.md:3:6 MD039/no-space-in-links Spaces inside link text [Context: "[ link ]"]␊ + module/link.md:3:6 MD039/no-space-in-links Spaces inside link text [Context: "[ link ]"]␊ multiple/emoji.md:3:15 MD044/proper-names Proper names should have the correct capitalization [Expected: SMILE; Actual: smile]␊ multiple/emoji.md:5:13 MD044/proper-names Proper names should have the correct capitalization [Expected: FROWNING; Actual: frowning]␊ multiple/emoji.md:15 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ @@ -5014,8 +5015,8 @@ Generated by [AVA](https://avajs.dev). `, stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ Finding: **/*.md␊ - Linting: 5 file(s)␊ - Summary: 7 error(s)␊ + Linting: 6 file(s)␊ + Summary: 8 error(s)␊ `, } diff --git a/test/snapshots/markdownlint-cli2-test-main.js.snap b/test/snapshots/markdownlint-cli2-test-main.js.snap index 83a626f62fb9373feed5c9458f63ec568946829b..60adceb8892b4797df486cc6e178da2811bcb20c 100644 GIT binary patch delta 8484 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 delta 8482 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 Date: Tue, 3 Oct 2023 15:28:34 +0000 Subject: [PATCH 07/46] Bump @hyperjump/json-schema from 1.6.0 to 1.6.1 Bumps [@hyperjump/json-schema](https://github.com/hyperjump-io/json-schema) from 1.6.0 to 1.6.1. - [Commits](https://github.com/hyperjump-io/json-schema/compare/v1.6.0...v1.6.1) --- updated-dependencies: - dependency-name: "@hyperjump/json-schema" 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 bc63db02..68778079 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "eslint-plugin-n": "16.1.0", "eslint-plugin-unicorn": "48.0.1", "execa": "8.0.1", - "@hyperjump/json-schema": "1.6.0", + "@hyperjump/json-schema": "1.6.1", "markdown-it-emoji": "2.0.2", "markdown-it-for-inline": "0.1.1", "markdownlint-cli2-formatter-codequality": "0.0.4", From e736a1a04fd654f346c789024a8cfeec8b1fdf6f Mon Sep 17 00:00:00 2001 From: David Anson Date: Tue, 3 Oct 2023 22:36:25 -0700 Subject: [PATCH 08/46] Add "modulePaths" configuration file option to provide additional paths for resolving module references (e.g., node_modules locations). --- README.md | 2 + markdownlint-cli2.js | 657 ++++++++++-------- resolve-and-require.js | 6 +- schema/markdownlint-cli2-config-schema.json | 10 + test/markdownlint-cli2-test-cases.js | 14 + test/markdownlint-cli2-test.js | 2 +- .../dir/.markdownlint-cli2.jsonc | 14 + test/modulePaths-non-root/dir/about.md | 6 + test/modulePaths-non-root/dir/hr.md | 3 + test/modulePaths-non-root/dir/link.md | 3 + test/modulePaths-non-root/dir/subdir/info.md | 3 + test/modulePaths-non-root/viewme.md | 14 + test/modulePaths/.markdownlint-cli2.jsonc | 18 + test/modulePaths/dir/about.md | 6 + test/modulePaths/dir/hr.md | 3 + test/modulePaths/dir/link.md | 3 + test/modulePaths/dir/subdir/info.md | 3 + test/modulePaths/viewme.md | 14 + test/resolve-and-require-test.js | 38 +- .../markdownlint-cli2-test-exec.js.md | 64 ++ .../markdownlint-cli2-test-exec.js.snap | Bin 14109 -> 14297 bytes .../markdownlint-cli2-test-main.js.md | 64 ++ .../markdownlint-cli2-test-main.js.snap | Bin 12331 -> 12520 bytes 23 files changed, 634 insertions(+), 313 deletions(-) create mode 100644 test/modulePaths-non-root/dir/.markdownlint-cli2.jsonc create mode 100644 test/modulePaths-non-root/dir/about.md create mode 100644 test/modulePaths-non-root/dir/hr.md create mode 100644 test/modulePaths-non-root/dir/link.md create mode 100644 test/modulePaths-non-root/dir/subdir/info.md create mode 100644 test/modulePaths-non-root/viewme.md create mode 100644 test/modulePaths/.markdownlint-cli2.jsonc create mode 100644 test/modulePaths/dir/about.md create mode 100644 test/modulePaths/dir/hr.md create mode 100644 test/modulePaths/dir/link.md create mode 100644 test/modulePaths/dir/subdir/info.md create mode 100644 test/modulePaths/viewme.md diff --git a/README.md b/README.md index 56988974..b10d4c8f 100644 --- a/README.md +++ b/README.md @@ -305,6 +305,8 @@ of the rules within. - Relative paths are resolved based on the location of the `JSONC` file - For example: `[ [ "plugin-name", param_0, param_1, ... ], ... ]` - Search [`markdown-it-plugins` on npm][markdown-it-plugins] + - `modulePaths`: `Array` of `String`s providing additional paths to use when + resolving module references (e.g., alternate locations for `node_modules`) - `noInlineConfig`: `Boolean` value to disable the support of [HTML comments][html-comment] within Markdown content - For example: `` diff --git a/markdownlint-cli2.js b/markdownlint-cli2.js index eaa10927..e4328a23 100755 --- a/markdownlint-cli2.js +++ b/markdownlint-cli2.js @@ -52,6 +52,11 @@ const negateGlob = (glob) => `!${glob}`; // Return a posix path (even on Windows) const posixPath = (p) => p.split(pathDefault.sep).join(pathPosix.sep); +// Resolves module paths relative to the specified directory +const resolveModulePaths = (dir, modulePaths) => ( + modulePaths.map((path) => pathDefault.resolve(dir, path)) +); + // Read a JSON(C) or YAML file and return the object const readConfig = (fs, dir, name, otherwise) => { const file = pathPosix.join(dir, name); @@ -69,19 +74,19 @@ const readConfig = (fs, dir, name, otherwise) => { }; // Import or resolve/require a module ID with a custom directory in the path -const importOrRequireResolve = async (dir, id) => { +const importOrRequireResolve = async (dirs, id) => { if (typeof id === "string") { const expandId = markdownlintRuleHelpers.expandTildePath(id, require("node:os")); const errors = []; try { - return resolveAndRequire(dynamicRequire, expandId, dir); + return resolveAndRequire(dynamicRequire, expandId, dirs); } catch (error) { errors.push(error); } try { const fileUrlString = - pathToFileURL(pathDefault.resolve(dir, expandId)).toString(); + pathToFileURL(pathDefault.resolve(dirs[0], expandId)).toString(); // eslint-disable-next-line no-inline-comments const module = await import(/* webpackIgnore: true */ fileUrlString); return module.default; @@ -98,17 +103,19 @@ const importOrRequireResolve = async (dir, id) => { }; // Import or require an array of modules by ID -const importOrRequireIds = (dir, ids, noRequire) => ( - Promise.all(noRequire ? [] : ids.map((id) => importOrRequireResolve(dir, id))) +const importOrRequireIds = (dirs, ids, noRequire) => ( + Promise.all( + noRequire ? [] : ids.map((id) => importOrRequireResolve(dirs, id)) + ) ); // Import or require an array of modules by ID (preserving parameters) -const importOrRequireIdsAndParams = async (dir, idsAndParams, noRequire) => { +const importOrRequireIdsAndParams = async (dirs, idsAndParams, noRequire) => { if (noRequire) { return []; } const ids = idsAndParams.map((entry) => entry[0]); - const modules = await importOrRequireIds(dir, ids); + const modules = await importOrRequireIds(dirs, ids, noRequire); const modulesAndParams = idsAndParams. map((entry, i) => [ modules[i], ...entry.slice(1) ]); return modulesAndParams; @@ -119,7 +126,7 @@ const importOrRequireConfig = (fs, dir, name, noRequire, otherwise) => { const id = pathPosix.join(dir, name); return () => fs.promises.access(id). then( - () => (noRequire ? {} : importOrRequireResolve(dir, id)), + () => (noRequire ? {} : importOrRequireResolve([ dir ], id)), otherwise ); }; @@ -272,129 +279,136 @@ $ markdownlint-cli2 "**/*.md" "#node_modules"` }; // Get (creating if necessary) and process a directory's info object -const getAndProcessDirInfo = - (fs, tasks, dirToDirInfo, dir, relativeDir, noRequire, allowPackageJson) => { - let dirInfo = dirToDirInfo[dir]; - if (!dirInfo) { - dirInfo = { - dir, - relativeDir, - "parent": null, - "files": [], - "markdownlintConfig": null, - "markdownlintOptions": null - }; - dirToDirInfo[dir] = dirInfo; - - // Load markdownlint-cli2 object(s) - const markdownlintCli2Jsonc = - pathPosix.join(dir, ".markdownlint-cli2.jsonc"); - const markdownlintCli2Yaml = - pathPosix.join(dir, ".markdownlint-cli2.yaml"); - const packageJson = pathPosix.join(dir, "package.json"); - tasks.push( - fs.promises.access(markdownlintCli2Jsonc). - then( - () => fs.promises. - readFile(markdownlintCli2Jsonc, utf8). - then( - (content) => getJsoncParse(). - then((jsoncParse) => jsoncParse(content)) - ), - () => fs.promises.access(markdownlintCli2Yaml). - then( - () => fs.promises. - readFile(markdownlintCli2Yaml, utf8). - then(yamlParse), +const getAndProcessDirInfo = ( + fs, + tasks, + dirToDirInfo, + dir, + relativeDir, + noRequire, + allowPackageJson +) => { + let dirInfo = dirToDirInfo[dir]; + if (!dirInfo) { + dirInfo = { + dir, + relativeDir, + "parent": null, + "files": [], + "markdownlintConfig": null, + "markdownlintOptions": null + }; + dirToDirInfo[dir] = dirInfo; + + // Load markdownlint-cli2 object(s) + const markdownlintCli2Jsonc = + pathPosix.join(dir, ".markdownlint-cli2.jsonc"); + const markdownlintCli2Yaml = + pathPosix.join(dir, ".markdownlint-cli2.yaml"); + const packageJson = pathPosix.join(dir, "package.json"); + tasks.push( + fs.promises.access(markdownlintCli2Jsonc). + then( + () => fs.promises. + readFile(markdownlintCli2Jsonc, utf8). + then( + (content) => getJsoncParse(). + then((jsoncParse) => jsoncParse(content)) + ), + () => fs.promises.access(markdownlintCli2Yaml). + then( + () => fs.promises. + readFile(markdownlintCli2Yaml, utf8). + then(yamlParse), + importOrRequireConfig( + fs, + dir, + ".markdownlint-cli2.cjs", + noRequire, importOrRequireConfig( fs, dir, - ".markdownlint-cli2.cjs", + ".markdownlint-cli2.mjs", noRequire, - importOrRequireConfig( - fs, - dir, - ".markdownlint-cli2.mjs", - noRequire, - () => (allowPackageJson - ? fs.promises.access(packageJson) - // eslint-disable-next-line prefer-promise-reject-errors - : Promise.reject() - ). - then( - () => fs.promises. - readFile(packageJson, utf8). - then( - (content) => getJsoncParse(). - then((jsoncParse) => jsoncParse(content)). - then((obj) => obj[packageName]) - ), - noop - ) - ) + () => (allowPackageJson + ? fs.promises.access(packageJson) + // eslint-disable-next-line prefer-promise-reject-errors + : Promise.reject() + ). + then( + () => fs.promises. + readFile(packageJson, utf8). + then( + (content) => getJsoncParse(). + then((jsoncParse) => jsoncParse(content)). + then((obj) => obj[packageName]) + ), + noop + ) ) ) - ). - then((options) => { - dirInfo.markdownlintOptions = options; - return options && - options.config && - getExtendedConfig( - options.config, - // Just needs to identify a file in the right directory - markdownlintCli2Jsonc, - fs - ). - then((config) => { - options.config = config; - }); - }) - ); + ) + ). + then((options) => { + dirInfo.markdownlintOptions = options; + return options && + options.config && + getExtendedConfig( + options.config, + // Just needs to identify a file in the right directory + markdownlintCli2Jsonc, + fs + ). + then((config) => { + options.config = config; + }); + }) + ); - // Load markdownlint object(s) - const readConfigs = + // Load markdownlint object(s) + const readConfigs = + readConfig( + fs, + dir, + ".markdownlint.jsonc", readConfig( fs, dir, - ".markdownlint.jsonc", + ".markdownlint.json", readConfig( fs, dir, - ".markdownlint.json", + ".markdownlint.yaml", readConfig( fs, dir, - ".markdownlint.yaml", - readConfig( + ".markdownlint.yml", + importOrRequireConfig( fs, dir, - ".markdownlint.yml", + ".markdownlint.cjs", + noRequire, importOrRequireConfig( fs, dir, - ".markdownlint.cjs", + ".markdownlint.mjs", noRequire, - importOrRequireConfig( - fs, - dir, - ".markdownlint.mjs", - noRequire, - noop - ) + noop ) ) ) ) - ); - tasks.push( - readConfigs(). - then((config) => { - dirInfo.markdownlintConfig = config; - }) + ) ); - } - return dirInfo; - }; + tasks.push( + readConfigs(). + then((config) => { + dirInfo.markdownlintConfig = config; + }) + ); + } + return dirInfo; +}; // Get base markdownlint-cli2 options object const getBaseOptions = async ( @@ -448,86 +462,97 @@ const getBaseOptions = async ( }; // Enumerate files from globs and build directory infos -const enumerateFiles = - // eslint-disable-next-line max-len - async (fs, baseDirSystem, baseDir, globPatterns, dirToDirInfo, noErrors, noRequire) => { - const tasks = []; - const globbyOptions = { - "absolute": true, - "cwd": baseDir, - "dot": true, - "expandDirectories": false, - fs - }; - if (noErrors) { - globbyOptions.suppressErrors = true; - } - // Special-case literal files - const literalFiles = []; - const filteredGlobPatterns = globPatterns.filter( - (globPattern) => { - if (globPattern.startsWith(":")) { - literalFiles.push( - posixPath(pathDefault.resolve(baseDirSystem, globPattern.slice(1))) - ); - return false; - } - return true; +const enumerateFiles = async ( + fs, + baseDirSystem, + baseDir, + globPatterns, + dirToDirInfo, + noErrors, + noRequire +) => { + const tasks = []; + const globbyOptions = { + "absolute": true, + "cwd": baseDir, + "dot": true, + "expandDirectories": false, + fs + }; + if (noErrors) { + globbyOptions.suppressErrors = true; + } + // Special-case literal files + const literalFiles = []; + const filteredGlobPatterns = globPatterns.filter( + (globPattern) => { + if (globPattern.startsWith(":")) { + literalFiles.push( + posixPath(pathDefault.resolve(baseDirSystem, globPattern.slice(1))) + ); + return false; } - ).map((globPattern) => globPattern.replace(/^\\:/u, ":")); - const baseMarkdownlintOptions = dirToDirInfo[baseDir].markdownlintOptions; - const globsForIgnore = - (baseMarkdownlintOptions.globs || []). - filter((glob) => glob.startsWith("!")); - const filteredLiteralFiles = - ((literalFiles.length > 0) && (globsForIgnore.length > 0)) - ? removeIgnoredFiles(baseDir, literalFiles, globsForIgnore) - : literalFiles; - // Manually expand directories to avoid globby call to dir-glob.sync - const expandedDirectories = await Promise.all( - filteredGlobPatterns.map((globPattern) => { - const barePattern = - globPattern.startsWith("!") - ? globPattern.slice(1) - : globPattern; - const globPath = ( - pathPosix.isAbsolute(barePattern) || - pathDefault.isAbsolute(barePattern) - ) - ? barePattern - : pathPosix.join(baseDir, barePattern); - return fs.promises.stat(globPath). - then((stats) => (stats.isDirectory() - ? pathPosix.join(globPattern, "**") - : globPattern)). - catch(() => globPattern); - }) - ); - // Process glob patterns - // eslint-disable-next-line no-inline-comments - const { globby } = await import(/* webpackMode: "eager" */ "globby"); - const files = [ - ...await globby(expandedDirectories, globbyOptions), - ...filteredLiteralFiles - ]; - for (const file of files) { - const dir = pathPosix.dirname(file); - const dirInfo = getAndProcessDirInfo( - fs, - tasks, - dirToDirInfo, - dir, - null, - noRequire, - false - ); - dirInfo.files.push(file); + return true; } - await Promise.all(tasks); - }; + ).map((globPattern) => globPattern.replace(/^\\:/u, ":")); + const baseMarkdownlintOptions = dirToDirInfo[baseDir].markdownlintOptions; + const globsForIgnore = + (baseMarkdownlintOptions.globs || []). + filter((glob) => glob.startsWith("!")); + const filteredLiteralFiles = + ((literalFiles.length > 0) && (globsForIgnore.length > 0)) + ? removeIgnoredFiles(baseDir, literalFiles, globsForIgnore) + : literalFiles; + // Manually expand directories to avoid globby call to dir-glob.sync + const expandedDirectories = await Promise.all( + filteredGlobPatterns.map((globPattern) => { + const barePattern = + globPattern.startsWith("!") + ? globPattern.slice(1) + : globPattern; + const globPath = ( + pathPosix.isAbsolute(barePattern) || + pathDefault.isAbsolute(barePattern) + ) + ? barePattern + : pathPosix.join(baseDir, barePattern); + return fs.promises.stat(globPath). + then((stats) => (stats.isDirectory() + ? pathPosix.join(globPattern, "**") + : globPattern)). + catch(() => globPattern); + }) + ); + // Process glob patterns + // eslint-disable-next-line no-inline-comments + const { globby } = await import(/* webpackMode: "eager" */ "globby"); + const files = [ + ...await globby(expandedDirectories, globbyOptions), + ...filteredLiteralFiles + ]; + for (const file of files) { + const dir = pathPosix.dirname(file); + const dirInfo = getAndProcessDirInfo( + fs, + tasks, + dirToDirInfo, + dir, + null, + noRequire, + false + ); + dirInfo.files.push(file); + } + await Promise.all(tasks); +}; // Enumerate (possibly missing) parent directories and update directory infos -const enumerateParents = async (fs, baseDir, dirToDirInfo, noRequire) => { +const enumerateParents = async ( + fs, + baseDir, + dirToDirInfo, + noRequire +) => { const tasks = []; // Create a lookup of baseDir and parents @@ -571,136 +596,148 @@ const enumerateParents = async (fs, baseDir, dirToDirInfo, noRequire) => { }; // Create directory info objects by enumerating file globs -const createDirInfos = - // eslint-disable-next-line max-len - async (fs, baseDirSystem, baseDir, globPatterns, dirToDirInfo, optionsOverride, noErrors, noRequire) => { - await enumerateFiles( - fs, - baseDirSystem, - baseDir, - globPatterns, - dirToDirInfo, - noErrors, - noRequire - ); - await enumerateParents( - fs, - baseDir, - dirToDirInfo, - noRequire - ); +const createDirInfos = async ( + fs, + baseDirSystem, + baseDir, + globPatterns, + dirToDirInfo, + optionsOverride, + noErrors, + noRequire +) => { + await enumerateFiles( + fs, + baseDirSystem, + baseDir, + globPatterns, + dirToDirInfo, + noErrors, + noRequire + ); + await enumerateParents( + fs, + baseDir, + dirToDirInfo, + noRequire + ); - // Merge file lists with identical configuration - const dirs = Object.keys(dirToDirInfo); - dirs.sort((a, b) => b.length - a.length); - const dirInfos = []; - const noConfigDirInfo = - // eslint-disable-next-line unicorn/consistent-function-scoping - (dirInfo) => ( - dirInfo.parent && - !dirInfo.markdownlintConfig && - !dirInfo.markdownlintOptions + // Merge file lists with identical configuration + const dirs = Object.keys(dirToDirInfo); + dirs.sort((a, b) => b.length - a.length); + const dirInfos = []; + const noConfigDirInfo = + // eslint-disable-next-line unicorn/consistent-function-scoping + (dirInfo) => ( + dirInfo.parent && + !dirInfo.markdownlintConfig && + !dirInfo.markdownlintOptions + ); + const tasks = []; + for (const dir of dirs) { + const dirInfo = dirToDirInfo[dir]; + if (noConfigDirInfo(dirInfo)) { + if (dirInfo.parent) { + appendToArray(dirInfo.parent.files, dirInfo.files); + } + dirToDirInfo[dir] = null; + } else { + const { markdownlintOptions, relativeDir } = dirInfo; + const effectiveDir = relativeDir || dir; + const effectiveModulePaths = resolveModulePaths( + effectiveDir, + (markdownlintOptions && markdownlintOptions.modulePaths) || [] ); - const tasks = []; - for (const dir of dirs) { - const dirInfo = dirToDirInfo[dir]; - if (noConfigDirInfo(dirInfo)) { - if (dirInfo.parent) { - appendToArray(dirInfo.parent.files, dirInfo.files); - } - dirToDirInfo[dir] = null; - } else { - const { markdownlintOptions, relativeDir } = dirInfo; - if (markdownlintOptions && markdownlintOptions.customRules) { - tasks.push( - importOrRequireIds( - relativeDir || dir, - markdownlintOptions.customRules, - noRequire - ).then((customRules) => { - // Expand nested arrays (for packages that export multiple rules) - markdownlintOptions.customRules = customRules.flat(); - }) - ); - } - if (markdownlintOptions && markdownlintOptions.markdownItPlugins) { - tasks.push( - importOrRequireIdsAndParams( - relativeDir || dir, - markdownlintOptions.markdownItPlugins, - noRequire - ).then((markdownItPlugins) => { - markdownlintOptions.markdownItPlugins = markdownItPlugins; - }) - ); - } - dirInfos.push(dirInfo); + if (markdownlintOptions && markdownlintOptions.customRules) { + tasks.push( + importOrRequireIds( + [ effectiveDir, ...effectiveModulePaths ], + markdownlintOptions.customRules, + noRequire + ).then((customRules) => { + // Expand nested arrays (for packages that export multiple rules) + markdownlintOptions.customRules = customRules.flat(); + }) + ); } - } - await Promise.all(tasks); - for (const dirInfo of dirInfos) { - while (dirInfo.parent && !dirToDirInfo[dirInfo.parent.dir]) { - dirInfo.parent = dirInfo.parent.parent; + if (markdownlintOptions && markdownlintOptions.markdownItPlugins) { + tasks.push( + importOrRequireIdsAndParams( + [ effectiveDir, ...effectiveModulePaths ], + markdownlintOptions.markdownItPlugins, + noRequire + ).then((markdownItPlugins) => { + markdownlintOptions.markdownItPlugins = markdownItPlugins; + }) + ); } + dirInfos.push(dirInfo); } + } + await Promise.all(tasks); + for (const dirInfo of dirInfos) { + while (dirInfo.parent && !dirToDirInfo[dirInfo.parent.dir]) { + dirInfo.parent = dirInfo.parent.parent; + } + } - // Verify dirInfos is simplified - // if ( - // dirInfos.filter( - // (di) => di.parent && !dirInfos.includes(di.parent) - // ).length > 0 - // ) { - // throw new Error("Extra parent"); - // } - // if ( - // dirInfos.filter( - // (di) => !di.parent && (di.dir !== baseDir) - // ).length > 0 - // ) { - // throw new Error("Missing parent"); - // } - // if ( - // dirInfos.filter( - // (di) => di.parent && - // !((di.markdownlintConfig ? 1 : 0) ^ (di.markdownlintOptions ? 1 : 0)) - // ).length > 0 - // ) { - // throw new Error("Missing object"); - // } - // if (dirInfos.filter((di) => di.dir === "/").length > 0) { - // throw new Error("Includes root"); - // } - - // Merge configuration by inheritance - for (const dirInfo of dirInfos) { - let markdownlintOptions = dirInfo.markdownlintOptions || {}; - let { markdownlintConfig } = dirInfo; - let parent = dirInfo; - // eslint-disable-next-line prefer-destructuring - while ((parent = parent.parent)) { - if (parent.markdownlintOptions) { - markdownlintOptions = mergeOptions( - parent.markdownlintOptions, - markdownlintOptions - ); - } - if ( - !markdownlintConfig && - parent.markdownlintConfig && - !markdownlintOptions.config - ) { - // eslint-disable-next-line prefer-destructuring - markdownlintConfig = parent.markdownlintConfig; - } + // Verify dirInfos is simplified + // if ( + // dirInfos.filter( + // (di) => di.parent && !dirInfos.includes(di.parent) + // ).length > 0 + // ) { + // throw new Error("Extra parent"); + // } + // if ( + // dirInfos.filter( + // (di) => !di.parent && (di.dir !== baseDir) + // ).length > 0 + // ) { + // throw new Error("Missing parent"); + // } + // if ( + // dirInfos.filter( + // (di) => di.parent && + // !((di.markdownlintConfig ? 1 : 0) ^ (di.markdownlintOptions ? 1 : 0)) + // ).length > 0 + // ) { + // throw new Error("Missing object"); + // } + // if (dirInfos.filter((di) => di.dir === "/").length > 0) { + // throw new Error("Includes root"); + // } + + // Merge configuration by inheritance + for (const dirInfo of dirInfos) { + let markdownlintOptions = dirInfo.markdownlintOptions || {}; + let { markdownlintConfig } = dirInfo; + let parent = dirInfo; + // eslint-disable-next-line prefer-destructuring + while ((parent = parent.parent)) { + if (parent.markdownlintOptions) { + markdownlintOptions = mergeOptions( + parent.markdownlintOptions, + markdownlintOptions + ); + } + if ( + !markdownlintConfig && + parent.markdownlintConfig && + !markdownlintOptions.config + ) { + // eslint-disable-next-line prefer-destructuring + markdownlintConfig = parent.markdownlintConfig; } - dirInfo.markdownlintOptions = mergeOptions( - markdownlintOptions, - optionsOverride - ); - dirInfo.markdownlintConfig = markdownlintConfig; } - return dirInfos; - }; + dirInfo.markdownlintOptions = mergeOptions( + markdownlintOptions, + optionsOverride + ); + dirInfo.markdownlintConfig = markdownlintConfig; + } + return dirInfos; +}; // Lint files in groups by shared configuration const lintFiles = async (fs, dirInfos, fileContents) => { @@ -820,6 +857,7 @@ const outputSummary = async ( relativeDir, summary, outputFormatters, + modulePaths, logMessage, logError ) => { @@ -832,8 +870,9 @@ const outputSummary = async ( logError }; const dir = relativeDir || baseDir; + const dirs = [ dir, ...modulePaths ]; const formattersAndParams = outputFormatters - ? await importOrRequireIdsAndParams(dir, outputFormatters) + ? await importOrRequireIdsAndParams(dirs, outputFormatters) : [ [ require("markdownlint-cli2-formatter-default") ] ]; await Promise.all(formattersAndParams.map((formatterAndParams) => { const [ formatter, ...formatterParams ] = formatterAndParams; @@ -972,8 +1011,18 @@ const main = async (params) => { const outputFormatters = (optionsOverride && optionsOverride.outputFormatters) || baseMarkdownlintOptions.outputFormatters; + const modulePaths = resolveModulePaths( + baseDir, + baseMarkdownlintOptions.modulePaths || [] + ); const errorsPresent = await outputSummary( - baseDir, relativeDir, summary, outputFormatters, logMessage, logError + baseDir, + relativeDir, + summary, + outputFormatters, + modulePaths, + logMessage, + logError ); // Return result return errorsPresent ? 1 : 0; diff --git a/resolve-and-require.js b/resolve-and-require.js index 668157ac..3f169919 100644 --- a/resolve-and-require.js +++ b/resolve-and-require.js @@ -6,12 +6,12 @@ * Wrapper for calling Node's require.resolve/require with an additional path. * @param {Object} req Node's require implementation (or equivalent). * @param {String} id Package identifier to require. - * @param {String} dir Directory to include when resolving paths. + * @param {String[]} dirs Directories to include when resolving paths. * @returns {Object} Exported module content. */ -const resolveAndRequire = (req, id, dir) => { +const resolveAndRequire = (req, id, dirs) => { const resolvePaths = req.resolve.paths ? req.resolve.paths("") : []; - const paths = [ dir, ...resolvePaths ]; + const paths = [ ...dirs, ...resolvePaths ]; const resolved = req.resolve(id, { paths }); return req(resolved); }; diff --git a/schema/markdownlint-cli2-config-schema.json b/schema/markdownlint-cli2-config-schema.json index 48e7afb4..96efbd1c 100644 --- a/schema/markdownlint-cli2-config-schema.json +++ b/schema/markdownlint-cli2-config-schema.json @@ -74,6 +74,16 @@ "minItems": 1 } }, + "modulePaths": { + "description": "Additional paths to resolve module locations from", + "type": "array", + "default": [], + "items": { + "description": "Path to resolve module locations from", + "type": "string", + "minLength": 1 + } + }, "noInlineConfig": { "description": "Whether to disable support of HTML comments within Markdown content", "type": "boolean", diff --git a/test/markdownlint-cli2-test-cases.js b/test/markdownlint-cli2-test-cases.js index 5f1a093b..eb3fd3d9 100644 --- a/test/markdownlint-cli2-test-cases.js +++ b/test/markdownlint-cli2-test-cases.js @@ -1176,6 +1176,20 @@ const testCases = ({ "post": deleteDirectory }); + testCase({ + "name": "modulePaths", + "args": [ "**/*.md" ], + "exitCode": 1, + "usesRequire": true + }); + + testCase({ + "name": "modulePaths-non-root", + "args": [ "**/*.md" ], + "exitCode": 1, + "usesRequire": true + }); + }; module.exports = testCases; diff --git a/test/markdownlint-cli2-test.js b/test/markdownlint-cli2-test.js index cfde663e..4a133e0a 100644 --- a/test/markdownlint-cli2-test.js +++ b/test/markdownlint-cli2-test.js @@ -111,7 +111,7 @@ test("validateMarkdownlintConfigSchema", async (t) => { }); test("validateMarkdownlintCli2ConfigSchema", async (t) => { - t.plan(84); + t.plan(86); // Validate schema const { addSchema, validate } = diff --git a/test/modulePaths-non-root/dir/.markdownlint-cli2.jsonc b/test/modulePaths-non-root/dir/.markdownlint-cli2.jsonc new file mode 100644 index 00000000..5c8f688d --- /dev/null +++ b/test/modulePaths-non-root/dir/.markdownlint-cli2.jsonc @@ -0,0 +1,14 @@ +{ + "customRules": [ + "markdownlint-rule-sample-commonjs" + ], + "markdownItPlugins": [ + [ "custom-markdown-it-plugin" ] + ], + "modulePaths": [ + "../../customRules", + "../../invalid", + "../../no-config", + "../../markdownItPlugins/module" + ] +} diff --git a/test/modulePaths-non-root/dir/about.md b/test/modulePaths-non-root/dir/about.md new file mode 100644 index 00000000..56d31c78 --- /dev/null +++ b/test/modulePaths-non-root/dir/about.md @@ -0,0 +1,6 @@ +# About # + +Text text text +1. List +3. List +3. List diff --git a/test/modulePaths-non-root/dir/hr.md b/test/modulePaths-non-root/dir/hr.md new file mode 100644 index 00000000..7a141621 --- /dev/null +++ b/test/modulePaths-non-root/dir/hr.md @@ -0,0 +1,3 @@ +# hr + +--- diff --git a/test/modulePaths-non-root/dir/link.md b/test/modulePaths-non-root/dir/link.md new file mode 100644 index 00000000..88b7f3b6 --- /dev/null +++ b/test/modulePaths-non-root/dir/link.md @@ -0,0 +1,3 @@ +# Heading + +Text [ link ](https://example.com) diff --git a/test/modulePaths-non-root/dir/subdir/info.md b/test/modulePaths-non-root/dir/subdir/info.md new file mode 100644 index 00000000..fc9dba79 --- /dev/null +++ b/test/modulePaths-non-root/dir/subdir/info.md @@ -0,0 +1,3 @@ +## Information +Text ` code1` text `code2 ` text + diff --git a/test/modulePaths-non-root/viewme.md b/test/modulePaths-non-root/viewme.md new file mode 100644 index 00000000..d60ebf5a --- /dev/null +++ b/test/modulePaths-non-root/viewme.md @@ -0,0 +1,14 @@ +# Title + +> Tagline + + +# Description + +Text text text +Text text text +Text text text + +## Summary + +Text text text \ No newline at end of file diff --git a/test/modulePaths/.markdownlint-cli2.jsonc b/test/modulePaths/.markdownlint-cli2.jsonc new file mode 100644 index 00000000..e93eb42f --- /dev/null +++ b/test/modulePaths/.markdownlint-cli2.jsonc @@ -0,0 +1,18 @@ +{ + "customRules": [ + "markdownlint-rule-sample-commonjs" + ], + "markdownItPlugins": [ + [ "custom-markdown-it-plugin" ] + ], + "outputFormatters": [ + [ "output-formatter-sample-commonjs" ] + ], + "modulePaths": [ + "../invalid", + "../customRules", + "../markdownItPlugins/module", + "../no-config", + "../outputFormatters-module" + ] +} diff --git a/test/modulePaths/dir/about.md b/test/modulePaths/dir/about.md new file mode 100644 index 00000000..56d31c78 --- /dev/null +++ b/test/modulePaths/dir/about.md @@ -0,0 +1,6 @@ +# About # + +Text text text +1. List +3. List +3. List diff --git a/test/modulePaths/dir/hr.md b/test/modulePaths/dir/hr.md new file mode 100644 index 00000000..7a141621 --- /dev/null +++ b/test/modulePaths/dir/hr.md @@ -0,0 +1,3 @@ +# hr + +--- diff --git a/test/modulePaths/dir/link.md b/test/modulePaths/dir/link.md new file mode 100644 index 00000000..88b7f3b6 --- /dev/null +++ b/test/modulePaths/dir/link.md @@ -0,0 +1,3 @@ +# Heading + +Text [ link ](https://example.com) diff --git a/test/modulePaths/dir/subdir/info.md b/test/modulePaths/dir/subdir/info.md new file mode 100644 index 00000000..fc9dba79 --- /dev/null +++ b/test/modulePaths/dir/subdir/info.md @@ -0,0 +1,3 @@ +## Information +Text ` code1` text `code2 ` text + diff --git a/test/modulePaths/viewme.md b/test/modulePaths/viewme.md new file mode 100644 index 00000000..d60ebf5a --- /dev/null +++ b/test/modulePaths/viewme.md @@ -0,0 +1,14 @@ +# Title + +> Tagline + + +# Description + +Text text text +Text text text +Text text text + +## Summary + +Text text text \ No newline at end of file diff --git a/test/resolve-and-require-test.js b/test/resolve-and-require-test.js index 96edff00..49038b38 100644 --- a/test/resolve-and-require-test.js +++ b/test/resolve-and-require-test.js @@ -12,7 +12,7 @@ test("built-in module", (t) => { t.plan(1); t.deepEqual( require("node:fs"), - resolveAndRequire(require, "fs", __dirname) + resolveAndRequire(require, "fs", [ __dirname ]) ); }); @@ -20,7 +20,7 @@ test("locally-installed module", (t) => { t.plan(1); t.deepEqual( require("markdownlint"), - resolveAndRequire(require, "markdownlint", __dirname) + resolveAndRequire(require, "markdownlint", [ __dirname ]) ); }); @@ -31,7 +31,7 @@ test("relative (to __dirname) path to module", (t) => { resolveAndRequire( require, "./customRules/node_modules/markdownlint-rule-sample-commonjs", - __dirname + [ __dirname ] ) ); }); @@ -48,7 +48,7 @@ test("module in alternate node_modules", (t) => { resolveAndRequire( require, "markdownlint-rule-sample-commonjs", - path.join(__dirname, "customRules") + [ path.join(__dirname, "customRules") ] ) ); }); @@ -67,7 +67,35 @@ test("module in alternate node_modules and no require.resolve.paths", (t) => { resolveAndRequire( require, "markdownlint-rule-sample-commonjs", - path.join(__dirname, "customRules") + [ path.join(__dirname, "customRules") ] + ) + ); +}); + +test("module local, relative, and in alternate node_modules", (t) => { + t.plan(3); + const dirs = [ + __dirname, + path.join(__dirname, "customRules") + ]; + t.deepEqual( + require("markdownlint"), + resolveAndRequire(require, "markdownlint", dirs) + ); + t.deepEqual( + require("./customRules/node_modules/markdownlint-rule-sample-commonjs"), + resolveAndRequire( + require, + "./customRules/node_modules/markdownlint-rule-sample-commonjs", + dirs + ) + ); + t.deepEqual( + require("./customRules/node_modules/markdownlint-rule-sample-commonjs"), + resolveAndRequire( + require, + "markdownlint-rule-sample-commonjs", + dirs ) ); }); diff --git a/test/snapshots/markdownlint-cli2-test-exec.js.md b/test/snapshots/markdownlint-cli2-test-exec.js.md index bc75c062..f26076f7 100644 --- a/test/snapshots/markdownlint-cli2-test-exec.js.md +++ b/test/snapshots/markdownlint-cli2-test-exec.js.md @@ -7190,3 +7190,67 @@ Generated by [AVA](https://avajs.dev). Summary: 2 error(s)␊ `, } + +## modulePaths (exec) + +> Snapshot 1 + + { + exitCode: 1, + formatterCodeQuality: '', + formatterJson: '', + formatterJunit: '', + formatterSarif: '', + stderr: `cjs: dir/about.md 1 MD021/no-multiple-space-closed-atx␊ + cjs: dir/about.md 4 MD032/blanks-around-lists␊ + cjs: dir/about.md 5 MD029/ol-prefix␊ + cjs: dir/hr.md 3 sample-rule-commonjs␊ + cjs: dir/subdir/info.md 1 MD022/blanks-around-headings/blanks-around-headers␊ + cjs: dir/subdir/info.md 1 MD041/first-line-heading/first-line-h1␊ + cjs: dir/subdir/info.md 2 MD038/no-space-in-code␊ + cjs: dir/subdir/info.md 2 MD038/no-space-in-code␊ + cjs: dir/subdir/info.md 4 MD012/no-multiple-blanks␊ + cjs: viewme.md 3 MD009/no-trailing-spaces␊ + cjs: viewme.md 5 MD012/no-multiple-blanks␊ + cjs: viewme.md 6 MD025/single-title/single-h1␊ + cjs: viewme.md 12 MD019/no-multiple-space-atx␊ + cjs: viewme.md 14 MD047/single-trailing-newline␊ + `, + stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ + Finding: **/*.md␊ + Linting: 5 file(s)␊ + Summary: 14 error(s)␊ + `, + } + +## modulePaths-non-root (exec) + +> Snapshot 1 + + { + exitCode: 1, + formatterCodeQuality: '', + formatterJson: '', + formatterJunit: '', + formatterSarif: '', + stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ + dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ + dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ + dir/hr.md:3 sample-rule-commonjs Sample rule (commonjs) [Sample error for hr]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ + dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ + dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ + dir/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ + viewme.md:3:10 MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1]␊ + viewme.md:5 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ + viewme.md:6 MD025/single-title/single-h1 Multiple top-level headings in the same document [Context: "# Description"]␊ + viewme.md:12:1 MD019/no-multiple-space-atx Multiple spaces after hash on atx style heading [Context: "## Summary"]␊ + viewme.md:14:14 MD047/single-trailing-newline Files should end with a single newline character␊ + `, + stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ + Finding: **/*.md␊ + Linting: 5 file(s)␊ + Summary: 14 error(s)␊ + `, + } diff --git a/test/snapshots/markdownlint-cli2-test-exec.js.snap b/test/snapshots/markdownlint-cli2-test-exec.js.snap index ca23f4865928e881e9d21d7ab6916bee531e899d..49d4176614efbf3a3634181c1318c4c4be6cbe72 100644 GIT binary patch delta 12143 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

{ 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 Gu>S=vD??5I diff --git a/test/tilde-paths-commonjs/.markdownlint-cli2.cjs b/test/tilde-paths-commonjs/.markdownlint-cli2.cjs index c3e9295c..f57a96ef 100644 --- a/test/tilde-paths-commonjs/.markdownlint-cli2.cjs +++ b/test/tilde-paths-commonjs/.markdownlint-cli2.cjs @@ -6,18 +6,26 @@ const { homedir } = require("os"); const { relative, resolve } = require("path"); const makeTildePath = (script) => { - const dir = resolve(__dirname, "scripts", script); + const dir = resolve(__dirname, script); return `~/${relative(homedir(), dir)}`; }; module.exports = { "customRules": [ - makeTildePath("any-blockquote.cjs") + makeTildePath("scripts/any-blockquote.cjs"), + "markdownlint-rule-sample-commonjs" ], "markdownItPlugins": [ - [ makeTildePath("custom-markdown-it-plugin.cjs") ] + [ makeTildePath("scripts/custom-markdown-it-plugin.cjs") ], + [ "custom-markdown-it-plugin" ] ], "outputFormatters": [ - [ makeTildePath("custom-output-formatter.cjs") ] + [ makeTildePath("scripts/custom-output-formatter.cjs") ], + [ "output-formatter-sample-commonjs" ] + ], + "modulePaths": [ + makeTildePath("../customRules"), + makeTildePath("../markdownItPlugins/module"), + makeTildePath("../outputFormatters-module") ] }; diff --git a/test/tilde-paths-commonjs/hr.md b/test/tilde-paths-commonjs/hr.md new file mode 100644 index 00000000..7a141621 --- /dev/null +++ b/test/tilde-paths-commonjs/hr.md @@ -0,0 +1,3 @@ +# hr + +--- diff --git a/test/tilde-paths-module/.markdownlint-cli2.mjs b/test/tilde-paths-module/.markdownlint-cli2.mjs index e09997e4..7daac315 100644 --- a/test/tilde-paths-module/.markdownlint-cli2.mjs +++ b/test/tilde-paths-module/.markdownlint-cli2.mjs @@ -7,7 +7,6 @@ import { fileURLToPath } from "url"; const makeTildePath = (script) => { const dir = resolve( dirname(fileURLToPath(import.meta.url)), - "scripts", script ); return `~/${relative(homedir(), dir)}`; @@ -15,13 +14,21 @@ const makeTildePath = (script) => { const options = { "customRules": [ - makeTildePath("any-blockquote.mjs") + makeTildePath("scripts/any-blockquote.mjs"), + "markdownlint-rule-sample-commonjs" ], "markdownItPlugins": [ - [ makeTildePath("custom-markdown-it-plugin.mjs") ] + [ makeTildePath("scripts/custom-markdown-it-plugin.mjs") ], + [ "custom-markdown-it-plugin" ] ], "outputFormatters": [ - [ makeTildePath("custom-output-formatter.mjs") ] + [ makeTildePath("scripts/custom-output-formatter.mjs") ], + [ "output-formatter-sample-commonjs" ] + ], + "modulePaths": [ + makeTildePath("../customRules"), + makeTildePath("../markdownItPlugins/module"), + makeTildePath("../outputFormatters-module") ] }; diff --git a/test/tilde-paths-module/hr.md b/test/tilde-paths-module/hr.md new file mode 100644 index 00000000..7a141621 --- /dev/null +++ b/test/tilde-paths-module/hr.md @@ -0,0 +1,3 @@ +# hr + +--- From d0d391af8512a34c5e7666f14ea3f61c5b9fef38 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 15:42:33 +0000 Subject: [PATCH 14/46] Bump eslint from 8.50.0 to 8.51.0 Bumps [eslint](https://github.com/eslint/eslint) from 8.50.0 to 8.51.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/v8.50.0...v8.51.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 5962bafe..5a537136 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "cpy": "10.1.0", "cpy-cli": "5.0.0", "del": "7.1.0", - "eslint": "8.50.0", + "eslint": "8.51.0", "eslint-plugin-n": "16.1.0", "eslint-plugin-unicorn": "48.0.1", "execa": "8.0.1", From 018dade8e2f7a757584ba7903fc9e61b6e3dc4f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 15:16:20 +0000 Subject: [PATCH 15/46] Bump junit-report-builder from 3.0.1 to 3.1.0 in /formatter-junit Bumps [junit-report-builder](https://github.com/davidparsson/junit-report-builder) from 3.0.1 to 3.1.0. - [Commits](https://github.com/davidparsson/junit-report-builder/compare/3.0.1...3.1.0) --- updated-dependencies: - dependency-name: junit-report-builder dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- formatter-junit/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/formatter-junit/package.json b/formatter-junit/package.json index b3125f04..e1ca67d7 100644 --- a/formatter-junit/package.json +++ b/formatter-junit/package.json @@ -22,7 +22,7 @@ "markdownlint-cli2": ">=0.0.4" }, "dependencies": { - "junit-report-builder": "3.0.1" + "junit-report-builder": "3.1.0" }, "keywords": [ "markdownlint-cli2-formatter" From a9bc35fc5e9a2484776093cc62d961846c88c632 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 15:51:21 +0000 Subject: [PATCH 16/46] Bump eslint-plugin-n from 16.1.0 to 16.2.0 Bumps [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) from 16.1.0 to 16.2.0. - [Release notes](https://github.com/eslint-community/eslint-plugin-n/releases) - [Commits](https://github.com/eslint-community/eslint-plugin-n/compare/16.1.0...16.2.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 5a537136..b32a078f 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "cpy-cli": "5.0.0", "del": "7.1.0", "eslint": "8.51.0", - "eslint-plugin-n": "16.1.0", + "eslint-plugin-n": "16.2.0", "eslint-plugin-unicorn": "48.0.1", "execa": "8.0.1", "@hyperjump/json-schema": "1.6.1", From 7dd6ade5ff730d31620ba2e73b861d94f828da5f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 15:16:01 +0000 Subject: [PATCH 17/46] Bump yaml from 2.3.2 to 2.3.3 Bumps [yaml](https://github.com/eemeli/yaml) from 2.3.2 to 2.3.3. - [Release notes](https://github.com/eemeli/yaml/releases) - [Commits](https://github.com/eemeli/yaml/compare/v2.3.2...v2.3.3) --- updated-dependencies: - dependency-name: yaml 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 b32a078f..c99f04cc 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "markdownlint-cli2-formatter-default": "0.0.4", "micromatch": "4.0.5", "strip-json-comments": "5.0.1", - "yaml": "2.3.2" + "yaml": "2.3.3" }, "devDependencies": { "@iktakahiro/markdown-it-katex": "4.0.1", From 6c5e7b7f8239bbefc94f1aa035ef3a15a757e71a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 15:49:54 +0000 Subject: [PATCH 18/46] Bump eslint from 8.51.0 to 8.52.0 Bumps [eslint](https://github.com/eslint/eslint) from 8.51.0 to 8.52.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/v8.51.0...v8.52.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 c99f04cc..487fa11f 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "cpy": "10.1.0", "cpy-cli": "5.0.0", "del": "7.1.0", - "eslint": "8.51.0", + "eslint": "8.52.0", "eslint-plugin-n": "16.2.0", "eslint-plugin-unicorn": "48.0.1", "execa": "8.0.1", From c60063060364d828fcf228eef891294d57062578 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Oct 2023 15:48:20 +0000 Subject: [PATCH 19/46] Bump actions/setup-node from 3 to 4 Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 4. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- .github/workflows/smoke-test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e1eba563..557fdf10 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - name: Install Dependencies diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index bd84eb64..05ee950d 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -21,7 +21,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: npm install From 7527d41b9379c6f9ad1566ac2b5bf53dac8b859f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Oct 2023 15:26:06 +0000 Subject: [PATCH 20/46] Bump @hyperjump/json-schema from 1.6.1 to 1.6.4 Bumps [@hyperjump/json-schema](https://github.com/hyperjump-io/json-schema) from 1.6.1 to 1.6.4. - [Commits](https://github.com/hyperjump-io/json-schema/compare/v1.6.1...v1.6.4) --- updated-dependencies: - dependency-name: "@hyperjump/json-schema" 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 487fa11f..f3b5b0dd 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "eslint-plugin-n": "16.2.0", "eslint-plugin-unicorn": "48.0.1", "execa": "8.0.1", - "@hyperjump/json-schema": "1.6.1", + "@hyperjump/json-schema": "1.6.4", "markdown-it-emoji": "2.0.2", "markdown-it-for-inline": "0.1.1", "markdownlint-cli2-formatter-codequality": "0.0.4", From c32c612ccd0ee7af424d222b4ce0d0f5f771046f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 15:35:52 +0000 Subject: [PATCH 21/46] Bump eslint-plugin-unicorn from 48.0.1 to 49.0.0 Bumps [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) from 48.0.1 to 49.0.0. - [Release notes](https://github.com/sindresorhus/eslint-plugin-unicorn/releases) - [Commits](https://github.com/sindresorhus/eslint-plugin-unicorn/compare/v48.0.1...v49.0.0) --- updated-dependencies: - dependency-name: eslint-plugin-unicorn dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f3b5b0dd..7b020e53 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "del": "7.1.0", "eslint": "8.52.0", "eslint-plugin-n": "16.2.0", - "eslint-plugin-unicorn": "48.0.1", + "eslint-plugin-unicorn": "49.0.0", "execa": "8.0.1", "@hyperjump/json-schema": "1.6.4", "markdown-it-emoji": "2.0.2", From c5383b7c3d7e294c163bba606e8805bd1cf867a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Nov 2023 15:06:54 +0000 Subject: [PATCH 22/46] Bump @hyperjump/json-schema from 1.6.4 to 1.6.5 Bumps [@hyperjump/json-schema](https://github.com/hyperjump-io/json-schema) from 1.6.4 to 1.6.5. - [Commits](https://github.com/hyperjump-io/json-schema/commits) --- updated-dependencies: - dependency-name: "@hyperjump/json-schema" 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 7b020e53..1a1830e5 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "eslint-plugin-n": "16.2.0", "eslint-plugin-unicorn": "49.0.0", "execa": "8.0.1", - "@hyperjump/json-schema": "1.6.4", + "@hyperjump/json-schema": "1.6.5", "markdown-it-emoji": "2.0.2", "markdown-it-for-inline": "0.1.1", "markdownlint-cli2-formatter-codequality": "0.0.4", From b7d19c010b58c7a12c67464d3c500ef4f69da6a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Nov 2023 15:07:04 +0000 Subject: [PATCH 23/46] Bump yaml from 2.3.3 to 2.3.4 Bumps [yaml](https://github.com/eemeli/yaml) from 2.3.3 to 2.3.4. - [Release notes](https://github.com/eemeli/yaml/releases) - [Commits](https://github.com/eemeli/yaml/compare/v2.3.3...v2.3.4) --- updated-dependencies: - dependency-name: yaml 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 1a1830e5..d4cb8b93 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "markdownlint-cli2-formatter-default": "0.0.4", "micromatch": "4.0.5", "strip-json-comments": "5.0.1", - "yaml": "2.3.3" + "yaml": "2.3.4" }, "devDependencies": { "@iktakahiro/markdown-it-katex": "4.0.1", From 3e82a47f21a0fb656fdf0f1eab0231b814ce7235 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Nov 2023 15:24:24 +0000 Subject: [PATCH 24/46] Bump eslint from 8.52.0 to 8.53.0 Bumps [eslint](https://github.com/eslint/eslint) from 8.52.0 to 8.53.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/v8.52.0...v8.53.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 d4cb8b93..65e70dfe 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "cpy": "10.1.0", "cpy-cli": "5.0.0", "del": "7.1.0", - "eslint": "8.52.0", + "eslint": "8.53.0", "eslint-plugin-n": "16.2.0", "eslint-plugin-unicorn": "49.0.0", "execa": "8.0.1", From 733cca1b61e5f47d9669a0567aa6b5b9de058416 Mon Sep 17 00:00:00 2001 From: David Anson Date: Tue, 7 Nov 2023 19:13:12 -0800 Subject: [PATCH 25/46] Remove deprecated ESLint rules after version update. --- .eslintrc.json | 10 ---------- .../markdownlint-cli2-formatter-codequality.js | 1 - markdownlint-cli2.js | 5 +---- test/markdownlint-cli2-test-cases.js | 2 -- test/markdownlint-cli2-test.js | 2 -- 5 files changed, 1 insertion(+), 19 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index bbdad06c..859c5227 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -22,32 +22,22 @@ ], "reportUnusedDisableDirectives": true, "rules": { - "array-bracket-spacing": ["error", "always"], - "array-element-newline": "off", "capitalized-comments": "off", "complexity": "off", - "function-call-argument-newline": "off", - "function-paren-newline": "off", "guard-for-in": "off", "id-length": "off", - "indent": ["error", 2], - "linebreak-style": "off", "max-lines-per-function": "off", "max-lines": "off", "max-params": "off", "max-statements": "off", "multiline-comment-style": ["error", "separate-lines"], - "multiline-ternary": "off", "no-console": "off", - "no-extra-parens": "off", "no-magic-numbers": "off", "no-plusplus": "off", "no-ternary": "off", "no-undef-init": "off", "no-undefined": "off", - "object-curly-spacing": ["error", "always"], "one-var": "off", - "padded-blocks": "off", "require-atomic-updates": "off", "sort-keys": "off", diff --git a/formatter-codequality/markdownlint-cli2-formatter-codequality.js b/formatter-codequality/markdownlint-cli2-formatter-codequality.js index 32c1a2f2..309d7a00 100644 --- a/formatter-codequality/markdownlint-cli2-formatter-codequality.js +++ b/formatter-codequality/markdownlint-cli2-formatter-codequality.js @@ -17,7 +17,6 @@ const createFingerprint = function createFingerprint (violation) { }; // Writes markdownlint-cli2 results to a GitLab Code Quality report JSON file. -// eslint-disable-next-line max-len // See: https://docs.gitlab.com/ee/ci/testing/code_quality.html#implementing-a-custom-tool const outputFormatter = (options, params) => { const { directory, results } = options; diff --git a/markdownlint-cli2.js b/markdownlint-cli2.js index 625d5089..59b6f126 100755 --- a/markdownlint-cli2.js +++ b/markdownlint-cli2.js @@ -5,7 +5,7 @@ "use strict"; // @ts-ignore -// eslint-disable-next-line camelcase, max-len, no-inline-comments, no-undef +// 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 @@ -241,7 +241,6 @@ const processArgv = (argv) => { // Show help if missing arguments const showHelp = (logMessage) => { - /* eslint-disable max-len */ logMessage(`https://github.com/DavidAnson/markdownlint-cli2 Syntax: markdownlint-cli2 glob0 [glob1] [...] [globN] [--config file] [--fix] @@ -282,7 +281,6 @@ Cross-platform compatibility: The most compatible syntax for cross-platform support: $ markdownlint-cli2 "**/*.md" "#node_modules"` ); - /* eslint-enable max-len */ }; // Get (creating if necessary) and process a directory's info object @@ -914,7 +912,6 @@ const main = async (params) => { const baseDir = posixPath(baseDirSystem); // Output banner logMessage( - // eslint-disable-next-line max-len `${name || packageName} v${packageVersion} (${libraryName} v${libraryVersion})` ); // Merge and process args/argv diff --git a/test/markdownlint-cli2-test-cases.js b/test/markdownlint-cli2-test-cases.js index eb3fd3d9..8229b6c2 100644 --- a/test/markdownlint-cli2-test-cases.js +++ b/test/markdownlint-cli2-test-cases.js @@ -730,7 +730,6 @@ const testCases = ({ "args": [ "cfg/unrecognized.jsonc", "**/*.md" ], "exitCode": 2, "stderrRe": - // eslint-disable-next-line max-len /Configuration file "[^"]*cfg\/unrecognized\.jsonc" is unrecognized; its name should be \(or end with\) one of the supported types \(e\.g\., "\.markdownlint\.json" or "example\.markdownlint-cli2\.jsonc"\)\./u, "cwd": "config-files" }); @@ -765,7 +764,6 @@ const testCases = ({ "args": [ "--config", "cfg/unrecognized.jsonc", "**/*.md" ], "exitCode": 2, "stderrRe": - // eslint-disable-next-line max-len /Configuration file "[^"]*cfg\/unrecognized\.jsonc" is unrecognized; its name should be \(or end with\) one of the supported types \(e\.g\., "\.markdownlint\.json" or "example\.markdownlint-cli2\.jsonc"\)\./u, "cwd": "config-files" }); diff --git a/test/markdownlint-cli2-test.js b/test/markdownlint-cli2-test.js index 4a133e0a..432f10b9 100644 --- a/test/markdownlint-cli2-test.js +++ b/test/markdownlint-cli2-test.js @@ -9,13 +9,11 @@ const { "main": markdownlintCli2 } = require("../markdownlint-cli2.js"); const FsMock = require("./fs-mock"); const jsonSchemaVersion = "http://json-schema.org/draft-07/schema#"; -// eslint-disable-next-line max-len const markdownlintConfigSchemaUri = "https://raw.githubusercontent.com/DavidAnson/markdownlint-cli2/main/schema/markdownlint-config-schema.json"; const markdownlintConfigSchemaDefinition = require("../schema/markdownlint-config-schema.json"); // @ts-ignore markdownlintConfigSchemaDefinition.$schema = jsonSchemaVersion; -// eslint-disable-next-line max-len const markdownlintCli2ConfigSchemaUri = "https://raw.githubusercontent.com/DavidAnson/markdownlint-cli2/main/schema/markdownlint-cli2-config-schema.json"; const markdownlintCli2ConfigSchemaDefinition = require("../schema/markdownlint-cli2-config-schema.json"); From 0600eb1a92310237fc80330d08d2109243ca3e7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 15:30:58 +0000 Subject: [PATCH 26/46] Bump eslint-plugin-n from 16.2.0 to 16.3.0 Bumps [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) from 16.2.0 to 16.3.0. - [Release notes](https://github.com/eslint-community/eslint-plugin-n/releases) - [Commits](https://github.com/eslint-community/eslint-plugin-n/compare/16.2.0...16.3.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 65e70dfe..3b88dedf 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "cpy-cli": "5.0.0", "del": "7.1.0", "eslint": "8.53.0", - "eslint-plugin-n": "16.2.0", + "eslint-plugin-n": "16.3.0", "eslint-plugin-unicorn": "49.0.0", "execa": "8.0.1", "@hyperjump/json-schema": "1.6.5", From 560dbfca18a5f34748f06f30daac05033ad75ddd Mon Sep 17 00:00:00 2001 From: David Anson Date: Tue, 7 Nov 2023 19:18:03 -0800 Subject: [PATCH 27/46] Remove deprecated ESLint rules after version update, sort rules by name. --- .eslintrc.json | 24 ++++++++++++------------ test/markdownlint-cli2-test.js | 2 -- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 859c5227..ac6dade5 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -41,34 +41,32 @@ "require-atomic-updates": "off", "sort-keys": "off", + "n/callback-return": "error", + "n/exports-style": "error", + "n/file-extension-in-import": "error", + "n/global-require": "off", "n/handle-callback-err": "error", "n/no-callback-literal": "error", + "n/no-deprecated-api": "error", "n/no-exports-assign": "error", "n/no-extraneous-import": "error", "n/no-extraneous-require": "error", "n/no-missing-import": "error", "n/no-missing-require": "error", + "n/no-mixed-requires": "error", "n/no-new-require": "error", "n/no-path-concat": "error", + "n/no-process-env": "error", "n/no-process-exit": "error", + "n/no-restricted-import": "error", + "n/no-restricted-require": "error", + "n/no-sync": "error", "n/no-unpublished-bin": "error", "n/no-unpublished-import": "error", "n/no-unpublished-require": "error", "n/no-unsupported-features/es-builtins": "error", "n/no-unsupported-features/es-syntax": "error", "n/no-unsupported-features/node-builtins": "error", - "n/process-exit-as-throw": "error", - "n/shebang": "error", - "n/no-deprecated-api": "error", - "n/callback-return": "error", - "n/exports-style": "error", - "n/file-extension-in-import": "error", - "n/global-require": "off", - "n/no-mixed-requires": "error", - "n/no-process-env": "error", - "n/no-restricted-import": "error", - "n/no-restricted-require": "error", - "n/no-sync": "error", "n/prefer-global/buffer": "error", "n/prefer-global/console": "error", "n/prefer-global/process": "error", @@ -78,6 +76,8 @@ "n/prefer-global/url": "error", "n/prefer-promises/dns": "error", "n/prefer-promises/fs": "error", + "n/process-exit-as-throw": "error", + "n/shebang": "error", "unicorn/no-null": "off", "unicorn/prefer-module": "off", diff --git a/test/markdownlint-cli2-test.js b/test/markdownlint-cli2-test.js index 432f10b9..c088f200 100644 --- a/test/markdownlint-cli2-test.js +++ b/test/markdownlint-cli2-test.js @@ -70,7 +70,6 @@ test("validateMarkdownlintConfigSchema", async (t) => { // Validate schema const { addSchema, validate } = - // eslint-disable-next-line n/file-extension-in-import await import("@hyperjump/json-schema/draft-07"); const schemaResult = await validate( jsonSchemaVersion, @@ -113,7 +112,6 @@ test("validateMarkdownlintCli2ConfigSchema", async (t) => { // Validate schema const { addSchema, validate } = - // eslint-disable-next-line n/file-extension-in-import await import("@hyperjump/json-schema/draft-07"); const schemaResult = await validate( jsonSchemaVersion, From 7579b358f2394ccfae6e1fee6f34f87516b488c9 Mon Sep 17 00:00:00 2001 From: David Anson Date: Tue, 7 Nov 2023 19:33:32 -0800 Subject: [PATCH 28/46] Remove support for end-of-life Node 16. --- .github/workflows/ci.yml | 2 +- .github/workflows/smoke-test.yml | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 557fdf10..d0723c4b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: fail-fast: false matrix: os: [ macos-latest, ubuntu-latest, windows-latest ] - node-version: [ 16, 18, 20 ] + node-version: [ 18, 20 ] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/smoke-test.yml b/.github/workflows/smoke-test.yml index 05ee950d..7fa86e70 100644 --- a/.github/workflows/smoke-test.yml +++ b/.github/workflows/smoke-test.yml @@ -17,7 +17,7 @@ jobs: fail-fast: false matrix: os: [ macos-latest, ubuntu-latest, windows-latest ] - node-version: [ 16, 18, 20 ] + node-version: [ 18, 20 ] steps: - uses: actions/checkout@v4 diff --git a/package.json b/package.json index 3b88dedf..b2f12a6a 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "webworker-install": "npm run docker-npm-install -- --no-save path-browserify process setimmediate stream-browserify url util webpack-cli" }, "engines": { - "node": ">=16" + "node": ">=18" }, "files": [ "append-to-array.js", From d5a24592b7047297ad914a102d66986cd4947166 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Nov 2023 03:39:41 +0000 Subject: [PATCH 29/46] Bump cpy from 10.1.0 to 11.0.0 Bumps [cpy](https://github.com/sindresorhus/cpy) from 10.1.0 to 11.0.0. - [Release notes](https://github.com/sindresorhus/cpy/releases) - [Commits](https://github.com/sindresorhus/cpy/compare/v10.1.0...v11.0.0) --- updated-dependencies: - dependency-name: cpy dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b2f12a6a..5b1ffd54 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "@iktakahiro/markdown-it-katex": "4.0.1", "ava": "5.3.1", "c8": "8.0.1", - "cpy": "10.1.0", + "cpy": "11.0.0", "cpy-cli": "5.0.0", "del": "7.1.0", "eslint": "8.53.0", From 0451155f8a7e61921f58b471a7e393730184a740 Mon Sep 17 00:00:00 2001 From: David Anson Date: Thu, 9 Nov 2023 20:11:39 -0800 Subject: [PATCH 30/46] Update CONTRIBUTING.md to explicitly disallow ChatGPT and other LLMs. --- .github/dictionary.txt | 1 + CONTRIBUTING.md | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/dictionary.txt b/.github/dictionary.txt index 465ba1f4..ef87c75d 100644 --- a/.github/dictionary.txt +++ b/.github/dictionary.txt @@ -17,6 +17,7 @@ Homebrew JSON JSONC JUnit +LLMs markdownlint-cli2 markdownlint-cli2-formatter-codequality markdownlint-cli2-formatter-default diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 472eaca3..64a7fa7f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,9 +42,9 @@ allowed. In order to maintain the permissive MIT license this project uses, all contributions must be your own and released under that license. Code you add should be an original work and should not be copied from elsewhere. Taking code -from a different project, Stack Overflow, or the like is not allowed. The use -of tools such as GitHub Copilot that generate code from other projects is not -allowed. +from a different project, Stack Overflow, or the like is not allowed. The use of +tools such as GitHub Copilot, ChatGPT, LLMs (large language models), etc. that +incorporate code from other projects is not allowed. Thank you! From 25f6c24413c4e8cec6db9b014a89a8c449af3986 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 15:10:58 +0000 Subject: [PATCH 31/46] Bump eslint-plugin-n from 16.3.0 to 16.3.1 Bumps [eslint-plugin-n](https://github.com/eslint-community/eslint-plugin-n) from 16.3.0 to 16.3.1. - [Release notes](https://github.com/eslint-community/eslint-plugin-n/releases) - [Commits](https://github.com/eslint-community/eslint-plugin-n/compare/16.3.0...16.3.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 5b1ffd54..94c982b6 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "cpy-cli": "5.0.0", "del": "7.1.0", "eslint": "8.53.0", - "eslint-plugin-n": "16.3.0", + "eslint-plugin-n": "16.3.1", "eslint-plugin-unicorn": "49.0.0", "execa": "8.0.1", "@hyperjump/json-schema": "1.6.5", From 4867e55703bb66779395c9a043d2530ec01c3081 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 15:10:42 +0000 Subject: [PATCH 32/46] Bump globby from 13.2.2 to 14.0.0 Bumps [globby](https://github.com/sindresorhus/globby) from 13.2.2 to 14.0.0. - [Release notes](https://github.com/sindresorhus/globby/releases) - [Commits](https://github.com/sindresorhus/globby/compare/v13.2.2...v14.0.0) --- updated-dependencies: - dependency-name: globby dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 94c982b6..c6bdf580 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "schema/markdownlint-config-schema.json" ], "dependencies": { - "globby": "13.2.2", + "globby": "14.0.0", "markdownlint": "0.31.1", "markdownlint-cli2-formatter-default": "0.0.4", "micromatch": "4.0.5", From f296e1e8fa1418274ffe086d4fd7ea1ab09e1821 Mon Sep 17 00:00:00 2001 From: David Anson Date: Tue, 14 Nov 2023 20:30:35 -0800 Subject: [PATCH 33/46] Update dependency: markdownlint to 0.32.1. --- package.json | 2 +- schema/markdownlint-config-schema.json | 1026 ++++++++++++++--- test/markdownlint-cli2-test.js | 2 - .../markdownlint-cli2-test-exec.js.md | 172 ++- .../markdownlint-cli2-test-exec.js.snap | Bin 14304 -> 14256 bytes .../snapshots/markdownlint-cli2-test-fs.js.md | 104 +- .../markdownlint-cli2-test-fs.js.snap | Bin 5574 -> 5565 bytes .../markdownlint-cli2-test-main.js.md | 159 ++- .../markdownlint-cli2-test-main.js.snap | Bin 12522 -> 12495 bytes 9 files changed, 1057 insertions(+), 408 deletions(-) diff --git a/package.json b/package.json index c6bdf580..f9df8709 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ ], "dependencies": { "globby": "14.0.0", - "markdownlint": "0.31.1", + "markdownlint": "0.32.1", "markdownlint-cli2-formatter-default": "0.0.4", "micromatch": "4.0.5", "strip-json-comments": "5.0.1", diff --git a/schema/markdownlint-config-schema.json b/schema/markdownlint-config-schema.json index 03fa000b..9fc6a184 100644 --- a/schema/markdownlint-config-schema.json +++ b/schema/markdownlint-config-schema.json @@ -1,5 +1,6 @@ { - "title": "Markdownlint configuration schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "markdownlint configuration schema", "type": "object", "properties": { "default": { @@ -21,42 +22,41 @@ "default": "https://raw.githubusercontent.com/DavidAnson/markdownlint/main/schema/markdownlint-config-schema.json" }, "MD001": { - "description": "MD001/heading-increment/header-increment - Heading levels should only increment by one level at a time", + "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md001.md", "type": "boolean", "default": true }, "heading-increment": { - "$ref": "#/properties/MD001" - }, - "header-increment": { - "$ref": "#/properties/MD001" + "description": "MD001/heading-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md001.md", + "type": "boolean", + "default": true }, - "MD002": { - "description": "MD002/first-heading-h1/first-header-h1 - First heading should be a top-level heading", + "MD003": { + "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md003.md", "type": [ "boolean", "object" ], "default": true, "properties": { - "level": { - "description": "Heading level", - "type": "integer", - "minimum": 1, - "maximum": 6, - "default": 1 + "style": { + "description": "Heading style", + "type": "string", + "enum": [ + "consistent", + "atx", + "atx_closed", + "setext", + "setext_with_atx", + "setext_with_atx_closed" + ], + "default": "consistent" } }, "additionalProperties": false }, - "first-heading-h1": { - "$ref": "#/properties/MD002" - }, - "first-header-h1": { - "$ref": "#/properties/MD002" - }, - "MD003": { - "description": "MD003/heading-style/header-style - Heading style", + "heading-style": { + "description": "MD003/heading-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md003.md", "type": [ "boolean", "object" @@ -79,14 +79,8 @@ }, "additionalProperties": false }, - "heading-style": { - "$ref": "#/properties/MD003" - }, - "header-style": { - "$ref": "#/properties/MD003" - }, "MD004": { - "description": "MD004/ul-style - Unordered list style", + "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md004.md", "type": [ "boolean", "object" @@ -109,26 +103,40 @@ "additionalProperties": false }, "ul-style": { - "$ref": "#/properties/MD004" + "description": "MD004/ul-style : Unordered list style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md004.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "style": { + "description": "List style", + "type": "string", + "enum": [ + "consistent", + "asterisk", + "plus", + "dash", + "sublist" + ], + "default": "consistent" + } + }, + "additionalProperties": false }, "MD005": { - "description": "MD005/list-indent - Inconsistent indentation for list items at the same level", + "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md005.md", "type": "boolean", "default": true }, "list-indent": { - "$ref": "#/properties/MD005" - }, - "MD006": { - "description": "MD006/ul-start-left - Consider starting bulleted lists at the beginning of the line", + "description": "MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md005.md", "type": "boolean", "default": true }, - "ul-start-left": { - "$ref": "#/properties/MD006" - }, "MD007": { - "description": "MD007/ul-indent - Unordered list indentation", + "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md007.md", "type": [ "boolean", "object" @@ -156,10 +164,35 @@ "additionalProperties": false }, "ul-indent": { - "$ref": "#/properties/MD007" + "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md007.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "indent": { + "description": "Spaces for indent", + "type": "integer", + "minimum": 1, + "default": 2 + }, + "start_indented": { + "description": "Whether to indent the first level of the list", + "type": "boolean", + "default": false + }, + "start_indent": { + "description": "Spaces for first level indent (when start_indented is set)", + "type": "integer", + "minimum": 1, + "default": 2 + } + }, + "additionalProperties": false }, "MD009": { - "description": "MD009/no-trailing-spaces - Trailing spaces", + "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md009.md", "type": [ "boolean", "object" @@ -186,10 +219,34 @@ "additionalProperties": false }, "no-trailing-spaces": { - "$ref": "#/properties/MD009" + "description": "MD009/no-trailing-spaces : Trailing spaces : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md009.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "br_spaces": { + "description": "Spaces for line break", + "type": "integer", + "minimum": 0, + "default": 2 + }, + "list_item_empty_lines": { + "description": "Allow spaces for empty lines in list items", + "type": "boolean", + "default": false + }, + "strict": { + "description": "Include unnecessary breaks", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false }, "MD010": { - "description": "MD010/no-hard-tabs - Hard tabs", + "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md010.md", "type": [ "boolean", "object" @@ -219,18 +276,47 @@ "additionalProperties": false }, "no-hard-tabs": { - "$ref": "#/properties/MD010" + "description": "MD010/no-hard-tabs : Hard tabs : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md010.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "code_blocks": { + "description": "Include code blocks", + "type": "boolean", + "default": true + }, + "ignore_code_languages": { + "description": "Fenced code languages to ignore", + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "spaces_per_tab": { + "description": "Number of spaces for each hard tab", + "type": "integer", + "minimum": 0, + "default": 1 + } + }, + "additionalProperties": false }, "MD011": { - "description": "MD011/no-reversed-links - Reversed link syntax", + "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md011.md", "type": "boolean", "default": true }, "no-reversed-links": { - "$ref": "#/properties/MD011" + "description": "MD011/no-reversed-links : Reversed link syntax : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md011.md", + "type": "boolean", + "default": true }, "MD012": { - "description": "MD012/no-multiple-blanks - Multiple consecutive blank lines", + "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md012.md", "type": [ "boolean", "object" @@ -247,10 +333,24 @@ "additionalProperties": false }, "no-multiple-blanks": { - "$ref": "#/properties/MD012" + "description": "MD012/no-multiple-blanks : Multiple consecutive blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md012.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "maximum": { + "description": "Consecutive blank lines", + "type": "integer", + "minimum": 1, + "default": 1 + } + }, + "additionalProperties": false }, "MD013": { - "description": "MD013/line-length - Line length", + "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md013.md", "type": [ "boolean", "object" @@ -290,7 +390,56 @@ "type": "boolean", "default": true }, - "headers": { + "strict": { + "description": "Strict length checking", + "type": "boolean", + "default": false + }, + "stern": { + "description": "Stern length checking", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "line-length": { + "description": "MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md013.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "line_length": { + "description": "Number of characters", + "type": "integer", + "minimum": 1, + "default": 80 + }, + "heading_line_length": { + "description": "Number of characters for headings", + "type": "integer", + "minimum": 1, + "default": 80 + }, + "code_block_line_length": { + "description": "Number of characters for code blocks", + "type": "integer", + "minimum": 1, + "default": 80 + }, + "code_blocks": { + "description": "Include code blocks", + "type": "boolean", + "default": true + }, + "tables": { + "description": "Include tables", + "type": "boolean", + "default": true + }, + "headings": { "description": "Include headings", "type": "boolean", "default": true @@ -308,51 +457,58 @@ }, "additionalProperties": false }, - "line-length": { - "$ref": "#/properties/MD013" - }, "MD014": { - "description": "MD014/commands-show-output - Dollar signs used before commands without showing output", + "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md014.md", "type": "boolean", "default": true }, "commands-show-output": { - "$ref": "#/properties/MD014" + "description": "MD014/commands-show-output : Dollar signs used before commands without showing output : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md014.md", + "type": "boolean", + "default": true }, "MD018": { - "description": "MD018/no-missing-space-atx - No space after hash on atx style heading", + "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md018.md", "type": "boolean", "default": true }, "no-missing-space-atx": { - "$ref": "#/properties/MD018" + "description": "MD018/no-missing-space-atx : No space after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md018.md", + "type": "boolean", + "default": true }, "MD019": { - "description": "MD019/no-multiple-space-atx - Multiple spaces after hash on atx style heading", + "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md019.md", "type": "boolean", "default": true }, "no-multiple-space-atx": { - "$ref": "#/properties/MD019" + "description": "MD019/no-multiple-space-atx : Multiple spaces after hash on atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.32.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", + "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md020.md", "type": "boolean", "default": true }, "no-missing-space-closed-atx": { - "$ref": "#/properties/MD020" + "description": "MD020/no-missing-space-closed-atx : No space inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.32.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", + "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md021.md", "type": "boolean", "default": true }, "no-multiple-space-closed-atx": { - "$ref": "#/properties/MD021" + "description": "MD021/no-multiple-space-closed-atx : Multiple spaces inside hashes on closed atx style heading : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md021.md", + "type": "boolean", + "default": true }, "MD022": { - "description": "MD022/blanks-around-headings/blanks-around-headers - Headings should be surrounded by blank lines", + "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md022.md", "type": [ "boolean", "object" @@ -387,24 +543,52 @@ "additionalProperties": false }, "blanks-around-headings": { - "$ref": "#/properties/MD022" - }, - "blanks-around-headers": { - "$ref": "#/properties/MD022" + "description": "MD022/blanks-around-headings : Headings should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md022.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "lines_above": { + "description": "Blank lines above heading", + "type": [ + "integer", + "array" + ], + "items": { + "type": "integer" + }, + "minimum": -1, + "default": 1 + }, + "lines_below": { + "description": "Blank lines below heading", + "type": [ + "integer", + "array" + ], + "items": { + "type": "integer" + }, + "minimum": -1, + "default": 1 + } + }, + "additionalProperties": false }, "MD023": { - "description": "MD023/heading-start-left/header-start-left - Headings must start at the beginning of the line", + "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md023.md", "type": "boolean", "default": true }, "heading-start-left": { - "$ref": "#/properties/MD023" - }, - "header-start-left": { - "$ref": "#/properties/MD023" + "description": "MD023/heading-start-left : Headings must start at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md023.md", + "type": "boolean", + "default": true }, "MD024": { - "description": "MD024/no-duplicate-heading/no-duplicate-header - Multiple headings with the same content", + "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md024.md", "type": [ "boolean", "object" @@ -425,42 +609,97 @@ "additionalProperties": false }, "no-duplicate-heading": { - "$ref": "#/properties/MD024" - }, - "no-duplicate-header": { - "$ref": "#/properties/MD024" - }, - "MD025": { - "description": "MD025/single-title/single-h1 - Multiple top-level headings in the same document", + "description": "MD024/no-duplicate-heading : Multiple headings with the same content : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md024.md", "type": [ "boolean", "object" ], "default": true, "properties": { - "level": { - "description": "Heading level", - "type": "integer", - "minimum": 1, - "maximum": 6, - "default": 1 + "allow_different_nesting": { + "description": "Only check sibling headings", + "type": "boolean", + "default": false }, - "front_matter_title": { - "description": "RegExp for matching title in front matter", - "type": "string", + "siblings_only": { + "description": "Only check sibling headings", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "MD025": { + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md025.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "level": { + "description": "Heading level", + "type": "integer", + "minimum": 1, + "maximum": 6, + "default": 1 + }, + "front_matter_title": { + "description": "RegExp for matching title in front matter", + "type": "string", "default": "^\\s*title\\s*[:=]" } }, "additionalProperties": false }, "single-title": { - "$ref": "#/properties/MD025" + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md025.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "level": { + "description": "Heading level", + "type": "integer", + "minimum": 1, + "maximum": 6, + "default": 1 + }, + "front_matter_title": { + "description": "RegExp for matching title in front matter", + "type": "string", + "default": "^\\s*title\\s*[:=]" + } + }, + "additionalProperties": false }, "single-h1": { - "$ref": "#/properties/MD025" + "description": "MD025/single-title/single-h1 : Multiple top-level headings in the same document : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md025.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "level": { + "description": "Heading level", + "type": "integer", + "minimum": 1, + "maximum": 6, + "default": 1 + }, + "front_matter_title": { + "description": "RegExp for matching title in front matter", + "type": "string", + "default": "^\\s*title\\s*[:=]" + } + }, + "additionalProperties": false }, "MD026": { - "description": "MD026/no-trailing-punctuation - Trailing punctuation in heading", + "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md026.md", "type": [ "boolean", "object" @@ -476,26 +715,43 @@ "additionalProperties": false }, "no-trailing-punctuation": { - "$ref": "#/properties/MD026" + "description": "MD026/no-trailing-punctuation : Trailing punctuation in heading : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md026.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "punctuation": { + "description": "Punctuation characters", + "type": "string", + "default": ".,;:!。,;:!" + } + }, + "additionalProperties": false }, "MD027": { - "description": "MD027/no-multiple-space-blockquote - Multiple spaces after blockquote symbol", + "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md027.md", "type": "boolean", "default": true }, "no-multiple-space-blockquote": { - "$ref": "#/properties/MD027" + "description": "MD027/no-multiple-space-blockquote : Multiple spaces after blockquote symbol : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md027.md", + "type": "boolean", + "default": true }, "MD028": { - "description": "MD028/no-blanks-blockquote - Blank line inside blockquote", + "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md028.md", "type": "boolean", "default": true }, "no-blanks-blockquote": { - "$ref": "#/properties/MD028" + "description": "MD028/no-blanks-blockquote : Blank line inside blockquote : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md028.md", + "type": "boolean", + "default": true }, "MD029": { - "description": "MD029/ol-prefix - Ordered list item prefix", + "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md029.md", "type": [ "boolean", "object" @@ -517,10 +773,29 @@ "additionalProperties": false }, "ol-prefix": { - "$ref": "#/properties/MD029" + "description": "MD029/ol-prefix : Ordered list item prefix : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md029.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "style": { + "description": "List style", + "type": "string", + "enum": [ + "one", + "ordered", + "one_or_ordered", + "zero" + ], + "default": "one_or_ordered" + } + }, + "additionalProperties": false }, "MD030": { - "description": "MD030/list-marker-space - Spaces after list markers", + "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md030.md", "type": [ "boolean", "object" @@ -555,10 +830,42 @@ "additionalProperties": false }, "list-marker-space": { - "$ref": "#/properties/MD030" + "description": "MD030/list-marker-space : Spaces after list markers : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md030.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "ul_single": { + "description": "Spaces for single-line unordered list items", + "type": "integer", + "minimum": 1, + "default": 1 + }, + "ol_single": { + "description": "Spaces for single-line ordered list items", + "type": "integer", + "minimum": 1, + "default": 1 + }, + "ul_multi": { + "description": "Spaces for multi-line unordered list items", + "type": "integer", + "minimum": 1, + "default": 1 + }, + "ol_multi": { + "description": "Spaces for multi-line ordered list items", + "type": "integer", + "minimum": 1, + "default": 1 + } + }, + "additionalProperties": false }, "MD031": { - "description": "MD031/blanks-around-fences - Fenced code blocks should be surrounded by blank lines", + "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md031.md", "type": [ "boolean", "object" @@ -574,18 +881,33 @@ "additionalProperties": false }, "blanks-around-fences": { - "$ref": "#/properties/MD031" + "description": "MD031/blanks-around-fences : Fenced code blocks should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md031.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "list_items": { + "description": "Include list items", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false }, "MD032": { - "description": "MD032/blanks-around-lists - Lists should be surrounded by blank lines", + "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md032.md", "type": "boolean", "default": true }, "blanks-around-lists": { - "$ref": "#/properties/MD032" + "description": "MD032/blanks-around-lists : Lists should be surrounded by blank lines : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md032.md", + "type": "boolean", + "default": true }, "MD033": { - "description": "MD033/no-inline-html - Inline HTML", + "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md033.md", "type": [ "boolean", "object" @@ -604,18 +926,36 @@ "additionalProperties": false }, "no-inline-html": { - "$ref": "#/properties/MD033" + "description": "MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md033.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "allowed_elements": { + "description": "Allowed elements", + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "additionalProperties": false }, "MD034": { - "description": "MD034/no-bare-urls - Bare URL used", + "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md034.md", "type": "boolean", "default": true }, "no-bare-urls": { - "$ref": "#/properties/MD034" + "description": "MD034/no-bare-urls : Bare URL used : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md034.md", + "type": "boolean", + "default": true }, "MD035": { - "description": "MD035/hr-style - Horizontal rule style", + "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md035.md", "type": [ "boolean", "object" @@ -631,10 +971,23 @@ "additionalProperties": false }, "hr-style": { - "$ref": "#/properties/MD035" + "description": "MD035/hr-style : Horizontal rule style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md035.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "style": { + "description": "Horizontal rule style", + "type": "string", + "default": "consistent" + } + }, + "additionalProperties": false }, "MD036": { - "description": "MD036/no-emphasis-as-heading/no-emphasis-as-header - Emphasis used instead of a heading", + "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md036.md", "type": [ "boolean", "object" @@ -650,37 +1003,53 @@ "additionalProperties": false }, "no-emphasis-as-heading": { - "$ref": "#/properties/MD036" - }, - "no-emphasis-as-header": { - "$ref": "#/properties/MD036" + "description": "MD036/no-emphasis-as-heading : Emphasis used instead of a heading : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md036.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "punctuation": { + "description": "Punctuation characters", + "type": "string", + "default": ".,;:!?。,;:!?" + } + }, + "additionalProperties": false }, "MD037": { - "description": "MD037/no-space-in-emphasis - Spaces inside emphasis markers", + "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md037.md", "type": "boolean", "default": true }, "no-space-in-emphasis": { - "$ref": "#/properties/MD037" + "description": "MD037/no-space-in-emphasis : Spaces inside emphasis markers : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md037.md", + "type": "boolean", + "default": true }, "MD038": { - "description": "MD038/no-space-in-code - Spaces inside code span elements", + "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md038.md", "type": "boolean", "default": true }, "no-space-in-code": { - "$ref": "#/properties/MD038" + "description": "MD038/no-space-in-code : Spaces inside code span elements : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md038.md", + "type": "boolean", + "default": true }, "MD039": { - "description": "MD039/no-space-in-links - Spaces inside link text", + "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md039.md", "type": "boolean", "default": true }, "no-space-in-links": { - "$ref": "#/properties/MD039" + "description": "MD039/no-space-in-links : Spaces inside link text : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md039.md", + "type": "boolean", + "default": true }, "MD040": { - "description": "MD040/fenced-code-language - Fenced code blocks should have a language specified", + "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md040.md", "type": [ "boolean", "object" @@ -704,10 +1073,31 @@ "additionalProperties": false }, "fenced-code-language": { - "$ref": "#/properties/MD040" + "description": "MD040/fenced-code-language : Fenced code blocks should have a language specified : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md040.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "allowed_languages": { + "description": "List of languages", + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "language_only": { + "description": "Require language only", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false }, "MD041": { - "description": "MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level 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.32.1/doc/md041.md", "type": [ "boolean", "object" @@ -730,21 +1120,63 @@ "additionalProperties": false }, "first-line-heading": { - "$ref": "#/properties/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.32.1/doc/md041.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "level": { + "description": "Heading level", + "type": "integer", + "minimum": 1, + "maximum": 6, + "default": 1 + }, + "front_matter_title": { + "description": "RegExp for matching title in front matter", + "type": "string", + "default": "^\\s*title\\s*[:=]" + } + }, + "additionalProperties": false }, "first-line-h1": { - "$ref": "#/properties/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.32.1/doc/md041.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "level": { + "description": "Heading level", + "type": "integer", + "minimum": 1, + "maximum": 6, + "default": 1 + }, + "front_matter_title": { + "description": "RegExp for matching title in front matter", + "type": "string", + "default": "^\\s*title\\s*[:=]" + } + }, + "additionalProperties": false }, "MD042": { - "description": "MD042/no-empty-links - No empty links", + "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md042.md", "type": "boolean", "default": true }, "no-empty-links": { - "$ref": "#/properties/MD042" + "description": "MD042/no-empty-links : No empty links : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md042.md", + "type": "boolean", + "default": true }, "MD043": { - "description": "MD043/required-headings/required-headers - Required heading structure", + "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md043.md", "type": [ "boolean", "object" @@ -760,7 +1192,23 @@ }, "default": [] }, - "headers": { + "match_case": { + "description": "Match case of headings", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "required-headings": { + "description": "MD043/required-headings : Required heading structure : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md043.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "headings": { "description": "List of headings", "type": "array", "items": { @@ -777,14 +1225,8 @@ }, "additionalProperties": false }, - "required-headings": { - "$ref": "#/properties/MD043" - }, - "required-headers": { - "$ref": "#/properties/MD043" - }, "MD044": { - "description": "MD044/proper-names - Proper names should have the correct capitalization", + "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md044.md", "type": [ "boolean", "object" @@ -813,18 +1255,46 @@ "additionalProperties": false }, "proper-names": { - "$ref": "#/properties/MD044" + "description": "MD044/proper-names : Proper names should have the correct capitalization : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md044.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "names": { + "description": "List of proper names", + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "code_blocks": { + "description": "Include code blocks", + "type": "boolean", + "default": true + }, + "html_elements": { + "description": "Include HTML elements", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false }, "MD045": { - "description": "MD045/no-alt-text - Images should have alternate text (alt text)", + "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md045.md", "type": "boolean", "default": true }, "no-alt-text": { - "$ref": "#/properties/MD045" + "description": "MD045/no-alt-text : Images should have alternate text (alt text) : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md045.md", + "type": "boolean", + "default": true }, "MD046": { - "description": "MD046/code-block-style - Code block style", + "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md046.md", "type": [ "boolean", "object" @@ -845,18 +1315,38 @@ "additionalProperties": false }, "code-block-style": { - "$ref": "#/properties/MD046" + "description": "MD046/code-block-style : Code block style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md046.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "style": { + "description": "Block style", + "type": "string", + "enum": [ + "consistent", + "fenced", + "indented" + ], + "default": "consistent" + } + }, + "additionalProperties": false }, "MD047": { - "description": "MD047/single-trailing-newline - Files should end with a single newline character", + "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md047.md", "type": "boolean", "default": true }, "single-trailing-newline": { - "$ref": "#/properties/MD047" + "description": "MD047/single-trailing-newline : Files should end with a single newline character : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md047.md", + "type": "boolean", + "default": true }, "MD048": { - "description": "MD048/code-fence-style - Code fence style", + "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md048.md", "type": [ "boolean", "object" @@ -877,10 +1367,28 @@ "additionalProperties": false }, "code-fence-style": { - "$ref": "#/properties/MD048" + "description": "MD048/code-fence-style : Code fence style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md048.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "style": { + "description": "Code fence style", + "type": "string", + "enum": [ + "consistent", + "backtick", + "tilde" + ], + "default": "consistent" + } + }, + "additionalProperties": false }, "MD049": { - "description": "MD049/emphasis-style - Emphasis style should be consistent", + "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md049.md", "type": [ "boolean", "object" @@ -901,10 +1409,28 @@ "additionalProperties": false }, "emphasis-style": { - "$ref": "#/properties/MD049" + "description": "MD049/emphasis-style : Emphasis style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md049.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "style": { + "description": "Emphasis style", + "type": "string", + "enum": [ + "consistent", + "asterisk", + "underscore" + ], + "default": "consistent" + } + }, + "additionalProperties": false }, "MD050": { - "description": "MD050/strong-style - Strong style should be consistent", + "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md050.md", "type": [ "boolean", "object" @@ -925,18 +1451,38 @@ "additionalProperties": false }, "strong-style": { - "$ref": "#/properties/MD050" + "description": "MD050/strong-style : Strong style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md050.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "style": { + "description": "Strong style", + "type": "string", + "enum": [ + "consistent", + "asterisk", + "underscore" + ], + "default": "consistent" + } + }, + "additionalProperties": false }, "MD051": { - "description": "MD051/link-fragments - Link fragments should be valid", + "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md051.md", "type": "boolean", "default": true }, "link-fragments": { - "$ref": "#/properties/MD051" + "description": "MD051/link-fragments : Link fragments should be valid : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md051.md", + "type": "boolean", + "default": true }, "MD052": { - "description": "MD052/reference-links-images - Reference links and images should use a label that is defined", + "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md052.md", "type": [ "boolean", "object" @@ -952,10 +1498,23 @@ "additionalProperties": false }, "reference-links-images": { - "$ref": "#/properties/MD052" + "description": "MD052/reference-links-images : Reference links and images should use a label that is defined : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md052.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "shortcut_syntax": { + "description": "Include shortcut syntax", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false }, "MD053": { - "description": "MD053/link-image-reference-definitions - Link and image reference definitions should be needed", + "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md053.md", "type": [ "boolean", "object" @@ -976,125 +1535,220 @@ "additionalProperties": false }, "link-image-reference-definitions": { - "$ref": "#/properties/MD053" + "description": "MD053/link-image-reference-definitions : Link and image reference definitions should be needed : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md053.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "ignored_definitions": { + "description": "Ignored definitions", + "type": "array", + "items": { + "type": "string" + }, + "default": [ + "//" + ] + } + }, + "additionalProperties": false }, - "headings": { - "description": "headings - MD001, MD002, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043", - "type": "boolean", - "default": true + "MD054": { + "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md054.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "autolink": { + "description": "Allow autolinks", + "type": "boolean", + "default": true + }, + "inline": { + "description": "Allow inline links and images", + "type": "boolean", + "default": true + }, + "full": { + "description": "Allow full reference links and images", + "type": "boolean", + "default": true + }, + "collapsed": { + "description": "Allow collapsed reference links and images", + "type": "boolean", + "default": true + }, + "shortcut": { + "description": "Allow shortcut reference links and images", + "type": "boolean", + "default": true + }, + "url_inline": { + "description": "Allow URLs as inline links", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false }, - "headers": { - "description": "headers - MD001, MD002, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043", + "link-image-style": { + "description": "MD054/link-image-style : Link and image style : https://github.com/DavidAnson/markdownlint/blob/v0.32.1/doc/md054.md", + "type": [ + "boolean", + "object" + ], + "default": true, + "properties": { + "autolink": { + "description": "Allow autolinks", + "type": "boolean", + "default": true + }, + "inline": { + "description": "Allow inline links and images", + "type": "boolean", + "default": true + }, + "full": { + "description": "Allow full reference links and images", + "type": "boolean", + "default": true + }, + "collapsed": { + "description": "Allow collapsed reference links and images", + "type": "boolean", + "default": true + }, + "shortcut": { + "description": "Allow shortcut reference links and images", + "type": "boolean", + "default": true + }, + "url_inline": { + "description": "Allow URLs as inline links", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + }, + "headings": { + "description": "headings : MD001, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043", "type": "boolean", "default": true }, "bullet": { - "description": "bullet - MD004, MD005, MD006, MD007, MD032", + "description": "bullet : MD004, MD005, MD007, MD032", "type": "boolean", "default": true }, "ul": { - "description": "ul - MD004, MD005, MD006, MD007, MD030, MD032", + "description": "ul : MD004, MD005, MD007, MD030, MD032", "type": "boolean", "default": true }, "indentation": { - "description": "indentation - MD005, MD006, MD007, MD027", + "description": "indentation : MD005, MD007, MD027", "type": "boolean", "default": true }, "whitespace": { - "description": "whitespace - MD009, MD010, MD012, MD027, MD028, MD030, MD037, MD038, MD039", + "description": "whitespace : MD009, MD010, MD012, MD027, MD028, MD030, MD037, MD038, MD039", "type": "boolean", "default": true }, "hard_tab": { - "description": "hard_tab - MD010", + "description": "hard_tab : MD010", "type": "boolean", "default": true }, "links": { - "description": "links - MD011, MD034, MD039, MD042, MD051, MD052, MD053", + "description": "links : MD011, MD034, MD039, MD042, MD051, MD052, MD053, MD054", "type": "boolean", "default": true }, "blank_lines": { - "description": "blank_lines - MD012, MD022, MD031, MD032, MD047", + "description": "blank_lines : MD012, MD022, MD031, MD032, MD047", "type": "boolean", "default": true }, "line_length": { - "description": "line_length - MD013", + "description": "line_length : MD013", "type": "boolean", "default": true }, "code": { - "description": "code - MD014, MD031, MD038, MD040, MD046, MD048", + "description": "code : MD014, MD031, MD038, MD040, MD046, MD048", "type": "boolean", "default": true }, "atx": { - "description": "atx - MD018, MD019", + "description": "atx : MD018, MD019", "type": "boolean", "default": true }, "spaces": { - "description": "spaces - MD018, MD019, MD020, MD021, MD023", + "description": "spaces : MD018, MD019, MD020, MD021, MD023", "type": "boolean", "default": true }, "atx_closed": { - "description": "atx_closed - MD020, MD021", + "description": "atx_closed : MD020, MD021", "type": "boolean", "default": true }, "blockquote": { - "description": "blockquote - MD027, MD028", + "description": "blockquote : MD027, MD028", "type": "boolean", "default": true }, "ol": { - "description": "ol - MD029, MD030, MD032", + "description": "ol : MD029, MD030, MD032", "type": "boolean", "default": true }, "html": { - "description": "html - MD033", + "description": "html : MD033", "type": "boolean", "default": true }, "url": { - "description": "url - MD034", + "description": "url : MD034", "type": "boolean", "default": true }, "hr": { - "description": "hr - MD035", + "description": "hr : MD035", "type": "boolean", "default": true }, "emphasis": { - "description": "emphasis - MD036, MD037, MD049, MD050", + "description": "emphasis : MD036, MD037, MD049, MD050", "type": "boolean", "default": true }, "language": { - "description": "language - MD040", + "description": "language : MD040", "type": "boolean", "default": true }, "spelling": { - "description": "spelling - MD044", + "description": "spelling : MD044", "type": "boolean", "default": true }, "accessibility": { - "description": "accessibility - MD045", + "description": "accessibility : MD045", "type": "boolean", "default": true }, "images": { - "description": "images - MD045, MD052, MD053", + "description": "images : MD045, MD052, MD053, MD054", "type": "boolean", "default": true } diff --git a/test/markdownlint-cli2-test.js b/test/markdownlint-cli2-test.js index c088f200..1485808a 100644 --- a/test/markdownlint-cli2-test.js +++ b/test/markdownlint-cli2-test.js @@ -12,8 +12,6 @@ const jsonSchemaVersion = "http://json-schema.org/draft-07/schema#"; const markdownlintConfigSchemaUri = "https://raw.githubusercontent.com/DavidAnson/markdownlint-cli2/main/schema/markdownlint-config-schema.json"; const markdownlintConfigSchemaDefinition = require("../schema/markdownlint-config-schema.json"); -// @ts-ignore -markdownlintConfigSchemaDefinition.$schema = jsonSchemaVersion; const markdownlintCli2ConfigSchemaUri = "https://raw.githubusercontent.com/DavidAnson/markdownlint-cli2/main/schema/markdownlint-cli2-config-schema.json"; const markdownlintCli2ConfigSchemaDefinition = require("../schema/markdownlint-cli2-config-schema.json"); diff --git a/test/snapshots/markdownlint-cli2-test-exec.js.md b/test/snapshots/markdownlint-cli2-test-exec.js.md index 7bcf2071..4ae49d37 100644 --- a/test/snapshots/markdownlint-cli2-test-exec.js.md +++ b/test/snapshots/markdownlint-cli2-test-exec.js.md @@ -467,7 +467,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -518,7 +518,7 @@ Generated by [AVA](https://avajs.dev). formatterJson: '', formatterJunit: '', formatterSarif: '', - stderr: `dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + stderr: `dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -569,7 +569,7 @@ Generated by [AVA](https://avajs.dev). formatterJson: '', formatterJunit: '', formatterSarif: '', - stderr: `dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + stderr: `dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -597,7 +597,7 @@ Generated by [AVA](https://avajs.dev). formatterJson: '', formatterJunit: '', formatterSarif: '', - stderr: `info.markdown:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + stderr: `info.markdown:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ info.markdown:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ info.markdown:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ info.markdown:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -628,12 +628,12 @@ Generated by [AVA](https://avajs.dev). stderr: `.dir/.about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ .dir/.about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ .dir/.about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - .dir/.subdir/.info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + .dir/.subdir/.info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ .dir/.subdir/.info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ .dir/.subdir/.info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ .dir/.subdir/.info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ .dir/.subdir/.info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ - .dir/.subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + .dir/.subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ .dir/.subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ .dir/.subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ .dir/.subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -641,12 +641,12 @@ Generated by [AVA](https://avajs.dev). .dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ .dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ .dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - .dir/subdir/.info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + .dir/subdir/.info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ .dir/subdir/.info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ .dir/subdir/.info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ .dir/subdir/.info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ .dir/subdir/.info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ - .dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + .dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ .dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ .dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ .dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -659,12 +659,12 @@ Generated by [AVA](https://avajs.dev). dir/.about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/.about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/.about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/.subdir/.info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/.subdir/.info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/.subdir/.info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/.subdir/.info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/.subdir/.info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ dir/.subdir/.info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ - dir/.subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/.subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/.subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/.subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/.subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -672,12 +672,12 @@ Generated by [AVA](https://avajs.dev). dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/.info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/.info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/.info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/.info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/.info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ dir/subdir/.info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -713,7 +713,7 @@ Generated by [AVA](https://avajs.dev). dir/.about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/.about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/.about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/.subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/.subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/.subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/.subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/.subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -721,7 +721,7 @@ Generated by [AVA](https://avajs.dev). dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -749,7 +749,7 @@ Generated by [AVA](https://avajs.dev). formatterJson: '', formatterJunit: '', formatterSarif: '', - stderr: `dir/subdir/info.markdown:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + stderr: `dir/subdir/info.markdown:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.markdown:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.markdown:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.markdown:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -780,7 +780,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.markdown:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.markdown:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.markdown:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.markdown:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.markdown:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -808,7 +808,7 @@ Generated by [AVA](https://avajs.dev). formatterJson: '', formatterJunit: '', formatterSarif: '', - stderr: `dir/subdir/info.markdown:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + stderr: `dir/subdir/info.markdown:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.markdown:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.markdown:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.markdown:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -838,7 +838,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ dir/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ @@ -866,7 +866,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ viewme.md:3:10 MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1]␊ @@ -916,7 +916,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ dir/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ @@ -966,7 +966,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ dir/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ @@ -994,7 +994,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ dir/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ @@ -1100,7 +1100,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ viewme.md:3:10 MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1]␊ @@ -1158,7 +1158,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ viewme.md:3:10 MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1]␊ @@ -1216,7 +1216,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ viewme.md:3:10 MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1]␊ @@ -1243,7 +1243,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ viewme.md:3:10 MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1]␊ @@ -1364,12 +1364,12 @@ Generated by [AVA](https://avajs.dev). stderr: `alt1/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ alt1/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ alt1/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - alt1/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + alt1/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ alt1/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ alt1/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ alt1/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ alt1/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ - alt2/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + alt2/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ alt2/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ alt2/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ alt2/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -1377,7 +1377,7 @@ Generated by [AVA](https://avajs.dev). dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir4/subdir/info.markdown:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir4/subdir/info.markdown:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir4/subdir/info.markdown:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir4/subdir/info.markdown:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir4/subdir/info.markdown:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -1402,7 +1402,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `../markdownlint-json/dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ ../markdownlint-json/dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - ../markdownlint-json/dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + ../markdownlint-json/dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ ../markdownlint-json/dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ ../markdownlint-json/dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ ../markdownlint-json/dir/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ @@ -1430,7 +1430,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `../no-config/dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ ../no-config/dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - ../no-config/dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + ../no-config/dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ ../no-config/dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ ../no-config/dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ ../no-config/viewme.md:3:10 MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1]␊ @@ -1457,10 +1457,10 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:7:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ - dir/subdir2/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir2/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ viewme.md:3:10 MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1]␊ viewme.md:6 MD025/single-title/single-h1 Multiple top-level headings in the same document [Context: "# Description"]␊ viewme.md:12:1 MD019/no-multiple-space-atx Multiple spaces after hash on atx style heading [Context: "## Summary"]␊ @@ -1484,8 +1484,8 @@ Generated by [AVA](https://avajs.dev). formatterJunit: '', formatterSarif: '', stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ - dir/subdir2/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir2/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ viewme.md:3:10 MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1]␊ viewme.md:6 MD025/single-title/single-h1 Multiple top-level headings in the same document [Context: "# Description"]␊ viewme.md:12:1 MD019/no-multiple-space-atx Multiple spaces after hash on atx style heading [Context: "## Summary"]␊ @@ -1598,7 +1598,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/about.md:6:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ - dir/subdir2/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir2/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir2/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir2/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir2/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -1624,10 +1624,10 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `no-fixable-issues.md:3:13 MD033/no-inline-html Inline HTML [Element: br]␊ no-fixable-issues.md:5 MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "\`\`\`"]␊ - no-fixable-issues.md:9 MD036/no-emphasis-as-heading/no-emphasis-as-header Emphasis used instead of a heading [Context: "Emphasis as heading"]␊ + no-fixable-issues.md:9 MD036/no-emphasis-as-heading Emphasis used instead of a heading [Context: "Emphasis as heading"]␊ some-fixable-issues.md:3:13 MD033/no-inline-html Inline HTML [Element: br]␊ some-fixable-issues.md:7 MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "\`\`\`"]␊ - some-fixable-issues.md:13 MD036/no-emphasis-as-heading/no-emphasis-as-header Emphasis used instead of a heading [Context: "Emphasis as heading"]␊ + some-fixable-issues.md:13 MD036/no-emphasis-as-heading Emphasis used instead of a heading [Context: "Emphasis as heading"]␊ `, stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ Finding: **/*.md␊ @@ -1648,17 +1648,17 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ - dir2/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir2/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir2/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir2/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir2/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ dir2/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ - dir2/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir2/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir2/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir2/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir2/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ dir2/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ - dir3/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir3/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir3/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir3/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir3/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -1708,17 +1708,17 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ - dir2/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir2/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir2/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir2/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir2/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ dir2/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ - dir2/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir2/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir2/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir2/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir2/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ dir2/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ - dir3/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir3/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir3/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir3/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir3/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -3632,7 +3632,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ viewme.md:3:10 MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1]␊ @@ -3693,7 +3693,7 @@ Generated by [AVA](https://avajs.dev). formatterSarif: '', stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ viewme.md:3:10 MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1]␊ @@ -3729,18 +3729,18 @@ Generated by [AVA](https://avajs.dev). dir/subdir/hr.md:3 sample-rule-commonjs Sample rule (commonjs) [Sample error for hr]␊ dir/subdir/hr.md:3 sample-rule-module Sample rule (module) [Sample error for hr]␊ dir/subdir/info.md:1 first-line Rule that reports an error for the first line␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ dir/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ - dir/subdir2/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir2/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir2/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir2/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir2/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ dir/subdir2/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ dir/subdir3/info.md:1 first-line Rule that reports an error for the first line␊ - dir/subdir3/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir3/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir3/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir3/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir3/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -3936,10 +3936,10 @@ Generated by [AVA](https://avajs.dev). },␊ {␊ "type": "issue",␊ - "check_name": "MD022/blanks-around-headings/blanks-around-headers",␊ - "description": "MD022/blanks-around-headings/blanks-around-headers: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below]",␊ + "check_name": "MD022/blanks-around-headings",␊ + "description": "MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below]",␊ "severity": "minor",␊ - "fingerprint": "615bea407dd4cd503b5ab10841a503b6479c1acfe0a628fc19c3837032e64629",␊ + "fingerprint": "5161c78dcdb7c171057c40cdeb5d6c26f317475e1e8c549dd25c8d1ecd805b18",␊ "location": {␊ "path": "dir/subdir/info.md",␊ "lines": {␊ @@ -4125,8 +4125,7 @@ Generated by [AVA](https://avajs.dev). "lineNumber": 1,␊ "ruleNames": [␊ "MD022",␊ - "blanks-around-headings",␊ - "blanks-around-headers"␊ + "blanks-around-headings"␊ ],␊ "ruleDescription": "Headings should be surrounded by blank lines",␊ "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md022.md",␊ @@ -4315,7 +4314,7 @@ Generated by [AVA](https://avajs.dev). ␊ - ␊ + ␊ @@ -4393,7 +4392,7 @@ Generated by [AVA](https://avajs.dev). },␊ {␊ "id": "MD022",␊ - "name": "Md022BlanksAroundHeadingsBlanksAroundHeaders",␊ + "name": "Md022BlanksAroundHeadings",␊ "shortDescription": {␊ "text": "Headings should be surrounded by blank lines"␊ },␊ @@ -4751,7 +4750,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -4817,10 +4816,10 @@ Generated by [AVA](https://avajs.dev). },␊ {␊ "type": "issue",␊ - "check_name": "MD022/blanks-around-headings/blanks-around-headers",␊ - "description": "MD022/blanks-around-headings/blanks-around-headers: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below]",␊ + "check_name": "MD022/blanks-around-headings",␊ + "description": "MD022/blanks-around-headings: Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below]",␊ "severity": "minor",␊ - "fingerprint": "615bea407dd4cd503b5ab10841a503b6479c1acfe0a628fc19c3837032e64629",␊ + "fingerprint": "5161c78dcdb7c171057c40cdeb5d6c26f317475e1e8c549dd25c8d1ecd805b18",␊ "location": {␊ "path": "dir/subdir/info.md",␊ "lines": {␊ @@ -5006,8 +5005,7 @@ Generated by [AVA](https://avajs.dev). "lineNumber": 1,␊ "ruleNames": [␊ "MD022",␊ - "blanks-around-headings",␊ - "blanks-around-headers"␊ + "blanks-around-headings"␊ ],␊ "ruleDescription": "Headings should be surrounded by blank lines",␊ "ruleInformation": "https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md022.md",␊ @@ -5196,7 +5194,7 @@ Generated by [AVA](https://avajs.dev). ␊ - ␊ + ␊ @@ -5274,7 +5272,7 @@ Generated by [AVA](https://avajs.dev). },␊ {␊ "id": "MD022",␊ - "name": "Md022BlanksAroundHeadingsBlanksAroundHeaders",␊ + "name": "Md022BlanksAroundHeadings",␊ "shortDescription": {␊ "text": "Headings should be surrounded by blank lines"␊ },␊ @@ -5632,7 +5630,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -5645,7 +5643,7 @@ Generated by [AVA](https://avajs.dev). dir/about.md:1:1 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md021.mdMD021/no-multiple-space-closed-atx]8;; Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md032.mdMD032/blanks-around-lists]8;; Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md029.mdMD029/ol-prefix]8;; Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md022.mdMD022/blanks-around-headings/blanks-around-headers]8;; Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md022.mdMD022/blanks-around-headings]8;; Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md041.mdMD041/first-line-heading/first-line-h1]8;; First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md038.mdMD038/no-space-in-code]8;; Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md038.mdMD038/no-space-in-code]8;; Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -6648,7 +6646,7 @@ Generated by [AVA](https://avajs.dev). 2 MD012/no-multiple-blanks␊ 1 MD019/no-multiple-space-atx␊ 1 MD021/no-multiple-space-closed-atx␊ - 1 MD022/blanks-around-headings/blanks-around-headers␊ + 1 MD022/blanks-around-headings␊ 1 MD025/single-title/single-h1␊ 1 MD029/ol-prefix␊ 1 MD032/blanks-around-lists␊ @@ -6665,7 +6663,7 @@ Generated by [AVA](https://avajs.dev). dir/subdir/info.md␊ Count Rule␊ 1 MD012/no-multiple-blanks␊ - 1 MD022/blanks-around-headings/blanks-around-headers␊ + 1 MD022/blanks-around-headings␊ 2 MD038/no-space-in-code␊ 1 MD041/first-line-heading/first-line-h1␊ 5 [Total]␊ @@ -6694,7 +6692,7 @@ Generated by [AVA](https://avajs.dev). Count File␊ 1 dir/about.md␊ 1 [Total]␊ - MD022/blanks-around-headings/blanks-around-headers␊ + MD022/blanks-around-headings␊ Count File␊ 1 dir/subdir/info.md␊ 1 [Total]␊ @@ -6738,7 +6736,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md021.mdMD021/no-multiple-space-closed-atx]8;; Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md032.mdMD032/blanks-around-lists]8;; Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md029.mdMD029/ol-prefix]8;; Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md022.mdMD022/blanks-around-headings/blanks-around-headers]8;; Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md022.mdMD022/blanks-around-headings]8;; Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md041.mdMD041/first-line-heading/first-line-h1]8;; First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md038.mdMD038/no-space-in-code]8;; Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 ]8;;https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md038.mdMD038/no-space-in-code]8;; Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -6769,7 +6767,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"] https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md021.md␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"] https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md032.md␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3] https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md029.md␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"] https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md022.md␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"] https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md022.md␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"] https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md041.md␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"] https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md038.md␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"] https://github.com/DavidAnson/markdownlint/blob/vX.Y.Z/doc/md038.md␊ @@ -6798,11 +6796,11 @@ Generated by [AVA](https://avajs.dev). formatterJson: '', formatterJunit: '', formatterSarif: '', - stderr: `markdownlint-cli2-jsonc/dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + stderr: `markdownlint-cli2-jsonc/dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ markdownlint-cli2-jsonc/dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ markdownlint-cli2-jsonc/dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ markdownlint-cli2-jsonc/dir/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ - markdownlint-json/dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + markdownlint-json/dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ markdownlint-json/dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ markdownlint-json/dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ markdownlint-json/dir/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ @@ -6874,19 +6872,19 @@ Generated by [AVA](https://avajs.dev). config-options-disjoint/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ config-options-disjoint/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ config-options-overlap-empty/dir/dir/dir/info.md:1 first-line Rule that reports an error for the first line␊ - config-options-overlap-empty/dir/dir/dir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + config-options-overlap-empty/dir/dir/dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ config-options-overlap-empty/dir/dir/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ config-options-overlap-empty/dir/dir/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ config-options-overlap-empty/dir/dir/info.md:1 first-line Rule that reports an error for the first line␊ - config-options-overlap-empty/dir/dir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + config-options-overlap-empty/dir/dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ config-options-overlap-empty/dir/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ config-options-overlap-empty/dir/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ config-options-overlap/dir/dir/dir/info.md:1 first-line Rule that reports an error for the first line␊ - config-options-overlap/dir/dir/dir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + config-options-overlap/dir/dir/dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ config-options-overlap/dir/dir/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ config-options-overlap/dir/dir/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ config-options-overlap/dir/dir/info.md:1 first-line Rule that reports an error for the first line␊ - config-options-overlap/dir/dir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + config-options-overlap/dir/dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ config-options-overlap/dir/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ config-options-overlap/dir/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ config-options-overlap/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ @@ -6906,13 +6904,13 @@ Generated by [AVA](https://avajs.dev). options-config-disjoint/dir/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ options-config-disjoint/dir/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ options-config-disjoint/dir/info.md:1 first-line Rule that reports an error for the first line␊ - options-config-disjoint/dir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + options-config-disjoint/dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ options-config-disjoint/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ options-config-disjoint/dir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ options-config-disjoint/dir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ options-config-disjoint/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ options-config-disjoint/info.md:1 first-line Rule that reports an error for the first line␊ - options-config-disjoint/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + options-config-disjoint/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ options-config-disjoint/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ options-config-disjoint/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ options-config-disjoint/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -6930,11 +6928,11 @@ Generated by [AVA](https://avajs.dev). options-config-overlap/dir/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ options-config-overlap/dir/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ options-config-overlap/dir/info.md:1 first-line Rule that reports an error for the first line␊ - options-config-overlap/dir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + options-config-overlap/dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ options-config-overlap/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ options-config-overlap/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ options-config-overlap/info.md:1 first-line Rule that reports an error for the first line␊ - options-config-overlap/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + options-config-overlap/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ options-config-overlap/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ options-config-overlap/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ `, @@ -7022,7 +7020,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -7053,7 +7051,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -7081,7 +7079,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -7109,7 +7107,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -7221,7 +7219,7 @@ Generated by [AVA](https://avajs.dev). cjs: dir/about.md 4 MD032/blanks-around-lists␊ cjs: dir/about.md 5 MD029/ol-prefix␊ cjs: dir/hr.md 3 sample-rule-commonjs␊ - cjs: dir/subdir/info.md 1 MD022/blanks-around-headings/blanks-around-headers␊ + cjs: dir/subdir/info.md 1 MD022/blanks-around-headings␊ cjs: dir/subdir/info.md 1 MD041/first-line-heading/first-line-h1␊ cjs: dir/subdir/info.md 2 MD038/no-space-in-code␊ cjs: dir/subdir/info.md 2 MD038/no-space-in-code␊ @@ -7253,7 +7251,7 @@ Generated by [AVA](https://avajs.dev). dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ dir/hr.md:3 sample-rule-commonjs Sample rule (commonjs) [Sample error for hr]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ diff --git a/test/snapshots/markdownlint-cli2-test-exec.js.snap b/test/snapshots/markdownlint-cli2-test-exec.js.snap index def58452bbe74c78dcd43b112ec7bab6666c45ca..2620df3397616d8632b7829d61a867ad7435ac55 100644 GIT binary patch literal 14256 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 xB~ALrcrE>2_zxhVbH12@Q%pJnS_#e2hfb9SP literal 5574 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␊ - ␊ + ␊ @@ -3239,7 +3238,7 @@ Generated by [AVA](https://avajs.dev). },␊ {␊ "id": "MD022",␊ - "name": "Md022BlanksAroundHeadingsBlanksAroundHeaders",␊ + "name": "Md022BlanksAroundHeadings",␊ "shortDescription": {␊ "text": "Headings should be surrounded by blank lines"␊ },␊ @@ -3597,7 +3596,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -4595,7 +4594,7 @@ Generated by [AVA](https://avajs.dev). 2 MD012/no-multiple-blanks␊ 1 MD019/no-multiple-space-atx␊ 1 MD021/no-multiple-space-closed-atx␊ - 1 MD022/blanks-around-headings/blanks-around-headers␊ + 1 MD022/blanks-around-headings␊ 1 MD025/single-title/single-h1␊ 1 MD029/ol-prefix␊ 1 MD032/blanks-around-lists␊ @@ -4612,7 +4611,7 @@ Generated by [AVA](https://avajs.dev). dir/subdir/info.md␊ Count Rule␊ 1 MD012/no-multiple-blanks␊ - 1 MD022/blanks-around-headings/blanks-around-headers␊ + 1 MD022/blanks-around-headings␊ 2 MD038/no-space-in-code␊ 1 MD041/first-line-heading/first-line-h1␊ 5 [Total]␊ @@ -4641,7 +4640,7 @@ Generated by [AVA](https://avajs.dev). Count File␊ 1 dir/about.md␊ 1 [Total]␊ - MD022/blanks-around-headings/blanks-around-headers␊ + MD022/blanks-around-headings␊ Count File␊ 1 dir/subdir/info.md␊ 1 [Total]␊ @@ -4682,11 +4681,11 @@ Generated by [AVA](https://avajs.dev). formatterJson: '', formatterJunit: '', formatterSarif: '', - stderr: `markdownlint-cli2-jsonc/dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + stderr: `markdownlint-cli2-jsonc/dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ markdownlint-cli2-jsonc/dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ markdownlint-cli2-jsonc/dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ markdownlint-cli2-jsonc/dir/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ - markdownlint-json/dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + markdownlint-json/dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ markdownlint-json/dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ markdownlint-json/dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ markdownlint-json/dir/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ @@ -4758,19 +4757,19 @@ Generated by [AVA](https://avajs.dev). config-options-disjoint/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ config-options-disjoint/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ config-options-overlap-empty/dir/dir/dir/info.md:1 first-line Rule that reports an error for the first line␊ - config-options-overlap-empty/dir/dir/dir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + config-options-overlap-empty/dir/dir/dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ config-options-overlap-empty/dir/dir/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ config-options-overlap-empty/dir/dir/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ config-options-overlap-empty/dir/dir/info.md:1 first-line Rule that reports an error for the first line␊ - config-options-overlap-empty/dir/dir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + config-options-overlap-empty/dir/dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ config-options-overlap-empty/dir/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ config-options-overlap-empty/dir/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ config-options-overlap/dir/dir/dir/info.md:1 first-line Rule that reports an error for the first line␊ - config-options-overlap/dir/dir/dir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + config-options-overlap/dir/dir/dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ config-options-overlap/dir/dir/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ config-options-overlap/dir/dir/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ config-options-overlap/dir/dir/info.md:1 first-line Rule that reports an error for the first line␊ - config-options-overlap/dir/dir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + config-options-overlap/dir/dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ config-options-overlap/dir/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ config-options-overlap/dir/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ config-options-overlap/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ @@ -4790,13 +4789,13 @@ Generated by [AVA](https://avajs.dev). options-config-disjoint/dir/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ options-config-disjoint/dir/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ options-config-disjoint/dir/info.md:1 first-line Rule that reports an error for the first line␊ - options-config-disjoint/dir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + options-config-disjoint/dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ options-config-disjoint/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ options-config-disjoint/dir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ options-config-disjoint/dir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ options-config-disjoint/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ options-config-disjoint/info.md:1 first-line Rule that reports an error for the first line␊ - options-config-disjoint/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + options-config-disjoint/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ options-config-disjoint/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ options-config-disjoint/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ options-config-disjoint/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -4814,11 +4813,11 @@ Generated by [AVA](https://avajs.dev). options-config-overlap/dir/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ options-config-overlap/dir/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ options-config-overlap/dir/info.md:1 first-line Rule that reports an error for the first line␊ - options-config-overlap/dir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + options-config-overlap/dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ options-config-overlap/dir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ options-config-overlap/dir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ options-config-overlap/info.md:1 first-line Rule that reports an error for the first line␊ - options-config-overlap/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + options-config-overlap/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ options-config-overlap/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ options-config-overlap/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ `, @@ -4842,7 +4841,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -4873,7 +4872,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -4904,7 +4903,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -4935,7 +4934,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -4966,17 +4965,17 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ dir/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ - dir/subdir2/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir2/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir2/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir2/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir2/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ dir/subdir2/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ - dir/subdir3/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir3/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir3/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir3/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir3/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -5097,7 +5096,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -5128,7 +5127,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -5156,7 +5155,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -5184,7 +5183,7 @@ Generated by [AVA](https://avajs.dev). stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ @@ -5296,7 +5295,7 @@ Generated by [AVA](https://avajs.dev). cjs: dir/about.md 4 MD032/blanks-around-lists␊ cjs: dir/about.md 5 MD029/ol-prefix␊ cjs: dir/hr.md 3 sample-rule-commonjs␊ - cjs: dir/subdir/info.md 1 MD022/blanks-around-headings/blanks-around-headers␊ + cjs: dir/subdir/info.md 1 MD022/blanks-around-headings␊ cjs: dir/subdir/info.md 1 MD041/first-line-heading/first-line-h1␊ cjs: dir/subdir/info.md 2 MD038/no-space-in-code␊ cjs: dir/subdir/info.md 2 MD038/no-space-in-code␊ @@ -5328,7 +5327,7 @@ Generated by [AVA](https://avajs.dev). dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ dir/hr.md:3 sample-rule-commonjs Sample rule (commonjs) [Sample error for hr]␊ - dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ diff --git a/test/snapshots/markdownlint-cli2-test-main.js.snap b/test/snapshots/markdownlint-cli2-test-main.js.snap index e7fa95b064aeae6c9b7282f88a15edc84046d8ec..92f8e0f11257dc060512cfc0bb513040707b3193 100644 GIT binary patch literal 12495 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 From 5e661b9a9e5776e98bdbea355c6bfaafab1599aa Mon Sep 17 00:00:00 2001 From: David Anson Date: Wed, 15 Nov 2023 20:44:34 -0800 Subject: [PATCH 34/46] Add new MD054/link-image-style to project-wide .markdownlint.json. --- .markdownlint.json | 7 +++++++ README.md | 6 ++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.markdownlint.json b/.markdownlint.json index 5dc9b8d6..e0b82429 100644 --- a/.markdownlint.json +++ b/.markdownlint.json @@ -31,6 +31,13 @@ "strict": true, "code_blocks": false }, + "link-image-style": { + "autolink": false, + "inline": false, + "full": true, + "collapsed": false, + "shortcut": false + }, "no-duplicate-heading": { "siblings_only": true }, diff --git a/README.md b/README.md index 3c57ba1b..9c6674c5 100644 --- a/README.md +++ b/README.md @@ -172,7 +172,7 @@ docker run -v $PWD:/workdir davidanson/markdownlint-cli2:v0.10.0 "**/*.md" "#nod Notes: -- As when using the [command line](#command-line), glob patterns are passed as +- As when using the [command line][command-line], glob patterns are passed as arguments. - This image is built on the official [Node.js Docker image][nodejs-docker]. Per security best practices, the [default user `node`][nodejs-docker-non-root] @@ -429,8 +429,10 @@ reference to the `repos` list in that project's `.pre-commit-config.yaml` like: ## History -See [CHANGELOG.md](CHANGELOG.md). +See [CHANGELOG.md][changelog]. +[changelog]: CHANGELOG.md +[command-line]: #command-line [commonmark]: https://commonmark.org/ [commonjs-module]: https://nodejs.org/api/modules.html#modules_modules_commonjs_modules [ecmascript-module]: https://nodejs.org/api/esm.html#modules-ecmascript-modules From 725855b82796e412e9a65c2f5dd25042f50ed3db Mon Sep 17 00:00:00 2001 From: David Anson Date: Wed, 15 Nov 2023 20:46:24 -0800 Subject: [PATCH 35/46] Update markdownlint-cli2-formatter-junit to version 0.0.8. --- formatter-junit/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/formatter-junit/package.json b/formatter-junit/package.json index e1ca67d7..33df8830 100644 --- a/formatter-junit/package.json +++ b/formatter-junit/package.json @@ -1,6 +1,6 @@ { "name": "markdownlint-cli2-formatter-junit", - "version": "0.0.7", + "version": "0.0.8", "description": "An output formatter for markdownlint-cli2 that writes results to a file in JUnit XML format", "author": { "name": "David Anson", From 53bf1fc8988710fb4852145b2c02212c60bd0d62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 04:52:37 +0000 Subject: [PATCH 36/46] Bump markdownlint-cli2-formatter-junit from 0.0.7 to 0.0.8 Bumps [markdownlint-cli2-formatter-junit](https://github.com/DavidAnson/markdownlint-cli2) from 0.0.7 to 0.0.8. - [Changelog](https://github.com/DavidAnson/markdownlint-cli2/blob/main/CHANGELOG.md) - [Commits](https://github.com/DavidAnson/markdownlint-cli2/compare/v0.0.7...v0.0.8) --- updated-dependencies: - dependency-name: markdownlint-cli2-formatter-junit 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 f9df8709..9f87a9ce 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "markdown-it-for-inline": "0.1.1", "markdownlint-cli2-formatter-codequality": "0.0.4", "markdownlint-cli2-formatter-json": "0.0.7", - "markdownlint-cli2-formatter-junit": "0.0.7", + "markdownlint-cli2-formatter-junit": "0.0.8", "markdownlint-cli2-formatter-pretty": "0.0.5", "markdownlint-cli2-formatter-sarif": "0.0.1", "markdownlint-cli2-formatter-summarize": "0.0.6", From b09fc7c21c03fdb3a5469fb1e12647d5c623b8ff Mon Sep 17 00:00:00 2001 From: David Anson Date: Wed, 15 Nov 2023 20:58:51 -0800 Subject: [PATCH 37/46] Remove private noErrors parameter to main entry point, hardcode "true" behavior. --- markdownlint-cli2.js | 9 +-------- test/markdownlint-cli2-test.js | 3 +-- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/markdownlint-cli2.js b/markdownlint-cli2.js index 59b6f126..5f87163a 100755 --- a/markdownlint-cli2.js +++ b/markdownlint-cli2.js @@ -473,7 +473,6 @@ const enumerateFiles = async ( baseDir, globPatterns, dirToDirInfo, - noErrors, noRequire ) => { const tasks = []; @@ -482,11 +481,9 @@ const enumerateFiles = async ( "cwd": baseDir, "dot": true, "expandDirectories": false, + "suppressErrors": true, fs }; - if (noErrors) { - globbyOptions.suppressErrors = true; - } // Special-case literal files const literalFiles = []; const filteredGlobPatterns = globPatterns.filter( @@ -608,7 +605,6 @@ const createDirInfos = async ( globPatterns, dirToDirInfo, optionsOverride, - noErrors, noRequire ) => { await enumerateFiles( @@ -617,7 +613,6 @@ const createDirInfos = async ( baseDir, globPatterns, dirToDirInfo, - noErrors, noRequire ); await enumerateParents( @@ -898,7 +893,6 @@ const main = async (params) => { optionsOverride, fileContents, nonFileContents, - noErrors, noGlobs, noRequire, name @@ -989,7 +983,6 @@ const main = async (params) => { globPatterns, dirToDirInfo, optionsOverride, - noErrors, noRequire ); // Output linting status diff --git a/test/markdownlint-cli2-test.js b/test/markdownlint-cli2-test.js index 1485808a..b9feb8ee 100644 --- a/test/markdownlint-cli2-test.js +++ b/test/markdownlint-cli2-test.js @@ -475,8 +475,7 @@ test("custom fs, extension scenario with exception", (t) => { "stat": null, "readdir": null, "readFile": null - }, - "noErrors": true + } }). then((exitCode) => { t.is(exitCode, 0); From be0af89b6de5a54b4ccb0f402c4e33949dfc7cae Mon Sep 17 00:00:00 2001 From: David Anson Date: Wed, 15 Nov 2023 21:19:47 -0800 Subject: [PATCH 38/46] Remove outdated npm scripts. --- package.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/package.json b/package.json index 9f87a9ce..c1df9606 100644 --- a/package.json +++ b/package.json @@ -30,12 +30,9 @@ "build-docker-image": "VERSION=$(node -e \"process.stdout.write(require('./package.json').version)\") && docker build -t davidanson/markdownlint-cli2:v$VERSION -f docker/Dockerfile --label org.opencontainers.image.version=v$VERSION .", "build-docker-image-rules": "VERSION=$(node -e \"process.stdout.write(require('./package.json').version)\") && docker build -t davidanson/markdownlint-cli2-rules:v$VERSION -f docker/Dockerfile-rules --build-arg VERSION=v$VERSION --label org.opencontainers.image.version=v$VERSION .", "ci": "npm-run-all --continue-on-error --parallel test-cover lint schema", - "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", "lint": "eslint --max-warnings 0 --no-eslintrc --config .eslintrc.json .", "lint-dockerfile": "docker run --rm -i hadolint/hadolint:latest-alpine < docker/Dockerfile", "lint-watch": "git ls-files | entr npm run lint", - "publish-docker-image": "VERSION=$(node -e \"process.stdout.write(require('./package.json').version)\") && docker buildx build --platform linux/arm64,linux/amd64 -t davidanson/markdownlint-cli2:v$VERSION -t davidanson/markdownlint-cli2:latest -f docker/Dockerfile --push .", "schema": "cpy ./node_modules/markdownlint/schema/markdownlint-config-schema.json ./schema --flat", "test": "ava --timeout=1m test/append-to-array-test.js test/fs-mock-test.js test/markdownlint-cli2-test.js test/markdownlint-cli2-test-exec.js test/markdownlint-cli2-test-fs.js test/markdownlint-cli2-test-main.js test/merge-options-test.js test/resolve-and-require-test.js", "test-cover": "c8 --100 npm test -- --concurrency=1", @@ -46,7 +43,6 @@ "test-invoke-as-cli": "markdownlint-cli2 CHANGELOG.md", "test-watch": "git ls-files | entr npm run test", "update-snapshots": "ava --timeout=1m --update-snapshots test/markdownlint-cli2-test-exec.js test/markdownlint-cli2-test-fs.js test/markdownlint-cli2-test-main.js", - "upgrade": "npx --yes npm-check-updates --upgrade", "webworker": "cd webworker && webpack --mode none", "webworker-install": "npm run docker-npm-install -- --no-save path-browserify process setimmediate stream-browserify url util webpack-cli" }, From a37b78002020ae953c62cc3ff604c161fcf669b2 Mon Sep 17 00:00:00 2001 From: David Anson Date: Thu, 16 Nov 2023 20:00:24 -0800 Subject: [PATCH 39/46] Work around missing unicorn-magic export from globby in Webpack scenario. --- .eslintrc.json | 3 ++- .gitignore | 1 + package.json | 2 +- webworker/index.html | 2 +- webworker/unicorn-magic-stub.js | 7 +++++++ webworker/webpack.config.js | 6 ++++++ 6 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 webworker/unicorn-magic-stub.js diff --git a/.eslintrc.json b/.eslintrc.json index ac6dade5..9ab4a07b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -18,7 +18,8 @@ ], "ignorePatterns": [ "test/*/**", - "webworker/markdownlint-cli2-webworker.js" + "webworker/markdownlint-cli2-webworker.js", + "webworker/setImmediate.js" ], "reportUnusedDisableDirectives": true, "rules": { diff --git a/.gitignore b/.gitignore index 8bbb9958..f09431b6 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ npm-debug.log !test/markdownItPlugins/module/node_modules !test/outputFormatters-module/node_modules webworker/markdownlint-cli2-webworker.js +webworker/setImmediate.js diff --git a/package.json b/package.json index c1df9606..29f8b206 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "test-watch": "git ls-files | entr npm run test", "update-snapshots": "ava --timeout=1m --update-snapshots test/markdownlint-cli2-test-exec.js test/markdownlint-cli2-test-fs.js test/markdownlint-cli2-test-main.js", "webworker": "cd webworker && webpack --mode none", - "webworker-install": "npm run docker-npm-install -- --no-save path-browserify process setimmediate stream-browserify url util webpack-cli" + "webworker-install": "npm install --no-save path-browserify process setimmediate stream-browserify url util webpack-cli && cpy ./node_modules/setimmediate/setImmediate.js ./webworker --flat" }, "engines": { "node": ">=18" diff --git a/webworker/index.html b/webworker/index.html index 40ecaee0..02e12a89 100644 --- a/webworker/index.html +++ b/webworker/index.html @@ -10,7 +10,7 @@

- + diff --git a/webworker/unicorn-magic-stub.js b/webworker/unicorn-magic-stub.js new file mode 100644 index 00000000..d5d92cc1 --- /dev/null +++ b/webworker/unicorn-magic-stub.js @@ -0,0 +1,7 @@ +// @ts-check + +"use strict"; + +module.exports = { + "toPath": (path) => path +}; diff --git a/webworker/webpack.config.js b/webworker/webpack.config.js index 373ed133..16257da2 100644 --- a/webworker/webpack.config.js +++ b/webworker/webpack.config.js @@ -29,6 +29,12 @@ module.exports = { resource.request = module; } ), + new webpack.NormalModuleReplacementPlugin( + /^unicorn-magic$/u, + (resource) => { + resource.request = require.resolve("./unicorn-magic-stub.js"); + } + ), new webpack.ProvidePlugin({ "process": "process-wrapper" }) From 7e62d4ac4c711dad3cd048473f14944912fa2171 Mon Sep 17 00:00:00 2001 From: David Anson Date: Thu, 16 Nov 2023 20:04:15 -0800 Subject: [PATCH 40/46] Add Web Worker install/Webpack scripts to CI workflow. --- .github/workflows/ci.yml | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d0723c4b..841d622f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,10 @@ jobs: run: npm install --no-package-lock - name: Run All Validations run: npm run ci + - name: Install Dependencies for Web Worker + run: npm run webworker-install + - name: Run Webpack for Web Worker + run: npm run webworker install-global: runs-on: ubuntu-latest diff --git a/package.json b/package.json index 29f8b206..faba08b5 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "test-watch": "git ls-files | entr npm run test", "update-snapshots": "ava --timeout=1m --update-snapshots test/markdownlint-cli2-test-exec.js test/markdownlint-cli2-test-fs.js test/markdownlint-cli2-test-main.js", "webworker": "cd webworker && webpack --mode none", - "webworker-install": "npm install --no-save path-browserify process setimmediate stream-browserify url util webpack-cli && cpy ./node_modules/setimmediate/setImmediate.js ./webworker --flat" + "webworker-install": "npm install --no-package-lock --no-save path-browserify process setimmediate stream-browserify url util webpack-cli && cpy ./node_modules/setimmediate/setImmediate.js ./webworker --flat" }, "engines": { "node": ">=18" From 684f0f17967200e800c2a67a2a759a7fb878c0b5 Mon Sep 17 00:00:00 2001 From: David Anson Date: Thu, 16 Nov 2023 20:19:26 -0800 Subject: [PATCH 41/46] Update (implicit) dependency: QUnit to 2.20.0. --- webworker/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webworker/index.html b/webworker/index.html index 02e12a89..e6f2ec36 100644 --- a/webworker/index.html +++ b/webworker/index.html @@ -4,12 +4,12 @@ markdownlint-cli2 webworker tests - +
- + From 200f711d61f6565d426207f86542318178a28350 Mon Sep 17 00:00:00 2001 From: David Anson Date: Fri, 17 Nov 2023 21:17:40 -0800 Subject: [PATCH 42/46] Simplify Webpack dependencies for Web Worker scenario. --- package.json | 2 +- webworker/process-stub.js | 11 +++++++++++ webworker/process-wrapper.js | 10 ---------- webworker/url-stub.js | 4 +--- webworker/webpack.config.js | 14 +++++++------- 5 files changed, 20 insertions(+), 21 deletions(-) create mode 100644 webworker/process-stub.js delete mode 100644 webworker/process-wrapper.js diff --git a/package.json b/package.json index faba08b5..4e2581a6 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "test-watch": "git ls-files | entr npm run test", "update-snapshots": "ava --timeout=1m --update-snapshots test/markdownlint-cli2-test-exec.js test/markdownlint-cli2-test-fs.js test/markdownlint-cli2-test-main.js", "webworker": "cd webworker && webpack --mode none", - "webworker-install": "npm install --no-package-lock --no-save path-browserify process setimmediate stream-browserify url util webpack-cli && cpy ./node_modules/setimmediate/setImmediate.js ./webworker --flat" + "webworker-install": "npm install --no-package-lock --no-save path-browserify setimmediate stream-browserify util webpack-cli && cpy ./node_modules/setimmediate/setImmediate.js ./webworker --flat" }, "engines": { "node": ">=18" diff --git a/webworker/process-stub.js b/webworker/process-stub.js new file mode 100644 index 00000000..f4245d09 --- /dev/null +++ b/webworker/process-stub.js @@ -0,0 +1,11 @@ +// @ts-check + +"use strict"; + +module.exports = { + "cwd": () => "/", + "env": {}, + "versions": { + "node": "0.0" + } +}; diff --git a/webworker/process-wrapper.js b/webworker/process-wrapper.js deleted file mode 100644 index c719a49e..00000000 --- a/webworker/process-wrapper.js +++ /dev/null @@ -1,10 +0,0 @@ -// @ts-check - -"use strict"; - -// eslint-disable-next-line unicorn/prefer-node-protocol, n/no-missing-require -const processBrowser = require("process/browser"); -processBrowser.versions = { - "node": "0.0" -}; -module.exports = processBrowser; diff --git a/webworker/url-stub.js b/webworker/url-stub.js index e3f08b4f..6d30054f 100644 --- a/webworker/url-stub.js +++ b/webworker/url-stub.js @@ -2,6 +2,4 @@ "use strict"; -module.exports = { - "fileURLToPath": () => null -}; +module.exports = {}; diff --git a/webworker/webpack.config.js b/webworker/webpack.config.js index 16257da2..5a595620 100644 --- a/webworker/webpack.config.js +++ b/webworker/webpack.config.js @@ -19,22 +19,22 @@ module.exports = { } }, "plugins": [ + // Rewrite requires to remove "node:" prefix new webpack.NormalModuleReplacementPlugin( nodeModulePrefixRe, (resource) => { - let module = resource.request.replace(nodeModulePrefixRe, ""); - if (module === "url") { - module = "url-stub"; - } + const module = resource.request.replace(nodeModulePrefixRe, ""); resource.request = module; } ), + // Intercept existing "unicorn-magic" package to provide missing import new webpack.NormalModuleReplacementPlugin( /^unicorn-magic$/u, (resource) => { resource.request = require.resolve("./unicorn-magic-stub.js"); } ), + // Intercept use of "process" to provide implementation new webpack.ProvidePlugin({ "process": "process-wrapper" }) @@ -45,10 +45,10 @@ module.exports = { "fs": false, "os": require.resolve("./os-stub.js"), "path": require.resolve("path-browserify"), - "process": require.resolve("./process-wrapper.js"), - "process-wrapper": require.resolve("./process-wrapper.js"), + "process": require.resolve("./process-stub.js"), + "process-wrapper": require.resolve("./process-stub.js"), "stream": require.resolve("stream-browserify"), - "url-stub": require.resolve("./url-stub.js") + "url": require.resolve("./url-stub.js") } } }; From d60f99651f5f62a8c5902edf047452a6c0516326 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sat, 18 Nov 2023 21:28:38 -0800 Subject: [PATCH 43/46] Add more code coverage to Web Worker unit tests. --- webworker/webworker-test.js | 41 ++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/webworker/webworker-test.js b/webworker/webworker-test.js index 039a3bb5..8b714248 100644 --- a/webworker/webworker-test.js +++ b/webworker/webworker-test.js @@ -3,21 +3,30 @@ /* eslint-env qunit */ /* globals markdownlintCli2, FsVirtual */ -const oneViolation = "# Title\n\nText \n"; -const twoViolations = "# Title\n\nText\t\n"; -const noViolationsIgnoringTabs = "# Title\n\n\tText\n"; -const configNoHardTabs = "{\n\"no-hard-tabs\": false\n}"; +const md009 = "# Title\n\nText \n"; +const md010 = "# Title\n\n\tText\n"; +const md009md010 = "# Title\n\nText\t\n"; +const md047 = "# Title\n\nText"; +const configNoMd010 = "{\n\"no-hard-tabs\": false\n}"; +const configNoMd047 = "{\n\"single-trailing-newline\": false\n}"; const files = [ - [ "/file.md", twoViolations ], - [ "/dir1/file.md", twoViolations ], - [ "/dir1/.markdownlint.json", configNoHardTabs ], - [ "/dir2/file.md", twoViolations ], - [ "/dir2/.markdownlint-cli2.jsonc", `{\n"config":${configNoHardTabs}\n}` ], - [ "/dir3/file.md", twoViolations ], + [ "/file.md", md009md010 ], + [ "/file-two.md", md047 ], + [ "/package.json", `{\n"markdownlint-cli2": {\n"config": ${configNoMd047},\n"customRules": [],\n"markdownItPlugins": []\n}\n}` ], + [ "/dir1/file.md", md009md010 ], + [ "/dir1/.markdownlint.json", configNoMd010 ], + [ "/dir2/file.md", md009md010 ], + [ "/dir2/.markdownlint-cli2.jsonc", `{\n"config":${configNoMd010}\n}` ], + [ "/dir3/file.md", md009md010 ], [ "/dir3/.markdownlint.json", "{\n\"extends\": \"./extended.json\"\n}" ], - [ "/dir3/extended.json", configNoHardTabs ], - [ "/dir4/file.md", oneViolation ] + [ "/dir3/extended.json", configNoMd010 ], + [ "/dir4/file.md", md009 ], + [ "/dir5/file.md", md009md010 ], + [ "/dir5/.markdownlint-cli2.yaml", `config:\n extends: ./extended.json\n` ], + [ "/dir5/extended.json", configNoMd010 ], + [ "/dir6/skip.md", md009md010 ], + [ "/dir6/.markdownlint-cli2.jsonc", `{\n"ignores":["skip.md"]\n}` ] ]; const outputFormatterLengthIs = (assert, length) => (options) => { @@ -43,7 +52,7 @@ QUnit.test("unsaved", (assert) => { "fs": new FsVirtual(files), "argv": [], "nonFileContents": { - "untitled-1": twoViolations + "untitled-1": md009md010 }, "optionsOverride": { "outputFormatters": [ [ outputFormatterLengthIs(assert, 2) ] ] @@ -82,7 +91,7 @@ QUnit.test("file, no configuration, edits", (assert) => { "fs": new FsVirtual(files), "argv": [ ":/file.md" ], "fileContents": { - "/file.md": oneViolation + "/file.md": md009 }, "optionsOverride": { "outputFormatters": [ [ outputFormatterLengthIs(assert, 1) ] ] @@ -107,7 +116,7 @@ QUnit.test("file, .markdownlint.json, edits", (assert) => { "fs": new FsVirtual(files), "argv": [ ":/dir1/file.md" ], "fileContents": { - "/dir1/file.md": noViolationsIgnoringTabs + "/dir1/file.md": md010 }, "optionsOverride": { "outputFormatters": [ [ outputFormatterLengthIs(assert, 0) ] ] @@ -170,7 +179,7 @@ QUnit.test("workspace", (assert) => { "fs": new FsVirtual(files), "argv": [ "**/*.md" ], "optionsOverride": { - "outputFormatters": [ [ outputFormatterLengthIs(assert, 6) ] ] + "outputFormatters": [ [ outputFormatterLengthIs(assert, 7) ] ] } }); }); From 64d28d33deb133a9ea14c87bac8b07c1f76224e8 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sun, 19 Nov 2023 22:43:26 -0800 Subject: [PATCH 44/46] Add tests to verify .markdownlint.cjs/mjs and .markdownlint-cli2.cjs/mjs can return the configuration/options object from a Promise, update documentation. --- README.md | 5 +++-- test/markdownlint-cjs/dir/subdir/.markdownlint.cjs | 4 ++-- .../dir/subdir/.markdownlint-cli2.cjs | 4 ++-- .../{.markdownlint-cli2.cjs => .markdownlint-cli2.mjs} | 8 ++++---- test/markdownlint-mjs/dir/subdir/.markdownlint.mjs | 4 ++-- 5 files changed, 13 insertions(+), 12 deletions(-) rename test/markdownlint-cli2-mjs/dir/subdir/{.markdownlint-cli2.cjs => .markdownlint-cli2.mjs} (51%) diff --git a/README.md b/README.md index 9c6674c5..46016997 100644 --- a/README.md +++ b/README.md @@ -352,7 +352,7 @@ of the rules within. - The format of this file is a [CommonJS module][commonjs-module] (`.cjs`) or [ECMAScript module][ecmascript-module] (`.mjs`) that exports the object - described above for `.markdownlint-cli2.jsonc`. + described above for `.markdownlint-cli2.jsonc` (directly or from a `Promise`). - Instead of passing a `String` to identify the module name/path to load for `customRules`, `markdownItPlugins`, and `outputFormatters`, the corresponding `Object` or `Function` can be provided directly. @@ -392,7 +392,8 @@ of the rules within. - The format of this file is a [CommonJS module][commonjs-module] (`.cjs`) or [ECMAScript module][ecmascript-module] (`.mjs`) that exports the - [`markdownlint` `config` object][markdownlint-config]. + [`markdownlint` `config` object][markdownlint-config] (directly or from a + `Promise`). - Other details are the same as for `jsonc`/`json` files described above. - For example: [`.markdownlint.cjs`][markdownlint-cjs] or [`.markdownlint.mjs`][markdownlint-mjs] diff --git a/test/markdownlint-cjs/dir/subdir/.markdownlint.cjs b/test/markdownlint-cjs/dir/subdir/.markdownlint.cjs index d370bdae..c51e9666 100644 --- a/test/markdownlint-cjs/dir/subdir/.markdownlint.cjs +++ b/test/markdownlint-cjs/dir/subdir/.markdownlint.cjs @@ -2,6 +2,6 @@ "use strict"; -module.exports = { +module.exports = Promise.resolve({ "first-line-heading": false -}; +}); diff --git a/test/markdownlint-cli2-cjs/dir/subdir/.markdownlint-cli2.cjs b/test/markdownlint-cli2-cjs/dir/subdir/.markdownlint-cli2.cjs index d6215d29..87514d86 100644 --- a/test/markdownlint-cli2-cjs/dir/subdir/.markdownlint-cli2.cjs +++ b/test/markdownlint-cli2-cjs/dir/subdir/.markdownlint-cli2.cjs @@ -2,8 +2,8 @@ "use strict"; -module.exports = { +module.exports = Promise.resolve({ "config": { "first-line-heading": false } -}; +}); diff --git a/test/markdownlint-cli2-mjs/dir/subdir/.markdownlint-cli2.cjs b/test/markdownlint-cli2-mjs/dir/subdir/.markdownlint-cli2.mjs similarity index 51% rename from test/markdownlint-cli2-mjs/dir/subdir/.markdownlint-cli2.cjs rename to test/markdownlint-cli2-mjs/dir/subdir/.markdownlint-cli2.mjs index d6215d29..58b4c927 100644 --- a/test/markdownlint-cli2-mjs/dir/subdir/.markdownlint-cli2.cjs +++ b/test/markdownlint-cli2-mjs/dir/subdir/.markdownlint-cli2.mjs @@ -1,9 +1,9 @@ // @ts-check -"use strict"; - -module.exports = { +const options = Promise.resolve({ "config": { "first-line-heading": false } -}; +}); + +export default options; diff --git a/test/markdownlint-mjs/dir/subdir/.markdownlint.mjs b/test/markdownlint-mjs/dir/subdir/.markdownlint.mjs index a8c6514d..0e49f169 100644 --- a/test/markdownlint-mjs/dir/subdir/.markdownlint.mjs +++ b/test/markdownlint-mjs/dir/subdir/.markdownlint.mjs @@ -1,7 +1,7 @@ // @ts-check -const config = { +const config = Promise.resolve({ "first-line-heading": false -}; +}); export default config; From 79e6cb09f509c7a0a94701ee4f5dab9a7b4d9cb0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Nov 2023 06:45:22 +0000 Subject: [PATCH 45/46] Bump eslint from 8.53.0 to 8.54.0 Bumps [eslint](https://github.com/eslint/eslint) from 8.53.0 to 8.54.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/v8.53.0...v8.54.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 4e2581a6..b7ef8e96 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "cpy": "11.0.0", "cpy-cli": "5.0.0", "del": "7.1.0", - "eslint": "8.53.0", + "eslint": "8.54.0", "eslint-plugin-n": "16.3.1", "eslint-plugin-unicorn": "49.0.0", "execa": "8.0.1", From 8524909c7a86f78a6b915ffafea220a6f3979ba1 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sun, 19 Nov 2023 22:59:47 -0800 Subject: [PATCH 46/46] Update to version 0.11.0. --- CHANGELOG.md | 6 ++++++ README.md | 8 ++++---- markdownlint-cli2.js | 2 +- package.json | 2 +- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29a7e28c..67e7d5cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.11.0 + +- Add `modulePaths` configuration option +- Update dependencies (including `markdownlint`) +- Remove support for end-of-life Node 16 + ## 0.10.0 - Add `showFound` configuration option diff --git a/README.md b/README.md index 46016997..84a84f88 100644 --- a/README.md +++ b/README.md @@ -167,7 +167,7 @@ A container image [`davidanson/markdownlint-cli2`][docker-hub-markdownlint-cli2] can also be used (e.g., as part of a CI pipeline): ```bash -docker run -v $PWD:/workdir davidanson/markdownlint-cli2:v0.10.0 "**/*.md" "#node_modules" +docker run -v $PWD:/workdir davidanson/markdownlint-cli2:v0.11.0 "**/*.md" "#node_modules" ``` Notes: @@ -184,7 +184,7 @@ Notes: - A custom working directory can be specified with Docker's `-w` flag: ```bash - docker run -w /myfolder -v $PWD:/myfolder davidanson/markdownlint-cli2:v0.10.0 "**/*.md" "#node_modules" + docker run -w /myfolder -v $PWD:/myfolder davidanson/markdownlint-cli2:v0.11.0 "**/*.md" "#node_modules" ``` > **Deprecated** @@ -193,7 +193,7 @@ Notes: > instead, use Docker's `--entrypoint` flag: > > ```bash -> docker run -v $PWD:/workdir --entrypoint="markdownlint-cli2-fix" davidanson/markdownlint-cli2:v0.10.0 "**/*.md" "#node_modules" +> docker run -v $PWD:/workdir --entrypoint="markdownlint-cli2-fix" davidanson/markdownlint-cli2:v0.11.0 "**/*.md" "#node_modules" > ``` For convenience, the container image @@ -420,7 +420,7 @@ reference to the `repos` list in that project's `.pre-commit-config.yaml` like: ```yaml - repo: https://github.com/DavidAnson/markdownlint-cli2 - rev: v0.10.0 + rev: v0.11.0 hooks: - id: markdownlint-cli2 ``` diff --git a/markdownlint-cli2.js b/markdownlint-cli2.js index 5f87163a..d5a3637c 100755 --- a/markdownlint-cli2.js +++ b/markdownlint-cli2.js @@ -26,7 +26,7 @@ const resolveAndRequire = require("./resolve-and-require"); // Variables const packageName = "markdownlint-cli2"; -const packageVersion = "0.10.0"; +const packageVersion = "0.11.0"; const libraryName = "markdownlint"; const libraryVersion = markdownlintLibrary.getVersion(); const dotOnlySubstitute = "*.{md,markdown}"; diff --git a/package.json b/package.json index b7ef8e96..5041450d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "markdownlint-cli2", - "version": "0.10.0", + "version": "0.11.0", "description": "A fast, flexible, configuration-based command-line interface for linting Markdown/CommonMark files with the `markdownlint` library", "author": { "name": "David Anson",

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 diff --git a/test/snapshots/markdownlint-cli2-test-main.js.md b/test/snapshots/markdownlint-cli2-test-main.js.md index 0b103a89..f3436ae1 100644 --- a/test/snapshots/markdownlint-cli2-test-main.js.md +++ b/test/snapshots/markdownlint-cli2-test-main.js.md @@ -5265,3 +5265,67 @@ Generated by [AVA](https://avajs.dev). Summary: 2 error(s)␊ `, } + +## modulePaths (main) + +> Snapshot 1 + + { + exitCode: 1, + formatterCodeQuality: '', + formatterJson: '', + formatterJunit: '', + formatterSarif: '', + stderr: `cjs: dir/about.md 1 MD021/no-multiple-space-closed-atx␊ + cjs: dir/about.md 4 MD032/blanks-around-lists␊ + cjs: dir/about.md 5 MD029/ol-prefix␊ + cjs: dir/hr.md 3 sample-rule-commonjs␊ + cjs: dir/subdir/info.md 1 MD022/blanks-around-headings/blanks-around-headers␊ + cjs: dir/subdir/info.md 1 MD041/first-line-heading/first-line-h1␊ + cjs: dir/subdir/info.md 2 MD038/no-space-in-code␊ + cjs: dir/subdir/info.md 2 MD038/no-space-in-code␊ + cjs: dir/subdir/info.md 4 MD012/no-multiple-blanks␊ + cjs: viewme.md 3 MD009/no-trailing-spaces␊ + cjs: viewme.md 5 MD012/no-multiple-blanks␊ + cjs: viewme.md 6 MD025/single-title/single-h1␊ + cjs: viewme.md 12 MD019/no-multiple-space-atx␊ + cjs: viewme.md 14 MD047/single-trailing-newline␊ + `, + stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ + Finding: **/*.md␊ + Linting: 5 file(s)␊ + Summary: 14 error(s)␊ + `, + } + +## modulePaths-non-root (main) + +> Snapshot 1 + + { + exitCode: 1, + formatterCodeQuality: '', + formatterJson: '', + formatterJunit: '', + formatterSarif: '', + stderr: `dir/about.md:1:1 MD021/no-multiple-space-closed-atx Multiple spaces inside hashes on closed atx style heading [Context: "# About #"]␊ + dir/about.md:4 MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "1. List"]␊ + dir/about.md:5:1 MD029/ol-prefix Ordered list item prefix [Expected: 2; Actual: 3; Style: 1/2/3]␊ + dir/hr.md:3 sample-rule-commonjs Sample rule (commonjs) [Sample error for hr]␊ + dir/subdir/info.md:1 MD022/blanks-around-headings/blanks-around-headers Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/subdir/info.md:1 MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "## Information"]␊ + dir/subdir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ + dir/subdir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ + dir/subdir/info.md:4 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ + viewme.md:3:10 MD009/no-trailing-spaces Trailing spaces [Expected: 0 or 2; Actual: 1]␊ + viewme.md:5 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2]␊ + viewme.md:6 MD025/single-title/single-h1 Multiple top-level headings in the same document [Context: "# Description"]␊ + viewme.md:12:1 MD019/no-multiple-space-atx Multiple spaces after hash on atx style heading [Context: "## Summary"]␊ + viewme.md:14:14 MD047/single-trailing-newline Files should end with a single newline character␊ + `, + stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ + Finding: **/*.md␊ + Linting: 5 file(s)␊ + Summary: 14 error(s)␊ + `, + } diff --git a/test/snapshots/markdownlint-cli2-test-main.js.snap b/test/snapshots/markdownlint-cli2-test-main.js.snap index 60adceb8892b4797df486cc6e178da2811bcb20c..dea4afe7d53d1e7884168aeabbbf8e09ea8b1443 100644 GIT binary patch literal 12520 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 Date: Wed, 4 Oct 2023 20:33:08 -0700 Subject: [PATCH 09/46] Update .markdownlint-cli2.jsonc/yaml example files with modulePaths, add test case for absolute platform-specific modulePaths. --- .../.markdownlint-cli2.jsonc | 5 +++++ .../.markdownlint-cli2.yaml | 4 ++++ .../dir2/.markdownlint-cli2.cjs | 20 ++++++++++++++++++ test/modulePaths-non-root/dir2/link.md | 3 +++ .../markdownlint-cli2-test-exec.js.md | 2 +- .../markdownlint-cli2-test-exec.js.snap | Bin 14297 -> 14301 bytes .../markdownlint-cli2-test-main.js.md | 2 +- .../markdownlint-cli2-test-main.js.snap | Bin 12520 -> 12523 bytes 8 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 test/modulePaths-non-root/dir2/.markdownlint-cli2.cjs create mode 100644 test/modulePaths-non-root/dir2/link.md diff --git a/test/markdownlint-cli2-jsonc-example/.markdownlint-cli2.jsonc b/test/markdownlint-cli2-jsonc-example/.markdownlint-cli2.jsonc index 350631b8..87cd4992 100644 --- a/test/markdownlint-cli2-jsonc-example/.markdownlint-cli2.jsonc +++ b/test/markdownlint-cli2-jsonc-example/.markdownlint-cli2.jsonc @@ -34,6 +34,11 @@ [ "@iktakahiro/markdown-it-katex" ] ], + // Additional paths to resolve module locations from + "modulePaths": [ + "./modules" + ], + // Disable inline config comments "noInlineConfig": true, diff --git a/test/markdownlint-cli2-yaml-example/.markdownlint-cli2.yaml b/test/markdownlint-cli2-yaml-example/.markdownlint-cli2.yaml index adb4ee29..eca7edd6 100644 --- a/test/markdownlint-cli2-yaml-example/.markdownlint-cli2.yaml +++ b/test/markdownlint-cli2-yaml-example/.markdownlint-cli2.yaml @@ -30,6 +30,10 @@ markdownItPlugins: - - "@iktakahiro/markdown-it-katex" +# Additional paths to resolve module locations from +modulePaths: + - "./modules" + # Disable inline config comments noInlineConfig: true diff --git a/test/modulePaths-non-root/dir2/.markdownlint-cli2.cjs b/test/modulePaths-non-root/dir2/.markdownlint-cli2.cjs new file mode 100644 index 00000000..427994db --- /dev/null +++ b/test/modulePaths-non-root/dir2/.markdownlint-cli2.cjs @@ -0,0 +1,20 @@ +// @ts-check + +"use strict"; + +const path = require("node:path"); + +module.exports = { + "customRules": [ + "markdownlint-rule-sample-commonjs" + ], + "markdownItPlugins": [ + [ "custom-markdown-it-plugin" ] + ], + "modulePaths": [ + "../../customRules", + "../../invalid", + "../../no-config", + "../../markdownItPlugins/module" + ].map((dir) => path.resolve(__dirname, dir)) +}; diff --git a/test/modulePaths-non-root/dir2/link.md b/test/modulePaths-non-root/dir2/link.md new file mode 100644 index 00000000..88b7f3b6 --- /dev/null +++ b/test/modulePaths-non-root/dir2/link.md @@ -0,0 +1,3 @@ +# Heading + +Text [ link ](https://example.com) diff --git a/test/snapshots/markdownlint-cli2-test-exec.js.md b/test/snapshots/markdownlint-cli2-test-exec.js.md index f26076f7..bb1069d9 100644 --- a/test/snapshots/markdownlint-cli2-test-exec.js.md +++ b/test/snapshots/markdownlint-cli2-test-exec.js.md @@ -7250,7 +7250,7 @@ Generated by [AVA](https://avajs.dev). `, stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ Finding: **/*.md␊ - Linting: 5 file(s)␊ + Linting: 6 file(s)␊ Summary: 14 error(s)␊ `, } diff --git a/test/snapshots/markdownlint-cli2-test-exec.js.snap b/test/snapshots/markdownlint-cli2-test-exec.js.snap index 49d4176614efbf3a3634181c1318c4c4be6cbe72..1df6cce66201e6fafce1c68062e2282b85b5d9e5 100644 GIT binary patch delta 77 zcmV-T0J8ttZ{2S)K~_N^Q*L2!b7*gLAa*kf0|4%&1StJQOxs883S?xV-8L9f%_0b> j!$T#18ix5u^Qo~inl}+%S>w0jHU9qx9U~DM9L)p(&rTnJ delta 73 zcmV-P0Ji_#Z`p4$K~_N^Q*L2!b7*gLAa*kf0|0Z!$VHe(I@$-8SS6a+PuFpqoKspY fDLmTf86)x4{1~w^nl}y3OXL54ZW=iW9L)p(VoV-_ diff --git a/test/snapshots/markdownlint-cli2-test-main.js.md b/test/snapshots/markdownlint-cli2-test-main.js.md index f3436ae1..30f42d83 100644 --- a/test/snapshots/markdownlint-cli2-test-main.js.md +++ b/test/snapshots/markdownlint-cli2-test-main.js.md @@ -5325,7 +5325,7 @@ Generated by [AVA](https://avajs.dev). `, stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ Finding: **/*.md␊ - Linting: 5 file(s)␊ + Linting: 6 file(s)␊ Summary: 14 error(s)␊ `, } diff --git a/test/snapshots/markdownlint-cli2-test-main.js.snap b/test/snapshots/markdownlint-cli2-test-main.js.snap index dea4afe7d53d1e7884168aeabbbf8e09ea8b1443..58139d1284052507a27aed5594b41fa9c3c9d660 100644 GIT binary patch delta 75 zcmV-R0JQ(;Ve4TsK~_N^Q*L2!b7*gLAa*kf0{{)Yzqja!Spz7GC*nw_wF`jK$A3Jr h;a}ee*xKWjG*_`QsxS|7VWv~#|9?vEUn7m10|3msA({XH delta 72 zcmV-O0Js0^Vd!BpK~_N^Q*L2!b7*gLAa*kf0{|P&BG|M2>le-5oG%|1o(m*rj!HT= eVg58T{(f!fOaZYnsxS;o Date: Fri, 6 Oct 2023 21:07:27 -0700 Subject: [PATCH 10/46] Refactor importOrRequireIds and importOrRequireIdsAndParams so that non-string IDs will be returned even in noRequire scenarios. --- markdownlint-cli2.js | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/markdownlint-cli2.js b/markdownlint-cli2.js index e4328a23..716896dc 100755 --- a/markdownlint-cli2.js +++ b/markdownlint-cli2.js @@ -74,8 +74,11 @@ const readConfig = (fs, dir, name, otherwise) => { }; // Import or resolve/require a module ID with a custom directory in the path -const importOrRequireResolve = async (dirs, id) => { +const importOrRequireResolve = async (dirs, id, noRequire) => { if (typeof id === "string") { + if (noRequire) { + return null; + } const expandId = markdownlintRuleHelpers.expandTildePath(id, require("node:os")); const errors = []; @@ -105,21 +108,21 @@ const importOrRequireResolve = async (dirs, id) => { // Import or require an array of modules by ID const importOrRequireIds = (dirs, ids, noRequire) => ( Promise.all( - noRequire ? [] : ids.map((id) => importOrRequireResolve(dirs, id)) - ) + ids.map( + (id) => importOrRequireResolve(dirs, id, noRequire) + ) + ).then((results) => results.filter(Boolean)) ); // Import or require an array of modules by ID (preserving parameters) -const importOrRequireIdsAndParams = async (dirs, idsAndParams, noRequire) => { - if (noRequire) { - return []; - } - const ids = idsAndParams.map((entry) => entry[0]); - const modules = await importOrRequireIds(dirs, ids, noRequire); - const modulesAndParams = idsAndParams. - map((entry, i) => [ modules[i], ...entry.slice(1) ]); - return modulesAndParams; -}; +const importOrRequireIdsAndParams = (dirs, idsAndParams, noRequire) => ( + Promise.all( + idsAndParams.map( + (idAndParams) => importOrRequireResolve(dirs, idAndParams[0], noRequire). + then((module) => module && [ module, ...idAndParams.slice(1) ]) + ) + ).then((results) => results.filter(Boolean)) +); // Import or require a JavaScript file and return the exported object const importOrRequireConfig = (fs, dir, name, noRequire, otherwise) => { From f4f64ca914a3d06653e44a9b2a0b0273e549aedb Mon Sep 17 00:00:00 2001 From: David Anson Date: Fri, 6 Oct 2023 21:12:34 -0700 Subject: [PATCH 11/46] Pass noRequire through to outputSummary for completeness. --- markdownlint-cli2.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/markdownlint-cli2.js b/markdownlint-cli2.js index 716896dc..7abe273b 100755 --- a/markdownlint-cli2.js +++ b/markdownlint-cli2.js @@ -862,7 +862,8 @@ const outputSummary = async ( outputFormatters, modulePaths, logMessage, - logError + logError, + noRequire ) => { const errorsPresent = (summary.length > 0); if (errorsPresent || outputFormatters) { @@ -875,7 +876,7 @@ const outputSummary = async ( const dir = relativeDir || baseDir; const dirs = [ dir, ...modulePaths ]; const formattersAndParams = outputFormatters - ? await importOrRequireIdsAndParams(dirs, outputFormatters) + ? await importOrRequireIdsAndParams(dirs, outputFormatters, noRequire) : [ [ require("markdownlint-cli2-formatter-default") ] ]; await Promise.all(formattersAndParams.map((formatterAndParams) => { const [ formatter, ...formatterParams ] = formatterAndParams; @@ -1025,7 +1026,8 @@ const main = async (params) => { outputFormatters, modulePaths, logMessage, - logError + logError, + noRequire ); // Return result return errorsPresent ? 1 : 0; From 0359c5a4f8a5ce1cd7edc4bd36117b661341d63c Mon Sep 17 00:00:00 2001 From: David Anson Date: Fri, 6 Oct 2023 21:18:40 -0700 Subject: [PATCH 12/46] Add "funding" section to all public package.json files with link to GitHub Sponsor page. --- formatter-codequality/package.json | 1 + formatter-default/package.json | 1 + formatter-json/package.json | 1 + formatter-junit/package.json | 1 + formatter-pretty/package.json | 1 + formatter-sarif/package.json | 1 + formatter-summarize/package.json | 1 + package.json | 1 + 8 files changed, 8 insertions(+) diff --git a/formatter-codequality/package.json b/formatter-codequality/package.json index 71e2271c..1ca72a47 100644 --- a/formatter-codequality/package.json +++ b/formatter-codequality/package.json @@ -14,6 +14,7 @@ "url": "git+https://github.com/DavidAnson/markdownlint-cli2.git" }, "bugs": "https://github.com/DavidAnson/markdownlint-cli2/issues", + "funding": "https://github.com/sponsors/DavidAnson", "files": [ "markdownlint-cli2-formatter-codequality.js" ], diff --git a/formatter-default/package.json b/formatter-default/package.json index 9cf686c1..f8763f5a 100644 --- a/formatter-default/package.json +++ b/formatter-default/package.json @@ -14,6 +14,7 @@ "url": "git+https://github.com/DavidAnson/markdownlint-cli2.git" }, "bugs": "https://github.com/DavidAnson/markdownlint-cli2/issues", + "funding": "https://github.com/sponsors/DavidAnson", "files": [ "markdownlint-cli2-formatter-default.js" ], diff --git a/formatter-json/package.json b/formatter-json/package.json index 4511a8b1..0561772b 100644 --- a/formatter-json/package.json +++ b/formatter-json/package.json @@ -14,6 +14,7 @@ "url": "git+https://github.com/DavidAnson/markdownlint-cli2.git" }, "bugs": "https://github.com/DavidAnson/markdownlint-cli2/issues", + "funding": "https://github.com/sponsors/DavidAnson", "files": [ "markdownlint-cli2-formatter-json.js" ], diff --git a/formatter-junit/package.json b/formatter-junit/package.json index 62b27b13..b3125f04 100644 --- a/formatter-junit/package.json +++ b/formatter-junit/package.json @@ -14,6 +14,7 @@ "url": "git+https://github.com/DavidAnson/markdownlint-cli2.git" }, "bugs": "https://github.com/DavidAnson/markdownlint-cli2/issues", + "funding": "https://github.com/sponsors/DavidAnson", "files": [ "markdownlint-cli2-formatter-junit.js" ], diff --git a/formatter-pretty/package.json b/formatter-pretty/package.json index d326711e..1b58a673 100644 --- a/formatter-pretty/package.json +++ b/formatter-pretty/package.json @@ -14,6 +14,7 @@ "url": "git+https://github.com/DavidAnson/markdownlint-cli2.git" }, "bugs": "https://github.com/DavidAnson/markdownlint-cli2/issues", + "funding": "https://github.com/sponsors/DavidAnson", "files": [ "markdownlint-cli2-formatter-pretty.js" ], diff --git a/formatter-sarif/package.json b/formatter-sarif/package.json index 704100b0..9f0d1257 100644 --- a/formatter-sarif/package.json +++ b/formatter-sarif/package.json @@ -14,6 +14,7 @@ "url": "git+https://github.com/DavidAnson/markdownlint-cli2.git" }, "bugs": "https://github.com/DavidAnson/markdownlint-cli2/issues", + "funding": "https://github.com/sponsors/DavidAnson", "files": [ "markdownlint-cli2-formatter-sarif.js" ], diff --git a/formatter-summarize/package.json b/formatter-summarize/package.json index e5395c4e..2f0545ad 100644 --- a/formatter-summarize/package.json +++ b/formatter-summarize/package.json @@ -14,6 +14,7 @@ "url": "git+https://github.com/DavidAnson/markdownlint-cli2.git" }, "bugs": "https://github.com/DavidAnson/markdownlint-cli2/issues", + "funding": "https://github.com/sponsors/DavidAnson", "files": [ "markdownlint-cli2-formatter-summarize.js" ], diff --git a/package.json b/package.json index 68778079..5962bafe 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "url": "git+https://github.com/DavidAnson/markdownlint-cli2.git" }, "bugs": "https://github.com/DavidAnson/markdownlint-cli2/issues", + "funding": "https://github.com/sponsors/DavidAnson", "scripts": { "build-docker-image": "VERSION=$(node -e \"process.stdout.write(require('./package.json').version)\") && docker build -t davidanson/markdownlint-cli2:v$VERSION -f docker/Dockerfile --label org.opencontainers.image.version=v$VERSION .", "build-docker-image-rules": "VERSION=$(node -e \"process.stdout.write(require('./package.json').version)\") && docker build -t davidanson/markdownlint-cli2-rules:v$VERSION -f docker/Dockerfile-rules --build-arg VERSION=v$VERSION --label org.opencontainers.image.version=v$VERSION .", From a6571642c50a74a4cbd5d24ec278d303f7fce9b8 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sun, 8 Oct 2023 19:46:28 -0700 Subject: [PATCH 13/46] Add support for '~' paths to new modulePaths configuration file option. --- README.md | 2 ++ markdownlint-cli2.js | 10 +++++-- .../markdownlint-cli2-test-exec.js.md | 28 ++++++++++++++---- .../markdownlint-cli2-test-exec.js.snap | Bin 14301 -> 14304 bytes .../markdownlint-cli2-test-main.js.md | 28 ++++++++++++++---- .../markdownlint-cli2-test-main.js.snap | Bin 12523 -> 12522 bytes .../.markdownlint-cli2.cjs | 16 +++++++--- test/tilde-paths-commonjs/hr.md | 3 ++ .../tilde-paths-module/.markdownlint-cli2.mjs | 15 +++++++--- test/tilde-paths-module/hr.md | 3 ++ 10 files changed, 82 insertions(+), 23 deletions(-) create mode 100644 test/tilde-paths-commonjs/hr.md create mode 100644 test/tilde-paths-module/hr.md diff --git a/README.md b/README.md index b10d4c8f..3c57ba1b 100644 --- a/README.md +++ b/README.md @@ -231,6 +231,8 @@ of the rules within. - When glob expressions match files *not* under the current directory, configuration for the current directory is applied to the closest common parent directory. +- Paths beginning with `~` are resolved relative to the user's home directory + (typically `$HOME` on UNIX and `%USERPROFILE%` on Windows) - There are two kinds of configuration file (both detailed below): - Configuration files like `.markdownlint-cli2.*` allow complete control of `markdownlint-cli2` behavior and are also used by `vscode-markdownlint`. diff --git a/markdownlint-cli2.js b/markdownlint-cli2.js index 7abe273b..625d5089 100755 --- a/markdownlint-cli2.js +++ b/markdownlint-cli2.js @@ -52,9 +52,14 @@ const negateGlob = (glob) => `!${glob}`; // Return a posix path (even on Windows) const posixPath = (p) => p.split(pathDefault.sep).join(pathPosix.sep); +// Expands a path with a tilde to an absolute path +const expandTildePath = (id) => ( + markdownlintRuleHelpers.expandTildePath(id, require("node:os")) +); + // Resolves module paths relative to the specified directory const resolveModulePaths = (dir, modulePaths) => ( - modulePaths.map((path) => pathDefault.resolve(dir, path)) + modulePaths.map((path) => pathDefault.resolve(dir, expandTildePath(path))) ); // Read a JSON(C) or YAML file and return the object @@ -79,8 +84,7 @@ const importOrRequireResolve = async (dirs, id, noRequire) => { if (noRequire) { return null; } - const expandId = - markdownlintRuleHelpers.expandTildePath(id, require("node:os")); + const expandId = expandTildePath(id); const errors = []; try { return resolveAndRequire(dynamicRequire, expandId, dirs); diff --git a/test/snapshots/markdownlint-cli2-test-exec.js.md b/test/snapshots/markdownlint-cli2-test-exec.js.md index bb1069d9..7bcf2071 100644 --- a/test/snapshots/markdownlint-cli2-test-exec.js.md +++ b/test/snapshots/markdownlint-cli2-test-exec.js.md @@ -6955,17 +6955,25 @@ Generated by [AVA](https://avajs.dev). formatterJson: '', formatterJunit: '', formatterSarif: '', - stderr: `viewme.md 3 any-blockquote␊ + stderr: `hr.md 3 sample-rule-commonjs␊ + viewme.md 3 any-blockquote␊ viewme.md 3 MD009/no-trailing-spaces␊ viewme.md 5 MD012/no-multiple-blanks␊ viewme.md 6 MD025/single-title/single-h1␊ viewme.md 12 MD019/no-multiple-space-atx␊ viewme.md 14 MD047/single-trailing-newline␊ + cjs: hr.md 3 sample-rule-commonjs␊ + cjs: viewme.md 3 any-blockquote␊ + cjs: viewme.md 3 MD009/no-trailing-spaces␊ + cjs: viewme.md 5 MD012/no-multiple-blanks␊ + cjs: viewme.md 6 MD025/single-title/single-h1␊ + cjs: viewme.md 12 MD019/no-multiple-space-atx␊ + cjs: viewme.md 14 MD047/single-trailing-newline␊ `, stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ Finding: *.md␊ - Linting: 2 file(s)␊ - Summary: 6 error(s)␊ + Linting: 3 file(s)␊ + Summary: 7 error(s)␊ `, } @@ -6979,17 +6987,25 @@ Generated by [AVA](https://avajs.dev). formatterJson: '', formatterJunit: '', formatterSarif: '', - stderr: `viewme.md 3 any-blockquote␊ + stderr: `hr.md 3 sample-rule-commonjs␊ + viewme.md 3 any-blockquote␊ viewme.md 3 MD009/no-trailing-spaces␊ viewme.md 5 MD012/no-multiple-blanks␊ viewme.md 6 MD025/single-title/single-h1␊ viewme.md 12 MD019/no-multiple-space-atx␊ viewme.md 14 MD047/single-trailing-newline␊ + cjs: hr.md 3 sample-rule-commonjs␊ + cjs: viewme.md 3 any-blockquote␊ + cjs: viewme.md 3 MD009/no-trailing-spaces␊ + cjs: viewme.md 5 MD012/no-multiple-blanks␊ + cjs: viewme.md 6 MD025/single-title/single-h1␊ + cjs: viewme.md 12 MD019/no-multiple-space-atx␊ + cjs: viewme.md 14 MD047/single-trailing-newline␊ `, stdout: `markdownlint-cli2 vX.Y.Z (markdownlint vX.Y.Z)␊ Finding: *.md␊ - Linting: 2 file(s)␊ - Summary: 6 error(s)␊ + Linting: 3 file(s)␊ + Summary: 7 error(s)␊ `, } diff --git a/test/snapshots/markdownlint-cli2-test-exec.js.snap b/test/snapshots/markdownlint-cli2-test-exec.js.snap index 1df6cce66201e6fafce1c68062e2282b85b5d9e5..def58452bbe74c78dcd43b112ec7bab6666c45ca 100644 GIT binary patch delta 12592 zcmaL7WmH`;*S3qh7I%l@?(XjHE$;5NahJkIiWVsDvT-f$?poa4ihs1v^PcxR=f_#s z7+G1lXOfw$A9G}mtULa81c+*hlBzp=b#k?GbR+d(M}Pz?Q!e=uKFtBvt)qrz#+)Z_ z4^}BaSL%RgYpDiX%SV?*5(5YJ?}0q?w~gIhayRmvv~9Z88BW5m_M}=rOY|hpIHpUw zBeo7(*RAvj^B>AUH}m$$HBYQK&nTr!m07q2Eg*^qW=lX^j{?{VC?hd=gV0ICzw(EJ z^U{-ElHf&#fPtHkdO(1?yilN$K7J(?K^o*ulhnF$A0D+y>ObZSsm!Lm#=h9ey2&0C zOgnfEd6Us5{=WIV*j1$~Zd;I!(LqNLQD4hdtKg#PTR^)QzAurJA>C>oaPwS7r+=+Y z0@z-gC?tBad;rw04;lq`8HY{632lZuPvZ9P4& zCQtS)ze>Yt%N%g>kRE!pdcBy0W(z8oNjqcRI)o~|~W=J%~2hgkE`8Kjj% zOUr93t85-_PYCQ>$Z*Qos$f8<{pHNS_{w*j!!IpUhHRAXN zB|kKV+MYGB(f^A>T7ualFLGBCY~761|? zlJ#;8A!yWxsCz3QI0PPyZHHWnK?IN#0*_ksi9JTaEoLtF)iUiYiZ_ce9%QZ#7(Ee4 zAXZAARtP&-683&30vbb*L$gB#IHv={AvnonS~cfseq#9Y9^r2U{a6*xE-@2U=nwIC zshE^<`_oOmA`V=KV3Ds@P>=^|>PWbakdEhF0fBARAQavq12@p$es-9;i-%y;# zUSt9{A#ve|hay(mBSsj3?~qvVFHiKs(x21(%z;EuU zjY12-f+bJ8(US4GIJxJ9i)FW}-SOJh1~&p{xEY(F`}Lix!3OJH*gzjB0^4+WtFh`h z_Y|eW6&EQF9OEBBcBQ*;`==9qMjV#-q@TN&Rw&FV6An&2?$T|OX*wXoHTjapDddGH zwV7cf&WG5rP`{ziigN3N2nk{2Q0)VSQjt@>Q+Q#v=(S1ZvLjG3x#y(`p>4Lj7bQV| zCIzDNxxPQ$t=xswwkqE<`)a#%ZR;ox8l4Pddly09kpX3(Ngxhof!5Fx5F`n}YG_jc zsaj&XYBBm}sdbp$ z^8JR9GdwGdolv9Tt3#NMef$ySmfOmw-9X8cO%c5xISbcipa5z{_a6o-+OQbCd^2&S z;eCPxeMBL8CC8{syDyNG2S>xa`YBm}coX+Gj|?W+wOz6+%sy^1(Z?Aw$F*%{rW`(p z+O`(64c`X{9zD($R1kFCZD@{&k#8*%0;kT-m7N)K@t3RgFG02<=0pPJWp;w()x4gO z{t-St)I9Btl5m?M>JzJ8z1%X+J-@dUy0>)9J&d>_BiwnQe?R*B zc2XDGF2nymkU-3yg+rlSuFXmMq>b`h+99_u(%gR9fy1>+H(Rsz>@i&Xiz+3o6O!a< zgPp~pN_-akwiCoQ>Z!--px-@}6$=@@75M7pwcA~)zp+=$e3Z^)0gjJ8fHKy|t_oY? zht;@s7v|?~PIYyQh0DAF(Jxm0}jw#mSZ~J9^Gg7{xi`P zxN-&|>MwJnKAClkm?cXpBU$=#`lCXr)E<1@Z(?+hUU^C7y}eNmHRDIFUBl(+KLnfR zGajowRY9sCynO%WRx6;T2o2+&KHR7$`zb5Hjdrv9;ObMr6+(3=;QctPGWBxW8-z8j zC83XwHS&ZN?JXB3mMYLb$7m9IhKnBW&u1l|bv7@K_=!;l^AEeJ=!}$RD=g9iBIg&B zW#3{PDiG;(u*6?g<1@iel>leWusU2$-jc9Ko=Q${<9WtL6K~XNlgF?#ErzDa$+S%} zgJE~MKApu}r5C`@AtNBvj~^|ct~>*uAn&9TpG;fp#J82@mCIS&RB*3Kvq;|4+Vysh z2b=V4U&d!)HC#!ONwXzeMBX~ADNASlG zIdI0@d}je1PE~oxBasZbc{ZHkERAX0J6AreZ?CVvRX#Y}o!>Ke!9vR6s`Lb^#e)}) zvrbJ_OLq~!`uH6nKj|Er<|Swnlbmc>$8*kPTVIdeoy0`W&79eUbuiUpUAIczEZ(ps z{O}7~oPW|@^?%u2-Exh~bpAvYuw*{P^q8$2bwmdMD25bksccq=Zl1o*OjvJ*KE*Eb zS$5#0TznoK(-PLi`^J3l_gZ*yb)4s#)~JX2O4~`q>8Ol;$9L>LcT%!ATDYjZBkhCP zT)sQosdP6jotokICdc4LH(e^R7cv5yGP$fRgvXN-z_{zms@|1zMbY_dirmi5@RqWg z=_v(pwjlX1nKoV9S1G!dK>w3Y+z|NVr>mQsCdS2zLF*l+{4cBL9 zTJ&sXSQ_*#v4GHzd2o7Qspa zBnk%kj;^A1kXJ|{gQ4~A`L`S?BPrgWr&xEaf-vHj=JKB|;g_G80&=EMXPIS*vP;dr?@yU~yAN0x-FM_n>u z`Lp2?Yq@9EMe(#g>#OoSfeCGfO}1S=!ut_J68dxLHc|byLM!EhlfuBJLFtVGn?20Uj(y>^$3U{>Lk=t;C%+IJ zq(^4%uq-d!GR5*XgExmOe;iCSRb&B3dqZ8G5_8c74-#JCm(@zdQ9V1ExG|>>V*G3! z-rMDMqjVsgluYmv6u`lkXA;1fmM0d#Ii|+Rq2CD~3&#Q4*;xTZtDBvxi}P_zC0gth zSf59BB&lO3ToNyJ+5i_MmWGSgsv@{d%;oS+XYZa_*1iT|k@onikzRTAyr-+@s4w^y zr35smay@PB0U;jF<*(t&#ymWi7qC-9HkFk4WZrh(-Q4wyacrYrmWhJjt{<{^E3Q4V z5r?Eaa+EOz^U47bkXrB*v`n2pIKFN7T3=L@X;Ku|xfqszTTqA3TgJ5K#Xe|xmT_)Kd@^z-`o`+MCw-~NMKI`cYU!0(7Xg}LKYa_w9HAkswz zTf08NOY}yhT{#?0WLeHm+G%gkn8Lijk^gPs*@Q-iN0r2rmH0fg$*I;CyO*j_#~&Vx zg(ehw)ne@syzl#Ih!>pB-mK)d^bkt=WE`9@FbaP-33!(9%DbZQ%8Ms;#_v9B=qT&e zsAP~OltJnPHtVhQAL**AUgkdnjCMRRWKJK%-z%X&?GO6RbCnv6%k}o^BUK> z`I;?`$3N5i1CTfSX{%+Qq*pt#FO?@U@u|YN%J%Fs2kwA~8GY_Lq^*6(KY2h=M3TgZ zJ7+B1;$h3O=SU4qvthj9cQtBn0}Acf&%WihwQa_JZxf>rljq}a_J5Oa|Nc67(1>6Ez6_K^Co}LnXwVK)K5&_)@ZT|_x)$a7!FAja z#HGqHpIS%f^t7cQ1XbVD$&*(9_sq(`aw!ua!)iV~1Lcj25H+he5TQ;q7zn`r8T}Mv* zp~q?3d3{1(e9M21IcIL|`cK8NG#z=}*bTtF`Z|8j z!&ZFqEL(I!V2k}DMnFB{KW0@w+X;W1`1Y29vrU=_!`%gZS!6Rod{y=edmCM4yyd|gxo;8~P*ui!$k;m`qa=;lF@bufIiYQOj4Okh3;55Yqg8td*r4@LS50v@N(POFs zglLjPWBUu?(6?q%NKZ*L*1vo_(6>QK#T{zFw}om zletCiEN>R8PacUDiMA&iS?3TH>nsmN2Khk<;6Dm(o5Z-(MB;5Xj)EoYyv1KNWo_kHB6%7NN;auZ1leqh}8U++w6NHi^Td1VucqMI6aF<&|%=A3bxy4YXOWV zVKk<{B*}yEI0dzlL}LF1zIcWR)Qt-b0SzJP9hh%-r2tra7OD7)3{S-QgCH8+UmEe~ zwi|_NZ20ma^TpGr@~ z|7CIk7F$}nMC1df+-=M4TnJAgG(t4O5l9qsB=hY7*pGkt!Q|@80l+HgnHUcHFPIEf zR6)=KG-w};gkTgRm~U6Xia~$SPe>=BGzggp@qtNZBDuq?_^*)zI21UPJ@AN64nCiC zZV9I$J_xq`P<#&lGoC;uF+wVzbe2fgXB?$u>kozQ01oRf!ygJZkMzgBiU0~^)^2fk zieQ5wgT=kO^FlL;P1kNkK!5qY@*f2{_=Cx!L0oRZf4+rbnEyxl=bYsAe-v7@59|t> zkHn+5cFEu}e9-Vi4bfzrFWAXU9}Wb+IUhm)c{cw;`0IfG@)6uG0Of=qAYF`TdQNc{EruQqLpeB=aG0oj<*0yeU}Yl%81^eUInMY-Jehq}wi=GCH%J({<{ir||b4 zI*Uz27N{L``U$D)eD#U2H4eKnTnUjvWS}tX>~4EYhE5}9jO|mLkFz468vvS>@@3Wa zM5b9`UALlORvn=3E~`(J14YTjM=YQx4z~+BXVOa7k@c?N!|Q)VRmzMwSVh6;S^XM! z>7m117(3vY3jp84+`AncEp5F{y+eS&*EZXTcglN`sFkQS06y6{$O^IPy z&YbY6I_7KSYgEZPQg;9*5$358J|i6R&F#|&Bg>xlY zw+g>_2`tdCG9NATZ}kuSpj6*yFx^4*!0u6`Bv)1{drhno`16rv0!2SyBeDy|Ek$q% z#6hv5)VCvJI8lRh5ofDaGs8kWko?J&*yXdiswJI`cX#J9>3RWx>tgGAbTB+mZRwO% zi$V&SoV1fj)gJ%fDV?R;W%YWSZ+Kjh>KMr;9=pU!Fg~AJPQHe=jLSbs5;g-p{; zRbr66N75i#t>o+MECagPupgvbvBN%MJvJo2JehS5MJ>8_C4^5LA!j2+c4UN!<2?lV zm1qKvEGU6PH~|qjaYF82%crd_+W9zaTu5YW2O$o&q*Wuq5X}oR=i*}{#ZYMWRpw7w zDE%N?$5yHPDB!(w?&XK}9tr4Dd#(6-5C5A4Zdv{%R?$O){XNu^(> zY_gsdB%kZc;JE0{x;rvPIpEEXY~Tf$LD(GDN9nouHlwF;_EIvpsT$GXuS95m$MYb- zHGB`H>}tvn0Ji7G-R}4XU7peddEs#`PT^2=vZMe4Wq9O3p zQuxTinHyCbbr*<^wS4F&>9=BzF}sY$HF&0Xnb_r%cka~dXq_a!SAtw7wGV2e?YQsU ztM<-s!%FABTkWg2(0ip0)rAHW1vEp@(_YA#l%Hh4eU_q^PsP>I6(u>arZptgoo5v! z#naPMh2Cajm4cx!NTQJ*B!2mxiR&X@-~bu%dGI{HK5Djt0hgOmA!wmC=MXf` zzVB)R1Moj{pEnyvz1~&5X0HV!3cBd|d0a zKMidt`1SjTUSCj1WTC}%f2ZldWhc&XTRP2tuHKsP-=26K*QE7w63n2Bdc=fLqe`T! z{t--vPQLf)_@|MWu5@_7*hW16J5;sH+kyxELDPM^QhI%veBr5qiX}`xUF#Bi8RO78 zzqGjP`Hd*X+0w!aAOUlHflAQD7fw#RXh9v|5y^+^?quzDDZN(QY2xq9!B42PgzIvi z*^Yayz51Gz{9bcXXQ@bV@(>Z9yQ;QqHCGfaG#`5mW!6n;4C?y!h!YVLzZ;RkNFD8f zTVo-SSS*fc@q+A)!X=O1@w!4^9pFG)w2vzjQ2pt=a~Y!mK-da6l6UmmyVEv$e{q3= z>>h-_G@c_3HE^S4uD!f{CfQi_ z-X55k;N}mk6d|`&`Vfvm%DUsJF+4pW4pEXj*`&B~vgdlvpv=yMCX z^NyS=;}+%W7cm*s+$+Irc0Ix?a{8ENipjry>dTR!L{B~NgXdgG_-C+|(|`NHZ>?xF z##@nWoRSm^zC!mCE4wz&EsB(FCH*$=Dc*j2&nB?824G~<_EXEcJre_LG*?m_OUvk@ zL$t(8N8{obj=2l9%GXodOr(!(&jxZg9Y$>AzqMt@bE#w?%c3U>fyy7KbdMigbswc* z=r6_zW6;5s%Qvhs#%8KIv>apfnwHN;XL8Fq`Q4&U;;M=o`x}>z=@|1iHTEWQ*N?5r z^c?3!0a9}orc;L;`f){+yLI>D3=2YrWgEcr4PmX`Z}C$-ZN;U&5I}pTWr+3UpGO7npSO$&e!UXs(Y9{i z1as$eB#W8&jQ-Q6C(bu2o!lCyT^;8MSx0wj^0Z#fZ!xBNNZx-<_3-@eAO?bV}v zRZH($@|;V*jPkw>jE+dwJ}4j8jsLE-pnsg6?_c#BGgUA0uae_D-xqx;qouF|1+-EOf>t_`v?OHEtTehR8g#!$DYGj}DiEoo|=5>Mb)>KdV2 z#$EW#R-NE1y2y|iMg4=NNjvzyBfzJW+kGY}4;5SR4*Mj7TGk!>x6yfEJumP>OuNXWBb}) zy&<)f*em#BuEru6)QJ`2q>cnuY>oMi0Rt34!8wuTqpVn9fLNzYttWZtV(#XL80unIc=%${r+J6Vup~&bL#9ELax{{YE*`WdM}gQv~xJ4OyI>38ShdC%g+H1{6dm-sf?R!_RwA@nT6-GXSfIJtkZQ<^0n!=bKZa zu6u+6MGdbwEG#47;5@42>d%|3htA6lWx)Nkmjtm*IK1s$y8l*gCu$6`2Yto0<$agm zL7|Q1d;O%QkiB)0`9%2TqU+SJ>+}N>!L+@5r|1?53u}dW3tZO)KCA* z<-5KcojQJY?=^gH&8Uo}p1qcQrXz3qVJJ`hFjOyQP_4ZDTBUC>`b5I015+4!kuKQR zr4~JF>b{c^80w|#Otwzb1-zM<6oiK0*VJ8Xm^>r1@AezL>&xRD)O(Tg^@VQ9!9aTk znpK&M`Ik)lrx0zG8$dI(fhG0Bn|9n2=kpJa6bgF=-)wfh!<{by%OE##{;9a$3|W9a z7HT&$Z!WSOx80_*_F?sz{!RISUEQrX&IYjX-`S4J^~ItxQGqo$g$AUpY-vZ*h}j(x(uJrG1KOmNOmboi*K7s6_e z%WUh)dU9URj=lO-&!=;}9Ed_ghL^cv7Rde3adTUFv>iw-4dvwHW`cs{eQN`hp%Dc~ z21e8HgO39TXnwhz=VMCSQ|2izdkRI{B@^U1#8s0}UUNvqe{9m~}S)(t> zJCoG*f6S@*O#VN8{zqX*AI!l@9UF~g`PWjI0igXi<-adhA5#q6e*=bweYi0y%(~m1 zgLI(Ti$Rr6@T#cELn&-dPyI@&_n9P6G|8+8F^{CYtIfm*+jNQEc)BldX3@~Yi zk>5|L&QgrBDg5wSrOn<962Oq&gx5d$v0xWu*>O%CHpk~bMG`rPsbh#-zmmM+;A1>= z*b+jL1VKF3 znlCHb6SvSKo^We#sQTd!zBR73wBRzHFbZ?rK^FWrcVa0ixXW#pPU^ zr<*+Sy8ayIyH`okAIyDWu5|PM>UXB{ia#lX9v(suLD|{8KR%8H?|0eR1dB0@^luN$ zg-rDE{jW96B-jtV+W|Ujs4>r9ox3psbYT^XE!Q1rI5n_zA?rw zbIL>YK4L2?@D(_+((O_!vY#-pXOY_l`06yo`pUb5!ZniAREvg-Vlx>AN@BVTkhB#; z1?b5ON+P(qkTnbdLytVkhwEJfNoDn70+}A`= zt9}ph4^2XK*~C$&Y-h*|%ny2Dt#!wr#Lj zN*j{kzgeb0D7p00rb^NEvrT@9tB@9n#jO0+kGe{SYMf)xHwwI3x1#dm#_yD7DQ#10mqs)G8c|(y^8yC=SLxMWs@%i! z@cPcb1cmCl^YvVkUtnxp)IwnFOjk`{EH0u&-1Ca%;RS|xf1r0Qrgx3MmKW3(kzP23 zu!Xs@&la+v=+V(5<54-{kFhW^!*YUEZ^ZilTg);DSag^y&;$OJ|1H8T!*r{^-{D({ z|96D>H|YOIFFzRmei!{uzapwP@~<4}Vfxq5iT(ZV*v;MIDE_bbVX-&r^J>O(GCx(; zdxa^0uV`M>F7!rFk-T{E>)?T8b@_4fa@p6@mKoe7?knc zICx$#X=A%f@Jk8JPn`H59K zZXsS?+5F;v-w^$I0TU7qpA0kWaA6fyc;Hf05HvfjmKz8;sl|+CLC(4TZt79L#l6Jy z-25x1Ub}IHC6eZ1qnLR0kk9QVBEWiIK;w%zLkDA>v-_1TH6N26sXb!S_m?lvn{JG#0X_g%NsG4w^oTmn9)Rp~2W_zfh-lKav0#?d`HqZcVjUPH%>BpDV5m z=6u-UNpOdlwR9!}W~}owK!o$p)SN)3gLAuKKa1FL!=?Ny0*2*wFWqEx^2St%#J$*~ zSGe+uc9D2RMIm{pX$cYY8AooUc{WQN=%H)ew%~Q|xp7%$^||T7aL&aOkGTlnZGtmj z@)zTGq687=!u;&~dp8QS&La%AcRb~3E3uqnd6A(#mF(xGhT&!*0BAQ=GC>OEV%NA3 zXU)DrsN&aHjed{cGtCAlaLOzU@_F!xdW9hreobu4=*Fr`+lgWD z4(Q+Irzq4M(T~edzjU8#E57NrN+^}$bRb^UWm*;6E?6#X}b+){tU5DHla6eNiY2^?(Q-IoHZ z+R5)AcWn|0KGO|r*g9L|9l(9!*&HA?G%lIZ6iy z(8Mf)i!?&rCoKUduli>#op(Y)#Z=3#drmyAo}78IrV4CMKW6{9BEORZSYE~z1jiZn zt@($n_tQ_CVAjX&h{hEnSCN(Z3Nadkn_8%a*@4h8zmske2X^fCk1Z@}G2`IA4E0%? z^BAOirKgih()30>`z_d6o_n$_^4tVUMS3XLxhT|qFGl-z4aLu`x@$igx6h_+ZF2fD zK=gp0Zd^}eVNBWd+a|#P;A|<&G)b^Y3K<=LIUlf*qTp{+MDK@B!-J?d*Jf=s?RTtD zuLnlG9PbpsqO{11X2G?NO>|sxo~QhMUK&q?pAAbC4aoe;!Upz42N4N)&Bm}dY(AG58 zomFxIDG`-@cMQ(R#EJe8lB z_{9ku(bpPa026dD9TP|n_FyKJ1my_3MeM(1sSfhpomHaJ%!%aHX7+~MXfqVxJdQpmp_mu{T3HZ2XxKz5PxghO+R1vEIsD@@ zE)Wx6yecM1DSfqMH~qO>2b1}eEm{P*B-!GhHw6EbV8HqUCfWhMq^j96TvA04VgJw& zjLcx`UcLxd8S^Oic)d7KM~~KDC0bIX_JwT1XS~phQbk)TxBz&47Wp&I z2u-F8KO8Oa1E&GfFGv_k$oF`K@)Sm;?=dm@jCU7Cxk};BF28c7c1rOG` z>=~JL(~h>g09Dgne*D*04&S^H>9I6&mrhgwYd(tFa0k&s;NtHs2_&lLvydSrwoTT^ zLn<6tWM%A~;q8X@Zn_ttLsJ?S)`&=+JHIRJYM%hlHe-`J`U6$LpFUD|elT-4%c=z@ zb9`IhF2$u!V$C%8O59YAa%V&fL*!^I3vUi-s~6IjaU;uMHBrlmH3Un1RPJ_5d>GIG z0r6<7yytATn;WY(DHIn^EX|svFxB8Q5ZAge;3Mb#OXv`o@oJeG0iQykKMVZ@ecM%` z-!gAXHB{vTwdkpz32Jyrzgk>^;hfb#4+&m{hs90$(QgM6T(Z;nczQ^zAlAuWujJ!{ z=4{uGLd+EJ%N{h_Z|6DLX-9hiiyjP^@=yRaMsu{)IugQIouZ4LoetL!opaHj2xmC_ z8*p-p{G@f%CGZr+Nu&uTiJ9H9f`>y|R8mcvrvjV9)_x`IH%KG1q{g-<)je{lgZie= zc6Miyrt~fL#-Nkyr1JB5+ubTxfA6>Jp>7@FfhX3x=45`j?>_By1CISjwlD9fOw9Yt J8Iw?8{|Ct{X*>V` delta 12525 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 literal 12523 zcmaLdWl$Vp^B{2C39`7myL)hVC%C)2ySuwD?iN@G?(PsEI0X0LcFB8h)&H)p>h@RF z)zvl6e3&mY-Mu23A|z@K#!jwQj&39#>xsyjtqn1)>KmrM}zB(Cy~J87V(!Cas?lg zx1G#DeO3)uAP%68?liKciH#N6#hsx#)wY@ytztx(J^t!VIYUD2ZKQ=*sNK~%^26~l zd(+ZkaJ$PXe&+>TFA#3Eu>b!2a%KjzL+HEjO=%bQ_VHIu3Rh3ho7qIa19JW@;`O!e z)|OXenwH0#O;`RdY@yEAIG5U-b`Bk5?wPAg?}9+Tq7&134$OS4mkoAjU=H=eAfeJ4 z3gbk;@*EXucz}hD6_?8NPt`{WeZsJ`POGfuk~1`=wzVJO-Cuh+uIDMtpioDGH$uLZ zWvV_BNPT>OYh~lh3$+>W!CmDmXr)Gd+}&y=Eh0u_XdFI!YQ$fHdOb*5Oa+@VOL`yX zWLBPSUS2iy*6>>fbp#(T0qtbTWy)%*dYvM0UOvL-C;fInVpM6ehZ$-SIR}_4H&#sq zTR677L_`8URh_Zn;$yy8m{uY6^@urHj$M)ep>n>wRh#lR3bhe*0GrB}Vj|5DcjT?J zXG0b9BzpIvW>$!8x=tRGRQWSpO}Yjf3ys`3#h-2qynbK}E%l0K%~utB{X)D87Ub*x zMu5Yrl0xm}D!@uJ$D+Gc@>um3^oo8pH7yJm4)rop6=b&Mww|An564rYm=offW>ya~ zLoApo5i%UsO-(%c0|eRMl!@z!{d^g=v$g{rx9jtQubSAqJ+(+n(Gu@HRy3EYwFampqMzKk5Fw&!RRbTgIWEl zH6HDpSqS>+!H&o39jD!zRli*Be^=2hh!8ye-rZr{3B`Cj7AHsyDU?n`o_GdV8c9UH zqSplU+@61LV6a~_{4=zj+$Z#NT1nz0+N)BVQQhGr$5_3Bd>+W7;0<9_{-9A!a18Xj z*vc;?Pm}BU`!o?CN0f2nk?2nUFr{ zaD}_xJMF1u<>j(itSZmtq8N9Lf++9_fWW)UHB~5w?EFrEX1lkEJC-3I!SefA`X_L0 z5KIJoL^Gi*ndke@i_^PR8YMn{q!td0_+nb3l$y+L{dV*07}&8W<5GM8BYtG?0v+Tr zxk_d9erMQ}1W1wyP*3w?b>Z=XvArG4_Ilfh*QRYuciYMU>$g7~fQ_ zWQzYM!L*dQNEGoimc;&z@lDN2p_ns#<^N2q_f*%#MdT0|Xe#rLTWA|R(#LB)xM-gqcW+jK97j zcF2@wf^v$K)PT22_h?z9@CV?7_)>cEXX}^p$5LL8MkYbn{0n#TN<~Fm2VGsElHBGI z*3xp{5KCl^kVaC6WoU<~GNQ(X3=i)o*toZk%Zw&vMV6`_o-)MS||R15@_nRxenBrouU-eK3Py{b=&4Vcne`@^3Ez{OnT<1|diWC+N!B zU`q|mY17-z_pnClrA79>U2`nbHwXpmbjsFR;{xG+QXbPKFn_p&xGI8N!NyuRkjw_< z!R<$BObtHrI(%@$z0}@8vu@z0B%*yo>&G%TbDR^Y!ad2@Us1&_AiZNnNY7ZCiXQj;`s zv|NA4wKA+TLnAm%D+9Bugf!4mvjWwWPUd~CF>Y60^cBe>H84G z){zQ#KlS3*&T(B?pK4!>>+ox_=$b^@KKdHei>2`NWQAtHCVp*bu3*yBhHq$~fh40< z!R5+`f9MrE2yy_Mg5J&L0aG`>9uZiQR)^GXanJ0UhIuQD*6?Nh$s0{Ifd(kvm?~`@ zh83`O0ftQeh)SM`Wi%;Fx1waMs|RM{>0H~IDPC6{l!nXJS4RRAP`E2*-!)aI-v&T+ zD^r1Ou_f^(gk)M0I*aSrx04$5J9QJHt^L2_XlX3Lo$iHMo4OL`tBeAp$KJq`y_l_JW7riy~(Y zUOQG`L${L5hlnGhGfJz|;Fl@~1ZadeA9M0nK0ou+aXxFWOgRnT1_NUbuN>M z;y{C)e_>+-ncblNLksl`bJ+Wt-9X1p#<-dyP@y?E2B_`>B;iy|!=hD;wk!BTn~Fdy z8HxcEMwlml7RUeM@`anAmU7FfF(GJBWCks=*{d|1xAgh71phcDV*I7!Z?Gx zDZtz+uV}?8WF^96WlUrxLonCU!Q~L@CY7x&#hOz}GOUud^^>Pfg{&?ZSM@0zzt_p~ zCR}&MM3BmD{ZXT9_!Zl1rq`wg+0Me{$)yfuQ})IEwf$?yvSEAR4J3~8KoB}inhO$* zeL`?VfZ)sh@#=m7_pxblVz`i|w_j~Vh0cm}uYBrJgQ1}~FvCG>^2+^&v2c~M`TG&F ze!%TLuzsa?>++C#`@X^US6n*H{3cVV$GD@vthm~+WTxw{J}4s!BttfmF8vQ+EK~*M;J~ zBUzyfkLuAvZ5tO`IR-bn`6}_l&c9OAwwFg%ws?gJK~pmm@f)@HJ9t~d>V<7h5#0|K1kXP)b1;U69{y2ud%JXfo! zV%Eq`Gc~typLh@}9YCF`QeHW`h)u-2d7!;u_K6*qtaKWOqz|kgYs`3l+ZO`eYiV3< z$B|bZ-Sdi{;%0&V`jN9E!pR?{p1A)W(7|**BD*_`L;GukgVt@XDI+DJ|4&g=)E{kX zL7}7gB2wN7u>{r>)9!<(+Nj$_RCtPBLFg_rThS9Nx1B*xGu6q|=o_553CcvSiR4f9MrF005{52b;DTK+y$`#<<28{a7R_0Je`>4u26ZQoAB36l=f`OC^dMc zb_@xZA0DU)LcwRRPTeT0O1nNVPJhC^HnBoW4S?$;IPofer`6&H*R}^aVL@dgg}JHE zv;q*YBaQGxiYMKlIqIf8-J9E~P@{WA>>zg2n*^mKW(g^ z7DlE&~p{sIt0>1t7d?!{cLi!XLblE1ID0DPNsToanPh0iikL=7+o-LyiQq z(2rh%0!L?ZOaj<*vP1$$wp7>!^!u>c$Y14~n~Gt5B<_6$seQu#&}5>h726*+CCf;g zf~38Go4t=p%|ffz&Ot1{3<{`zS$tmn9Q5cw057!mVloo56uV%5gx!izv3Zesk{Rfd zd51aN(|ko{*5~1I3PdSNUj8P-A?mk%8+0|N$vwd!#}{)R%;7zmJ!rE~?h3xvH*yzU zGRmQ0)JIoNJv{ul&!_6gbJ4BQX0xNLDYQCK!D(tbhaC=Fzbmx&WZIbbCc(UJ!#re8 zUO_rhQ(RxzTramCAKN-AAvFCqB}UJbJEcGh&8bpLhHxrUj6l-}IZRJ|cIcmRWa=&-R?Po39b!X&c&pj6C)o z!6~Hjl(%yl3o+87`jUEC%F*7l{It!LazP5enhDjk9m2G z&;jJMwV%li+58=1r}a=w&A(_c$k4J6t)S^eH>=6#C2mB2oESb-mBy@dJ&5I zp6*DooZkC#u6Z^w&rag31+s0cQD3PyM=1keK1xBvpHmF}NjT@@OhUBeMMO&2mG7rs z-*77cGGlz%T=m!`NO2uYtae%-T5fV-gne*Y&d2ubz@yFJ)lTauR3TJuQA!4lVoT2!|#b* z1X7(4J3bzT1^R3$)6k}=Fj{VKROjo>QB?Os%u`n54;L$#G2aRkTZV#g>5AhIW|Ys^ z^hIAAi8Lp+v!Yi_0t4L{AFii!Q4D-BNKl4&`^w7q0RG>+r)|M($r#x(I+#4~PE1;z<1AsNj%)ndX9* zV!`5^XPJk={}s&`5v|=d5CZQej>_^++P)%NpYT_x8;HO5o=CnhAJYy+q5q>Bhu)+K zEe8Kb6qWg(w0#e&I0{GYr-_%9=; zn{cO&K6g?$w11|(qJ$qI`yu`k<#iYeg?=H5!u)4+)wB@;?H`j|G_si-;aSKgh`&Ni z!ck)}kG)9L{}JaS>VP2pchLqK*~CrX@X`N1Ekl5!=b4}!{FkxVa2rjfa4#e{1h`2T zIN3sma64o%#9sp;2tr@z=FWtH|3v-ab1J2Wf`f`;gpHzUfPCx_trY%CddGd|K{E>D zpBn?%OS^EeV6dh`FtkJWopMb$%zxm2eEBttkPPwHfM^UeC`mM509qtfOo^(kP->CKfa(SdvN zE0D9w^>e?w&f_xB-t&YKL9kwtaM&mFrMR4_n&mlC!<0^T$3mzv5b)YQcu@;bpnh9; zJXksKWx_vvA{x~@t)DEj&~J$OebcPt%drRcJ03~GRJs+um=fs@ifF^%xy>gVb>qmb zeJ$v7Q4;@R*yzZWMhcgg6#k>W=@p@Kl8re6M#PA&MszbId}=Z684lOVcV zI7|@EBZSbJ2W=We1;f3ikI9`O7<8nhM>0VD5_A6}({waP0AC_-OEN$rKp(qT$nuVU zd9mm@q11iz3YPU0(9wgk`s(zKQEwR}W5~l<>Z4;E`otlLYawjs&NjCfrT>VQ%Xazi z6J!BZm?oL|O;MHOWgxsxvb6iIxq5X-C@CX*G(%#>72Jq4o+ETU89V~S$EvPloWc7B z(Wz~2D(@!hu;2j?vNIoM=$dcsny<4iJyq8dE+5C|`=eWoW1J<LqFv)`sK>;8l|_wHQsDF-?`2oKMzZW&|=aMGPezFq%y(?l31G&LY^X