add cli
This commit is contained in:
107
packages/dooringx-cli/src/createPlugin.ts
Normal file
107
packages/dooringx-cli/src/createPlugin.ts
Normal file
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* @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);
|
||||
}
|
Reference in New Issue
Block a user