@kmfb/create-node-ts-app
Version:
create-node-ts-app
161 lines • 12.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.end = exports.installFeature = exports.selectFeature = exports.installDevEnviroment = exports.installTSAndInit = exports.changePackageInfo = exports.initProjectDir = exports.isDirExist = void 0;
const fs_1 = require("fs");
const util_1 = require("../util");
const shell = require("shelljs");
const chalk_1 = require("chalk");
const inquirer_1 = require("inquirer");
const installFeatureMethod = require("./installFeature");
const constants_1 = require("../constants");
const isDirExist = (dirName) => {
const dirPath = (0, util_1.getProjectPath)(dirName);
if ((0, fs_1.existsSync)(dirPath)) {
// shell.rm('-rf', dirPath);
process.exit(1);
}
};
exports.isDirExist = isDirExist;
const initProjectDir = (projectName) => {
shell.exec(`mkdir ${projectName}`);
shell.cd(projectName);
shell.exec(`mkdir src`);
shell.exec(`mkdir .vscode`);
const indexJsContent = `console.log('hello, world!')`;
(0, fs_1.writeFileSync)('./src/index.ts', indexJsContent, { encoding: 'utf-8' });
shell.exec(`npm init -y`);
(0, fs_1.writeFileSync)('./.vscode/settings.json', constants_1.vscodeSettings, {
encoding: 'utf-8',
});
(0, fs_1.writeFileSync)('./.gitignore', constants_1.gitignore, { encoding: 'utf-8' });
};
exports.initProjectDir = initProjectDir;
const changePackageInfo = (projectName) => {
(0, util_1.modifyJsonFile)((packageJSON) => {
packageJSON.name = packageJSON.description = projectName;
});
};
exports.changePackageInfo = changePackageInfo;
const installTSAndInit = () => {
(0, util_1.printMsg)((0, chalk_1.blue)('installTSAndInit...'));
shell.exec('npm i typescript @types/node -D && pnpx tsc --init');
// 覆写 tsconfig.json
const tsconfigJson = {
compileOnSave: true,
compilerOptions: {
target: 'ES2018',
module: 'commonjs',
moduleResolution: 'node',
experimentalDecorators: true,
emitDecoratorMetadata: true,
inlineSourceMap: true,
noImplicitThis: true,
noUnusedLocals: true,
stripInternal: true,
pretty: true,
declaration: true,
outDir: 'lib',
baseUrl: './',
paths: {
'*': ['src/*'],
},
},
exclude: ['lib', 'node_modules'],
};
(0, util_1.writeJsonFile)('./tsconfig.json', tsconfigJson);
};
exports.installTSAndInit = installTSAndInit;
const installDevEnviroment = () => {
(0, util_1.printMsg)((0, chalk_1.blue)('installDevEnviroment...'));
shell.exec('npm i ts-node-dev -D');
(0, util_1.modifyJsonFile)((packageJson) => {
packageJson.scripts['dev:comment'] = '启动开发环境';
packageJson.scripts['dev'] =
'ts-node-dev --respawn --transpile-only src/index.ts';
});
};
exports.installDevEnviroment = installDevEnviroment;
/**
* 交互式命令行,让用户自己选择需要的功能
* return ['ESLint', 'Prettier', 'CZ']
*/
async function selectFeature() {
// 清空命令行
(0, util_1.clear)();
// 输出信息
/* eslint-disable @typescript-eslint/no-var-requires */
(0, util_1.printMsg)((0, chalk_1.blue)(`TS CLI v${require('../../package.json').version}`));
(0, util_1.printMsg)('Start initializing the project:');
(0, util_1.printMsg)('');
// 选择功能,这里配合 下面的 installFeature 方法 和 ./installFeature.ts 文件为脚手架提供了良好的扩展机制
// 将来扩展其它功能只需要在 choices 数组中增加配置项,然后在 ./installFeature.ts 文件中增加相应的安装方法即可
const { feature } = await (0, inquirer_1.prompt)([
{
name: 'feature',
type: 'checkbox',
message: 'Check the features needed for your project',
choices: [
{ name: 'ESLint', value: 'ESLint' },
{ name: 'Prettier', value: 'Prettier' },
{ name: 'CZ', value: 'CZ' },
],
},
]);
return feature;
}
exports.selectFeature = selectFeature;
/**
* 安装用户选择的功能
* @param feature 功能列表
*/
function installFeature(feature) {
feature.forEach((item) => {
const func = installFeatureMethod[`install${item}`];
func();
});
// 安装 husky 和 lint-staged
installHusky(feature);
// 安装构建工具
installFeatureMethod.installBuild(feature);
}
exports.installFeature = installFeature;
/**
* 安装 husky 和 lint-staged,并根据功能设置相关命令
* @param feature 用户选择的功能列表
*/
function installHusky(feature) {
// 初始化 git 仓库
shell.exec('git init');
(0, util_1.printMsg)((0, chalk_1.blue)('installHusky...'));
// 在安装 husky 和 lint-staged
shell.exec('npm i husky lint-staged -D');
shell.exec(`npm set-script prepare "husky install"`);
shell.exec(`npm run prepare`);
// feature 副本
const featureBak = JSON.parse(JSON.stringify(feature));
// 设置 hook
const hooks = {};
// 判断用户是否选择了 CZ,有则设置 hooks
if (featureBak.includes('CZ')) {
hooks['prepare-commit-msg'] = 'exec < /dev/tty && git cz --hook || true';
shell.exec(`npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'`);
}
if (featureBak.includes('ESLint') || featureBak.includes('Prettier')) {
(0, util_1.printMsg)((0, chalk_1.blue)('lint-staged...'));
shell.exec('npx mrm@2 lint-staged');
}
installFeatureMethod.installHusky(hooks);
}
/**
* 整个项目安装结束,给用户提示信息
*/
function end(projectName) {
(0, util_1.printMsg)(`Successfully created project ${(0, chalk_1.yellow)(projectName)}`);
(0, util_1.printMsg)('Get started with the following commands:');
(0, util_1.printMsg)('');
(0, util_1.printMsg)(`${(0, chalk_1.gray)('$')} ${(0, chalk_1.cyan)('cd ' + projectName)}`);
(0, util_1.printMsg)(`${(0, chalk_1.gray)('$')} ${(0, chalk_1.cyan)('npm run dev')}`);
(0, util_1.printMsg)('');
}
exports.end = end;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWwvY3JlYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJCQUErQztBQUMvQyxrQ0FPaUI7QUFDakIsaUNBQWlDO0FBRWpDLGlDQUFpRDtBQUNqRCx1Q0FBa0M7QUFDbEMseURBQXlEO0FBQ3pELDRDQUF5RDtBQUVsRCxNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQU8sRUFBUSxFQUFFO0lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUEscUJBQWMsRUFBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxJQUFJLElBQUEsZUFBVSxFQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3ZCLDRCQUE0QjtRQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQyxDQUFDO0FBTlcsUUFBQSxVQUFVLGNBTXJCO0FBRUssTUFBTSxjQUFjLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRTtJQUM1QyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNuQyxLQUFLLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM1QixNQUFNLGNBQWMsR0FBRyw4QkFBOEIsQ0FBQztJQUN0RCxJQUFBLGtCQUFhLEVBQUMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkUsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMxQixJQUFBLGtCQUFhLEVBQUMseUJBQXlCLEVBQUUsMEJBQWMsRUFBRTtRQUN2RCxRQUFRLEVBQUUsT0FBTztLQUNsQixDQUFDLENBQUM7SUFDSCxJQUFBLGtCQUFhLEVB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