diff --git a/packages/cli/src/modules/config/alpha.ts b/packages/cli/src/modules/config/alpha.ts index 4ced91e6b2..c32982086a 100644 --- a/packages/cli/src/modules/config/alpha.ts +++ b/packages/cli/src/modules/config/alpha.ts @@ -25,7 +25,6 @@ export default createCliPlugin({ path: ['config:docs'], description: 'Browse the configuration reference documentation', execute: async ({ args }) => { - console.log(args); const command = new Command(); const defaultCommand = command .option( @@ -42,28 +41,21 @@ export default createCliPlugin({ path: ['config', 'docs'], description: 'Browse the configuration reference documentation', execute: async ({ args }) => { - await yargs + const argv = await yargs .options({ package: { type: 'string' }, }) - .command( - '$0', - '', - async () => {}, - async argv => { - const m = await import('./commands/docs'); - await m.default(argv); - }, - ) .help() .parse(args); + const m = await import('./commands/docs'); + await m.default(argv); }, }); reg.addCommand({ path: ['config:print'], description: 'Print the app configuration for the current package', execute: async ({ args }) => { - await yargs + const argv = await yargs .options({ package: { type: 'string' }, lax: { type: 'boolean' }, @@ -72,17 +64,10 @@ export default createCliPlugin({ format: { type: 'string' }, config: { type: 'string', array: true }, }) - .command( - '$0', - '', - async () => {}, - async argv => { - const m = await import('./commands/print'); - await m.default(argv); - }, - ) .help() .parse(args); + const m = await import('./commands/print'); + await m.default(argv); }, }); reg.addCommand({ @@ -90,26 +75,23 @@ export default createCliPlugin({ description: 'Validate that the given configuration loads and matches schema', execute: async ({ args }) => { - await yargs + const argv = await yargs .options({ package: { type: 'string' }, lax: { type: 'boolean' }, frontend: { type: 'boolean' }, deprecated: { type: 'boolean' }, - strict: { type: 'boolean' }, - config: { type: 'string', array: true }, - }) - .command( - '$0', - '', - async () => {}, - async argv => { - const m = await import('./commands/validate'); - await m.default(argv); + strict: { type: 'boolean', required: true }, + config: { + type: 'string', + array: true, + default: [], }, - ) + }) .help() .parse(args); + const m = await import('./commands/validate'); + await m.default(argv); }, }); }, diff --git a/packages/cli/src/wiring/CliInitializer.ts b/packages/cli/src/wiring/CliInitializer.ts index c52e8c313d..9fe8bb8084 100644 --- a/packages/cli/src/wiring/CliInitializer.ts +++ b/packages/cli/src/wiring/CliInitializer.ts @@ -20,6 +20,8 @@ import { CommandRegistry } from './CommandRegistry'; import { program } from 'commander'; import { version } from '../lib/version'; import chalk from 'chalk'; +import { exitWithError } from '../lib/errors'; +import { assertError } from '@backstage/errors'; type UninitializedFeature = CliFeature | Promise; @@ -83,9 +85,15 @@ export class CliInitializer { .allowUnknownOption(true) .allowExcessArguments(true) .action(async () => { - await node.command.execute({ - args: program.parseOptions(process.argv).unknown, - }); + try { + await node.command.execute({ + args: program.parseOptions(process.argv).unknown, + }); + process.exit(0); + } catch (error) { + assertError(error); + exitWithError(error); + } }); } } @@ -97,6 +105,14 @@ export class CliInitializer { process.exit(1); }); + process.on('unhandledRejection', rejection => { + if (rejection instanceof Error) { + exitWithError(rejection); + } else { + exitWithError(new Error(`Unknown rejection: '${rejection}'`)); + } + }); + program.parse(process.argv); } }