mirror of
https://github.com/WeBankFinTech/fes.js.git
synced 2025-04-06 03:59:53 +08:00
116 lines
4.0 KiB
JavaScript
116 lines
4.0 KiB
JavaScript
import path from 'path';
|
|
import { chalk } from '@fesjs/utils';
|
|
import validateProjectName from 'validate-npm-package-name';
|
|
import fs from 'fs-extra';
|
|
import inquirer from 'inquirer';
|
|
|
|
import { clearConsole } from './utils';
|
|
import AppGenerator from './generator/App';
|
|
import PluginGenerator from './generator/Plugin';
|
|
|
|
export default async ({ cwd, args }) => {
|
|
if (args.proxy) {
|
|
process.env.HTTP_PROXY = args.proxy;
|
|
}
|
|
const projectName = args._[0];
|
|
const inCurrent = projectName === '.';
|
|
const name = inCurrent ? path.relative('../', cwd) : projectName;
|
|
const targetDir = path.resolve(cwd, projectName || '.');
|
|
|
|
const result = validateProjectName(name);
|
|
if (!result.validForNewPackages) {
|
|
console.error(chalk.red(`Invalid project name: "${name}"`));
|
|
result.errors && result.errors.forEach((err) => {
|
|
console.error(chalk.red.dim(`Error: ${err}`));
|
|
});
|
|
result.warnings && result.warnings.forEach((warn) => {
|
|
console.error(chalk.red.dim(`Warning: ${warn}`));
|
|
});
|
|
throw new Error('Process exited');
|
|
}
|
|
if (fs.pathExistsSync(targetDir) && !args.merge) {
|
|
if (args.force) {
|
|
await fs.remove(targetDir);
|
|
} else if (inCurrent) {
|
|
clearConsole();
|
|
const { ok } = await inquirer.prompt([
|
|
{
|
|
name: 'ok',
|
|
type: 'confirm',
|
|
message: 'Generate project in current directory?'
|
|
}
|
|
]);
|
|
if (!ok) {
|
|
return null;
|
|
}
|
|
} else {
|
|
clearConsole();
|
|
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: 'Merge', value: 'merge' },
|
|
{ name: 'Cancel', value: false }
|
|
]
|
|
}
|
|
]);
|
|
if (!action) {
|
|
return null;
|
|
}
|
|
if (action === 'overwrite') {
|
|
console.log(`\nRemoving ${chalk.cyan(targetDir)}...`);
|
|
await fs.remove(targetDir);
|
|
}
|
|
}
|
|
}
|
|
|
|
clearConsole();
|
|
const { template } = await inquirer.prompt([
|
|
{
|
|
name: 'template',
|
|
type: 'list',
|
|
message: 'Pick an template:',
|
|
choices: [
|
|
{ name: 'PC, suitable for management desk front-end applications', value: 'pc' },
|
|
{ name: 'H5, suitable for mobile applications', value: 'h5' },
|
|
{ name: 'Plugin, suitable for fes plugin', value: 'plugin' },
|
|
{ name: 'Cancel', value: false }
|
|
]
|
|
}
|
|
]);
|
|
|
|
if (template === 'pc' || template === 'h5') {
|
|
const generator = new AppGenerator({
|
|
cwd,
|
|
args,
|
|
targetDir,
|
|
path: path.join(__dirname, `../templates/app/${template}`)
|
|
});
|
|
await generator.run();
|
|
console.log();
|
|
console.log(chalk.green(`project ${projectName} created successfully, please execute the following command to use:`));
|
|
console.log(`$ cd ${projectName}`);
|
|
console.log('$ yarn');
|
|
console.log('$ yarn dev');
|
|
console.log();
|
|
} else if (template === 'plugin') {
|
|
const generator = new PluginGenerator({
|
|
cwd,
|
|
args,
|
|
targetDir,
|
|
path: path.join(__dirname, '../templates/plugin'),
|
|
name
|
|
});
|
|
await generator.run();
|
|
console.log();
|
|
console.log(chalk.green(`plugin ${projectName} created successfully, please execute the following command to use:`));
|
|
console.log(`$ cd ${projectName}`);
|
|
console.log('$ yarn');
|
|
console.log('$ yarn dev');
|
|
console.log();
|
|
}
|
|
};
|