From 5c9c70f26d290e43da2566f92a821aae374db4d0 Mon Sep 17 00:00:00 2001 From: amtbsl <147152854+amtbsl@users.noreply.github.com> Date: Sat, 29 Aug 2026 13:31:03 +0800 Subject: [PATCH 1/2] fix: coerce object values without crashing --- lib/yargs-parser.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/yargs-parser.ts b/lib/yargs-parser.ts index 48a2d0f2..5116b8ec 100644 --- a/lib/yargs-parser.ts +++ b/lib/yargs-parser.ts @@ -637,7 +637,13 @@ export class YargsParser { return value } - function maybeCoerceNumber (key: string, value: string | number | null | undefined) { + function maybeCoerceNumber (key: string, value: unknown) { + // Coercion callbacks may intentionally return objects (for example, + // parsed connection strings). Only strings and numbers can be inspected + // for numeric syntax; passing other values to the regular expressions + // in `looksLikeNumber` can throw for objects without a prototype. + if (typeof value !== 'string' && typeof value !== 'number') return value + if (!configuration['parse-positional-numbers'] && key === '_') return value if (!checkAllAliases(key, flags.strings) && !checkAllAliases(key, flags.bools) && !Array.isArray(value)) { const shouldCoerceNumber = looksLikeNumber(value) && configuration['parse-numbers'] && ( From 7d492829cee5393ce2a23041935be115c56a26fe Mon Sep 17 00:00:00 2001 From: amtbsl <147152854+amtbsl@users.noreply.github.com> Date: Sat, 29 Aug 2026 13:31:10 +0800 Subject: [PATCH 2/2] test: cover object value coercion --- test/yargs-parser.mjs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/yargs-parser.mjs b/test/yargs-parser.mjs index 4c692375..d5c4cae9 100644 --- a/test/yargs-parser.mjs +++ b/test/yargs-parser.mjs @@ -3536,6 +3536,21 @@ describe('yargs-parser', function () { parsed.foo.should.equal('BAR') }) + it('preserves objects returned by coercion functions', function () { + const value = Object.create(null) + value.database = 'postgres' + + const parsed = parser(['--connection', 'postgresql://db/example'], { + coerce: { + connection: function () { + return value + } + } + }) + + parsed.connection.should.equal(value) + }) + it('applies coercion function to an implicit array', function () { const parsed = parser(['--foo', '99', '-f', '33'], { coerce: {