{"version":3,"sources":["../src/server/create-server.ts"],"sourcesContent":["import { createServer as createViteServer, type ViteDevServer } from \"vite\";\nimport type { FarmConfig } from \"../types\";\nimport { farmI18nClientBridgePlugin, farmPlugin } from \"../vite\";\nimport { logger } from \"../utils\";\nimport { loadConfig, resolveConfig } from \"../config\";\nimport { FarmRuntimeShutdownError, PluginManager } from \"../plugin\";\nimport { farmEnvironmentFunctionsPlugin } from \"../environment-vite\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport {\n  createRedirectsPlugin,\n  createHeadersPlugin,\n  createRewritesPlugin,\n  createCompressionPlugin,\n  createLoggerPlugin,\n} from \"../plugins\";\nimport {\n  createFarmClientOptimizeDepsConfig,\n  createFarmClientOptimizeDepsEntries,\n  mergeFarmViteConfig,\n} from \"./vite-config\";\nimport { FARM_VERSION } from \"../version\";\nimport { getFarmAppDirectories } from \"../layers\";\nimport { createCliColors } from \"../cli-colors\";\nimport { createFarmThemeCssPlugin } from \"../theme/vite\";\nimport {\n  createFarmInstrumentationLifecycle,\n  loadFarmInstrumentation,\n  resolveFarmInstrumentationFile,\n  type FarmInstrumentationLifecycle,\n} from \"../instrumentation\";\nimport { loadFarmRendererVitePlugins, resolveFarmRenderer } from \"../renderer\";\n\nexport const DEFAULT_FARM_DEV_SERVER_PORT = 3000;\n\n/**\n * Upper bound on waiting for Vite's own close. Vite 5.4 can strand its plugin\n * container's in-flight promises when closed after dependency discovery has\n * started (#1263); farm's shutdown must not inherit that hang.\n */\nconst VITE_CLOSE_TIMEOUT_MS = 10_000;\n\n// Farm.js branding plugin for createServer\nfunction createBrandingPlugin() {\n  let serverStarted = false;\n  let startTime = Date.now();\n\n  return {\n    name: \"farm:branding\",\n    enforce: \"pre\" as const,\n    configureServer(server: ViteDevServer) {\n      startTime = Date.now();\n\n      const originalListen = server.listen.bind(server);\n      server.listen = async (port?: number, ...args: any[]) => {\n        const result = await originalListen(port, ...args);\n        if (!serverStarted) {\n          serverStarted = true;\n          const elapsed = Date.now() - startTime;\n          const address = server.httpServer?.address();\n          const resolvedPort =\n            typeof address === \"object\" && address\n              ? address.port\n              : server.config.server.port || port || 3000;\n\n          const pc = createCliColors();\n          console.log(\"\");\n          console.log(\n            `  ${pc.bold(pc.green(\"Farm.js\"))} ${pc.dim(`v${FARM_VERSION}`)} ${pc.dim(`ready in ${elapsed}ms`)}`,\n          );\n          console.log(\"\");\n          console.log(\n            `  ${pc.dim(\"➜\")}  ${pc.bold(\"Local:\")}   ${pc.cyan(`http://localhost:${resolvedPort}/`)}`,\n          );\n          console.log(`  ${pc.dim(\"➜\")}  ${pc.bold(\"Network:\")} ${pc.dim(\"use --host to expose\")}`);\n          console.log(\"\");\n        }\n        return result;\n      };\n    },\n  };\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  return candidates.some((file) => fs.existsSync(path.join(root, file)));\n}\n\nfunction createDevDependencyStubsPlugin() {\n  const stubs: Record<string, string> = {\n    \"supports-color\":\n      \"const disabled = false; export default { stdout: disabled, stderr: disabled }; export const stdout = disabled; export const stderr = disabled;\",\n  };\n\n  return {\n    name: \"farm:dev-dependency-stubs\",\n    enforce: \"pre\" as const,\n    resolveId(id: string) {\n      if (id in stubs) {\n        return `\\0farm-dev-dependency-stub:${id}`;\n      }\n      return null;\n    },\n    load(id: string) {\n      if (!id.startsWith(\"\\0farm-dev-dependency-stub:\")) {\n        return null;\n      }\n\n      const moduleName = id.slice(\"\\0farm-dev-dependency-stub:\".length);\n      return stubs[moduleName] || null;\n    },\n  };\n}\n\n/**\n * Create a Vite development server with Farm.js integration\n */\nexport async function createServer(config: FarmConfig = {}) {\n  let pluginManager: PluginManager | null = null;\n  let instrumentation: FarmInstrumentationLifecycle | null = null;\n  try {\n    const root = config.root || process.cwd();\n\n    // Load farm.config.ts if it exists\n    const mode = process.env.NODE_ENV === \"production\" ? \"production\" : \"development\";\n    const userConfig = await loadConfig(root, undefined, mode);\n\n    const resolvedConfig = userConfig ? await resolveConfig(userConfig, mode) : null;\n    const instrumentationConfig = resolvedConfig || config;\n    const instrumentationRoot = instrumentationConfig.root || root;\n    const instrumentationFile = resolveFarmInstrumentationFile(\n      instrumentationRoot,\n      instrumentationConfig.srcDir || \"src\",\n    );\n    const instrumentationModule = await loadFarmInstrumentation(\n      instrumentationFile,\n      instrumentationRoot,\n    );\n    instrumentation = createFarmInstrumentationLifecycle(instrumentationModule, {\n      root: instrumentationRoot,\n      mode,\n      runtime: \"nodejs\",\n    });\n    await instrumentation.start();\n\n    // Initialize plugin manager\n    pluginManager = new PluginManager({\n      config: resolvedConfig || config,\n      isDev: mode === \"development\",\n      isProd: mode === \"production\",\n    });\n\n    // Add built-in plugins if config is available\n    if (resolvedConfig) {\n      const redirects = await resolvedConfig.redirects();\n      const headers = await resolvedConfig.headers();\n      const rewrites = await resolvedConfig.rewrites();\n\n      if (redirects.length > 0) {\n        pluginManager.addPlugin(createRedirectsPlugin(redirects, { i18n: resolvedConfig.i18n }));\n      }\n\n      if (headers.length > 0) {\n        pluginManager.addPlugin(createHeadersPlugin(headers, { i18n: resolvedConfig.i18n }));\n      }\n\n      if (rewrites.length > 0) {\n        pluginManager.addPlugin(createRewritesPlugin(rewrites, { i18n: resolvedConfig.i18n }));\n      }\n\n      // Compression is applied by production adapters. Its hook is a no-op in\n      // development, so do not put every dev response through that lifecycle.\n      if (resolvedConfig.compress && mode === \"production\") {\n        pluginManager.addPlugin(createCompressionPlugin());\n      }\n\n      if (resolvedConfig.plugins) {\n        pluginManager.addPlugins(resolvedConfig.plugins);\n      }\n    }\n\n    if (mode === \"development\") {\n      const hasLogger = pluginManager.getPlugins().some((p) => p.name === \"farm:logger\");\n      if (!hasLogger) {\n        pluginManager.addPlugin(createLoggerPlugin());\n      }\n    }\n\n    // Run config hooks\n    await pluginManager.runHookParallel(\"init\");\n\n    let finalConfig = resolvedConfig || config;\n    finalConfig = await pluginManager.runHookSerial(\"config\", finalConfig);\n    finalConfig.renderer = resolveFarmRenderer(finalConfig.renderer);\n    const projectRoot = finalConfig.root || process.cwd();\n    const rendererVitePlugins = await loadFarmRendererVitePlugins(\n      finalConfig.renderer,\n      projectRoot,\n      { ssr: true },\n    );\n\n    let tailwindVitePlugin: any = undefined;\n    const shouldUseProjectPostcss = hasProjectPostcssConfig(projectRoot);\n    if (shouldUseProjectPostcss) {\n      logger.info(\"📦 Using project PostCSS/Tailwind configuration\");\n    } else {\n      try {\n        const tailwindcss = (await import(\"@tailwindcss/vite\")).default;\n        tailwindVitePlugin = tailwindcss();\n      } catch (error) {\n        logger.warn(\n          `Tailwind plugin auto-enable failed; continuing without it: ${(error as Error).message}`,\n        );\n      }\n    }\n\n    const server = await createViteServer(\n      mergeFarmViteConfig(\n        {\n          root: projectRoot,\n          css: shouldUseProjectPostcss ? undefined : { postcss: { plugins: [] } },\n          plugins: [\n            createFarmThemeCssPlugin(finalConfig.theme, finalConfig.basePath),\n            ...(tailwindVitePlugin ? [tailwindVitePlugin] : []),\n            ...(rendererVitePlugins as any[]),\n            createDevDependencyStubsPlugin(),\n            farmI18nClientBridgePlugin(),\n            farmPlugin(finalConfig, pluginManager),\n            farmEnvironmentFunctionsPlugin(),\n            createBrandingPlugin(),\n          ],\n          server: {\n            middlewareMode: false,\n            port: DEFAULT_FARM_DEV_SERVER_PORT,\n            strictPort: true,\n          },\n          resolve: {\n            // Keep framework and application modules on one renderer runtime.\n            dedupe: [...(finalConfig.renderer.dedupe || [])],\n          },\n          optimizeDeps: {\n            ...createFarmClientOptimizeDepsConfig(\n              createFarmClientOptimizeDepsEntries(projectRoot, getFarmAppDirectories(finalConfig)),\n              finalConfig.renderer,\n            ),\n            exclude: [\n              \"@farm.js/core/server\",\n              \"@farm.js/core/api\",\n              \"@farm.js/core/middleware\",\n              \"@farm.js/core/config\",\n              \"nitro\",\n              \"h3\",\n              \"vite\",\n              \"esbuild\",\n              \"rollup\",\n              \"fsevents\",\n              \"nf3\",\n              \"better-call\",\n              \"zod\",\n              \"supports-color\",\n              \"node-fetch\",\n              \"consola\",\n              \"mock-aws-s3\",\n              \"aws-sdk\",\n              \"nock\",\n              \"lightningcss\",\n              \"@tailwindcss/oxide\",\n            ],\n          },\n          ssr: {\n            noExternal: [\"farm\"],\n          },\n          customLogger: {\n            info: () => {},\n            warn: () => {},\n            warnOnce: () => {},\n            error: (msg) => logger.error(String(msg)),\n            clearScreen: () => {},\n            hasErrorLogged: () => false,\n            hasWarned: false,\n          },\n        },\n        finalConfig.vite,\n      ),\n    );\n\n    (server as any).__farmPluginManager = pluginManager;\n    (server as any).__farmInstrumentation = instrumentation;\n    const closeViteServer = server.close.bind(server);\n\n    /**\n     * Tear the whole dev runtime down once, collecting every failure.\n     *\n     * Plugin disposers own real resources — database pools, queue consumers —\n     * so a caller awaiting close() has to be able to await them too, and a\n     * failure has to surface instead of disappearing into an event listener.\n     */\n    let shutdownPromise: Promise<void> | undefined;\n    const shutdownFarmDevRuntime = (): Promise<void> => {\n      shutdownPromise ??= (async () => {\n        const failures: Array<{ label: string; error: unknown }> = [];\n        const step = async (label: string, run: () => Promise<unknown> | undefined) => {\n          try {\n            await run();\n          } catch (error) {\n            failures.push({ label, error });\n          }\n        };\n\n        // Stop serving first, then release what the plugins hold, then flush\n        // telemetry last so shutdown problems are still reported.\n        // Vite 5.4's close() can deadlock after the client entry has been\n        // transformed: background pre-transforms of its bare imports wait in\n        // the optimized-deps load hook for a dependency run that\n        // depsOptimizer.close() cancels without settling, and the plugin\n        // container then awaits those promises forever (#1263). Bound the wait\n        // so farm's own teardown — plugin disposers, instrumentation — still\n        // runs, and report loudly instead of hanging the caller. The listen\n        // sockets and watchers have already settled by this point; only the\n        // container's internal await is stuck.\n        await step(\"Vite server close\", async () => {\n          let timer: ReturnType<typeof setTimeout> | undefined;\n          const timedOut = new Promise<\"timeout\">((resolve) => {\n            timer = setTimeout(() => resolve(\"timeout\"), VITE_CLOSE_TIMEOUT_MS);\n            timer.unref?.();\n          });\n          try {\n            const outcome = await Promise.race([\n              closeViteServer().then(() => \"closed\" as const),\n              timedOut,\n            ]);\n            if (outcome === \"timeout\") {\n              logger.error(\n                `Vite server close did not settle within ${VITE_CLOSE_TIMEOUT_MS}ms; ` +\n                  \"continuing shutdown without it (https://github.com/farming-labs/farm.js/issues/1263)\",\n              );\n              // Best effort, all idempotent: make sure nothing keeps serving\n              // even though the container promise is stranded.\n              await Promise.allSettled([\n                new Promise<void>((resolve) => {\n                  if (!server.httpServer || !server.httpServer.listening) return resolve();\n                  server.httpServer.close(() => resolve());\n                }),\n                Promise.resolve(server.watcher?.close?.()).catch(() => {}),\n                Promise.resolve((server as any).ws?.close?.()).catch(() => {}),\n              ]);\n            }\n          } finally {\n            if (timer) clearTimeout(timer);\n          }\n        });\n        await step(\"Plugin runtime shutdown\", () =>\n          pluginManager?.closeRuntime(\"dev-server-closed\"),\n        );\n        await step(\"Instrumentation shutdown\", () => instrumentation?.shutdown());\n\n        // A single failure propagates unchanged so existing callers keep the\n        // error they already handle; several are aggregated with their stage.\n        if (failures.length === 1) throw failures[0]!.error;\n        if (failures.length > 1) {\n          throw new FarmRuntimeShutdownError(\n            `Dev server shutdown failed during ${failures.map(({ label }) => label).join(\", \")}`,\n            failures.map(({ error }) => error),\n          );\n        }\n      })();\n      return shutdownPromise;\n    };\n\n    server.close = shutdownFarmDevRuntime;\n    // A directly closed HTTP server still has to release the same resources.\n    // close() is memoized, so this cannot double-dispose.\n    server.httpServer?.once(\"close\", () => {\n      shutdownFarmDevRuntime().catch((error) => {\n        logger.warn(`Dev server shutdown failed: ${error}`);\n      });\n    });\n\n    // Update plugin manager with vite server\n    pluginManager.updateContext({ config: finalConfig, viteServer: server });\n    await pluginManager.setupPlugins();\n    await pluginManager.runHookParallel(\"devServerCreated\", server);\n\n    // Run configResolved hooks\n    await pluginManager.runHookParallel(\"configResolved\", finalConfig);\n\n    // Run buildStart hooks\n    await pluginManager.runHookParallel(\"buildStart\");\n\n    return server;\n  } catch (error) {\n    if (pluginManager) {\n      await pluginManager.runHookParallel(\"onError\", {\n        phase: \"createServer\",\n        error,\n      });\n    }\n    await instrumentation?.shutdown().catch(() => {});\n    logger.error(`Failed to create server: ${error}`);\n    throw error;\n  }\n}\n\n/**\n * Start the development server\n */\nexport async function startDevServer(config: FarmConfig = {}, port?: number) {\n  const server = await createServer(config);\n\n  try {\n    await server.listen(port);\n    const pluginManager = (server as any).__farmPluginManager as PluginManager | undefined;\n    // Shutdown is owned by the close() installed in createServer, which awaits\n    // the plugin runtime and reports failures rather than swallowing them.\n    await pluginManager?.startRuntime();\n  } catch (error) {\n    // createServer already opened watchers, instrumentation, and plugin\n    // resources. A failure here — an occupied port is the common one — would\n    // otherwise leave all of them running with no handle to close them, since\n    // the caller never receives the server.\n    try {\n      await server.close();\n    } catch (closeError) {\n      logger.error(`Failed to clean up after a failed dev server start: ${closeError}`);\n    }\n    throw error;\n  }\n\n  // Branding is handled by farmBrandingPlugin in vite.ts\n  return server;\n}\n"],"mappings":"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","names":[]}