Skip to content

Commit 782eb2c

Browse files
committed
fix: correctly parse unknown args with dashes when they resemble known args
Fixes yargs#501
1 parent 3aba24c commit 782eb2c

File tree

2 files changed

+98
-1
lines changed

2 files changed

+98
-1
lines changed

lib/yargs-parser.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -984,7 +984,7 @@ export class YargsParser {
984984
// e.g. '-abc123'
985985
const flagEndingInDigits = /^-+([^=]+?\d+)$/
986986
// e.g. '-a/usr/local'
987-
const flagEndingInNonWordCharacters = /^-+([^=]+?)\W+.*$/
987+
const flagEndingInNonWordCharacters = /^-+([^=]+?)[^\w-]+.*$/
988988
// check the different types of flag styles, including negatedBoolean, a pattern defined near the start of the parse method
989989
return !hasFlagsMatching(arg, flagWithEquals, negatedBoolean, normalFlag, flagEndingInHyphen, flagEndingInDigits, flagEndingInNonWordCharacters)
990990
}

test/yargs-parser.cjs

+97
Original file line numberDiff line numberDiff line change
@@ -3188,6 +3188,103 @@ describe('yargs-parser', function () {
31883188
k: '/1/'
31893189
})
31903190
})
3191+
// Fixes: https://github.com/yargs/yargs-parser/issues/501
3192+
it.only('should allow an unknown arg that resembles a known arg and contains hyphens to be used as the value of another flag in short form', function () {
3193+
{
3194+
const argv = parser('--known-arg /1/ -k --known-arg-unknown', {
3195+
string: ['k', 'known-arg'],
3196+
narg: { k: 1, 'known-arg': 1 },
3197+
configuration: {
3198+
'unknown-options-as-args': true
3199+
}
3200+
})
3201+
argv.should.deep.equal({
3202+
_: [],
3203+
k: '--known-arg-unknown',
3204+
'knownArg': '/1/',
3205+
'known-arg': '/1/',
3206+
})
3207+
}
3208+
3209+
{
3210+
const argv = parser('-k --u-u', {
3211+
string: ['k', 'u'],
3212+
narg: { k: 1, u: 1 },
3213+
configuration: {
3214+
'unknown-options-as-args': true
3215+
}
3216+
})
3217+
argv.should.deep.equal({
3218+
_: [],
3219+
k: '--u-u'
3220+
})
3221+
}
3222+
})
3223+
// Fixes: https://github.com/yargs/yargs-parser/issues/501
3224+
it.only('should allow an unknown arg that resembles a known arg and contains hyphens to be used as the value of another flag in long form', function () {
3225+
{
3226+
const argv = parser('-k /1/ --known-arg --k-u', {
3227+
string: ['k', 'known-arg'],
3228+
narg: { k: 1, 'known-arg': 1 },
3229+
configuration: {
3230+
'unknown-options-as-args': true
3231+
}
3232+
})
3233+
argv.should.deep.equal({
3234+
_: [],
3235+
k: '/1/',
3236+
'knownArg': '--k-u',
3237+
'known-arg': '--k-u',
3238+
})
3239+
}
3240+
3241+
{
3242+
const argv = parser('--known-arg --known-unknown', {
3243+
string: ['known-arg', 'known'],
3244+
narg: { 'known-arg': 1, 'known': 1 },
3245+
configuration: {
3246+
'unknown-options-as-args': true
3247+
}
3248+
})
3249+
argv.should.deep.equal({
3250+
_: [],
3251+
'knownArg': '--known-unknown',
3252+
'known-arg': '--known-unknown',
3253+
})
3254+
}
3255+
})
3256+
// Fixes: https://github.com/yargs/yargs-parser/issues/501
3257+
it.only('should allow an unknown arg that resembles a known arg and contains hyphens to be used as the value of another flag in array form', function () {
3258+
{
3259+
const argv = parser('--known-arg --known-unknown --known-not-known', {
3260+
array: ['known-arg', 'known'],
3261+
configuration: {
3262+
'unknown-options-as-args': true
3263+
}
3264+
})
3265+
argv.should.deep.equal({
3266+
_: [],
3267+
knownArg: ['--known-unknown', '--known-not-known'],
3268+
'known-arg': ['--known-unknown', '--known-not-known']
3269+
})
3270+
}
3271+
3272+
{
3273+
const argv = parser('--known-arg --k-unknown --k-not-known', {
3274+
array: ['known-arg'],
3275+
alias: { 'known-arg': ['k'] },
3276+
configuration: {
3277+
'unknown-options-as-args': true
3278+
}
3279+
})
3280+
argv.should.deep.equal({
3281+
_: [],
3282+
knownArg: ['--k-unknown', '--k-not-known'],
3283+
'known-arg': ['--k-unknown', '--k-not-known'],
3284+
k: ['--k-unknown', '--k-not-known']
3285+
})
3286+
}
3287+
})
31913288
it('should ignore unknown options in short format with multiple flags in one argument where an unknown flag is before the end', function () {
31923289
const argv = parser('-kuv', {
31933290
boolean: ['k', 'v'],

0 commit comments

Comments
 (0)