96 lines
2.4 KiB
JavaScript
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")}`);
|