fineui是帆软报表和BI产品线所使用的前端框架。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
2.2 KiB

const fs = require("fs");
const srcName = process.argv[2];
const sourceCode = fs.readFileSync(srcName).toString();
const clzName = /BI\.(.*?)\s\=\sBI\.inherit\(/.exec(sourceCode)[1];
const superName = /inherit\(BI\.(.*?),/.exec(sourceCode)[1];
// const xtype = /BI.shortcut\(\"(.*?)\"/.exec(sourceCode)[1];
const collection = {
static: {}
};
const BI = {
inherit(_, options) {
collection.methods = Object.keys(options).map((key) => options[key]);
return collection.static;
},
shortcut(xtype) {
collection.xtype = xtype;
}
};
eval(sourceCode);
let M = "";
let E = "";
let I = "";
const coreImport = {
shortcut: true
};
if (superName === "Widget") {
coreImport.Widget = true;
}
// 静态方法
Object.keys(collection.static).forEach((key) => {
E += `\tstatic ${key} = "${collection.static[key]}"\n`;
});
// 对函数进行替换
collection.methods.forEach((el) => {
let f = el.toString().replace(/^function/, el.name) + "\n";
// 换 BI.Button.superclass
f = f.replace(`BI.${clzName}.superclass`, "super");
// 换 super._defaultConfig
f = f.replace(
`super\._defaultConfig\.apply\(this\,\sarguments\)`,
"super._defaultConfig(arguments)"
);
// 换 super.xxx.apply
f = f.replace(/super\.(.*?)\.apply\(this\,\sarguments\)/, (a) => {
const f = /super\.(.*?)\.apply\(this\,\sarguments\)/.exec(a);
return `super.${f[1]}(...arguments)`;
});
const target = [
"isNull",
"toPix",
"isKey",
"isObject",
"map",
"extend",
"isFunction",
"isEmptyArray",
"isArray"
];
target.forEach((t) => {
const arr = f.split(`BI.${t}`);
// nodejs 低版本没有 replaceAll
if (arr.length > 1) {
coreImport[t] = true;
f = arr.join(t);
}
});
M += f;
});
Object.keys(coreImport).forEach((el) => {
I += `${el},`;
});
const outputCode = `
import {${I}} from "@/core"
@shortcut()
export class ${clzName} extends ${superName} {
\tstatic xtype = "${collection.xtype}"
${E}
${M}
}
`;
fs.writeFileSync(srcName + ".js", outputCode);