diff --git a/e2e/cli-e2e/tests/collect.e2e.test.ts b/e2e/cli-e2e/tests/collect.e2e.test.ts index 5f0af94a0..c2b69c2d4 100644 --- a/e2e/cli-e2e/tests/collect.e2e.test.ts +++ b/e2e/cli-e2e/tests/collect.e2e.test.ts @@ -65,12 +65,7 @@ describe('CLI collect', () => { it('should print report summary to stdout', async () => { const { code, stdout, stderr } = await executeProcess({ command: 'code-pushup', - args: [ - 'collect', - '--verbose', - '--persist.format=stdout', - '--no-progress', - ], + args: ['collect', '--no-progress'], cwd: 'examples/react-todos-app', }); diff --git a/packages/cli/src/lib/yargs-cli.integration.test.ts b/packages/cli/src/lib/yargs-cli.integration.test.ts index 174213115..46e7a3ded 100644 --- a/packages/cli/src/lib/yargs-cli.integration.test.ts +++ b/packages/cli/src/lib/yargs-cli.integration.test.ts @@ -56,6 +56,15 @@ describe('yargsCli', () => { expect(parsedArgv.persist?.format).toEqual(['md', 'json']); }); + it('should throw for an invalid persist format', () => { + expect(() => + yargsCli(['--persist.format=md', '--persist.format=stdout'], { + options, + noExitProcess: true, + }).parse(), + ).toThrow('Invalid persist.format option'); + }); + it('should parse global options correctly', async () => { const parsedArgv = await yargsCli( ['--verbose', '--no-progress'], diff --git a/packages/cli/src/lib/yargs-cli.ts b/packages/cli/src/lib/yargs-cli.ts index f38b10ac0..abab13063 100644 --- a/packages/cli/src/lib/yargs-cli.ts +++ b/packages/cli/src/lib/yargs-cli.ts @@ -7,6 +7,7 @@ import yargs, { Options, ParserConfigurationOptions, } from 'yargs'; +import { PersistConfig, formatSchema } from '@code-pushup/models'; import { logErrorBeforeThrow } from './implementation/utils'; /** @@ -42,10 +43,13 @@ export function yargsCli( .help() .version(false) .alias('h', 'help') + .check(args => { + const persist = args['persist'] as PersistConfig | undefined; + return persist == null || validatePersistFormat(persist); + }) .parserConfiguration({ 'strip-dashed': true, } satisfies Partial) - .array('persist.format') .coerce('config', (config: string | string[]) => Array.isArray(config) ? config.at(-1) : config, ) @@ -90,3 +94,18 @@ export function yargsCli( // return CLI object return cli as unknown as Argv; } + +function validatePersistFormat(persist: PersistConfig) { + try { + if (persist?.format != null) { + persist.format.forEach(format => formatSchema.parse(format)); + } + return true; + } catch { + throw new Error( + `Invalid persist.format option. Valid options are: ${Object.values( + formatSchema.Values, + ).join(', ')}`, + ); + } +}