From 24b02c72c310e133980f33238451367915417a5d Mon Sep 17 00:00:00 2001 From: David Anson Date: Sat, 13 Jan 2024 20:34:59 -0800 Subject: [PATCH] Switch from strip-json-comments to jsonc-parser for better handling of JSONC (e.g., trailing commas) (fixes #267). --- markdownlint-cli2.js | 50 ++++++++---------- package.json | 2 +- .../.markdownlint-cli2.jsonc | 7 +++ .../dir/.markdownlint.jsonc | 3 ++ test/jsonc-trailing-comma/dir/info.md | 3 ++ test/jsonc-trailing-comma/viewme.md | 14 +++++ test/markdownlint-cli2-test-cases.js | 19 ++++--- test/markdownlint-cli2-test.js | 12 ++--- .../markdownlint-cli2-test-exec.js.md | 26 +++++++++ .../markdownlint-cli2-test-exec.js.snap | Bin 13760 -> 13801 bytes .../snapshots/markdownlint-cli2-test-fs.js.md | 26 +++++++++ .../markdownlint-cli2-test-fs.js.snap | Bin 5864 -> 5910 bytes .../markdownlint-cli2-test-main.js.md | 26 +++++++++ .../markdownlint-cli2-test-main.js.snap | Bin 12832 -> 12879 bytes 14 files changed, 145 insertions(+), 43 deletions(-) create mode 100644 test/jsonc-trailing-comma/.markdownlint-cli2.jsonc create mode 100644 test/jsonc-trailing-comma/dir/.markdownlint.jsonc create mode 100644 test/jsonc-trailing-comma/dir/info.md create mode 100644 test/jsonc-trailing-comma/viewme.md diff --git a/markdownlint-cli2.js b/markdownlint-cli2.js index 0d5a85b7..b456da1a 100755 --- a/markdownlint-cli2.js +++ b/markdownlint-cli2.js @@ -35,12 +35,18 @@ const utf8 = "utf8"; // No-op function const noop = () => null; -// Gets a synchronous function to parse JSONC text -const getJsoncParse = async () => { - const { "default": stripJsonComments } = - // eslint-disable-next-line no-inline-comments - await import(/* webpackMode: "eager" */ "strip-json-comments"); - return (text) => JSON.parse(stripJsonComments(text)); +// Synchronous function to parse JSONC text +const jsoncParse = (text) => { + const { parse, printParseErrorCode } = require("jsonc-parser"); + const errors = []; + const result = parse(text, errors, { "allowTrailingComma": true }); + if (errors.length > 0) { + const aggregate = errors.map( + (err) => `${printParseErrorCode(err.error)} (offset ${err.offset}, length ${err.length})` + ).join(", "); + throw new Error(`Unable to parse JSON(C) content, ${aggregate}`); + } + return result; }; // Synchronous function to parse YAML text @@ -67,12 +73,10 @@ const readConfig = (fs, dir, name, otherwise) => { const file = pathPosix.join(dir, name); return () => fs.promises.access(file). then( - () => getJsoncParse().then( - (jsoncParse) => markdownlintReadConfig( - file, - [ jsoncParse, yamlParse ], - fs - ) + () => markdownlintReadConfig( + file, + [ jsoncParse, yamlParse ], + fs ), otherwise ); @@ -139,9 +143,8 @@ const importOrRequireConfig = (fs, dir, name, noRequire, otherwise) => { }; // Extend a config object if it has 'extends' property -const getExtendedConfig = async (config, configPath, fs) => { +const getExtendedConfig = (config, configPath, fs) => { if (config.extends) { - const jsoncParse = await getJsoncParse(); return markdownlintExtendConfig( config, configPath, @@ -150,7 +153,7 @@ const getExtendedConfig = async (config, configPath, fs) => { ); } - return config; + return Promise.resolve(config); }; // Read an options or config file in any format and return the object @@ -160,7 +163,6 @@ const readOptionsOrConfig = async (configPath, fs, noRequire) => { let options = null; let config = null; if (basename.endsWith(".markdownlint-cli2.jsonc")) { - const jsoncParse = await getJsoncParse(); options = jsoncParse(await fs.promises.readFile(configPath, utf8)); } else if (basename.endsWith(".markdownlint-cli2.yaml")) { options = yamlParse(await fs.promises.readFile(configPath, utf8)); @@ -177,7 +179,6 @@ const readOptionsOrConfig = async (configPath, fs, noRequire) => { basename.endsWith(".markdownlint.yaml") || basename.endsWith(".markdownlint.yml") ) { - const jsoncParse = await getJsoncParse(); config = await markdownlintReadConfig(configPath, [ jsoncParse, yamlParse ], fs); } else if ( @@ -319,10 +320,7 @@ const getAndProcessDirInfo = ( then( () => fs.promises. readFile(markdownlintCli2Jsonc, utf8). - then( - (content) => getJsoncParse(). - then((jsoncParse) => jsoncParse(content)) - ), + then(jsoncParse), () => fs.promises.access(markdownlintCli2Yaml). then( () => fs.promises. @@ -346,11 +344,8 @@ const getAndProcessDirInfo = ( then( () => fs.promises. readFile(packageJson, utf8). - then( - (content) => getJsoncParse(). - then((jsoncParse) => jsoncParse(content)). - then((obj) => obj[packageName]) - ), + then(jsoncParse). + then((obj) => obj[packageName]), noop ) ) @@ -743,8 +738,7 @@ const createDirInfos = async ( }; // Lint files in groups by shared configuration -const lintFiles = async (fs, dirInfos, fileContents) => { - const jsoncParse = await getJsoncParse(); +const lintFiles = (fs, dirInfos, fileContents) => { const tasks = []; // For each dirInfo for (const dirInfo of dirInfos) { diff --git a/package.json b/package.json index 138405d5..14ba8053 100644 --- a/package.json +++ b/package.json @@ -63,10 +63,10 @@ ], "dependencies": { "globby": "14.0.0", + "jsonc-parser": "3.2.0", "markdownlint": "0.33.0", "markdownlint-cli2-formatter-default": "0.0.4", "micromatch": "4.0.5", - "strip-json-comments": "5.0.1", "yaml": "2.3.4" }, "devDependencies": { diff --git a/test/jsonc-trailing-comma/.markdownlint-cli2.jsonc b/test/jsonc-trailing-comma/.markdownlint-cli2.jsonc new file mode 100644 index 00000000..c3ab66bd --- /dev/null +++ b/test/jsonc-trailing-comma/.markdownlint-cli2.jsonc @@ -0,0 +1,7 @@ +{ + // Comment + "config": { + "MD032": false, + "no-multiple-blanks": false, + } +} diff --git a/test/jsonc-trailing-comma/dir/.markdownlint.jsonc b/test/jsonc-trailing-comma/dir/.markdownlint.jsonc new file mode 100644 index 00000000..d010fbd6 --- /dev/null +++ b/test/jsonc-trailing-comma/dir/.markdownlint.jsonc @@ -0,0 +1,3 @@ +{ + "first-line-heading": false, +} diff --git a/test/jsonc-trailing-comma/dir/info.md b/test/jsonc-trailing-comma/dir/info.md new file mode 100644 index 00000000..fc9dba79 --- /dev/null +++ b/test/jsonc-trailing-comma/dir/info.md @@ -0,0 +1,3 @@ +## Information +Text ` code1` text `code2 ` text + diff --git a/test/jsonc-trailing-comma/viewme.md b/test/jsonc-trailing-comma/viewme.md new file mode 100644 index 00000000..d60ebf5a --- /dev/null +++ b/test/jsonc-trailing-comma/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/markdownlint-cli2-test-cases.js b/test/markdownlint-cli2-test-cases.js index 24b9a0e6..5dfa96cc 100644 --- a/test/markdownlint-cli2-test-cases.js +++ b/test/markdownlint-cli2-test-cases.js @@ -346,7 +346,7 @@ const testCases = ({ "name": "markdownlint-json-invalid", "args": [ ".*" ], "exitCode": 2, - "stderrRe": /(?:Unexpected end)|(?:Expected property name)/u + "stderrRe": /Unable to parse JSON\(C\) content/u }); testCase({ @@ -388,7 +388,7 @@ const testCases = ({ "name": "markdownlint-cli2-jsonc-mismatch", "args": [ "viewme.md" ], "exitCode": 2, - "stderrRe": /Unexpected token/u + "stderrRe": /Unable to parse JSON\(C\) content/u }); testCase({ @@ -415,7 +415,7 @@ const testCases = ({ "name": "markdownlint-cli2-jsonc-mismatch-config", "args": [ "--config", "../markdownlint-cli2-jsonc-mismatch/.markdownlint-cli2.jsonc", "viewme.md" ], "exitCode": 2, - "stderrRe": /Unexpected token/u, + "stderrRe": /Unable to parse JSON\(C\) content/u, "cwd": "no-config", }); @@ -446,7 +446,7 @@ const testCases = ({ "name": "markdownlint-cli2-jsonc-invalid", "args": [ ".*" ], "exitCode": 2, - "stderrRe": /(?:Unexpected end)|(?:Expected property name)/u + "stderrRe": /Unable to parse JSON\(C\) content/u }); testCase({ @@ -665,8 +665,7 @@ const testCases = ({ }); } - const unexpectedJsonRe = - /(?:Unexpected end of JSON input)|(?:Expected property name)/u; + const unexpectedJsonRe = /Unable to parse JSON\(C\) content/u; const unableToRequireRe = /Unable to require or import module/u; const unableToParseRe = /Unable to parse/u; const invalidConfigFiles = [ @@ -775,7 +774,7 @@ const testCases = ({ "name": "package-json-invalid", "args": [ "**/*.md" ], "exitCode": 2, - "stderrRe": /(?:Unexpected end)|(?:Expected property name)/u + "stderrRe": /Unable to parse JSON\(C\) content/u }); testCase({ @@ -1134,6 +1133,12 @@ const testCases = ({ "usesRequire": true }); + testCase({ + "name": "jsonc-trailing-comma", + "args": [ "**/*.md" ], + "exitCode": 1 + }); + }; module.exports = testCases; diff --git a/test/markdownlint-cli2-test.js b/test/markdownlint-cli2-test.js index 6fe3df66..516bb7de 100644 --- a/test/markdownlint-cli2-test.js +++ b/test/markdownlint-cli2-test.js @@ -6,6 +6,7 @@ const fs = require("node:fs/promises"); const path = require("node:path"); const Ajv = require("ajv"); const test = require("ava").default; +const jsoncParser = require("jsonc-parser"); const { "main": markdownlintCli2 } = require("../markdownlint-cli2.js"); const FsMock = require("./fs-mock"); @@ -63,7 +64,7 @@ test("README files", (t) => { }); test("validateMarkdownlintConfigSchema", async (t) => { - t.plan(25); + t.plan(26); // Validate schema // @ts-ignore @@ -81,8 +82,6 @@ test("validateMarkdownlintConfigSchema", async (t) => { ); // Validate instances - // @ts-ignore - const { "default": stripJsonComments } = await import("strip-json-comments"); const { globby } = await import("globby"); const files = await globby( [ @@ -99,7 +98,7 @@ 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 json = jsoncParser.parse(content); const instanceResult = validateConfigSchema(json); t.truthy( instanceResult, @@ -109,7 +108,7 @@ test("validateMarkdownlintConfigSchema", async (t) => { }); test("validateMarkdownlintCli2ConfigSchema", async (t) => { - t.plan(87); + t.plan(88); // Validate schema // @ts-ignore @@ -129,7 +128,6 @@ test("validateMarkdownlintCli2ConfigSchema", async (t) => { ); // Validate instances - const { "default": stripJsonComments } = await import("strip-json-comments"); const { globby } = await import("globby"); const files = await globby( [ @@ -147,7 +145,7 @@ 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 json = jsoncParser.parse(content); const instanceResult = validateConfigSchema(json); t.truthy( instanceResult, diff --git a/test/snapshots/markdownlint-cli2-test-exec.js.md b/test/snapshots/markdownlint-cli2-test-exec.js.md index 33988dd1..b90f5822 100644 --- a/test/snapshots/markdownlint-cli2-test-exec.js.md +++ b/test/snapshots/markdownlint-cli2-test-exec.js.md @@ -6350,3 +6350,29 @@ Generated by [AVA](https://avajs.dev). Summary: 14 error(s)␊ `, } + +## jsonc-trailing-comma (exec) + +> Snapshot 1 + + { + exitCode: 1, + formatterCodeQuality: '', + formatterJson: '', + formatterJunit: '', + formatterSarif: '', + stderr: `dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ + dir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ + dir/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: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: 2 file(s)␊ + Summary: 8 error(s)␊ + `, + } diff --git a/test/snapshots/markdownlint-cli2-test-exec.js.snap b/test/snapshots/markdownlint-cli2-test-exec.js.snap index f6fa921c275c1fdd1a6bee6759730c77f57e7502..6ade628437e160f10743df3b663c6dec77b1fc66 100644 GIT binary patch literal 13801 zcmbWdV~{36u&6z@?U|h&+uX5jYsa>&9ox1&@7T6&+cxj+!FSL3asPb%L{wx}RH8aM zx}!5oKvjT9$wuGK(ahF~$b}gO6etW4IxN;%KtlpaI9YCWVJ6#gaSQ99J!e zB9bry3g|yB&`WR6N|IF#y-n_#O^EJVTC134UdQ28cegi}&Nt2{&G(zS^9$H%EISji zi_`M?X3LVcavc?(XI*YwFk)n)+Z<#HFeoUES5Og&L?TX*Ly?1n7${0#;c$KdrVnH& zaq%BvV1mNOPAaaQgx(e9=d!-kmlIBpr(7}D?>^i6UdLYDT-fKucOzdxIq$4{X3?@% z{Z@wOW{f|B4GS_3{!lcttoJy2T5vtZe3zFSK>9wOetY@1_sxDkWv_Xj8AtEy?sLc< zb6jC^M88`{?|;Sax0F0{Tn!Nnd%IoVg*?%9bNZxEOl@tQ8?d)y&oV>?KOIrrxhp0EqBGT1XbCz7CXqR5Tt6Fy( zWrzwEJlEjT!cC4^IU{PVk>o8JuPcNZ7kOFIbr3xH?v-IT5tJPP@+^brRh?vnV|)*8 zDnfiAHy?cWc{>)g=pRp zaOm-jQW4G?)=ps0pGKAx8c#BI6_-&C;J+!%7ZSz_||(ihTgZ{ipG_ zkY(d6#T%*&X>frI3!9jZV`z|b)7k^iyy`jWym>~j&scIo_3kI72EwBJtUzLB2;|9% z_KDL=aNvlcK^C1}33jEavA)KDU2M6Au)Xv-8Yjk&6Ss0orNUJ+n>52;OLD7Y7QsSr zNu^b69*ed30gK$?j%M}P+0$X+c+56%&4}HMO4n}F+uU~BvbZZwle6bnYF0)rdow3i zlLn}*^&fQZ-ZtC3{4i`YskuQi%7wJYix!=nt}OFCT=@?<$YYF7t!gNKNOi};8u8&S zf~P{5ehvuMfLaFceuvoTFlDCMNYc;Y6|!E{i%HZ=Fxqde36%?^bsfZEVGMxGC!@gM z$(YkZYfk|yr+NIg*Hrc7;_`vqab&l9+9wOD>~S?ht@M6T=`v9(TtdJsZOUk^Ocqg_ zGMc5eQzfU8<1W!+VMkb$lBwjkfKx{8GLA{cU0zhIi&1KFI|}5*D)3U)PzDJd zQ<5M>Gn&)({D5&bZggo?l&t?t^?a~rk7tQN=dmAZ7h$_mMkwt23~l=1#WvB^nyQ>} zdt$4xpHIUD*?gKnY;BIWKt`?rGz>p*{S%Km<_1~gX~tug$-13q86d<8XS~Ph(f|-$ z#L-Et>9{?MVbJ`nH7P}FzM!0S&M-jrZX5H{Yze%YcguiShi6>ctl+3iYQ*m=6ZqJ>>wa$8=q262gq1qMq{J2g!ea` z$dMI0N7ACNay6Blm>gp;!3TR0IA6A#MJ9<|J=@m%-1IS?wxCs>mnd@(qK^Nts1SKi zO>3$*fR+R=o=H1X4Di~o-Yk7g!?O0Zdv`g0+Lh+vhg|-ocAs&$>`IV(h3CWkI03B% z?u7uuMY7`mA3}~c?#=Jw)x-g6A*2ibTF_nuFz){$^kmh7@)_fR{V$vU^wN`62Q1TX zMXx|HdbIwYV$ZhyGkV`Ad%tCSkK?KxZD^$2!dMlN!+*%YJUMRy5~YVju( z0b0U(b?dx`3^U#n_;kat%)9FOmH}J;5~a5=&3MBJ^YlRX*=#d@Y#@oIFRYoji{`$J zxpx(XGan$ox{RZknYD@&c#ju*AWL7zHX|l}^tHx6)0F(!K*^ykeDQPLx{b`99Wm@U z__P&QLb>ZM(ETS}x995wa!TjD)X}G{jv{MC;P6o&XJ*+?eUjW|y*-gU!_>=FLDz;> z*|jG;>cXm%VwnXt7ulKfEA~)tAsrw< zy$`SNd4rO0o#o-`M@Hc?5Yu$|O+WNNKbe|prJ_N;d)gvpP@vY~dyu~1f!61N_M!6t zGCR2+;t$>xt;?D$otHKwa5rO=$2?23Zaz=fVGm9KePa9;7Ui$`>~`8+0~zVvWrCO)`Dsx0)co`YCx67`ig0} zO-Vr8p@kt5xPgPDA2mcBZX}gHJzQ@Y*`ZOnR?eM-0V4LjV$_3#X@n6qFD32zBpi`Z z8ADMs#J1C{BZMwM1xodYdQdLc znKJ$pwhE-?{f%ZsD5I)@bm(J(J~Loa712th7F}Q`2TLoC&0^kLr#-3++%d6((Bl=m z7QI&$ObgjcL>?br8K1AI>`Xlh2j3;%OMAh_ON}*47~SFY`#|MK!lvqvobDEFpA@^O zSpvp_wSYaS=zOm%WFOztGvXCsGng4PXN&OHAz4v|?aopQ29GA^wdf^f{N_H^n5}KCB#L`5K-z7(bM2`Wg(sPJl??>qs|$UM)?@kQVGh1 zeAMzV7(7)x42}&+?HxN@fB*jQpP(|gIF^n$70=kXmrQJ9hLxlGmE(Gq(>hjl%_}6P z00KP#nHqpi4)7y-FTu^HGVU!`;w+cIT0ViPR0fkp9i2rSmEQ*W0;@mT9-Di}0=oni zoU=`81GQinwNuBy#eQ5+hPUIP>w3Cf>jQPWeZGBA?~?%PgMSASgby9UC*3UEUkyQ* z)9ui%0`^5_huwd>0lxe6RwMd;R!86I^666Lm-(gSV}5qxN`#x@+gv2%`( zc{8FR$LzhA40lQ#Zx7i?+?lLpp_59dtUoheu0~U?#*=S6_xWem@&|_NoOSjqf(uP* zzPX{044;6{A^Dv}Cg1ucH;*sm)kEdlJ19H?4jv1K+0Fe4?wfLB$y9_ch{qjc&45hP zTGvCp`{GlM-iCSOXBKR3lYn*L8t=0OH-78)R`Ce_P0LBhhwd^__)ZQC5l7l&*1Qv5 z2ywFf07|&JAhHyN0kjBBUMMLV;16-~acAh^=2&L zJ3AIDg4GuW9sCWT=XWVjVx=?P(IVINWz$ltFCYwHC_WH$v3yBIJ43Z-Eg(BxsyxSz zZ-@pNP7%$ZI61tb*2mRe#s9@dfh12vN`-VI%5TdeV(axQpFQzF(5U8E1#5eC z+dSxYJPDH+6x+(Es5TaENEs%f-pi*c4}_QR<>Pl9>xdC(4&j67yjAml?v}U$?(Y`= z-6l{F_4-|mM85Pb5EI-~>)%cOs}P#|c;-=;>DJ8hxVdcn)_!Y1jldQ^olB0=P7r)8 zDzP$s?A~1Y5ze=&!Xz4IBZt+O7lb7?+K&?ksOjzSo?(XVm7@2%M(sD6Iiue}qxb2I zbKp8Z3bWuIXBj;-nX{sAA96#X9#+VBc=4mdfjQHKqOoHQ+YeeW773UqO^)*upzq}N z;abJ;hChD|+jkGzZ@6+sds@WoXY<@2g6x{JXOp>KW30@xHKM96$&?o%8P@7WSdisD zqDr3Q#u22nI&o4U*lFQ!@Zyq6@p5(`QHR)1-T!^lths-kk7b#TnD91txesz|MD5*7 z8oiIT_kby1Clq1Yf9uftl=*LF_jTt1e8 zDa-QueMGo}e-^Z7ZQqqdb$nvoX-!%Bz+SlK=xNj2c5{GCiK;O} zZ$592MO?kNXZhZ3b2iOcdnDyUUSB|a&lIz(=D%-=x%iWM^zas70%Sx_g2@w4+8~2n zXa4LFwq4!cMbS!_S}SalO7$%rVQhAp?rrkce)YV8o+DQB)qYJCJU%z07`Xrb@V{-w z-=`1z+55DffB8I0p)fZk6nF|*OqlBP`_2D!`S(0M#QZ!0HE8jF!;Ur2hiX|8c-$=QN-ArR> zO5McYa4-459EGnc+%i*fUZADJ7Lr+!`b3^`+I4B%J1>nFl=-2}u-20KA?InNn|wg( zvR+}A(IWOB=FWPw-rgxja>=ucy(*{e(ts9+__HGP;`yV!W6ti@(?t`<=i0oITM!k* ztk<3aA-OM)7Kgij*79OnTcFC>wC~5ePGJF+pmSwN@X#5`a8r;)hrJ;spB>h=)M;FQ ziw#xlG17VT%I~Xi!gZGxYNlk#7V6>@sut=w8Pbi#fy+dgBmw+&Hi!L)hLR{dZk07u zQRUGlMFTw*?VyYq4br+yi^l73#nr~PRc1}VyUVaOKi|V@4yfxIuMnR}f(V)cjK}I) zDkpup3GyIg)%*c<*SDH(#rNbmxAh~R=jjat)?|tOtgKKipQn`ykh4JzJZs}!bhFpU z#J1xpPAoA|2-c9dc<~yubD?wHJ-@0 z%@eU=I;sTD*LawQ;iKl^_WGq=4oF7}S1HYz;?{;q0+`2Mng z%Le?*jd!B8$5iSCR86Isq)h_|>-s@st3;cdFON~1QE|2hW@vk6Peeez73920X=nPO z_UHi6WHa0tYb8C7(Uduz>|<7m?|GY$Pv66Q84AkKt+Ew1ne!497K!s(Q6~vpQE#&Z zu5hZE;cb26U`Ye=B<6)C>68IRtB|B}c9Xfr6*=qbL4uCQk54s%p%KtKIlHQ|0qu40 z>$#|rfry`x9h#@US5Kn7-O#$3ixu{mZrtQBIJkFmcv?bBWn-82fUD12Nt8e#fow8u zDDC@Bv?*b3^K}@;+M={k{fmg{Bavg@j`hKl=x6wPo>|!&b#m*;Cd>gBcl&%k#Z>Ox;W}}-a5IlwwW7MhC>Xs{ z$)!5%+>ojRvB7zU`|P22RhDQ9pGUa{n+9s|oOpXJGKBtM^6y2m--Atr=XtGRvQe#3 zKWu2wZi^{#Go zTpE78Fkc|jK!3SlkTzOFmr4Z^0|Ns6OJFA49Wcbp4?oO*kcViv30NM3NCN%kf z-Px-jwF5pD1S0-N+bR<96{H{dKRDy+dqKPqdtm+&p0JLs4h;1Vz&KQ#v5em_u=+m) z0D@x!Fm}IysQ#gdkI3PV@NdyMRNRqU&#vQtTK|fM%;bhF1^SC!-kvIsvfnl^5HJv6 z9VpI1%5NQ5{vUupFpRKNJ?B7${}6xV+R3K|f&vP~hYV$@0ljJg`49V%UFV)hRX?xXQpA_RiRE;oIT3n$smS(w_2*{Je+2=4En)iC_J>eC!w>5uEI& ze*8zBnP}-LjCF!!=}wsjsr>biK?#(fycXF4QHFeO@f2hhzYwdRY(Zs4c?w&b$U;z_ zLBE9SRd?cY>-W@`EcbJFNAnX(QCyFbSRA1u-@@O2Ez2Q=^=!kSm6NV_?A9D_8}b-w z*f7g&rIq;W)+=QsF%ZYH5a5(__|B-T1n1@}tDAuz80iL{;nJY97)_4lsJ1lzx-~x! z-ZFc6595gDWe>kB>b7uj4pOnW+sCNl^ddh#T*|NuG8Yq>nuKi>aXo)sCg<$jprd z5E^}IBB{k_$~-?ZBCytc7qIVIKYB+JxZm8GgFt^0Ab2s*IY0TgHt^427MZ|u~wFBPs0>Lnkr->+heIMuEJe;vQ2!PelzyvuX z1}TH->Zh0R8Vgvg_<>Y+DrOX~hk42Di5z`t`eLu4<1WL!n|WM>Ae=fyo4FD<(-6Zl z+`qcPM3{{Az41C6Dt_Lvc{h}fp2=Wk$gFb+<3*~6r%ha#OTboxvH@~9a#J8n$VBXW z(Dd+aEBl;|Q_RyZK|!$#@o|KU!PKuqhwSyR6%9cXT&<%%`E}~)BlK&+YH9|u5nc64 zWQExm7BN*gU(8N^r~4QE5q9@Qbrj1aWHf^G7N^ldVA27HPu7B}R4RdI5X&ioRYxnL zeAF|~)vxL;{cYH55@+JOq6filj9G4AIas{K`=e6TbQ;!3qE`UnXxW-<6YaN;F3Weu z=3fC54mAwW6Yk6}dXl0DefI0^%wvVVuD4r5n^aobZZ?pgfC{caKC_yQW zm1xfQy8u~Y=n=k)1MoY(_pU66yX{wbq>)+SdaII2EI&F%hvF3hjI@ko!=F?miFjrP zn$lG2mJr5OWK>|#al->#*0`6XYsC|xtirZ#wI4V-K!%LCsIU@w%}lTHeJ^t8kx{ya zzDI&zk8pp4p4!_MR?7o*DaYqwDZT+B@na$aWxW$rtf3l3nyD(~AsWk@i595Adb&v@p@-?z zw>9e{@^O-YmyYJp5wh^n%2Tfz4Yrt$5@}+o!)ou3^YEI^>Ems$Q*Zke`Fx3`h+2VL z+r_tD*mGZ{(T2Dlj~4T7E;zq!#}i)OxyIiUB{UW)_@d<>ihtri0JM-@!9^2>Sdm3Z zcd`N-y+E4{4M3YjWc@9en_q7Y^ul7GnAX;!5{Y%U4!0&-ZksiiPmAm&@9_Q?_hB`) zurnVzeyN6Vj9B;3d_xl~83^3&A)jLUAv}&DpI60bzdG>ck|sJJVN2sBlGvyCld$6M zpdRh{@-oYe3CL}Wbw2oY4?pJHt1`D&pSg{%%Bz#=-uZRZ(JD?1=u4aU5wGM}Jx}jB zl_Kz%tGx4(ilszPve~pwQZ?oF2a!*H&-6yk_7dK2y_Mf5cX7-`8o{;R?7K4_)VREp zT>Ea`uha{f9JQxYpGZ>~w=y?Ra01pKvXOB+2YGW3AyXoXUl{cb@>7#V&>$(@syWq{ zyP{Km*JI3j)^xwEVJ;h3OtWPDvJz>(js`0WxYGN&%i#MMs<8d&@c=^||Ha0#Pho>3 zNZQhX)==(QCS~E-iU3p)x)AWWf%N{mqRnw1bYHjZ$&`(wC)GDUD8_N+$~$gv)?=TO z=CF}7VKF%Wx&3|ooRElX#m-Yc*asnD5TJZ`165I)yo zYdK#5!0<9&ULYgq+zBq&^QYU}#}Zq@)Z9g=Bv93~J&RzsiEW9`YN=_9Zn_O{vj_if8yr zhPa^Km1`J3grpildHIS8L^(g2bC2tA9}#_60JKv z172x(Peott@}+AK@KxAd>h&nR-i^91qx+~~Mhx3CeT1S=)`)i_J9hMYr@r3lE;K=c ze?Z7)HdWZZzHJ{ONh5hwd%~{YG3gxnpKC)Aq{3bG^xtKI7K!@ogTX=xWytGZ$~0b@ zShu9u_aJcqBDlpaE@aO=I|_KxvgPygI;IP1$r#MH4)M@{L4P7@7}XG-t`JfY?D5vb zJ1Uek%iW?)R8X2Sp|fI2qg;f+-PjZfx$MYcLxOQ{g+vd*9Jt`X>M=u&B(S;jaYKbn zxS-ua`bV->ybuFnia`e%n5q)>Y6(7UbcA6{7a}qPTLvrxk&7s3`kVb;w+*F10GB+3 zgWT!8p-39sE8Vt|Tcs@7zKw#Wd;U$iB$b<$ry;s;>E18(^*;9q@esF8Fp;Rml;hAVXP zu1NFe@$LLivX3iKLksqVyR`r@4_c%ig7y= z&UMPa{p4zb-1@E2VaxNh5c`CIQ^|dKSOlqEnrHWeK^Y)ucaVe(zN(4e@6=qquw`+Lwz1mbVU86?Hkth`j*J) zX?FWye1(I!YY?@=I02NJc~mQdW~X%`f1yqC z0K&4crWkX*cmmo`rR-a9SR%&=Dko29iArjCm;oheD5Mo6gq%r!*G{N}4A`~`W_FV}yh_iPD>X|uo&CKpbE zo#@1V4bq6PL#gxh_UK|*-v!@|so4a|Pyo1orb1-!*m6PyRi^m_u+B@xO0mVy38R)? z6x6v2Ge?aPcVnjwl2oupO&ORwO)+VKGx8tXwa_#l$0HF`M9v8+98zJhgwL^>$0l0; zNYK`IWfv!<43zv};4iXc;f#>XJFzzw-gR89it~FcK01>m4l=MI$svj}Eiy=c2CiEI z(>OP7CER39`tUy)na3+WDF!~j^NzbRxyAeT8mkkUAN^^hLDt8h8@^x-Y`01=51Edgfy7_rOY`|xRJ2X?xV_ZVp%fSE3I zajXed#aD;-IZY^xlDJ-huzo#9fEZga8~g!m(Ea)0PlTTfz4QKO-WxP-E<(Sj{v@@8J z-TnP>=K{2gpgCvrTCtM8H0ziyA z0Js0AX((*CXz?)B%*2e0h1P!Xg6A7-ImMI*S_$>FXG4|UMTMdHrLvHCjdb)q0>nzt zWX_~sQ_J;ybl|w@Fjbm^2pOlnK~#NJP@IK%Oj>`Nk0>a7bxg)leeGD}-*|`jhZ^Vvz*?Oc1Z$2h+ zGUL#1d%HfT2JJS-N70HWS=S;EOd2O1s6&jTZygLW38(-~%1%;LbrdCNnlO3>(&t~y zAA0xrg&V1LubaINlo|%zMG7`)vW?h>Uhb0iiKrpAXST0Ov20}O`O{i--fY*!zXWiy z{qar%NFcyYlXg}oq9l|?BfsQBhqPb|7lllYbc2ky_#fAm%QoiK4icrDYab^Qgt)GsE$BmK<`A3MFczW zqK+aiXm`;QRU(RUbLvsg|T*@z#KD=PwTTFad{1)DYgEP?-0{W!0Zpzq32WZiA3)Ww<>MhtU^dD z2V%iwiru@o0W~NOYx&rno>ZHi^I}T|_DGEi)BkB`VXXa^EVSB7GD;Wy~&PaKjub`)i zI|zElHTxw@h7oocG`yfy{0qjm#;yZa(V?#(ACFaMimt_lR?5fjUR-TuT#7xN>wP>| zucCKXLSt1AgZgC0%RS&VV&vsrGs_wNY2LZyoV(s*>5j6h^nA}H-pQq5VU8%T{Ez>A zY?#oveWqg|3YJI+G2OY~P^QpCrO3{;g||3U7it`RQOctIV2kd7#kr~AtQ^G~HU&33 zZIxFp8Z9A(`0Sg%TEEEI+K^YWdg&FeFS~7Co8BuIT6v(LGp^n%LeN>RJpO-Z@Kpg2 z|D{>J1qkJ}k*S;n2s+D`(skU(mm3i(Cwm(5r8cOJ z=rD`^mFOiX{}Jc^W%mCJ(6*Nt^e>O<4V(YY^>0$y<$q@ga0K$&sM`PT<-feP#cx{t zN0MyBr2jWs7Il-kd@JOCWv^qWFl~;U2BAXn*DlVbeFQ?j^vWv{@2}RwI@k&Uvv^7H z?+Nl3blxTV>z7D>@xOQ9{00KEC<1X-MUGak!bfd)+^xr4Ah*X{f+-@Qgn-NFfH~DO~;$zz*LP8;cAO^*KQ)oinh0{t?t6pFsK(I ztCV$R+_5@J`--YIkW39_G12#~l~vWKj=E9BD1TEk_4f&*zntqEc~+t5Cg;&yQJw~* zKvS}Yhp?>j))yt_?0%dvMfpT?7h4@9C}$<)Hx)WNNj{d{Q6rLJ&XZ(ts6QmKf?_%9Qw6t}+vbytoU0dg{an(B9>V<}Z>_<2J zB!RPna!89_C4~qdEQ*KSwo~nwol5{VnvJd4EhFC7*>LRbeWJl9x78|zK07ak_MR!Z^FXIvG6}U5xDexyY z@~l8Me6p#q8$NK&g#DMphZ{a0hJ>#W8$R00m&1138lYF)f$hMSKj$^BApTgM?r65v zqoPz71zMg?2}-skBOsXd16x1yapZQwyZD2y+3|DFfFPK)>+k@aLjI|^2xiwhZ%8TW zLhY`~nlM#JGI^KP%x0ZN%ec^^)z-h7WW0BgMm&Nl)&74Ev=LOXj~*_P0!!3Joyq)S z{~RrknL%sRR1_amYk=43{y0bf{|4tzTBA<7Zohv4tu2<$P4hKsFw8CMTg^FzWu)D` z-?StsYr1>vH*9$a?YqCxhA;Uh?N3fMm2~^ZVL91i4MG3+kU&06W+gOm%{+|l5XE|* z9hT}IE?XOCwypCkvi_RD9`70PZ(INQZ*P8-VEA(aJo=p+bIM{nD1~aWV}0E>mO6r~ zSVxc-y}7y5i>fzAZt!@rgla>lB(gF*foG(g!&6mciZ&9WEx`-T^o3%|iz$G)5<(MY z;(|}s@u%;vWtu(gG4fhovYh?e<< zeSs@5tiP(B!#&y4r+(u;13i7aa^|D2YC5IRhl{E#T_z-(qTKVlhrC=(_iqaUJ$k?R zZ$lwrzs1%O?->$rSZ8dBI)!<_>ANGWEGBYaX4K7%J1Ky%xR>1P2+OkAn+Mx8=jeX# zA}WgwZf>;wdsuDC8NcmNs=LEZkBUTy=2KI8XmPOyb=H27xZtk2MqhE$NH0P7M3?<` zF;$l@ioT;W+gSQ^^)bc~jrNIERuxD<^Un!3v5fzqRJz;K0;Se#2N82Mls2Y8 zZo~mP71x^8lN^>S5Jf+|%QkR%qZ+M7sV*9G^4^1ySrLtrl>9n8NIR}_uc5@ zkdt^)x!@nW$;$o4B-ZB8{Ynac0mE*&<&)A!U; zVfzUI=@%3iF)so#Bu{^yq>u&0~&86;J_yNJR3Zv{VH3MDAWRsH8~ z)}0C6-LdgmLsTeRy2mIE|4q-2C85woALvnS^WQ{oSK9TK3nG8>6PVPYX{9#&Hqli3y#o79_y>QUEqgk}{WB)s zd!c*cykPBm+nn%G>Y937Y;spq^-5XSn<3G(6im!r36piTo@TLx#xQ#Voo-nOo;&%l zEwKp66)Ve0fShKrW+PrqV{C5VM(DO^bYE5VOg;~wd0n48$RmB@HP2};5}SR{k;ZbGzRb>tf+dX7**Z_zP--@4iFeiM z9J9nU6YDjj?P2a+{>pZ2>u-;%&{s^d5#HKI0NGrbix2TX}{C2pw&>&I;! z4*V&dtRMz|FVV@t<(0s(8pMm=ux{*#Td*b7R#3C)z*0dDG&6hrTQ8Moji87&H>V8W z8`C>bL9^9cH5d7zGn8d7c3PU1G|3z<3X+qWtWkNSL;d!2;P}IIXTgm9G(-|6 zP5L;1LsCYH)&hcDv&Y_hyr5Eue$Z9JjD3+&9DV}8I<$hJq&$JN$RIQrS&L4#0s*Ql z{o&NUJq;cpXDa<*6EI4X4<5YyBn^hh+vIgsz@ zC%8V8gY$Znc`M!jYOK{Uw`06I6wl(sNu?A1o27nlWt}X`Is|P{tWD%>K{V}NAjw+3 zkW7LTk*Uu4v@`)hrlfaise7-{HvKcrvl4zk?hIx9?orc2S1a4b5#HnxBOn-g*lVBK082L(^w(}dBz7G&E} zwosUB6`i*@io19_$hjL9eAkaL4P}0qg&c2)06n;%*K%goCb{N#A$=-1VN!f+bH|wn z`%P+lcAYY%4Robl@};|;qdERY&z7w)l$SzUxwNc?BO$oLVIAYF=lAL)g8*1aiV*pjck-z&0`G0(#fiec0crVhK(HbPedye>jWQla8X11an7 z=(o)-?~*0YbOFQ=B5>g^+LU|bV#YQ~-NOAHF*=|5hVt~ey8NAf9>9+vXGJWJ4i1Yo zdKhq*{G)#Hz@(s(5Q%UUX^M%Fe~X_EU?X&13^fj~X`flDbZ+#1O`SNiF0io}@zZ2b z^6r>|!%*@pLsm+!qi{feFaH<_on}PONfLxa2KfsWg&;X$3DY0=#qk!|g#1sv32G6- zO>4?GC7YB&vj{j^QLHu1qp>cLdlOXb*F8&j>{q@km%aCmji=fH!R(dgr|WK6izqw;STheb#p>wcEC zWOJ_3)AsIc%)so`%Qs$M;L~>W6$CgDv0IApD?mtPI!)UtPiGK8%k;7-VF|{-^$#D! z(Vkd1FWm%xPfllUYLnJ%OmLCR3%w5+-Ax}4`x57OEzI(@Yz@Gex@B0=N1jM R-uZ9DZ-brbK58(a{{y?7{b&FH literal 13760 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 diff --git a/test/snapshots/markdownlint-cli2-test-fs.js.md b/test/snapshots/markdownlint-cli2-test-fs.js.md index 3513a0b7..346a002c 100644 --- a/test/snapshots/markdownlint-cli2-test-fs.js.md +++ b/test/snapshots/markdownlint-cli2-test-fs.js.md @@ -2473,3 +2473,29 @@ Generated by [AVA](https://avajs.dev). Summary: 2 error(s)␊ `, } + +## jsonc-trailing-comma (fs) + +> Snapshot 1 + + { + exitCode: 1, + formatterCodeQuality: '', + formatterJson: '', + formatterJunit: '', + formatterSarif: '', + stderr: `dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ + dir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ + dir/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: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: 2 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 6440847e2205e94e69ab4195ac4057e9610d2a85..8152d7cabb2b58502f906f02463b86e06470a9c5 100644 GIT binary patch delta 5824 zcmYk<^;gpYqkwTF6ls+15j*-&RUDDk#q$IDt z=bn4t^ZEJt1D+kOWNtoLeOU$_XG_*bMs?vq8!5~_bjf#R9x}CFCQ_-XR`wRnL2%W>hxj@ z3`e0exiKU@`ONxhu1e+}NRqY($N*D9^Zn1ZZ!(2(*E*u6q7V#54_roTW>{-9(X~Hp zw2cu)SIltch?PxfkPI*4T>K!NRZymTaes5Q9-G^5RpgGN2PK6xRG-B6Kh+ieBflxI zXnBg|tOc>Cs{Vd_s|biK91^n^mvUc!Q*>nY4o-Z(To-$2dSld{0gHs%_{4AXh@wiG zx@ zS8&VJh28J?3zkAt(%!Q%_XyR)`#bw{ejyjD#tH9YqA2lK8YWAf)vD*w^G&n1PALsd zrTcmqnZ1%sL)@gPB2BX>Kc_wLQoC(RL)Vu{QgYY%#M#wnGo_F34_D6(dF(n1I#oLj z;F=#Dwo>cu0A4$}hyIzRj;{JY^*?Bjz(MLu`^0jiQf?7>Wc6urdjtaurgV_5lE4v* zqqUk;rMoPr#&#OT#bj@ub_gvsf!EICcwO`CbbY}SzcYhW1=>C_HR;?T7SD+C<@!cV zgfS#uHCX(j0-CW$+d7>O)uF|Gt+;3e>X~1t(fdscMC_7zdf(0SDuRS0XYymZ$UYXc zBby@gRoR!0_-Z24en3(X%JWN8F3F+^Vq|qCk6U-Kl_NYK@fUON$3ruX4Nn_{zEwiX z?Mx|X00+^Arbd|}?--XSg&qU);EBnJ(_qP;SPv$rH=+QPGQF$a>9eFP*Wm4TiT?4~ zi**8^s_GPoEeY4E^nZ=P)03mAzO2_Dej4ld=#~2BcUVcAEWQ4_HeUP5Z&Q^`*q># z_Jo+;gI79Dd3L>-y!6;fCA@ZigkAUMD0TUYnK0&=SLtJ_-nsY@PI4BlnuF@qvJe1w zirj=7Hin4M#mfz9&}4DoS8&+N|FoKvZa&?5{p=%W2q;I@3B=~8tqAEQn%Jo55g`pK zo5&VZH5n;b6NB!!6-zet?yFg(lzgIOxi($Oz2P!k@YP@AcH>NcEaO-N(!#BjXcBWr zIN8t7RCTvptl%_PH&a=4wN)NGqXe8=y9H0ME0?z`@OUPvEJ}WG*wHwTRh~8E)4lh+ zlK<5u7mJ+iFx?w(Puxi%lX#oi5Cm?t`jxjGHs7D7N1C0BPd4M05?;YV?X!7sU+`qL ztU3+*6}rf@5)si8@2N_Uh9-3rT-@|N{T>2VEC1kDXht`zY$orGQpw>vT;r>U3^Q7-@p9 zyF5IRTm2eM+7pe0flcOJKo*+pqabulENmPik`*_-fQDX}I|`16Ns9f7NSC2V=3QVG zx-3=@4koD~I_Z^wH`~7m`0t8=?Z-3rAMj3m`j9nJ^G%mEl4aI6J0R?AdPW#Dlt|1} zc4r};bQwD3;fQG-LjUe~(ITdQ*E5L*Cq7!{K-Yy=aql^~pm$mL)ShYO4D(Tin7nC9 z)84GilCJFl@BNJsZ%yOD@vFqt;c4oti%9bH=*G@yxSi@WqL}fzD=+lJM_I1mpR}LEMS{;M_2O`BwaPJy-;EEo zkpZO+Aq#cvN7^|G7cJxs%)2ory#sc

s3ntAo=!`yxt*65?{(7N_TSIuu=-a4X7^ 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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 6c514e2b..1832c140 100644 --- a/test/snapshots/markdownlint-cli2-test-main.js.md +++ b/test/snapshots/markdownlint-cli2-test-main.js.md @@ -5580,3 +5580,29 @@ Generated by [AVA](https://avajs.dev). Summary: 14 error(s)␊ `, } + +## jsonc-trailing-comma (main) + +> Snapshot 1 + + { + exitCode: 1, + formatterCodeQuality: '', + formatterJson: '', + formatterJunit: '', + formatterSarif: '', + stderr: `dir/info.md:1 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Information"]␊ + dir/info.md:2:6 MD038/no-space-in-code Spaces inside code span elements [Context: "\` code1\`"]␊ + dir/info.md:2:20 MD038/no-space-in-code Spaces inside code span elements [Context: "\`code2 \`"]␊ + dir/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: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: 2 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 2c03c3e1d32f35c6a765ed539e7b1242dda52589..da1984dd40f7f8bd115c3eabfa787a38c17ca323 100644 GIT binary patch delta 12715 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 b49L$~cq@dV#b@>X1H6_Z39#A@3HE;gl4%-h