UNPKG

infra-cli

Version:
194 lines (170 loc) 6.07 kB
const inquirer = require('inquirer') const fs = require('fs-extra') const path = require('path') const chalk = require('chalk') const { cacheCurrentChoose } = require('./scripts/cache') const { runAdd } = require('./install') const replaceTemplate = require('./dealWithTemplate') const addHuskyConfig = require('./addHusky') const { dependencies, devDependencies, reactRouterDependencies, reactRouterDevDependencies, typeScriptDependencies, typeScriptDevDependencies, eslintDependencies, eslintDevDependencies, unitTestingDependencies, unitTestingDevDependencies, commitLintDependencies, commitLintDevDependencies, i18nDependencies, i18nDevDependencies, mockDependencies, mockDevDependencies } = require('./config/packageConfig') const { exit } = require('process') const changeFileType = (source, target) => { try { fs.copySync(source, target) fs.removeSync(source) } catch (error) { console.error(error) exit(1) } } const promptConfig = [ { type: 'checkbox', message: chalk.blueBright('choose project configs:'), name: 'configs', choices: [ { name: 'TypeScript', value: 'typeScript' }, { name: 'Router', checked: true, value: 'router' }, { name: 'ESLint + prettier', checked: true, value: 'eslint' }, { name: 'Unit Testing', value: 'unitTesting' }, { name: 'Commit Lint', value: 'commitLint' }, { name: 'I18n', value: 'i18n' }, { name: 'Mock', value: 'mock' } ], pageSize: 10, loop: false } ] const generatorConfigFile = async (name, configs, targetDir) => { const templatesDir = path.join(__dirname, '..', './templates/react') let packageDependencies = dependencies let packageDevDependencies = devDependencies const configObj = {} configs.forEach((item) => { configObj[item] = item }) const changeFileTypeMap = {} try { const copyList = [ 'src', 'package.txt', '.editorconfig', '.gitignore.txt', '.npmignore.txt', '.babelrc.txt', 'webpack.config.base.babel.txt', 'webpack.config.dev.babel.txt', 'webpack.config.pro.babel.js' ] changeFileTypeMap['src/App.txt'] = 'src/App.jsx' changeFileTypeMap['src/index.txt'] = 'src/index.jsx' changeFileTypeMap['package.txt'] = 'package.json' changeFileTypeMap['.babelrc.txt'] = '.babelrc' changeFileTypeMap['.gitignore.txt'] = '.gitignore' changeFileTypeMap['.npmignore.txt'] = '.npmignore' changeFileTypeMap['webpack.config.base.babel.txt'] = 'webpack.config.base.babel.js' changeFileTypeMap['webpack.config.dev.babel.txt'] = 'webpack.config.dev.babel.js' copyList.map( (item) => fs.pathExistsSync(`${templatesDir}/${item}`) && fs.copySync(`${templatesDir}/${item}`, `${targetDir}/${item}`) ) if (configs.includes('typeScript')) { packageDependencies = [...packageDependencies, ...typeScriptDependencies] packageDevDependencies = [...packageDevDependencies, ...typeScriptDevDependencies] fs.copySync(`${templatesDir}/typings`, `${targetDir}/typings`) fs.copySync(`${templatesDir}/tsconfig.json`, `${targetDir}/tsconfig.json`) changeFileTypeMap['src/App.txt'] = 'src/App.tsx' changeFileTypeMap['src/index.txt'] = 'src/index.tsx' } if (configs.includes('router')) { packageDependencies = [...packageDependencies, ...reactRouterDependencies] packageDevDependencies = [...packageDevDependencies, ...reactRouterDevDependencies] } if (configs.includes('eslint')) { packageDependencies = [...packageDependencies, ...eslintDependencies] packageDevDependencies = [...packageDevDependencies, ...eslintDevDependencies] const copyESLintList = ['.eslintrc.txt', '.eslintignore', '.prettierignore', '.prettierrc'] copyESLintList.map((item) => fs.copySync(`${templatesDir}/${item}`, `${targetDir}/${item}`)) changeFileTypeMap['.eslintrc.txt'] = '.eslintrc' } if (configs.includes('unitTesting')) { packageDependencies = [...packageDependencies, ...unitTestingDependencies] packageDevDependencies = [...packageDevDependencies, ...unitTestingDevDependencies] } if (configs.includes('commitLint')) { packageDependencies = [...packageDependencies, ...commitLintDependencies] packageDevDependencies = [...packageDevDependencies, ...commitLintDevDependencies] fs.copySync(`${templatesDir}/commitlint.config.js`, `${targetDir}/commitlint.config.js`) } if (configs.includes('i18n')) { packageDependencies = [...packageDependencies, ...i18nDependencies] packageDevDependencies = [...packageDevDependencies, ...i18nDevDependencies] fs.copySync(`${templatesDir}/i18n.js`, `${targetDir}/src/i18n.js`) configs.includes('typeScript') && (changeFileTypeMap['src/i18n.js'] = 'src/i18n.tsx') } if (configs.includes('mock')) { packageDependencies = [...packageDependencies, ...mockDependencies] packageDevDependencies = [...packageDevDependencies, ...mockDevDependencies] fs.copySync(`${templatesDir}/mock`, `${targetDir}/mock`) } } catch (error) { console.error(chalk.redBright(error)) exit(1) } try { await replaceTemplate({ projectName: name, ...configObj }, targetDir) } catch (error) { console.error(chalk.redBright(error)) } for (const key in changeFileTypeMap) { changeFileType(`${targetDir}/${key}`, `${targetDir}/${changeFileTypeMap[key]}`) } await cacheCurrentChoose(name, targetDir, packageDependencies, packageDevDependencies) runAdd(targetDir, packageDependencies, packageDevDependencies) addHuskyConfig(targetDir, configs) } async function generatorProjectFromCustom (name, targetDir) { const { configs } = await inquirer.prompt(promptConfig) generatorConfigFile(name, configs, targetDir) } module.exports = generatorProjectFromCustom