Files
SingBox-Gopanel/frontend/admin/reverse/scripts/normalize-bundle.cjs
CN-JS-HuiBai 87ae55ebcf
Some checks failed
build / build (api, amd64, linux) (push) Failing after -52s
build / build (api, arm64, linux) (push) Failing after -52s
build / build (api.exe, amd64, windows) (push) Failing after -51s
完善API文档,修复保存按钮的BUG
2026-04-18 22:51:33 +08:00

91 lines
3.0 KiB
JavaScript

const fs = require("fs");
const path = require("path");
const parser = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const generate = require("@babel/generator").default;
const t = require("@babel/types");
const prettier = require("prettier");
const projectRoot = path.resolve(__dirname, "..", "..");
const outputRoot = path.resolve(__dirname, "..", "output");
const inputPath = path.join(outputRoot, "index-CO3BwsT2.pretty.js");
const outputPath = path.join(outputRoot, "index-CO3BwsT2.normalized.js");
async function main() {
console.log("Reading file...");
const source = fs.readFileSync(inputPath, "utf8");
console.log("Parsing AST...");
const ast = parser.parse(source, {
sourceType: "module",
plugins: ["jsx"],
});
console.log("Normalizing patterns...");
traverse(ast, {
// Convert !0 -> true, !1 -> false
UnaryExpression(path) {
if (path.node.operator === "!" && path.node.argument.type === "NumericLiteral") {
if (path.node.argument.value === 0) {
path.replaceWith(t.booleanLiteral(true));
} else if (path.node.argument.value === 1) {
path.replaceWith(t.booleanLiteral(false));
}
}
// Convert void 0 -> undefined
if (path.node.operator === "void" && path.node.argument.type === "NumericLiteral" && path.node.argument.value === 0) {
path.replaceWith(t.identifier("undefined"));
}
},
// Simplify numeric literals (e.g., 1e3 -> 1000)
NumericLiteral(path) {
if (path.node.extra && path.node.extra.raw && path.node.extra.raw.includes('e')) {
delete path.node.extra;
}
},
// identified React Hook aliasing (heuristic)
VariableDeclarator(path) {
// Look for: const t = n.useState;
if (
path.node.init &&
path.node.init.type === "MemberExpression" &&
path.node.init.property.type === "Identifier" &&
path.node.init.property.name.startsWith("use") &&
path.node.id.type === "Identifier" &&
path.node.id.name.length <= 2 // minified name
) {
const hookName = path.node.init.property.name;
const oldName = path.node.id.name;
const scope = path.scope;
// Rename oldName to hookName in this scope
// scope.rename(oldName, hookName); // Dangerous if hookName is already in use
// For now, let's just log it or be very careful
}
}
});
console.log("Generating code...");
const { code } = generate(ast, {
retainLines: true,
compact: false,
});
console.log("Formatting with Prettier...");
const formatted = await prettier.format(code, {
parser: "babel",
printWidth: 100,
trailingComma: "all",
singleQuote: false,
});
console.log(`Writing output to ${outputPath}...`);
fs.writeFileSync(outputPath, formatted, "utf8");
console.log("Normalization complete!");
}
main().catch((err) => {
console.error(err);
process.exit(1);
});