@farm.js/core 0.1.0-beta.8 → 0.1.0-beta.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/build/index.ts","../src/nitro/universal-build.ts","../src/route-runtime-manifest.ts","../src/nitro/vercel-route-runtime.ts","../src/build/vite-plugin-compat.ts"],"sourcesContent":["import type { ResolvedFarmConfig } from \"../config\";\nimport { resolveDeployOutputPath } from \"../config\";\nimport type { ViteDevServer } from \"vite\";\nimport path from \"path\";\nimport { logger } from \"../utils\";\nimport { createFarmApp } from \"../app\";\nimport { APIRouteManager } from \"../api/route-manager\";\nimport { getFarmAppDirectories } from \"../layers\";\nimport { buildUniversal } from \"../nitro/universal-build\";\nimport { getFarmDocsRouteTypeEntries } from \"../docs\";\nimport { generateFarmTypeArtifacts } from \"../type-artifacts\";\nimport { PluginManager } from \"../plugin\";\nimport { farmEnvironmentFunctionsPlugin } from \"../environment-vite\";\nimport { mergeFarmViteConfig } from \"../server/vite-config\";\nimport {\n canUseRolldownForRouteDiscovery,\n loadFarmProductionVite,\n type FarmProductionViteRuntime,\n} from \"./production-vite\";\nimport { withProductionNodeEnv } from \"./production-node-env\";\n\ninterface BuildOptions {\n preset?: string;\n root?: string;\n universal?: boolean; // Use universal build pattern (TanStack Start style)\n /** @internal Production Vite preload started by the CLI. */\n productionVite?: FarmProductionViteRuntime | Promise<FarmProductionViteRuntime>;\n}\n\n/**\n * Build Farm.js application for production\n */\nexport async function build(config: ResolvedFarmConfig, options: BuildOptions = {}) {\n return withProductionNodeEnv(() => buildWithProductionNodeEnv(config, options));\n}\n\nasync function buildWithProductionNodeEnv(config: ResolvedFarmConfig, options: BuildOptions) {\n const root = options.root || config.root || process.cwd();\n const preset = options.preset || config.preset || \"node-server\";\n const srcDir = config.srcDir || \"src\";\n const distDir = config.distDir || \".farm\";\n const deployOutputDir = resolveDeployOutputPath(root, config.deploy.outputDir);\n const productionViteResultPromise =\n options.universal === false\n ? undefined\n : Promise.allSettled([Promise.resolve(options.productionVite ?? loadFarmProductionVite())]);\n\n logger.info(`🚜 Building Farm.js application with preset: ${preset}...`);\n\n const pluginManager = new PluginManager({\n config,\n isDev: false,\n isProd: true,\n });\n pluginManager.addPlugins(config.plugins || []);\n let projectModuleServer: ViteDevServer | undefined;\n\n try {\n await pluginManager.runHookParallel(\"init\");\n await pluginManager.setupPlugins();\n await pluginManager.runHookParallel(\"beforeBundle\", {\n root,\n preset,\n universal: options.universal !== false,\n distDir,\n outputDir: deployOutputDir,\n });\n\n // Step 1: Initialize Farm app to get route managers\n logger.info(\"🔍 Discovering routes and API endpoints...\");\n const productionViteResult = productionViteResultPromise\n ? (await productionViteResultPromise)[0]\n : undefined;\n if (productionViteResult?.status === \"rejected\") throw productionViteResult.reason;\n const productionVite = productionViteResult?.value;\n const useProductionViteForDiscovery =\n productionVite && canUseRolldownForRouteDiscovery(config.vite);\n if (productionVite?.builder === \"rolldown\" && !useProductionViteForDiscovery) {\n logger.info(\"🔌 Using Vite Rollup for route discovery with custom Vite configuration\");\n }\n const createViteServer = useProductionViteForDiscovery\n ? productionVite.createServer\n : (await import(\"vite\")).createServer;\n projectModuleServer = await createProjectModuleServer(createViteServer, config, root);\n const farmApp = createFarmApp(config, projectModuleServer);\n await farmApp.initialize();\n\n const routeManager = farmApp.getRouteManager();\n const serverRenderer = farmApp.getServerRenderer();\n\n const typeArtifacts = generateFarmTypeArtifacts({\n root,\n srcDir,\n layers: config.layers,\n extraRoutes: [\n ...(config.openapi?.enabled && config.openapi.route ? [config.openapi.route] : []),\n ...getFarmDocsRouteTypeEntries(config.docs),\n ],\n suppressLintOnLink: config.suppressLintOnLink,\n i18nConfig: config.i18n,\n }).catch(() => {\n // Non-fatal; type generation is for DX only.\n });\n\n // Type artifacts and API discovery scan independent inputs, so keep them\n // off the critical path by running both after app initialization.\n const apiRouteManager = new APIRouteManager(\n getFarmAppDirectories(config),\n projectModuleServer,\n {\n throwOnLoadError: true,\n i18n: farmApp.getI18nRuntime(),\n },\n );\n const [, apiDiscovery] = await Promise.allSettled([\n typeArtifacts,\n apiRouteManager.discoverRoutes(),\n ]);\n if (apiDiscovery.status === \"rejected\") throw apiDiscovery.reason;\n\n // Use universal build pattern if enabled\n if (options.universal !== false) {\n // Default to universal build (new pattern)\n await buildUniversal(config, routeManager, apiRouteManager, serverRenderer, {\n preset,\n root,\n pluginManager,\n productionVite,\n });\n } else {\n const { build: legacyViteBuild } = await import(\"vite\");\n // Legacy build pattern (for backward compatibility)\n // Step 1: Build client bundle with Vite\n logger.info(\"📦 Building client bundle...\");\n await buildClient(legacyViteBuild, config, root, srcDir, path.join(root, distDir, \"client\"));\n\n // Step 2: Build SSR bundle with Vite\n logger.info(\"📦 Building SSR bundle...\");\n await buildSSR(legacyViteBuild, config, root, srcDir, path.join(root, distDir, \"server\"));\n\n // Step 3: Build with Nitro\n logger.info(`🚀 Building server with Nitro (preset: ${preset})...`);\n await buildNitro(\n config,\n routeManager,\n apiRouteManager,\n serverRenderer,\n preset,\n root,\n distDir,\n pluginManager,\n );\n }\n\n await pluginManager.runHookParallel(\"buildEnd\");\n await pluginManager.runHookParallel(\"afterBundle\", {\n root,\n preset,\n universal: options.universal !== false,\n distDir,\n outputDir: deployOutputDir,\n success: true,\n });\n\n logger.success(\"✅ Build completed successfully!\");\n logger.info(`📁 Output directory: ${deployOutputDir}`);\n } catch (error) {\n await pluginManager.runHookParallel(\"onError\", {\n phase: \"build\",\n error,\n meta: {\n root,\n preset,\n },\n });\n await pluginManager.runHookParallel(\"afterBundle\", {\n root,\n preset,\n universal: options.universal !== false,\n distDir,\n outputDir: deployOutputDir,\n success: false,\n });\n logger.error(`❌ Build failed: ${error}`);\n throw error;\n } finally {\n await projectModuleServer?.close();\n }\n}\n\nasync function createProjectModuleServer(\n createViteServer: FarmProductionViteRuntime[\"createServer\"],\n config: ResolvedFarmConfig,\n root: string,\n): Promise<ViteDevServer> {\n const viteConfig = mergeFarmViteConfig(\n {\n root,\n appType: \"custom\",\n mode: \"production\",\n css: {\n postcss: {\n plugins: [],\n },\n },\n plugins: [farmEnvironmentFunctionsPlugin()],\n server: {\n middlewareMode: true,\n hmr: false,\n },\n optimizeDeps: {\n noDiscovery: true,\n },\n logLevel: \"silent\",\n },\n config.vite,\n );\n\n return createViteServer({\n ...viteConfig,\n root,\n configFile: false,\n appType: \"custom\",\n mode: \"production\",\n esbuild: {\n ...(typeof viteConfig.esbuild === \"object\" ? viteConfig.esbuild : {}),\n jsxDev: false,\n },\n server: {\n ...viteConfig.server,\n middlewareMode: true,\n hmr: false,\n },\n optimizeDeps: {\n ...viteConfig.optimizeDeps,\n noDiscovery: true,\n },\n });\n}\n\n/**\n * Build client bundle\n */\nasync function buildClient(\n viteBuild: (typeof import(\"vite\"))[\"build\"],\n config: ResolvedFarmConfig,\n root: string,\n srcDir: string,\n outputDir: string,\n) {\n const { farmI18nClientBridgePlugin, farmPlugin } = await import(\"../vite\");\n const { PluginManager } = await import(\"../plugin\");\n\n const pluginManager = new PluginManager({\n config,\n isDev: false,\n isProd: true,\n });\n pluginManager.addPlugins(config.plugins || []);\n\n await viteBuild({\n root,\n build: {\n outDir: outputDir,\n emptyOutDir: true,\n rollupOptions: {\n input: path.join(root, srcDir, \"app\", \"page.tsx\"),\n },\n },\n plugins: [\n farmI18nClientBridgePlugin(),\n farmPlugin(config, pluginManager),\n farmEnvironmentFunctionsPlugin(),\n ],\n mode: \"production\",\n });\n}\n\n/**\n * Build SSR bundle\n */\nasync function buildSSR(\n viteBuild: (typeof import(\"vite\"))[\"build\"],\n config: ResolvedFarmConfig,\n root: string,\n srcDir: string,\n outputDir: string,\n) {\n const { farmI18nClientBridgePlugin, farmPlugin } = await import(\"../vite\");\n const { PluginManager } = await import(\"../plugin\");\n\n const pluginManager = new PluginManager({\n config,\n isDev: false,\n isProd: true,\n });\n pluginManager.addPlugins(config.plugins || []);\n\n // Use server-entry.ts as the SSR entry point for universal builds\n // For legacy builds, use page.tsx directly\n const ssrEntry = path.join(root, srcDir, \"app\", \"page.tsx\");\n\n await viteBuild({\n root,\n build: {\n ssr: true,\n outDir: outputDir,\n emptyOutDir: true,\n rollupOptions: {\n input: ssrEntry,\n },\n },\n define: {\n __FARM_ENV__: JSON.stringify(config.env || { server: {}, public: {} }),\n __FARM_PUBLIC_ENV__: JSON.stringify(config.env?.public || {}),\n },\n plugins: [\n farmI18nClientBridgePlugin(),\n farmPlugin(config, pluginManager),\n farmEnvironmentFunctionsPlugin(),\n ],\n mode: \"production\",\n });\n}\n\n/**\n * Build with Nitro\n */\nasync function buildNitro(\n config: ResolvedFarmConfig,\n routeManager: any,\n apiRouteManager: APIRouteManager,\n serverRenderer: any,\n preset: string,\n root: string,\n distDir: string,\n pluginManager?: PluginManager,\n) {\n const [{ createNitroConfig }, { createNitro, build: nitroBuild }] = await Promise.all([\n import(\"../nitro\"),\n import(\"nitro\"),\n ]);\n let nitroConfig = await createNitroConfig(\n config,\n routeManager,\n apiRouteManager,\n serverRenderer,\n preset,\n );\n\n if (pluginManager) {\n nitroConfig = await pluginManager.runHookSerial(\"beforeNitroBuild\", nitroConfig);\n }\n\n // Directory structure:\n // .farm/\n // ├── client/ - Client-side build output (Vite)\n // ├── server/ - SSR build output (Vite)\n // ├── .nitro/ - Nitro's build directory (temporary, where it does its work)\n // │ └── server/ - Handlers and source files for Nitro\n // └── .output/ - Final deployable output (this is what gets deployed)\n // ├── server/ - Serverless function bundles\n // ├── public/ - Static assets\n // └── config.json - Vercel routing config\n //\n // IMPORTANT: Nitro is configured to output to .farm/.output (NOT .nitro/.output)\n // This is ensured by explicitly setting output.dir in the Nitro config\n //\n // Build flow:\n // 1. Vite builds client → .farm/client\n // 2. Vite builds SSR → .farm/server\n // 3. Copy client assets → .farm/.output/public\n // 4. Copy SSR bundles → .farm/.nitro/server/farm\n // 5. Nitro builds from .farm/.nitro → outputs to .farm/.output (via output.dir config)\n // 6. Deploy from .farm/.output\n\n // Ensure output directory exists before building\n const outputDir = resolveDeployOutputPath(root, config.deploy.outputDir);\n const serverOutputDir = path.join(outputDir, \"server\");\n const publicOutputDir = path.join(outputDir, \"public\");\n const { mkdir, cp } = await import(\"fs/promises\");\n await mkdir(serverOutputDir, { recursive: true });\n await mkdir(publicOutputDir, { recursive: true });\n\n // Copy client assets to public directory for Nitro to serve\n // This ensures Vercel can serve static files from the public directory\n const clientDir = path.join(root, distDir, \"client\");\n try {\n // Ensure public directory exists\n await mkdir(publicOutputDir, { recursive: true });\n\n // Copy all client assets including manifest\n await cp(clientDir, publicOutputDir, { recursive: true });\n logger.info(\"📦 Copied client assets to public directory\");\n\n // Verify important files are present\n const manifestPath = path.join(publicOutputDir, \"farm-client-manifest.json\");\n const assetsDir = path.join(publicOutputDir, \"assets\");\n const manifestExists = await import(\"fs/promises\").then((fs) =>\n fs\n .access(manifestPath)\n .then(() => true)\n .catch(() => false),\n );\n const assetsExist = await import(\"fs/promises\").then((fs) =>\n fs\n .access(assetsDir)\n .then(() => true)\n .catch(() => false),\n );\n\n if (manifestExists && assetsExist) {\n logger.info(\"✅ Verified client assets are present\");\n } else {\n logger.warn(\"⚠️ Some client assets may be missing\");\n }\n } catch (error) {\n logger.error(`❌ Failed to copy client assets: ${error}`);\n throw error;\n }\n\n // Copy SSR bundles to Nitro server directory so they're included in the build\n // These go into .farm/.nitro/server/farm (build directory)\n // Nitro will then bundle them and output to .farm/.output/server\n const serverDir = path.join(root, distDir, \"server\");\n const nitroServerDir = path.join(root, distDir, \".nitro\", \"server\", \"farm\");\n try {\n await mkdir(nitroServerDir, { recursive: true });\n await cp(serverDir, nitroServerDir, { recursive: true });\n logger.info(\"📦 Copied SSR bundles to Nitro server directory\");\n } catch (error) {\n logger.warn(`Could not copy SSR bundles: ${error}`);\n }\n\n // Create Nitro instance - this handles preset loading and config preparation\n // The createNitro function loads the preset and normalizes the config\n const nitro = await createNitro(nitroConfig);\n\n // Populate the runtime registry before building\n // This ensures route managers are available at runtime\n // Note: The registry will be populated again in the build:before hook\n // but we also populate it here to ensure it's available\n // Registry file is in .farm/.nitro/server (build directory)\n // But will be bundled and available in .farm/.output/server (output directory)\n const registryPath = path.join(root, distDir, \".nitro\", \"server\", \"farm-registry.ts\");\n try {\n const { farmRegistry } = await import(/* @vite-ignore */ registryPath);\n farmRegistry.apiRouteManager = apiRouteManager;\n farmRegistry.routeManager = routeManager;\n farmRegistry.serverRenderer = serverRenderer;\n farmRegistry.env = config.env || { server: {}, public: {} };\n\n // Store route paths for SSR module loading\n const routePaths: Record<string, string> = {};\n for (const [pattern, entry] of routeManager.getRoutes()) {\n const bundledPath = entry.modulePath\n .replace(/.*\\/src\\/app\\//, \"\")\n .replace(/\\.(tsx?|jsx?)$/, \".js\");\n routePaths[pattern] = bundledPath;\n }\n farmRegistry.routePaths = routePaths;\n\n // Load client manifest\n try {\n const clientManifestPath = path.join(root, distDir, \"client\", \"farm-client-manifest.json\");\n const { readFile } = await import(\"fs/promises\");\n const manifestContent = await readFile(clientManifestPath, \"utf-8\");\n farmRegistry.clientManifest = JSON.parse(manifestContent);\n } catch {\n farmRegistry.clientManifest = {};\n }\n } catch (error) {\n logger.warn(`Could not populate registry: ${error}`);\n }\n\n // Build Nitro with the prepared instance\n await nitroBuild(nitro);\n\n if (pluginManager) {\n await pluginManager.runHookParallel(\"afterNitroBuild\", {\n root,\n preset,\n distDir,\n outputDir: resolveDeployOutputPath(root, config.deploy.outputDir),\n });\n }\n}\n","import type { RedirectConfig, ResolvedFarmConfig, RewriteConfig } from \"../config\";\nimport { hasCustomFarmRouteContext, resolveDeployOutputPath } from \"../config\";\nimport type { RouteManager } from \"../routing/route-manager\";\nimport type { APIRouteManager } from \"../api/route-manager\";\nimport type { ServerRenderer } from \"../server/renderer\";\nimport type { FarmPlugin, PluginManager } from \"../plugin\";\nimport {\n generateFarmClientPluginEntryCode,\n type FarmClientPluginEntryCode,\n} from \"../client-plugin-build\";\nimport type { Rollup } from \"vite\";\nimport os from \"os\";\nimport path from \"path\";\nimport { constants as fsConstants, existsSync, readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { builtinModules, createRequire } from \"module\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { logger } from \"../utils\";\nimport { getClientModuleMetadata } from \"../utils/client-component\";\nimport { isFarmMarkdownPageFile } from \"../app-markdown\";\nimport type { ProgrammaticRedirectRoute } from \"../routes\";\nimport type { NitroConfig } from \"nitro/config\";\nimport {\n applyFarmWorkflowVercelCrons,\n prepareFarmWorkflowsForNitro,\n type PreparedFarmWorkflows,\n} from \"../workflows\";\nimport {\n applyFarmCronVercelCrons,\n createFarmCronCloudflareConfig,\n mergeScheduledTasks,\n prepareFarmCronForNitro,\n} from \"../cron\";\nimport { routeRulesToNitroRouteRules } from \"../route-rules\";\nimport { getFarmAppDirectories } from \"../layers\";\nimport { farmEnvironmentFunctionsPlugin } from \"../environment-vite\";\nimport {\n createFarmDocsLastModifiedManifest,\n FARM_DOCS_LAST_MODIFIED_MANIFEST,\n} from \"../docs/last-modified\";\nimport {\n generateFarmDocsSearchClientRuntime,\n isFarmDocsSearchEnabled,\n resolveFarmDocsSearchClientModule,\n} from \"../docs/search-client\";\nimport {\n createFarmRouteRuntimeManifest,\n validateFarmRouteRuntimeDeployment,\n writeFarmRouteRuntimeManifest,\n} from \"../route-runtime-manifest\";\nimport type { FarmRouteRuntimeManifest, FarmRouteRuntimeManifestEntry } from \"../route-runtime\";\nimport { createFarmVercelRouteRuntimeFunctions } from \"./vercel-route-runtime\";\nimport { readFarmI18nCatalogs } from \"../i18n/catalog\";\nimport type { FarmI18nCatalogs } from \"../i18n/types\";\nimport { getFarmIntegrationPluginServerRuntime } from \"../integrations\";\nimport type { TransformOptions } from \"esbuild\";\nimport { loadFarmProductionVite, type FarmProductionViteRuntime } from \"../build/production-vite\";\nimport { adaptTailwindVitePlugin } from \"../build/vite-plugin-compat\";\n\n// Type alias for OutputBundle\ntype OutputBundle = Rollup.OutputBundle;\ntype NitroEsbuildOptions = NonNullable<NonNullable<NitroConfig[\"esbuild\"]>[\"options\"]>;\ntype FarmNitroRuntime = typeof import(\"nitro\");\ntype UniversalPageRoute = {\n pattern: string;\n modulePath: string;\n source?: string;\n markdownSourcePath?: string;\n};\ntype UniversalBoundaryRoute = {\n pattern: string;\n modulePath: string;\n};\ntype UniversalRouteSlot = {\n name: string;\n ownerPattern: string;\n pattern: string;\n modulePath: string;\n containerId: string;\n interception: boolean;\n fallback: boolean;\n};\ntype UniversalConfiguredHeaderRoute = {\n source: string;\n headers: Array<{ key: string; value: string }>;\n};\ntype UniversalMetadataImageRoute = {\n pattern: string;\n kind: \"opengraph\" | \"twitter\";\n fileName: \"opengraph-image\" | \"twitter-image\";\n sourceType: \"module\" | \"static\";\n modulePath?: string;\n staticInfo?: {\n contentType: string;\n width: number;\n height: number;\n alt?: string;\n hash: string;\n byteLength: number;\n };\n data?: string;\n};\ntype UniversalMiddlewareRoute = {\n path: string;\n filePath: string;\n};\n\nfunction preloadFarmNitroRuntime(): Promise<PromiseSettledResult<FarmNitroRuntime>> {\n return import(\"nitro\").then(\n (value) => ({ status: \"fulfilled\", value }),\n (reason) => ({ status: \"rejected\", reason }),\n );\n}\n\n// Get __dirname equivalent for ESM\nconst _filename = typeof import.meta.url !== \"undefined\" ? fileURLToPath(import.meta.url) : \"\";\nconst _dirname = path.dirname(_filename);\nconst NODE_BUILTIN_MODULES = new Set([\n ...builtinModules,\n ...builtinModules.map((moduleName) => `node:${moduleName}`),\n]);\nconst NITRO_EXTERNAL_MODULES = new Set([\n \"react\",\n \"react-dom\",\n \"react-dom/server\",\n \"@prisma/client\",\n \"@prisma/client/default\",\n \"@prisma/client/default.js\",\n \".prisma/client\",\n \".prisma/client/default\",\n \"better-sqlite3\",\n \"fsevents\",\n \"esbuild\",\n \"lightningcss\",\n \"rollup\",\n \"vite\",\n \"vite-rolldown\",\n \"nitro\",\n \"nitropack\",\n \"sharp\",\n]);\nconst FARM_SSR_PACKAGE_IMPORT = \"#farm-ssr-entry\";\nconst FARM_SSR_OUTPUT_DIR = \"farm-ssr\";\nconst FARM_CLIENT_BUILD_TARGET = [\"es2020\", \"edge88\", \"firefox78\", \"chrome87\", \"safari14\"];\n\nfunction cloneConfigValue<T>(value: T, seen = new WeakMap<object, unknown>()): T {\n if (value === null || typeof value !== \"object\") return value;\n if (seen.has(value)) return seen.get(value) as T;\n if (value instanceof RegExp) return new RegExp(value.source, value.flags) as T;\n if (value instanceof Date) return new Date(value) as T;\n\n if (Array.isArray(value)) {\n const clone: unknown[] = [];\n seen.set(value, clone);\n for (const entry of value) clone.push(cloneConfigValue(entry, seen));\n return clone as T;\n }\n\n const clone: Record<PropertyKey, unknown> = {};\n seen.set(value, clone);\n for (const key of Reflect.ownKeys(value)) {\n clone[key] = cloneConfigValue((value as Record<PropertyKey, unknown>)[key], seen);\n }\n return clone as T;\n}\n\nfunction snapshotSSRRebundleOptions(config: NitroConfig) {\n return cloneConfigValue({\n alias: config.alias,\n commonJS: config.commonJS,\n entry: config.entry,\n externals: config.externals,\n exportConditions: config.exportConditions,\n imports: config.imports,\n inlineDynamicImports: config.inlineDynamicImports,\n moduleSideEffects: config.moduleSideEffects,\n noExternals: config.noExternals,\n node: config.node,\n nodeModulesDirs: config.nodeModulesDirs,\n plugins: config.plugins,\n replace: config.replace,\n serverEntry: config.serverEntry,\n typescript: config.typescript,\n unenv: config.unenv,\n virtual: config.virtual,\n wasm: config.experimental?.wasm,\n bundleRuntimeDependencies: config.experimental?.bundleRuntimeDependencies,\n });\n}\n\nasync function canUseRolldownBuilder(): Promise<boolean> {\n const [major = 0, minor = 0] = process.versions.node.split(\".\").map(Number);\n const isSupportedNode =\n (major === 20 && minor >= 19) || major > 22 || (major === 22 && minor >= 12);\n if (!isSupportedNode) {\n return false;\n }\n\n try {\n await import(\"rolldown\");\n return true;\n } catch {\n // Rolldown is optional so Node 18 and --no-optional installs retain Rollup.\n return false;\n }\n}\n\nfunction isCloudflareImagePreset(preset: string): boolean {\n return preset === \"cloudflare\" || preset === \"cloudflare-pages\" || preset === \"cloudflare-module\";\n}\n\nfunction resolveImageRuntime(\n config: ResolvedFarmConfig,\n preset: string,\n): \"none\" | \"node\" | \"cloudflare\" {\n if (config.images.provider === \"none\") return \"none\";\n const cloudflarePreset = isCloudflareImagePreset(preset);\n if (config.images.provider === \"node\" && cloudflarePreset) {\n throw new Error('images.provider \"node\" cannot run in a Cloudflare deployment');\n }\n if (config.images.provider === \"cloudflare\" && !cloudflarePreset) {\n throw new Error('images.provider \"cloudflare\" requires a Cloudflare deployment preset');\n }\n return config.images.provider === \"cloudflare\" ||\n (config.images.provider === \"auto\" && cloudflarePreset)\n ? \"cloudflare\"\n : \"node\";\n}\n\nfunction isNitroRollupExternal(id: string): boolean {\n const normalizedId = id.replace(/\\\\/g, \"/\");\n\n return (\n NODE_BUILTIN_MODULES.has(id) ||\n NITRO_EXTERNAL_MODULES.has(id) ||\n normalizedId.startsWith(\".prisma/\") ||\n normalizedId.includes(\"/node_modules/@prisma/client/\") ||\n normalizedId.includes(\"/node_modules/.prisma/client/\")\n );\n}\n\nfunction collectSSRExternalPackages(ssrBundle: OutputBundle): Set<string> {\n const emittedFiles = new Set(\n Object.keys(ssrBundle).map((fileName) => fileName.replace(/^\\.\\//, \"\")),\n );\n const externalPackages = new Set<string>();\n\n for (const [fileName, output] of Object.entries(ssrBundle)) {\n if (output.type !== \"chunk\") continue;\n\n for (const importId of [...output.imports, ...output.dynamicImports]) {\n const normalizedImportId = importId.replace(/\\\\/g, \"/\");\n const normalizedId = normalizedImportId.replace(/^\\.\\//, \"\");\n const resolvedRelativeId =\n normalizedImportId.startsWith(\"./\") || normalizedImportId.startsWith(\"../\")\n ? path.posix.normalize(path.posix.join(path.posix.dirname(fileName), normalizedImportId))\n : null;\n if (\n emittedFiles.has(normalizedId) ||\n (resolvedRelativeId !== null && emittedFiles.has(resolvedRelativeId)) ||\n NODE_BUILTIN_MODULES.has(importId) ||\n importId.startsWith(\"node:\")\n ) {\n continue;\n }\n\n if (\n path.isAbsolute(importId) ||\n /^[A-Za-z]:[\\\\/]/.test(importId) ||\n importId.startsWith(\"#\") ||\n importId.startsWith(\"\\0\")\n ) {\n externalPackages.add(importId);\n continue;\n }\n\n const segments = importId.split(\"/\");\n const packageName = importId.startsWith(\"@\") ? segments.slice(0, 2).join(\"/\") : segments[0];\n if (packageName) externalPackages.add(packageName);\n }\n }\n\n return externalPackages;\n}\n\nfunction createExternalSSRBundlePlugin(\n nitroEntryPath: string,\n ssrOutputDir: string,\n ssrEntryFile: string,\n): Rollup.Plugin {\n const resolvedNitroEntry = path.resolve(nitroEntryPath);\n const resolvedSSREntry = path.resolve(ssrOutputDir, ssrEntryFile);\n\n return {\n name: \"farm-externalize-prebuilt-ssr\",\n resolveId(source, importer) {\n if (!importer || path.resolve(importer) !== resolvedNitroEntry) {\n return null;\n }\n\n const resolvedImport = path.resolve(path.dirname(importer), source);\n if (resolvedImport !== resolvedSSREntry) return null;\n\n // A package import remains valid even when Nitro moves its adapter into a\n // nested chunk. A relative external import would be resolved from that\n // adapter chunk and can point at the wrong location.\n return { id: FARM_SSR_PACKAGE_IMPORT, external: true };\n },\n };\n}\n\nfunction hasRollupPlugins(plugins: unknown): boolean {\n if (Array.isArray(plugins)) {\n return plugins.some((plugin) => hasRollupPlugins(plugin));\n }\n return Boolean(plugins);\n}\n\nexport function hasFarmRuntimeConfigModule(\n config: Pick<ResolvedFarmConfig, \"layers\">,\n configModulePath: string | null,\n): boolean {\n return Boolean(configModulePath || (config.layers || []).some((layer) => layer.configFile));\n}\n\nfunction createEsbuildTransformOptions(\n configuredEsbuildOptions: NitroEsbuildOptions,\n minify: boolean,\n defaultTarget: string,\n): TransformOptions {\n const {\n include: _include,\n exclude: _exclude,\n sourceMap: _sourceMap,\n loaders: _loaders,\n ...configuredTransformOptions\n } = configuredEsbuildOptions;\n const configuredTarget = Array.isArray(configuredTransformOptions.target)\n ? configuredTransformOptions.target.filter(\n (target): target is string => typeof target === \"string\",\n )\n : configuredTransformOptions.target;\n const transformTarget =\n Array.isArray(configuredTarget) && configuredTarget.length === 0\n ? defaultTarget\n : (configuredTarget ?? defaultTarget);\n const transformSupported = configuredTransformOptions.supported\n ? Object.fromEntries(\n Object.entries(configuredTransformOptions.supported).filter(\n (entry): entry is [string, boolean] => typeof entry[1] === \"boolean\",\n ),\n )\n : undefined;\n\n return {\n ...(configuredTransformOptions as TransformOptions),\n format: \"esm\",\n target: transformTarget,\n loader: \"js\",\n sourcemap: false,\n minify,\n keepNames: configuredTransformOptions.keepNames ?? true,\n legalComments: configuredTransformOptions.legalComments ?? \"none\",\n supported: transformSupported,\n };\n}\n\nfunction createEsbuildChunkMinifyPlugin(\n configuredEsbuildOptions: NitroEsbuildOptions,\n): Rollup.Plugin {\n const configuredTransformOptions = createEsbuildTransformOptions(\n configuredEsbuildOptions,\n true,\n \"esnext\",\n );\n // Nitro already applies the configured esbuild transform to every module.\n // Keep this final chunk pass limited to minification controls so options such\n // as banner, footer, define, drop, and property mangling are not applied twice.\n const transformOptions: TransformOptions = {\n format: \"esm\",\n target: configuredTransformOptions.target,\n loader: \"js\",\n sourcemap: false,\n minify: true,\n keepNames: configuredTransformOptions.keepNames,\n legalComments: configuredTransformOptions.legalComments,\n charset: configuredTransformOptions.charset,\n };\n\n return {\n name: \"farm-esbuild-minify\",\n async renderChunk(code, chunk) {\n const { transform } = await import(\"esbuild\");\n const result = await transform(code, {\n ...transformOptions,\n sourcefile: chunk.fileName,\n });\n if (!result.code) return null;\n return {\n code: result.code,\n map: result.map || null,\n };\n },\n };\n}\n\nfunction trimSlashes(value: string): string {\n return value.replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction resolveBuildDocsContentDir(config: ResolvedFarmConfig, root: string): string | null {\n if (!config.docs?.enabled) return null;\n\n const configuredContentDir = config.docs.contentDir || config.docs.config.contentDir;\n if (typeof configuredContentDir === \"string\" && configuredContentDir.trim()) {\n const contentDir = path.isAbsolute(configuredContentDir)\n ? configuredContentDir\n : path.join(root, configuredContentDir);\n return existsSync(contentDir) ? contentDir : null;\n }\n\n const entryDir = config.docs.config.entry || trimSlashes(config.docs.entry) || \"docs\";\n const appDocsDir = path.join(root, config.srcDir || \"src\", \"app\", entryDir);\n if (existsSync(appDocsDir)) return appDocsDir;\n\n const rootDocsDir = path.join(root, entryDir);\n return existsSync(rootDocsDir) ? rootDocsDir : null;\n}\n\nfunction hasProjectPostcssConfig(root: string): boolean {\n const candidates = [\n \"postcss.config.js\",\n \"postcss.config.cjs\",\n \"postcss.config.mjs\",\n \"postcss.config.ts\",\n \"postcss.config.json\",\n \".postcssrc\",\n \".postcssrc.json\",\n \".postcssrc.js\",\n \".postcssrc.cjs\",\n \".postcssrc.mjs\",\n \".postcssrc.ts\",\n ];\n\n const projectRequire = createRequire(path.join(root, \"package.json\"));\n return candidates.some((file) => {\n try {\n projectRequire.resolve(`./${file}`);\n return true;\n } catch {\n return false;\n }\n });\n}\n\nasync function findFarmConfigPath(root: string): Promise<string | null> {\n const fs = await import(\"fs/promises\");\n const candidates = [\n \"farm.config.ts\",\n \"farm.config.mts\",\n \"farm.config.js\",\n \"farm.config.mjs\",\n \"config.ts\",\n \"config.mts\",\n \"config.js\",\n \"config.mjs\",\n ];\n\n for (const candidate of candidates) {\n const resolvedPath = path.join(root, candidate);\n try {\n await fs.access(resolvedPath);\n return resolvedPath;\n } catch {\n // Continue checking the next supported config path.\n }\n }\n\n return null;\n}\n\nfunction hasFarmMiddlewareConfig(config: ResolvedFarmConfig[\"middleware\"]): boolean {\n if (!config) return false;\n if (Array.isArray(config)) return config.length > 0;\n\n const configRecord = config as Record<string, unknown>;\n return Boolean(\n configRecord.matcher ||\n configRecord.exclude ||\n configRecord.runtime ||\n configRecord.handler ||\n (Array.isArray(configRecord.handlers) && configRecord.handlers.length > 0),\n );\n}\n\nfunction hasFarmServerRuntimePlugins(config: ResolvedFarmConfig): boolean {\n return (config.plugins || []).some((plugin) => {\n if (getFarmIntegrationPluginServerRuntime(plugin) === false) return false;\n\n return Boolean(\n plugin.setup ||\n plugin.init ||\n plugin.ready ||\n plugin.shutdown ||\n plugin.runtime ||\n plugin.router ||\n plugin.render ||\n plugin.beforeRouteMatch ||\n plugin.afterRouteMatch ||\n plugin.beforeRender ||\n plugin.afterRender ||\n plugin.onError ||\n plugin.transformHTML,\n );\n });\n}\n\nexport async function discoverMiddlewareRoutes(\n appDir: string | readonly string[],\n): Promise<UniversalMiddlewareRoute[]> {\n const fs = await import(\"fs/promises\");\n const appDirs = Array.isArray(appDir) ? [...appDir] : [appDir as string];\n const routes = new Map<string, UniversalMiddlewareRoute>();\n\n async function walk(\n dir: string,\n routePath: string,\n discovered: UniversalMiddlewareRoute[],\n ): Promise<void> {\n let entries: import(\"fs\").Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n const middlewareFile = entries.find(\n (entry) => entry.isFile() && /^middleware\\.(tsx?|jsx?)$/.test(entry.name),\n );\n\n if (middlewareFile) {\n discovered.push({\n path: routePath,\n filePath: path.join(dir, middlewareFile.name),\n });\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith(\".\") || entry.name.startsWith(\"_\")) {\n continue;\n }\n\n const childRoutePath = routePath === \"/\" ? `/${entry.name}` : `${routePath}/${entry.name}`;\n await walk(path.join(dir, entry.name), childRoutePath, discovered);\n }\n }\n\n for (const sourceAppDir of appDirs) {\n const discovered: UniversalMiddlewareRoute[] = [];\n await walk(sourceAppDir, \"/\", discovered);\n for (const route of discovered) {\n routes.set(route.path, route);\n }\n }\n\n return Array.from(routes.values()).sort((a, b) => {\n const depthA = a.path.split(\"/\").filter(Boolean).length;\n const depthB = b.path.split(\"/\").filter(Boolean).length;\n return depthA - depthB || a.path.localeCompare(b.path);\n });\n}\n\n/**\n * Universal build using TanStack Start pattern\n * - Builds SSR bundle in memory\n * - Uses virtual bundle plugin to expose to Nitro\n * - Creates virtual entry wrapping Web Standard handler\n */\nexport async function buildUniversal(\n config: ResolvedFarmConfig,\n routeManager: RouteManager,\n apiRouteManager: APIRouteManager,\n serverRenderer: ServerRenderer,\n options: {\n preset?: string;\n root?: string;\n pluginManager?: PluginManager;\n routeRuntimeManifest?: FarmRouteRuntimeManifest;\n productionVite?: FarmProductionViteRuntime | Promise<FarmProductionViteRuntime>;\n } = {},\n): Promise<void> {\n const root = options.root || config.root || process.cwd();\n const preset = options.preset || config.preset || \"node-server\";\n const srcDir = config.srcDir || \"src\";\n const distDir = config.distDir || \".farm\";\n const deployOutputDir = resolveDeployOutputPath(root, config.deploy.outputDir);\n const lifecyclePluginManager = options.pluginManager;\n // Attach all-settled handlers immediately so an earlier discovery failure\n // cannot leave a rejected preload unobserved.\n const productionViteResultPromise = Promise.allSettled([\n Promise.resolve(options.productionVite ?? loadFarmProductionVite()),\n ]);\n // Nitro is guaranteed to be needed for every universal production build.\n // Start resolving it while route metadata and the client/SSR bundles are\n // prepared, then consume the settled result at the adapter stage.\n const nitroRuntimeResultPromise = preloadFarmNitroRuntime();\n\n logger.info(`🚜 Building Farm.js application (universal) with preset: ${preset}...`);\n\n try {\n const routeRuntimeManifestPromise = options.routeRuntimeManifest\n ? Promise.resolve(options.routeRuntimeManifest)\n : createFarmRouteRuntimeManifest({\n config,\n routeManager,\n apiRouteManager,\n root,\n });\n const routeRuntimeManifestResultPromise = Promise.allSettled([routeRuntimeManifestPromise]);\n\n // Get page routes first (needed for both client and SSR builds)\n const pageRoutes: UniversalPageRoute[] = [];\n for (const [pattern, entry] of routeManager.getRoutes()) {\n const markdownSourcePath =\n entry.markdownSourcePath ||\n (isFarmMarkdownPageFile(entry.modulePath) ? entry.modulePath : undefined);\n pageRoutes.push({\n pattern,\n modulePath: entry.modulePath,\n ...(markdownSourcePath\n ? {\n source: readFileSync(markdownSourcePath, \"utf8\"),\n markdownSourcePath,\n }\n : {}),\n });\n }\n const routeSlots: UniversalRouteSlot[] = Array.from(\n routeManager.getRouteSlots().values(),\n (entry) => ({\n name: entry.name,\n ownerPattern: entry.ownerPattern,\n pattern: entry.pattern,\n modulePath: entry.modulePath,\n containerId: entry.containerId,\n interception: entry.interception,\n fallback: entry.fallback,\n }),\n );\n logger.info(`📋 Found ${pageRoutes.length} page routes`);\n\n // Discover layout files early (needed for client CSS scanning)\n const fs = await import(\"fs/promises\");\n const layoutRoutes: Array<{ pattern: string; modulePath: string }> = [];\n const appDir = path.join(root, srcDir, \"app\");\n\n async function findLayoutsForClient(dir: string, routePrefix: string = \"/\"): Promise<void> {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.match(/^layout\\.(tsx?|jsx?)$/)) {\n layoutRoutes.push({\n pattern: routePrefix,\n modulePath: path.join(dir, entry.name),\n });\n } else if (\n entry.isDirectory() &&\n !entry.name.startsWith(\".\") &&\n !entry.name.startsWith(\"_\")\n ) {\n const childPrefix =\n routePrefix === \"/\" ? `/${entry.name}` : `${routePrefix}/${entry.name}`;\n await findLayoutsForClient(path.join(dir, entry.name), childPrefix);\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n }\n await findLayoutsForClient(appDir);\n const seenLayoutPatterns = new Set(layoutRoutes.map((layout) => layout.pattern));\n for (const [pattern, entry] of routeManager.getLayouts()) {\n if (seenLayoutPatterns.has(pattern)) continue;\n seenLayoutPatterns.add(pattern);\n layoutRoutes.push({ pattern, modulePath: entry.modulePath });\n }\n logger.info(`📋 Found ${pageRoutes.length} page routes and ${layoutRoutes.length} layouts`);\n\n const clientOutputDir = path.join(root, distDir, \"client\");\n const [productionViteResult] = await productionViteResultPromise;\n if (productionViteResult.status === \"rejected\") {\n // Route evaluation may still be using the project module server. Drain it\n // before the outer build cleanup closes that server.\n await routeRuntimeManifestResultPromise;\n throw productionViteResult.reason;\n }\n const productionVite = productionViteResult.value;\n if (productionVite.builder === \"rolldown\") {\n logger.info(\"⚡ Building application bundles with Vite Rolldown\");\n }\n\n // Route metadata and the client/SSR graphs read independent inputs. Drain\n // every task before propagating a deterministic first failure so a rejected\n // sibling cannot keep mutating build output in the background.\n logger.info(\"📦 Building client and SSR bundles in parallel...\");\n const [clientBuildResult, ssrBuildResult] = await Promise.allSettled([\n // Client build (to disk)\n buildClient(\n productionVite,\n config,\n root,\n srcDir,\n clientOutputDir,\n pageRoutes,\n layoutRoutes,\n routeSlots,\n ),\n // SSR build (in memory)\n buildSSRInMemory(\n productionVite,\n config,\n root,\n routeManager,\n apiRouteManager,\n serverRenderer,\n preset,\n pageRoutes,\n layoutRoutes,\n routeSlots,\n ),\n ]);\n const [routeRuntimeManifestResult] = await routeRuntimeManifestResultPromise;\n if (routeRuntimeManifestResult.status === \"rejected\") {\n throw routeRuntimeManifestResult.reason;\n }\n if (ssrBuildResult.status === \"rejected\") throw ssrBuildResult.reason;\n if (clientBuildResult.status === \"rejected\") {\n if (\n productionVite.builder !== \"rolldown\" ||\n !(clientBuildResult.reason instanceof IncompleteClientBuildOutputError)\n ) {\n throw clientBuildResult.reason;\n }\n\n // Rolldown can very rarely complete a parallel client build without\n // traversing its entry graph. Preserve the fast parallel path, then\n // recover only that invalid result once the SSR graph is fully drained.\n logger.warn(\"Client bundle was incomplete; retrying after the SSR build...\");\n await buildClient(\n productionVite,\n config,\n root,\n srcDir,\n clientOutputDir,\n pageRoutes,\n layoutRoutes,\n routeSlots,\n );\n }\n\n const ssrResult = ssrBuildResult.value;\n const routeRuntimeManifest = routeRuntimeManifestResult.value;\n\n const runtimeValidation = validateFarmRouteRuntimeDeployment(routeRuntimeManifest, preset);\n for (const warning of runtimeValidation.warnings) {\n logger.warn(warning);\n }\n\n const { bundle: ssrBundle, entryFile: ssrEntryFile, configuredHeaderRoutes } = ssrResult;\n await writeSSRAssetsToClient(ssrBundle, clientOutputDir);\n\n // Step 3: Build with Nitro using virtual bundle\n logger.info(`🚀 Building server with Nitro (preset: ${preset})...`);\n await buildNitroUniversal(\n config,\n routeManager,\n apiRouteManager,\n serverRenderer,\n preset,\n root,\n distDir,\n ssrBundle,\n ssrEntryFile,\n clientOutputDir,\n routeRuntimeManifest,\n configuredHeaderRoutes,\n nitroRuntimeResultPromise,\n lifecyclePluginManager,\n );\n\n const runtimeManifestPath = await writeFarmRouteRuntimeManifest(\n path.join(root, distDir),\n routeRuntimeManifest,\n );\n logger.info(`📋 Route runtime manifest: ${path.relative(root, runtimeManifestPath)}`);\n\n logger.success(\"✅ Build completed successfully!\");\n logger.info(`📁 Output directory: ${deployOutputDir}`);\n } catch (error) {\n if (lifecyclePluginManager) {\n await lifecyclePluginManager.runHookParallel(\"onError\", {\n phase: \"buildUniversal\",\n error,\n meta: {\n root,\n preset,\n },\n });\n }\n logger.error(`❌ Build failed: ${error}`);\n throw error;\n }\n}\n\nasync function writeSSRAssetsToClient(bundle: OutputBundle, outputDir: string): Promise<void> {\n const fs = await import(\"fs/promises\");\n for (const [fileName, output] of Object.entries(bundle)) {\n if (output.type !== \"asset\") continue;\n const filePath = path.join(outputDir, fileName);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, output.source);\n }\n}\n\nclass IncompleteClientBuildOutputError extends Error {\n constructor(detail: string) {\n super(`Farm client build produced incomplete output: ${detail}`);\n this.name = \"IncompleteClientBuildOutputError\";\n }\n}\n\nasync function validateClientBuildOutput(\n root: string,\n srcDir: string,\n outputDir: string,\n): Promise<void> {\n const fs = await import(\"fs/promises\");\n const clientEntryPath = path.join(outputDir, \"farm-client.js\");\n let clientEntrySize = 0;\n\n try {\n const clientEntry = await fs.stat(clientEntryPath);\n if (clientEntry.isFile()) clientEntrySize = clientEntry.size;\n } catch {\n // Report the missing entry through the shared incomplete-output diagnostic.\n }\n\n if (clientEntrySize === 0) {\n throw new IncompleteClientBuildOutputError(\"farm-client.js is missing or empty\");\n }\n\n const clientCssPath = path.join(outputDir, \"farm-client.css\");\n const globalsCssPath = path.join(root, srcDir, \"app\", \"globals.css\");\n let expectsCss = false;\n try {\n const globalsCss = await fs.readFile(globalsCssPath, \"utf8\");\n expectsCss = globalsCss.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\").trim().length > 0;\n } catch {\n // Vite reports a missing imported stylesheet before output validation.\n }\n\n try {\n const clientCss = await fs.stat(clientCssPath);\n if (expectsCss && (!clientCss.isFile() || clientCss.size === 0)) {\n throw new IncompleteClientBuildOutputError(\"farm-client.css is empty\");\n }\n } catch (error) {\n if (error instanceof IncompleteClientBuildOutputError) throw error;\n if (expectsCss) {\n throw new IncompleteClientBuildOutputError(\"farm-client.css is missing\");\n }\n\n // Farm's HTML always references this stable path. Keep intentionally\n // style-free applications from receiving an unnecessary 404.\n await fs.writeFile(clientCssPath, \"\");\n }\n}\n\n/**\n * Build client bundle (to disk) with hydration for \"use client\" components\n */\nasync function buildClient(\n productionVite: FarmProductionViteRuntime,\n config: ResolvedFarmConfig,\n root: string,\n srcDir: string,\n outputDir: string,\n pageRoutes: UniversalPageRoute[],\n layoutRoutes: Array<{ pattern: string; modulePath: string }> = [],\n routeSlots: UniversalRouteSlot[] = [],\n) {\n const viteBuild = productionVite.build;\n const { farmPlugin } = await import(\"../vite\");\n const { PluginManager } = await import(\"../plugin\");\n const fs = await import(\"fs/promises\");\n\n const pluginManager = new PluginManager({\n config,\n isDev: false,\n isProd: true,\n });\n pluginManager.addPlugins(config.plugins || []);\n\n // Detect which pages should hydrate on the client.\n const clientPages: Array<{\n pattern: string;\n modulePath: string;\n relativePath: string;\n }> = [];\n\n for (const route of pageRoutes) {\n if (isFarmMarkdownPageFile(route.modulePath)) {\n continue;\n }\n try {\n const metadata = getClientModuleMetadata(route.modulePath, root);\n if (metadata.shouldHydrate) {\n const relativePath = route.modulePath.replace(root, \"\").replace(/^\\//, \"\");\n clientPages.push({ ...route, relativePath });\n logger.info(`📱 Found hydratable route: ${route.pattern} -> ${route.modulePath}`);\n }\n } catch (error) {\n logger.warn(`⚠️ Could not inspect route file ${route.modulePath}: ${error}`);\n }\n }\n\n const clientRouteSlots = routeSlots.filter((slot) => {\n try {\n return getClientModuleMetadata(slot.modulePath, root).shouldHydrate;\n } catch (error) {\n logger.warn(`⚠️ Could not inspect route slot ${slot.modulePath}: ${error}`);\n return false;\n }\n });\n\n logger.info(\n `📱 Total hydratable routes detected: ${clientPages.length} pages and ${clientRouteSlots.length} slots`,\n );\n\n // Generate client hydration entry code\n // Keep generated entries under the project so bare imports resolve through the\n // application's node_modules, including isolated production-build fixtures.\n const clientEntryRoot = path.join(root, \".farm\", \"tmp\");\n await fs.mkdir(clientEntryRoot, { recursive: true });\n const clientEntryDir = await fs.mkdtemp(path.join(clientEntryRoot, \"client-entry-\"));\n const clientEntryPath = path.join(clientEntryDir, \"farm-client-entry.tsx\");\n const clientHydrationCode = generateClientHydrationEntry(\n clientPages,\n layoutRoutes,\n clientRouteSlots,\n root,\n srcDir,\n isFarmDocsSearchEnabled(config.docs),\n resolveFarmDocsSearchClientModule(root),\n config.i18n,\n config.plugins,\n );\n\n // Write the client entry to a temporary file\n await fs.writeFile(clientEntryPath, clientHydrationCode);\n\n // Tailwind support:\n // - If project has explicit PostCSS config, respect it.\n // - Otherwise enable built-in @tailwindcss/vite (out of the box).\n const hasScopedPostcssConfig = hasProjectPostcssConfig(root);\n let postcssSearchPath: string | undefined;\n let tailwindVitePlugin: any = undefined;\n if (hasScopedPostcssConfig) {\n logger.info(\"📦 Using project PostCSS/Tailwind configuration\");\n } else {\n const postcssConfigPath = path.join(clientEntryDir, \"postcss.config.cjs\");\n await fs.writeFile(postcssConfigPath, \"module.exports = { plugins: [] };\\n\");\n postcssSearchPath = clientEntryDir;\n try {\n const tailwindVite = (await import(\"@tailwindcss/vite\")).default;\n tailwindVitePlugin = adaptTailwindVitePlugin(tailwindVite(), productionVite.builder);\n logger.info(\"📦 Enabled built-in Tailwind support (@tailwindcss/vite)\");\n } catch (error) {\n logger.warn(\n `Tailwind plugin auto-enable failed; continuing without it: ${(error as Error).message}`,\n );\n }\n }\n\n try {\n await viteBuild({\n root,\n esbuild: {\n jsxDev: false,\n },\n build: {\n // Preserve Farm's Vite 5 browser baseline when the production builder\n // uses Vite 8, whose default target only covers newer browsers.\n target: FARM_CLIENT_BUILD_TARGET,\n outDir: outputDir,\n emptyOutDir: true,\n assetsInlineLimit: 0,\n cssCodeSplit: false, // Bundle all CSS into one file\n rollupOptions: {\n input: {\n \"farm-client\": clientEntryPath,\n },\n output: {\n entryFileNames: \"[name].js\",\n chunkFileNames: \"chunks/[name]-[hash].js\",\n // Use predictable name for CSS so we can reference it in SSR HTML\n assetFileNames: (assetInfo) => {\n if (assetInfo.name?.endsWith(\".css\")) {\n return \"farm-client.css\";\n }\n return \"assets/[name]-[hash][extname]\";\n },\n },\n // Externalize Node.js built-ins and server-side modules for client build\n external: (id) => {\n // Externalize Node.js built-ins\n if (\n id.startsWith(\"node:\") ||\n [\n \"path\",\n \"url\",\n \"fs\",\n \"fs/promises\",\n \"os\",\n \"crypto\",\n \"http\",\n \"https\",\n \"net\",\n \"stream\",\n \"util\",\n \"events\",\n \"child_process\",\n \"module\",\n \"tty\",\n \"dns\",\n ].includes(id)\n ) {\n return true;\n }\n // Externalize native modules that can't be bundled for browser\n if (id === \"fsevents\" || id.includes(\"fsevents\") || id.endsWith(\".node\")) {\n return true;\n }\n return false;\n },\n },\n },\n plugins: [\n ...(tailwindVitePlugin ? [tailwindVitePlugin] : []),\n // Plugin to redirect @farm.js/core imports to client-only exports\n {\n name: \"farm-client-only-imports\",\n enforce: \"pre\" as const,\n resolveId(id) {\n // Redirect @farm.js/core to just export client-safe parts\n // Don't redirect @farm.js/core/client - that's already client-safe\n if (id === \"@farm.js/core\") {\n return { id: \"\\0farm-client-exports\", external: false };\n }\n if (id === \"@farm.js/core/i18n/server\") {\n return { id: \"\\0farm-i18n-client-bridge\", external: false };\n }\n // Block server-only imports completely\n if (\n id === \"@farm.js/core/server\" ||\n id === \"@farm.js/core/api\" ||\n id === \"@farm.js/core/middleware\" ||\n id === \"@farm.js/core/headers\" ||\n id === \"@farm.js/core/config\" ||\n id.includes(\"@farm.js/core/middleware\") ||\n id.includes(\"@farm.js/core/query/server\")\n ) {\n return { id: \"\\0empty-module\", external: false };\n }\n // Block API route imports (they come from type-only imports in api.generated.ts)\n if (id.includes(\"/api/\") && id.includes(\"/route\")) {\n return { id: \"\\0empty-api-route\", external: false };\n }\n // Block problematic node modules\n if (\n id === \"fsevents\" ||\n id.includes(\"fsevents\") ||\n id.endsWith(\".node\") ||\n id === \"nitro\" ||\n id === \"vite\" ||\n id === \"vite-rolldown\" ||\n id === \"esbuild\" ||\n id === \"rollup\" ||\n id.startsWith(\"nitro/\") ||\n id.includes(\"node-pre-gyp\") ||\n id.includes(\"nf3\")\n ) {\n return { id: \"\\0empty-module\", external: false };\n }\n return null;\n },\n load(id) {\n if (id === \"\\0empty-module\") {\n return \"const emptyMiddlewareStore = new Map(); export default {}; export const getMiddlewareContext = () => emptyMiddlewareStore; export const getMiddlewareData = () => emptyMiddlewareStore; export const getMiddlewareValue = () => undefined; export const middleware = () => ({});\";\n }\n if (id === \"\\0empty-api-route\") {\n // Stub for API routes - only used in type context, provide empty exports\n return \"export const GET = () => {}; export const POST = () => {}; export const PUT = () => {}; export const DELETE = () => {}; export const PATCH = () => {}; export default {};\";\n }\n if (id === \"\\0farm-i18n-client-bridge\") {\n return 'export { createTranslator, format, getLocale, getLocaleSource, t } from \"@farm.js/core/i18n/client\";';\n }\n if (id === \"\\0farm-client-exports\") {\n // Only export client-safe parts (no type exports - they're erased at compile time)\n return [\n \"// Farm.js Client Exports - Safe for browser bundling\",\n 'export { Link } from \"@farm.js/core/client\";',\n 'export { useRouter } from \"@farm.js/core/client\";',\n 'export { usePathname, useSearchParams } from \"@farm.js/core/navigation\";',\n 'export { createAPIClient } from \"@farm.js/core/client\";',\n ].join(\"\\n\");\n }\n return null;\n },\n },\n farmPlugin(config, pluginManager),\n farmEnvironmentFunctionsPlugin(),\n ],\n mode: \"production\",\n css: postcssSearchPath\n ? {\n postcss: postcssSearchPath,\n }\n : undefined,\n // Ensure React is bundled for client\n resolve: {\n dedupe: [\"react\", \"react-dom\"],\n },\n // Optimize dependencies - exclude server-side code from client bundle\n optimizeDeps: {\n exclude: [\n \"@farm.js/core/server\",\n \"@farm.js/core/api\",\n \"@farm.js/core/middleware\",\n \"@farm.js/core/headers\",\n ],\n },\n });\n await validateClientBuildOutput(root, srcDir, outputDir);\n } finally {\n // Clean up temporary entry file\n try {\n await fs.rm(clientEntryDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n/**\n * Generate client hydration entry that imports and hydrates client components\n */\nfunction generateUniversalRouterStateRuntime(): string {\n return `\nconst FARM_PAGE_STATE_KEY = \"__farmPageState\";\nconst IDLE_NAVIGATION_STATE = {\n state: \"idle\",\n pending: false,\n from: null,\n to: null,\n action: null,\n startedAt: null,\n};\n\nfunction createNavigationLocation(url) {\n return {\n href: url.href,\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n };\n}\n\nfunction scrollElementStorageKey(pathname, key) {\n return \"farm-scroll-\" + pathname + \":\" + key;\n}\n\nfunction createHistoryState(path, pageState, currentState) {\n const base = currentState && typeof currentState === \"object\" ? { ...currentState } : {};\n return {\n ...base,\n path,\n [FARM_PAGE_STATE_KEY]: pageState,\n };\n}\n`.trim();\n}\n\nfunction generateUniversalRouterStateProperties(): string {\n return `\n blockers: new Set(),\n navigationListeners: new Set(),\n navigationState: IDLE_NAVIGATION_STATE,\n observers: new Map(),\n scrollElements: new Map(),\n currentPath: window.location.pathname + window.location.search,\n\n getNavigationState: function() {\n return this.navigationState;\n },\n\n subscribeNavigation: function(listener) {\n this.navigationListeners.add(listener);\n listener(this.navigationState);\n return () => this.navigationListeners.delete(listener);\n },\n\n addBlocker: function(blocker) {\n this.blockers.add(blocker);\n return () => this.blockers.delete(blocker);\n },\n\n shouldBlockNavigation: async function(context) {\n for (const blocker of this.blockers) {\n if (await blocker(context)) return true;\n }\n return false;\n },\n\n startNavigation: function(from, to, action) {\n this.setNavigationState({\n state: \"loading\",\n pending: true,\n from,\n to: createNavigationLocation(to),\n action,\n startedAt: Date.now(),\n });\n },\n\n finishNavigation: function() {\n this.setNavigationState(IDLE_NAVIGATION_STATE);\n },\n\n setNavigationState: function(state) {\n this.navigationState = state;\n for (const listener of this.navigationListeners) listener(state);\n },\n\n pushState: function(state, href) {\n this.writePageState(\"push\", state, href);\n },\n\n replaceState: function(state, href) {\n this.writePageState(\"replace\", state, href);\n },\n\n writePageState: function(action, state, href) {\n const url = new URL(href || window.location.href, window.location.origin);\n const nextState = createHistoryState(\n url.pathname + url.search,\n state,\n window.history.state,\n );\n if (action === \"replace\") {\n window.history.replaceState(nextState, \"\", url);\n } else {\n window.history.pushState(nextState, \"\", url);\n }\n window.dispatchEvent(new PopStateEvent(\"popstate\", { state: nextState }));\n },\n\n registerScrollElement: function(key, element) {\n this.scrollElements.set(key, element);\n this.restoreScrollElement(window.location.pathname, key, element);\n return () => {\n if (this.scrollElements.get(key) === element) this.scrollElements.delete(key);\n };\n },\n\n saveScrollPosition: function(pathname) {\n try {\n sessionStorage.setItem(\n \"farm-scroll-\" + pathname,\n JSON.stringify({ x: window.scrollX, y: window.scrollY }),\n );\n for (const [key, element] of this.scrollElements) {\n sessionStorage.setItem(\n scrollElementStorageKey(pathname, key),\n JSON.stringify({ x: element.scrollLeft, y: element.scrollTop }),\n );\n }\n } catch {}\n },\n\n restoreScrollPosition: function(pathname) {\n try {\n const saved = sessionStorage.getItem(\"farm-scroll-\" + pathname);\n if (saved) {\n const position = JSON.parse(saved);\n setTimeout(() => window.scrollTo(position.x, position.y), 0);\n }\n for (const [key, element] of this.scrollElements) {\n this.restoreScrollElement(pathname, key, element);\n }\n } catch {}\n },\n\n restoreScrollElement: function(pathname, key, element) {\n try {\n const saved = sessionStorage.getItem(scrollElementStorageKey(pathname, key));\n if (!saved) return;\n const position = JSON.parse(saved);\n setTimeout(() => {\n element.scrollLeft = position.x;\n element.scrollTop = position.y;\n }, 0);\n } catch {}\n },\n\n runViewTransition: async function(enabled, callback) {\n const startViewTransition = document.startViewTransition;\n if (!enabled || typeof startViewTransition !== \"function\") {\n await callback();\n return;\n }\n const transition = startViewTransition.call(document, () => callback());\n await transition.finished;\n },\n`.trim();\n}\n\nfunction generateClientHydrationEntry(\n clientPages: Array<{\n pattern: string;\n modulePath: string;\n relativePath: string;\n }>,\n layoutRoutes: Array<{ pattern: string; modulePath: string }>,\n clientRouteSlots: UniversalRouteSlot[],\n root: string,\n srcDir: string,\n docsSearchEnabled: boolean,\n docsSearchModuleId: string | undefined,\n i18nConfig: ResolvedFarmConfig[\"i18n\"] = {\n enabled: false,\n locales: [\"en\"],\n defaultLocale: \"en\",\n messages: \"\",\n routing: \"none\",\n detection: [],\n fallbackLocale: \"en\",\n strict: false,\n cookie: {\n name: \"farm_locale\",\n maxAge: 0,\n path: \"/\",\n sameSite: \"lax\",\n secure: false,\n },\n direction: {},\n },\n plugins: readonly FarmPlugin[] = [],\n): string {\n const toImportPath = (targetPath: string) => targetPath.replace(/\\\\/g, \"/\");\n const clientPluginEntry: FarmClientPluginEntryCode = generateFarmClientPluginEntryCode(\n plugins,\n root,\n );\n\n // Always import global CSS for Tailwind\n const globalsCssPath = path.join(root, srcDir, \"app\", \"globals.css\");\n const cssImportPath = toImportPath(globalsCssPath);\n const cssImport = `import ${JSON.stringify(cssImportPath)};`;\n\n // Import layouts for wrapping client components\n const layoutImportStatements: string[] = [];\n const layoutRegistrations: string[] = [];\n\n layoutRoutes.forEach((layout, index) => {\n const relativePath = toImportPath(layout.modulePath);\n layoutImportStatements.push(`import Layout${index} from \"${relativePath}\";`);\n layoutRegistrations.push(\n ` { pattern: ${JSON.stringify(layout.pattern)}, Component: Layout${index} }`,\n );\n });\n\n const layoutImports = layoutImportStatements.join(\"\\n\");\n const i18nRoutingConfig = {\n locales: i18nConfig.locales,\n defaultLocale: i18nConfig.defaultLocale,\n routing: i18nConfig.routing,\n };\n const i18nClientRuntime = i18nConfig.enabled\n ? `\nimport { stripFarmLocaleFromPathname } from \"@farm.js/core/i18n\";\nimport { _setFarmI18nClientSnapshot } from \"@farm.js/core/i18n/client\";\n\nconst farmI18nConfig = ${JSON.stringify(i18nRoutingConfig)};\nif (window.__FARM_I18N__) {\n _setFarmI18nClientSnapshot(window.__FARM_I18N__);\n}\n\nfunction getFarmRoutePathname(pathname) {\n return stripFarmLocaleFromPathname(pathname, farmI18nConfig);\n}\n\nfunction isFarmLocaleDocumentChange(doc) {\n const currentLocale = window.__FARM_I18N__?.locale || document.documentElement.lang;\n const nextLocale = doc.documentElement?.lang;\n return Boolean(currentLocale && nextLocale && currentLocale !== nextLocale);\n}\n`\n : `\nfunction getFarmRoutePathname(pathname) {\n return pathname;\n}\n\nfunction isFarmLocaleDocumentChange() {\n return false;\n}\n`;\n\n if (clientPages.length === 0 && clientRouteSlots.length === 0) {\n // No client pages - just basic runtime with CSS and SPA navigation\n return `\n// Farm.js Client Runtime (no client components)\n${cssImport}\n${layoutImports}\nimport { createClientPluginManager, installChunkErrorRecovery } from \"@farm.js/core/internal/client-runtime\";\n${clientPluginEntry.imports}\n${i18nClientRuntime}\n${generateFarmDocsSearchClientRuntime(docsSearchEnabled, docsSearchModuleId)}\n\ninstallChunkErrorRecovery();\nmountFarmDocsSearch();\n\n${generateUniversalRouterStateRuntime()}\n\n// SPA Router for server-rendered pages (HTML swap)\nconst spaRouter = {\n${generateUniversalRouterStateProperties()}\n prefetchCache: new Map(),\n \n navigate: async function(href, options = {}) {\n const url = new URL(href, window.location.origin);\n if (url.origin !== window.location.origin) {\n window.location.href = href;\n return;\n }\n\n const action = options.action || (options.replace ? \"replace\" : \"push\");\n const to = url.pathname + url.search;\n if (action !== \"pop\" && to === this.currentPath) {\n if (url.hash) window.location.hash = url.hash;\n return;\n }\n if (action === \"pop\" && to === this.currentPath) return;\n\n const from = this.currentPath;\n if (await this.shouldBlockNavigation({ from, to, action })) return;\n\n this.saveScrollPosition(window.location.pathname);\n this.startNavigation(from, url, action);\n let clientNavigation;\n try {\n clientNavigation = await farmClientRuntime.beginNavigation({\n from: action === \"pop\" ? null : window.location.href,\n to: url,\n action,\n });\n const html = await this.fetchPage(url.pathname + url.search);\n await farmClientRuntime.markNavigationLoaded(clientNavigation, html);\n await this.runViewTransition(options.viewTransition, async () => {\n if (!this.swapContent(html)) {\n throw new Error(\"Farm could not swap the target document\");\n }\n const historyState = createHistoryState(\n url.pathname + url.search,\n options.state,\n window.history.state,\n );\n if (action === \"replace\") {\n window.history.replaceState(historyState, \"\", url);\n } else if (action !== \"pop\") {\n window.history.pushState(historyState, \"\", url);\n }\n if (options.scroll !== false) {\n if (url.hash) document.querySelector(url.hash)?.scrollIntoView();\n else window.scrollTo(0, 0);\n } else {\n this.restoreScrollPosition(url.pathname);\n }\n });\n await farmClientRuntime.resolveNavigation(clientNavigation);\n void farmClientRuntime.scheduleNavigationRendered(clientNavigation);\n this.currentPath = to;\n this.finishNavigation();\n } catch (error) {\n if (clientNavigation) {\n await farmClientRuntime.failNavigation(clientNavigation, error);\n }\n this.finishNavigation();\n console.error(\"[Farm.js] Navigation error:\", error);\n if (action === \"pop\") window.location.reload();\n else window.location.href = href;\n }\n },\n \n fetchPage: async function(url) {\n const cached = this.prefetchCache.get(url);\n if (cached) return cached;\n \n const response = await fetch(url, {\n headers: { \"Accept\": \"text/html\" }\n });\n if (!response.ok) throw new Error(\"Failed to fetch page\");\n return response.text();\n },\n \n swapContent: function(html) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n if (isFarmLocaleDocumentChange(doc)) return false;\n \n // Update title\n const newTitle = doc.querySelector(\"title\");\n if (newTitle) document.title = newTitle.textContent || \"\";\n \n // Update meta tags\n const newMetas = doc.querySelectorAll(\"meta[name]\");\n newMetas.forEach(function(meta) {\n const name = meta.getAttribute(\"name\");\n if (name) {\n const existing = document.querySelector(\"meta[name=\\\\\"\" + name + \"\\\\\"]\");\n if (existing) {\n existing.setAttribute(\"content\", meta.getAttribute(\"content\") || \"\");\n } else {\n document.head.appendChild(meta.cloneNode(true));\n }\n }\n });\n \n // Swap root content\n const newRoot = doc.getElementById(\"root\");\n const currentRoot = document.getElementById(\"root\");\n if (!newRoot || !currentRoot) return this.swapDocument(doc);\n currentRoot.innerHTML = newRoot.innerHTML;\n return true;\n },\n\n swapDocument: function(doc) {\n if (!doc.documentElement || !doc.body) return false;\n\n Array.from(document.documentElement.attributes).forEach(function(attr) {\n if (!doc.documentElement.hasAttribute(attr.name)) {\n document.documentElement.removeAttribute(attr.name);\n }\n });\n Array.from(doc.documentElement.attributes).forEach(function(attr) {\n document.documentElement.setAttribute(attr.name, attr.value);\n });\n\n document.head.innerHTML = doc.head ? doc.head.innerHTML : \"\";\n document.body.innerHTML = doc.body.innerHTML;\n delete window.__farmDocsRuntime;\n delete window.__farmDocsPageActionsRuntime;\n\n setTimeout(function() {\n Array.from(document.querySelectorAll(\"script\")).forEach(function(script) {\n const freshScript = document.createElement(\"script\");\n Array.from(script.attributes).forEach(function(attr) {\n freshScript.setAttribute(attr.name, attr.value);\n });\n freshScript.textContent = script.textContent || \"\";\n script.replaceWith(freshScript);\n });\n }, 0);\n\n return true;\n },\n prefetch: function(href) {\n const url = new URL(href, window.location.origin);\n if (url.origin !== window.location.origin) return;\n \n const pathname = url.pathname + url.search;\n if (this.prefetchCache.has(pathname)) return;\n \n this.fetchPage(pathname)\n .then(function(html) { spaRouter.prefetchCache.set(pathname, html); })\n .catch(function() {});\n },\n \n observeForPrefetch: function(element) {\n if (!(\"IntersectionObserver\" in window)) return;\n\n const href = element.getAttribute(\"href\");\n if (!href) return;\n\n const observer = new IntersectionObserver(function(entries) {\n entries.forEach(function(entry) {\n if (entry.isIntersecting) {\n spaRouter.prefetch(href);\n observer.disconnect();\n spaRouter.observers.delete(element);\n }\n });\n }, { rootMargin: \"50px\" });\n\n observer.observe(element);\n this.observers.set(element, observer);\n },\n\n unobserveForPrefetch: function(element) {\n const observer = this.observers.get(element);\n if (!observer) return;\n observer.unobserve(element);\n observer.disconnect();\n this.observers.delete(element);\n }\n};\n\nconst farmClientRuntime = createClientPluginManager(\n ${clientPluginEntry.registrations},\n {\n router: spaRouter,\n isDev: false,\n isProd: true,\n deploymentId: window.__FARM_DEPLOYMENT_ID__,\n },\n);\nwindow.__FARM_CLIENT_RUNTIME__ = farmClientRuntime;\nvoid farmClientRuntime.start();\n\n// Expose router globally\nwindow.__FARM_SPA_ROUTER__ = spaRouter;\n\nwindow.addEventListener(\"beforeunload\", function(event) {\n if (spaRouter.blockers.size > 0) {\n event.preventDefault();\n event.returnValue = \"\";\n }\n spaRouter.saveScrollPosition(window.location.pathname);\n});\n\n// Handle popstate (back/forward)\nwindow.addEventListener(\"popstate\", function() {\n if (document.documentElement.dataset.farmDocsRuntime === \"true\") return;\n void spaRouter.navigate(window.location.href, { action: \"pop\", scroll: false });\n});\n\n// Intercept link clicks\ndocument.addEventListener(\"click\", function(e) {\n const target = e.target;\n const anchor = target.closest ? target.closest(\"a\") : null;\n if (!anchor) return;\n \n const href = anchor.getAttribute(\"href\");\n if (!href) return;\n if (href.startsWith(\"http://\") || href.startsWith(\"https://\") || href.startsWith(\"//\")) return;\n if (href.startsWith(\"#\")) return;\n if (anchor.target && anchor.target !== \"_self\") return;\n if (document.documentElement.dataset.farmDocsRuntime === \"true\") return;\n if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) return;\n if (e.button !== 0) return;\n if (e.defaultPrevented) return;\n \n e.preventDefault();\n spaRouter.navigate(href);\n});\n`.trim();\n }\n\n // Generate imports for client components\n const imports: string[] = [];\n const routeEntries: string[] = [];\n const routeSlotEntries: string[] = [];\n\n clientPages.forEach((page, index) => {\n const importPath = toImportPath(page.modulePath);\n imports.push(`import Page${index} from \"${importPath}\";`);\n routeEntries.push(` { pattern: ${JSON.stringify(page.pattern)}, Component: Page${index} }`);\n });\n clientRouteSlots.forEach((slot, index) => {\n const importPath = toImportPath(slot.modulePath);\n imports.push(`import RouteSlot${index} from \"${importPath}\";`);\n routeSlotEntries.push(` {\n name: ${JSON.stringify(slot.name)},\n ownerPattern: ${JSON.stringify(slot.ownerPattern)},\n pattern: ${JSON.stringify(slot.pattern)},\n containerId: ${JSON.stringify(slot.containerId)},\n interception: ${JSON.stringify(slot.interception)},\n fallback: ${JSON.stringify(slot.fallback)},\n Component: RouteSlot${index},\n }`);\n });\n\n // Full SPA client with hydration for client components\n return `\n// Farm.js Client Runtime - SPA with Hydration\n${cssImport}\n${layoutImports}\nimport React from \"react\";\nimport { createRoot, hydrateRoot } from \"react-dom/client\";\nimport { createClientPluginManager, installChunkErrorRecovery } from \"@farm.js/core/internal/client-runtime\";\nimport { matchFarmRoute } from \"@farm.js/core/router\";\n${clientPluginEntry.imports}\n${i18nClientRuntime}\n\n${imports.join(\"\\n\")}\n${generateFarmDocsSearchClientRuntime(docsSearchEnabled, docsSearchModuleId)}\n\ninstallChunkErrorRecovery();\n\n// Client component routes\nconst clientRoutes = [\n${routeEntries.join(\",\\n\")}\n];\n\nconst clientRouteSlots = [\n${routeSlotEntries.join(\",\\n\")}\n];\n\n// Layout routes for wrapping client components\nconst layoutRoutes = [\n${layoutRegistrations.join(\",\\n\")}\n];\n\n// Get applicable layouts for a pathname (sorted by depth, root first)\nfunction getApplicableLayouts(pathname) {\n const applicable = [];\n const normalizedPath = getFarmRoutePathname(pathname).replace(/\\\\/$/, '') || '/';\n \n for (const layout of layoutRoutes) {\n if (layout.pattern === '/' || \n normalizedPath === layout.pattern || \n normalizedPath.startsWith(layout.pattern + '/')) {\n applicable.push(layout);\n }\n }\n \n // Sort by depth (root first)\n applicable.sort(function(a, b) {\n const depthA = a.pattern.split('/').filter(Boolean).length;\n const depthB = b.pattern.split('/').filter(Boolean).length;\n return depthA - depthB;\n });\n \n return applicable;\n}\n\n// Wrap a page element with applicable layouts\nfunction wrapWithLayouts(pageElement, pathname, params) {\n const layouts = getApplicableLayouts(pathname);\n let wrapped = pageElement;\n \n // Wrap from innermost to outermost (reverse order since layouts are root-first)\n for (let i = layouts.length - 1; i >= 0; i--) {\n const LayoutComponent = layouts[i].Component;\n if (LayoutComponent) {\n wrapped = React.createElement(LayoutComponent, { children: wrapped, params: params });\n }\n }\n \n return wrapped;\n}\n\n// Match pathname to client route\nfunction matchRoute(pathname) {\n pathname = getFarmRoutePathname(pathname);\n for (const route of clientRoutes) {\n const params = matchFarmRoute(route.pattern, pathname);\n if (params !== null) return { route: route, params: params };\n }\n return null;\n}\n\nfunction matchesRoutePrefix(pathname, pattern) {\n if (pattern === \"/\") return true;\n const pathSegments = getFarmRoutePathname(pathname).split(\"/\").filter(Boolean);\n const patternSegments = pattern.split(\"/\").filter(Boolean);\n if (patternSegments.length > pathSegments.length) return false;\n const candidate = \"/\" + pathSegments.slice(0, patternSegments.length).join(\"/\");\n return matchFarmRoute(pattern, candidate) !== null;\n}\n\nfunction matchInterceptedRouteSlot(pathname, from) {\n for (const slot of clientRouteSlots) {\n if (!slot.interception || !matchesRoutePrefix(from, slot.ownerPattern)) continue;\n const params = matchFarmRoute(slot.pattern, getFarmRoutePathname(pathname));\n if (params !== null) return { slot: slot, params: params };\n }\n return null;\n}\n\nfunction routeSlotKey(slot) {\n return slot.ownerPattern + \":\" + slot.name;\n}\n\nfunction findClientRouteSlot(slot) {\n return clientRouteSlots.find(function(candidate) {\n return candidate.name === slot.name &&\n candidate.ownerPattern === slot.ownerPattern &&\n candidate.pattern === slot.pattern &&\n candidate.interception === slot.interception &&\n candidate.fallback === slot.fallback;\n });\n}\n\nfunction readRouteSlotPayload(doc) {\n const script = doc.getElementById(\"__farm_route_slots_data__\");\n if (!script?.textContent) return [];\n try {\n const parsed = JSON.parse(script.textContent);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nconst routeSlotRoots = new Map();\nlet activeRouteInterception = null;\n\nfunction resetRouteSlotRoots() {\n for (const root of routeSlotRoots.values()) {\n try { root.unmount(); } catch {}\n }\n routeSlotRoots.clear();\n activeRouteInterception = null;\n}\n\nfunction renderClientRouteSlot(slot, registration, mode) {\n const container = document.getElementById(slot.containerId);\n if (!container || !registration?.Component) return false;\n const key = routeSlotKey(slot);\n const existingRoot = routeSlotRoots.get(key);\n const props = slot.props && typeof slot.props === \"object\" ? slot.props : {};\n const element = React.createElement(registration.Component, props);\n\n if (mode === \"hydrate\") {\n if (existingRoot) return true;\n const root = hydrateRoot(container, element);\n routeSlotRoots.set(key, root);\n return true;\n }\n\n if (existingRoot) {\n try { existingRoot.unmount(); } catch {}\n routeSlotRoots.delete(key);\n } else {\n container.replaceChildren();\n }\n const root = createRoot(container);\n root.render(element);\n routeSlotRoots.set(key, root);\n return true;\n}\n\nfunction hydrateInitialRouteSlots() {\n const slots = Array.isArray(window.__FARM_ROUTE_SLOTS__)\n ? window.__FARM_ROUTE_SLOTS__\n : [];\n for (const slot of slots) {\n const registration = findClientRouteSlot(slot);\n if (!registration) continue;\n try {\n renderClientRouteSlot(slot, registration, \"hydrate\");\n } catch (error) {\n console.warn(\"[Farm.js] Could not hydrate route slot:\", slot.name, error);\n }\n }\n}\n\nfunction renderRouteInterception(slot, registration, from) {\n const container = document.getElementById(slot.containerId);\n if (!container) return false;\n const key = routeSlotKey(slot);\n const previousSlot = (window.__FARM_ROUTE_SLOTS__ || []).find(function(candidate) {\n return routeSlotKey(candidate) === key;\n }) || null;\n const previousHtml = container.innerHTML;\n\n if (!renderClientRouteSlot(slot, registration, \"render\")) return false;\n activeRouteInterception = {\n from: from,\n key: key,\n slot: slot,\n previousSlot: previousSlot,\n previousHtml: previousHtml,\n };\n return true;\n}\n\nfunction clearRouteInterception(destination) {\n if (!activeRouteInterception) return false;\n const active = activeRouteInterception;\n activeRouteInterception = null;\n const root = routeSlotRoots.get(active.key);\n if (root) {\n try { root.unmount(); } catch {}\n routeSlotRoots.delete(active.key);\n }\n const container = document.getElementById(active.slot.containerId);\n if (container) {\n container.innerHTML = active.previousHtml;\n if (active.previousSlot) {\n const registration = findClientRouteSlot(active.previousSlot);\n if (registration) {\n try {\n renderClientRouteSlot(active.previousSlot, registration, \"hydrate\");\n } catch {}\n }\n }\n }\n return destination === active.from;\n}\n\n// State\nlet reactRoot = null;\nlet currentPathname = null;\nlet isHydrated = false;\n\n${generateUniversalRouterStateRuntime()}\n\nfunction resetReactRoot() {\n if (!reactRoot) return;\n reactRoot.unmount();\n reactRoot = null;\n isHydrated = false;\n}\n\n// Hydrate client components\nasync function hydrate() {\n const pathname = window.location.pathname;\n const matched = matchRoute(pathname);\n hydrateInitialRouteSlots();\n\n if (!matched) {\n return;\n }\n \n const hasRouteSlots =\n Array.isArray(window.__FARM_ROUTE_SLOTS__) && window.__FARM_ROUTE_SLOTS__.length > 0;\n const container =\n (hasRouteSlots ? document.getElementById(\"__farm_page__\") : null) ||\n document.getElementById(\"root\");\n if (!container) {\n console.error(\"[Farm.js] No root element found\");\n return;\n }\n \n const Component = matched.route.Component;\n const params = matched.params;\n const searchParams = Object.fromEntries(new URLSearchParams(window.location.search));\n \n const props = { params: params, searchParams: Promise.resolve(searchParams) };\n \n // Create page element and wrap with layouts\n const pageElement = React.createElement(Component, props);\n const wrappedElement = hasRouteSlots\n ? pageElement\n : wrapWithLayouts(pageElement, pathname, params);\n\n const shouldHydrate = !isHydrated && Boolean(container.innerHTML.trim());\n const hydrationSession = await farmClientRuntime.beginHydration({\n container,\n mode: shouldHydrate ? \"hydrate\" : \"render\",\n });\n\n try {\n if (shouldHydrate) {\n reactRoot = hydrateRoot(container, wrappedElement);\n isHydrated = true;\n } else {\n if (!reactRoot) {\n reactRoot = createRoot(container);\n }\n reactRoot.render(wrappedElement);\n }\n currentPathname = pathname;\n await farmClientRuntime.completeHydration(hydrationSession);\n } catch (error) {\n await farmClientRuntime.failHydration(hydrationSession, error);\n console.error(\"[Farm.js] Hydration error:\", error);\n }\n}\n\n// SPA Router\nconst spaRouter = {\n${generateUniversalRouterStateProperties()}\n prefetchCache: new Map(),\n \n navigate: async function(href, options = {}) {\n const url = new URL(href, window.location.origin);\n if (url.origin !== window.location.origin) {\n window.location.href = href;\n return;\n }\n\n const action = options.action || (options.replace ? \"replace\" : \"push\");\n const to = url.pathname + url.search;\n if (action !== \"pop\" && to === this.currentPath) {\n if (url.hash) window.location.hash = url.hash;\n return;\n }\n if (action === \"pop\" && to === this.currentPath) return;\n \n const pathname = url.pathname;\n const matched = matchRoute(pathname);\n const from = this.currentPath;\n if (await this.shouldBlockNavigation({ from, to, action })) return;\n\n this.saveScrollPosition(window.location.pathname);\n this.startNavigation(from, url, action);\n let clientNavigation;\n\n try {\n clientNavigation = await farmClientRuntime.beginNavigation({\n from: action === \"pop\" ? null : window.location.href,\n to: url,\n action,\n route: matched\n ? { pattern: matched.route.pattern, params: matched.params }\n : undefined,\n });\n\n if (activeRouteInterception && clearRouteInterception(to)) {\n await farmClientRuntime.markNavigationLoaded(clientNavigation, {\n routeSlots: \"restored\",\n });\n await farmClientRuntime.resolveNavigation(clientNavigation);\n void farmClientRuntime.scheduleNavigationRendered(clientNavigation);\n this.currentPath = to;\n this.finishNavigation();\n return;\n }\n if (activeRouteInterception) {\n clearRouteInterception(to);\n }\n\n const intercepted = matchInterceptedRouteSlot(pathname, from);\n if (intercepted) {\n const html = await this.fetchPage(to, from);\n const doc = new DOMParser().parseFromString(html, \"text/html\");\n const slotPayload = readRouteSlotPayload(doc);\n const selectedSlot = slotPayload.find(function(slot) {\n return slot.interception &&\n slot.name === intercepted.slot.name &&\n slot.ownerPattern === intercepted.slot.ownerPattern;\n });\n\n if (\n selectedSlot &&\n renderRouteInterception(selectedSlot, intercepted.slot, from)\n ) {\n await farmClientRuntime.markNavigationLoaded(clientNavigation, {\n route: intercepted.slot.pattern,\n params: intercepted.params,\n });\n const historyState = createHistoryState(\n to,\n options.state,\n window.history.state,\n );\n if (action === \"replace\") {\n window.history.replaceState(historyState, \"\", url);\n } else if (action !== \"pop\") {\n window.history.pushState(historyState, \"\", url);\n }\n await farmClientRuntime.resolveNavigation(clientNavigation);\n void farmClientRuntime.scheduleNavigationRendered(clientNavigation);\n this.currentPath = to;\n this.finishNavigation();\n return;\n }\n }\n\n if (matched) {\n const Component = matched.route.Component;\n const params = matched.params;\n const searchParams = Object.fromEntries(url.searchParams);\n const props = { params: params, searchParams: Promise.resolve(searchParams) };\n const pageElement = React.createElement(Component, props);\n const wrappedElement = wrapWithLayouts(pageElement, pathname, params);\n\n await farmClientRuntime.markNavigationLoaded(clientNavigation, {\n route: matched.route.pattern,\n params,\n });\n\n await this.runViewTransition(options.viewTransition, async () => {\n const historyState = createHistoryState(\n url.pathname + url.search,\n options.state,\n window.history.state,\n );\n if (action === \"replace\") {\n window.history.replaceState(historyState, \"\", url);\n } else if (action !== \"pop\") {\n window.history.pushState(historyState, \"\", url);\n }\n\n const container = document.getElementById(\"root\");\n if (container) {\n if (!reactRoot) {\n reactRoot = createRoot(container);\n }\n reactRoot.render(wrappedElement);\n currentPathname = pathname;\n }\n });\n } else {\n const html = await this.fetchPage(url.pathname + url.search);\n await farmClientRuntime.markNavigationLoaded(clientNavigation, html);\n await this.runViewTransition(options.viewTransition, async () => {\n if (!this.swapContent(html, url.pathname + url.search)) {\n throw new Error(\"Farm could not swap the target document\");\n }\n const historyState = createHistoryState(\n url.pathname + url.search,\n options.state,\n window.history.state,\n );\n if (action === \"replace\") {\n window.history.replaceState(historyState, \"\", url);\n } else if (action !== \"pop\") {\n window.history.pushState(historyState, \"\", url);\n }\n currentPathname = pathname;\n });\n }\n\n if (options.scroll !== false) {\n if (url.hash) document.querySelector(url.hash)?.scrollIntoView();\n else window.scrollTo(0, 0);\n } else {\n this.restoreScrollPosition(url.pathname);\n }\n await farmClientRuntime.resolveNavigation(clientNavigation);\n void farmClientRuntime.scheduleNavigationRendered(clientNavigation);\n this.currentPath = to;\n this.finishNavigation();\n } catch (error) {\n if (clientNavigation) {\n await farmClientRuntime.failNavigation(clientNavigation, error);\n }\n this.finishNavigation();\n console.error(\"[Farm.js] Navigation error:\", error);\n if (action === \"pop\") window.location.reload();\n else window.location.href = href;\n }\n },\n \n fetchPage: async function(url, interceptFrom) {\n const cacheKey = interceptFrom ? url + \"\\\\nintercept:\" + interceptFrom : url;\n const cached = this.prefetchCache.get(cacheKey);\n if (cached) return cached;\n \n const response = await fetch(url, {\n headers: {\n \"Accept\": \"text/html\",\n ...(interceptFrom ? { \"X-Farm-Intercept-From\": interceptFrom } : {}),\n }\n });\n if (!response.ok) throw new Error(\"Failed to fetch page\");\n const html = await response.text();\n this.prefetchCache.set(cacheKey, html);\n return html;\n },\n \n swapContent: function(html, targetPath) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n if (isFarmLocaleDocumentChange(doc)) return false;\n const nextRouteSlots = readRouteSlotPayload(doc);\n \n // Update title\n const newTitle = doc.querySelector(\"title\");\n if (newTitle) document.title = newTitle.textContent || \"\";\n \n // Update meta tags\n const newMetas = doc.querySelectorAll(\"meta[name]\");\n newMetas.forEach(function(meta) {\n const name = meta.getAttribute(\"name\");\n if (name) {\n const existing = document.querySelector(\"meta[name=\\\\\"\" + name + \"\\\\\"]\");\n if (existing) {\n existing.setAttribute(\"content\", meta.getAttribute(\"content\") || \"\");\n } else {\n document.head.appendChild(meta.cloneNode(true));\n }\n }\n });\n \n // Swap root content\n const newRoot = doc.getElementById(\"root\");\n const currentRoot = document.getElementById(\"root\");\n if (!newRoot || !currentRoot) return this.swapDocument(doc);\n resetReactRoot();\n resetRouteSlotRoots();\n currentRoot.innerHTML = newRoot.innerHTML;\n window.__FARM_ROUTE_SLOTS__ = nextRouteSlots;\n hydrateInitialRouteSlots();\n\n // Check if new page has a client component\n const targetUrl = new URL(targetPath || window.location.href, window.location.origin);\n const newPathname = targetUrl.pathname;\n const matched = matchRoute(newPathname);\n if (matched) {\n // Re-hydrate the client component\n const Component = matched.route.Component;\n const params = matched.params;\n const searchParams = Object.fromEntries(targetUrl.searchParams);\n const props = { params: params, searchParams: Promise.resolve(searchParams) };\n const pageElement = React.createElement(Component, props);\n const hasRouteSlots = nextRouteSlots.length > 0;\n const pageContainer =\n (hasRouteSlots ? document.getElementById(\"__farm_page__\") : null) || currentRoot;\n const wrappedElement = hasRouteSlots\n ? pageElement\n : wrapWithLayouts(pageElement, newPathname, params);\n reactRoot = hydrateRoot(pageContainer, wrappedElement);\n isHydrated = true;\n }\n return true;\n },\n\n swapDocument: function(doc) {\n if (!doc.documentElement || !doc.body) return false;\n\n resetReactRoot();\n resetRouteSlotRoots();\n\n Array.from(document.documentElement.attributes).forEach(function(attr) {\n if (!doc.documentElement.hasAttribute(attr.name)) {\n document.documentElement.removeAttribute(attr.name);\n }\n });\n Array.from(doc.documentElement.attributes).forEach(function(attr) {\n document.documentElement.setAttribute(attr.name, attr.value);\n });\n\n document.head.innerHTML = doc.head ? doc.head.innerHTML : \"\";\n document.body.innerHTML = doc.body.innerHTML;\n delete window.__farmDocsRuntime;\n delete window.__farmDocsPageActionsRuntime;\n\n setTimeout(function() {\n Array.from(document.querySelectorAll(\"script\")).forEach(function(script) {\n const freshScript = document.createElement(\"script\");\n Array.from(script.attributes).forEach(function(attr) {\n freshScript.setAttribute(attr.name, attr.value);\n });\n freshScript.textContent = script.textContent || \"\";\n script.replaceWith(freshScript);\n });\n }, 0);\n\n return true;\n },\n prefetch: function(href) {\n const url = new URL(href, window.location.origin);\n if (url.origin !== window.location.origin) return;\n \n const pathname = url.pathname + url.search;\n const interceptFrom = this.currentPath;\n const cacheKey = pathname + \"\\\\nintercept:\" + interceptFrom;\n if (this.prefetchCache.has(cacheKey)) return;\n \n this.fetchPage(pathname, interceptFrom)\n .then(function(html) { spaRouter.prefetchCache.set(cacheKey, html); })\n .catch(function() {});\n },\n \n observeForPrefetch: function(element) {\n if (!(\"IntersectionObserver\" in window)) return;\n\n const href = element.getAttribute(\"href\");\n if (!href) return;\n\n const observer = new IntersectionObserver(function(entries) {\n entries.forEach(function(entry) {\n if (entry.isIntersecting) {\n spaRouter.prefetch(href);\n observer.disconnect();\n spaRouter.observers.delete(element);\n }\n });\n }, { rootMargin: \"50px\" });\n\n observer.observe(element);\n this.observers.set(element, observer);\n },\n\n unobserveForPrefetch: function(element) {\n const observer = this.observers.get(element);\n if (!observer) return;\n observer.unobserve(element);\n observer.disconnect();\n this.observers.delete(element);\n }\n};\n\nconst farmClientRuntime = createClientPluginManager(\n ${clientPluginEntry.registrations},\n {\n router: spaRouter,\n isDev: false,\n isProd: true,\n deploymentId: window.__FARM_DEPLOYMENT_ID__,\n },\n);\nwindow.__FARM_CLIENT_RUNTIME__ = farmClientRuntime;\nvoid farmClientRuntime.start();\n\n// Expose router globally\nwindow.__FARM_SPA_ROUTER__ = spaRouter;\n\nwindow.addEventListener(\"beforeunload\", function(event) {\n if (spaRouter.blockers.size > 0) {\n event.preventDefault();\n event.returnValue = \"\";\n }\n spaRouter.saveScrollPosition(window.location.pathname);\n});\n\n// Handle popstate (back/forward)\nwindow.addEventListener(\"popstate\", function() {\n if (document.documentElement.dataset.farmDocsRuntime === \"true\") return;\n void spaRouter.navigate(window.location.href, { action: \"pop\", scroll: false });\n});\n\n// Intercept link clicks\ndocument.addEventListener(\"click\", function(e) {\n const target = e.target;\n const anchor = target.closest ? target.closest(\"a\") : null;\n if (!anchor) return;\n \n const href = anchor.getAttribute(\"href\");\n if (!href) return;\n if (href.startsWith(\"http://\") || href.startsWith(\"https://\") || href.startsWith(\"//\")) return;\n if (href.startsWith(\"#\")) return;\n if (anchor.target && anchor.target !== \"_self\") return;\n if (document.documentElement.dataset.farmDocsRuntime === \"true\") return;\n if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) return;\n if (e.button !== 0) return;\n if (e.defaultPrevented) return;\n \n e.preventDefault();\n spaRouter.navigate(href);\n});\n\n// Initial hydration\nif (isFarmDocsSearchPage()) {\n mountFarmDocsSearch();\n} else {\n void hydrate();\n}\n`.trim();\n}\n\n/**\n * Build SSR bundle in memory (write: false)\n * Creates a virtual entry that bundles all API routes and page routes\n * Managers are created at runtime from the bundled code\n */\nasync function buildSSRInMemory(\n productionVite: FarmProductionViteRuntime,\n config: ResolvedFarmConfig,\n root: string,\n routeManager: RouteManager,\n apiRouteManager: APIRouteManager,\n serverRenderer: ServerRenderer,\n preset: string,\n collectedPageRoutes: readonly UniversalPageRoute[],\n collectedLayoutRoutes: ReadonlyArray<{ pattern: string; modulePath: string }>,\n collectedRouteSlots: readonly UniversalRouteSlot[],\n): Promise<{\n bundle: OutputBundle;\n entryFile: string;\n configuredHeaderRoutes: UniversalConfiguredHeaderRoute[];\n}> {\n const viteBuild = productionVite.build;\n const { farmPlugin } = await import(\"../vite\");\n const { PluginManager } = await import(\"../plugin\");\n const fs = await import(\"fs/promises\");\n\n const pluginManager = new PluginManager({\n config,\n isDev: false,\n isProd: true,\n });\n pluginManager.addPlugins(config.plugins || []);\n const hasScopedPostcssConfig = hasProjectPostcssConfig(root);\n let postcssConfigDir: string | undefined;\n let tailwindVitePlugin: any = undefined;\n if (!hasScopedPostcssConfig) {\n postcssConfigDir = await fs.mkdtemp(path.join(os.tmpdir(), \"farm-postcss-\"));\n await fs.writeFile(\n path.join(postcssConfigDir, \"postcss.config.cjs\"),\n \"module.exports = { plugins: [] };\\n\",\n );\n try {\n const tailwindVite = (await import(\"@tailwindcss/vite\")).default;\n tailwindVitePlugin = adaptTailwindVitePlugin(tailwindVite(), productionVite.builder);\n } catch (error) {\n logger.warn(\n `Tailwind plugin auto-enable failed for SSR; continuing without it: ${(error as Error).message}`,\n );\n }\n }\n\n let ssrBundle: OutputBundle;\n let ssrEntryFile: string;\n\n // Reuse the route and layout manifests already collected for the parallel\n // client build instead of rescanning the same project tree.\n const pageRoutes = collectedPageRoutes.map((route) => ({ ...route }));\n const layoutRoutes = collectedLayoutRoutes.map((route) => ({ ...route }));\n const routeSlots = collectedRouteSlots.map((slot) => ({ ...slot }));\n\n const metadataImageRoutes: UniversalMetadataImageRoute[] = [];\n for (const entry of routeManager.getMetadataImages().values()) {\n if (entry.sourceType === \"static\") {\n if (!entry.staticInfo) {\n throw new Error(`Static metadata image ${entry.modulePath} is missing file info`);\n }\n metadataImageRoutes.push({\n pattern: entry.pattern,\n kind: entry.kind,\n fileName: entry.fileName,\n sourceType: \"static\",\n staticInfo: entry.staticInfo,\n data: (await fs.readFile(entry.modulePath)).toString(\"base64\"),\n });\n continue;\n }\n\n metadataImageRoutes.push({\n pattern: entry.pattern,\n kind: entry.kind,\n fileName: entry.fileName,\n sourceType: \"module\",\n modulePath: entry.modulePath,\n });\n }\n\n // Generate API route manifest\n const apiRoutes: Array<{\n path: string;\n filePath: string;\n methods: string[];\n }> = [];\n for (const [routePath, route] of apiRouteManager.getRoutes()) {\n apiRoutes.push({\n path: routePath,\n filePath: route.filePath,\n methods: route.methods,\n });\n }\n const [configuredRedirects, configuredRewrites, configuredHeaderRoutes] = await Promise.all([\n config.redirects(),\n config.rewrites(),\n config.headers(),\n ]);\n const redirectRoutes: ProgrammaticRedirectRoute[] = [\n ...routeManager.getRedirects(),\n ...configuredRedirects.map((redirect: RedirectConfig) => ({\n source: redirect.source,\n destination: redirect.destination,\n permanent: redirect.permanent,\n statusCode: redirect.statusCode,\n })),\n ];\n const errorRoutes: UniversalBoundaryRoute[] = Array.from(\n routeManager.getErrors().values(),\n (entry) => ({\n pattern: entry.pattern,\n modulePath: entry.modulePath,\n }),\n );\n const i18nCatalogs = config.i18n.enabled\n ? (await readFarmI18nCatalogs(config.i18n)).catalogs\n : {};\n\n const appDirs = getFarmAppDirectories(config);\n const middlewareRoutes = await discoverMiddlewareRoutes(appDirs);\n\n // Check for custom not-found page\n let notFoundPath: string | null = null;\n const notFoundExtensions = [\".tsx\", \".jsx\", \".ts\", \".js\"];\n for (const sourceAppDir of appDirs) {\n for (const ext of notFoundExtensions) {\n const checkPath = path.join(sourceAppDir, `not-found${ext}`);\n try {\n await fs.access(checkPath);\n notFoundPath = checkPath;\n break;\n } catch {\n // File doesn't exist, continue checking\n }\n }\n }\n if (notFoundPath) logger.info(`📋 Found custom 404 page: ${notFoundPath}`);\n\n // Sort layouts by depth (root first)\n layoutRoutes.sort((a, b) => {\n const depthA = a.pattern.split(\"/\").filter(Boolean).length;\n const depthB = b.pattern.split(\"/\").filter(Boolean).length;\n return depthA - depthB;\n });\n\n logger.info(\n `📋 Found ${pageRoutes.length} page routes, ${layoutRoutes.length} layouts, ${apiRoutes.length} API routes, and ${middlewareRoutes.length} middleware files`,\n );\n\n const configuredIntegrationValues = Object.values(config.integrations || {});\n const hasAnyConfiguredIntegrations = configuredIntegrationValues.some(\n (integration) => typeof integration === \"object\" && integration !== null,\n );\n const hasServerRuntimeIntegrations = configuredIntegrationValues.some(\n (integration) =>\n typeof integration === \"object\" &&\n integration !== null &&\n (!(\"serverRuntime\" in integration) || integration.serverRuntime !== false),\n );\n const hasObservabilityHandler =\n !!config.observability &&\n typeof config.observability === \"object\" &&\n \"onEvent\" in config.observability;\n const hasMdxComponentConfig = Boolean(config.mdx?.components);\n const hasMiddlewareConfig = hasFarmMiddlewareConfig(config.middleware);\n const hasRouteContextConfig = hasCustomFarmRouteContext(config);\n const hasServerRuntimePlugins = hasFarmServerRuntimePlugins(config);\n const configModulePath =\n hasServerRuntimeIntegrations ||\n hasObservabilityHandler ||\n hasMdxComponentConfig ||\n hasMiddlewareConfig ||\n hasRouteContextConfig ||\n hasServerRuntimePlugins\n ? await findFarmConfigPath(root)\n : null;\n const hasRuntimeConfigModule = hasFarmRuntimeConfigModule(config, configModulePath);\n const hasRuntimeIntegrationConfig = hasRuntimeConfigModule && hasAnyConfiguredIntegrations;\n const hasConfiguredRuntimePlugins = Boolean(\n hasRuntimeConfigModule && (config.plugins || []).length > 0,\n );\n\n // Generate virtual entry code that imports and bundles all routes\n // This ensures all route handlers are captured in the bundle closure\n const virtualEntryCode = generateVirtualEntryCode(\n apiRoutes,\n pageRoutes,\n layoutRoutes,\n routeSlots,\n errorRoutes,\n metadataImageRoutes,\n middlewareRoutes,\n redirectRoutes,\n configuredRewrites,\n configuredHeaderRoutes,\n notFoundPath,\n config,\n configModulePath,\n hasServerRuntimeIntegrations,\n hasRuntimeIntegrationConfig,\n hasConfiguredRuntimePlugins,\n preset,\n i18nCatalogs,\n );\n\n // Find a temporary file path for the virtual entry\n // We'll use a plugin to intercept this\n const virtualEntryId = \"\\0virtual:farm-ssr-entry\";\n\n try {\n await viteBuild({\n root,\n build: {\n target: \"esnext\",\n ssr: true,\n write: false, // ⭐ Keep in memory\n ssrEmitAssets: true,\n assetsInlineLimit: 0,\n minify: false, // Skip minification for SSR (faster build, Nitro will minify)\n sourcemap: false, // Skip sourcemaps for faster SSR build\n rollupOptions: {\n input: virtualEntryId,\n // Externalize native modules and Node.js built-ins\n external: [\n \"fsevents\",\n \"sharp\",\n \"@prisma/client\",\n \"@prisma/client/default\",\n \"@prisma/client/default.js\",\n \".prisma/client\",\n \".prisma/client/default\",\n /^\\.prisma\\//,\n /\\.node$/,\n /^node:/,\n ],\n // Optimize tree-shaking\n treeshake: {\n moduleSideEffects: false,\n },\n },\n },\n // Use esbuild for faster transforms\n esbuild: {\n target: \"node18\",\n keepNames: true,\n jsxDev: false,\n },\n // SSR configuration to externalize problematic modules\n ssr: {\n // Externalize native modules and build tools that can't be bundled\n // These have native binaries that won't work in serverless environments\n external: [\n \"fsevents\",\n \"sharp\",\n \"esbuild\",\n \"lightningcss\",\n \"rollup\",\n \"@rollup/rollup-darwin-arm64\",\n \"@rollup/rollup-darwin-x64\",\n \"@rollup/rollup-linux-x64-gnu\",\n \"@rollup/rollup-linux-x64-musl\",\n \"@rollup/rollup-linux-arm64-gnu\",\n \"@rollup/rollup-linux-arm64-musl\",\n \"@rollup/rollup-win32-x64-msvc\",\n \"@rollup/rollup-win32-arm64-msvc\",\n \"@rollup/rollup-win32-ia32-msvc\",\n \"vite\",\n \"vite-rolldown\",\n \"nitro\",\n \"nitropack\",\n \"@prisma/client\",\n \"@prisma/client/default\",\n \"@prisma/client/default.js\",\n \".prisma/client\",\n \".prisma/client/default\",\n ],\n // Node deployments must bundle application dependencies with Farm's\n // React runtime. Leaving a React component package external can make it\n // resolve a second React instance at runtime and break hooks during SSR.\n // Native and build-only packages above remain explicitly external.\n noExternal:\n preset === \"cloudflare-module\"\n ? [\"@farm.js/core\", \"@farm.js/core/image\", \"better-call\"]\n : true,\n },\n define: {\n __FARM_ENV__: JSON.stringify(config.env || { server: {}, public: {} }),\n __FARM_PUBLIC_ENV__: JSON.stringify(config.env?.public || {}),\n },\n plugins: [\n ...(tailwindVitePlugin ? [tailwindVitePlugin] : []),\n {\n name: \"farm-react-production-mode\",\n enforce: \"pre\",\n transform(code, id) {\n const normalizedId = id.replace(/\\\\/g, \"/\");\n const isReactRuntime =\n normalizedId.includes(\"/node_modules/react/\") ||\n normalizedId.includes(\"/node_modules/react-dom/\");\n const nodeEnvExpression = [\"process\", \"env\", \"NODE_ENV\"].join(\".\");\n\n if (!isReactRuntime || !code.includes(nodeEnvExpression)) return null;\n\n return {\n code: code.split(nodeEnvExpression).join('\"production\"'),\n map: null,\n };\n },\n },\n farmPlugin(config, pluginManager),\n farmEnvironmentFunctionsPlugin(),\n {\n name: \"farm-virtual-ssr-entry\",\n resolveId(id) {\n if (id === virtualEntryId || id === \"\\0virtual:farm-ssr-entry\") {\n return virtualEntryId;\n }\n return null;\n },\n load(id) {\n if (id === virtualEntryId) {\n return virtualEntryCode;\n }\n return null;\n },\n },\n {\n name: \"capture-ssr-bundle\",\n generateBundle(_options, bundle) {\n ssrBundle = bundle;\n\n // Find entry file\n for (const [fileName, file] of Object.entries(bundle)) {\n if (file.type === \"chunk\" && file.isEntry) {\n ssrEntryFile = fileName;\n break;\n }\n }\n\n if (!ssrEntryFile) {\n throw new Error(\"No entry point found in SSR bundle\");\n }\n },\n },\n ],\n mode: \"production\",\n css: postcssConfigDir\n ? {\n postcss: postcssConfigDir,\n }\n : undefined,\n resolve: {\n alias: {\n \"@\": path.resolve(root, \"src\"),\n },\n // Programmatic route wrappers are created inside @farm.js/core. Resolve\n // their React imports from the application so React 18/19 elements and\n // the selected server renderer always share the same runtime instance.\n dedupe: [\"react\", \"react-dom\", \"react/jsx-runtime\", \"react/jsx-dev-runtime\"],\n },\n });\n } finally {\n if (postcssConfigDir) {\n try {\n await fs.rm(postcssConfigDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors.\n }\n }\n }\n\n return {\n bundle: ssrBundle!,\n entryFile: ssrEntryFile!,\n configuredHeaderRoutes,\n };\n}\n\n/**\n * Generate virtual entry code that bundles all routes\n * This creates managers at runtime from bundled code\n */\nfunction generateVirtualEntryCode(\n apiRoutes: Array<{ path: string; filePath: string; methods: string[] }>,\n pageRoutes: UniversalPageRoute[],\n layoutRoutes: Array<{ pattern: string; modulePath: string }>,\n routeSlots: UniversalRouteSlot[],\n errorRoutes: UniversalBoundaryRoute[],\n metadataImageRoutes: UniversalMetadataImageRoute[],\n middlewareRoutes: UniversalMiddlewareRoute[],\n redirectRoutes: ProgrammaticRedirectRoute[],\n configuredRewriteRoutes: RewriteConfig[],\n configuredHeaderRoutes: UniversalConfiguredHeaderRoute[],\n notFoundPath: string | null,\n config: ResolvedFarmConfig,\n configModulePath: string | null,\n hasServerRuntimeIntegrations: boolean,\n hasRuntimeIntegrationConfig: boolean,\n hasConfiguredRuntimePlugins: boolean,\n preset: string,\n i18nCatalogs: FarmI18nCatalogs,\n): string {\n const hasPluginRuntime = hasRuntimeIntegrationConfig || hasConfiguredRuntimePlugins;\n const hasMiddlewareRuntime =\n middlewareRoutes.length > 0 || hasFarmMiddlewareConfig(config.middleware);\n const farmDocsBaseConfig = config.docs?.enabled\n ? { ...config.docs, config: undefined }\n : undefined;\n\n // Generate imports for all API routes\n const apiImports: string[] = [];\n const apiRegistrations: string[] = [];\n\n apiRoutes.forEach((route, index) => {\n const varName = `apiRoute${index}`;\n apiImports.push(`import * as ${varName} from \"${route.filePath}\";`);\n apiRegistrations.push(`\n {\n path: ${JSON.stringify(route.path)},\n methods: ${JSON.stringify(route.methods)},\n handlers: ${varName},\n }`);\n });\n\n // Generate imports for all page routes\n const pageImports: string[] = [];\n const pageRegistrations: string[] = [];\n const hasMarkdownPages = pageRoutes.some((route) => route.source !== undefined);\n const orderedPageRoutes = pageRoutes\n .map((route, index) => ({ route, index }))\n .sort(\n (left, right) =>\n routePatternSpecificity(right.route.pattern) -\n routePatternSpecificity(left.route.pattern) || left.index - right.index,\n )\n .map(({ route }) => route);\n\n orderedPageRoutes.forEach((route, index) => {\n const varName = `pageRoute${index}`;\n if (isFarmMarkdownPageFile(route.modulePath)) {\n pageRegistrations.push(`\n {\n pattern: ${JSON.stringify(route.pattern)},\n module: createFarmMarkdownRouteModule({\n source: ${JSON.stringify(route.source ?? \"\")},\n filePath: ${JSON.stringify(route.modulePath)},\n components: farmMdxComponents,\n config: farmMdxConfig,\n }),\n markdownSource: {\n source: ${JSON.stringify(route.source ?? \"\")},\n filePath: ${JSON.stringify(route.markdownSourcePath ?? route.modulePath)},\n },\n }`);\n return;\n }\n\n pageImports.push(`import * as ${varName} from \"${route.modulePath}\";`);\n const shouldHydrate = getClientModuleMetadata(route.modulePath, config.root).shouldHydrate;\n pageRegistrations.push(`\n {\n pattern: ${JSON.stringify(route.pattern)},\n module: ${varName},\n shouldHydrate: ${JSON.stringify(shouldHydrate)},\n ${\n route.source !== undefined\n ? `markdownSource: {\n source: ${JSON.stringify(route.source)},\n filePath: ${JSON.stringify(route.markdownSourcePath)},\n },`\n : \"\"\n }\n }`);\n });\n\n // Generate imports for all layouts\n const layoutImports: string[] = [];\n const layoutRegistrations: string[] = [];\n\n layoutRoutes.forEach((layout, index) => {\n const varName = `layoutRoute${index}`;\n layoutImports.push(`import * as ${varName} from \"${layout.modulePath}\";`);\n layoutRegistrations.push(`\n {\n pattern: ${JSON.stringify(layout.pattern)},\n module: ${varName},\n }`);\n });\n\n const routeSlotImports: string[] = [];\n const routeSlotRegistrations: string[] = [];\n routeSlots.forEach((slot, index) => {\n const varName = `routeSlot${index}`;\n routeSlotImports.push(`import * as ${varName} from \"${slot.modulePath}\";`);\n routeSlotRegistrations.push(`\n {\n name: ${JSON.stringify(slot.name)},\n ownerPattern: ${JSON.stringify(slot.ownerPattern)},\n pattern: ${JSON.stringify(slot.pattern)},\n containerId: ${JSON.stringify(slot.containerId)},\n interception: ${JSON.stringify(slot.interception)},\n fallback: ${JSON.stringify(slot.fallback)},\n module: ${varName},\n }`);\n });\n\n // Generate imports for route-level error boundaries.\n const errorImports: string[] = [];\n const errorRegistrations: string[] = [];\n\n errorRoutes.forEach((errorRoute, index) => {\n const varName = `errorRoute${index}`;\n errorImports.push(`import * as ${varName} from \"${errorRoute.modulePath}\";`);\n errorRegistrations.push(`\n {\n pattern: ${JSON.stringify(errorRoute.pattern)},\n module: ${varName},\n }`);\n });\n\n const metadataImageImports: string[] = [];\n const metadataImageRegistrations: string[] = [];\n\n metadataImageRoutes.forEach((image, index) => {\n if (image.sourceType === \"module\") {\n const varName = `metadataImageRoute${index}`;\n metadataImageImports.push(`import * as ${varName} from \"${image.modulePath}\";`);\n metadataImageRegistrations.push(`\n {\n pattern: ${JSON.stringify(image.pattern)},\n kind: ${JSON.stringify(image.kind)},\n fileName: ${JSON.stringify(image.fileName)},\n sourceType: \"module\",\n module: ${varName},\n }`);\n return;\n }\n\n metadataImageRegistrations.push(` ${JSON.stringify(image)}`);\n });\n\n // Generate imports for all app middleware files\n const middlewareImports: string[] = [];\n const middlewareRegistrations: string[] = [];\n\n middlewareRoutes.forEach((middlewareRoute, index) => {\n const varName = `fileMiddleware${index}`;\n middlewareImports.push(`import * as ${varName} from \"${middlewareRoute.filePath}\";`);\n middlewareRegistrations.push(`\n {\n path: ${JSON.stringify(middlewareRoute.path)},\n filePath: ${JSON.stringify(middlewareRoute.filePath)},\n module: ${varName},\n }`);\n });\n\n // Generate import for custom not-found page if exists\n const notFoundImport = notFoundPath ? `import * as CustomNotFound from \"${notFoundPath}\";` : \"\";\n const apiRouteHelpersImport =\n apiRoutes.length > 0\n ? `import { invokeAPIRouteEndpoint, matchAPIRoute } from \"@farm.js/core/api/runtime\";`\n : \"\";\n const productionRuntimeImport = `import {\n _runWithAfterRequest,\n _runWithCurrentRequest,\n _runWithMiddlewareContext,\n _runWithMiddlewareData,\n addMetadataImageReference,\n applyProductionMiddlewareHeaders,\n configureFarmCache,\n configureFarmObservability,\n createFarmCacheKey,\n createFarmLocaleCookie,\n createProductionMiddlewareRunner,\n emitFarmEvent,\n getFarmDataCache,\n getFarmLocaleVaryHeaders,\n getFarmRedirectError,\n isFarmNotFoundError,\n isFarmRedirectError,\n localizeFarmHref,\n localizeFarmPathname,\n mergeMetadata,\n normalizeRevalidatePath,\n renderMetadataHead,\n resolveFarmRouteContext,\n stripFarmLocaleFromPathname,\n withFarmRouteContext,\n} from \"@farm.js/core/internal/production-runtime\";`;\n const pluginRuntimeImport = hasPluginRuntime\n ? `import { PluginManager } from \"@farm.js/core/plugin\";`\n : \"\";\n const i18nServerImport = config.i18n.enabled\n ? `import { _runWithFarmI18nRequest, _setDefaultFarmI18nRuntime, createFarmI18nRuntime, getFarmI18nClientSnapshot } from \"@farm.js/core/i18n/server\";`\n : \"\";\n const docsHandlerImport = config.docs?.enabled\n ? `import { createFarmDocsAPIHandler, createFarmDocsHandler, isFarmDocsAPIRequest } from \"@farm.js/core/docs\";`\n : \"\";\n const docsRuntimeImport = config.docs?.enabled\n ? `import { existsSync as farmDocsExistsSync } from \"node:fs\";\nimport { dirname as farmDocsDirname, join as farmDocsJoin } from \"node:path\";\nimport { fileURLToPath as farmDocsFileURLToPath } from \"node:url\";`\n : \"\";\n const markdownHandlerImport = config.md?.enabled\n ? `import { applyMarkdownNegotiationHeaders, createMarkdownMirrorResponse } from \"@farm.js/core/markdown\";`\n : \"\";\n const appMarkdownImport = hasMarkdownPages\n ? `import { createFarmMarkdownRouteModule, createFarmMarkdownSourceResponse } from \"@farm.js/core/app-markdown\";`\n : \"const createFarmMarkdownSourceResponse = null;\";\n const mdxComponentsPath =\n typeof config.mdx?.components === \"string\"\n ? path.isAbsolute(config.mdx.components)\n ? config.mdx.components\n : path.join(config.root, config.mdx.components)\n : null;\n const mdxComponentsImport = mdxComponentsPath\n ? `import * as FarmMdxComponentsModule from \"${mdxComponentsPath.replace(/\\\\/g, \"/\")}\";`\n : \"\";\n const layerConfigPaths = (config.layers || [])\n .map((layer) => layer.configFile)\n .filter((configFile): configFile is string => Boolean(configFile))\n .filter((configFile) => configFile !== configModulePath);\n const layerConfigImports = layerConfigPaths\n .map(\n (configFile, index) =>\n `import * as FarmLayerConfigModule${index} from \"${configFile.replace(/\\\\/g, \"/\")}\";`,\n )\n .join(\"\\n\");\n const layerConfigValues = layerConfigPaths.map(\n (_configFile, index) =>\n `(FarmLayerConfigModule${index}.default || FarmLayerConfigModule${index})`,\n );\n const integrationRuntimeExports = Array.from(\n new Set([\n ...(hasServerRuntimeIntegrations\n ? [\"dispatchIntegrationRequest\", \"matchIntegrationRoute\"]\n : []),\n ...(hasRuntimeIntegrationConfig\n ? [\"getRegisteredIntegrationAPIManifest\", \"resolveIntegrationPlugins\"]\n : []),\n ]),\n );\n const integrationRuntimeImport = integrationRuntimeExports.length\n ? `import { ${integrationRuntimeExports.join(\", \")} } from \"@farm.js/core/integrations\";`\n : \"\";\n const integrationImports = `\n${configModulePath ? `import * as FarmUserConfigModule from \"${configModulePath}\";` : \"\"}\n${layerConfigImports}\n${integrationRuntimeImport}\n`;\n const imageRuntime = resolveImageRuntime(config, preset);\n const imageRuntimeImport =\n imageRuntime === \"none\"\n ? \"\"\n : `import { createCloudflareImageTransformer, createFarmImageHandler } from \"@farm.js/core/image/server\";`;\n const imageNodeRuntimeImport =\n imageRuntime === \"node\"\n ? `import { createNodeImageUrlValidator, createSharpImageTransformer } from \"@farm.js/core/image/sharp\";`\n : \"\";\n const apiHandlerCode =\n apiRoutes.length > 0\n ? `\nconst apiRouteMap = new Map(apiRoutes.map((route) => [route.path, route]));\n\nfunction matchLocalAPIRequest(request) {\n return matchAPIRoute(apiRouteMap, new URL(request.url).pathname);\n}\n\nasync function handleAPIRequest(request) {\n const url = new URL(request.url);\n const method = request.method.toUpperCase();\n const match = matchLocalAPIRequest(request);\n\n if (!match) {\n return null;\n }\n\n const { route, params } = match;\n const endpoint = route.handlers[method];\n if (!endpoint) {\n return new Response(\n JSON.stringify({ error: \"Method Not Allowed\" }),\n { status: 405, headers: { \"Content-Type\": \"application/json\" } }\n );\n }\n\n try {\n return await invokeAPIRouteEndpoint(endpoint, request, params);\n } catch (error) {\n console.error(\\`[API Error] \\${url.pathname}:\\`, error);\n return new Response(\n JSON.stringify({ error: \"Internal Server Error\" }),\n { status: 500, headers: { \"Content-Type\": \"application/json\" } }\n );\n }\n}\n`\n : `\nfunction matchLocalAPIRequest(_request) {\n return null;\n}\n\nasync function handleAPIRequest(request) {\n return null;\n}\n`;\n\n return `\n// Farm.js SSR Entry - Generated at build time\n// All routes are bundled here, managers are created at runtime\n\n${apiImports.join(\"\\n\")}\n${pageImports.join(\"\\n\")}\n${layoutImports.join(\"\\n\")}\n${routeSlotImports.join(\"\\n\")}\n${errorImports.join(\"\\n\")}\n${metadataImageImports.join(\"\\n\")}\n${middlewareImports.join(\"\\n\")}\n${notFoundImport}\n${apiRouteHelpersImport}\n${productionRuntimeImport}\n${pluginRuntimeImport}\n${i18nServerImport}\n${docsHandlerImport}\n${docsRuntimeImport}\n${markdownHandlerImport}\n${appMarkdownImport}\n${mdxComponentsImport}\n${integrationImports}\n${imageRuntimeImport}\n${imageNodeRuntimeImport}\nimport * as React from \"react\";\nimport * as ReactDOMServer from \"react-dom/server\";\n\n// Custom 404 page component (if provided)\nconst hasCustomNotFound = ${notFoundPath ? \"true\" : \"false\"};\nconst CustomNotFoundComponent = ${notFoundPath ? \"CustomNotFound.default || CustomNotFound\" : \"null\"};\nconst farmUserConfig = ${\n configModulePath ? \"(FarmUserConfigModule.default || FarmUserConfigModule)\" : \"null\"\n };\nconst farmRuntimeConfigs = [${[...layerConfigValues, \"farmUserConfig\"].join(\", \")}].filter(Boolean);\nconst farmResolvedRuntimeConfig = Object.assign({}, ...farmRuntimeConfigs);\nconst hasConfiguredRouteContext = typeof farmResolvedRuntimeConfig.context === \"function\";\nconst configuredIntegrations = Object.assign(\n {},\n ...farmRuntimeConfigs.map((runtimeConfig) => runtimeConfig.integrations || {}),\n);\nconst serverRuntimeIntegrations = Object.fromEntries(\n Object.entries(configuredIntegrations).filter(([, integration]) =>\n integration && typeof integration === \"object\" && integration.serverRuntime !== false\n ),\n);\nconst integrationRuntimeConfig = Object.assign({}, ...farmRuntimeConfigs, {\n integrations: configuredIntegrations,\n});\nconst configuredPlugins = [\n ${hasRuntimeIntegrationConfig ? \"...resolveIntegrationPlugins(serverRuntimeIntegrations),\" : \"\"}\n ${\n hasConfiguredRuntimePlugins\n ? `...farmRuntimeConfigs.flatMap((runtimeConfig) =>\n Array.isArray(runtimeConfig.plugins) ? runtimeConfig.plugins : [],\n ),`\n : \"\"\n }\n];\nconst farmPluginRuntime = ${\n hasPluginRuntime\n ? `configuredPlugins.length > 0\n ? (() => {\n const manager = new PluginManager({\n config: farmUserConfig || {},\n isDev: false,\n isProd: true,\n });\n manager.addPlugins(configuredPlugins);\n return manager;\n })()\n : null`\n : \"null\"\n };\nconst hasFarmPluginHTMLTransforms = configuredPlugins.some(\n (plugin) => plugin.render?.html || plugin.afterRender || plugin.transformHTML,\n);\nconst farmImageHandler = ${\n imageRuntime === \"none\"\n ? \"null\"\n : imageRuntime === \"cloudflare\"\n ? `createFarmImageHandler(${JSON.stringify(config.images)}, {\n transform: createCloudflareImageTransformer(),\n onError(error) { console.error(\"[Farm Image]\", error); },\n})`\n : `createFarmImageHandler(${JSON.stringify(config.images)}, {\n transform: createSharpImageTransformer(),\n validateRemoteUrl: createNodeImageUrlValidator(${JSON.stringify(config.images)}),\n onError(error) { console.error(\"[Farm Image]\", error); },\n})`\n };\nconst farmMarkdownConfig = ${JSON.stringify(config.md)};\nconst farmMdxConfig = ${JSON.stringify({\n ...config.mdx,\n components: typeof config.mdx?.components === \"string\" ? config.mdx.components : undefined,\n })};\nconst configuredFarmMdxComponents = farmUserConfig?.mdx?.components;\nconst farmMdxComponents = ${\n mdxComponentsPath\n ? `(FarmMdxComponentsModule.components || Reflect.get(FarmMdxComponentsModule, \"default\") || {})`\n : `(configuredFarmMdxComponents && typeof configuredFarmMdxComponents === \"object\" ? configuredFarmMdxComponents : {})`\n };\nconst farmObservabilityConfig = farmUserConfig?.observability ?? ${JSON.stringify(\n config.observability ?? false,\n )};\nconfigureFarmObservability(farmObservabilityConfig);\nconfigureFarmCache(farmResolvedRuntimeConfig.cache);\nconst farmI18nConfig = ${JSON.stringify(config.i18n)};\nconst farmI18nRuntime = ${\n config.i18n.enabled\n ? `createFarmI18nRuntime(farmI18nConfig, ${JSON.stringify(i18nCatalogs)})`\n : \"null\"\n };\n${config.i18n.enabled ? \"_setDefaultFarmI18nRuntime(farmI18nRuntime);\" : \"\"}\nconst farmDocsBundledContentDir = ${\n config.docs?.enabled\n ? `(() => {\n try {\n const currentDir = farmDocsDirname(farmDocsFileURLToPath(import.meta.url));\n const candidates = [\n farmDocsJoin(currentDir, \"farm-docs-content\"),\n farmDocsJoin(currentDir, \"..\", \"farm-docs-content\"),\n farmDocsJoin(currentDir, \"..\", \"..\", \"farm-docs-content\"),\n ];\n return candidates.find((candidate) => farmDocsExistsSync(candidate)) || null;\n } catch {\n return null;\n }\n})()`\n : \"null\"\n };\nconst farmDocsResolvedConfig = ${\n config.docs?.enabled\n ? `farmDocsBundledContentDir\n ? {\n ...${JSON.stringify(farmDocsBaseConfig)},\n contentDir: farmDocsBundledContentDir,\n config: {\n ...${JSON.stringify(config.docs.config)},\n contentDir: farmDocsBundledContentDir,\n },\n }\n : ${JSON.stringify(config.docs)}`\n : \"null\"\n };\nconst farmDocsRuntimeRoot = farmDocsBundledContentDir || ${JSON.stringify(config.root)};\nglobalThis.__FARM_DOCS_RUNTIME_CONFIG__ = {\n root: farmDocsRuntimeRoot,\n srcDir: ${JSON.stringify(config.srcDir)},\n docs: farmDocsResolvedConfig,\n};\nconst farmDocsHandler = ${\n config.docs?.enabled\n ? `createFarmDocsHandler(farmDocsResolvedConfig, { root: farmDocsRuntimeRoot, srcDir: ${JSON.stringify(config.srcDir)}, clientEntry: \"/farm-client.js\" })`\n : \"null\"\n };\nconst farmDocsAPIHandler = ${\n config.docs?.enabled\n ? `createFarmDocsAPIHandler({ rootDir: farmDocsRuntimeRoot, srcDir: ${JSON.stringify(config.srcDir)}, docs: farmDocsResolvedConfig })`\n : \"null\"\n };\n\n// API routes bundled at build time\nconst apiRoutes = [${apiRegistrations.join(\",\")}\n];\n\n// Page routes bundled at build time\nconst pageRoutes = [${pageRegistrations.join(\",\")}\n];\nconst exactPageRoutes = new Map();\nconst patternPageRoutes = [];\nfor (const route of pageRoutes) {\n if (/[\\\\[\\\\]*:]/.test(route.pattern)) {\n patternPageRoutes.push(route);\n } else {\n const exactPath = normalizeRuntimePath(route.pattern);\n if (!exactPageRoutes.has(exactPath)) exactPageRoutes.set(exactPath, route);\n }\n}\n\n// Layout routes bundled at build time (sorted by depth, root first)\nconst layoutRoutes = [${layoutRegistrations.join(\",\")}\n];\n\nconst routeSlots = [${routeSlotRegistrations.join(\",\")}\n];\n\n// Route-level error boundaries bundled at build time.\nconst errorRoutes = [${errorRegistrations.join(\",\")}\n];\n\n// Metadata image routes bundled at build time\nconst metadataImageRoutes = [${metadataImageRegistrations.join(\",\")}\n];\n\n// Redirect routes bundled at build time\nconst redirectRoutes = ${JSON.stringify(redirectRoutes, null, 2)};\n\n// Legacy rewrites() entries resolved at build time for standalone parity.\nconst configuredRewriteRoutes = ${JSON.stringify(configuredRewriteRoutes, null, 2)};\n\n// Legacy headers() entries resolved at build time for standalone parity.\nconst configuredHeaderRoutes = ${JSON.stringify(configuredHeaderRoutes, null, 2)};\n\nfunction getFarmI18nSnapshot() {\n return ${config.i18n.enabled ? \"getFarmI18nClientSnapshot()\" : \"undefined\"};\n}\n\nfunction getFarmRoutePathname(pathname) {\n return farmI18nRuntime\n ? stripFarmLocaleFromPathname(pathname, farmI18nConfig)\n : pathname;\n}\n\nfunction serializeFarmInlineValue(value) {\n return JSON.stringify(value)\n .replace(/</g, \"\\\\\\\\u003c\")\n .replace(/\\\\u2028/g, \"\\\\\\\\u2028\")\n .replace(/\\\\u2029/g, \"\\\\\\\\u2029\");\n}\n\nfunction renderFarmClientBootstrapScript(canonicalPath, selectedRouteSlots, pageProps) {\n const integrationManifest = ${\n hasRuntimeIntegrationConfig ? \"getRegisteredIntegrationAPIManifest()\" : \"{}\"\n };\n const serializedRouteSlots = serializeFarmInlineValue(selectedRouteSlots || []);\n const serializedPageProps = serializeFarmInlineValue(pageProps || {});\n let source = 'window.__FARM_PROPS__=' + serializedPageProps +\n ';window.__FARM_INTEGRATION_API_MANIFEST__=' +\n serializeFarmInlineValue(integrationManifest) +\n ';window.__FARM_ROUTE_SLOTS__=' + serializedRouteSlots + ';';\n if (typeof canonicalPath === \"string\" && canonicalPath.startsWith(\"/\")) {\n const serializedPath = serializeFarmInlineValue(canonicalPath);\n source += 'if(location.pathname+location.search!==' + serializedPath + '){' +\n 'history.replaceState(Object.assign({},history.state||{},{path:' + serializedPath + '}),\"\",' +\n serializedPath + ');}';\n }\n return '<script id=\"__farm_route_slots_data__\" type=\"application/json\">' +\n serializedRouteSlots +\n '</script><script>' + source + '</script>';\n}\n\nfunction escapeFarmHtmlAttribute(value) {\n return String(value)\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nasync function renderFarmElement(ReactDOMServer, element) {\n const streamErrors = [];\n const encoder = new TextEncoder();\n const decoder = new TextDecoder();\n const normalizeChunk = function(chunk) {\n if (typeof chunk === \"string\") return encoder.encode(chunk);\n if (chunk instanceof Uint8Array) return chunk;\n return new Uint8Array(chunk);\n };\n const decodeChunks = function(chunks) {\n let html = \"\";\n for (const chunk of chunks) {\n html += decoder.decode(chunk, { stream: true });\n }\n return html + decoder.decode();\n };\n const throwStreamError = function() {\n if (streamErrors.length > 0) throw streamErrors[0];\n };\n\n if (typeof ReactDOMServer.renderToReadableStream === \"function\") {\n const stream = await ReactDOMServer.renderToReadableStream(element, {\n onError(error) {\n streamErrors.push(error);\n console.error(\"[Farm SSR stream]\", error);\n },\n });\n const reader = stream.getReader();\n const firstResult = await reader.read();\n if (firstResult.done) {\n throwStreamError();\n return { html: \"\", shellHtml: \"\", streamErrors };\n }\n\n const firstChunk = normalizeChunk(firstResult.value);\n let allReady = false;\n const allReadyPromise = stream.allReady;\n if (allReadyPromise && typeof allReadyPromise.then === \"function\") {\n Promise.resolve(allReadyPromise).then(\n function() {\n allReady = true;\n },\n function() {},\n );\n // React resolves allReady in the same turn for a synchronous tree. A\n // suspended tree remains pending, so its already-produced shell can be\n // returned without rendering the element a second time.\n await Promise.resolve();\n }\n\n if (allReady) {\n const chunks = [firstChunk];\n while (true) {\n const result = await reader.read();\n if (result.done) break;\n chunks.push(normalizeChunk(result.value));\n }\n throwStreamError();\n const html = decodeChunks(chunks);\n return { html, shellHtml: html, streamErrors };\n }\n\n let replayFirstChunk = true;\n const replayStream = new ReadableStream({\n pull(controller) {\n if (replayFirstChunk) {\n replayFirstChunk = false;\n controller.enqueue(firstChunk);\n return;\n }\n return reader.read().then(\n function(result) {\n if (result.done) controller.close();\n else controller.enqueue(normalizeChunk(result.value));\n },\n function(error) {\n controller.error(error);\n },\n );\n },\n cancel(reason) {\n return reader.cancel(reason);\n },\n });\n return {\n stream: replayStream,\n shellHtml: new TextDecoder().decode(firstChunk),\n streamErrors,\n };\n }\n\n if (typeof ReactDOMServer.renderToPipeableStream === \"function\") {\n let pipeableStream;\n let streamController;\n let streamClosed = false;\n let streamStarted = false;\n let allReady = false;\n let decisionState = \"pending\";\n let settleDecision;\n let rejectDecision;\n let settleComplete;\n let rejectComplete;\n const chunks = [];\n const decision = new Promise(function(resolve, reject) {\n settleDecision = resolve;\n rejectDecision = reject;\n });\n const complete = new Promise(function(resolve, reject) {\n settleComplete = resolve;\n rejectComplete = reject;\n });\n const stream = new ReadableStream({\n start(controller) {\n streamController = controller;\n },\n cancel(reason) {\n if (pipeableStream && typeof pipeableStream.abort === \"function\") {\n pipeableStream.abort(reason);\n }\n },\n });\n const fail = function(error) {\n if (!streamClosed) {\n streamClosed = true;\n if (decisionState === \"stream\") streamController.error(error);\n }\n if (decisionState === \"complete\") rejectComplete(error);\n else if (decisionState === \"pending\") rejectDecision(error);\n };\n const destination = {\n write(chunk) {\n if (streamClosed) return false;\n const normalized = normalizeChunk(chunk);\n if (streamStarted) streamController.enqueue(normalized);\n else chunks.push(normalized);\n return true;\n },\n end() {\n if (streamClosed) return;\n streamClosed = true;\n if (streamStarted) streamController.close();\n settleComplete();\n },\n on() {\n return destination;\n },\n destroy(error) {\n fail(error || new Error(\"React server render stream was destroyed\"));\n },\n };\n pipeableStream = ReactDOMServer.renderToPipeableStream(element, {\n onShellReady() {\n try {\n pipeableStream.pipe(destination);\n queueMicrotask(function() {\n decisionState = allReady ? \"complete\" : \"stream\";\n settleDecision(decisionState);\n });\n } catch (error) {\n fail(error);\n }\n },\n onAllReady() {\n allReady = true;\n },\n onShellError: fail,\n onError(error) {\n streamErrors.push(error);\n console.error(\"[Farm SSR stream]\", error);\n },\n });\n\n if ((await decision) === \"complete\") {\n await complete;\n throwStreamError();\n const html = decodeChunks(chunks);\n return { html, shellHtml: html, streamErrors };\n }\n\n streamStarted = true;\n for (const chunk of chunks) streamController.enqueue(chunk);\n if (streamClosed) streamController.close();\n return {\n stream,\n shellHtml: chunks.length > 0 ? new TextDecoder().decode(chunks[0]) : \"\",\n streamErrors,\n };\n }\n\n const html = ReactDOMServer.renderToString(element);\n return { html, shellHtml: html, streamErrors };\n}\n\nasync function renderFarmElementToString(ReactDOMServer, element) {\n const rendered = await renderFarmElement(ReactDOMServer, element);\n if (rendered.html !== undefined) return rendered.html;\n const html = await new Response(rendered.stream).text();\n if (rendered.streamErrors.length > 0) throw rendered.streamErrors[0];\n return html;\n}\n\nfunction createFarmDocumentStream(contentStream, prefix, suffix, onComplete) {\n const encoder = new TextEncoder();\n const reader = contentStream.getReader();\n return new ReadableStream({\n start(controller) {\n controller.enqueue(encoder.encode(prefix));\n },\n async pull(controller) {\n try {\n const result = await reader.read();\n if (result.done) {\n controller.enqueue(encoder.encode(suffix));\n if (onComplete) onComplete();\n controller.close();\n return;\n }\n controller.enqueue(result.value);\n } catch (error) {\n controller.error(error);\n }\n },\n cancel(reason) {\n return reader.cancel(reason);\n },\n });\n}\n\nfunction createFarmErrorDocument(html, title) {\n const escapedTitle = escapeFarmHtmlAttribute(title || \"Application Error\");\n const trimmedHtml = html.trim();\n const hasFullDocument = trimmedHtml.startsWith(\"<html\") ||\n trimmedHtml.startsWith(\"<!DOCTYPE\");\n\n if (!hasFullDocument) {\n return '<!DOCTYPE html>\\\\n<html lang=\"en\">\\\\n<head>\\\\n' +\n ' <meta charset=\"utf-8\">\\\\n' +\n ' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\\\\n' +\n ' <link rel=\"icon\" href=\"data:,\">\\\\n' +\n ' <title>' + escapedTitle + '</title>\\\\n' +\n ' <link rel=\"stylesheet\" href=\"/farm-client.css\">\\\\n' +\n '</head>\\\\n<body>\\\\n' +\n ' <div id=\"root\">' + html + '</div>\\\\n' +\n ' ' + renderFarmClientBootstrapScript() + '\\\\n' +\n ' <script type=\"module\" src=\"/farm-client.js\"></script>\\\\n' +\n '</body>\\\\n</html>';\n }\n\n let fullHtml = html;\n if (!/\\\\sid=[\"']root[\"']/.test(fullHtml)) {\n fullHtml = fullHtml\n .replace(/<body([^>]*)>/i, '<body$1><div id=\"root\">')\n .replace(/<\\\\/body>/i, '</div></body>');\n }\n fullHtml = fullHtml\n .replace(/<head([^>]*)>/i, '<head$1>\\\\n <link rel=\"stylesheet\" href=\"/farm-client.css\">')\n .replace(/<head([^>]*)>([\\\\s\\\\S]*?)<\\\\/head>/i, function(match, attrs, headContent) {\n return headContent.includes(\"<title\")\n ? match\n : '<head' + attrs + '>' + headContent + '\\\\n <title>' + escapedTitle + '</title>\\\\n</head>';\n })\n .replace(\n /<\\\\/body>/i,\n ' ' + renderFarmClientBootstrapScript() + '\\\\n' +\n ' <script type=\"module\" src=\"/farm-client.js\"></script>\\\\n</body>',\n );\n return fullHtml.trim().startsWith(\"<!DOCTYPE\")\n ? fullHtml\n : \"<!DOCTYPE html>\\\\n\" + fullHtml;\n}\n\nfunction renderFarmI18nAlternateLinks(requestPath, snapshot) {\n if (!snapshot || snapshot.routing === \"none\") return \"\";\n const url = new URL(requestPath, \"http://farm.local\");\n const routePathname = stripFarmLocaleFromPathname(url.pathname, snapshot);\n const links = snapshot.locales.map(function(locale) {\n const href = localizeFarmPathname(routePathname, locale, snapshot);\n return '<link rel=\"alternate\" hreflang=\"' + escapeFarmHtmlAttribute(locale) +\n '\" href=\"' + escapeFarmHtmlAttribute(href) + '\">';\n });\n links.push(\n '<link rel=\"alternate\" hreflang=\"x-default\" href=\"' +\n escapeFarmHtmlAttribute(\n localizeFarmPathname(routePathname, snapshot.defaultLocale, snapshot)\n ) +\n '\">'\n );\n return links.join(\"\");\n}\n\nfunction applyFarmI18nDocument(html, requestPath, snapshot) {\n if (!snapshot) return html;\n const locale = escapeFarmHtmlAttribute(snapshot.locale);\n const direction = escapeFarmHtmlAttribute(snapshot.direction);\n let nextHtml = html.replace(/<html([^>]*)>/i, function(_match, attributes) {\n const cleaned = attributes.replace(\n /\\\\s+(?:lang|dir)=(?:\"[^\"]*\"|'[^']*'|[^\\\\s>]+)/gi,\n \"\"\n );\n return '<html' + cleaned + ' lang=\"' + locale + '\" dir=\"' + direction + '\">';\n });\n const runtimeMarkup =\n renderFarmI18nAlternateLinks(requestPath, snapshot) +\n '<script>window.__FARM_I18N__ = ' + serializeFarmInlineValue(snapshot) + ';</script>';\n nextHtml = nextHtml.replace(/<head([^>]*)>/i, '<head$1>' + runtimeMarkup);\n return nextHtml;\n}\n\nfunction appendFarmVary(headers, value) {\n const existing = headers.get(\"Vary\");\n const values = new Set(\n (existing ? existing.split(\",\") : []).map(function(entry) { return entry.trim(); }).filter(Boolean)\n );\n values.add(value);\n headers.set(\"Vary\", Array.from(values).join(\", \"));\n}\n\nfunction applyFarmI18nResponse(response, resolution) {\n if (!farmI18nRuntime || !resolution) return response;\n const headers = new Headers(response.headers);\n if (resolution.persist) {\n headers.append(\"Set-Cookie\", createFarmLocaleCookie(resolution.locale, farmI18nConfig));\n }\n const varyHeaders = getFarmLocaleVaryHeaders(farmI18nConfig, resolution);\n for (const header of varyHeaders) appendFarmVary(headers, header);\n if (varyHeaders.length > 0) {\n headers.set(\"Cache-Control\", \"private, no-store\");\n }\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nfunction hasOnlyValidFarmLocaleCookie(cookieHeader) {\n if (!farmI18nRuntime || !cookieHeader) return false;\n const parts = cookieHeader.split(\";\");\n if (parts.length !== 1) return false;\n\n const cookie = parts[0].trim();\n const separator = cookie.indexOf(\"=\");\n if (separator <= 0) return false;\n\n let name;\n let value;\n try {\n name = decodeURIComponent(cookie.slice(0, separator).trim());\n value = decodeURIComponent(cookie.slice(separator + 1).trim());\n } catch {\n return false;\n }\n\n return (\n name === farmI18nConfig.cookie.name &&\n farmI18nConfig.locales.includes(value)\n );\n}\n\nfunction hasPrivateFarmRequestHeaders(request, farmLocaleResolution) {\n if (request.headers.get(\"authorization\")) return true;\n const cookieHeader = request.headers.get(\"cookie\");\n if (!cookieHeader) return false;\n\n return !(\n farmLocaleResolution?.source === \"url\" &&\n hasOnlyValidFarmLocaleCookie(cookieHeader)\n );\n}\n\nfunction normalizeRuntimePath(pathname) {\n if (!pathname || pathname === \"/\") return \"/\";\n return pathname.endsWith(\"/\") ? pathname.replace(/\\\\/+$/, \"\") : pathname;\n}\n\nfunction splitRuntimePath(pathname) {\n return normalizeRuntimePath(pathname).split(\"/\").filter(Boolean);\n}\n\nconst farmCatchAllParamSegments = Symbol(\"farm.catch-all-param-segments\");\n\nfunction matchRuntimePathPattern(pattern, pathname) {\n const patternSegments = splitRuntimePath(pattern);\n const pathnameSegments = splitRuntimePath(pathname);\n const params = {};\n const catchAllParamSegments = {};\n Object.defineProperty(params, farmCatchAllParamSegments, {\n value: catchAllParamSegments,\n });\n let pathIndex = 0;\n\n for (const segment of patternSegments) {\n const optionalCatchAll = segment.match(/^\\\\[\\\\[\\\\.\\\\.\\\\.(.+)\\\\]\\\\]$/);\n const catchAll = segment.match(/^\\\\[\\\\.\\\\.\\\\.(.+)\\\\]$/);\n const dynamic = segment.match(/^\\\\[(.+)\\\\]$/);\n const namedCatchAll = segment.match(/^:([^/]+)\\\\*$/);\n const namedDynamic = segment.match(/^:([^/]+)$/);\n const starCatchAll = segment.match(/^\\\\*([^?]+)(\\\\?)?$/);\n const wildcard = segment === \"*\";\n\n if (optionalCatchAll || catchAll || namedCatchAll || starCatchAll || wildcard) {\n const name = wildcard\n ? \"wildcard\"\n : (optionalCatchAll || catchAll || namedCatchAll || starCatchAll)[1];\n const remainingSegments = pathnameSegments.slice(pathIndex).map(decodeURIComponent);\n const remaining = remainingSegments.join(\"/\");\n if (!remaining && (catchAll || (starCatchAll && !starCatchAll[2]))) return null;\n params[name] = remaining;\n catchAllParamSegments[name] = remainingSegments;\n pathIndex = pathnameSegments.length;\n continue;\n }\n\n const pathnameSegment = pathnameSegments[pathIndex];\n if (pathnameSegment === undefined) return null;\n\n if (dynamic || namedDynamic) {\n params[(dynamic || namedDynamic)[1]] = decodeURIComponent(pathnameSegment);\n pathIndex++;\n continue;\n }\n\n if (segment !== pathnameSegment) return null;\n pathIndex++;\n }\n\n return pathIndex === pathnameSegments.length ? params : null;\n}\n\nfunction getMatchingErrorBoundary(pathname) {\n const pathSegments = splitRuntimePath(pathname);\n let bestMatch = null;\n\n for (const errorRoute of errorRoutes) {\n const patternDepth = splitRuntimePath(errorRoute.pattern).length;\n if (patternDepth > pathSegments.length) continue;\n const candidatePath = patternDepth === 0\n ? \"/\"\n : \"/\" + pathSegments.slice(0, patternDepth).join(\"/\");\n const params = matchRuntimePathPattern(errorRoute.pattern, candidatePath);\n if (params === null) continue;\n\n if (!bestMatch || patternDepth > bestMatch.depth) {\n bestMatch = { route: errorRoute, params, depth: patternDepth };\n }\n }\n\n return bestMatch;\n}\n\nfunction getMatchingMetadataImage(pathname, kind) {\n const pathSegments = splitRuntimePath(pathname);\n let bestMatch = null;\n\n for (const image of metadataImageRoutes) {\n if (image.kind !== kind) continue;\n const patternDepth = splitRuntimePath(image.pattern).length;\n if (patternDepth > pathSegments.length) continue;\n\n const pagePath = patternDepth === 0\n ? \"/\"\n : \"/\" + pathSegments.slice(0, patternDepth).join(\"/\");\n const params = matchRuntimePathPattern(image.pattern, pagePath);\n if (params === null) continue;\n\n if (!bestMatch || patternDepth > bestMatch.depth) {\n bestMatch = { image, params, pagePath, depth: patternDepth };\n }\n }\n\n return bestMatch;\n}\n\nfunction matchMetadataImageRequest(pathname) {\n const normalizedPath = normalizeRuntimePath(pathname);\n let kind;\n let fileName;\n\n if (normalizedPath === \"/opengraph-image\" || normalizedPath.endsWith(\"/opengraph-image\")) {\n kind = \"opengraph\";\n fileName = \"opengraph-image\";\n } else if (normalizedPath === \"/twitter-image\" || normalizedPath.endsWith(\"/twitter-image\")) {\n kind = \"twitter\";\n fileName = \"twitter-image\";\n } else {\n return null;\n }\n\n const pagePath = normalizedPath.slice(0, -fileName.length - 1) || \"/\";\n for (const image of metadataImageRoutes) {\n if (image.kind !== kind) continue;\n const params = matchRuntimePathPattern(image.pattern, pagePath);\n if (params !== null) return { image, params, pagePath };\n }\n\n return null;\n}\n\nfunction createMetadataImageReference(match, locale) {\n const image = match.image;\n const metadata = image.sourceType === \"static\" ? image.staticInfo : image.module;\n const basePath = match.pagePath === \"/\" ? \"\" : match.pagePath;\n const version = image.sourceType === \"static\" ? \"?v=\" + image.staticInfo.hash : \"\";\n const href = basePath + \"/\" + image.fileName + version;\n\n return {\n kind: image.kind,\n href: locale ? localizeFarmHref(href, locale, farmI18nConfig) : href,\n width: metadata?.width ?? metadata?.size?.width,\n height: metadata?.height ?? metadata?.size?.height,\n alt: metadata?.alt,\n contentType: metadata?.contentType,\n };\n}\n\nfunction decodeMetadataImage(data) {\n const binary = atob(data);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nasync function handleMetadataImageRequest(request, routePathname) {\n const url = new URL(request.url);\n const match = matchMetadataImageRequest(routePathname || url.pathname);\n if (!match) return null;\n\n const method = request.method.toUpperCase();\n if (method !== \"GET\" && method !== \"HEAD\") {\n return new Response(null, { status: 405, headers: { Allow: \"GET, HEAD\" } });\n }\n\n const image = match.image;\n if (image.sourceType === \"static\") {\n const etag = '\"' + image.staticInfo.hash + '\"';\n const isVersioned = url.searchParams.get(\"v\") === image.staticInfo.hash;\n const headers = new Headers({\n \"Content-Type\": image.staticInfo.contentType,\n \"Content-Length\": String(image.staticInfo.byteLength),\n \"Cache-Control\": isVersioned\n ? \"public, max-age=31536000, immutable\"\n : \"public, max-age=0, must-revalidate\",\n \"ETag\": etag,\n \"X-Content-Type-Options\": \"nosniff\",\n });\n\n if (request.headers.get(\"if-none-match\") === etag) {\n return new Response(null, { status: 304, headers });\n }\n\n if (!image.bytes) image.bytes = decodeMetadataImage(image.data);\n return new Response(method === \"HEAD\" ? null : image.bytes, { status: 200, headers });\n }\n\n try {\n const imageModule = image.module;\n if (!imageModule?.default) {\n throw new Error(\"Metadata image module does not export a default component or handler\");\n }\n\n const searchParams = Object.fromEntries(url.searchParams.entries());\n const props = {\n params: match.params,\n searchParams: Promise.resolve(searchParams),\n path: match.pagePath,\n };\n const value = typeof imageModule.default === \"function\"\n ? await imageModule.default(props)\n : imageModule.default;\n\n if (value instanceof Response) {\n return method === \"HEAD\"\n ? new Response(null, { status: value.status, headers: value.headers })\n : value;\n }\n\n let body;\n if (typeof value === \"string\" || value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n body = value;\n } else {\n if (!React.isValidElement(value)) {\n throw new Error(\"Metadata image must return a Response, string, bytes, or React element\");\n }\n body = ReactDOMServer.renderToStaticMarkup(value);\n }\n\n return new Response(method === \"HEAD\" ? null : body, {\n status: 200,\n headers: {\n \"Content-Type\": imageModule.contentType || \"image/svg+xml; charset=utf-8\",\n \"Cache-Control\": \"public, max-age=0, must-revalidate\",\n \"X-Content-Type-Options\": \"nosniff\",\n },\n });\n } catch (error) {\n console.error(\"Metadata image render failed:\", error);\n return new Response(\"Internal Server Error\", {\n status: 500,\n headers: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n });\n }\n}\n\nfunction encodeRuntimePathSegment(value) {\n return encodeURIComponent(String(value)).replace(\n /[!'()*]/g,\n function(character) {\n return \"%\" + character.charCodeAt(0).toString(16).toUpperCase();\n },\n );\n}\n\nfunction interpolateRedirectDestination(destination, params) {\n let result = destination;\n const catchAllParamSegments = params[farmCatchAllParamSegments] || {};\n for (const [key, value] of Object.entries(params)) {\n const segments = catchAllParamSegments[key];\n const encodedValue = Array.isArray(segments)\n ? segments.map(encodeRuntimePathSegment).join(\"/\")\n : encodeRuntimePathSegment(value);\n result = result.split(\"[[...\" + key + \"]]\").join(encodedValue);\n result = result.split(\"[...\" + key + \"]\").join(encodedValue);\n result = result.split(\"[\" + key + \"]\").join(encodedValue);\n result = result.split(\":\" + key + \"*\").join(encodedValue);\n result = result.split(\":\" + key).join(encodedValue);\n if (key === \"wildcard\") result = result.split(\"*\").join(encodedValue);\n }\n return result;\n}\n\nfunction matchRedirectRoute(pathname, locale) {\n for (const redirect of redirectRoutes) {\n const params = matchRuntimePathPattern(redirect.source, pathname);\n if (!params) continue;\n const destination = interpolateRedirectDestination(redirect.destination, params);\n return {\n destination:\n locale && destination.startsWith(\"/\") && !destination.startsWith(\"//\")\n ? localizeFarmHref(destination, locale, farmI18nConfig)\n : destination,\n statusCode: redirect.statusCode || (redirect.permanent ? 308 : 307),\n };\n }\n return null;\n}\n\nfunction matchRewriteRoute(pathname, locale) {\n for (const rewrite of configuredRewriteRoutes) {\n const params = matchRuntimePathPattern(rewrite.source, pathname);\n if (!params) continue;\n const destination = interpolateRedirectDestination(rewrite.destination, params);\n return locale && destination.startsWith(\"/\") && !destination.startsWith(\"//\")\n ? localizeFarmHref(destination, locale, farmI18nConfig)\n : destination;\n }\n return null;\n}\n\nfunction createRewrittenRequest(request, destination) {\n const sourceUrl = new URL(request.url);\n const destinationUrl = new URL(destination, sourceUrl);\n if (!destinationUrl.search && sourceUrl.search) {\n destinationUrl.search = sourceUrl.search;\n }\n return new Request(destinationUrl, request);\n}\n\nfunction applyConfiguredResponseHeaders(response, pathname) {\n let headers;\n for (const headerRoute of configuredHeaderRoutes) {\n if (!matchRuntimePathPattern(headerRoute.source, pathname)) continue;\n for (const header of headerRoute.headers) {\n if ((headers || response.headers).get(header.key) === header.value) continue;\n if (!headers) headers = new Headers(response.headers);\n headers.set(header.key, header.value);\n }\n }\n\n if (!headers) return response;\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\n// App middleware files bundled at build time (sorted by depth, root first)\nconst fileMiddlewareModules = [${middlewareRegistrations.join(\",\")}\n];\n\nconst farmMiddlewareRunner = ${\n hasMiddlewareRuntime\n ? `createProductionMiddlewareRunner({\n config: farmUserConfig?.middleware,\n modules: fileMiddlewareModules,\n i18n: farmI18nConfig,\n})`\n : \"null\"\n };\n\n${apiHandlerCode}\n\nfunction matchLocalIntegrationRequest(request) {\n ${\n hasServerRuntimeIntegrations\n ? `return matchIntegrationRoute(serverRuntimeIntegrations, {\n pathname: new URL(request.url).pathname,\n method: request.method,\n });`\n : \"return null;\"\n }\n}\n\nasync function handleIntegrationRequest(request) {\n const matchedIntegrationRoute = matchLocalIntegrationRequest(request);\n if (!matchedIntegrationRoute) {\n return null;\n }\n\n ${\n hasServerRuntimeIntegrations\n ? `\n return dispatchIntegrationRequest(\n {\n integration: matchedIntegrationRoute.integration,\n config: integrationRuntimeConfig,\n isDev: false,\n isProd: true,\n },\n request,\n );`\n : \"return null;\"\n }\n}\n\n/**\n * Match URL to page route pattern\n */\nfunction matchPageRoute(pathname) {\n const exactRoute = exactPageRoutes.get(normalizeRuntimePath(pathname));\n if (exactRoute) return { route: exactRoute, params: {} };\n\n for (const route of patternPageRoutes) {\n const params = matchRuntimePathPattern(route.pattern, pathname);\n if (params !== null) return { route, params };\n }\n return null;\n}\n\nfunction matchesRoutePrefix(pathname, pattern) {\n if (pattern === \"/\") return true;\n const pathSegments = normalizeRuntimePath(pathname).split(\"/\").filter(Boolean);\n const patternSegments = normalizeRuntimePath(pattern).split(\"/\").filter(Boolean);\n if (patternSegments.length > pathSegments.length) return false;\n const candidate = \"/\" + pathSegments.slice(0, patternSegments.length).join(\"/\");\n return matchRuntimePathPattern(pattern, candidate) !== null;\n}\n\nfunction routeSlotSpecificity(slot) {\n return slot.pattern.split(\"/\").reduce(function(score, segment) {\n if (!segment) return score;\n if (segment.startsWith(\"[[...\")) return score + 1;\n if (segment.startsWith(\"[...\")) return score + 2;\n if (segment.startsWith(\"[\")) return score + 3;\n return score + 10;\n }, 0);\n}\n\nfunction matchRouteSlots(pathname, interceptFrom) {\n const groups = new Map();\n for (const slot of routeSlots) {\n if (!matchesRoutePrefix(pathname, slot.ownerPattern)) continue;\n const key = slot.ownerPattern + \":\" + slot.name;\n const entries = groups.get(key) || [];\n entries.push(slot);\n groups.set(key, entries);\n }\n\n const normalizedFrom =\n typeof interceptFrom === \"string\" && interceptFrom.startsWith(\"/\")\n ? new URL(interceptFrom, \"http://farm.local\").pathname\n : null;\n const matches = [];\n\n for (const entries of groups.values()) {\n const candidates = entries\n .filter(function(entry) { return !entry.fallback; })\n .filter(function(entry) {\n return !entry.interception ||\n (normalizedFrom && matchesRoutePrefix(normalizedFrom, entry.ownerPattern));\n })\n .map(function(entry) {\n return {\n entry: entry,\n params: matchRuntimePathPattern(entry.pattern, pathname),\n };\n })\n .filter(function(candidate) { return candidate.params !== null; })\n .sort(function(left, right) {\n if (left.entry.interception !== right.entry.interception) {\n return left.entry.interception ? -1 : 1;\n }\n return routeSlotSpecificity(right.entry) - routeSlotSpecificity(left.entry);\n });\n\n if (candidates[0]) {\n matches.push({ ...candidates[0].entry, params: candidates[0].params });\n continue;\n }\n\n const fallback = entries.find(function(entry) { return entry.fallback; });\n if (fallback) matches.push({ ...fallback, params: {} });\n }\n\n return matches.sort(function(left, right) {\n const ownerDepth =\n left.ownerPattern.split(\"/\").filter(Boolean).length -\n right.ownerPattern.split(\"/\").filter(Boolean).length;\n return ownerDepth || left.name.localeCompare(right.name);\n });\n}\n\nfunction hasLocalRequestRoute(request, routePathname) {\n const pathname = new URL(request.url).pathname;\n if (matchLocalAPIRequest(request) || matchLocalIntegrationRequest(request)) {\n return true;\n }\n if (matchPageRoute(routePathname) || matchMetadataImageRequest(routePathname)) {\n return true;\n }\n if (${imageRuntime === \"none\" ? \"false\" : `pathname === ${JSON.stringify(config.images.path)}`}) {\n return true;\n }\n ${\n config.docs?.enabled\n ? `const docsPath = normalizeRuntimePath(farmDocsResolvedConfig?.entry || \"/docs\");\n if (\n isFarmDocsAPIRequest(pathname) ||\n docsPath === \"/\" ||\n pathname === docsPath ||\n pathname.startsWith(docsPath + \"/\")\n ) {\n return true;\n }`\n : \"\"\n }\n return false;\n}\n\nfunction getFarmPluginRequestOptions(request) {\n const url = new URL(request.url);\n const pathname = url.pathname;\n const routePathname = getFarmRoutePathname(pathname);\n const route = { pathname };\n const isDocsAPIRequest = ${config.docs?.enabled ? \"isFarmDocsAPIRequest(pathname)\" : \"false\"};\n const integrationMatch = ${\n hasServerRuntimeIntegrations\n ? `matchIntegrationRoute(serverRuntimeIntegrations, {\n pathname,\n method: request.method,\n })`\n : \"null\"\n };\n\n if (integrationMatch) {\n return {\n kind: \"integration\",\n route: {\n ...route,\n pattern: integrationMatch.route.path,\n params: integrationMatch.params,\n },\n };\n }\n\n const docsPath = normalizeRuntimePath(farmDocsResolvedConfig?.entry || \"/docs\");\n if (\n isDocsAPIRequest ||\n (farmDocsHandler && (pathname === docsPath || pathname.startsWith(docsPath + \"/\")))\n ) {\n return { kind: \"docs\", route: { ...route, pattern: docsPath } };\n }\n\n for (const apiRoute of apiRoutes) {\n const params = matchRuntimePathPattern(apiRoute.path, pathname);\n if (params !== null) {\n return {\n kind: \"api\",\n route: { ...route, pattern: apiRoute.path, params },\n };\n }\n }\n\n const metadataImageMatch = matchMetadataImageRequest(routePathname);\n if (metadataImageMatch) {\n return {\n kind: \"asset\",\n route: {\n ...route,\n pattern: metadataImageMatch.image.pattern,\n params: metadataImageMatch.params,\n },\n };\n }\n\n const pageMatch = matchPageRoute(routePathname);\n if (pageMatch) {\n return {\n kind: \"page\",\n route: {\n ...route,\n pattern: pageMatch.route.pattern,\n params: pageMatch.params,\n },\n };\n }\n\n if (pathname.startsWith(\"/api/\")) {\n return { kind: \"api\", route };\n }\n\n if (request.method === \"GET\" || request.method === \"HEAD\") {\n return { kind: \"page\", route };\n }\n\n return { kind: \"request\", route };\n}\n\n/**\n * Get applicable layouts for a page path (from root to most specific)\n */\nfunction getApplicableLayouts(pathname) {\n const applicable = [];\n const normalizedPath = pathname.replace(/\\\\/$/, '') || '/';\n \n for (const layout of layoutRoutes) {\n // Root layout (/) applies to everything\n // Other layouts apply to their path and sub-paths\n if (layout.pattern === '/' || \n normalizedPath === layout.pattern || \n normalizedPath.startsWith(layout.pattern + '/')) {\n applicable.push(layout);\n }\n }\n \n // Sort by depth (root first, then nested)\n applicable.sort((a, b) => {\n const depthA = a.pattern.split('/').filter(Boolean).length;\n const depthB = b.pattern.split('/').filter(Boolean).length;\n return depthA - depthB;\n });\n \n return applicable;\n}\n\nconst pprShellCache = getFarmDataCache();\n\nfunction resolvePPRConfig(routeModule) {\n if (!routeModule || routeModule.dynamic === \"force-dynamic\") {\n return { enabled: false };\n }\n\n if (routeModule.dynamic === \"force-static\" || routeModule.dynamic === \"error\") {\n return { enabled: false };\n }\n\n const enabled = routeModule.ppr === true || routeModule.experimental_ppr === true;\n const revalidate =\n typeof routeModule.revalidate === \"number\" && routeModule.revalidate > 0\n ? routeModule.revalidate\n : undefined;\n\n return { enabled, revalidate };\n}\n\nfunction getPPRShellBypassReason(request, middlewareData, middlewareContext) {\n const method = request.method.toUpperCase();\n if (method !== \"GET\" && method !== \"HEAD\") return \"method\";\n if (request.headers.get(\"cookie\")) return \"cookie\";\n if (request.headers.get(\"authorization\")) return \"authorization\";\n if (request.headers.get(\"x-farm-intercept-from\")) return \"route-interception\";\n if (request.headers.get(\"x-farm-ppr-refresh\")) return \"refresh\";\n if (hasConfiguredRouteContext) return \"route-context\";\n if (middlewareData?.size) return \"middleware-data\";\n if (middlewareContext?.size) return \"middleware-context\";\n return undefined;\n}\n\nfunction getPPRShellCacheKey(url, locale) {\n return createFarmCacheKey([\n \"ppr\",\n locale || \"\",\n normalizeRevalidatePath(url.pathname),\n url.search,\n ]);\n}\n\nfunction getPPRHeaders(status, config) {\n const headers = {\n \"X-Farm-PPR\": status,\n };\n\n if (status === \"bypass\") {\n headers[\"Cache-Control\"] = \"private, no-store\";\n return headers;\n }\n\n if (typeof config.revalidate === \"number\" && config.revalidate > 0) {\n headers[\"Cache-Control\"] = \\`s-maxage=\\${config.revalidate}, stale-while-revalidate\\`;\n }\n\n return headers;\n}\n\nfunction getRouteSharedCacheControl(routeModule, pprCanCache) {\n if (!routeModule || routeModule.dynamic === \"force-dynamic\") {\n return null;\n }\n\n const isStaticRoute =\n routeModule.ssg === true ||\n routeModule.dynamic === \"force-static\" ||\n routeModule.dynamic === \"error\";\n if (!isStaticRoute && !pprCanCache) {\n return null;\n }\n\n const revalidate =\n typeof routeModule.revalidate === \"number\" && routeModule.revalidate > 0\n ? routeModule.revalidate\n : 60;\n return \"public, s-maxage=\" + revalidate + \", stale-while-revalidate=300\";\n}\n\nasync function getCachedPPRShell(cacheKey) {\n const entry = await pprShellCache.getEntryAsync(cacheKey);\n if (!entry) {\n return null;\n }\n\n return entry.value.html;\n}\n\n/**\n * Main request handler - created at runtime with bundled routes\n */\nasync function handleFarmRequest(request) {\n const response = await ${\n config.i18n.enabled\n ? `_runWithFarmI18nRequest(\n farmI18nRuntime,\n request,\n async function(farmLocaleResolution) {\n if (\n farmLocaleResolution.redirect &&\n (request.method === \"GET\" || request.method === \"HEAD\")\n ) {\n return applyFarmI18nResponse(\n new Response(null, {\n status: 307,\n headers: { Location: farmLocaleResolution.redirect },\n }),\n farmLocaleResolution\n );\n }\n const response = await handleFarmRequestInContext(request, farmLocaleResolution);\n return applyFarmI18nResponse(response, farmLocaleResolution);\n }\n )`\n : \"handleFarmRequestInContext(request, null)\"\n };\n ${\n config.md?.enabled\n ? `const pathname = getFarmRoutePathname(new URL(request.url).pathname);\n if (matchPageRoute(pathname)) {\n return applyMarkdownNegotiationHeaders(response, {\n config: farmMarkdownConfig,\n pathname,\n });\n }`\n : \"\"\n }\n return response;\n}\n\nasync function handleFarmRequestInContext(\n request,\n farmLocaleResolution,\n configuredRewriteApplied = false,\n requestStartTime = Date.now(),\n) {\n let url = new URL(request.url);\n let pathname = url.pathname;\n let routePathname = getFarmRoutePathname(pathname);\n\n // Redirects have precedence over local routes. Configured rewrites use\n // after-files semantics so emitted page, API, integration, docs, image, and\n // metadata routes keep their normal method/status handling. Internal rewrite\n // targets re-enter this handler so middleware and request-local state observe\n // the rewritten URL; external destinations are proxied transparently.\n if (!configuredRewriteApplied) {\n const redirectMatch = matchRedirectRoute(routePathname, farmLocaleResolution?.locale);\n if (redirectMatch) {\n return new Response(\"Redirecting to \" + redirectMatch.destination, {\n status: redirectMatch.statusCode,\n headers: { Location: redirectMatch.destination },\n });\n }\n\n if (\n configuredRewriteRoutes.length > 0 &&\n !hasLocalRequestRoute(request, routePathname)\n ) {\n const rewriteDestination = matchRewriteRoute(\n routePathname,\n farmLocaleResolution?.locale,\n );\n if (rewriteDestination) {\n const rewrittenRequest = createRewrittenRequest(request, rewriteDestination);\n if (new URL(rewrittenRequest.url).origin !== url.origin) {\n return globalThis.fetch(rewrittenRequest);\n }\n return _runWithCurrentRequest(rewrittenRequest, () =>\n handleFarmRequestInContext(\n rewrittenRequest,\n farmLocaleResolution,\n true,\n requestStartTime,\n )\n );\n }\n }\n }\n\n if (farmImageHandler && pathname === ${JSON.stringify(config.images.path)}) {\n const imageResponse = await farmImageHandler(request);\n if (imageResponse) {\n return imageResponse;\n }\n }\n\n ${\n hasServerRuntimeIntegrations\n ? `\n const integrationResponse = await handleIntegrationRequest(request.clone());\n if (integrationResponse) {\n return integrationResponse;\n }\n `\n : \"\"\n }\n\n ${\n config.docs?.enabled\n ? `\n if (farmDocsHandler) {\n const docsResponse = await farmDocsHandler(request.clone());\n if (docsResponse) {\n return docsResponse;\n }\n }\n `\n : \"\"\n }\n\n ${\n hasMarkdownPages\n ? `\n const markdownSourceResponse = await createFarmMarkdownSourceResponse?.({\n request: request.clone(),\n config: farmMdxConfig,\n resolveSource: (targetPathname) => {\n const match = matchPageRoute(getFarmRoutePathname(targetPathname));\n return match?.route?.markdownSource || null;\n },\n });\n if (markdownSourceResponse) {\n return markdownSourceResponse;\n }\n `\n : \"\"\n }\n\n ${\n config.md?.enabled\n ? `\n if (farmMarkdownConfig?.enabled) {\n const markdownResponse = await createMarkdownMirrorResponse({\n request: request.clone(),\n config: farmMarkdownConfig,\n routeExists: (targetPathname) =>\n Boolean(matchPageRoute(getFarmRoutePathname(targetPathname))),\n renderPage: (targetRequest) => handleFarmRequest(targetRequest),\n });\n if (markdownResponse) {\n return markdownResponse;\n }\n }\n `\n : \"\"\n }\n\n ${\n hasMiddlewareRuntime\n ? `\n const requestBeforeMiddleware = request;\n const middlewareResult = await farmMiddlewareRunner(request);\n if (middlewareResult.response) {\n return middlewareResult.response;\n }\n request = middlewareResult.request;\n const middlewareData = middlewareResult.data;\n const middlewareContext = middlewareResult.context;\n const middlewareHeaders = middlewareResult.headers;\n url = new URL(request.url);\n pathname = url.pathname;\n routePathname = getFarmRoutePathname(pathname);\n\n // Middleware may replace the Request when it rewrites a URL. Re-enter the\n // request store so pages, layouts, and route context observe that rewritten\n // request instead of the original outer-handler value.\n const runResolvedRequest = async () => {\n `\n : `\n const middlewareData = undefined;\n const middlewareContext = undefined;\n const middlewareHeaders = undefined;\n `\n }\n\n ${\n apiRoutes.length > 0\n ? `\n const apiResponse = await handleAPIRequest(request.clone());\n if (apiResponse) {\n return applyProductionMiddlewareHeaders(apiResponse, middlewareHeaders);\n }\n `\n : \"\"\n }\n\n ${\n metadataImageRoutes.length > 0\n ? `\n const metadataImageResponse = await handleMetadataImageRequest(\n request.clone(),\n routePathname\n );\n if (metadataImageResponse) {\n return applyProductionMiddlewareHeaders(metadataImageResponse, middlewareHeaders);\n }\n `\n : \"\"\n }\n\n // Preserve the explicit JSON 404 for /api/* misses.\n if (pathname.startsWith(\"/api/\")) {\n if (farmDocsAPIHandler) {\n const docsAPIResponse = await farmDocsAPIHandler(request.clone());\n if (docsAPIResponse) {\n return applyProductionMiddlewareHeaders(docsAPIResponse, middlewareHeaders);\n }\n }\n\n return applyProductionMiddlewareHeaders(new Response(\n JSON.stringify({ error: \"API route not found\", pathname }),\n { status: 404, headers: { \"Content-Type\": \"application/json\" } }\n ), middlewareHeaders);\n }\n\n // Handle page routes (SSR)\n emitFarmEvent({ type: \"render.start\", route: pathname, pathname });\n const matchedRoute = matchPageRoute(routePathname);\n if (matchedRoute) {\n const { route, params } = matchedRoute;\n emitFarmEvent({ type: \"route.matched\", pathname, route: route.pattern, params });\n \n try {\n const pprConfig = resolvePPRConfig(route.module);\n const pprBypassReason = pprConfig.enabled\n ? getPPRShellBypassReason(request, middlewareData, middlewareContext)\n : undefined;\n const pprCanCache = pprConfig.enabled && !pprBypassReason;\n const pprCacheKey = pprCanCache\n ? getPPRShellCacheKey(url, farmLocaleResolution?.locale)\n : null;\n if (pprConfig.enabled && pprBypassReason) {\n emitFarmEvent({ type: \"ppr.shell.bypass\", route: pathname, reason: pprBypassReason });\n emitFarmEvent({ type: \"cache.bypass\", route: pathname, reason: pprBypassReason });\n if (pprBypassReason === \"refresh\") {\n emitFarmEvent({ type: \"ppr.refresh.start\", route: pathname });\n }\n }\n if (pprCacheKey) {\n const cachedPPRShell = await getCachedPPRShell(pprCacheKey);\n if (cachedPPRShell) {\n emitFarmEvent({ type: \"ppr.shell.hit\", route: pathname, key: pprCacheKey });\n emitFarmEvent({\n type: \"render.complete\",\n route: pathname,\n pathname,\n status: 200,\n durationMs: Date.now() - requestStartTime,\n });\n return applyProductionMiddlewareHeaders(new Response(cachedPPRShell, {\n status: 200,\n headers: {\n \"Content-Type\": \"text/html; charset=utf-8\",\n ...getPPRHeaders(\"hit\", pprConfig),\n },\n }), middlewareHeaders);\n }\n emitFarmEvent({ type: \"ppr.shell.miss\", route: pathname, key: pprCacheKey });\n }\n\n // Get the page component and metadata\n let PageComponent = route.module.default;\n let pageStatus = 200;\n const pageMetadata = route.module.metadata || {};\n \n // Get applicable layouts for this page\n const applicableLayouts = getApplicableLayouts(routePathname);\n const selectedRouteSlots = matchRouteSlots(\n routePathname,\n request.headers.get(\"x-farm-intercept-from\"),\n );\n \n if (PageComponent) {\n // Parse search params - make it a resolved Promise for async components\n const searchParamsObj = Object.fromEntries(url.searchParams.entries());\n \n // Render the page component\n const routeContext = hasConfiguredRouteContext\n ? await resolveFarmRouteContext(farmResolvedRuntimeConfig, {\n request,\n params,\n search: searchParamsObj,\n path: pathname,\n })\n : undefined;\n const rawPageProps = withFarmRouteContext(\n {\n params,\n searchParams: Promise.resolve(searchParamsObj),\n path: pathname,\n ...(middlewareData?.size ? { middleware: { data: middlewareData } } : {}),\n },\n routeContext,\n );\n // Generated programmatic route modules consume app context from the\n // public context prop while source-created modules read the symbol\n // carrier above. Expose it only while resolving server route data.\n if (route.module.__farmResolveRouteProps && routeContext !== undefined) {\n Object.defineProperty(rawPageProps, \"context\", {\n value: routeContext,\n enumerable: true,\n configurable: true,\n });\n }\n let pageProps;\n try {\n // Resolve top-level route state before starting the HTTP stream so\n // redirects, notFound(), and failures keep their real status. Route\n // data may still contain explicit defer() values for nested Suspense.\n pageProps = route.module.__farmResolveRouteProps\n ? await route.module.__farmResolveRouteProps(rawPageProps)\n : (() => {\n const routeSchemas = route.module.__farmRouteParsesProps\n ? {}\n : route.module.__farmRouteSchemas || {};\n const parsedParams = routeSchemas.params?.parse\n ? routeSchemas.params.parse(params)\n : params;\n const parsedSearch = routeSchemas.search?.parse\n ? routeSchemas.search.parse(searchParamsObj)\n : searchParamsObj;\n return {\n ...rawPageProps,\n params: parsedParams,\n search: parsedSearch,\n searchParams: Promise.resolve(parsedSearch),\n };\n })();\n if (\n route.module.__farmResolveRouteProps &&\n routeContext !== undefined &&\n pageProps.context === routeContext\n ) {\n const { context: _routeContext, ...renderPageProps } = pageProps;\n pageProps = renderPageProps;\n }\n } catch (routeStateError) {\n if (isFarmRedirectError(routeStateError)) throw routeStateError;\n\n const routeComponents = route.module.__farmRouteComponents;\n const routeStateProps = {\n ...rawPageProps,\n search: searchParamsObj,\n searchParams: Promise.resolve(searchParamsObj),\n error: routeStateError,\n };\n if (isFarmNotFoundError(routeStateError) && routeComponents?.notFound) {\n pageStatus = 404;\n PageComponent = routeComponents.notFound;\n pageProps = routeStateProps;\n } else if (routeComponents?.error) {\n pageStatus = 500;\n PageComponent = routeComponents.error;\n pageProps = routeStateProps;\n } else {\n throw routeStateError;\n }\n }\n\n const renderedRouteSlots = await Promise.all(\n selectedRouteSlots.map(async function(slot) {\n const slotContext = hasConfiguredRouteContext\n ? await resolveFarmRouteContext(farmResolvedRuntimeConfig, {\n request,\n params: slot.params,\n search: searchParamsObj,\n path: pathname,\n })\n : undefined;\n const rawSlotProps = withFarmRouteContext(\n {\n params: slot.params,\n searchParams: Promise.resolve(searchParamsObj),\n path: pathname,\n ...(middlewareData?.size ? { middleware: { data: middlewareData } } : {}),\n },\n slotContext,\n );\n if (slot.module.__farmResolveRouteProps && slotContext !== undefined) {\n Object.defineProperty(rawSlotProps, \"context\", {\n value: slotContext,\n enumerable: true,\n configurable: true,\n });\n }\n\n const slotSchemas = slot.module.__farmRouteParsesProps\n ? {}\n : slot.module.__farmRouteSchemas || {};\n let slotProps = slot.module.__farmResolveRouteProps\n ? await slot.module.__farmResolveRouteProps(rawSlotProps)\n : {\n ...rawSlotProps,\n params: slotSchemas.params?.parse\n ? slotSchemas.params.parse(slot.params)\n : slot.params,\n search: slotSchemas.search?.parse\n ? slotSchemas.search.parse(searchParamsObj)\n : searchParamsObj,\n searchParams: Promise.resolve(\n slotSchemas.search?.parse\n ? slotSchemas.search.parse(searchParamsObj)\n : searchParamsObj,\n ),\n };\n if (\n slot.module.__farmResolveRouteProps &&\n slotContext !== undefined &&\n slotProps.context === slotContext\n ) {\n const { context: _slotContext, ...renderSlotProps } = slotProps;\n slotProps = renderSlotProps;\n }\n\n return { ...slot, props: slotProps };\n }),\n );\n const clientMiddleware = middlewareData?.size\n ? { data: Object.fromEntries(middlewareData) }\n : undefined;\n const clientPageProps = {\n params: pageProps.params,\n search: pageProps.search ?? searchParamsObj,\n searchParams: pageProps.search ?? searchParamsObj,\n ...(\"data\" in pageProps ? { data: pageProps.data } : {}),\n ...(pageProps.__farmCanonicalPath\n ? { __farmCanonicalPath: pageProps.__farmCanonicalPath }\n : {}),\n ...(pageProps.__farmRoutePropsResolved\n ? { __farmRoutePropsResolved: true }\n : {}),\n path: pathname,\n ...(clientMiddleware ? { middleware: clientMiddleware } : {}),\n };\n const routeSlotPayload = renderedRouteSlots.map(function(slot) {\n return {\n name: slot.name,\n ownerPattern: slot.ownerPattern,\n pattern: slot.pattern,\n containerId: slot.containerId,\n interception: slot.interception,\n fallback: slot.fallback,\n props: {\n params: slot.props.params,\n search: slot.props.search || searchParamsObj,\n searchParams: slot.props.search || searchParamsObj,\n ...(\"data\" in slot.props ? { data: slot.props.data } : {}),\n path: pathname,\n ...(clientMiddleware ? { middleware: clientMiddleware } : {}),\n },\n };\n });\n \n const renderPageElement = async () => {\n // First, render the page content\n let pageElement;\n\n // Check if the component is async\n if (PageComponent.constructor.name === \"AsyncFunction\" || PageComponent.toString().includes(\"async\")) {\n // For async components, execute to get the element\n try {\n const result = await PageComponent(pageProps);\n if (React.isValidElement(result)) {\n pageElement = result;\n } else {\n pageElement = React.createElement(\"div\", null, String(result));\n }\n } catch (asyncError) {\n if (isFarmRedirectError(asyncError) || isFarmNotFoundError(asyncError)) {\n throw asyncError;\n }\n // If async rendering fails, try sync rendering as fallback\n pageElement = React.createElement(PageComponent, pageProps);\n }\n } else {\n // Sync component - create element directly\n pageElement = React.createElement(PageComponent, pageProps);\n }\n\n if (route.shouldHydrate && renderedRouteSlots.length > 0) {\n pageElement = React.createElement(\n \"div\",\n { id: \"__farm_page__\", \"data-farm-client\": \"true\" },\n pageElement,\n );\n }\n\n // Wrap with layouts (from innermost to outermost)\n // Layouts are sorted by depth (root first), so we process in reverse\n let wrappedElement = pageElement;\n for (let i = applicableLayouts.length - 1; i >= 0; i--) {\n const layout = applicableLayouts[i];\n const LayoutComponent = layout.module.default;\n if (LayoutComponent) {\n const slotProps = {};\n for (const slot of renderedRouteSlots) {\n if (slot.ownerPattern !== layout.pattern) continue;\n slotProps[slot.name] = React.createElement(\n \"div\",\n {\n id: slot.containerId,\n \"data-farm-route-slot\": slot.name,\n \"data-farm-slot-owner\": slot.ownerPattern,\n },\n React.createElement(slot.module.default, slot.props),\n );\n }\n wrappedElement = React.createElement(LayoutComponent, {\n children: wrappedElement,\n params,\n ...slotProps,\n });\n }\n }\n\n return renderFarmElement(ReactDOMServer, wrappedElement);\n };\n const renderedPage = ${\n hasMiddlewareRuntime\n ? `await _runWithMiddlewareData(middlewareData, () =>\n _runWithMiddlewareContext(middlewareContext, renderPageElement)\n )`\n : \"await renderPageElement()\"\n };\n \n // Collect static and generated metadata from layouts and page.\n // Later entries override earlier entries, matching the development renderer.\n let mergedMetadata = {};\n for (const layout of applicableLayouts) {\n mergedMetadata = mergeMetadata(mergedMetadata, layout.module.metadata);\n if (typeof layout.module.generateMetadata === \"function\") {\n mergedMetadata = mergeMetadata(\n mergedMetadata,\n await layout.module.generateMetadata({ params: pageProps.params }),\n );\n }\n }\n mergedMetadata = mergeMetadata(mergedMetadata, pageMetadata);\n if (typeof route.module.generateMetadata === \"function\") {\n mergedMetadata = mergeMetadata(\n mergedMetadata,\n await route.module.generateMetadata(pageProps),\n );\n }\n\n for (const kind of [\"opengraph\", \"twitter\"]) {\n const imageMatch = getMatchingMetadataImage(routePathname, kind);\n if (imageMatch) {\n mergedMetadata = addMetadataImageReference(\n mergedMetadata,\n createMetadataImageReference(imageMatch, farmLocaleResolution?.locale),\n );\n }\n }\n\n const renderedMetadata = renderMetadataHead(mergedMetadata);\n const title = renderedMetadata.title;\n const metaTags = renderedMetadata.tags;\n const hasFavicon = renderedMetadata.hasFavicon;\n\n const hasPrivateRequestHeaders = hasPrivateFarmRequestHeaders(\n request,\n farmLocaleResolution,\n );\n const hasRequestScopedRender = Boolean(\n pageStatus >= 400 ||\n request.headers.get(\"x-farm-intercept-from\") ||\n hasPrivateRequestHeaders ||\n hasConfiguredRouteContext ||\n middlewareData?.size ||\n middlewareContext?.size\n );\n const sharedCacheControl = getRouteSharedCacheControl(route.module, pprCanCache);\n const responseHeaders = {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Cache-Control\": renderedPage.stream || hasRequestScopedRender || !sharedCacheControl\n ? \"private, no-store\"\n : sharedCacheControl,\n ...(pprConfig.enabled ? getPPRHeaders(pprCanCache ? \"miss\" : \"bypass\", pprConfig) : {}),\n };\n const farmI18nSnapshot = getFarmI18nSnapshot();\n let html = renderedPage.html;\n \n // Check if the layout already rendered a full HTML document\n const trimmedHtml = (html !== undefined ? html : renderedPage.shellHtml || \"\").trim();\n const hasFullDocument = trimmedHtml.startsWith('<html') || trimmedHtml.startsWith('<!DOCTYPE');\n\n // Stream a suspended body as soon as React's shell is ready. Full-document\n // layouts, localized documents, and cacheable PPR shells still use the\n // buffered path because they require whole-document transformation.\n if (\n pageStatus === 200 &&\n renderedPage.stream &&\n !hasFullDocument &&\n !farmI18nSnapshot &&\n !pprCacheKey\n ) {\n const streamPrefix = '<!DOCTYPE html>\\\\n<html lang=\"en\">\\\\n<head>\\\\n' +\n ' <meta charset=\"utf-8\">\\\\n' +\n ' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\\\\n' +\n (hasFavicon ? '' : ' <link rel=\"icon\" href=\"data:,\">\\\\n') +\n ' <title>' + title + '</title>' + metaTags + '\\\\n' +\n ' <link rel=\"stylesheet\" href=\"/farm-client.css\">\\\\n' +\n ' <link rel=\"modulepreload\" href=\"/farm-client.js\">\\\\n' +\n '</head>\\\\n<body>\\\\n <div id=\"root\">';\n const streamSuffix = '</div>\\\\n' +\n ' ' + renderFarmClientBootstrapScript(\n pageProps.__farmCanonicalPath,\n routeSlotPayload,\n clientPageProps\n ) + '\\\\n' +\n ' <script type=\"module\" src=\"/farm-client.js\"></script>\\\\n' +\n '</body>\\\\n</html>';\n const streamedDocument = createFarmDocumentStream(\n renderedPage.stream,\n streamPrefix,\n streamSuffix,\n function() {\n if (pprBypassReason === \"refresh\") {\n emitFarmEvent({\n type: \"ppr.refresh.complete\",\n route: pathname,\n durationMs: Date.now() - requestStartTime,\n });\n }\n emitFarmEvent({\n type: \"render.complete\",\n route: pathname,\n pathname,\n status: pageStatus,\n durationMs: Date.now() - requestStartTime,\n });\n }\n );\n return applyProductionMiddlewareHeaders(new Response(streamedDocument, {\n status: pageStatus,\n headers: responseHeaders,\n }), middlewareHeaders);\n }\n\n if (html === undefined) {\n html = await new Response(renderedPage.stream).text();\n if (renderedPage.streamErrors.length > 0) {\n throw renderedPage.streamErrors[0];\n }\n }\n \n let fullHtml;\n if (hasFullDocument) {\n // Layout provides full HTML structure - inject CSS and client script\n fullHtml = html\n // Inject CSS link after opening head tag or first meta tag\n .replace(/<head([^>]*)>/i, '<head$1>\\\\n <link rel=\"stylesheet\" href=\"/farm-client.css\">')\n // Inject title if not present and we have one\n .replace(/<head([^>]*)>([\\\\s\\\\S]*?)<\\\\/head>/i, (match, attrs, headContent) => {\n let nextHeadContent = headContent;\n if (!headContent.includes('<title>') && title !== \"Farm.js App\") {\n nextHeadContent += \"\\\\n <title>\" + title + \"</title>\";\n }\n if (metaTags) nextHeadContent += metaTags;\n return nextHeadContent === headContent\n ? match\n : \"<head\" + attrs + \">\" + nextHeadContent + \"\\\\n</head>\";\n })\n // Inject client script before closing body tag\n .replace(\n /<\\\\/body>/i,\n ' ' + renderFarmClientBootstrapScript(\n pageProps.__farmCanonicalPath,\n routeSlotPayload,\n clientPageProps\n ) + '\\\\n' +\n ' <script type=\"module\" src=\"/farm-client.js\"></script>\\\\n</body>',\n );\n \n // Add DOCTYPE if not present\n if (!fullHtml.trim().startsWith('<!DOCTYPE')) {\n fullHtml = '<!DOCTYPE html>\\\\n' + fullHtml;\n }\n } else {\n // No layout with full document - wrap in HTML structure\n fullHtml = \\`<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n \\${hasFavicon ? \"\" : '<link rel=\"icon\" href=\"data:,\">'}\n <title>\\${title}</title>\\${metaTags}\n <link rel=\"stylesheet\" href=\"/farm-client.css\">\n</head>\n<body>\n <div id=\"root\">\\${html}</div>\n \\${renderFarmClientBootstrapScript(pageProps.__farmCanonicalPath, routeSlotPayload, clientPageProps)}\n <script type=\"module\" src=\"/farm-client.js\"></script>\n</body>\n</html>\\`;\n }\n fullHtml = applyFarmI18nDocument(fullHtml, pathname, farmI18nSnapshot);\n\n if (pageStatus === 200 && pprCacheKey && request.method.toUpperCase() !== \"HEAD\") {\n await pprShellCache.setAsync(\n pprCacheKey,\n { html: fullHtml },\n {\n paths: [pathname],\n tags: [\"ppr\"],\n revalidate: pprConfig.revalidate ?? false,\n }\n );\n emitFarmEvent({\n type: \"ppr.shell.cached\",\n route: pathname,\n key: pprCacheKey,\n revalidate: pprConfig.revalidate,\n });\n }\n\n if (pprBypassReason === \"refresh\") {\n emitFarmEvent({\n type: \"ppr.refresh.complete\",\n route: pathname,\n durationMs: Date.now() - requestStartTime,\n });\n }\n\n emitFarmEvent({\n type: \"render.complete\",\n route: pathname,\n pathname,\n status: pageStatus,\n durationMs: Date.now() - requestStartTime,\n });\n\n return applyProductionMiddlewareHeaders(new Response(\n fullHtml,\n { \n status: pageStatus,\n headers: responseHeaders\n }\n ), middlewareHeaders);\n }\n } catch (error) {\n if (isFarmRedirectError(error)) {\n const redirect = getFarmRedirectError(error);\n const redirectUrl =\n farmLocaleResolution?.locale &&\n redirect.url.startsWith(\"/\") &&\n !redirect.url.startsWith(\"//\")\n ? localizeFarmHref(\n redirect.url,\n farmLocaleResolution.locale,\n farmI18nConfig\n )\n : redirect.url;\n emitFarmEvent({\n type: \"route.redirect\",\n from: pathname,\n to: redirectUrl,\n status: redirect.status,\n });\n emitFarmEvent({\n type: \"render.complete\",\n route: pathname,\n pathname,\n status: redirect.status,\n durationMs: Date.now() - requestStartTime,\n });\n return applyProductionMiddlewareHeaders(new Response(null, {\n status: redirect.status,\n headers: {\n Location: redirectUrl,\n },\n }), middlewareHeaders);\n }\n\n if (isFarmNotFoundError(error)) {\n emitFarmEvent({ type: \"route.notFound\", pathname });\n emitFarmEvent({\n type: \"render.complete\",\n route: pathname,\n pathname,\n status: 404,\n durationMs: Date.now() - requestStartTime,\n });\n return applyProductionMiddlewareHeaders(new Response(\"Not Found\", {\n status: 404,\n headers: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n }), middlewareHeaders);\n }\n\n emitFarmEvent({ type: \"render.error\", route: pathname, error });\n console.error(\"SSR Error:\", error);\n\n const errorBoundaryMatch = getMatchingErrorBoundary(routePathname);\n if (errorBoundaryMatch?.route.module?.default) {\n try {\n const searchParamsObj = Object.fromEntries(url.searchParams.entries());\n const ErrorComponent = errorBoundaryMatch.route.module.default;\n let errorElement = React.createElement(ErrorComponent, {\n error,\n reset: function() {},\n params,\n search: searchParamsObj,\n searchParams: Promise.resolve(searchParamsObj),\n path: pathname,\n ...(middlewareData?.size ? { middleware: { data: middlewareData } } : {}),\n });\n\n const applicableLayouts = getApplicableLayouts(routePathname);\n for (let i = applicableLayouts.length - 1; i >= 0; i--) {\n const LayoutComponent = applicableLayouts[i].module.default;\n if (LayoutComponent) {\n errorElement = React.createElement(LayoutComponent, {\n children: errorElement,\n params,\n });\n }\n }\n\n const renderErrorElement = () =>\n renderFarmElementToString(ReactDOMServer, errorElement);\n const errorHtml = ${\n hasMiddlewareRuntime\n ? `await _runWithMiddlewareData(middlewareData, () =>\n _runWithMiddlewareContext(middlewareContext, renderErrorElement)\n )`\n : \"await renderErrorElement()\"\n };\n const errorDocument = applyFarmI18nDocument(\n createFarmErrorDocument(errorHtml, \"Application Error\"),\n pathname,\n getFarmI18nSnapshot()\n );\n emitFarmEvent({\n type: \"render.complete\",\n route: pathname,\n pathname,\n status: 500,\n durationMs: Date.now() - requestStartTime,\n });\n return applyProductionMiddlewareHeaders(new Response(errorDocument, {\n status: 500,\n headers: {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Cache-Control\": \"private, no-store\",\n },\n }), middlewareHeaders);\n } catch (boundaryError) {\n console.error(\"Route error boundary failed:\", boundaryError);\n }\n }\n\n const errorMessage = \"Internal Server Error\";\n const fallbackHtml = '<main><h1>Application Error</h1><p>' +\n escapeFarmHtmlAttribute(errorMessage) + '</p></main>';\n const fallbackDocument = applyFarmI18nDocument(\n createFarmErrorDocument(fallbackHtml, \"Application Error\"),\n pathname,\n getFarmI18nSnapshot()\n );\n return applyProductionMiddlewareHeaders(new Response(\n fallbackDocument,\n {\n status: 500,\n headers: {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Cache-Control\": \"private, no-store\",\n },\n }\n ), middlewareHeaders);\n }\n }\n\n // 404 fallback - render proper HTML page\n emitFarmEvent({ type: \"route.notFound\", pathname });\n try {\n // Default 404 page component\n function Default404Page() {\n return React.createElement(\"div\", {\n style: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n fontFamily: \"system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n backgroundColor: \"#f9fafb\",\n padding: \"20px\",\n textAlign: \"center\",\n }\n },\n React.createElement(\"div\", {\n style: {\n backgroundColor: \"white\",\n borderRadius: \"12px\",\n padding: \"48px\",\n boxShadow: \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n maxWidth: \"500px\",\n width: \"100%\",\n }\n },\n React.createElement(\"h1\", {\n style: {\n fontSize: \"96px\",\n fontWeight: \"bold\",\n color: \"#22c55e\",\n margin: \"0 0 16px 0\",\n lineHeight: \"1\",\n }\n }, \"404\"),\n React.createElement(\"h2\", {\n style: {\n fontSize: \"24px\",\n fontWeight: \"600\",\n color: \"#1f2937\",\n margin: \"0 0 16px 0\",\n }\n }, \"Page Not Found\"),\n React.createElement(\"p\", {\n style: {\n fontSize: \"16px\",\n color: \"#6b7280\",\n margin: \"0 0 24px 0\",\n }\n }, \"The page \", React.createElement(\"code\", {\n style: { backgroundColor: \"#f3f4f6\", padding: \"2px 6px\", borderRadius: \"4px\" }\n }, pathname), \" doesn't exist.\"),\n React.createElement(\"a\", {\n href: \"/\",\n style: {\n display: \"inline-block\",\n backgroundColor: \"#22c55e\",\n color: \"white\",\n padding: \"12px 24px\",\n borderRadius: \"8px\",\n textDecoration: \"none\",\n fontWeight: \"500\",\n }\n }, \"Go Home\")\n ),\n React.createElement(\"p\", {\n style: {\n marginTop: \"24px\",\n fontSize: \"14px\",\n color: \"#9ca3af\",\n }\n }, \"Powered by Farm.js\")\n );\n }\n \n // Use custom 404 page if provided, otherwise use default\n const NotFoundPage = hasCustomNotFound && CustomNotFoundComponent ? CustomNotFoundComponent : Default404Page;\n \n // Wrap 404 page with root layout if available\n let notFoundElement = React.createElement(NotFoundPage, { pathname: pathname });\n const applicableLayouts = getApplicableLayouts(\"/\");\n \n // Wrap with layouts (from innermost to outermost)\n for (let i = applicableLayouts.length - 1; i >= 0; i--) {\n const layout = applicableLayouts[i];\n const LayoutComponent = layout.module.default;\n if (LayoutComponent) {\n notFoundElement = React.createElement(LayoutComponent, { children: notFoundElement, params: {} });\n }\n }\n \n const html = ReactDOMServer.renderToString(notFoundElement);\n \n // Check if layout provides full HTML document\n const trimmedHtml = html.trim();\n const hasFullDocument = trimmedHtml.startsWith('<html') || trimmedHtml.startsWith('<!DOCTYPE');\n \n let fullHtml;\n if (hasFullDocument) {\n fullHtml = html\n .replace(/<head([^>]*)>/i, '<head$1>\\\\n <link rel=\"stylesheet\" href=\"/farm-client.css\">')\n .replace(\n /<\\\\/body>/i,\n ' ' + renderFarmClientBootstrapScript() + '\\\\n' +\n ' <script type=\"module\" src=\"/farm-client.js\"></script>\\\\n</body>',\n );\n if (!fullHtml.trim().startsWith('<!DOCTYPE')) {\n fullHtml = '<!DOCTYPE html>\\\\n' + fullHtml;\n }\n } else {\n fullHtml = \\`<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <link rel=\"icon\" href=\"data:,\">\n <link rel=\"stylesheet\" href=\"/farm-client.css\">\n <title>404 - Page Not Found</title>\n</head>\n<body>\n <div id=\"root\">\\${html}</div>\n \\${renderFarmClientBootstrapScript()}\n <script type=\"module\" src=\"/farm-client.js\"></script>\n</body>\n</html>\\`;\n }\n fullHtml = applyFarmI18nDocument(fullHtml, pathname, getFarmI18nSnapshot());\n \n emitFarmEvent({\n type: \"render.complete\",\n route: pathname,\n pathname,\n status: 404,\n durationMs: Date.now() - requestStartTime,\n });\n\n return applyProductionMiddlewareHeaders(new Response(fullHtml, {\n status: 404,\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" }\n }), middlewareHeaders);\n } catch (error) {\n console.error(\"404 render error:\", error);\n return applyProductionMiddlewareHeaders(new Response(\n \\`<!DOCTYPE html><html><head><title>404</title></head><body><h1>404 - Page Not Found</h1><p>The page \\${pathname} doesn't exist.</p><a href=\"/\">Go Home</a></body></html>\\`,\n { status: 404, headers: { \"Content-Type\": \"text/html\" } }\n ), middlewareHeaders);\n }\n ${\n hasMiddlewareRuntime\n ? `\n };\n return request === requestBeforeMiddleware\n ? runResolvedRequest()\n : _runWithCurrentRequest(request, runResolvedRequest);\n `\n : \"\"\n }\n}\n\nasync function handleFarmPluginRequest(request, runtimeOptions) {\n if (!farmPluginRuntime || runtimeOptions.kind !== \"page\") {\n return handleFarmRequest(request);\n }\n\n const pathname = runtimeOptions.route?.pathname || new URL(request.url).pathname;\n const routePattern = runtimeOptions.route?.pattern || null;\n const params = runtimeOptions.route?.params || {};\n const layouts = getApplicableLayouts(getFarmRoutePathname(pathname));\n\n await farmPluginRuntime.runHookParallel(\"beforeRouteMatch\", {\n pathname,\n method: request.method,\n });\n await farmPluginRuntime.runHookParallel(\"afterRouteMatch\", {\n pathname,\n matched: Boolean(routePattern),\n routePattern,\n params,\n layoutPatterns: layouts.map((layout) => layout.pattern),\n });\n\n const renderPayload = {\n pathname,\n method: request.method,\n routePattern,\n params,\n };\n await farmPluginRuntime.runHookParallel(\"beforeRender\", renderPayload);\n\n const response = await handleFarmRequest(request);\n if (!hasFarmPluginHTMLTransforms || !response.headers.get(\"content-type\")?.includes(\"text/html\")) {\n return response;\n }\n\n let html = await response.text();\n html = await farmPluginRuntime.runHookSerial(\"transformHTML\", html);\n html = await farmPluginRuntime.runHookSerial(\"afterRender\", html, renderPayload);\n\n const headers = new Headers(response.headers);\n headers.delete(\"content-length\");\n return new Response(html, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\n// Export as Web Standard fetch API\nexport async function fetch(request, context) {\n const runtimeOptions = farmPluginRuntime ? getFarmPluginRequestOptions(request) : null;\n const runRequest = () => farmPluginRuntime\n ? farmPluginRuntime.runRuntimeRequest(\n request,\n (runtimeRequest) =>\n _runWithCurrentRequest(runtimeRequest, () =>\n handleFarmPluginRequest(runtimeRequest, runtimeOptions)\n ),\n {\n ...runtimeOptions,\n waitUntil: typeof context?.waitUntil === \"function\"\n ? context.waitUntil.bind(context)\n : undefined,\n },\n )\n : handleFarmRequest(request);\n\n const response = await _runWithCurrentRequest(request, () =>\n _runWithAfterRequest(request, runRequest, context),\n );\n return applyConfiguredResponseHeaders(response, new URL(request.url).pathname);\n}\nexport default { fetch };\n `.trim();\n}\n\n/**\n * Build with Nitro using virtual bundle\n * Routes are now bundled in the SSR entry, so we just need to wrap the handler\n */\nfunction matchesConfiguredRoute(source: string, pathname: string): boolean {\n const sourceSegments = source.split(\"/\").filter(Boolean);\n const pathnameSegments = pathname.split(\"/\").filter(Boolean);\n let pathnameIndex = 0;\n\n for (const sourceSegment of sourceSegments) {\n if (sourceSegment === \"*\" || /^:[^/]+\\*$/.test(sourceSegment)) return true;\n\n const pathnameSegment = pathnameSegments[pathnameIndex];\n if (/^:[^/]+\\?$/.test(sourceSegment)) {\n if (pathnameSegment !== undefined) pathnameIndex++;\n continue;\n }\n if (pathnameSegment === undefined) return false;\n if (!sourceSegment.startsWith(\":\") && sourceSegment !== pathnameSegment) return false;\n pathnameIndex++;\n }\n\n return pathnameIndex === pathnameSegments.length;\n}\n\nfunction getPrerenderRouteHeaders(\n pathname: string,\n configuredHeaderRoutes: UniversalConfiguredHeaderRoute[],\n): Record<string, string> {\n const headers: Record<string, string> = {\n \"cache-control\": \"public, max-age=0, must-revalidate\",\n };\n for (const route of configuredHeaderRoutes) {\n if (!matchesConfiguredRoute(route.source, pathname)) continue;\n for (const header of route.headers) headers[header.key.toLowerCase()] = header.value;\n }\n return headers;\n}\n\nfunction escapeRoutePattern(value: string): string {\n return value.replace(/[|\\\\{}()[\\]^$+?.*]/g, \"\\\\$&\");\n}\n\nfunction middlewarePatternMatches(pattern: string | RegExp, pathname: string): boolean {\n if (pattern instanceof RegExp) {\n pattern.lastIndex = 0;\n return pattern.test(pathname);\n }\n\n if (pattern === \"*\" || pattern === \"/(.*)\") return true;\n if (pattern.endsWith(\"(.*)\")) {\n const prefix = pattern.slice(0, -4);\n return pathname === prefix || pathname.startsWith(`${prefix}/`);\n }\n\n const segments = pattern.split(\"/\").filter(Boolean);\n if (segments.length === 0) return pathname === \"/\";\n const expression = segments\n .map((segment) => {\n if (segment === \"**\") return \"(?:/.*)?\";\n if (segment === \"*\") return \"/[^/]+\";\n if (\n /^:[^/]+\\*$/.test(segment) ||\n /^\\[\\.\\.\\..+\\]$/.test(segment) ||\n /^\\[\\[\\.\\.\\..+\\]\\]$/.test(segment)\n ) {\n return \"(?:/.*)?\";\n }\n if (/^:[^/]+\\+$/.test(segment)) return \"/.+\";\n if (/^:[^/]+\\?$/.test(segment)) return \"(?:/[^/]+)?\";\n if (segment.startsWith(\":\") || /^\\[.+\\]$/.test(segment)) return \"/[^/]+\";\n return `/${escapeRoutePattern(segment).replace(/\\\\\\*/g, \"[^/]*\")}`;\n })\n .join(\"\");\n return new RegExp(`^${expression}/?$`).test(pathname);\n}\n\nfunction configMiddlewareMayHandlePath(\n config: ResolvedFarmConfig[\"middleware\"],\n pathname: string,\n): boolean {\n if (!hasFarmMiddlewareConfig(config)) return false;\n\n const entries = (Array.isArray(config) ? config : [config]) as Array<{\n matcher?: unknown | unknown[];\n exclude?: Array<string | RegExp>;\n }>;\n return entries.some((entry) => {\n if (entry.exclude?.some((pattern) => middlewarePatternMatches(pattern, pathname))) {\n return false;\n }\n\n if (!entry.matcher) return true;\n const matchers = Array.isArray(entry.matcher) ? entry.matcher : [entry.matcher];\n return matchers.some((matcher) => {\n // A request-aware matcher cannot be proven safe at build time.\n if (typeof matcher === \"function\") return true;\n return (\n (typeof matcher === \"string\" || matcher instanceof RegExp) &&\n middlewarePatternMatches(matcher, pathname)\n );\n });\n });\n}\n\nfunction appMiddlewareMayHandlePath(\n middlewareRoutes: readonly UniversalMiddlewareRoute[],\n pathname: string,\n): boolean {\n return middlewareRoutes.some((route) => {\n if (route.path === \"/\") return true;\n return (\n middlewarePatternMatches(route.path, pathname) ||\n middlewarePatternMatches(`${route.path}/**`, pathname)\n );\n });\n}\n\nfunction routePatternSpecificity(pattern: string): number {\n return pattern\n .split(\"/\")\n .filter(Boolean)\n .reduce((score, segment) => {\n if (segment === \"**\" || segment.startsWith(\"[[...\")) return score + 1;\n if (segment === \"*\" || segment.startsWith(\"[...\") || /:\\w+\\*$/.test(segment)) {\n return score + 10;\n }\n if (/^\\[.+\\]$/.test(segment) || segment.startsWith(\":\")) return score + 50;\n return score + 100;\n }, 0);\n}\n\nfunction getEffectiveRouteRule(config: ResolvedFarmConfig, pathname: string) {\n return Object.entries(config.routeRules)\n .filter(([pattern]) => middlewarePatternMatches(pattern, pathname))\n .sort(([left], [right]) => routePatternSpecificity(left) - routePatternSpecificity(right))\n .reduce<Record<string, unknown>>((resolved, [, rule]) => Object.assign(resolved, rule), {});\n}\n\nfunction getManifestPageEntry(\n manifest: FarmRouteRuntimeManifest,\n pathname: string,\n): FarmRouteRuntimeManifestEntry | undefined {\n return manifest.routes\n .filter((entry) => entry.kind === \"page\" && middlewarePatternMatches(entry.pattern, pathname))\n .sort(\n (left, right) =>\n routePatternSpecificity(right.pattern) - routePatternSpecificity(left.pattern),\n )[0];\n}\n\nfunction getPhysicalPrerenderBypassReason(options: {\n config: ResolvedFarmConfig;\n middlewareRoutes: readonly UniversalMiddlewareRoute[];\n routeRuntimeManifest: FarmRouteRuntimeManifest;\n redirectSources: readonly string[];\n rewriteSources: readonly string[];\n pathname: string;\n}): string | undefined {\n const {\n config,\n middlewareRoutes,\n routeRuntimeManifest,\n redirectSources,\n rewriteSources,\n pathname,\n } = options;\n if (config.i18n.enabled) return \"request-sensitive i18n\";\n if (redirectSources.some((source) => middlewarePatternMatches(source, pathname))) {\n return \"redirect\";\n }\n if (rewriteSources.some((source) => middlewarePatternMatches(source, pathname))) {\n return \"rewrite\";\n }\n if (appMiddlewareMayHandlePath(middlewareRoutes, pathname)) return \"app middleware\";\n if (configMiddlewareMayHandlePath(config.middleware, pathname)) return \"configured middleware\";\n if (hasCustomFarmRouteContext(config)) return \"request context\";\n if (hasFarmServerRuntimePlugins(config)) return \"server runtime plugin\";\n\n const manifestEntry = getManifestPageEntry(routeRuntimeManifest, pathname);\n if (manifestEntry?.rendering === \"dynamic\") return \"dynamic runtime manifest\";\n if (\n manifestEntry &&\n (manifestEntry.runtime !== \"auto\" ||\n Boolean(manifestEntry.regions?.length) ||\n manifestEntry.maxDuration !== undefined)\n ) {\n return \"route runtime controls\";\n }\n\n const routeRule = getEffectiveRouteRule(config, pathname);\n if (routeRule.prerender === false || routeRule.render === \"dynamic\" || routeRule.ssr === true) {\n return \"dynamic route rule\";\n }\n if (\n (routeRule.swr !== undefined && routeRule.swr !== false) ||\n (routeRule.isr !== undefined && routeRule.isr !== false)\n ) {\n return \"runtime cache route rule\";\n }\n\n return undefined;\n}\n\nasync function buildNitroUniversal(\n config: ResolvedFarmConfig,\n routeManager: RouteManager,\n apiRouteManager: APIRouteManager,\n serverRenderer: ServerRenderer,\n preset: string,\n root: string,\n distDir: string,\n ssrBundle: OutputBundle,\n ssrEntryFile: string,\n clientOutputDir: string,\n routeRuntimeManifest: FarmRouteRuntimeManifest,\n configuredHeaderRoutes: UniversalConfiguredHeaderRoute[],\n nitroRuntimeResultPromise: Promise<PromiseSettledResult<FarmNitroRuntime>>,\n pluginManager?: PluginManager,\n) {\n // Nitro is only needed while producing the deployment artifact. Keeping the\n // import lazy prevents this build-only dependency from leaking into an\n // application's standalone server bundle through @farm.js/core's root entry.\n const [fs, nitroRuntimeResult] = await Promise.all([\n import(\"fs/promises\"),\n nitroRuntimeResultPromise,\n ]);\n if (nitroRuntimeResult.status === \"rejected\") throw nitroRuntimeResult.reason;\n const nitro = nitroRuntimeResult.value;\n\n const isVercel = preset === \"vercel\" || preset === \"vercel-edge\";\n const isCloudflareWorker = preset === \"cloudflare-module\";\n const outputDir = resolveDeployOutputPath(root, config.deploy.outputDir);\n const ssrOutputDir = path.join(root, distDir, \"ssr\");\n const imageRuntime = resolveImageRuntime(config, preset);\n const ssrExternalPackages = collectSSRExternalPackages(ssrBundle);\n const copiedRuntimePackages = new Set(imageRuntime === \"node\" ? [\"sharp\"] : []);\n // Nitro normally rebundles the Vite SSR graph so its bare dependencies are\n // deployable. Skip that duplicate pass only when Farm already knows how to\n // package every remaining external; otherwise retain Nitro's proven path.\n const isPrebuiltSSRCandidate =\n preset === \"node-server\" &&\n [...ssrExternalPackages].every((packageName) => copiedRuntimePackages.has(packageName));\n\n logger.info(`📦 Nitro output directory: ${outputDir}`);\n logger.info(`📦 SSR entry file: ${ssrEntryFile}`);\n logger.info(`📦 Preset: ${preset}`);\n\n const ssgCollectionPromise = routeManager.collectSSGPages();\n const middlewareRoutesPromise = discoverMiddlewareRoutes(getFarmAppDirectories(config));\n // Resolved config callbacks close over already-loaded arrays, so this does\n // not re-run user discovery or fetch mutable external configuration.\n const configuredResponseRoutesPromise = Promise.all([config.redirects(), config.rewrites()]);\n const farmWorkflows = await prepareFarmWorkflowsForNitro(config);\n const farmCron = await prepareFarmCronForNitro(config);\n const [{ ssg: ssgPages }, middlewareRoutes, [configuredRedirects, configuredRewrites]] =\n await Promise.all([\n ssgCollectionPromise,\n middlewareRoutesPromise,\n configuredResponseRoutesPromise,\n ]);\n const redirectSources = [\n ...routeManager.getRedirects().map((route) => route.source),\n ...configuredRedirects.map((route: RedirectConfig) => route.source),\n ];\n const rewriteSources = configuredRewrites.map((route: RewriteConfig) => route.source);\n const prerenderRoutes: string[] = [];\n const skippedPrerenderRoutes: Array<{ pathname: string; reason: string }> = [];\n for (const page of ssgPages) {\n // Revalidated pages keep their runtime/CDN stale-while-revalidate\n // behavior. Emitting them as public files would prevent the server from\n // ever regenerating them.\n if (page.revalidate !== undefined) continue;\n if (prerenderRoutes.includes(page.urlPath)) continue;\n\n const reason = getPhysicalPrerenderBypassReason({\n config,\n middlewareRoutes,\n routeRuntimeManifest,\n redirectSources,\n rewriteSources,\n pathname: page.urlPath,\n });\n if (reason) {\n skippedPrerenderRoutes.push({ pathname: page.urlPath, reason });\n continue;\n }\n prerenderRoutes.push(page.urlPath);\n }\n for (const skipped of skippedPrerenderRoutes) {\n logger.info(`↪ Keeping SSG route ${skipped.pathname} server-handled (${skipped.reason})`);\n }\n if (farmWorkflows.workflows.length > 0) {\n logger.info(`⏱️ Found ${farmWorkflows.workflows.length} Farm workflow task(s)`);\n }\n if (farmCron.jobs.length > 0) {\n logger.info(`⏱️ Configured ${farmCron.jobs.length} Farm cron route(s)`);\n }\n if (preset === \"cloudflare-pages\" && farmCron.jobs.length > 0) {\n logger.warn(\n \"Cloudflare Pages does not install Cron Triggers. Use the cloudflare-module preset or an external scheduler with .farm/cron-manifest.json.\",\n );\n }\n\n const scheduledTasks = mergeScheduledTasks(farmWorkflows.scheduledTasks, farmCron.scheduledTasks);\n const cloudflareCronConfig = createFarmCronCloudflareConfig(farmCron.jobs);\n\n // Write SSR bundle to disk\n await fs.mkdir(ssrOutputDir, { recursive: true });\n\n for (const [fileName, output] of Object.entries(ssrBundle)) {\n const filePath = path.join(ssrOutputDir, fileName);\n // Ensure parent directory exists for nested chunks and emitted assets.\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, output.type === \"chunk\" ? output.code : output.source);\n }\n\n // Create the Nitro event handler adapter. Nitro accepts plain event handler\n // functions, so keep this entry dependency-free for standalone output.\n const nitroEntryPath = path.join(ssrOutputDir, \"nitro-entry.mjs\");\n\n const nitroEntryCode = `\n// Farm.js Nitro Entry\n// This file adapts Farm's Web fetch handler to Nitro's event handler contract.\n\nimport handler from './${ssrEntryFile}'\n\nfunction mergeVaryHeaders(target, source) {\n const values = new Set(\n [target.get('Vary'), source]\n .filter(Boolean)\n .flatMap((value) => value.split(','))\n .map((value) => value.trim())\n .filter(Boolean),\n )\n\n if (values.size > 0) target.set('Vary', Array.from(values).join(', '))\n}\n\nfunction createResponseFinishedHook(event) {\n const nodeResponse = event.node?.res\n if (!nodeResponse || typeof nodeResponse.once !== 'function') return undefined\n\n return (callback) => {\n if (nodeResponse.writableEnded || nodeResponse.writableFinished) {\n queueMicrotask(callback)\n return\n }\n\n let finished = false\n const finish = () => {\n if (finished) return\n finished = true\n nodeResponse.off('finish', finish)\n nodeResponse.off('close', finish)\n callback()\n }\n nodeResponse.once('finish', finish)\n nodeResponse.once('close', finish)\n }\n}\n\n// Export the event handler for Nitro\nexport default async function farmNitroEventHandler(event) {\n const response = await handler.fetch(event.req, {\n waitUntil: (promise) => event.waitUntil(promise),\n onResponseFinished: createResponseFinishedHook(event),\n })\n\n // Nitro records asset compression negotiation on the event response. Merge\n // Farm's cache signals there so H3 preserves both sets of Vary values.\n const farmVary = response.headers.get('Vary')\n if (farmVary) mergeVaryHeaders(event.res.headers, farmVary)\n return response\n}\n `.trim();\n\n await fs.writeFile(nitroEntryPath, nitroEntryCode);\n const prebuiltSSRPlugin = createExternalSSRBundlePlugin(\n nitroEntryPath,\n ssrOutputDir,\n ssrEntryFile,\n );\n const configuredNitroRouteRules = routeRulesToNitroRouteRules(config.routeRules);\n const prerenderNitroRouteRules = Object.fromEntries(\n prerenderRoutes.map((route) => {\n const configuredRule = configuredNitroRouteRules[route] || {};\n return [\n route,\n {\n ...configuredRule,\n prerender: true,\n headers: {\n ...getPrerenderRouteHeaders(route, configuredHeaderRoutes),\n ...configuredRule.headers,\n },\n },\n ];\n }),\n );\n\n let nitroConfig: NitroConfig = {\n preset,\n rootDir: root,\n srcDir: root,\n buildDir: path.join(root, distDir, \".nitro\"),\n compatibilityDate: \"2024-12-01\",\n output: {\n dir: outputDir,\n serverDir: path.join(outputDir, \"server\"),\n publicDir: path.join(outputDir, \"public\"),\n },\n publicAssets: [\n {\n dir: clientOutputDir,\n maxAge: 31536000,\n baseURL: \"/\",\n },\n ],\n ...(prerenderRoutes.length > 0\n ? {\n prerender: {\n crawlLinks: false,\n failOnError: true,\n routes: prerenderRoutes,\n },\n }\n : {}),\n experimental: {\n tasks: farmWorkflows.workflows.length > 0 || farmCron.jobs.length > 0,\n },\n tasks: {\n ...farmWorkflows.tasks,\n ...farmCron.tasks,\n },\n scheduledTasks: isVercel ? farmWorkflows.scheduledTasks : scheduledTasks,\n ...(isCloudflareWorker && cloudflareCronConfig\n ? {\n cloudflare: cloudflareCronConfig,\n }\n : {}),\n // Use serverHandlers to define our workflow handler first, then the catch-all handler.\n handlers: [\n ...(farmWorkflows.handlerPath\n ? [\n {\n route: `${config.workflows.route}/**`,\n handler: farmWorkflows.handlerPath,\n },\n ]\n : []),\n {\n route: \"/**\",\n handler: nitroEntryPath,\n },\n ],\n routeRules: {\n \"/api/**\": {\n cors: true,\n headers: {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"*\",\n \"Access-Control-Allow-Headers\": \"*\",\n },\n },\n \"/**\": {\n prerender: false,\n },\n ...configuredNitroRouteRules,\n // Exact user rules must retain their runtime settings without replacing\n // the headers and prerender marker generated for a safe physical page.\n ...prerenderNitroRouteRules,\n },\n externals: {\n external: [\n \"react\",\n \"react-dom\",\n \"@prisma/client\",\n \"@prisma/client/default\",\n \"@prisma/client/default.js\",\n \".prisma/client\",\n \".prisma/client/default\",\n \"better-sqlite3\",\n \"sharp\",\n ],\n },\n rollupConfig: {\n external: isNitroRollupExternal,\n },\n // Keep the public Nitro boolean intact for build hooks. It is translated to\n // Nitro's existing esbuild pass after hooks run, avoiding a second Terser pass.\n minify: true,\n sourceMap: false, // Skip sourcemaps for faster build\n };\n const initialSSRRebundleOptions = snapshotSSRRebundleOptions(nitroConfig);\n\n if (pluginManager) {\n nitroConfig = await pluginManager.runHookSerial(\"beforeNitroBuild\", nitroConfig);\n }\n\n const expectedServerDir = path.join(outputDir, \"server\");\n const customRollupKeys = Object.keys(nitroConfig.rollupConfig || {}).filter(\n (key) => key !== \"external\" && key !== \"plugins\",\n );\n const configuredEsbuild = nitroConfig.esbuild?.options;\n const hasUnsupportedEsbuildOverrides = Boolean(\n configuredEsbuild?.include !== undefined ||\n configuredEsbuild?.exclude !== undefined ||\n configuredEsbuild?.loaders !== undefined ||\n configuredEsbuild?.sourceMap,\n );\n const hasLateBuildMutationConfig = Boolean(\n Object.keys(nitroConfig.hooks || {}).length > 0 ||\n (Array.isArray(nitroConfig.modules) ? nitroConfig.modules.some(Boolean) : nitroConfig.modules),\n );\n const hasUnsupportedSSRRebundleOverrides = !isDeepStrictEqual(\n initialSSRRebundleOptions,\n snapshotSSRRebundleOptions(nitroConfig),\n );\n const requestedBuilder = nitroConfig.builder ?? process.env.NITRO_BUILDER;\n const canReusePrebuiltSSR =\n isPrebuiltSSRCandidate &&\n nitroConfig.preset === \"node-server\" &&\n (requestedBuilder === undefined ||\n requestedBuilder === \"rollup\" ||\n requestedBuilder === \"rolldown\") &&\n nitroConfig.sourceMap === false &&\n !hasUnsupportedEsbuildOverrides &&\n !hasLateBuildMutationConfig &&\n !hasUnsupportedSSRRebundleOverrides &&\n nitroConfig.rollupConfig?.external === isNitroRollupExternal &&\n !hasRollupPlugins(nitroConfig.rollupConfig?.plugins) &&\n customRollupKeys.length === 0 &&\n path.resolve(nitroConfig.output?.serverDir || \"\") === path.resolve(expectedServerDir) &&\n Boolean(\n nitroConfig.handlers?.some(\n (handler) => path.resolve(handler?.handler || \"\") === nitroEntryPath,\n ),\n );\n const selectRolldownBuilder =\n canReusePrebuiltSSR && requestedBuilder === undefined && (await canUseRolldownBuilder());\n if (selectRolldownBuilder) nitroConfig.builder = \"rolldown\";\n const useRolldownBuilder =\n canReusePrebuiltSSR && (nitroConfig.builder ?? process.env.NITRO_BUILDER) === \"rolldown\";\n\n const shouldMinify = nitroConfig.minify !== false;\n const configuredEsbuildOptions = nitroConfig.esbuild?.options || {};\n const effectiveMinify = configuredEsbuildOptions.minify ?? shouldMinify;\n const useFarmEsbuildMinifier =\n effectiveMinify &&\n nitroConfig.sourceMap === false &&\n !hasUnsupportedEsbuildOverrides &&\n !hasLateBuildMutationConfig;\n const esbuildChunkMinifier = useFarmEsbuildMinifier\n ? createEsbuildChunkMinifyPlugin(configuredEsbuildOptions)\n : null;\n if (canReusePrebuiltSSR) {\n const configuredRollupPlugins = nitroConfig.rollupConfig?.plugins;\n nitroConfig.rollupConfig = {\n ...nitroConfig.rollupConfig,\n plugins: [\n ...(Array.isArray(configuredRollupPlugins)\n ? configuredRollupPlugins\n : configuredRollupPlugins\n ? [configuredRollupPlugins]\n : []),\n prebuiltSSRPlugin,\n ],\n };\n }\n\n nitroConfig.minify = useFarmEsbuildMinifier ? false : shouldMinify;\n nitroConfig.esbuild = {\n ...nitroConfig.esbuild,\n options: {\n ...configuredEsbuildOptions,\n minify: useFarmEsbuildMinifier ? false : configuredEsbuildOptions.minify,\n keepNames: configuredEsbuildOptions.keepNames ?? true,\n legalComments: configuredEsbuildOptions.legalComments ?? \"none\",\n },\n };\n\n // Build with Nitro\n const nitroInstance = await nitro.createNitro(nitroConfig);\n await nitro.prepare(nitroInstance);\n await nitro.copyPublicAssets(nitroInstance);\n if (prerenderRoutes.length > 0 && canReusePrebuiltSSR) {\n // The prerenderer builds and immediately imports a temporary server before\n // the final Node adapter exists. Materialize the same prebuilt SSR package\n // import for that temporary server so it can render the static routes.\n nitroInstance.hooks.hook(\"prerender:init\", (prerenderer) => {\n if (useRolldownBuilder) {\n prerenderer.hooks.hook(\"rollup:before\", (_nitro, rollupConfig) => {\n const rolldownConfig = rollupConfig as typeof rollupConfig & {\n inject?: unknown;\n jsx?: unknown;\n };\n delete rolldownConfig.inject;\n delete rolldownConfig.jsx;\n });\n }\n prerenderer.hooks.hook(\"compiled\", async () => {\n const prerenderServerDir = path.join(outputDir, \"server\");\n await copyPrebuiltSSRBundle(\n ssrBundle,\n path.join(prerenderServerDir, FARM_SSR_OUTPUT_DIR),\n {},\n false,\n fs,\n );\n await registerPrebuiltSSRPackageImport(prerenderServerDir, ssrEntryFile, fs);\n });\n });\n }\n if (esbuildChunkMinifier || useRolldownBuilder) {\n // Register after Nitro and user hooks are prepared so the minifier is the\n // final renderChunk transform, matching Nitro's Terser ordering.\n nitroInstance.hooks.hook(\"rollup:before\", (_nitro, rollupConfig) => {\n if (useRolldownBuilder) {\n // Nitro 3 alpha still emits transform options that this Rolldown API\n // rejects. The generated native Node adapter contains neither JSX nor\n // browser-global injections, so omit both without changing its output.\n const rolldownConfig = rollupConfig as typeof rollupConfig & {\n inject?: unknown;\n jsx?: unknown;\n };\n delete rolldownConfig.inject;\n delete rolldownConfig.jsx;\n }\n if (esbuildChunkMinifier) {\n const configuredPlugins = rollupConfig.plugins;\n rollupConfig.plugins = [\n ...(Array.isArray(configuredPlugins)\n ? configuredPlugins\n : configuredPlugins\n ? [configuredPlugins]\n : []),\n esbuildChunkMinifier,\n ];\n }\n });\n }\n if (prerenderRoutes.length > 0) {\n logger.info(`📄 Pre-rendering ${prerenderRoutes.length} SSG page(s)`);\n await nitro.prerender(nitroInstance);\n }\n await nitro.build(nitroInstance);\n await nitroInstance.close();\n\n const copyResults = await Promise.allSettled([\n canReusePrebuiltSSR\n ? copyPrebuiltSSRBundle(\n ssrBundle,\n path.join(outputDir, \"server\", FARM_SSR_OUTPUT_DIR),\n configuredEsbuildOptions,\n effectiveMinify,\n fs,\n )\n : Promise.resolve(),\n imageRuntime === \"node\"\n ? copySharpRuntime(config, root, path.join(outputDir, \"server\"), fs)\n : Promise.resolve(),\n ]);\n const failedCopy = copyResults.find(\n (result): result is PromiseRejectedResult => result.status === \"rejected\",\n );\n if (failedCopy) throw failedCopy.reason;\n\n if (canReusePrebuiltSSR) {\n await registerPrebuiltSSRPackageImport(path.join(outputDir, \"server\"), ssrEntryFile, fs);\n logger.info(\"⚡ Reused Farm's prebuilt SSR bundle for the Node output\");\n }\n if (useRolldownBuilder) {\n logger.info(\"⚡ Built the Node adapter with Rolldown\");\n }\n\n if (pluginManager) {\n await pluginManager.runHookParallel(\"afterNitroBuild\", {\n root,\n preset,\n distDir,\n outputDir,\n });\n }\n\n // Post-process for Vercel Build Output API v3\n // Move server/ to functions/__nitro.func/ and update config.json\n if (isVercel) {\n await postProcessVercelOutput(root, outputDir, fs, config, farmWorkflows, routeRuntimeManifest);\n }\n\n logger.success(`✅ Nitro build completed with preset: ${preset}`);\n}\n\nasync function copyPrebuiltSSRBundle(\n ssrBundle: OutputBundle,\n targetDir: string,\n configuredEsbuildOptions: NitroEsbuildOptions,\n minify: boolean,\n fs: typeof import(\"fs/promises\"),\n): Promise<void> {\n const {\n include: _include,\n exclude: _exclude,\n sourceMap: _sourceMap,\n loaders: _loaders,\n ...configuredTransformOptions\n } = configuredEsbuildOptions;\n const hasConfiguredTransforms = Object.keys(configuredTransformOptions).some(\n (option) => option !== \"minify\",\n );\n const transformOptions = createEsbuildTransformOptions(\n configuredEsbuildOptions,\n minify,\n \"node18\",\n );\n const transform = minify || hasConfiguredTransforms ? (await import(\"esbuild\")).transform : null;\n\n await fs.rm(targetDir, { recursive: true, force: true });\n await Promise.all(\n Object.entries(ssrBundle).map(async ([fileName, output]) => {\n const targetPath = path.join(targetDir, fileName);\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n\n if (output.type === \"asset\") {\n await fs.writeFile(targetPath, output.source);\n return;\n }\n\n let code = output.code;\n if (transform) {\n const result = await transform(code, {\n ...transformOptions,\n sourcefile: fileName,\n });\n code = result.code;\n }\n\n await fs.writeFile(targetPath, code);\n }),\n );\n}\n\nasync function registerPrebuiltSSRPackageImport(\n serverDir: string,\n ssrEntryFile: string,\n fs: typeof import(\"fs/promises\"),\n): Promise<void> {\n const packagePath = path.join(serverDir, \"package.json\");\n const packageJSON = await fs\n .readFile(packagePath, \"utf8\")\n .then((contents) => JSON.parse(contents))\n .catch((error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") return { type: \"module\" };\n throw error;\n });\n const existingImports =\n packageJSON.imports && typeof packageJSON.imports === \"object\" ? packageJSON.imports : {};\n const outputEntry = `${FARM_SSR_OUTPUT_DIR}/${ssrEntryFile}`.replace(/\\\\/g, \"/\");\n\n packageJSON.imports = {\n ...existingImports,\n [FARM_SSR_PACKAGE_IMPORT]: `./${outputEntry}`,\n };\n await fs.mkdir(serverDir, { recursive: true });\n await fs.writeFile(packagePath, `${JSON.stringify(packageJSON, null, 2)}\\n`);\n}\n\n/**\n * Post-process Vercel output to match Build Output API v3\n * Moves server/ to functions/__nitro.func/ and updates routes\n */\nasync function postProcessVercelOutput(\n root: string,\n outputDir: string,\n fs: typeof import(\"fs/promises\"),\n config: ResolvedFarmConfig,\n farmWorkflows: PreparedFarmWorkflows,\n routeRuntimeManifest: FarmRouteRuntimeManifest,\n) {\n const serverDir = path.join(outputDir, \"server\");\n const functionsDir = path.join(outputDir, \"functions\");\n const nitroFuncDir = path.join(functionsDir, \"__nitro.func\");\n const staticDir = path.join(outputDir, \"static\");\n const publicDir = path.join(outputDir, \"public\");\n\n // Create functions directory\n await fs.mkdir(nitroFuncDir, { recursive: true });\n\n // Move server contents to functions/__nitro.func/\n const serverContents = await fs.readdir(serverDir);\n for (const file of serverContents) {\n const src = path.join(serverDir, file);\n const dest = path.join(nitroFuncDir, file);\n await fs.rename(src, dest);\n }\n\n // Remove empty server directory\n await fs.rmdir(serverDir);\n\n // Rename public to static (Vercel expects static files in static/)\n try {\n await fs.rename(publicDir, staticDir);\n } catch {\n // public might not exist\n }\n\n // Add runtime assets before cloning route-specific functions.\n await copyFarmDocsContentForVercel(config, root, nitroFuncDir, fs);\n await copyPrismaClientForVercel(root, nitroFuncDir, fs);\n\n // Update config.json routes to point to the function\n const configPath = path.join(outputDir, \"config.json\");\n const configContent = await fs.readFile(configPath, \"utf-8\");\n const vercelConfig = JSON.parse(configContent);\n\n const runtimeRoutes = await createFarmVercelRouteRuntimeFunctions(\n outputDir,\n routeRuntimeManifest,\n fs,\n );\n\n // Update routes to use the correct function path\n vercelConfig.routes = [\n // Serve static files first\n {\n handle: \"filesystem\",\n },\n ...runtimeRoutes,\n // API routes\n {\n src: \"/api/(.*)\",\n dest: \"/__nitro\",\n headers: {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"*\",\n \"Access-Control-Allow-Headers\": \"*\",\n },\n },\n // All other routes go to the serverless function\n {\n src: \"/(.*)\",\n dest: \"/__nitro\",\n },\n ];\n\n const vercelConfigWithWorkflowCrons = applyFarmWorkflowVercelCrons(\n vercelConfig,\n farmWorkflows.workflows,\n );\n const vercelConfigWithCrons = applyFarmCronVercelCrons(\n vercelConfigWithWorkflowCrons,\n config.cron.jobs,\n );\n\n await fs.writeFile(configPath, JSON.stringify(vercelConfigWithCrons, null, 2));\n\n logger.info(\"✅ Post-processed Vercel output for Build Output API v3\");\n}\n\nasync function copyFarmDocsContentForVercel(\n config: ResolvedFarmConfig,\n root: string,\n nitroFuncDir: string,\n fs: typeof import(\"fs/promises\"),\n) {\n const docsContentDir = resolveBuildDocsContentDir(config, root);\n if (!docsContentDir) return;\n\n const bundledContentDir = path.join(nitroFuncDir, \"chunks\", \"nitro\", \"farm-docs-content\");\n const lastModifiedManifest = createFarmDocsLastModifiedManifest(docsContentDir, {\n fallback: \"now\",\n });\n await fs.rm(bundledContentDir, { recursive: true, force: true });\n await fs.mkdir(path.dirname(bundledContentDir), { recursive: true });\n await fs.cp(docsContentDir, bundledContentDir, {\n recursive: true,\n force: true,\n });\n await fs.writeFile(\n path.join(bundledContentDir, FARM_DOCS_LAST_MODIFIED_MANIFEST),\n `${JSON.stringify(lastModifiedManifest, null, 2)}\\n`,\n );\n\n logger.info(`📚 Bundled docs content for Vercel: ${path.relative(root, docsContentDir)}`);\n}\n\nasync function copySharpRuntime(\n config: ResolvedFarmConfig,\n root: string,\n nitroFuncDir: string,\n fs: typeof import(\"fs/promises\"),\n): Promise<void> {\n if (config.images.provider === \"none\") return;\n\n const projectRequire = createRequire(path.join(root, \"package.json\"));\n let sharpRequire = projectRequire;\n if (!resolvePackageJson(projectRequire, \"sharp\")) {\n try {\n // Applications are not required to depend on Sharp directly. Resolve\n // Farm's optional dependency from the installed framework entry when the\n // project dependency tree does not expose it.\n sharpRequire = createRequire(projectRequire.resolve(\"@farm.js/core\"));\n } catch {\n // The existing missing-Sharp diagnostic below remains authoritative.\n }\n }\n const copiedPackages = new Map<string, string>();\n const packageCopies = new Map<string, Promise<void>>();\n const targetNodeModules = path.join(nitroFuncDir, \"node_modules\");\n\n function copyPackage(packageName: string, parentRequire: NodeJS.Require): Promise<void> {\n const activeCopy = packageCopies.get(packageName);\n if (activeCopy) return activeCopy;\n\n const packageCopy = copyPackageOnce(packageName, parentRequire);\n packageCopies.set(packageName, packageCopy);\n return packageCopy;\n }\n\n async function copyPackageOnce(\n packageName: string,\n parentRequire: NodeJS.Require,\n ): Promise<void> {\n const packageJsonPath = resolvePackageJson(parentRequire, packageName);\n if (!packageJsonPath) return;\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath, \"utf8\"));\n const packageDir = path.dirname(packageJsonPath);\n const targetDir = path.join(targetNodeModules, ...packageName.split(\"/\"));\n copiedPackages.set(packageName, String(packageJson.version || \"*\"));\n\n await fs.mkdir(path.dirname(targetDir), { recursive: true });\n const packageRequire = createRequire(packageJsonPath);\n const dependencies = {\n ...packageJson.dependencies,\n ...packageJson.optionalDependencies,\n };\n await Promise.all([\n fs.cp(packageDir, targetDir, {\n recursive: true,\n force: true,\n dereference: true,\n // Reflinks make native runtime packaging nearly metadata-only on\n // supporting filesystems and transparently fall back to byte copies.\n mode: fsConstants.COPYFILE_FICLONE,\n }),\n ...Object.keys(dependencies).map((dependency) => copyPackage(dependency, packageRequire)),\n ]);\n }\n\n await copyPackage(\"sharp\", sharpRequire);\n if (!copiedPackages.has(\"sharp\")) {\n throw new Error(\n \"Farm image optimization requires sharp. Reinstall dependencies without omitting optional packages.\",\n );\n }\n\n const functionPackagePath = path.join(nitroFuncDir, \"package.json\");\n const functionPackage = JSON.parse(await fs.readFile(functionPackagePath, \"utf8\"));\n functionPackage.dependencies = {\n ...functionPackage.dependencies,\n ...Object.fromEntries([...copiedPackages].sort(([left], [right]) => left.localeCompare(right))),\n };\n await fs.writeFile(functionPackagePath, JSON.stringify(functionPackage, null, 2));\n logger.info(`🖼️ Bundled Sharp image runtime (${copiedPackages.size} packages)`);\n}\n\nfunction resolvePackageJson(parentRequire: NodeJS.Require, packageName: string): string | null {\n for (const request of [`${packageName}/package.json`, `${packageName}/package`]) {\n try {\n return parentRequire.resolve(request);\n } catch {\n // Try the next package metadata export.\n }\n }\n return null;\n}\n\nasync function copyPrismaClientForVercel(\n root: string,\n nitroFuncDir: string,\n fs: typeof import(\"fs/promises\"),\n) {\n const projectRequire = createRequire(path.join(root, \"package.json\"));\n\n let prismaClientDir: string;\n try {\n prismaClientDir = path.dirname(projectRequire.resolve(\"@prisma/client/default.js\"));\n } catch {\n return;\n }\n\n const generatedClientDir = path.join(prismaClientDir, \"..\", \"..\", \".prisma\", \"client\");\n\n try {\n await fs.access(generatedClientDir);\n } catch {\n return;\n }\n\n const targetNodeModules = path.join(nitroFuncDir, \"node_modules\");\n const targetPrismaScopeDir = path.join(targetNodeModules, \"@prisma\");\n const targetGeneratedDir = path.join(targetNodeModules, \".prisma\", \"client\");\n const targetClientDir = path.join(targetPrismaScopeDir, \"client\");\n\n await fs.mkdir(targetPrismaScopeDir, { recursive: true });\n await fs.cp(prismaClientDir, targetClientDir, {\n recursive: true,\n force: true,\n });\n await fs.cp(generatedClientDir, targetGeneratedDir, {\n recursive: true,\n force: true,\n });\n\n const functionPackagePath = path.join(nitroFuncDir, \"package.json\");\n const clientPackagePath = path.join(prismaClientDir, \"package.json\");\n const [functionPackageContent, clientPackageContent] = await Promise.all([\n fs.readFile(functionPackagePath, \"utf-8\"),\n fs.readFile(clientPackagePath, \"utf-8\"),\n ]);\n const functionPackage = JSON.parse(functionPackageContent);\n const clientPackage = JSON.parse(clientPackageContent);\n\n functionPackage.dependencies = {\n ...functionPackage.dependencies,\n \"@prisma/client\": clientPackage.version,\n };\n\n await fs.writeFile(functionPackagePath, JSON.stringify(functionPackage, null, 2));\n}\n","import path from \"path\";\nimport type { APIRouteManager } from \"./api/route-manager\";\nimport type { ResolvedFarmConfig } from \"./config\";\nimport {\n getFarmRouteRuntimeConfig,\n hasFarmRouteRuntimeControls,\n mergeFarmRouteRuntimeConfigs,\n normalizeFarmRouteRuntimeConfig,\n resolveFarmRouteRuleRuntimeConfig,\n resolveFarmRouteRuntimeConfig,\n type FarmRouteRuntimeManifest,\n type FarmRouteRuntimeManifestEntry,\n} from \"./route-runtime\";\nimport type { RouteManager } from \"./routing/route-manager\";\nimport { resolveRouteRenderingConfigFromFile } from \"./ssg\";\n\nexport const FARM_ROUTE_RUNTIME_MANIFEST = \"route-runtime-manifest.json\";\n\nexport interface FarmRouteRuntimeDeploymentValidation {\n runtime: \"node\" | \"edge\" | \"unknown\";\n warnings: string[];\n}\n\nexport async function createFarmRouteRuntimeManifest(options: {\n config: ResolvedFarmConfig;\n routeManager: RouteManager;\n apiRouteManager: APIRouteManager;\n root?: string;\n}): Promise<FarmRouteRuntimeManifest> {\n const root = path.resolve(options.root || options.config.root || process.cwd());\n const routes: FarmRouteRuntimeManifestEntry[] = [];\n\n for (const [pattern, entry] of options.routeManager.getRoutes()) {\n const routeModule = await options.routeManager.loadRouteModule(entry.modulePath);\n const rendering = await resolveRouteRenderingConfigFromFile(routeModule, entry.modulePath);\n const runtimeConfig = await options.routeManager.resolveRouteRuntimeConfig(pattern);\n\n routes.push({\n kind: \"page\",\n pattern,\n rendering: rendering.ssg ? \"static\" : \"dynamic\",\n source: normalizeManifestSource(root, entry.modulePath),\n ...runtimeConfig,\n });\n }\n\n for (const [pattern, route] of options.apiRouteManager.getRoutes()) {\n const inherited = resolveFarmRouteRuleRuntimeConfig(pattern, options.config.routeRules);\n const own = normalizeFarmRouteRuntimeConfig(\n getFarmRouteRuntimeConfig(route),\n `API route \"${pattern}\"`,\n );\n\n routes.push({\n kind: \"api\",\n pattern,\n rendering: \"dynamic\",\n source: normalizeManifestSource(root, route.filePath),\n ...resolveFarmRouteRuntimeConfig(\n mergeFarmRouteRuntimeConfigs(inherited, own),\n `API route \"${pattern}\"`,\n ),\n });\n }\n\n for (const [pattern, rule] of Object.entries(options.config.routeRules)) {\n if (!hasFarmRouteRuntimeControls(rule)) continue;\n\n routes.push({\n kind: \"rule\",\n pattern,\n rendering: rule.prerender || rule.render === \"static\" ? \"static\" : \"dynamic\",\n ...resolveFarmRouteRuntimeConfig(rule, `Route rule \"${pattern}\"`),\n });\n }\n\n return {\n version: 1,\n routes,\n };\n}\n\nexport async function writeFarmRouteRuntimeManifest(\n directory: string,\n manifest: FarmRouteRuntimeManifest,\n): Promise<string> {\n const fs = await import(\"fs/promises\");\n const manifestPath = path.join(directory, FARM_ROUTE_RUNTIME_MANIFEST);\n await fs.mkdir(directory, { recursive: true });\n await fs.writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`);\n return manifestPath;\n}\n\nexport function validateFarmRouteRuntimeDeployment(\n manifest: FarmRouteRuntimeManifest,\n preset: string,\n): FarmRouteRuntimeDeploymentValidation {\n const runtime = getPresetRuntime(preset);\n const warnings = new Set<string>();\n\n for (const route of manifest.routes) {\n if (route.rendering === \"static\") continue;\n\n if (runtime !== \"unknown\" && route.runtime !== \"auto\" && route.runtime !== runtime) {\n throw new Error(\n `Route \"${route.pattern}\" requires the ${route.runtime} runtime, but preset \"${preset}\" emits ${runtime} functions. Choose a compatible preset or change the route runtime.`,\n );\n }\n\n if (route.regions?.length && preset !== \"vercel\" && preset !== \"vercel-edge\") {\n warnings.add(\n `Preset \"${preset}\" does not map per-route regions; Farm kept them in ${FARM_ROUTE_RUNTIME_MANIFEST} for deployment adapters.`,\n );\n }\n\n if (route.maxDuration && preset !== \"vercel\") {\n warnings.add(\n `Preset \"${preset}\" does not map per-route maxDuration; Farm kept it in ${FARM_ROUTE_RUNTIME_MANIFEST} for deployment adapters.`,\n );\n }\n }\n\n return { runtime, warnings: Array.from(warnings) };\n}\n\nexport function getPresetRuntime(preset: string): FarmRouteRuntimeDeploymentValidation[\"runtime\"] {\n if (\n preset === \"cloudflare\" ||\n preset === \"cloudflare-pages\" ||\n preset === \"cloudflare-module\" ||\n preset === \"netlify-edge\" ||\n preset === \"vercel-edge\" ||\n preset === \"deno\"\n ) {\n return \"edge\";\n }\n\n if (\n preset === \"node-server\" ||\n preset === \"vercel\" ||\n preset === \"netlify\" ||\n preset === \"aws-lambda\" ||\n preset === \"azure\" ||\n preset === \"firebase\" ||\n preset === \"bun\"\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\nfunction normalizeManifestSource(root: string, modulePath: string): string {\n const queryIndex = modulePath.indexOf(\"?\");\n const filePath = queryIndex === -1 ? modulePath : modulePath.slice(0, queryIndex);\n const query = queryIndex === -1 ? \"\" : modulePath.slice(queryIndex);\n const relativePath = path.isAbsolute(filePath) ? path.relative(root, filePath) : filePath;\n return `${relativePath.replace(/\\\\/g, \"/\")}${query}`;\n}\n","import path from \"path\";\nimport {\n createFarmRouteRuntimeKey,\n type FarmRouteRuntimeManifest,\n type FarmRouteRuntimeManifestEntry,\n type ResolvedFarmRouteRuntimeConfig,\n} from \"../route-runtime\";\n\nexport interface FarmVercelRuntimeRoute {\n src: string;\n dest: string;\n headers?: Record<string, string>;\n}\n\ntype FileSystemPromises = typeof import(\"fs/promises\");\n\n/** Materialize one Node function per distinct region/duration policy. */\nexport async function createFarmVercelRouteRuntimeFunctions(\n outputDir: string,\n manifest: FarmRouteRuntimeManifest,\n fs: FileSystemPromises,\n): Promise<FarmVercelRuntimeRoute[]> {\n const dynamicRoutes = manifest.routes.filter(\n (route) => route.rendering === \"dynamic\" && route.runtime !== \"edge\",\n );\n if (!dynamicRoutes.some(hasVercelFunctionControls)) return [];\n\n const configuredRoutes = dynamicRoutes\n .filter((route) => route.kind !== \"rule\" || hasVercelFunctionControls(route))\n .sort(compareRuntimeRoutes);\n if (configuredRoutes.length === 0) return [];\n\n const groups = new Map<\n string,\n { config: ResolvedFarmRouteRuntimeConfig; routes: FarmRouteRuntimeManifestEntry[] }\n >();\n\n for (const route of configuredRoutes) {\n const config = {\n runtime: route.runtime === \"auto\" ? \"node\" : route.runtime,\n regions: route.regions,\n maxDuration: route.maxDuration,\n } satisfies ResolvedFarmRouteRuntimeConfig;\n const key = createFarmRouteRuntimeKey(config);\n const group = groups.get(key) || { config, routes: [] };\n group.routes.push(route);\n groups.set(key, group);\n }\n\n const functionsDir = path.join(outputDir, \"functions\");\n const baseFunctionDir = path.join(functionsDir, \"__nitro.func\");\n const destinations = new Map<string, string>();\n let groupIndex = 0;\n\n for (const [key, group] of groups) {\n if (!group.config.regions?.length && !group.config.maxDuration) {\n destinations.set(key, \"/__nitro\");\n continue;\n }\n\n groupIndex += 1;\n const functionName = `__farm_runtime_${groupIndex}`;\n const functionDir = path.join(functionsDir, `${functionName}.func`);\n await fs.cp(baseFunctionDir, functionDir, { recursive: true, force: true });\n await configureVercelFunction(functionDir, group.config, fs);\n destinations.set(key, `/${functionName}`);\n }\n\n const routes: FarmVercelRuntimeRoute[] = [];\n const seenSources = new Set<string>();\n for (const route of configuredRoutes) {\n const src = farmRoutePatternToVercelSource(route.pattern);\n if (seenSources.has(src)) continue;\n seenSources.add(src);\n const key = createFarmRouteRuntimeKey({\n runtime: route.runtime === \"auto\" ? \"node\" : route.runtime,\n regions: route.regions,\n maxDuration: route.maxDuration,\n });\n routes.push({\n src,\n dest: destinations.get(key) || \"/__nitro\",\n ...(route.kind === \"api\" || route.pattern.startsWith(\"/api/\")\n ? {\n headers: {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"*\",\n \"Access-Control-Allow-Headers\": \"*\",\n },\n }\n : {}),\n });\n }\n\n return routes;\n}\n\nexport function farmRoutePatternToVercelSource(pattern: string): string {\n const normalized = normalizePattern(pattern);\n if (normalized === \"/\") return \"/\";\n\n let source = \"\";\n for (const segment of normalized.split(\"/\").filter(Boolean)) {\n if (segment === \"**\" || /^\\[\\[\\.\\.\\..+\\]\\]$/.test(segment)) {\n source += \"(?:/(.*))?\";\n } else if (/^\\[\\.\\.\\..+\\]$/.test(segment)) {\n source += \"/(.+)\";\n } else if (segment === \"*\" || /^\\[.+\\]$/.test(segment)) {\n source += \"/([^/]+)\";\n } else {\n source += `/${escapeRegExp(segment)}`;\n }\n }\n\n return source || \"/\";\n}\n\nasync function configureVercelFunction(\n functionDir: string,\n config: ResolvedFarmRouteRuntimeConfig,\n fs: FileSystemPromises,\n): Promise<void> {\n const configPath = path.join(functionDir, \".vc-config.json\");\n const current = JSON.parse(await fs.readFile(configPath, \"utf8\"));\n const next = {\n ...current,\n ...(config.regions?.length ? { regions: config.regions } : {}),\n ...(config.maxDuration ? { maxDuration: config.maxDuration } : {}),\n };\n await fs.writeFile(configPath, `${JSON.stringify(next, null, 2)}\\n`);\n}\n\nfunction hasVercelFunctionControls(route: FarmRouteRuntimeManifestEntry): boolean {\n return Boolean(route.regions?.length || route.maxDuration);\n}\n\nfunction compareRuntimeRoutes(\n left: FarmRouteRuntimeManifestEntry,\n right: FarmRouteRuntimeManifestEntry,\n): number {\n const kindOrder = { page: 0, api: 0, rule: 1 };\n const kindDifference = kindOrder[left.kind] - kindOrder[right.kind];\n if (kindDifference !== 0) return kindDifference;\n\n const specificityDifference =\n getPatternSpecificity(right.pattern) - getPatternSpecificity(left.pattern);\n return specificityDifference || left.pattern.localeCompare(right.pattern);\n}\n\nfunction getPatternSpecificity(pattern: string): number {\n return normalizePattern(pattern)\n .split(\"/\")\n .filter(Boolean)\n .reduce((score, segment) => {\n if (segment === \"**\" || segment.startsWith(\"[[...\")) return score + 1;\n if (segment === \"*\" || segment.startsWith(\"[...\")) return score + 10;\n if (/^\\[.+\\]$/.test(segment)) return score + 50;\n return score + 100;\n }, 0);\n}\n\nfunction normalizePattern(value: string): string {\n const trimmed = value.trim();\n const withSlash = trimmed.startsWith(\"/\") ? trimmed : `/${trimmed}`;\n return withSlash.length > 1 ? withSlash.replace(/\\/+$/, \"\") : withSlash;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import type { FarmProductionViteBuilder } from \"./production-vite\";\n\ntype VitePluginLike = {\n name?: string;\n transform?: unknown;\n};\n\ntype VitePluginHook = (...args: any[]) => any;\n\n/**\n * Tailwind 4.1 supports Farm's Node 18 baseline, but its Vite plugin resolves\n * against Farm's Vite 5 compatibility dependency. When that plugin runs in\n * Vite 8 it mistakes the active environment for its own Vite environment and\n * calls an API that Vite 5 does not export. Keep its documented Vite 5 hook\n * path while Farm uses the Rolldown production builder.\n */\nexport function adaptTailwindVitePlugin<T>(pluginOption: T, builder: FarmProductionViteBuilder): T {\n if (builder !== \"rolldown\") return pluginOption;\n return adaptPluginOption(pluginOption) as T;\n}\n\nfunction adaptPluginOption(pluginOption: unknown): unknown {\n if (Array.isArray(pluginOption)) return pluginOption.map(adaptPluginOption);\n if (!pluginOption || typeof pluginOption !== \"object\") return pluginOption;\n\n const plugin = pluginOption as VitePluginLike;\n if (!plugin.name?.startsWith(\"@tailwindcss/vite:generate:\")) return pluginOption;\n\n if (isVitePluginHook(plugin.transform)) {\n return {\n ...plugin,\n transform: withVite5TransformContext(plugin.transform),\n };\n }\n\n if (\n plugin.transform &&\n typeof plugin.transform === \"object\" &&\n \"handler\" in plugin.transform &&\n isVitePluginHook(plugin.transform.handler)\n ) {\n return {\n ...plugin,\n transform: {\n ...plugin.transform,\n handler: withVite5TransformContext(plugin.transform.handler),\n },\n };\n }\n\n return pluginOption;\n}\n\nfunction isVitePluginHook(value: unknown): value is VitePluginHook {\n return typeof value === \"function\";\n}\n\nfunction withVite5TransformContext<T extends (...args: any[]) => any>(handler: T): T {\n return function (this: object, ...args: Parameters<T>): ReturnType<T> {\n const context = new Proxy(this, {\n get(target, property, receiver) {\n if (property === \"environment\") return undefined;\n return Reflect.get(target, property, receiver);\n },\n });\n return handler.apply(context, args);\n } as T;\n}\n"],"mappings":"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AK,CAAC;AAAA;AAAA;AAAA;AAAA,EAIxB,iBAAiB,KAAK,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5B,oBAAoB,KAAK,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqM/B,oCAAoC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmErC,uCAAuC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAgUQ,uBACI;AAAA;AAAA,aAGA,2BACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BA2SI,uBACI;AAAA;AAAA,eAGA,4BACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["path","path","path","path","path","clone","PluginManager","buildClient","path","PluginManager"]}