@lvl/wxapp-cli
Version:
wxapp-cli
148 lines (131 loc) • 4.24 kB
JavaScript
const inquirer = require('inquirer')
const writeFileTree = require('../utils/writeFileTree')
const EventEmitter = require('events')
const { execSync } = require('child_process')
const path = require('path')
const { cliRoot } = require('../config/wxapp-cli.config')
const {
hasGit,
logWithSpinner,
stopSpinner,
log
} = require('../utils')
const _hasGit = hasGit()
module.exports = class Generator extends EventEmitter {
constructor (options = {}) {
super()
this.ctx = options.ctx || ''
this.name = options.name || ''
this.cliOptions = options.cliOptions || {}
this.appName = options.answers && options.answers.appName || ''
this.templateName = options.answers && options.answers.templateName || ''
}
async generate () {
const {
ctx,
name,
cliOptions,
appName,
templateName
} = this
// 模版的模块名称
const tplModuleName = `@lvl/${templateName}`
const cliTemplate = require(tplModuleName)
// 模版预设的初始化选项
let initAns = {}
if (cliTemplate.init && cliTemplate.init.length) {
stopSpinner()
log()
let tmp = {}
for (let i = 0, l = cliTemplate.init.length; i < l; ++i) {
if (cliTemplate.init[i].info) {
console.log(cliTemplate.init[i].info)
delete cliTemplate.init[i].info
}
tmp = await inquirer.prompt([cliTemplate.init[i]])
initAns = Object.assign(initAns, tmp)
}
}
log()
logWithSpinner(`初始化项目配置`)
// 将模版 src 目录复制到项目中
this.run(`cp -r ${path.resolve(cliRoot, 'node_modules', tplModuleName, 'src')} ${this.ctx}/`)
const pkg = {
name,
version: '1.0.0',
devDependencies: cliTemplate.devDependencies
}
// 写入的文件对象
const files = {
'package.json': `${JSON.stringify(pkg, null, 2)}\n`
}
// 生成 .gitignore
if (cliTemplate.gitignore && cliTemplate.gitignore.length) {
files['.gitignore'] = cliTemplate.gitignore.constructor === Array ? cliTemplate.gitignore.join('\n') : cliTemplate.gitignore
} else {
files['.gitignore'] = '.DS_Store\n.vscode\n.idea\nnpm-debug.log\nproject.config.json\n\nnode_modules/\ndist/\n'
}
// 生成 wxapp-cli.config.js
let cliConfig = ''
if (cliTemplate.cliConfig) {
if (typeof cliTemplate.cliConfig === 'string') {
cliConfig = cliTemplate.cliConfig
} else if (typeof cliTemplate.cliConfig === 'function') {
cliConfig = cliTemplate.cliConfig({
ctx,
name,
appName,
initAns
})
}
} else {
cliConfig = `\nmodule.exports = {\n appName: '${appName}',\n template: {\n name: '${templateName}',\n module: '${tplModuleName}',\n version: '${cliTemplate.version}'\n },\n __CONFIG__: {\n appName: '${appName}'`
for (let key in initAns) {
cliConfig += `,\n ${key}: '${initAns[key]}'`
}
cliConfig += `\n }\n}\n`
}
files['wxapp-cli.config.js'] = cliConfig
// 生成 README.md
let readme = ''
if (cliTemplate.readme) {
if (typeof cliTemplate.readme === 'string') {
readme = cliTemplate.readme
} else if (typeof cliTemplate.readme === 'function') {
readme = cliTemplate.readme({
ctx,
name,
appName,
initAns
})
}
} else {
readme = `\n# 小程序项目 \n`
}
files['README.md'] = readme
// 将文件写入项目
writeFileTree(ctx, files)
// git submodule 初始化
if (cliOptions.git && _hasGit) {
if (cliTemplate && cliTemplate.gitsubmodules && cliTemplate.gitsubmodules.length) {
cliTemplate.gitsubmodules.forEach(sub => {
this.run(`git submodule add -f ${sub.branch ? '-b ' + sub.branch : ''} ${sub.git} ${sub.path || ''}`)
})
}
this.run(`git submodule update --init --recursive`)
}
log()
// 安装项目依赖
this.run(`npm install`, {
stdio: 'inherit'
})
log()
stopSpinner()
}
run (cmd, ops) {
return execSync(cmd, Object.assign({
cwd: this.ctx,
stdio: 'ignore'
}, ops || {}))
}
}