one
Version:
One is a new React Framework that makes Vite serve both native and web.
93 lines (92 loc) • 4.14 kB
JavaScript
import BabelGenerate from "@babel/generator";
import { parse } from "@babel/parser";
import BabelTraverse from "@babel/traverse";
import * as t from "@babel/types";
import { deadCodeElimination, findReferencedIdentifiers } from "babel-dead-code-elimination";
const generate = BabelGenerate["default"] || BabelGenerate;
const traverse = BabelTraverse["default"] || BabelTraverse;
function removeServerCodePlugin(_, options) {
const {
routerRoot = "app"
} = options;
return {
name: "one-remove-server-code",
visitor: {
Program: {
exit(path, state) {
const filename = state.filename;
if (!filename) return;
const routerRootPattern = new RegExp(`[/\\\\]${routerRoot}[/\\\\]`);
if (!routerRootPattern.test(filename)) return;
if (filename.includes("node_modules")) return;
const code = path.toString();
if (!/generateStaticParams|loader/.test(code)) return;
try {
const freshAst = parse(code, {
sourceType: "module",
plugins: ["typescript", "jsx"]
});
const referenced = findReferencedIdentifiers(freshAst);
const removed = {
loader: false,
generateStaticParams: false
};
traverse(freshAst, {
ExportNamedDeclaration(expPath) {
const declaration = expPath.node.declaration;
if (!declaration) return;
if (declaration.type === "FunctionDeclaration" && declaration.id) {
const name = declaration.id.name;
if (name === "loader" || name === "generateStaticParams") {
expPath.remove();
removed[name] = true;
}
} else if (declaration.type === "VariableDeclaration") {
const decl = expPath.get("declaration");
const declarators = decl.get("declarations");
for (let i = declarators.length - 1; i >= 0; i--) {
const declarator = declarators[i];
const id = declarator.node.id;
if (id.type === "Identifier" && (id.name === "loader" || id.name === "generateStaticParams")) {
declarator.remove();
removed[id.name] = true;
}
}
if (decl.node && decl.node.declarations.length === 0) {
expPath.remove();
}
}
}
});
const removedFunctions = Object.keys(removed).filter(key => removed[key]);
if (removedFunctions.length === 0) return;
deadCodeElimination(freshAst, referenced);
if (removed.loader) {
freshAst.program.body.push(t.exportNamedDeclaration(t.functionDeclaration(t.identifier("loader"), [], t.blockStatement([t.returnStatement(t.stringLiteral("__vxrn__loader__"))]))));
}
if (removed.generateStaticParams) {
freshAst.program.body.push(t.exportNamedDeclaration(t.functionDeclaration(t.identifier("generateStaticParams"), [], t.blockStatement([]))));
}
const out = generate(freshAst, {
retainLines: true
});
const finalAst = parse(out.code, {
sourceType: "module",
plugins: ["typescript", "jsx"]
});
path.node.body = finalAst.program.body;
path.node.directives = finalAst.program.directives;
if (process.env.DEBUG) {
console.info(` \u{1F9F9} [one/metro] ${filename} removed ${removedFunctions.length} server-only exports`);
}
} catch (error) {
console.warn(`[one/metro] Tree shaking failed for ${filename}:`, error instanceof Error ? error.message : String(error));
}
}
}
}
};
}
var remove_server_code_default = removeServerCodePlugin;
export { remove_server_code_default as default };
//# sourceMappingURL=remove-server-code.mjs.map