feat: return clear error when multiple values for a cli flag are given

* feat: return clear error when multiple values for a cli flag are given

* chore: change function signature

* test: add testcase for array type yargs parameter
This commit is contained in:
Arthur Joppart
2022-12-05 13:36:54 +01:00
committed by GitHub
parent c46d01d3d7
commit 5c79e60238
2 changed files with 28 additions and 0 deletions

View File

@@ -71,6 +71,18 @@ export class YargsCliExtractor extends CliExtractor {
*/
private createYArgv(argv: readonly string[]): Argv {
let yArgv = yargs(argv.slice(2));
// Error and show help message when multiple values were provided
// for a non Array type parameter
yArgv.check((args): boolean => {
for (const [ name, options ] of Object.entries(this.yargsArgOptions)) {
if (options.type !== 'array' && Array.isArray(args[name])) {
throw new Error(`Multiple values for --${name} (-${options.alias}) were provided where only one is allowed`);
}
}
return true;
});
if (this.yargvOptions.usage !== undefined) {
yArgv = yArgv.usage(this.yargvOptions.usage);
}

View File

@@ -8,6 +8,7 @@ describe('A YargsCliExtractor', (): void => {
const parameters: YargsParameter[] = [
new YargsParameter('baseUrl', { alias: 'b', requiresArg: true, type: 'string' }),
new YargsParameter('port', { alias: 'p', requiresArg: true, type: 'number' }),
new YargsParameter('config', { alias: 'c', requiresArg: false, type: 'array' }),
];
let extractor: YargsCliExtractor;
@@ -52,6 +53,21 @@ describe('A YargsCliExtractor', (): void => {
expect(error).toHaveBeenCalledWith('Unknown argument: unsupported');
});
it('can error when multiple values are provided for a non array type parameter.', async(): Promise<void> => {
extractor = new YargsCliExtractor(parameters, { strictMode: true });
const argv = [ 'node', 'script', '-p', '3000', '-b', 'http://localhost:3000/', '-p', '3001' ];
await extractor.handle(argv);
expect(exit).toHaveBeenCalledTimes(1);
expect(error).toHaveBeenCalledWith('Multiple values for --port (-p) were provided where only one is allowed');
});
it('accepts multiple values for array type parameters.', async(): Promise<void> => {
const argv = [ 'node', 'script', '-c', './config/a.json', '-c', './config/b.json', '-b', 'http://localhost:3000/', '-p', '3000' ];
await expect(extractor.handle(argv)).resolves.toEqual(expect.objectContaining({
config: [ './config/a.json', './config/b.json' ],
}));
});
it('can parse environment variables.', async(): Promise<void> => {
// While the code below does go into the corresponding values,
// yargs does not see the new environment variable for some reason.