const fsExtra = require('fs-extra') const path = require('path') const fs = require('fs') /** * 将函数封装成promise */ const promisify = fn => { return function () { let args = arguments; return new Promise(function (resolve, reject) { [].push.call(args, function (err, result) { if (err) { console.log(err) reject(err); } else { resolve(result); } }); fn.apply(null, args); }); } } const readdir = promisify(fs.readdir) const stat = promisify(fs.stat) /** * 封装打印工具 */ const chalk = require('chalk') const {log} = console const chalkTag = { info: msg => log([chalk.bgBlue.black(' INFO '), msg].join(' ')), done: msg => log([chalk.bgGreen.black(' DONE '), msg].join(' ')), warn: msg => log([chalk.bgYellow.black(' WARN '), msg].join(' ')), error: msg => log([chalk.bgRed.black(' ERROR '), msg].join(' ')), } /** * 遍历应用的方法 */ const findApp = (dir, cb) => { return readdir(dir).then(apps => { return Promise.all(apps.map(e => { let cPath = path.join(dir, e) return stat(cPath).then(state => { if (state.isDirectory()) { return findApp(cPath, cb) } else if (state.isFile()) { cb && cb(cPath) } }) }) || []) }) } const start = () => { chalkTag.info('开始生成pages.json...') let json = { easycom: { "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue", "^(Ai|V)(.*)": "@/components/$1$2.vue" }, pages: [ {path: 'pages/loading'}, {path: 'pages/login'} ], globalStyle: { pageOrientation: "auto", navigationStyle: "custom" } } findApp('src/apps', file => { if (/.+\\App[^\\]+\\[^\\]+\.vue/g.test(file)) { let app = { name: file.replace(/.*\\([^\\]+).vue/g, '$1'), path: file.replace(/^src\\(.*).vue/g, '$1').replace(/\\/g, '/') } let vue = fs.readFileSync(file).toString() if (/appName/.test(vue)) { let appName = vue.replace(/[\s\S]*(appName:.+),[\s\S]*/gm, '$1'), title = appName.replace(/(appName:|["'])/g, '') app.style = {navigationBarTitleText: title} } json.pages.push(app) } }).then(() => { return findApp('src/saas', file => { if (/.+\\App[^\\]+\\[^\\]+\.vue/g.test(file)) { let app = { name: file.replace(/.*\\([^\\]+).vue/g, '$1'), path: file.replace(/^src\\(.*).vue/g, '$1').replace(/\\/g, '/') } let vue = fs.readFileSync(file).toString() if (/appName/.test(vue)) { let appName = vue.replace(/[\s\S]*(appName:.+),[\s\S]*/gm, '$1'), title = appName.replace(/(appName:|["'])/g, '') app.style = {navigationBarTitleText: title} } json.pages.push(app) } }) }).then(() => { fsExtra.outputJson('src/pages.json', json, () => { chalkTag.done('生成pages.json') }) }) } start();