uni-easy-pages
Version:
uni-app开发环境辅助生产工具
122 lines (109 loc) • 3.71 kB
JavaScript
const fs = require('fs');
const path = require('path');
const rule = {
globalStyle: /(?<=const\s+globalStyle\s*=\s*)\{[\s\S]*?}(?=\s*;)/,
pages: /(?<=const\s+pages\s*=\s*)\[[\s\S]*?](?=\s*;)/g,
easycom: /(?<=const\s+easycom\s*=\s*)\{[\s\S]*?}(?=\s*;)/,
tabBar: /(?<=const\s+tabBar\s*=\s*)\{[\s\S]*?}(?=\s*;)/,
condition: /(?<=const\s+condition\s*=\s*)\{[\s\S]*?}(?=\s*;)/,
extras: /(?<=const\s+extras\s*=\s*)\{[\s\S]*?}(?=\s*;)/,
leftWindow: /(?<=const\s+leftWindow\s*=\s*)\{[\s\S]*?}(?=\s*;)/,
rightWindow: /(?<=const\s+rightWindow\s*=\s*)\{[\s\S]*?}(?=\s*;)/,
topWindow: /(?<=const\s+topWindow\s*=\s*)\{[\s\S]*?}(?=\s*;)/,
}
module.exports = class {
constructor(watchDirs, watchFileName) {
this.watchDirs = watchDirs;
this.watchFileName = watchFileName;
this.pagesJsonFilePath = path.join(path.resolve(), "pages.json");
}
static init(watchDirs, watchFileName) {
return new this(watchDirs, watchFileName);
}
start() {
let pagesData = {};
try {
let files = [];
this.watchDirs.forEach((item) => {
files = files.concat(this.loadFile(item));
});
let codeStr = '';
files.forEach(item => {
console.log(item)
try {
let str = fs.readFileSync(item, 'utf-8');
let dataStr = `!${str}`;
dataStr = dataStr.replace(/\w+(?=\:)/g, function(it) {
return `"${it}"`
})
codeStr += str;
} catch (err) {
console.error('解析数据失败,文件->' + item);
}
});
let valueStr = '';
for (let [key, reg] of Object.entries(rule)) {
try {
let pagesStr = '';
codeStr = codeStr.replace(eval(reg), (value) => {
if (key == "pages") {
if (value.replace(/[\r\n]/g, "").trim() != "[]") {
value = value.replace(/\[|]/g, ''); //去除中括号
value = this.removeIllegalSign(value); //去除非法字符结尾
pagesStr += `${value},`
}
} else {
if (key == "extras") {
if (value.replace(/[\r\n]/g, "").trim() != "{}") {
value = value.replace(/^\{|/, ''); //去除中括号
value = value.replace(/\}$/, ''); //去除中括号
value = this.removeIllegalSign(value); //去除非法字符结尾
valueStr += `${value},`
}
} else {
value = value.replace(/\'/g, "\"");
value = this.removeIllegalSign(value); //去除非法字符结尾
valueStr += `"${key}":${value},`
}
}
return ''
})
if (key == "pages") {
valueStr += `"${key}":[${pagesStr}],`
}
} catch (err) {
console.error('解析配置文件数据失败,配置文件->' + key);
}
}
fs.writeFileSync(this.pagesJsonFilePath, this.removeIllegalSign("{" + valueStr + "}"));
console.log("pages.json 创建完成");
} catch (err) {
console.error(err);
}
}
/**
* 将一个字符串格式化为正在的json 去除非法结尾字符
* @param {String} str 需要去除非法结尾的字符串
*/
removeIllegalSign(str) {
str = str.replace(/\,[\s]*(?=\})/g, sign => sign.replace(/\,/g, ''));
return str.replace(/(?<=[\}\]])[\s]*\,[\s]*(?=[\}\]])/, sign => sign.replace(/\,/g, ''))
}
loadFile(dirPath) {
let files = [];
let dirItems = fs.readdirSync(dirPath);
dirItems.forEach(item => {
if (this.watchFileName.indexOf(item) > -1) {
files.push(path.join(dirPath, item));
} else {
if (fs.statSync(path.join(dirPath, item)).isDirectory()) {
let _files = this.loadFile(path.join(dirPath, item));
if (_files.length > 0) {
files = files.concat(_files);
}
}
}
});
return files;
}
}