From 3641f1d2bc9dd13fe0db3a792e1f927d0e6498b7 Mon Sep 17 00:00:00 2001
From: Bogdan Chadkin <opensource@trysound.io>
Date: Sun, 29 Dec 2024 17:41:09 +0700
Subject: [PATCH 1/2] Replace arrgv with args-tokenizer

Recently published args-tokenizer package. We use it at Webstudio for
parsing cURL on paste. Used at
https://github.com/antfu-collective/bumpp.

There are two benefits
- published with type definitions
- parser is forgiving to unclosed quotes which can be more user friendly

The package also is esm only but used only in CLI so should not be a
problem with commonjs. Though I can add cjs support if necessary.

https://github.com/TrySound/args-tokenizer
---
 lib/node-arguments.js                      |   8 ++------
 package-lock.json                          |   9 ++++++++-
 package.json                               |   5 +++--
 test/node-arguments/snapshots/test.js.md   |   6 +++---
 test/node-arguments/snapshots/test.js.snap | Bin 583 -> 600 bytes
 test/node-arguments/test.js                |   6 +++---
 6 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/lib/node-arguments.js b/lib/node-arguments.js
index ea444cc19..65da7c5d9 100644
--- a/lib/node-arguments.js
+++ b/lib/node-arguments.js
@@ -1,15 +1,11 @@
 import process from 'node:process';
 
-import arrgv from 'arrgv';
+import {tokenizeArgs} from 'args-tokenizer';
 
 export default function normalizeNodeArguments(fromConf = [], fromArgv = '') {
 	let parsedArgv = [];
 	if (fromArgv !== '') {
-		try {
-			parsedArgv = arrgv(fromArgv);
-		} catch {
-			throw new Error('Could not parse `--node-arguments` value. Make sure all strings are closed and backslashes are used correctly.');
-		}
+		parsedArgv = tokenizeArgs(fromArgv);
 	}
 
 	return [...process.execArgv, ...fromConf, ...parsedArgv];
diff --git a/package-lock.json b/package-lock.json
index 7fb86d068..d430b0b9b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,7 +13,7 @@
 				"acorn": "^8.13.0",
 				"acorn-walk": "^8.3.4",
 				"ansi-styles": "^6.2.1",
-				"arrgv": "^1.0.2",
+				"args-tokenizer": "^0.2.1",
 				"arrify": "^3.0.0",
 				"callsites": "^4.2.0",
 				"cbor": "^9.0.2",
@@ -3019,6 +3019,12 @@
 				"sprintf-js": "~1.0.2"
 			}
 		},
+		"node_modules/args-tokenizer": {
+			"version": "0.2.1",
+			"resolved": "https://registry.npmjs.org/args-tokenizer/-/args-tokenizer-0.2.1.tgz",
+			"integrity": "sha512-1hd00qLJxfSYLirIJherrIBbLkpYlLttu2lxQvVJWY+ohZgEZ2Sf9Rnsx5C1kQNo22eb9tV8/l8TWpjYKtwNIw==",
+			"license": "MIT"
+		},
 		"node_modules/array-buffer-byte-length": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
@@ -3162,6 +3168,7 @@
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz",
 			"integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==",
+			"dev": true,
 			"license": "MIT",
 			"engines": {
 				"node": ">=8.0.0"
diff --git a/package.json b/package.json
index 426edad69..b72309651 100644
--- a/package.json
+++ b/package.json
@@ -87,7 +87,7 @@
 		"acorn": "^8.13.0",
 		"acorn-walk": "^8.3.4",
 		"ansi-styles": "^6.2.1",
-		"arrgv": "^1.0.2",
+		"args-tokenizer": "^0.2.1",
 		"arrify": "^3.0.0",
 		"callsites": "^4.2.0",
 		"cbor": "^9.0.2",
@@ -151,5 +151,6 @@
 	},
 	"volta": {
 		"node": "22.10.0"
-	}
+	},
+	"packageManager": "pnpm@9.15.0+sha512.76e2379760a4328ec4415815bcd6628dee727af3779aaa4c914e3944156c4299921a89f976381ee107d41f12cfa4b66681ca9c718f0668fa0831ed4c6d8ba56c"
 }
diff --git a/test/node-arguments/snapshots/test.js.md b/test/node-arguments/snapshots/test.js.md
index 9fdb63532..7c8cc54ea 100644
--- a/test/node-arguments/snapshots/test.js.md
+++ b/test/node-arguments/snapshots/test.js.md
@@ -37,11 +37,11 @@ Generated by [AVA](https://avajs.dev).
       },
     ]
 
-## detects incomplete --node-arguments
+## forgive incomplete --node-arguments
 
-> fails with message
+> tests pass
 
-    'Could not parse `--node-arguments` value. Make sure all strings are closed and backslashes are used correctly.'
+    []
 
 ## reads node arguments from config
 
diff --git a/test/node-arguments/snapshots/test.js.snap b/test/node-arguments/snapshots/test.js.snap
index bbccccf41e85c97ad9c54ef26ccfe632b0cbd8b0..c908e36a211b7d18e813d48161d50a73d97f1ed1 100644
GIT binary patch
literal 600
zcmV-e0;l~!RzV<BZeeh9Xm4~Nb~6eC08;Z6GQNYaS%YyZp9i39sNCjoF0;XB0CFRT
zQ))#x`5%i200000000B+l)sJ>F%ZVb2|3^pN}@wT6i6do37dkNg40Pz6dVoGQO2=n
zH%^@O%HzF15)B<abW~i!s~~s{9t7=fHkV6?5|Na*l`ZdhW`5uJ`yLOhQ)B*oMZpA1
z7nn(A(wI6;D1DMoC=HCk;kol;@@zPj84q3HPgh#YAV2(R!d)mnaZfa!1HcOaI1qbX
z(K_;8UJ6mK+U+)oeGme~10i14LCpjJCIIlQ4%~Y;7?BF1F<W*z9S{#eG(fcBKr|kS
zCWuy7+=-2)debecj%HQ&M!fKMt8B8~J);X!b4{95*<2H26osL8=aHt&laj%>l&l<(
z9R=dRC8HYHX+JhLkUw#nj_RvkJAYc@dO!3eHTO}uG&V`@%ge9|;kn$g^HahY%9v%&
zKX=CY%a)w)S0%3F`*?wG)ivprEKmN2rAbofNzW6^yi>&g7}ei9L-=(|g!|JP*D-vu
zz%WnOQap^EPs|w=^Xw*>r9c=(H=o8bn!{@}D~YU3iKQ}&rV)ELnToZX@7K<x__3uF
zPj8}$in61s>~-q2ih<+RN@xnCDrebTiH|cfE$E8$*yXnH<A9m;OxRz%p^s<M=G4Qt
za!km%CzRGA2XE4(@EAg6U191n)i{u9%vSP{s-wI(P|kZ&!Cv;NUVJQ#Wjr@wh!bL#
m3DrHl=~s{c`hAx3c<XQ*Iozww=-qnSl-pk^(611n2mk;dZXR?1

literal 583
zcmV-N0=WG_RzV<BZeeh9Xm4~Nb~6eC09tZhq{pD!^pk<zgxKNXA7-Mo{PsPppbPE1
z;a;zx+#ibw00000000B+l(CKzF%X7l5^}&HlthPwD3B~s!lt06;Dm%k!O<WcWgL5U
z<HWI79xrz%(NOUK&{1&>uY%w;co4L^*^o;(<wR26R<^t|{^y(V|1BL^ucrLzoT7=A
zPDL)6NekyS2^q3tMlQ05UYz(arND-r%z5l1e>~S(M)~e{8*W1R;Vo=E0f46faDaP#
z>>P$5&k&ncx7!8W2SmU-h|ij!b_M`50QlMj?!6gJNJVTdmc3pN@Gf8runPy+x`%DR
zP9JZi#!|ECm#UM6>cNCp{_a#oHoM1kN@}S{<CHBlu}G3Q4*n$3lm}8W8t=%;5!p#3
zj$AQnfE^E0V<Uwluj#N!_0osq3fJ3lAgOsMly|AgiclpJbqFuro%%2*EMgV2&iTjA
zIDg)f^X*#VCcgJq_|{dEzLe$B|FATf^MUj-!8~|H{Et!nwKIfYwnVr;*SLw{gB6B_
z+eq<|rbw!uXFtm=MG{GJ@oB81`LICKfj+tyzObbWM3KwDB!;UQhT^@n1r5Y&IVHhG
zAR(<49D{LLIoTwX^`(_ar^QIBDO<^7s*j5DK=}|zMSC`=YYC||mc@yQV=*IUnbE?Q
zs@AW%QX2ehJ`L*y{oGlvzi-*=hZo5urR=1Zy{Y}3a-#XtR=*n7FY)hVsfOd)ZmwiE
V&#y-B+F<6~{s0W=3&$-8004w1A_o8f

diff --git a/test/node-arguments/test.js b/test/node-arguments/test.js
index 92134a0f7..cdf6d8410 100644
--- a/test/node-arguments/test.js
+++ b/test/node-arguments/test.js
@@ -1,6 +1,6 @@
 import test from '@ava/test';
 
-import {cleanOutput, cwd, fixture} from '../helpers/exec.js';
+import {cwd, fixture} from '../helpers/exec.js';
 
 test('passed node arguments to workers', async t => {
 	const options = {
@@ -33,14 +33,14 @@ test('`filterNodeArgumentsForWorkerThreads` configuration ignored for worker pro
 	t.snapshot(result.stats.passed, 'tests pass');
 });
 
-test('detects incomplete --node-arguments', async t => {
+test('forgive incomplete --node-arguments', async t => {
 	const options = {
 		cwd: cwd('node-arguments'),
 	};
 
 	const result = await t.throwsAsync(fixture(['--node-arguments="--foo=\'bar"', 'node-arguments.js'], options));
 
-	t.snapshot(cleanOutput(result.stderr), 'fails with message');
+	t.snapshot(result.stats.passed, 'tests pass');
 });
 
 test('reads node arguments from config', async t => {

From 3566d40ae98857fa3a5a715219a705869888ab75 Mon Sep 17 00:00:00 2001
From: Bogdan Chadkin <opensource@trysound.io>
Date: Sun, 29 Dec 2024 20:37:23 +0700
Subject: [PATCH 2/2] Upgrade args-tokenizer

---
 lib/node-arguments.js                      |   6 +++++-
 package-lock.json                          |   8 ++++----
 package.json                               |   5 ++---
 test/node-arguments/snapshots/test.js.md   |   6 +++---
 test/node-arguments/snapshots/test.js.snap | Bin 600 -> 583 bytes
 test/node-arguments/test.js                |   6 +++---
 6 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/lib/node-arguments.js b/lib/node-arguments.js
index 65da7c5d9..7848a0304 100644
--- a/lib/node-arguments.js
+++ b/lib/node-arguments.js
@@ -5,7 +5,11 @@ import {tokenizeArgs} from 'args-tokenizer';
 export default function normalizeNodeArguments(fromConf = [], fromArgv = '') {
 	let parsedArgv = [];
 	if (fromArgv !== '') {
-		parsedArgv = tokenizeArgs(fromArgv);
+		try {
+			parsedArgv = tokenizeArgs(fromArgv);
+		} catch {
+			throw new Error('Could not parse `--node-arguments` value. Make sure all strings are closed and backslashes are used correctly.');
+		}
 	}
 
 	return [...process.execArgv, ...fromConf, ...parsedArgv];
diff --git a/package-lock.json b/package-lock.json
index d430b0b9b..840ff800d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,7 +13,7 @@
 				"acorn": "^8.13.0",
 				"acorn-walk": "^8.3.4",
 				"ansi-styles": "^6.2.1",
-				"args-tokenizer": "^0.2.1",
+				"args-tokenizer": "^0.3.0",
 				"arrify": "^3.0.0",
 				"callsites": "^4.2.0",
 				"cbor": "^9.0.2",
@@ -3020,9 +3020,9 @@
 			}
 		},
 		"node_modules/args-tokenizer": {
-			"version": "0.2.1",
-			"resolved": "https://registry.npmjs.org/args-tokenizer/-/args-tokenizer-0.2.1.tgz",
-			"integrity": "sha512-1hd00qLJxfSYLirIJherrIBbLkpYlLttu2lxQvVJWY+ohZgEZ2Sf9Rnsx5C1kQNo22eb9tV8/l8TWpjYKtwNIw==",
+			"version": "0.3.0",
+			"resolved": "https://registry.npmjs.org/args-tokenizer/-/args-tokenizer-0.3.0.tgz",
+			"integrity": "sha512-xXAd7G2Mll5W8uo37GETpQ2VrE84M181Z7ugHFGQnJZ50M2mbOv0osSZ9VsSgPfJQ+LVG0prSi0th+ELMsno7Q==",
 			"license": "MIT"
 		},
 		"node_modules/array-buffer-byte-length": {
diff --git a/package.json b/package.json
index b72309651..32df09e6b 100644
--- a/package.json
+++ b/package.json
@@ -87,7 +87,7 @@
 		"acorn": "^8.13.0",
 		"acorn-walk": "^8.3.4",
 		"ansi-styles": "^6.2.1",
-		"args-tokenizer": "^0.2.1",
+		"args-tokenizer": "^0.3.0",
 		"arrify": "^3.0.0",
 		"callsites": "^4.2.0",
 		"cbor": "^9.0.2",
@@ -151,6 +151,5 @@
 	},
 	"volta": {
 		"node": "22.10.0"
-	},
-	"packageManager": "pnpm@9.15.0+sha512.76e2379760a4328ec4415815bcd6628dee727af3779aaa4c914e3944156c4299921a89f976381ee107d41f12cfa4b66681ca9c718f0668fa0831ed4c6d8ba56c"
+	}
 }
diff --git a/test/node-arguments/snapshots/test.js.md b/test/node-arguments/snapshots/test.js.md
index 7c8cc54ea..9fdb63532 100644
--- a/test/node-arguments/snapshots/test.js.md
+++ b/test/node-arguments/snapshots/test.js.md
@@ -37,11 +37,11 @@ Generated by [AVA](https://avajs.dev).
       },
     ]
 
-## forgive incomplete --node-arguments
+## detects incomplete --node-arguments
 
-> tests pass
+> fails with message
 
-    []
+    'Could not parse `--node-arguments` value. Make sure all strings are closed and backslashes are used correctly.'
 
 ## reads node arguments from config
 
diff --git a/test/node-arguments/snapshots/test.js.snap b/test/node-arguments/snapshots/test.js.snap
index c908e36a211b7d18e813d48161d50a73d97f1ed1..bbccccf41e85c97ad9c54ef26ccfe632b0cbd8b0 100644
GIT binary patch
literal 583
zcmV-N0=WG_RzV<BZeeh9Xm4~Nb~6eC09tZhq{pD!^pk<zgxKNXA7-Mo{PsPppbPE1
z;a;zx+#ibw00000000B+l(CKzF%X7l5^}&HlthPwD3B~s!lt06;Dm%k!O<WcWgL5U
z<HWI79xrz%(NOUK&{1&>uY%w;co4L^*^o;(<wR26R<^t|{^y(V|1BL^ucrLzoT7=A
zPDL)6NekyS2^q3tMlQ05UYz(arND-r%z5l1e>~S(M)~e{8*W1R;Vo=E0f46faDaP#
z>>P$5&k&ncx7!8W2SmU-h|ij!b_M`50QlMj?!6gJNJVTdmc3pN@Gf8runPy+x`%DR
zP9JZi#!|ECm#UM6>cNCp{_a#oHoM1kN@}S{<CHBlu}G3Q4*n$3lm}8W8t=%;5!p#3
zj$AQnfE^E0V<Uwluj#N!_0osq3fJ3lAgOsMly|AgiclpJbqFuro%%2*EMgV2&iTjA
zIDg)f^X*#VCcgJq_|{dEzLe$B|FATf^MUj-!8~|H{Et!nwKIfYwnVr;*SLw{gB6B_
z+eq<|rbw!uXFtm=MG{GJ@oB81`LICKfj+tyzObbWM3KwDB!;UQhT^@n1r5Y&IVHhG
zAR(<49D{LLIoTwX^`(_ar^QIBDO<^7s*j5DK=}|zMSC`=YYC||mc@yQV=*IUnbE?Q
zs@AW%QX2ehJ`L*y{oGlvzi-*=hZo5urR=1Zy{Y}3a-#XtR=*n7FY)hVsfOd)ZmwiE
V&#y-B+F<6~{s0W=3&$-8004w1A_o8f

literal 600
zcmV-e0;l~!RzV<BZeeh9Xm4~Nb~6eC08;Z6GQNYaS%YyZp9i39sNCjoF0;XB0CFRT
zQ))#x`5%i200000000B+l)sJ>F%ZVb2|3^pN}@wT6i6do37dkNg40Pz6dVoGQO2=n
zH%^@O%HzF15)B<abW~i!s~~s{9t7=fHkV6?5|Na*l`ZdhW`5uJ`yLOhQ)B*oMZpA1
z7nn(A(wI6;D1DMoC=HCk;kol;@@zPj84q3HPgh#YAV2(R!d)mnaZfa!1HcOaI1qbX
z(K_;8UJ6mK+U+)oeGme~10i14LCpjJCIIlQ4%~Y;7?BF1F<W*z9S{#eG(fcBKr|kS
zCWuy7+=-2)debecj%HQ&M!fKMt8B8~J);X!b4{95*<2H26osL8=aHt&laj%>l&l<(
z9R=dRC8HYHX+JhLkUw#nj_RvkJAYc@dO!3eHTO}uG&V`@%ge9|;kn$g^HahY%9v%&
zKX=CY%a)w)S0%3F`*?wG)ivprEKmN2rAbofNzW6^yi>&g7}ei9L-=(|g!|JP*D-vu
zz%WnOQap^EPs|w=^Xw*>r9c=(H=o8bn!{@}D~YU3iKQ}&rV)ELnToZX@7K<x__3uF
zPj8}$in61s>~-q2ih<+RN@xnCDrebTiH|cfE$E8$*yXnH<A9m;OxRz%p^s<M=G4Qt
za!km%CzRGA2XE4(@EAg6U191n)i{u9%vSP{s-wI(P|kZ&!Cv;NUVJQ#Wjr@wh!bL#
m3DrHl=~s{c`hAx3c<XQ*Iozww=-qnSl-pk^(611n2mk;dZXR?1

diff --git a/test/node-arguments/test.js b/test/node-arguments/test.js
index cdf6d8410..92134a0f7 100644
--- a/test/node-arguments/test.js
+++ b/test/node-arguments/test.js
@@ -1,6 +1,6 @@
 import test from '@ava/test';
 
-import {cwd, fixture} from '../helpers/exec.js';
+import {cleanOutput, cwd, fixture} from '../helpers/exec.js';
 
 test('passed node arguments to workers', async t => {
 	const options = {
@@ -33,14 +33,14 @@ test('`filterNodeArgumentsForWorkerThreads` configuration ignored for worker pro
 	t.snapshot(result.stats.passed, 'tests pass');
 });
 
-test('forgive incomplete --node-arguments', async t => {
+test('detects incomplete --node-arguments', async t => {
 	const options = {
 		cwd: cwd('node-arguments'),
 	};
 
 	const result = await t.throwsAsync(fixture(['--node-arguments="--foo=\'bar"', 'node-arguments.js'], options));
 
-	t.snapshot(result.stats.passed, 'tests pass');
+	t.snapshot(cleanOutput(result.stderr), 'fails with message');
 });
 
 test('reads node arguments from config', async t => {