Files
SingBox-Gopanel/frontend/admin/reverse/scripts/inspect-bundle.cjs
CN-JS-HuiBai 609ab002b3
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 -52s
修复丢失的前端文件
2026-04-18 22:03:26 +08:00

96 lines
2.4 KiB
JavaScript

const fs = require("fs");
const path = require("path");
const parser = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const projectRoot = path.resolve(__dirname, "..", "..");
const bundlePath = path.join(projectRoot, "assets", "index-CO3BwsT2.js");
const outputRoot = path.resolve(__dirname, "..", "output");
const source = fs.readFileSync(bundlePath, "utf8");
const ast = parser.parse(source, {
sourceType: "module",
plugins: [
"jsx",
"classProperties",
"classPrivateProperties",
"classPrivateMethods",
"optionalChaining",
"nullishCoalescingOperator",
"dynamicImport",
"topLevelAwait",
],
errorRecovery: true,
});
const importedChunks = new Set();
const stringLiterals = new Map();
const apiCandidates = new Set();
const routeCandidates = new Set();
const componentCandidates = new Set();
function bump(map, value) {
map.set(value, (map.get(value) || 0) + 1);
}
traverse(ast, {
ImportExpression(path) {
const sourceNode = path.node.source;
if (sourceNode.type === "StringLiteral") {
importedChunks.add(sourceNode.value);
}
},
StringLiteral(path) {
const value = path.node.value;
if (!value || value.length < 2) {
return;
}
if (value.startsWith("/api/")) {
apiCandidates.add(value);
}
if (value.startsWith("/") && /[a-z]/i.test(value)) {
if (!value.includes(".")) {
routeCandidates.add(value);
}
}
if (/^[A-Z][A-Za-z0-9]+$/.test(value) && value.length < 40) {
componentCandidates.add(value);
}
bump(stringLiterals, value);
},
TemplateElement(path) {
const value = path.node.value.raw;
if (value.includes("/api/")) {
apiCandidates.add(value);
}
},
});
const topStrings = [...stringLiterals.entries()]
.filter(([value]) => value.length <= 120)
.sort((a, b) => b[1] - a[1])
.slice(0, 300)
.map(([value, count]) => ({ value, count }));
const report = {
bundlePath,
importedChunks: [...importedChunks].sort(),
apiCandidates: [...apiCandidates].sort(),
routeCandidates: [...routeCandidates].sort(),
componentCandidates: [...componentCandidates].sort(),
topStrings,
};
fs.mkdirSync(outputRoot, { recursive: true });
fs.writeFileSync(
path.join(outputRoot, "bundle-report.json"),
JSON.stringify(report, null, 2),
"utf8",
);
console.log(`report: ${path.join(outputRoot, "bundle-report.json")}`);