@micro-cli/create
Version:
A Cli to quickly create modern Vite-based web app.
91 lines (86 loc) • 2.7 kB
text/typescript
import path from 'node:path';
import fs from 'fs-extra';
import figlet from 'figlet';
import inquirer from 'inquirer';
import type { OptionsTypes } from '@micro-cli/core/types';
import validateProjectName from 'validate-npm-package-name';
import { chalk, exit, clear } from '@micro-cli/shared-utils';
import type { correctNameResult, errorNameResult } from './types/index';
import Creator from './Creator';
async function create(projectName: string, options: OptionsTypes) {
const cwd: string = process.cwd();
const inCurrent: boolean = projectName === '.'; // 是否是在该目录中直接创建项目
const name: string = inCurrent ? path.relative('../', cwd) : projectName;
const targetDir: string = path.resolve(cwd, projectName || '.');
/**
* @description 检测项目名称是否合法
*/
const result: correctNameResult | errorNameResult = validateProjectName(name);
if (!result.validForNewPackages) {
console.error(chalk.red(`Invalid project name: "${name}"`));
(result as errorNameResult).errors?.forEach((err: string) => {
console.error(chalk.red.dim(`Error: ${err}`));
});
(result as errorNameResult).warnings?.forEach((warn: string) => {
console.error(chalk.red.dim(`Warning: ${warn}`));
});
exit(1);
}
/**
* @description 检测当前目录下是否已经有项目名称的文件夹
*/
if (fs.existsSync(targetDir)) {
if (options.force) {
await fs.remove(targetDir);
} else if (inCurrent) {
const { ok } = await inquirer.prompt([
{
name: 'ok',
type: 'confirm',
message: `Generate project in current directory?`,
},
]);
if (!ok) {
return;
}
} else {
const { action } = await inquirer.prompt([
{
name: 'action',
type: 'list',
message: `Target directory ${chalk.cyan(
targetDir
)} already exists. Pick an action:`,
choices: [
{ name: 'Overwrite', value: 'overwrite' },
{ name: 'Cancel', value: false },
],
},
]);
if (action === 'overwrite') {
console.log(`\nRemoving ${chalk.cyan(targetDir)}...`);
await fs.remove(targetDir);
} else {
return;
}
}
}
if (!inCurrent) {
await fs.mkdir(targetDir);
}
clear();
console.log(
chalk.yellow(
figlet.textSync('M-CLI', {
horizontalLayout: 'full',
font: '3D-ASCII',
verticalLayout: 'default',
width: 150,
whitespaceBreak: true,
})
)
);
const creator = new Creator(name, targetDir);
await creator.create(options);
}
export default create;