Files
dooring/packages/dooringx-cli/src/createPlugin.ts

108 lines
3.2 KiB
TypeScript
Raw Normal View History

2022-01-14 09:48:18 +08:00
/*
* @Author: yehuozhili
* @Date: 2022-01-13 16:16:53
* @LastEditors: yehuozhili
* @LastEditTime: 2022-01-14 09:16:58
* @FilePath: \dooringx-cli\src\createPlugin.ts
*/
import chalk from 'chalk';
import fs from 'fs-extra';
import inquirer from 'inquirer';
import path from 'path';
import modifyTemplate from './modifyTemplate';
import { deleteFolder, doAction } from './utils';
export async function createPlugin(name: string, option: string) {
createApp(name, option);
}
async function createApp(projectName: string, option: string) {
let root = path.resolve(projectName);
const isExist = fs.existsSync(root);
if (isExist) {
const choices = ['y', 'n'];
let sign = 'y';
const result = await inquirer.prompt({
name: 'sign',
type: 'list',
message: `${projectName} already exists , continue ?`,
choices,
});
sign = result.sign;
if (sign === 'n') {
return;
}
}
fs.ensureDirSync(projectName); // 没有则创建文件夹
console.log(`create a new app in ${chalk.green(root)}`);
const packageJson = {
name: projectName,
version: '0.0.1',
private: true,
};
// 写入package.json
fs.writeFileSync(path.join(root, 'package.json'), JSON.stringify(packageJson, null, 2));
process.chdir(root);
// 复制项目模板,安装项目依赖等
await run(root, projectName, option);
}
async function run(root: string, projectName: string, _option: string) {
const template = 'dooringx-plugin-template';
const templateName = template;
const allDependencies = [templateName];
console.log('Installing packages. This might take a couple of minutes');
console.log(`Installing ${chalk.cyan(templateName)} ...`);
try {
await doAction(root, allDependencies);
} catch (e) {
console.log(`Installing ${chalk.red(templateName)} failed ...`, e);
}
console.log(`Installing ${chalk.cyan(templateName)} succeed!`);
const templatePath = path.dirname(
require.resolve(`${templateName}/package.json`, { paths: [root] })
);
// 复制文件到项目目录
const tempDir = path.join(root, 'temp');
const templateDir = path.join(templatePath, `template`);
if (fs.existsSync(templatePath)) {
await modifyTemplate(templateDir, 'temp', {
projectName: projectName,
basicProject: template,
});
fs.copySync(tempDir, root);
deleteFolder(tempDir);
} else {
console.error(`Could not locate supplied template: ${chalk.green(templatePath)}`);
return;
}
let tempPkg = fs.readFileSync(root + '/template.json').toString();
let pkg = fs.readFileSync(root + '/package.json').toString();
const tempPkgJson = JSON.parse(tempPkg);
let pkgJson = JSON.parse(pkg);
pkgJson = { ...pkgJson };
pkgJson.main = tempPkgJson?.main;
pkgJson.scripts = tempPkgJson?.scripts;
pkgJson.dependencies = {
...tempPkgJson?.dependencies,
};
pkgJson.devDependencies = {
...tempPkgJson?.devDependencies,
};
fs.writeFileSync(path.join(root, 'package.json'), JSON.stringify(pkgJson, null, 2));
fs.unlinkSync(path.join(root, 'template.json'));
fs.unlinkSync(path.join(root, 'package-lock.json'));
console.log(`🎉 Successfully created project ${projectName}.`);
console.log('👉 Get started with the following commands:');
console.log(`${chalk.cyan(`cd ${projectName}`)}`);
console.log(`${chalk.cyan('npm install')}`);
process.exit(0);
}