diff --git a/.changeset/short-geese-double.md b/.changeset/short-geese-double.md new file mode 100644 index 0000000000..45d3764e6d --- /dev/null +++ b/.changeset/short-geese-double.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': minor +--- + +New config command to export the configuration schema. When running backstage-cli with yarn, consider using `yarn --silent backstage-cli config:schema` to get a clean output on `stdout`. diff --git a/packages/cli/src/commands/config/schema.ts b/packages/cli/src/commands/config/schema.ts new file mode 100644 index 0000000000..1d6adf72d6 --- /dev/null +++ b/packages/cli/src/commands/config/schema.ts @@ -0,0 +1,35 @@ +/* + * Copyright 2021 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Command } from 'commander'; +import { stringify as stringifyYaml } from 'yaml'; +import { loadCliConfig } from '../../lib/config'; + +export default async (cmd: Command) => { + const { schema } = await loadCliConfig({ + args: [], + fromPackage: cmd.package, + mockEnv: true, + }); + + const data = schema.serialize(); + + if (cmd.format === 'json') { + process.stdout.write(`${JSON.stringify(data, null, 2)}\n`); + } else { + process.stdout.write(`${stringifyYaml(data)}\n`); + } +}; diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts index 1d267c6889..5fd7817a83 100644 --- a/packages/cli/src/commands/index.ts +++ b/packages/cli/src/commands/index.ts @@ -177,6 +177,15 @@ export function registerCommands(program: CommanderStatic) { ) .action(lazy(() => import('./config/validate').then(m => m.default))); + program + .command('config:schema') + .option( + '--package ', + 'Only output config schema that applies to the given package', + ) + .description('Print configuration schema') + .action(lazy(() => import('./config/schema').then(m => m.default))); + program .command('versions:bump') .description('Bump Backstage packages to the latest versions') diff --git a/packages/cli/src/lib/config.ts b/packages/cli/src/lib/config.ts index b49b644e25..de6bd6353d 100644 --- a/packages/cli/src/lib/config.ts +++ b/packages/cli/src/lib/config.ts @@ -48,8 +48,10 @@ export async function loadCliConfig(options: Options) { configPaths, }); - console.log( - `Loaded config from ${appConfigs.map(c => c.context).join(', ')}`, + // printing to stderr to not clobber stdout in case the cli command + // outputs structured data (e.g. as config:schema does) + process.stderr.write( + `Loaded config from ${appConfigs.map(c => c.context).join(', ')}\n`, ); try {