UNPKG

cdt-cli

Version:

A simple CLI for creating your projects

136 lines (117 loc) 6.57 kB
'use strict' const exec = require('child_process').exec // 创建异步进程 const co = require('co') // 异步流程控制工具 const prompt = require('co-prompt') // 传统的命令行只能单行一次性地输入所有参数和选项,使用这个工具可以自动提供提示信息,并且分步接收用户的输入,体验类似npm init时的一步一步输入参数的过程。 const config = require('../templates') const chalk = require('chalk') const ora = require('ora') const fs = require("fs"); const { resolve } = require('path') const deleteFolder = require('../lib/tool/deleteFolder') const deleteFile = require('../lib/tool/deleteFile') const writeFileRecursive = require('../lib/tool/writeFileRecursive') const formatCamelPeak = require('../lib/tool/formatCamelPeak') const formatAllUpperCase = require('../lib/tool/formatAllUpperCase') module.exports = () => { co(function* () { let tplName = yield prompt('选择模板名称(vue-mp, cdt-pc):') let projectName = yield prompt('项目名称:') let isUserConfig if (tplName === 'cdt-pc') { isUserConfig = yield prompt('是否使用配置文件(Y/N):') } let gitUrl let branch if (!config.tpl[tplName]) { console.log(chalk.red); process.exit() } gitUrl = config.tpl[tplName].gitUrl branch = config.tpl[tplName].branch let cmdStr = `git clone ${gitUrl} ${projectName} && cd ${projectName} && git checkout ${branch}` const lqProcess = ora('正在创建...') lqProcess.start() let startTime = new Date().getTime() exec(cmdStr, (error, stdout, stderr) => { deleteFolder(`/${process.cwd()}/${projectName}/.git`) if (tplName === 'cdt-pc') { if (isUserConfig === 'Y') { // 读取配置文件 let templateConfig = fs.readFileSync(`/${process.cwd()}/config.json`, 'utf-8') let addImport = '' let addModules = '' let getServiceResult = fs.readFileSync(`${resolve('./')}/lib/files/get.service.js`, 'utf-8') let postServiceResult = fs.readFileSync(`${resolve('./')}/lib/files/post.service.js`, 'utf-8') JSON.parse(templateConfig).modules.forEach(item1 => { // 读取接口文件 let interfaceResult = fs.readFileSync(`${resolve('./')}/lib/files/service.js`, 'utf-8') // 读取路由文件 // let templateRouter = fs.readFileSync(`${resolve('./')}/lib/files/templateRouter.js`, 'utf-8') // 读取store模块文件 let storeResult = fs.readFileSync(`${resolve('./')}/lib/files/store.modules.js`, 'utf-8').replace(/template/g, formatCamelPeak(item1.data.name)) item1.childrenNode && item1.childrenNode.forEach(item2 => { // 读取列表模板 let viewTemplateResult = fs.readFileSync(`${resolve('./')}/lib/files/list.template.vue`, 'utf-8').replace(/TemplateView/g, formatAllUpperCase(item2.data.name)).replace(/TemplateNote/g, item2.data.notes) // 读取表单弹出框模板 let dialogTemplateResult = fs.readFileSync(`${resolve('./')}/lib/files/dialog.template.vue`, 'utf-8').replace(/TemplateDialog/g, formatAllUpperCase(item2.data.name)).replace(/TemplateNote/g, item2.data.notes + '弹出框') item2.interface && item2.interface.forEach(item3 => { // 需要写入service的接口 if (item3.method === 'get') { interfaceResult = `${interfaceResult}` + '\n' + getServiceResult.replace('serviceNote', item3.notes).replace('serviceName', item3.name).replace('serviceUrl', item3.url).replace('serviceMethod', item3.method) } else { interfaceResult = `${interfaceResult}` + '\n' + postServiceResult.replace('serviceNote', item3.notes).replace('serviceName', item3.name).replace('serviceUrl', item3.url).replace('serviceMethod', item3.method) } if (item3.type === 'add') { dialogTemplateResult = dialogTemplateResult.replace(/addTemplateService/g, item3.name) } else if (item3.type === 'list') { viewTemplateResult = viewTemplateResult.replace(/queryTemplateService/g, item3.name) } else if (item3.type === 'detail') { dialogTemplateResult = dialogTemplateResult.replace(/detailTemplateService/g, item3.name) } else if (item3.type === 'update') { dialogTemplateResult = dialogTemplateResult.replace(/editTemplateService/g, item3.name) } else if (item3.type === 'delete') { viewTemplateResult = viewTemplateResult.replace(/delTemplateService/g, item3.name) } }) // 替换引用的service路径 viewTemplateResult = viewTemplateResult.replace('service.js', `${formatCamelPeak(item1.data.name)}.service.js`) // 编写列表文件夹 writeFileRecursive(`/${process.cwd()}/${projectName}/src/views/${item1.data.name}/${item2.data.name}/index.vue`, viewTemplateResult, (err) => { if (err) console.error(err); }) // 编写弹出框文件夹 writeFileRecursive(`/${process.cwd()}/${projectName}/src/views/${item1.data.name}/${item2.data.name}/components/${formatAllUpperCase(item2.data.name)}Dialog.vue`, dialogTemplateResult, (err) => { if (err) console.error(err); }) }) addImport = `\nimport ${formatCamelPeak(item1.data.name)} from './modules/${formatCamelPeak(item1.data.name)}.modules'` + addImport addModules = `\n ${formatCamelPeak(item1.data.name)},` + addModules // 编写store文件夹 fs.writeFileSync(`/${process.cwd()}/${projectName}/src/store/modules/${formatCamelPeak(item1.data.name)}.modules.js`, storeResult, 'utf8') // 编写service文件夹 fs.writeFileSync(`/${process.cwd()}/${projectName}/src/api/${formatCamelPeak(item1.data.name)}.service.js`, interfaceResult, 'utf8') }) // 读取store文件 let data = fs.readFileSync(`/${process.cwd()}/${projectName}/src/store/index.js`, 'utf-8') // 解析store index文件内容 let storeResultWrite = data.replace("import config from \'./modules/config.modules\'", `import config from \'./modules/config.modules\'${addImport}`).replace('config,', `config, ${addModules}`) // 编写store index文件 fs.writeFileSync(`/${process.cwd()}/${projectName}/src/store/index.js`, storeResultWrite, 'utf-8') } } if (error) { lqProcess.fail() console.log(error) process.exit() } lqProcess.succeed() let endTime = new Date().getTime() let time = endTime - startTime console.log(chalk.green(`\n ✅ 生成成功!耗时 ${time/1000}s`)) console.log(`\n cd ${projectName} && npm install \n`) // process.exit() }) }) }