From 844b67983e8403827b94403a996954c95483e541 Mon Sep 17 00:00:00 2001 From: Landon Yarrington Date: Sun, 12 Dec 2021 22:37:25 -0700 Subject: [PATCH 1/3] fix: wrap unknown args in quotes --- lib/validation.ts | 4 ++-- test/command.cjs | 2 +- test/usage.cjs | 6 +++--- test/validation.cjs | 24 ++++++++++++------------ 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/lib/validation.ts b/lib/validation.ts index 0a5b334a3..b6574009a 100644 --- a/lib/validation.ts +++ b/lib/validation.ts @@ -205,7 +205,7 @@ export function validation( 'Unknown argument: %s', 'Unknown arguments: %s', unknown.length, - unknown.join(', ') + unknown.map(s => `"${s}"`).join(', ') ) ); } @@ -233,7 +233,7 @@ export function validation( 'Unknown command: %s', 'Unknown commands: %s', unknown.length, - unknown.join(', ') + unknown.map(s => `"${s}"`).join(', ') ) ); return true; diff --git a/test/command.cjs b/test/command.cjs index 189a16596..f22e99783 100644 --- a/test/command.cjs +++ b/test/command.cjs @@ -1528,7 +1528,7 @@ describe('Command', () => { }) .parse('hi ben --hello=world', (err, argv, output) => { commandRun.should.equal(false); - err.message.should.equal('Unknown argument: hello'); + err.message.should.equal('Unknown argument: "hello"'); return done(); }); }); diff --git a/test/usage.cjs b/test/usage.cjs index eef18facc..02d1af428 100644 --- a/test/usage.cjs +++ b/test/usage.cjs @@ -1006,7 +1006,7 @@ describe('usage tests', () => { ' --version Show version number [boolean]', ' -f, --foo [required]', ' -b, --bar [required]', - 'Unknown argument: baz', + 'Unknown argument: "baz"', ]); r.should.have.property('logs').with.length(0); r.should.have.property('exit').and.equal(true); @@ -1104,7 +1104,7 @@ describe('usage tests', () => { ' --version Show version number [boolean]', ' -f, --foo foo option', ' -b, --bar bar option', - 'Unknown argument: baz', + 'Unknown argument: "baz"', ]); r.should.have.property('logs').with.length(0); r.should.have.property('exit').and.equal(true); @@ -1144,7 +1144,7 @@ describe('usage tests', () => { ' --version Show version number [boolean]', ' -f, --foo foo option', ' -b, --bar bar option', - 'Unknown arguments: baz, q', + 'Unknown arguments: "baz", "q"', ]); r.should.have.property('logs').with.length(0); r.should.have.property('exit').and.equal(true); diff --git a/test/validation.cjs b/test/validation.cjs index f2e677c23..1e02ab919 100644 --- a/test/validation.cjs +++ b/test/validation.cjs @@ -460,7 +460,7 @@ describe('validation tests', () => { yargs .strict() .fail(msg => { - msg.should.equal('Unknown argument: foo'); + msg.should.equal('Unknown argument: "foo"'); done(); }) .parse('foo'); @@ -471,7 +471,7 @@ describe('validation tests', () => { yargs .strict() .fail(msg => { - msg.should.equal('Unknown argument: foo'); + msg.should.equal('Unknown argument: "foo"'); done(); }) .parse('foo -- hello'); @@ -485,7 +485,7 @@ describe('validation tests', () => { .demand(1) .strict() .fail(msg => { - msg.should.equal('Unknown argument: koala'); + msg.should.equal('Unknown argument: "koala"'); return done(); }) .parse(); @@ -497,7 +497,7 @@ describe('validation tests', () => { .command('kangaroo ', 'kangaroo handlers') .strict() .fail(msg => { - msg.should.equal('Unknown argument: fast'); + msg.should.equal('Unknown argument: "fast"'); return done(); }) .parse(); @@ -509,7 +509,7 @@ describe('validation tests', () => { .command('$0 ', 'kangaroo handlers') .strict() .fail(msg => { - msg.should.equal('Unknown argument: fast'); + msg.should.equal('Unknown argument: "fast"'); return done(); }) .parse(); @@ -1079,7 +1079,7 @@ describe('validation tests', () => { .strict() .option('foo', {boolean: true, describe: false}) .fail(msg => { - msg.should.equal('Unknown argument: hey'); + msg.should.equal('Unknown argument: "hey"'); }) .parse(); }); @@ -1284,7 +1284,7 @@ describe('validation tests', () => { .strictCommands() .command('foo', 'foo command') .fail(msg => { - msg.should.equal('Unknown command: blerg'); + msg.should.equal('Unknown command: "blerg"'); return done(); }) .parse(); @@ -1297,7 +1297,7 @@ describe('validation tests', () => { yargs.command('bar'); }) .fail(msg => { - msg.should.equal('Unknown command: blarg'); + msg.should.equal('Unknown command: "blarg"'); return done(); }) .parse(); @@ -1320,7 +1320,7 @@ describe('validation tests', () => { yargs.command('bar').strictCommands(); }) .fail(msg => { - msg.should.equal('Unknown command: blarg'); + msg.should.equal('Unknown command: "blarg"'); return done(); }) .parse(); @@ -1346,7 +1346,7 @@ describe('validation tests', () => { yargs() .strictOptions() .parse('bar -a 10', (err, argv) => { - expect(err).to.match(/Unknown argument: a/); + expect(err).to.match(/Unknown argument: "a"/); argv.a.should.equal(10); return done(); }); @@ -1356,7 +1356,7 @@ describe('validation tests', () => { yargs() .strictOptions() .parse('foo --cool --awesome', err => { - expect(err).to.match(/Unknown arguments: cool, awesome/); + expect(err).to.match(/Unknown arguments: "cool", "awesome"/); }); }); @@ -1370,7 +1370,7 @@ describe('validation tests', () => { expect(err).to.equal(null); }); y.parse('--cool --awesome', err => { - expect(err).to.match(/Unknown arguments: cool, awesome/); + expect(err).to.match(/Unknown arguments: "cool", "awesome"/); }); }); }); From f486a86599291e0402841ae112c30ee73180be88 Mon Sep 17 00:00:00 2001 From: Landon Yarrington Date: Wed, 22 Dec 2021 20:28:39 -0700 Subject: [PATCH 2/3] fixes --- lib/validation.ts | 4 ++-- test/command.cjs | 2 +- test/usage.cjs | 27 ++++++++++++++++++++++++--- test/validation.cjs | 24 ++++++++++++------------ 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/lib/validation.ts b/lib/validation.ts index b6574009a..d5c6827ff 100644 --- a/lib/validation.ts +++ b/lib/validation.ts @@ -205,7 +205,7 @@ export function validation( 'Unknown argument: %s', 'Unknown arguments: %s', unknown.length, - unknown.map(s => `"${s}"`).join(', ') + unknown.map(s => (s.trim() ? s : `"${s}"`)).join(', ') ) ); } @@ -233,7 +233,7 @@ export function validation( 'Unknown command: %s', 'Unknown commands: %s', unknown.length, - unknown.map(s => `"${s}"`).join(', ') + unknown.map(s => (s.trim() ? s : `${s}`)).join(', ') ) ); return true; diff --git a/test/command.cjs b/test/command.cjs index f22e99783..189a16596 100644 --- a/test/command.cjs +++ b/test/command.cjs @@ -1528,7 +1528,7 @@ describe('Command', () => { }) .parse('hi ben --hello=world', (err, argv, output) => { commandRun.should.equal(false); - err.message.should.equal('Unknown argument: "hello"'); + err.message.should.equal('Unknown argument: hello'); return done(); }); }); diff --git a/test/usage.cjs b/test/usage.cjs index 02d1af428..62b0d536d 100644 --- a/test/usage.cjs +++ b/test/usage.cjs @@ -1006,7 +1006,7 @@ describe('usage tests', () => { ' --version Show version number [boolean]', ' -f, --foo [required]', ' -b, --bar [required]', - 'Unknown argument: "baz"', + 'Unknown argument: baz', ]); r.should.have.property('logs').with.length(0); r.should.have.property('exit').and.equal(true); @@ -1104,12 +1104,33 @@ describe('usage tests', () => { ' --version Show version number [boolean]', ' -f, --foo foo option', ' -b, --bar bar option', - 'Unknown argument: "baz"', + 'Unknown argument: baz', ]); r.should.have.property('logs').with.length(0); r.should.have.property('exit').and.equal(true); }); + // Addresses: https://github.com/yargs/yargs/issues/2033 + it('should wrap whitespace in quotes if provided as an unknown argument', () => { + const r = checkUsage(() => { + return yargs(['--opt1=hello', ' ', '--opt2=world']) + .command({ + command: '$0', + desc: 'default description', + builder: yargs => + yargs + .option('opt1', {type: 'string'}) + .option('opt2', {type: 'string'}), + handler: noop, + }) + .strict() + .wrap(null) + .parse(); + }); + + r.errors.should.match(/Unknown argument: " "/); + }); + it('should fail given multiple option arguments without corresponding descriptions', () => { const r = checkUsage(() => { const opts = { @@ -1144,7 +1165,7 @@ describe('usage tests', () => { ' --version Show version number [boolean]', ' -f, --foo foo option', ' -b, --bar bar option', - 'Unknown arguments: "baz", "q"', + 'Unknown arguments: baz, q', ]); r.should.have.property('logs').with.length(0); r.should.have.property('exit').and.equal(true); diff --git a/test/validation.cjs b/test/validation.cjs index 1e02ab919..f2e677c23 100644 --- a/test/validation.cjs +++ b/test/validation.cjs @@ -460,7 +460,7 @@ describe('validation tests', () => { yargs .strict() .fail(msg => { - msg.should.equal('Unknown argument: "foo"'); + msg.should.equal('Unknown argument: foo'); done(); }) .parse('foo'); @@ -471,7 +471,7 @@ describe('validation tests', () => { yargs .strict() .fail(msg => { - msg.should.equal('Unknown argument: "foo"'); + msg.should.equal('Unknown argument: foo'); done(); }) .parse('foo -- hello'); @@ -485,7 +485,7 @@ describe('validation tests', () => { .demand(1) .strict() .fail(msg => { - msg.should.equal('Unknown argument: "koala"'); + msg.should.equal('Unknown argument: koala'); return done(); }) .parse(); @@ -497,7 +497,7 @@ describe('validation tests', () => { .command('kangaroo ', 'kangaroo handlers') .strict() .fail(msg => { - msg.should.equal('Unknown argument: "fast"'); + msg.should.equal('Unknown argument: fast'); return done(); }) .parse(); @@ -509,7 +509,7 @@ describe('validation tests', () => { .command('$0 ', 'kangaroo handlers') .strict() .fail(msg => { - msg.should.equal('Unknown argument: "fast"'); + msg.should.equal('Unknown argument: fast'); return done(); }) .parse(); @@ -1079,7 +1079,7 @@ describe('validation tests', () => { .strict() .option('foo', {boolean: true, describe: false}) .fail(msg => { - msg.should.equal('Unknown argument: "hey"'); + msg.should.equal('Unknown argument: hey'); }) .parse(); }); @@ -1284,7 +1284,7 @@ describe('validation tests', () => { .strictCommands() .command('foo', 'foo command') .fail(msg => { - msg.should.equal('Unknown command: "blerg"'); + msg.should.equal('Unknown command: blerg'); return done(); }) .parse(); @@ -1297,7 +1297,7 @@ describe('validation tests', () => { yargs.command('bar'); }) .fail(msg => { - msg.should.equal('Unknown command: "blarg"'); + msg.should.equal('Unknown command: blarg'); return done(); }) .parse(); @@ -1320,7 +1320,7 @@ describe('validation tests', () => { yargs.command('bar').strictCommands(); }) .fail(msg => { - msg.should.equal('Unknown command: "blarg"'); + msg.should.equal('Unknown command: blarg'); return done(); }) .parse(); @@ -1346,7 +1346,7 @@ describe('validation tests', () => { yargs() .strictOptions() .parse('bar -a 10', (err, argv) => { - expect(err).to.match(/Unknown argument: "a"/); + expect(err).to.match(/Unknown argument: a/); argv.a.should.equal(10); return done(); }); @@ -1356,7 +1356,7 @@ describe('validation tests', () => { yargs() .strictOptions() .parse('foo --cool --awesome', err => { - expect(err).to.match(/Unknown arguments: "cool", "awesome"/); + expect(err).to.match(/Unknown arguments: cool, awesome/); }); }); @@ -1370,7 +1370,7 @@ describe('validation tests', () => { expect(err).to.equal(null); }); y.parse('--cool --awesome', err => { - expect(err).to.match(/Unknown arguments: "cool", "awesome"/); + expect(err).to.match(/Unknown arguments: cool, awesome/); }); }); }); From bcdaa860159acc87b85c5ed1b6d0ca57a41a0ea6 Mon Sep 17 00:00:00 2001 From: Landon Yarrington Date: Wed, 22 Dec 2021 20:56:02 -0700 Subject: [PATCH 3/3] fixes --- lib/validation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/validation.ts b/lib/validation.ts index d5c6827ff..363fdf042 100644 --- a/lib/validation.ts +++ b/lib/validation.ts @@ -233,7 +233,7 @@ export function validation( 'Unknown command: %s', 'Unknown commands: %s', unknown.length, - unknown.map(s => (s.trim() ? s : `${s}`)).join(', ') + unknown.join(', ') ) ); return true;