UNPKG

@lvl/wxapp-cli

Version:

wxapp-cli

148 lines (131 loc) 4.24 kB
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 || {})) } }