From cfdf8bc4faecda61e5d8ac407d865bd6f2e1d540 Mon Sep 17 00:00:00 2001 From: David Anson Date: Sat, 30 Sep 2023 23:04:59 -0700 Subject: [PATCH] wip --- markdownlint-cli2.js | 281 ++++++++++-------- resolve-and-require.js | 6 +- schema/markdownlint-cli2-config-schema.json | 10 + test/markdownlint-cli2-test-cases.js | 7 + test/markdownlint-cli2-test.js | 2 +- test/modulePaths/.markdownlint-cli2.jsonc | 14 + test/modulePaths/dir/about.md | 6 + test/modulePaths/dir/hr.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 | 32 ++ .../markdownlint-cli2-test-exec.js.snap | Bin 14109 -> 14227 bytes .../markdownlint-cli2-test-main.js.md | 32 ++ .../markdownlint-cli2-test-main.js.snap | Bin 12329 -> 12449 bytes 15 files changed, 319 insertions(+), 129 deletions(-) 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/subdir/info.md create mode 100644 test/modulePaths/viewme.md diff --git a/markdownlint-cli2.js b/markdownlint-cli2.js index eaa10927..52b4c9a2 100755 --- a/markdownlint-cli2.js +++ b/markdownlint-cli2.js @@ -69,19 +69,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,31 +98,38 @@ 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; }; // Import or require a JavaScript file and return the exported object -const importOrRequireConfig = (fs, dir, name, noRequire, otherwise) => { - const id = pathPosix.join(dir, name); - return () => fs.promises.access(id). - then( - () => (noRequire ? {} : importOrRequireResolve(dir, id)), - otherwise - ); -}; +const importOrRequireConfig = + (fs, dir, name, modulePaths, noRequire, otherwise) => { + const id = pathPosix.join(dir, name); + return () => fs.promises.access(id). + then( + () => ( + noRequire + ? {} + : importOrRequireResolve([ dir, ...modulePaths ], id) + ), + otherwise + ); + }; // Extend a config object if it has 'extends' property const getExtendedConfig = async (config, configPath, fs) => { @@ -155,7 +162,7 @@ const readOptionsOrConfig = async (configPath, fs, noRequire) => { basename.endsWith(".markdownlint-cli2.mjs") ) { options = await ( - importOrRequireConfig(fs, dirname, basename, noRequire, noop)() + importOrRequireConfig(fs, dirname, basename, [], noRequire, noop)() ); } else if ( basename.endsWith(".markdownlint.jsonc") || @@ -171,7 +178,7 @@ const readOptionsOrConfig = async (configPath, fs, noRequire) => { basename.endsWith(".markdownlint.mjs") ) { config = await ( - importOrRequireConfig(fs, dirname, basename, noRequire, noop)() + importOrRequireConfig(fs, dirname, basename, [], noRequire, noop)() ); } else { throw new Error( @@ -272,129 +279,141 @@ $ 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, + modulePaths, + 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", + modulePaths, + noRequire, importOrRequireConfig( fs, dir, - ".markdownlint-cli2.cjs", + ".markdownlint-cli2.mjs", + modulePaths, 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", + modulePaths, + noRequire, importOrRequireConfig( fs, dir, - ".markdownlint.cjs", + ".markdownlint.mjs", + modulePaths, 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 ( @@ -415,6 +434,7 @@ const getBaseOptions = async ( dirToDirInfo, baseDir, relativeDir, + [], noRequire, true ); @@ -450,7 +470,7 @@ 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) => { + async (fs, baseDirSystem, baseDir, globPatterns, dirToDirInfo, modulePaths, noErrors, noRequire) => { const tasks = []; const globbyOptions = { "absolute": true, @@ -518,6 +538,7 @@ const enumerateFiles = dirToDirInfo, dir, null, + modulePaths, noRequire, false ); @@ -527,7 +548,13 @@ const enumerateFiles = }; // Enumerate (possibly missing) parent directories and update directory infos -const enumerateParents = async (fs, baseDir, dirToDirInfo, noRequire) => { +const enumerateParents = async ( + fs, + baseDir, + dirToDirInfo, + modulePaths, + noRequire +) => { const tasks = []; // Create a lookup of baseDir and parents @@ -555,6 +582,7 @@ const enumerateParents = async (fs, baseDir, dirToDirInfo, noRequire) => { dirToDirInfo, dir, null, + modulePaths, noRequire, false ); @@ -573,13 +601,14 @@ 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) => { + async (fs, baseDirSystem, baseDir, globPatterns, modulePaths, dirToDirInfo, optionsOverride, noErrors, noRequire) => { await enumerateFiles( fs, baseDirSystem, baseDir, globPatterns, dirToDirInfo, + modulePaths, noErrors, noRequire ); @@ -587,6 +616,7 @@ const createDirInfos = fs, baseDir, dirToDirInfo, + modulePaths, noRequire ); @@ -614,7 +644,7 @@ const createDirInfos = if (markdownlintOptions && markdownlintOptions.customRules) { tasks.push( importOrRequireIds( - relativeDir || dir, + [ relativeDir || dir, ...modulePaths ], markdownlintOptions.customRules, noRequire ).then((customRules) => { @@ -626,7 +656,7 @@ const createDirInfos = if (markdownlintOptions && markdownlintOptions.markdownItPlugins) { tasks.push( importOrRequireIdsAndParams( - relativeDir || dir, + [ relativeDir || dir, ...modulePaths ], markdownlintOptions.markdownItPlugins, noRequire ).then((markdownItPlugins) => { @@ -820,6 +850,7 @@ const outputSummary = async ( relativeDir, summary, outputFormatters, + modulePaths, logMessage, logError ) => { @@ -832,8 +863,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; @@ -937,12 +969,15 @@ const main = async (params) => { logMessage(`Finding: ${globPatterns.join(" ")}`); } // Create linting tasks + const modulePaths = (baseMarkdownlintOptions.modulePaths || []). + map((path) => pathDefault.resolve(baseDir, path)); const dirInfos = await createDirInfos( fs, baseDirSystem, baseDir, globPatterns, + modulePaths, dirToDirInfo, optionsOverride, noErrors, @@ -973,7 +1008,13 @@ const main = async (params) => { (optionsOverride && optionsOverride.outputFormatters) || baseMarkdownlintOptions.outputFormatters; 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..bd9e4109 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 (only valid at the root)", + "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..5bce13a5 100644 --- a/test/markdownlint-cli2-test-cases.js +++ b/test/markdownlint-cli2-test-cases.js @@ -1176,6 +1176,13 @@ const testCases = ({ "post": deleteDirectory }); + testCase({ + "name": "modulePaths", + "args": [ "**/*.md" ], + "exitCode": 1, + "usesRequire": true + }); + }; module.exports = testCases; 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/modulePaths/.markdownlint-cli2.jsonc b/test/modulePaths/.markdownlint-cli2.jsonc new file mode 100644 index 00000000..57e9e11a --- /dev/null +++ b/test/modulePaths/.markdownlint-cli2.jsonc @@ -0,0 +1,14 @@ +{ + "customRules": [ + "markdownlint-rule-sample-commonjs" + ], + "outputFormatters": [ + [ "output-formatter-sample-commonjs" ] + ], + "modulePaths": [ + "../invalid", + "../customRules", + "../outputFormatters-module", + "../no-config" + ] +} 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/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 288fc94d..6b594be6 100644 --- a/test/snapshots/markdownlint-cli2-test-exec.js.md +++ b/test/snapshots/markdownlint-cli2-test-exec.js.md @@ -7190,3 +7190,35 @@ 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: 4 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 358d4c6d53118057a203423f7b74037ed525121b..a548158644cc2cbc4d930f94bbf5dbcd83cb3540 100644 GIT binary patch delta 13412 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 delta 13294 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 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: 4 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 83a626f62fb9373feed5c9458f63ec568946829b..f07000335db42a2d1ba172dabac9dd8627535537 100644 GIT binary patch literal 12449 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

{_j-nIa3#$aws<=FN0^xI2 z_OV cfiS}${=v}+{My`8@P**4P%S5v01EWK01l`g*#H0l literal 12329 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 a)z-@@HHd{Ar6PQMfrcD?