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);