strapi/packages/cli/create-strapi-starter/src/create-strapi-starter.ts

112 lines
3.3 KiB
TypeScript
Raw Normal View History

2023-04-17 18:21:23 +02:00
import { readFileSync } from 'node:fs';
import { resolve } from 'node:path';
2023-04-17 18:21:23 +02:00
import commander, { CommanderError } from 'commander';
2023-04-17 18:21:23 +02:00
import buildStarter from './utils/build-starter';
import promptUser from './utils/prompt-user';
import type { Program } from './types';
interface ProjectArgs {
projectName: string;
starter: string;
}
const packageJson = JSON.parse(readFileSync(resolve(__dirname, '../package.json'), 'utf8'));
const program = new commander.Command(packageJson.name);
2023-04-17 18:21:23 +02:00
const incompatibleQuickstartOptions: Array<keyof Program> = [
'dbclient',
'dbhost',
'dbport',
'dbname',
'dbusername',
'dbpassword',
'dbssl',
'dbfile',
];
program
.version(packageJson.version)
2021-11-18 17:39:40 +01:00
.arguments('[directory], [starter]')
.option('--use-npm', 'Force usage of npm instead of yarn to create the project')
.option('--debug', 'Display database connection error')
.option('--quickstart', 'Quickstart app creation')
.option('--dbclient <dbclient>', 'Database client')
.option('--dbhost <dbhost>', 'Database host')
.option('--dbport <dbport>', 'Database port')
.option('--dbname <dbname>', 'Database name')
.option('--dbusername <dbusername>', 'Database username')
.option('--dbpassword <dbpassword>', 'Database password')
.option('--dbssl <dbssl>', 'Database SSL')
.option('--dbfile <dbfile>', 'Database file path for sqlite')
.option('--dbforce', 'Overwrite database content if any')
.description(
'Create a fullstack monorepo application using the strapi backend template specified in the provided starter'
)
2021-11-18 17:39:40 +01:00
.action((directory, starter, programArgs) => {
2023-04-17 18:21:23 +02:00
const projectArgs: ProjectArgs = { projectName: directory, starter };
initProject(projectArgs, programArgs);
});
2023-04-17 18:21:23 +02:00
function generateApp(projectArgs: ProjectArgs, programArgs: Program) {
2021-11-18 17:39:40 +01:00
if (!projectArgs.projectName || !projectArgs.starter) {
console.error(
2021-11-18 17:39:40 +01:00
'Please specify the <directory> and <starter> of your project when using --quickstart'
);
// eslint-disable-next-line no-process-exit
process.exit(1);
}
return buildStarter(projectArgs, programArgs);
}
2023-04-17 18:21:23 +02:00
async function initProject(projectArgs: ProjectArgs, programArgs: Program) {
2022-08-08 23:33:39 +02:00
const hasIncompatibleQuickstartOptions = incompatibleQuickstartOptions.some(
2023-04-17 18:21:23 +02:00
(opt) => programArgs[opt]
2022-08-08 23:33:39 +02:00
);
2023-04-17 18:21:23 +02:00
if (programArgs.quickstart && hasIncompatibleQuickstartOptions) {
console.error(
`The quickstart option is incompatible with the following options: ${incompatibleQuickstartOptions.join(
', '
)}`
);
process.exit(1);
}
if (hasIncompatibleQuickstartOptions) {
2023-04-17 18:21:23 +02:00
programArgs.quickstart = false; // Will disable the quickstart question because != 'undefined'
}
2021-11-18 17:39:40 +01:00
const { projectName, starter } = projectArgs;
2021-11-22 09:29:11 +01:00
2023-04-17 18:21:23 +02:00
if (programArgs.quickstart) {
return generateApp(projectArgs, programArgs);
}
2023-04-17 18:21:23 +02:00
const prompt = await promptUser(projectName, starter, programArgs);
const promptProjectArgs = {
projectName: prompt.directory || projectName,
2021-11-18 17:39:40 +01:00
starter: prompt.starter || starter,
};
2023-04-17 18:21:23 +02:00
return generateApp(promptProjectArgs, {
...programArgs,
quickstart: prompt.quick || programArgs.quickstart,
});
}
try {
program.parse(process.argv);
} catch (err) {
2023-04-17 18:21:23 +02:00
if (err instanceof CommanderError) {
if (err.exitCode && err.exitCode !== 0) {
program.outputHelp();
}
}
}