mirror of
https://github.com/storybookjs/storybook.git
synced 2025-03-21 05:02:39 +08:00
95 lines
2.3 KiB
TypeScript
95 lines
2.3 KiB
TypeScript
import type { OptionSpecifier, OptionValues } from './options';
|
|
import { createOptions, getCommand } from './options';
|
|
import { exec } from './exec';
|
|
|
|
const cliExecutable = require.resolve('../../code/lib/cli/bin/index.js');
|
|
|
|
export type CLIStep<TOptions extends OptionSpecifier> = {
|
|
command: string;
|
|
description: string;
|
|
hasArgument?: boolean;
|
|
icon: string;
|
|
// It would be kind of great to be able to share these with `lib/cli/src/generate.ts`
|
|
options: TOptions;
|
|
};
|
|
|
|
export const steps = {
|
|
repro: {
|
|
command: 'repro-next',
|
|
description: 'Bootstrapping Template',
|
|
icon: '👷',
|
|
hasArgument: true,
|
|
options: createOptions({
|
|
output: { type: 'string' },
|
|
// TODO allow default values for strings
|
|
branch: { type: 'string', values: ['next'] },
|
|
}),
|
|
},
|
|
add: {
|
|
command: 'add',
|
|
description: 'Adding addon',
|
|
icon: '+',
|
|
hasArgument: true,
|
|
options: createOptions({}),
|
|
},
|
|
link: {
|
|
command: 'link',
|
|
description: 'Linking packages',
|
|
icon: '🔗',
|
|
hasArgument: true,
|
|
options: createOptions({
|
|
local: { type: 'boolean' },
|
|
start: { type: 'boolean', inverse: true },
|
|
}),
|
|
},
|
|
build: {
|
|
command: 'build',
|
|
description: 'Building Storybook',
|
|
icon: '🔨',
|
|
options: createOptions({}),
|
|
},
|
|
dev: {
|
|
command: 'dev',
|
|
description: 'Starting Storybook',
|
|
icon: '🖥 ',
|
|
options: createOptions({}),
|
|
},
|
|
};
|
|
|
|
export async function executeCLIStep<TOptions extends OptionSpecifier>(
|
|
cliStep: CLIStep<TOptions>,
|
|
options: {
|
|
argument?: string;
|
|
optionValues?: Partial<OptionValues<TOptions>>;
|
|
cwd: string;
|
|
dryRun?: boolean;
|
|
debug: boolean;
|
|
}
|
|
) {
|
|
if (cliStep.hasArgument && !options.argument)
|
|
throw new Error(`Argument required for ${cliStep.command} command.`);
|
|
|
|
const prefix = `node ${cliExecutable} ${cliStep.command}`;
|
|
const command = getCommand(
|
|
cliStep.hasArgument ? `${prefix} ${options.argument}` : prefix,
|
|
cliStep.options,
|
|
options.optionValues || {}
|
|
);
|
|
|
|
await exec(
|
|
command,
|
|
{
|
|
cwd: options.cwd,
|
|
env: {
|
|
STORYBOOK_DISABLE_TELEMETRY: 'true',
|
|
},
|
|
},
|
|
{
|
|
startMessage: `${cliStep.icon} ${cliStep.description}`,
|
|
errorMessage: `🚨 ${cliStep.description} failed`,
|
|
dryRun: options.dryRun,
|
|
debug: options.debug,
|
|
}
|
|
);
|
|
}
|