From 3641f1d2bc9dd13fe0db3a792e1f927d0e6498b7 Mon Sep 17 00:00:00 2001 From: Bogdan Chadkin 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~!RzVF%ZVb2|3^pN}@wT6i6do37dkNg40Pz6dVoGQO2=n zH%^@O%HzF15)Bl&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~-q2ih<+RN@xnCDrebTiH|cfE$E8$*yXnHuY%w;co4L^*^o;(~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{ { 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 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_RzVuY%w;co4L^*^o;(~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{F%ZVb2|3^pN}@wT6i6do37dkNg40Pz6dVoGQO2=n zH%^@O%HzF15)Bl&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~-q2ih<+RN@xnCDrebTiH|cfE$E8$*yXnH { 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 => {