UNPKG

one

Version:

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

1,282 lines (1,278 loc) 58.8 kB
import { createRequire } from "module"; import { cpus } from "os"; import Path, { join, relative, resolve } from "path"; import { resolvePath } from "@vxrn/resolve"; import FSExtra from "fs-extra"; import MicroMatch from "micromatch"; import { mergeConfig, build as viteBuild } from "vite"; import { fillOptions, getOptimizeDeps, rollupRemoveUnusedImportsPlugin, build as vxrnBuild } from "vxrn"; import * as constants from "../constants.native.js"; import { setServerGlobals } from "../server/setServerGlobals.native.js"; import { getPathnameFromFilePath } from "../utils/getPathnameFromFilePath.native.js"; import { getRouterRootFromOneOptions } from "../utils/getRouterRootFromOneOptions.native.js"; import { isRolldown } from "../utils/isRolldown.native.js"; import { toAbsolute } from "../utils/toAbsolute.native.js"; import { buildVercelOutputDirectory } from "../vercel/build/buildVercelOutputDirectory.native.js"; import { getManifest } from "../vite/getManifest.native.js"; import { loadUserOneOptions } from "../vite/loadConfig.native.js"; import { runWithAsyncLocalContext } from "../vite/one-server-only.native.js"; import { buildPage, printBuildTimings } from "./buildPage.native.js"; import { checkNodeVersion } from "./checkNodeVersion.native.js"; import { getWorkerPool, terminateWorkerPool } from "./workerPool.native.js"; import { generateSitemap } from "./generateSitemap.native.js"; import { labelProcess } from "./label-process.native.js"; import { pLimit } from "../utils/pLimit.native.js"; import { getCriticalCSSOutputPaths } from "../vite/plugins/criticalCSSPlugin.native.js"; function _type_of(obj) { "@swc/helpers - typeof"; return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj; } var { ensureDir, writeJSON } = FSExtra; function normalizeDeploy(deploy) { if (!deploy) return void 0; if (typeof deploy === "string") return { target: deploy }; return deploy; } var GENERATED_CLOUDFLARE_WRANGLER_RULES = [{ type: "ESModule", globs: ["./server/**/*.js"], fallthrough: true }, { type: "ESModule", globs: ["./api/**/*.js"], fallthrough: true }, { type: "ESModule", globs: ["./middlewares/**/*.js"], fallthrough: true }, { type: "ESModule", globs: ["./assets/**/*.js"], fallthrough: true }]; function isPlainObject(value) { return !!value && (typeof value === "undefined" ? "undefined" : _type_of(value)) === "object" && !Array.isArray(value); } function mergeJsonObjects(base, overrides) { var merged = { ...base }; var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0; try { for (var _iterator = Object.entries(overrides)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var [key, value] = _step.value; var baseValue = merged[key]; if (isPlainObject(baseValue) && isPlainObject(value)) { merged[key] = mergeJsonObjects(baseValue, value); } else { merged[key] = value; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return merged; } function dedupeJsonValues(values) { var seen = /* @__PURE__ */new Set(); return values.filter(function (value) { var key = JSON.stringify(value); if (seen.has(key)) return false; seen.add(key); return true; }); } function mergeCloudflareCompatibilityFlags(flags) { var userFlags = Array.isArray(flags) ? flags.filter(function (flag) { return typeof flag === "string"; }) : []; return dedupeJsonValues(["nodejs_compat", ...userFlags]); } function mergeCloudflareRules(rules) { var userRules = Array.isArray(rules) ? rules.filter(function (rule) { return isPlainObject(rule); }) : []; return dedupeJsonValues([...GENERATED_CLOUDFLARE_WRANGLER_RULES, ...userRules]); } function parseJsonc(text) { var out = ""; var i = 0; var inString = false; var quote = ""; while (i < text.length) { var ch = text[i]; var next = text[i + 1]; if (inString) { if (ch === "\\") { out += ch + (next !== null && next !== void 0 ? next : ""); i += 2; continue; } if (ch === quote) inString = false; out += ch; i++; continue; } if (ch === '"' || ch === "'") { inString = true; quote = ch; out += ch; i++; continue; } if (ch === "/" && next === "/") { while (i < text.length && text[i] !== "\n") i++; continue; } if (ch === "/" && next === "*") { i += 2; while (i < text.length - 1 && !(text[i] === "*" && text[i + 1] === "/")) i++; i += 2; continue; } out += ch; i++; } return JSON.parse(out.replace(/,(\s*[}\]])/g, "$1")); } async function loadUserWranglerConfig(root) { var candidateRoots = [... /* @__PURE__ */new Set([root, process.cwd()])]; var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0; try { for (var _iterator = candidateRoots[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var candidateRoot = _step.value; for (var _i = 0, _iter = ["wrangler.jsonc", "wrangler.json"]; _i < _iter.length; _i++) { var fileName = _iter[_i]; var configPath = join(candidateRoot, fileName); if (!(await FSExtra.pathExists(configPath))) { continue; } var contents = await FSExtra.readFile(configPath, "utf-8"); var parsed = void 0; try { parsed = parseJsonc(contents); } catch (err) { throw new Error(`Failed to parse ${relative(process.cwd(), configPath)}: ${err.message}`); } if (!isPlainObject(parsed)) { throw new Error(`Expected ${relative(process.cwd(), configPath)} to contain a top-level JSON object`); } return { path: configPath, config: parsed }; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return null; } function createCloudflareWranglerConfig(projectName, userConfig) { var generatedConfig = { name: projectName, main: "worker.js", compatibility_date: "2024-12-05", compatibility_flags: ["nodejs_compat"], find_additional_modules: true, rules: GENERATED_CLOUDFLARE_WRANGLER_RULES, assets: { directory: "client", binding: "ASSETS", run_worker_first: true } }; var mergedConfig = userConfig ? mergeJsonObjects(generatedConfig, userConfig) : generatedConfig; mergedConfig.main = "worker.js"; mergedConfig.find_additional_modules = true; mergedConfig.compatibility_flags = mergeCloudflareCompatibilityFlags(mergedConfig.compatibility_flags); mergedConfig.rules = mergeCloudflareRules(mergedConfig.rules); mergedConfig.assets = { ...(isPlainObject(mergedConfig.assets) ? mergedConfig.assets : {}), directory: "client", binding: "ASSETS", run_worker_first: true }; return mergedConfig; } async function getCloudflareProjectName(root) { try { var pkg = JSON.parse(await FSExtra.readFile(join(root, "package.json"), "utf-8")); if (pkg.name) { return pkg.name.replace(/^@[^/]+\//, ""); } } catch (unused) {} return "one-app"; } process.env.ONE_CACHE_KEY = constants.CACHE_KEY; var BUILD_CONCURRENCY = process.env.ONE_BUILD_CONCURRENCY ? Math.max(1, parseInt(process.env.ONE_BUILD_CONCURRENCY, 10)) : Math.max(1, Math.min(cpus().length, 8)); function shouldUseWorkers(oneOptions) { var _oneOptions_build; if (process.env.ONE_BUILD_WORKERS === "0") return false; if (process.env.ONE_BUILD_WORKERS === "1") return true; return (oneOptions === null || oneOptions === void 0 ? void 0 : (_oneOptions_build = oneOptions.build) === null || _oneOptions_build === void 0 ? void 0 : _oneOptions_build.workers) !== false; } process.on("uncaughtException", function (err) { console.error((err === null || err === void 0 ? void 0 : err.message) || err); }); var HOOK_KEYS = ["resolveId", "load", "transform", "renderChunk", "generateBundle", "writeBundle", "buildStart", "buildEnd", "moduleParsed"]; function clonePluginHooks(config) { if (!config.plugins) return config; return { ...config, plugins: config.plugins.map(function (p) { if (!p || (typeof p === "undefined" ? "undefined" : _type_of(p)) !== "object") return p; var cloned = { ...p }; var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0; try { for (var _iterator = HOOK_KEYS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var key = _step.value; if (cloned[key] && _type_of(cloned[key]) === "object" && "handler" in cloned[key]) { cloned[key] = { ...cloned[key] }; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return cloned; }) }; } async function build(args) { var _ref, _ref1, _args_skipEnv, _securityScanOption_level; var _oneOptions_web, _oneOptions_web1, _viteLoadedConfig_config_build, _viteLoadedConfig_config, _oneOptions_router, _oneOptions_build, _oneOptions_build_server, _oneOptions_build1, _oneOptions_build2, _oneOptions_web2, _oneOptions_build3; process.env.IS_VXRN_CLI = "true"; if (!process.env.NODE_ENV) { process.env.NODE_ENV = "production"; } else if (process.env.NODE_ENV !== "production") { console.warn(` \u26A0\uFE0F Warning: NODE_ENV is set to "${process.env.NODE_ENV}" (builds default to "production") `); } labelProcess("build"); checkNodeVersion(); setServerGlobals(); var { oneOptions, config: viteLoadedConfig } = await loadUserOneOptions("build"); var routerRoot = getRouterRootFromOneOptions(oneOptions); if ((_oneOptions_web = oneOptions.web) === null || _oneOptions_web === void 0 ? void 0 : _oneOptions_web.defaultRenderMode) { process.env.ONE_DEFAULT_RENDER_MODE = oneOptions.web.defaultRenderMode; } var deployConfig = normalizeDeploy((_oneOptions_web1 = oneOptions.web) === null || _oneOptions_web1 === void 0 ? void 0 : _oneOptions_web1.deploy); if (!process.env.ONE_SERVER_URL && deployConfig) { var _deployConfig_url; var url = (_deployConfig_url = deployConfig.url) !== null && _deployConfig_url !== void 0 ? _deployConfig_url : deployConfig.target === "cloudflare" ? `https://${await getCloudflareProjectName(process.cwd())}.workers.dev` : void 0; if (url) { process.env.ONE_SERVER_URL = url; console.info(` \u2601\uFE0F ONE_SERVER_URL: ${url} `); } } var outDir = (_ref = viteLoadedConfig === null || viteLoadedConfig === void 0 ? void 0 : (_viteLoadedConfig_config = viteLoadedConfig.config) === null || _viteLoadedConfig_config === void 0 ? void 0 : (_viteLoadedConfig_config_build = _viteLoadedConfig_config.build) === null || _viteLoadedConfig_config_build === void 0 ? void 0 : _viteLoadedConfig_config_build.outDir) !== null && _ref !== void 0 ? _ref : "dist"; var manifest = getManifest({ routerRoot, ignoredRouteFiles: (_oneOptions_router = oneOptions.router) === null || _oneOptions_router === void 0 ? void 0 : _oneOptions_router.ignoredRouteFiles }); var serverOutputFormat = ((_oneOptions_build = oneOptions.build) === null || _oneOptions_build === void 0 ? void 0 : _oneOptions_build.server) === false ? "esm" : (_ref1 = (_oneOptions_build1 = oneOptions.build) === null || _oneOptions_build1 === void 0 ? void 0 : (_oneOptions_build_server = _oneOptions_build1.server) === null || _oneOptions_build_server === void 0 ? void 0 : _oneOptions_build_server.outputFormat) !== null && _ref1 !== void 0 ? _ref1 : "esm"; var buildStartTime = performance.now(); var vxrnOutput = await vxrnBuild({ skipEnv: (_args_skipEnv = args.skipEnv) !== null && _args_skipEnv !== void 0 ? _args_skipEnv : oneOptions.skipEnv, server: oneOptions.server, build: { analyze: true, server: ((_oneOptions_build2 = oneOptions.build) === null || _oneOptions_build2 === void 0 ? void 0 : _oneOptions_build2.server) === false ? false : { outputFormat: serverOutputFormat } } }, args); var bundleTime = performance.now() - buildStartTime; console.info(` \u23F1\uFE0F vite bundle: ${(bundleTime / 1e3).toFixed(2)}s `); if (!vxrnOutput || args.platform !== "web") { return; } var options = await fillOptions(vxrnOutput.options, { mode: "prod" }); var { optimizeDeps } = getOptimizeDeps("build"); var { rolldownOptions: _rolldownOptions, ...optimizeDepsNoRolldown } = optimizeDeps; var clonedWebBuildConfig = clonePluginHooks(vxrnOutput.webBuildConfig); var apiBuildConfig = mergeConfig( // feels like this should build off the *server* build config not web clonedWebBuildConfig, { configFile: false, appType: "custom", optimizeDeps: optimizeDepsNoRolldown, environments: { client: { optimizeDeps: { rolldownOptions: _rolldownOptions } } } }); async function buildCustomRoutes(subFolder, routes) { var _ref2; var _oneOptions_build_api, _oneOptions_build4, _oneOptions_build_api1, _oneOptions_build12, _oneOptions_build_api2, _oneOptions_build22; var input = routes.reduce(function (entries, param) { var { page, file: file2 } = param; entries[page.slice(1) + ".js"] = join(routerRoot, file2); return entries; }, {}); var outputFormat = (_ref2 = oneOptions === null || oneOptions === void 0 ? void 0 : (_oneOptions_build4 = oneOptions.build) === null || _oneOptions_build4 === void 0 ? void 0 : (_oneOptions_build_api = _oneOptions_build4.api) === null || _oneOptions_build_api === void 0 ? void 0 : _oneOptions_build_api.outputFormat) !== null && _ref2 !== void 0 ? _ref2 : serverOutputFormat; var treeshake = oneOptions === null || oneOptions === void 0 ? void 0 : (_oneOptions_build12 = oneOptions.build) === null || _oneOptions_build12 === void 0 ? void 0 : (_oneOptions_build_api1 = _oneOptions_build12.api) === null || _oneOptions_build_api1 === void 0 ? void 0 : _oneOptions_build_api1.treeshake; var mergedConfig = mergeConfig(apiBuildConfig, { appType: "custom", configFile: false, // plugins: [ // nodeExternals({ // exclude: optimizeDeps.include, // }) as any, // ], define: vxrnOutput.processEnvDefines, ssr: { noExternal: true, external: ["react", "react-dom"], optimizeDeps: optimizeDepsNoRolldown }, environments: { ssr: { optimizeDeps: { rolldownOptions: _rolldownOptions } } }, build: { ssr: true, emptyOutDir: false, outDir: `${outDir}/${subFolder}`, copyPublicDir: false, minify: false, rolldownOptions: { treeshake: treeshake !== null && treeshake !== void 0 ? treeshake : { moduleSideEffects: false }, plugins: [ // otherwise rollup is leaving commonjs-only top level imports... outputFormat === "esm" ? rollupRemoveUnusedImportsPlugin : null].filter(Boolean), // too many issues // treeshake: { // moduleSideEffects: false, // }, // prevents it from shaking out the exports preserveEntrySignatures: "strict", input, external: [], output: { entryFileNames: "[name]", exports: "auto", ...(outputFormat === "esm" ? { format: "esm", esModule: true } : { format: "cjs", // Preserve folder structure and use .cjs extension entryFileNames: function (chunkInfo) { var name = chunkInfo.name.replace(/\.js$/, ".cjs"); return name; }, chunkFileNames: function (chunkInfo) { var dir = Path.dirname(chunkInfo.name); var name = Path.basename(chunkInfo.name, Path.extname(chunkInfo.name)); return Path.join(dir, `${name}-[hash].cjs`); }, assetFileNames: function (assetInfo) { var _assetInfo_name; var name = (_assetInfo_name = assetInfo.name) !== null && _assetInfo_name !== void 0 ? _assetInfo_name : ""; var dir = Path.dirname(name); var baseName = Path.basename(name, Path.extname(name)); var ext = Path.extname(name); return Path.join(dir, `${baseName}-[hash]${ext}`); } }) } } } }); var userApiBuildConf = (_oneOptions_build22 = oneOptions.build) === null || _oneOptions_build22 === void 0 ? void 0 : (_oneOptions_build_api2 = _oneOptions_build22.api) === null || _oneOptions_build_api2 === void 0 ? void 0 : _oneOptions_build_api2.config; var finalApiBuildConf = userApiBuildConf ? mergeConfig(mergedConfig, userApiBuildConf) : mergedConfig; var output3 = await viteBuild( // allow user merging api build config finalApiBuildConf); return output3; } var builtMiddlewares = {}; var apiPromise = manifest.apiRoutes.length ? (console.info(` \u{1F528} build api routes `), buildCustomRoutes("api", manifest.apiRoutes)) : Promise.resolve(null); var middlewarePromise = manifest.middlewareRoutes.length ? (console.info(` \u{1F528} build middlewares `), buildCustomRoutes("middlewares", manifest.middlewareRoutes)) : Promise.resolve(null); var [apiOutput, middlewareBuildInfo] = await Promise.all([apiPromise, middlewarePromise]); if (middlewareBuildInfo) { var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0; try { var _loop = function () { var middleware = _step.value; var absoluteRoot = resolve(process.cwd(), options.root); var fullPath = join(absoluteRoot, routerRoot, middleware.file); var outChunks = middlewareBuildInfo.output.filter(function (x) { return x.type === "chunk"; }); var chunk2 = outChunks.find(function (x) { return x.facadeModuleId === fullPath; }); if (!chunk2) throw new Error(`internal err finding middleware`); builtMiddlewares[middleware.file] = join(outDir, "middlewares", chunk2.fileName); }; for (var _iterator = manifest.middlewareRoutes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) _loop(); } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } globalThis["require"] = createRequire(join(import.meta.url, "..")); var assets = []; var builtRoutes = []; var sitemapData = []; var collectImportsCache = /* @__PURE__ */new Map(); var cssFileContentsCache = /* @__PURE__ */new Map(); var criticalCSSOutputPaths = getCriticalCSSOutputPaths(vxrnOutput.clientManifest); var limit = pLimit(BUILD_CONCURRENCY); var useWorkers = shouldUseWorkers(oneOptions); var workerPool = useWorkers ? getWorkerPool(BUILD_CONCURRENCY) : null; if (workerPool) { var serializableOptions = JSON.parse(JSON.stringify(oneOptions, function (_key, value) { return typeof value === "function" ? void 0 : value; })); await workerPool.initialize(serializableOptions); } var staticStartTime = performance.now(); var modeLabel = useWorkers ? `workers: ${workerPool === null || workerPool === void 0 ? void 0 : workerPool.size}` : `concurrency: ${BUILD_CONCURRENCY}`; console.info(` \u{1F528} build static routes (${modeLabel}) `); var staticDir = join(`${outDir}/static`); var clientDir = join(`${outDir}/client`); await ensureDir(staticDir); if (!vxrnOutput.serverOutput) { throw new Error(`No server output`); } var clientChunksBySource = /* @__PURE__ */new Map(); if (vxrnOutput.clientOutput) { var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0; try { for (var _iterator1 = vxrnOutput.clientOutput[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) { var chunk = _step1.value; if (chunk.type === "chunk" && chunk.facadeModuleId) { clientChunksBySource.set(chunk.facadeModuleId, { fileName: chunk.fileName, imports: chunk.imports || [] }); } } } catch (err) { _didIteratorError1 = true; _iteratorError1 = err; } finally { try { if (!_iteratorNormalCompletion1 && _iterator1.return != null) { _iterator1.return(); } } finally { if (_didIteratorError1) { throw _iteratorError1; } } } } var outputEntries = [...vxrnOutput.serverOutput.entries()]; var layoutServerPaths = /* @__PURE__ */new Map(); var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0; try { for (var _iterator2 = outputEntries[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var [, output] = _step2.value; if (output.type === "asset") continue; var id = output.facadeModuleId || ""; var file = Path.basename(id); if (file.startsWith("_layout") && id.includes(`/${routerRoot}/`)) { var relativePath = relative(process.cwd(), id).replace(`${routerRoot}/`, ""); var contextKey = `./${relativePath}`; layoutServerPaths.set(contextKey, output.fileName); } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return != null) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } var routeByPath = /* @__PURE__ */new Map(); var _iteratorNormalCompletion3 = true, _didIteratorError3 = false, _iteratorError3 = void 0; try { for (var _iterator3 = manifest.pageRoutes[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var route = _step3.value; if (route.file) { var routePath = `${routerRoot}${route.file.slice(1)}`; routeByPath.set(routePath, route); } } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return != null) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } var _iteratorNormalCompletion4 = true, _didIteratorError4 = false, _iteratorError4 = void 0; try { for (var _iterator4 = outputEntries[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { var [, output1] = _step4.value; if (output1.type === "asset") { assets.push(output1); } } } catch (err) { _didIteratorError4 = true; _iteratorError4 = err; } finally { try { if (!_iteratorNormalCompletion4 && _iterator4.return != null) { _iterator4.return(); } } finally { if (_didIteratorError4) { throw _iteratorError4; } } } var moduleIdToServerChunk = /* @__PURE__ */new Map(); var _iteratorNormalCompletion5 = true, _didIteratorError5 = false, _iteratorError5 = void 0; try { for (var _iterator5 = outputEntries[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { var [, output2] = _step5.value; if (output2.type === "asset") continue; var moduleIds = output2.moduleIds || (output2.facadeModuleId ? [output2.facadeModuleId] : []); var _iteratorNormalCompletion6 = true, _didIteratorError6 = false, _iteratorError6 = void 0; try { for (var _iterator6 = moduleIds[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { var moduleId = _step6.value; moduleIdToServerChunk.set(moduleId, output2.fileName); } } catch (err) { _didIteratorError6 = true; _iteratorError6 = err; } finally { try { if (!_iteratorNormalCompletion6 && _iterator6.return != null) { _iterator6.return(); } } finally { if (_didIteratorError6) { throw _iteratorError6; } } } } } catch (err) { _didIteratorError5 = true; _iteratorError5 = err; } finally { try { if (!_iteratorNormalCompletion5 && _iterator5.return != null) { _iterator5.return(); } } finally { if (_didIteratorError5) { throw _iteratorError5; } } } var _iteratorNormalCompletion7 = true, _didIteratorError7 = false, _iteratorError7 = void 0; try { var _loop1 = async function () { var foundRoute = _step7.value; var _ref2, _ref12; var _vxrnOutput_buildArgs, _foundRoute_layouts, _oneOptions_web3, _oneOptions_web12, _exported_generateStaticParams; if (!foundRoute.file) { return "continue"; } var routeModulePath = join(resolve(process.cwd(), options.root), routerRoot, foundRoute.file.slice(2)); var serverFileName = moduleIdToServerChunk.get(routeModulePath); if (!serverFileName) { if (foundRoute.type === "spa") { return "continue"; } console.warn(`[one] No server chunk found for route: ${foundRoute.file}`); return "continue"; } var onlyBuild = (_vxrnOutput_buildArgs = vxrnOutput.buildArgs) === null || _vxrnOutput_buildArgs === void 0 ? void 0 : _vxrnOutput_buildArgs.only; if (onlyBuild) { var relativeId = foundRoute.file.slice(1); if (!MicroMatch.contains(relativeId, onlyBuild)) { return "continue"; } } var clientChunk = clientChunksBySource.get(routeModulePath); var manifestKey = `${routerRoot}${foundRoute.file.slice(1)}`; var clientManifestEntry = vxrnOutput.clientManifest[manifestKey]; if (!clientChunk && foundRoute.type !== "spa" && foundRoute.type !== "ssg") { console.warn(`No client chunk found for route: ${routeModulePath}`); return "continue"; } foundRoute.loaderServerPath = serverFileName; var relativeId1 = foundRoute.file.replace(/^\.\//, "/"); if (foundRoute.layouts) { var _iteratorNormalCompletion13 = true, _didIteratorError13 = false, _iteratorError13 = void 0; try { for (var _iterator13 = foundRoute.layouts[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) { var layout = _step13.value; var serverPath = layoutServerPaths.get(layout.contextKey); if (serverPath) { layout.loaderServerPath = serverPath; } } } catch (err) { _didIteratorError13 = true; _iteratorError13 = err; } finally { try { if (!_iteratorNormalCompletion13 && _iterator13.return != null) { _iterator13.return(); } } finally { if (_didIteratorError13) { throw _iteratorError13; } } } } function collectImports(entry2) { var { type = "js" } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; var { imports = [], css } = entry2; var cacheKey = `${entry2.file || imports.join(",")}:${type}`; var cached = collectImportsCache.get(cacheKey); if (cached) return cached; var result = [...new Set([...(type === "js" ? imports : css || []), ...imports.flatMap(function (name) { var found = vxrnOutput.clientManifest[name]; if (!found) { console.warn(`No found imports`, name, vxrnOutput.clientManifest); } return collectImports(found, { type }); })].flat().filter(function (x) { return x && (type === "css" || x.endsWith(".js")); }).map(function (x) { return type === "css" ? x : x.startsWith("assets/") ? x : `assets/${x.slice(1)}`; }))]; collectImportsCache.set(cacheKey, result); return result; } var entryImports = collectImports(clientManifestEntry || {}); var layoutEntries = (_ref2 = (_foundRoute_layouts = foundRoute.layouts) === null || _foundRoute_layouts === void 0 ? void 0 : _foundRoute_layouts.flatMap(function (layout2) { var clientKey2 = `${routerRoot}${layout2.contextKey.slice(1)}`; var found = vxrnOutput.clientManifest[clientKey2]; return found ? found : []; })) !== null && _ref2 !== void 0 ? _ref2 : []; var layoutImports = layoutEntries.flatMap(function (entry2) { return [entry2.file, ...collectImports(entry2)]; }); var routePreloads = {}; var rootLayoutKey = `${routerRoot}/_layout.tsx`; var rootLayoutEntry = vxrnOutput.clientManifest[rootLayoutKey]; if (rootLayoutEntry) { routePreloads[`/${rootLayoutKey}`] = `/${rootLayoutEntry.file}`; } if (foundRoute.layouts) { var _iteratorNormalCompletion14 = true, _didIteratorError14 = false, _iteratorError14 = void 0; try { for (var _iterator14 = foundRoute.layouts[Symbol.iterator](), _step14; !(_iteratorNormalCompletion14 = (_step14 = _iterator14.next()).done); _iteratorNormalCompletion14 = true) { var layout1 = _step14.value; var clientKey = `${routerRoot}${layout1.contextKey.slice(1)}`; var entry = vxrnOutput.clientManifest[clientKey]; if (entry) { routePreloads[`/${clientKey}`] = `/${entry.file}`; } } } catch (err) { _didIteratorError14 = true; _iteratorError14 = err; } finally { try { if (!_iteratorNormalCompletion14 && _iterator14.return != null) { _iterator14.return(); } } finally { if (_didIteratorError14) { throw _iteratorError14; } } } } if (clientChunk) { var routeKey = `/${routerRoot}${foundRoute.file.slice(1)}`; routePreloads[routeKey] = `/${clientChunk.fileName}`; } else if (clientManifestEntry) { var routeKey1 = `/${routerRoot}${foundRoute.file.slice(1)}`; routePreloads[routeKey1] = `/${clientManifestEntry.file}`; } var preloadSetupFilePreloads = function () { if (!oneOptions.setupFile) return []; var clientSetupFile = typeof oneOptions.setupFile === "string" ? oneOptions.setupFile : oneOptions.setupFile.client; if (!clientSetupFile) return []; var needle = clientSetupFile.replace(/^\.\//, ""); for (var file2 in vxrnOutput.clientManifest) { if (file2 === needle) { var entry2 = vxrnOutput.clientManifest[file2]; return [entry2.file]; } } return []; }(); var allPreloads = [... /* @__PURE__ */new Set([...preloadSetupFilePreloads, // add the route entry js (like ./app/index.ts) - prefer direct chunk lookup ...(clientChunk ? [clientChunk.fileName] : clientManifestEntry ? [clientManifestEntry.file] : []), // add the virtual entry vxrnOutput.clientManifest["virtual:one-entry"].file, ...entryImports, ...layoutImports])].map(function (path2) { return `/${path2}`; }); var scriptLoadingMode = (_oneOptions_web3 = oneOptions.web) === null || _oneOptions_web3 === void 0 ? void 0 : _oneOptions_web3.experimental_scriptLoading; var useDeferredLoading = scriptLoadingMode === "defer-non-critical"; var useAggressiveLCP = scriptLoadingMode === "after-lcp-aggressive"; var needsSeparatedPreloads = useDeferredLoading || useAggressiveLCP; var criticalPreloads = needsSeparatedPreloads ? [... /* @__PURE__ */new Set([...preloadSetupFilePreloads, // add the virtual entry (framework bootstrap) vxrnOutput.clientManifest["virtual:one-entry"].file, // add the route entry js (like ./app/index.ts) - prefer direct chunk lookup ...(clientChunk ? [clientChunk.fileName] : clientManifestEntry ? [clientManifestEntry.file] : []), // add layout files (but not their deep imports) ...layoutEntries.map(function (entry2) { return entry2.file; })])].map(function (path2) { return `/${path2}`; }) : void 0; var deferredPreloads = needsSeparatedPreloads ? [... /* @__PURE__ */new Set([...entryImports, ...layoutEntries.flatMap(function (entry2) { return collectImports(entry2); })])].filter(function (path2) { return !criticalPreloads.includes(`/${path2}`); }).map(function (path2) { return `/${path2}`; }) : void 0; var preloads2 = needsSeparatedPreloads ? [...criticalPreloads, ...deferredPreloads] : allPreloads; var allEntries = [clientManifestEntry, ...layoutEntries].filter(Boolean); var layoutCSS = [...new Set(layoutEntries.flatMap(function (entry2) { return collectImports(entry2, { type: "css" }); }).map(function (path2) { return `/${path2}`; }))]; var allCSS = [... /* @__PURE__ */new Set([...layoutCSS, // css from page entry ...(clientManifestEntry ? collectImports(clientManifestEntry, { type: "css" }).map(function (path2) { return `/${path2}`; }) : []), // root-level css (handles cssCodeSplit: false) ...Object.entries(vxrnOutput.clientManifest).filter(function (param) { var [key] = param; return key.endsWith(".css"); }).map(function (param) { var [, entry2] = param; return `/${entry2.file}`; })])]; var hasCriticalCSS = allCSS.some(function (p2) { return criticalCSSOutputPaths.has(p2); }); var needsCSSContents = ((_oneOptions_web12 = oneOptions.web) === null || _oneOptions_web12 === void 0 ? void 0 : _oneOptions_web12.inlineLayoutCSS) || hasCriticalCSS; var allCSSContents = void 0; if (needsCSSContents) { allCSSContents = await Promise.all(allCSS.map(async function (cssPath) { var _oneOptions_web4; if (!((_oneOptions_web4 = oneOptions.web) === null || _oneOptions_web4 === void 0 ? void 0 : _oneOptions_web4.inlineLayoutCSS) && !criticalCSSOutputPaths.has(cssPath)) { return ""; } var cached = cssFileContentsCache.get(cssPath); if (cached !== void 0) return cached; var filePath = join(clientDir, cssPath); try { var content = await FSExtra.readFile(filePath, "utf-8"); cssFileContentsCache.set(cssPath, content); return content; } catch (err) { console.warn(`[one] Warning: Could not read CSS file ${filePath}`); cssFileContentsCache.set(cssPath, ""); return ""; } })); } if (process.env.DEBUG) { console.info("[one] building routes", { foundRoute, layoutEntries, allEntries, allCSS }); } var serverJsPath = join(`${outDir}/server`, serverFileName); var exported = void 0; try { exported = await import(toAbsolute(serverJsPath)); } catch (err) { console.error(`Error importing page (original error)`, err); throw new Error(`Error importing page: ${serverJsPath}`, { cause: err }); } foundRoute.hasLoader = typeof exported.loader === "function"; var isDynamic = !!Object.keys(foundRoute.routeKeys).length; if (foundRoute.type === "ssg" && isDynamic && !foundRoute.page.includes("+not-found") && !foundRoute.page.includes("_sitemap") && !exported.generateStaticParams) { throw new Error(`[one] Error: Missing generateStaticParams Route ${foundRoute.page} of type ${foundRoute.type} must export generateStaticParams so build can complete. See docs on generateStaticParams: https://onestack.dev/docs/routing-exports#generatestaticparams `); } var paramsList = (_ref12 = await ((_exported_generateStaticParams = exported.generateStaticParams) === null || _exported_generateStaticParams === void 0 ? void 0 : _exported_generateStaticParams.call(exported))) !== null && _ref12 !== void 0 ? _ref12 : [{}]; console.info(` [build] page ${relativeId1} (with ${paramsList.length} routes) `); if (process.env.DEBUG) { console.info(`paramsList`, JSON.stringify(paramsList, null, 2)); } var routeSitemapExport = exported.sitemap; var isAfterLCPMode = scriptLoadingMode === "after-lcp" || scriptLoadingMode === "after-lcp-aggressive"; var useAfterLCP = foundRoute.type === "ssg" && isAfterLCPMode; var useAfterLCPAggressive = foundRoute.type === "ssg" && scriptLoadingMode === "after-lcp-aggressive"; var shouldCollectSitemap = foundRoute.type !== "api" && foundRoute.type !== "layout" && !foundRoute.isNotFound && !foundRoute.page.includes("+not-found") && !foundRoute.page.includes("_sitemap"); var pageBuilds = paramsList.map(function (params) { var path2 = getPathnameFromFilePath(relativeId1, params, foundRoute.type === "ssg"); if (workerPool) { console.info(` \u21A6 route ${path2}`); return workerPool.buildPage({ serverEntry: vxrnOutput.serverEntry, path: path2, relativeId: relativeId1, params, foundRoute, clientManifestEntry, staticDir, clientDir, builtMiddlewares, serverJsPath, preloads: preloads2, allCSS, layoutCSS, routePreloads, allCSSContents, criticalPreloads, deferredPreloads, useAfterLCP, useAfterLCPAggressive }).then(function (built2) { return { built: built2, path: path2 }; }).catch(function (err) { console.warn(` \u26A0 skipping page ${path2}: ${err.message}`); return null; }); } return limit(async function () { console.info(` \u21A6 route ${path2}`); try { var built2 = await runWithAsyncLocalContext(async function () { return await buildPage(vxrnOutput.serverEntry, path2, relativeId1, params, foundRoute, clientManifestEntry, staticDir, clientDir, builtMiddlewares, serverJsPath, preloads2, allCSS, layoutCSS, routePreloads, allCSSContents, criticalPreloads, deferredPreloads, useAfterLCP, useAfterLCPAggressive); }); return { built: built2, path: path2 }; } catch (err) { console.warn(` \u26A0 skipping page ${path2}: ${err.message}`); return null; } }); }); var results = (await Promise.all(pageBuilds)).filter(Boolean); var _iteratorNormalCompletion22 = true, _didIteratorError22 = false, _iteratorError22 = void 0; try { for (var _iterator22 = results[Symbol.iterator](), _step22; !(_iteratorNormalCompletion22 = (_step22 = _iterator22.next()).done); _iteratorNormalCompletion22 = true) { var { built, path } = _step22.value; builtRoutes.push(built); if (shouldCollectSitemap) { sitemapData.push({ path, routeExport: routeSitemapExport }); } } } catch (err) { _didIteratorError22 = true; _iteratorError22 = err; } finally { try { if (!_iteratorNormalCompletion22 && _iterator22.return != null) { _iterator22.return(); } } finally { if (_didIteratorError22) { throw _iteratorError22; } } } }; for (var _iterator7 = manifest.pageRoutes[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) await _loop1(); } catch (err) { _didIteratorError7 = true; _iteratorError7 = err; } finally { try { if (!_iteratorNormalCompletion7 && _iterator7.return != null) { _iterator7.return(); } } finally { if (_didIteratorError7) { throw _iteratorError7; } } } if (workerPool) { await terminateWorkerPool(); } var staticTime = performance.now() - staticStartTime; console.info(` \u23F1\uFE0F static routes: ${(staticTime / 1e3).toFixed(2)}s (${builtRoutes.length} pages) `); printBuildTimings(); await moveAllFiles(staticDir, clientDir); await FSExtra.rm(staticDir, { force: true, recursive: true }); var routeMap = {}; var routeToBuildInfo = {}; var pathToRoute = {}; var preloads = {}; var cssPreloads = {}; var loaders = {}; var _iteratorNormalCompletion8 = true, _didIteratorError8 = false, _iteratorError8 = void 0; try { for (var _iterator8 = builtRoutes[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { var route1 = _step8.value; if (!route1.cleanPath.includes("*")) { routeMap[route1.cleanPath] = route1.htmlPath; } var { // dont include loaderData it can be huge loaderData: _loaderData, ...rest } = route1; routeToBuildInfo[route1.routeFile] = rest; var _iteratorNormalCompletion9 = true, _didIteratorError9 = false, _iteratorError9 = void 0; try { for (var _iterator9 = getCleanPaths([route1.path, route1.cleanPath])[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { var p = _step9.value; pathToRoute[p] = route1.routeFile; } } catch (err) { _didIteratorError9 = true; _iteratorError9 = err; } finally { try { if (!_iteratorNormalCompletion9 && _iterator9.return != null) { _iterator9.return(); } } finally { if (_didIteratorError9) { throw _iteratorError9; } } } preloads[route1.preloadPath] = true; cssPreloads[route1.cssPreloadPath] = true; loaders[route1.loaderPath] = true; } } catch (err) { _didIteratorError8 = true; _iteratorError8 = err; } finally { try { if (!_iteratorNormalCompletion8 && _iterator8.return != null) { _iterator8.return(); } } finally { if (_didIteratorError8) { throw _iteratorError8; } } } function createBuildManifestRoute(route3) { var { layouts, ...built } = route3; if (layouts === null || layouts === void 0 ? void 0 : layouts.length) { ; built.layouts = layouts.map(function (layout) { return { contextKey: layout.contextKey, loaderServerPath: layout.loaderServerPath }; }); } var buildInfo = builtRoutes.find(function (x) { return x.routeFile === route3.file; }); if (built.middlewares && (buildInfo === null || buildInfo === void 0 ? void 0 : buildInfo.middlewares)) { var _iteratorNormalCompletion13 = true, _didIteratorError13 = false, _iteratorError13 = void 0; try { for (var _iterator13 = built.middlewares.entries()[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) { var [index, mw] = _step13.value; mw.contextKey = buildInfo.middlewares[index]; } } catch (err) { _didIteratorError13 = true; _iteratorError13 = err; } finally { try { if (!_iteratorNormalCompletion13 && _iterator13.return != null) { _iterator13.return(); } } finally { if (_didIteratorError13) { throw _iteratorError13; } } } } if (buildInfo) { built.loaderPath = buildInfo.loaderPath; } return built; } var buildInfoForWriting = { outDir, oneOptions, routeToBuildInfo, pathToRoute, manifest: { pageRoutes: manifest.pageRoutes.map(createBuildManifestRoute), apiRoutes: manifest.apiRoutes.map(createBuildManifestRoute), allRoutes: manifest.allRoutes.map(createBuildManifestRoute) }, routeMap, constants: JSON.parse(JSON.stringify({ ...constants })), preloads, cssPreloads, loaders, useRolldown: await isRolldown() }; await writeJSON(toAbsolute(`${outDir}/buildInfo.json`), buildInfoForWriting); await FSExtra.writeFile(join(clientDir, "version.json"), JSON.stringify({ version: constants.CACHE_KEY })); console.info(` \u{1F6E1} skew protection: emitted version.json `); var sitemapConfig = (_oneOptions_web2 = oneOptions.web) === null || _oneOptions_web2 === void 0 ? void 0 : _oneOptions_web2.sitemap; if (sitemapConfig) { var sitemapOptions = typeof sitemapConfig === "boolean" ? {} : sitemapConfig; var sitemapXml = generateSitemap(sitemapData, sitemapOptions); var sitemapPath = join(clientDir, "sitemap.xml"); await FSExtra.writeFile(sitemapPath, sitemapXml); console.info(` \u{1F4C4} generated sitemap.xml (${sitemapData.length} URLs) `); } var postBuildLogs = []; var platform = deployConfig === null || deployConfig === void 0 ? void 0 : deployConfig.target; if (platform) { postBuildLogs.push(`[one.build] platform ${platform}`); } switch (platform) { case "vercel": { var vercelJsonPath = join(options.root, "vercel.json"); if (FSExtra.existsSync(vercelJsonPath)) { try { var vercelConfig = JSON.parse(FSExtra.readFileSync(vercelJsonPath, "utf-8")); if (!vercelConfig.cleanUrls) { console.warn(` \u26A0\uFE0F Warning: Your vercel.json is missing "cleanUrls": true`); console.warn(` Without this, direct navigation to SSG pages will 404.`); console.warn(` Add "cleanUrls": true to your vercel.json to fix this. `); } } catch (unused) {} } await buildVercelOutputDirectory({ apiOutput, buildInfoForWriting, clientDir, oneOptionsRoot: options.root, postBuildLogs }); break; } case "cloudflare": { var pageRouteMap = []; var apiRouteMap = []; var middlewareRouteMap = []; var _iteratorNormalCompletion10 = true, _didIteratorError10 = false, _iteratorError10 = void 0; try { for (var _iterator10 = Object.entries(buildInfoForWriting.routeToBuildInfo)[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) { var [routeFile, info] = _step10.value; if (info.serverJsPath) { var importPath = "./" + info.serverJsPath.replace(new RegExp(`^${outDir}/`), ""); pageRouteMap.push(` '${routeFile}': () => import('${importPath}')`); } } } catch (err) { _didIteratorError10 = true; _iteratorError10 = err; } finally { try { if (!_iteratorNormalCompletion10 && _iterator10.return != null) { _iterator10.return(); } } finally { if (_didIteratorError10) { throw _iteratorError10; } } } var _iteratorNormalCompletion11 = true, _didIteratorError11 = false, _iteratorError11 = void 0; try { for (var _iterator11 = buildInfoForWriting.manifest.apiRoutes[Symbol.iterator]