UNPKG

one

Version:

One is a new React Framework that makes Vite serve both native and web.

143 lines (141 loc) 6.3 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf, __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: !0 }); }, __copyProps = (to, from, except, desc) => { if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: !0 }) : target, mod )), __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: !0 }), mod); var clientTreeShakePlugin_exports = {}; __export(clientTreeShakePlugin_exports, { clientTreeShakePlugin: () => clientTreeShakePlugin, transformTreeShakeClient: () => transformTreeShakeClient }); module.exports = __toCommonJS(clientTreeShakePlugin_exports); var import_node_path = require("node:path"), import_generator = __toESM(require("@babel/generator"), 1), import_parser = require("@babel/parser"), import_traverse = __toESM(require("@babel/traverse"), 1), import_babel_dead_code_elimination = require("babel-dead-code-elimination"), import_constants = require("../constants"); const traverse = import_traverse.default.default || import_traverse.default, generate = import_generator.default.default || import_generator.default; function collectTypeImports(ast) { const typeImports = []; return traverse(ast, { ImportDeclaration(path) { path.node.importKind === "type" && typeImports.push(path.node); } }), typeImports; } function restoreTypeImports(ast, typeImports) { if (typeImports.length === 0) return; const existingSources = /* @__PURE__ */ new Set(); traverse(ast, { ImportDeclaration(path) { path.node.importKind === "type" && existingSources.add(path.node.source.value); } }); for (const typeImport of typeImports) existingSources.has(typeImport.source.value) || ast.program.body.unshift(typeImport); } const clientTreeShakePlugin = () => ({ name: "one-client-tree-shake", enforce: "pre", applyToEnvironment(env) { return env.name === "client" || env.name === "ios" || env.name === "android"; }, transform: { order: "pre", async handler(code, id, settings) { return this.environment.name === "ssr" || !/\.(js|jsx|ts|tsx)/.test((0, import_node_path.extname)(id)) || /node_modules/.test(id) ? void 0 : await transformTreeShakeClient(code, id); } } }); async function transformTreeShakeClient(code, id) { if (!/generateStaticParams|loader/.test(code)) return; let ast; try { ast = (0, import_parser.parse)(code, { sourceType: "module", plugins: ["typescript", "jsx"] }); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); console.warn( `[one] Skipping tree shaking for ${id} due to syntax error:`, errorMessage ); return; } let referenced; try { referenced = (0, import_babel_dead_code_elimination.findReferencedIdentifiers)(ast); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); console.warn( `[one] Skipping tree shaking for ${id} due to identifier analysis error:`, errorMessage ); return; } const removed = { loader: !1, generateStaticParams: !1 }; try { traverse(ast, { ExportNamedDeclaration(path) { if (path.node.declaration && path.node.declaration.type === "FunctionDeclaration") { if (!path.node.declaration.id) return; const functionName = path.node.declaration.id.name; (functionName === "loader" || functionName === "generateStaticParams") && (path.remove(), removed[functionName] = !0); } else path.node.declaration && path.node.declaration.type === "VariableDeclaration" && path.node.declaration.declarations.forEach((declarator, index) => { if (declarator.id.type === "Identifier" && (declarator.id.name === "loader" || declarator.id.name === "generateStaticParams")) { const declaration = path.get("declaration.declarations." + index); !Array.isArray(declaration) && declaration && (declaration.remove(), removed[declarator.id.name] = !0); } }); } }); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); console.warn( `[one] Skipping tree shaking for ${id} due to traversal error:`, errorMessage ); return; } const removedFunctions = Object.keys(removed).filter((key) => removed[key]); if (removedFunctions.length) try { const typeImports = collectTypeImports(ast); (0, import_babel_dead_code_elimination.deadCodeElimination)(ast, referenced), restoreTypeImports(ast, typeImports); const out = generate(ast), codeOut = out.code + ` ` + removedFunctions.map((key) => key === "loader" ? import_constants.EMPTY_LOADER_STRING : "export function generateStaticParams() {};").join(` `); return console.info( ` \u{1F9F9} [one] ${(0, import_node_path.relative)(process.cwd(), id)} removed ${removedFunctions.length} server-only exports` ), { code: codeOut, map: out.map }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); console.warn( `[one] Skipping tree shaking for ${id} due to code generation error:`, errorMessage ); return; } } //# sourceMappingURL=clientTreeShakePlugin.js.map