cdt-cli
Version:
A simple CLI for creating your projects
103 lines (86 loc) • 5.66 kB
JavaScript
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')
const pathIsExist = require('../lib/tool/pathIsExist')
module.exports = () => {
co(function* () {
let projectName = yield prompt('输入你要更新的文件夹:')
// let operation = yield prompt('输入你要执行的操作:')
// 读取配置文件
let templateConfig = fs.readFileSync(`/${process.cwd()}/config.json`, 'utf-8')
pathIsExist(`${process.cwd()}/${projectName}`).then(res => {
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')
// 读取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 === 'edit') {
dialogTemplateResult = dialogTemplateResult.replace(/editTemplateService/g, item3.name)
} else if (item3.type === 'delete') {
viewTemplateResult = viewTemplateResult.replace(/delTemplateService/g, item3.name)
}
})
// 编写列表文件夹
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(`/${resolve('./')}/lib/files/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')
console.log(chalk.green(`\n ✅ 更新成功!`))
process.exit()
}).catch(err => {
console.log(err);
process.exit()
})
})
}