infra-cli
Version:
194 lines (170 loc) • 6.07 kB
JavaScript
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