@farm.js/core 0.1.0-beta.19 → 0.1.0-beta.21

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.
Files changed (45) hide show
  1. package/dist/agent-runtime.cjs.map +1 -1
  2. package/dist/agent-runtime.mjs +1 -1
  3. package/dist/{chunk-UNDUIGWC.mjs → chunk-A53LP5QG.mjs} +2 -2
  4. package/dist/chunk-A53LP5QG.mjs.map +1 -0
  5. package/dist/{chunk-7BX7NEA7.mjs → chunk-CEVMYGDL.mjs} +2 -2
  6. package/dist/chunk-CEVMYGDL.mjs.map +1 -0
  7. package/dist/{chunk-ZYDQS2TT.mjs → chunk-CRN3AH35.mjs} +1 -1
  8. package/dist/chunk-CRN3AH35.mjs.map +1 -0
  9. package/dist/{chunk-JUQB43GK.mjs → chunk-FKKM7HVF.mjs} +4 -4
  10. package/dist/{chunk-MFH7BNPY.mjs → chunk-I3UWA2P2.mjs} +2 -2
  11. package/dist/{chunk-MFH7BNPY.mjs.map → chunk-I3UWA2P2.mjs.map} +1 -1
  12. package/dist/{chunk-5VHPEW6N.mjs → chunk-LLPN5SEZ.mjs} +2 -2
  13. package/dist/{chunk-ZYHIM7O7.mjs → chunk-VIC7NJ77.mjs} +12 -10
  14. package/dist/{chunk-ZYHIM7O7.mjs.map → chunk-VIC7NJ77.mjs.map} +1 -1
  15. package/dist/{devtools-4RDGBT72.mjs → devtools-52FYXIEK.mjs} +3 -3
  16. package/dist/docs.cjs.map +1 -1
  17. package/dist/docs.mjs +3 -3
  18. package/dist/index.cjs +7 -5
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.mjs +7 -7
  21. package/dist/integrations.cjs.map +1 -1
  22. package/dist/integrations.mjs +1 -1
  23. package/dist/internal/build-runtime.cjs +7 -5
  24. package/dist/internal/build-runtime.cjs.map +1 -1
  25. package/dist/internal/build-runtime.mjs +7 -7
  26. package/dist/internal/config-runtime.cjs.map +1 -1
  27. package/dist/internal/config-runtime.mjs +2 -2
  28. package/dist/plugin.cjs.map +1 -1
  29. package/dist/plugin.mjs +4 -4
  30. package/dist/server.cjs +1 -1
  31. package/dist/server.cjs.map +1 -1
  32. package/dist/server.mjs +5 -5
  33. package/dist/version.cjs +1 -1
  34. package/dist/version.cjs.map +1 -1
  35. package/dist/version.mjs +1 -1
  36. package/dist/vite.cjs +1 -1
  37. package/dist/vite.cjs.map +1 -1
  38. package/dist/vite.mjs +3 -3
  39. package/package.json +1 -1
  40. package/dist/chunk-7BX7NEA7.mjs.map +0 -1
  41. package/dist/chunk-UNDUIGWC.mjs.map +0 -1
  42. package/dist/chunk-ZYDQS2TT.mjs.map +0 -1
  43. /package/dist/{chunk-JUQB43GK.mjs.map → chunk-FKKM7HVF.mjs.map} +0 -0
  44. /package/dist/{chunk-5VHPEW6N.mjs.map → chunk-LLPN5SEZ.mjs.map} +0 -0
  45. /package/dist/{devtools-4RDGBT72.mjs.map → devtools-52FYXIEK.mjs.map} +0 -0
package/dist/vite.mjs CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  farmI18nClientBridgePlugin,
4
4
  farmPlugin,
5
5
  rewriteEarlySsrRelativeImports
6
- } from "./chunk-JUQB43GK.mjs";
6
+ } from "./chunk-FKKM7HVF.mjs";
7
7
  import "./chunk-LGHEOHBU.mjs";
8
8
  import "./chunk-FRPWCMMG.mjs";
9
9
  import "./chunk-53MVSX3R.mjs";
@@ -26,7 +26,7 @@ import "./chunk-ZVWA4ZQ3.mjs";
26
26
  import "./chunk-7FBJLMQH.mjs";
27
27
  import "./chunk-4E6VRJ6P.mjs";
28
28
  import "./chunk-GXASWWJU.mjs";
29
- import "./chunk-ZYDQS2TT.mjs";
29
+ import "./chunk-CRN3AH35.mjs";
30
30
  import "./chunk-T4QJQK76.mjs";
31
31
  import "./chunk-MIUW47JX.mjs";
32
32
  import "./chunk-P7QDS5AT.mjs";
@@ -44,7 +44,7 @@ import "./chunk-KQCOGTU7.mjs";
44
44
  import "./chunk-YTMDIHQN.mjs";
45
45
  import "./chunk-RHIFZZUI.mjs";
46
46
  import "./chunk-LM2YNO4U.mjs";
47
- import "./chunk-MFH7BNPY.mjs";
47
+ import "./chunk-I3UWA2P2.mjs";
48
48
  import "./chunk-B3FFOIWS.mjs";
49
49
  import "./chunk-ITN462YM.mjs";
50
50
  import "./chunk-3HIVDX7J.mjs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farm.js/core",
3
- "version": "0.1.0-beta.19",
3
+ "version": "0.1.0-beta.21",
4
4
  "description": "Core Farm.js framework for modern integrated apps",
5
5
  "keywords": [
6
6
  "@farm.js/core",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config.ts"],"sourcesContent":["import type {\n FarmConfig as BaseFarmConfig,\n FarmMigrationCommand,\n FarmMigrationsConfig,\n FarmMigrationsUserConfig,\n ResolvedFarmMigrationsConfig,\n} from \"./types\";\nimport type { DocsConfig } from \"@farming-labs/docs\";\nimport type { FarmDocsResolvedConfig, FarmDocsUserConfig } from \"./docs/types\";\nimport type { FarmIntegrationsUserConfig } from \"./integrations\";\nimport type { FarmMarkdownResolvedConfig, FarmMarkdownUserConfig } from \"./markdown\";\nimport type { FarmObservabilityUserConfig } from \"./observability\";\nimport type { FarmMiddlewareConfig } from \"./middleware/types\";\nimport type { FarmPlugin } from \"./plugin\";\nimport type { FarmWorkflowsResolvedConfig, FarmWorkflowsUserConfig } from \"./workflows\";\nimport type { FarmCronResolvedConfig, FarmCronUserConfig } from \"./cron\";\nimport type { FarmEnvConfig, ResolvedFarmEnv } from \"./env\";\nimport type { UserConfig as ViteUserConfig } from \"vite\";\nimport { resolveIntegrationPlugins } from \"./integrations\";\nimport { resolveMarkdownConfig } from \"./markdown\";\nimport { resolveWorkflowsConfig } from \"./workflows\";\nimport { resolveCronConfig } from \"./cron\";\nimport { resolveEnv, setEnv } from \"./env\";\nimport {\n resolveMdxConfig,\n type FarmMdxResolvedConfig,\n type FarmMdxUserConfig,\n} from \"./app-markdown\";\nimport {\n normalizeRouteRules,\n routeRulesToHeaders,\n routeRulesToRedirects,\n type FarmRouteRules,\n} from \"./route-rules\";\nimport {\n resolveServerActionsConfig,\n type FarmServerActionsConfig,\n type ResolvedFarmServerActionsConfig,\n} from \"./server-action-security\";\nimport {\n resolveFarmServerConfig,\n type FarmServerConfig,\n type ResolvedFarmServerConfig,\n} from \"./server-http\";\nimport {\n loadFarmConfigFile,\n resolveFarmLayers,\n type FarmLayerEntry,\n type ResolvedFarmLayer,\n} from \"./layers\";\nimport path from \"path\";\nimport { normalizeFarmDeploymentId } from \"./deployment\";\nimport { resolveFarmDevtoolsConfig, type ResolvedFarmDevtoolsConfig } from \"./devtools-config\";\nimport {\n resolveFarmImageConfig,\n type FarmImageConfig,\n type ResolvedFarmImageConfig,\n} from \"./image-config\";\nimport { resolveFarmI18nConfig } from \"./i18n/config\";\nimport type { FarmI18nUserConfig, ResolvedFarmI18nConfig } from \"./i18n/types\";\nimport type { FarmCacheUserConfig } from \"./cache\";\nimport {\n resolveFarmAuthConfig,\n resolveFarmAuthIntegration,\n type FarmAuthUserConfig,\n type ResolvedFarmAuthConfig,\n} from \"./auth-config\";\nimport { resolveFarmPerformanceConfig, type ResolvedFarmPerformanceConfig } from \"./preload\";\nimport {\n getFarmSecurityHeader,\n resolveFarmSecurityConfig,\n type FarmCspConfig,\n type FarmCspDirectives,\n type FarmCspDirectiveValue,\n type FarmCspOptions,\n type FarmSecurityConfig,\n type ResolvedFarmCspConfig,\n type ResolvedFarmSecurityConfig,\n} from \"./security\";\n\nconst FARM_RESOLVED_CUSTOM_CONTEXT = Symbol.for(\"farm.resolvedCustomContext\");\n\nexport type {\n FarmDocsConfigInput,\n FarmDocsNavigationConfig,\n FarmDocsResolvedConfig,\n FarmDocsSidebarItem,\n FarmDocsUserConfig,\n} from \"./docs/types\";\nexport type {\n FarmMarkdownResolvedConfig,\n FarmMarkdownRouteInput,\n FarmMarkdownUserConfig,\n} from \"./markdown\";\nexport type { FarmMdxComponents, FarmMdxResolvedConfig, FarmMdxUserConfig } from \"./app-markdown\";\nexport type {\n FarmMigrationCommand,\n FarmMigrationsConfig,\n FarmMigrationsUserConfig,\n ResolvedFarmMigrationsConfig,\n} from \"./types\";\nexport type { FarmWorkflowsResolvedConfig, FarmWorkflowsUserConfig } from \"./workflows\";\nexport type { FarmCronJobConfig, FarmCronResolvedConfig, FarmCronUserConfig } from \"./cron\";\nexport type {\n FarmRouteRule,\n FarmRouteRuleCors,\n FarmRouteRuleRedirect,\n FarmRouteRuleRenderMode,\n FarmRouteRules,\n} from \"./route-rules\";\nexport type {\n FarmServerActionsConfig,\n ResolvedFarmServerActionsConfig,\n} from \"./server-action-security\";\nexport type {\n FarmServerConfig,\n FarmServerDuration,\n FarmServerHealthConfig,\n ResolvedFarmServerConfig,\n ResolvedFarmServerHealthConfig,\n} from \"./server-http\";\nexport type { FarmLayerEntry, ResolvedFarmLayer } from \"./layers\";\nexport type {\n FarmDevtoolsConfig,\n FarmDevtoolsUserConfig,\n ResolvedFarmDevtoolsConfig,\n} from \"./devtools-config\";\nexport type {\n FarmPerformanceConfig,\n FarmPreloadMode,\n FarmPreloadUserConfig,\n ResolvedFarmPerformanceConfig,\n ResolvedFarmPreloadConfig,\n} from \"./preload\";\nexport type {\n FarmImageConfig,\n FarmImageFormat,\n FarmImageLocalPattern,\n FarmImageProvider,\n FarmImageRemotePattern,\n ResolvedFarmImageConfig,\n} from \"./image-config\";\nexport type {\n FarmI18nCookieConfig,\n FarmI18nDetectionSignal,\n FarmI18nDirection,\n FarmI18nRouting,\n FarmI18nUserConfig,\n ResolvedFarmI18nConfig,\n} from \"./i18n/types\";\nexport type {\n FarmAuthConfig,\n FarmAuthDatabaseConfig,\n FarmAuthEmailAndPasswordConfig,\n FarmAuthSessionConfig,\n FarmAuthUserConfig,\n ResolvedFarmAuthConfig,\n} from \"./auth-config\";\nexport type {\n FarmCspConfig,\n FarmCspDirectives,\n FarmCspDirectiveValue,\n FarmCspOptions,\n FarmSecurityConfig,\n ResolvedFarmCspConfig,\n ResolvedFarmSecurityConfig,\n} from \"./security\";\n\nexport interface RedirectConfig {\n source: string;\n destination: string;\n permanent?: boolean;\n statusCode?: number;\n}\n\nexport interface HeaderConfig {\n source: string;\n headers: Array<{\n key: string;\n value: string;\n }>;\n}\n\nexport interface RewriteConfig {\n source: string;\n destination: string;\n}\n\n/** @deprecated Use FarmImageConfig. */\nexport type ImageConfig = FarmImageConfig;\n\n/** @deprecated Use FarmI18nUserConfig. */\nexport type I18nConfig = FarmI18nUserConfig;\n\nexport interface OpenAPIConfig {\n enabled?: boolean;\n route?: string;\n title?: string;\n description?: string;\n version?: string;\n servers?: Array<{\n url: string;\n description?: string;\n }>;\n contact?: {\n name?: string;\n email?: string;\n url?: string;\n };\n license?: {\n name: string;\n url?: string;\n };\n}\n\nexport type MiddlewareConfig = FarmMiddlewareConfig;\n\nexport interface NotFoundConfig {\n /** Path to a custom 404 page component (e.g., \"./src/app/not-found.tsx\") */\n component?: string;\n}\n\nexport type FarmDeployTarget = \"vercel\" | \"cloudflare\" | \"netlify\" | \"node\" | string;\n\nexport interface FarmDeployConfig {\n /**\n * Deployment platform. When present, Farm picks the matching Nitro preset and\n * output directory unless explicitly overridden.\n */\n target?: FarmDeployTarget;\n /** Nitro preset override. Usually inferred from target. */\n preset?: BaseFarmConfig[\"preset\"];\n /** Deployable output directory, relative to project root unless absolute. */\n outputDir?: string;\n /** Alias for outputDir for terser config. */\n output?: string;\n /** Cloudflare Pages project name used by `farm deploy --cloudflare`. */\n projectName?: string;\n vercel?: {\n outputDirectory?: string;\n buildCommand?: string;\n installCommand?: string;\n framework?: string | null;\n };\n cloudflare?: {\n outputDir?: string;\n projectName?: string;\n };\n netlify?: {\n outputDir?: string;\n site?: string;\n };\n}\n\nexport interface ResolvedFarmDeployConfig extends Omit<FarmDeployConfig, \"output\"> {\n target?: FarmDeployTarget;\n preset: BaseFarmConfig[\"preset\"];\n outputDir: string;\n}\n\nexport interface FarmUserConfig extends Omit<BaseFarmConfig, \"vite\" | \"docs\" | \"env\" | \"layers\"> {\n /** Reusable Farm directories or installed packages, applied from left to right. */\n extends?: readonly FarmLayerEntry[];\n plugins?: FarmPlugin[];\n integrations?: FarmIntegrationsUserConfig;\n /**\n * Farm-native authentication. `true` enables email/password auth with\n * server helpers from `@farm.js/auth/server` and React APIs from\n * `@farm.js/auth/client`.\n */\n auth?: FarmAuthUserConfig;\n /** Shared application data, route, ISR, and PPR cache. */\n cache?: FarmCacheUserConfig;\n migrations?: FarmMigrationsUserConfig;\n /** Map portable cron schedules to ordinary GET API routes. */\n cron?: FarmCronUserConfig | FarmCronResolvedConfig | false;\n workflows?: FarmWorkflowsUserConfig | boolean;\n preset?: BaseFarmConfig[\"preset\"];\n deploy?: FarmDeployConfig;\n docs?: FarmDocsUserConfig;\n md?: FarmMarkdownUserConfig | boolean;\n mdx?: FarmMdxUserConfig;\n observability?: FarmObservabilityUserConfig;\n\n trailingSlash?: boolean;\n redirects?: () => Promise<RedirectConfig[]> | RedirectConfig[];\n rewrites?: () => Promise<RewriteConfig[]> | RewriteConfig[];\n headers?: () => Promise<HeaderConfig[]> | HeaderConfig[];\n\n images?: ImageConfig;\n publicDir?: string;\n\n i18n?: FarmI18nUserConfig | false;\n openapi?: OpenAPIConfig;\n\n middleware?: FarmMiddlewareConfig;\n routeRules?: FarmRouteRules;\n context?: BaseFarmConfig[\"context\"];\n /** Server ingress and trusted-proxy policy. */\n server?: FarmServerConfig;\n serverActions?: FarmServerActionsConfig;\n /** Build identifier used to detect and recover from deployment version skew. */\n deploymentId?: string;\n\n notFound?: NotFoundConfig;\n\n output?: \"standalone\" | \"static\" | \"export\";\n distDir?: string;\n generateBuildId?: () => string | Promise<string>;\n compress?: boolean;\n\n devIndicators?: {\n buildActivity?: boolean;\n buildActivityPosition?: \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n };\n\n serverRuntimeConfig?: Record<string, any>;\n publicRuntimeConfig?: Record<string, any>;\n\n env?: FarmEnvConfig<any, any>;\n\n typescript?: {\n tsconfigPath?: string;\n ignoreBuildErrors?: boolean;\n };\n\n vite?: ViteUserConfig | ((config: ViteUserConfig) => ViteUserConfig);\n\n [key: string]: any;\n}\n\nexport interface ResolvedFarmConfig extends Required<\n Omit<\n FarmUserConfig,\n | \"extends\"\n | \"plugins\"\n | \"vite\"\n | \"deploy\"\n | \"docs\"\n | \"md\"\n | \"mdx\"\n | \"migrations\"\n | \"cron\"\n | \"workflows\"\n | \"env\"\n | \"server\"\n | \"serverActions\"\n | \"devtools\"\n | \"images\"\n | \"i18n\"\n | \"auth\"\n | \"performance\"\n | \"security\"\n >\n> {\n /** @internal Tracks whether `context` came from user/layer config instead of the default noop. */\n [FARM_RESOLVED_CUSTOM_CONTEXT]?: boolean;\n extends: readonly FarmLayerEntry[];\n layers: ResolvedFarmLayer[];\n plugins: FarmPlugin[];\n vite: ViteUserConfig;\n deploy: ResolvedFarmDeployConfig;\n docs: FarmDocsResolvedConfig;\n md: FarmMarkdownResolvedConfig;\n mdx: FarmMdxResolvedConfig;\n migrations: ResolvedFarmMigrationsConfig;\n cron: FarmCronResolvedConfig;\n workflows: FarmWorkflowsResolvedConfig;\n env: ResolvedFarmEnv;\n server: ResolvedFarmServerConfig;\n serverActions: ResolvedFarmServerActionsConfig;\n devtools: ResolvedFarmDevtoolsConfig;\n images: ResolvedFarmImageConfig;\n i18n: ResolvedFarmI18nConfig;\n auth: ResolvedFarmAuthConfig;\n performance: ResolvedFarmPerformanceConfig;\n security: ResolvedFarmSecurityConfig;\n routeRules: FarmRouteRules;\n}\n\nexport function hasCustomFarmRouteContext(config: ResolvedFarmConfig): boolean {\n return config[FARM_RESOLVED_CUSTOM_CONTEXT] === true;\n}\n\nexport type FarmLayerConfig = Omit<\n FarmUserConfig,\n | \"root\"\n | \"outDir\"\n | \"distDir\"\n | \"deploy\"\n | \"output\"\n | \"preset\"\n | \"publicDir\"\n | \"generateBuildId\"\n | \"deploymentId\"\n>;\n\nexport { defineConfig, defineFarmConfig } from \"./config-entry\";\n\nexport function normalizeDeployTarget(target?: FarmDeployTarget): FarmDeployTarget | undefined {\n if (!target) return undefined;\n if (target === \"cloudflare-pages\" || target === \"cloudflare_pages\") return \"cloudflare\";\n if (target === \"node-server\" || target === \"nitro\") return \"node\";\n return target;\n}\n\nexport function getPresetForDeployTarget(\n target?: FarmDeployTarget,\n): BaseFarmConfig[\"preset\"] | undefined {\n switch (normalizeDeployTarget(target)) {\n case \"vercel\":\n return \"vercel\";\n case \"cloudflare\":\n return \"cloudflare-pages\";\n case \"netlify\":\n return \"netlify\";\n case \"node\":\n return \"node-server\";\n default:\n return undefined;\n }\n}\n\nexport function getDeployTargetForPreset(preset?: string): FarmDeployTarget | undefined {\n if (!preset) return undefined;\n if (preset === \"vercel\" || preset === \"vercel-edge\") return \"vercel\";\n if (preset === \"cloudflare\" || preset === \"cloudflare-pages\" || preset === \"cloudflare-module\") {\n return \"cloudflare\";\n }\n if (preset === \"netlify\" || preset === \"netlify-edge\") return \"netlify\";\n if (preset === \"node-server\") return \"node\";\n return undefined;\n}\n\nexport function getDefaultDeployOutputDir(\n target: FarmDeployTarget | undefined,\n preset: string | undefined,\n distDir: string,\n): string {\n const normalizedTarget = normalizeDeployTarget(target) || getDeployTargetForPreset(preset);\n if (normalizedTarget === \"vercel\") return \".vercel/output\";\n return `${distDir}/.output`;\n}\n\nexport function resolveDeployOutputPath(root: string, outputDir: string): string {\n return path.isAbsolute(outputDir) ? outputDir : path.join(root, outputDir);\n}\n\nexport function resolveDeployConfig(\n config: Pick<FarmUserConfig, \"deploy\" | \"preset\" | \"distDir\">,\n overrides: {\n target?: FarmDeployTarget;\n preset?: BaseFarmConfig[\"preset\"];\n outputDir?: string;\n } = {},\n): ResolvedFarmDeployConfig {\n const deploy = config.deploy || {};\n const distDir = config.distDir || \".farm\";\n const target = normalizeDeployTarget(overrides.target || deploy.target);\n const preset =\n overrides.preset ||\n deploy.preset ||\n config.preset ||\n getPresetForDeployTarget(target) ||\n \"node-server\";\n const resolvedTarget = target || getDeployTargetForPreset(preset);\n const platformOutput =\n resolvedTarget === \"vercel\"\n ? deploy.vercel?.outputDirectory\n : resolvedTarget === \"cloudflare\"\n ? deploy.cloudflare?.outputDir\n : resolvedTarget === \"netlify\"\n ? deploy.netlify?.outputDir\n : undefined;\n const outputDir =\n overrides.outputDir ||\n deploy.outputDir ||\n deploy.output ||\n platformOutput ||\n getDefaultDeployOutputDir(resolvedTarget, preset, distDir);\n\n return {\n ...deploy,\n target: resolvedTarget,\n preset,\n outputDir,\n };\n}\n\nexport function resolveMigrationsConfig(\n migrations: FarmMigrationsUserConfig | undefined,\n): ResolvedFarmMigrationsConfig {\n if (!migrations) return { commands: [] };\n if (Array.isArray(migrations)) return { commands: migrations };\n return { commands: migrations.commands || [] };\n}\n\nexport const DOCS_CONFIG_FILENAMES = [\n \"docs.config.ts\",\n \"docs.config.tsx\",\n \"docs.config.mts\",\n \"docs.config.cts\",\n \"docs.config.js\",\n \"docs.config.jsx\",\n \"docs.config.mjs\",\n \"docs.config.cjs\",\n \"docs.json\",\n];\n\nfunction normalizeDocsRoute(value: string | undefined, fallback = \"/docs\"): string {\n const raw = (value || fallback).trim();\n if (!raw || raw === \"/\") return \"/\";\n const normalized = raw\n .replace(/\\\\/g, \"/\")\n .replace(/\\/+/g, \"/\")\n .replace(/^\\/?/, \"/\")\n .replace(/\\/+$/, \"\");\n return normalized || \"/\";\n}\n\nfunction docsRouteToEntry(route: string): string {\n const entry = route.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n return entry || \"docs\";\n}\n\nfunction normalizeDocsContentDir(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const normalized = value.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n return normalized || undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction cloneSerializable(value: unknown, seen = new WeakSet<object>()): any {\n if (value === null) return null;\n\n const valueType = typeof value;\n if (valueType === \"string\" || valueType === \"number\" || valueType === \"boolean\") {\n return value;\n }\n if (valueType === \"undefined\" || valueType === \"function\" || valueType === \"symbol\") {\n return undefined;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneSerializable(item, seen)).filter((item) => item !== undefined);\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (isRecord(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const output: Record<string, any> = {};\n for (const [key, nestedValue] of Object.entries(value)) {\n const clonedValue = cloneSerializable(nestedValue, seen);\n if (clonedValue !== undefined) {\n output[key] = clonedValue;\n }\n }\n return output;\n }\n\n return undefined;\n}\n\nfunction sanitizeDocsConfig(config: Partial<DocsConfig>): Partial<DocsConfig> {\n return cloneSerializable(config) || {};\n}\n\nexport async function findDocsConfigPath(\n rootDir: string,\n configPath?: string,\n): Promise<string | undefined> {\n const { existsSync } = await import(\"fs\");\n const root = path.resolve(rootDir || process.cwd());\n\n if (configPath) {\n const resolvedPath = path.isAbsolute(configPath) ? configPath : path.join(root, configPath);\n if (!existsSync(resolvedPath)) {\n throw new Error(`Could not find docs config at ${configPath}.`);\n }\n return path.resolve(resolvedPath);\n }\n\n for (const filename of DOCS_CONFIG_FILENAMES) {\n const resolvedPath = path.join(root, filename);\n if (existsSync(resolvedPath)) {\n return resolvedPath;\n }\n }\n\n return undefined;\n}\n\nexport async function loadDocsConfig(\n rootDir: string,\n configPath?: string,\n): Promise<{ config: Partial<DocsConfig>; configPath: string } | undefined> {\n const fs = await import(\"fs/promises\");\n const { pathToFileURL } = await import(\"url\");\n const root = path.resolve(rootDir || process.cwd());\n const resolvedPath = await findDocsConfigPath(root, configPath);\n\n if (!resolvedPath) return undefined;\n\n try {\n if (resolvedPath.endsWith(\".json\")) {\n const content = await fs.readFile(resolvedPath, \"utf8\");\n return { config: JSON.parse(content), configPath: resolvedPath };\n }\n\n const { build } = await import(\"esbuild\");\n const configCacheDir = path.join(root, \".farm\", \".config-loader\");\n await fs.mkdir(configCacheDir, { recursive: true });\n const modulePath = path.join(\n configCacheDir,\n `docs-config-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n await build({\n absWorkingDir: root,\n entryPoints: [resolvedPath],\n outfile: modulePath,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: `node${process.versions.node.split(\".\")[0]}`,\n packages: \"external\",\n jsx: \"automatic\",\n logLevel: \"silent\",\n sourcemap: \"inline\",\n });\n\n const moduleUrl = pathToFileURL(modulePath).href + `?t=${Date.now()}`;\n let importedConfig: any;\n\n try {\n importedConfig = await import(/* @vite-ignore */ moduleUrl);\n } finally {\n await fs.unlink(modulePath).catch(() => undefined);\n }\n\n return {\n config: importedConfig.default || importedConfig,\n configPath: resolvedPath,\n };\n } catch (error: any) {\n const relativePath = path.relative(root, resolvedPath) || resolvedPath;\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load docs config from ${relativePath}: ${message}`);\n }\n}\n\nexport async function resolveDocsConfig(\n userDocs: FarmDocsUserConfig | undefined,\n options: {\n root?: string;\n srcDir?: string;\n } = {},\n): Promise<FarmDocsResolvedConfig> {\n const root = options.root || process.cwd();\n\n if (userDocs === false) {\n return {\n enabled: false,\n entry: \"/docs\",\n config: { entry: \"docs\", docsPath: \"/docs\" },\n };\n }\n\n const docsOptions = isRecord(userDocs) ? userDocs : {};\n if (docsOptions.enabled === false) {\n return {\n enabled: false,\n entry: \"/docs\",\n config: { entry: \"docs\", docsPath: \"/docs\" },\n };\n }\n\n const loadedConfig = await loadDocsConfig(root, docsOptions.configPath);\n const hasExplicitDocsConfig = userDocs === true || isRecord(userDocs);\n\n if (!hasExplicitDocsConfig && !loadedConfig) {\n return {\n enabled: false,\n entry: \"/docs\",\n config: { entry: \"docs\", docsPath: \"/docs\" },\n };\n }\n\n const inlineDocsConfig = sanitizeDocsConfig(docsOptions.config || {});\n const directDocsConfig = sanitizeDocsConfig({\n ...docsOptions,\n enabled: undefined,\n config: undefined,\n configPath: undefined,\n } as Partial<DocsConfig>);\n const loadedDocsConfig = sanitizeDocsConfig(loadedConfig?.config || {});\n const mergedDocsConfig: Partial<DocsConfig> = {\n ...loadedDocsConfig,\n ...inlineDocsConfig,\n ...directDocsConfig,\n };\n\n const explicitRoute = typeof docsOptions.entry === \"string\" ? docsOptions.entry : undefined;\n const configuredDocsPath =\n typeof mergedDocsConfig.docsPath === \"string\" ? mergedDocsConfig.docsPath : undefined;\n const configuredEntry =\n typeof mergedDocsConfig.entry === \"string\" ? mergedDocsConfig.entry : undefined;\n const entryRoute = normalizeDocsRoute(\n configuredDocsPath || explicitRoute || (configuredEntry ? `/${configuredEntry}` : undefined),\n );\n const docsEntry =\n explicitRoute && explicitRoute.startsWith(\"/\")\n ? docsRouteToEntry(explicitRoute)\n : docsRouteToEntry(configuredEntry || entryRoute);\n const contentDir = normalizeDocsContentDir(docsOptions.contentDir || mergedDocsConfig.contentDir);\n\n return {\n enabled: true,\n entry: entryRoute,\n contentDir,\n configPath: loadedConfig?.configPath,\n config: {\n ...mergedDocsConfig,\n entry: docsEntry,\n docsPath: entryRoute,\n ...(contentDir ? { contentDir } : {}),\n },\n };\n}\n\nexport async function resolveConfig(\n userConfig: FarmUserConfig,\n mode: \"development\" | \"production\",\n): Promise<ResolvedFarmConfig> {\n const projectRoot = userConfig.root || process.cwd();\n const layerResolution = await resolveFarmLayers(userConfig, {\n root: projectRoot,\n mode,\n });\n userConfig = layerResolution.config;\n\n const redirects =\n typeof userConfig.redirects === \"function\"\n ? await userConfig.redirects()\n : userConfig.redirects || [];\n\n const rewrites =\n typeof userConfig.rewrites === \"function\"\n ? await userConfig.rewrites()\n : userConfig.rewrites || [];\n\n const headers =\n typeof userConfig.headers === \"function\"\n ? await userConfig.headers()\n : userConfig.headers || [];\n const routeRules = normalizeRouteRules(userConfig.routeRules);\n const routeRuleRedirects = routeRulesToRedirects(routeRules);\n const routeRuleHeaders = routeRulesToHeaders(routeRules);\n const security = resolveFarmSecurityConfig(userConfig.security);\n const securityHeader = getFarmSecurityHeader(security);\n\n const deploy = resolveDeployConfig(userConfig);\n const root = userConfig.root || process.cwd();\n const srcDir = userConfig.srcDir || \"src\";\n const docs = await resolveDocsConfig(userConfig.docs, { root, srcDir });\n const md = resolveMarkdownConfig(userConfig.md);\n const mdx = resolveMdxConfig(userConfig.mdx);\n const env = resolveEnv(userConfig.env, process.env);\n setEnv(env);\n const auth = resolveFarmAuthConfig(userConfig.auth);\n if (auth.enabled && userConfig.integrations?.auth) {\n throw new Error(\n \"Choose either the top-level `auth` config or `integrations.auth`; they cannot both own the auth route.\",\n );\n }\n const nativeAuthIntegration = await resolveFarmAuthIntegration(auth, {\n root,\n mode,\n });\n const integrations = nativeAuthIntegration\n ? { ...userConfig.integrations, auth: nativeAuthIntegration }\n : userConfig.integrations || {};\n const generateBuildId = userConfig.generateBuildId || (() => `build-${Date.now()}`);\n const deploymentId = normalizeFarmDeploymentId(\n userConfig.deploymentId ||\n process.env.FARM_DEPLOYMENT_ID ||\n process.env.VERCEL_GIT_COMMIT_SHA ||\n process.env.CF_PAGES_COMMIT_SHA ||\n (mode === \"production\" ? await generateBuildId() : \"development\"),\n );\n\n const resolved: ResolvedFarmConfig = {\n [FARM_RESOLVED_CUSTOM_CONTEXT]: typeof userConfig.context === \"function\",\n root,\n srcDir,\n extends: userConfig.extends || [],\n layers: layerResolution.layers,\n outDir: userConfig.outDir || \"dist\",\n basePath: userConfig.basePath || \"/\",\n preset: deploy.preset || \"node-server\",\n deploy,\n docs,\n md,\n mdx,\n migrations: resolveMigrationsConfig(userConfig.migrations),\n cron: resolveCronConfig(userConfig.cron),\n workflows: resolveWorkflowsConfig(userConfig.workflows),\n observability: userConfig.observability ?? false,\n devtools: resolveFarmDevtoolsConfig(userConfig.devtools, mode),\n storage: userConfig.storage || {},\n cache: userConfig.cache || {},\n auth,\n suppressLintOnLink: userConfig.suppressLintOnLink ?? false,\n experimental: {\n serverComponents: false,\n serverActions: false,\n ...userConfig.experimental,\n },\n plugins: [...resolveIntegrationPlugins(integrations), ...(userConfig.plugins || [])],\n integrations,\n trailingSlash: userConfig.trailingSlash ?? false,\n redirects: () => [...redirects, ...routeRuleRedirects],\n rewrites: () => rewrites,\n headers: () => [\n ...headers,\n ...routeRuleHeaders,\n ...(securityHeader ? [{ source: \"/*\", headers: [securityHeader] }] : []),\n ],\n routeRules,\n images: resolveFarmImageConfig(userConfig.images),\n performance: resolveFarmPerformanceConfig(userConfig.performance),\n publicDir: userConfig.publicDir || \"public\",\n i18n: resolveFarmI18nConfig(userConfig.i18n, { root, mode }),\n openapi: {\n enabled: false,\n route: \"/docs/reference\",\n title: \"API Documentation\",\n description: \"Auto-generated API documentation\",\n version: \"1.0.0\",\n servers: [{ url: \"http://localhost:3000\", description: \"Development server\" }],\n ...userConfig.openapi,\n },\n middleware: userConfig.middleware || {},\n notFound: userConfig.notFound || {},\n context: userConfig.context || (() => undefined),\n server: resolveFarmServerConfig(userConfig.server),\n serverActions: resolveServerActionsConfig(userConfig.serverActions),\n security,\n deploymentId,\n output: userConfig.output || \"standalone\",\n distDir: userConfig.distDir || \".farm\",\n generateBuildId,\n compress: userConfig.compress ?? true,\n devIndicators: {\n buildActivity: true,\n buildActivityPosition: \"bottom-right\",\n ...userConfig.devIndicators,\n },\n serverRuntimeConfig: userConfig.serverRuntimeConfig || {},\n publicRuntimeConfig: userConfig.publicRuntimeConfig || {},\n env,\n typescript: {\n tsconfigPath: \"tsconfig.json\",\n ignoreBuildErrors: false,\n ...userConfig.typescript,\n },\n vite: typeof userConfig.vite === \"function\" ? userConfig.vite({}) : userConfig.vite || {},\n };\n\n return resolved;\n}\n\nexport async function loadConfig(\n rootDir?: string,\n configPath?: string,\n mode = process.env.NODE_ENV === \"production\" ? \"production\" : \"development\",\n loadEnvironment?: (typeof import(\"vite\"))[\"loadEnv\"],\n): Promise<FarmUserConfig | undefined> {\n const { existsSync } = await import(\"fs\");\n const loadEnv = loadEnvironment || (await import(\"vite\")).loadEnv;\n\n const root = rootDir || process.cwd();\n const loadedEnv = loadEnv(mode, root, \"\");\n for (const [key, value] of Object.entries(loadedEnv)) {\n if (process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n const searchPaths = [\n configPath,\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 ].filter(Boolean) as string[];\n\n for (const relativePath of searchPaths) {\n try {\n // Use path.join for proper path construction\n const absolutePath = relativePath.startsWith(\"/\")\n ? relativePath\n : path.join(root, relativePath);\n\n // Normalize the path to handle any issues\n const normalizedPath = path.resolve(absolutePath);\n\n // Check if file exists before trying to import\n if (!existsSync(normalizedPath)) {\n continue;\n }\n\n const loadedConfig = await loadFarmConfigFile<FarmUserConfig>(normalizedPath, { root });\n return loadedConfig.root === undefined ? { ...loadedConfig, root } : loadedConfig;\n } catch (error: any) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load config from ${relativePath}: ${message}`);\n }\n }\n return undefined;\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { FarmConfig, FarmRequest, FarmResponse } from \"./types\";\nimport type { ViteDevServer } from \"vite\";\nimport type { FarmClientPlugin } from \"./client/plugin\";\nimport { getResolvedEnv, type ResolvedFarmEnv } from \"./env\";\nimport {\n clearRequestContext,\n deleteRequestContext,\n getRequestContext,\n getRequestContextSnapshot,\n hasRequestContext,\n setRequestContext,\n} from \"./request-context\";\nimport { getFarmPluginIntegrationContext } from \"./plugin-integration-context\";\n\ntype MaybePromise<T> = T | Promise<T>;\ndeclare const FARM_PLUGIN_INTEGRATION_INSTANCE: unique symbol;\n\nexport interface FarmPluginIntegrationContext<TInstance = unknown> {\n /** Key used to register the integration in farm.config.ts. */\n readonly key: string;\n readonly category: string;\n readonly type: string;\n readonly instance: TInstance;\n readonly serverRuntime: boolean;\n}\n\nexport class FarmRuntimeShutdownError extends Error {\n readonly errors: readonly unknown[];\n\n constructor(message: string, errors: readonly unknown[]) {\n super(message);\n this.name = \"FarmRuntimeShutdownError\";\n this.errors = errors;\n }\n}\n\nexport interface PluginRequestContext {\n set: (\n target: FarmRequest | Request,\n key: string,\n value: any,\n options?: { exposeToPage?: boolean },\n ) => void;\n get: <T = any>(target: FarmRequest | Request, key: string) => T | undefined;\n has: (target: FarmRequest | Request, key: string) => boolean;\n delete: (target: FarmRequest | Request, key: string) => boolean;\n clear: (target: FarmRequest | Request) => void;\n getAll: (target: FarmRequest | Request, options?: { exposedOnly?: boolean }) => Map<string, any>;\n}\n\nexport interface FarmRequestStore {\n set(key: string, value: unknown, options?: { exposeToPage?: boolean }): void;\n get<T = unknown>(key: string): T | undefined;\n has(key: string): boolean;\n delete(key: string): boolean;\n clear(): void;\n snapshot(options?: { exposedOnly?: boolean }): Map<string, unknown>;\n}\n\nexport interface FarmPluginContext<TIntegrationInstance = unknown> {\n config: FarmConfig;\n viteServer?: ViteDevServer;\n isDev: boolean;\n isProd: boolean;\n /** The owning integration when this plugin is contributed through `integration.plugins`. */\n readonly integration?: Readonly<FarmPluginIntegrationContext<TIntegrationInstance>>;\n /** Register resource cleanup that must run when the application runtime closes. */\n lifecycle: FarmPluginLifecycle;\n /** @deprecated Use `ctx.req` inside request hooks. */\n requestContext: PluginRequestContext;\n}\n\nexport interface FarmPluginLifecycle {\n /**\n * Register a database, storage, queue, or other resource disposer.\n * Disposers run once in reverse registration order after plugin shutdown hooks.\n */\n onShutdown(dispose: () => void | Promise<void>): () => void;\n}\n\nexport interface FarmRequestPluginContext<\n TIntegrationInstance = unknown,\n> extends FarmPluginContext<TIntegrationInstance> {\n /** Request-scoped values for the current hook invocation. */\n readonly req: FarmRequestStore;\n}\n\nexport interface RouteDiscoveredPayload {\n kind: \"page\" | \"layout\";\n pattern: string;\n modulePath: string;\n}\n\nexport interface RoutesGeneratedPayload {\n routes: RouteDiscoveredPayload[];\n pageCount: number;\n layoutCount: number;\n}\n\nexport interface MiddlewareDiscoveredPayload {\n path: string;\n filePath: string;\n handlerCount: number;\n}\n\nexport interface APIRouteDiscoveredPayload {\n path: string;\n filePath: string;\n methods: string[];\n}\n\nexport interface RouteMatchPayload {\n pathname: string;\n method?: string;\n}\n\nexport interface RouteMatchResultPayload {\n pathname: string;\n matched: boolean;\n routePattern: string | null;\n params: Record<string, string>;\n layoutPatterns: string[];\n}\n\nexport interface RenderLifecyclePayload {\n pathname: string;\n method: string;\n routePattern: string | null;\n params: Record<string, string>;\n}\n\nexport interface APIHandlerLifecyclePayload {\n pathname: string;\n method: string;\n routePath?: string;\n}\n\nexport interface ErrorLifecyclePayload {\n phase: string;\n error: unknown;\n meta?: Record<string, unknown>;\n}\n\nexport interface HMRUpdatePayload {\n file: string;\n modules: string[];\n}\n\nexport interface BundleLifecyclePayload {\n root: string;\n preset: string;\n universal: boolean;\n distDir: string;\n outputDir?: string;\n}\n\nexport interface BundleResultPayload extends BundleLifecyclePayload {\n success: boolean;\n}\n\nexport interface NitroBuildLifecyclePayload {\n root: string;\n preset: string;\n distDir: string;\n outputDir: string;\n}\n\nexport interface ShutdownPayload {\n reason: string;\n}\n\nexport type FarmPluginRuntimeKind =\n | \"request\"\n | \"page\"\n | \"api\"\n | \"action\"\n | \"integration\"\n | \"docs\"\n | \"asset\"\n | (string & {});\n\nexport interface FarmPluginRouteRuntimePayload {\n pathname: string;\n pattern?: string | null;\n params?: Record<string, string>;\n}\n\nexport interface FarmPluginSetupContext<\n TIntegrationInstance = unknown,\n> extends FarmPluginContext<TIntegrationInstance> {\n env: ResolvedFarmEnv;\n}\n\nexport interface FarmPluginStateContext<\n TState = unknown,\n TIntegrationInstance = unknown,\n> extends FarmPluginContext<TIntegrationInstance> {\n state: TState;\n}\n\nexport interface FarmPluginRuntimeBaseEvent<\n TState = unknown,\n TIntegrationInstance = unknown,\n> extends FarmPluginStateContext<TState, TIntegrationInstance> {\n request: Request;\n /** Request-scoped values shared by plugin hooks. */\n req: FarmRequestStore;\n kind: FarmPluginRuntimeKind;\n route?: FarmPluginRouteRuntimePayload;\n signal: AbortSignal;\n waitUntil(promise: Promise<unknown>): void;\n}\n\nexport type FarmPluginRuntimeContextEvent<\n TState = unknown,\n TIntegrationInstance = unknown,\n> = FarmPluginRuntimeBaseEvent<TState, TIntegrationInstance>;\n\nexport interface FarmPluginRuntimeBeforeEvent<\n TState = unknown,\n TRequestContext extends object = Record<string, unknown>,\n TIntegrationInstance = unknown,\n> extends FarmPluginRuntimeBaseEvent<TState, TIntegrationInstance> {\n ctx: Readonly<TRequestContext>;\n}\n\nexport interface FarmPluginRuntimeAfterEvent<\n TState = unknown,\n TRequestContext extends object = Record<string, unknown>,\n TIntegrationInstance = unknown,\n> extends FarmPluginRuntimeBeforeEvent<TState, TRequestContext, TIntegrationInstance> {\n response: Response;\n durationMs: number;\n}\n\nexport interface FarmPluginRuntimeErrorEvent<\n TState = unknown,\n TRequestContext extends object = Record<string, unknown>,\n TIntegrationInstance = unknown,\n> extends FarmPluginRuntimeBeforeEvent<TState, TRequestContext, TIntegrationInstance> {\n error: unknown;\n durationMs: number;\n}\n\nexport type FarmPluginRuntimeStartEvent<\n TState = unknown,\n TIntegrationInstance = unknown,\n> = FarmPluginStateContext<TState, TIntegrationInstance>;\n\nexport interface FarmPluginRuntimeCloseEvent<TState = unknown, TIntegrationInstance = unknown>\n extends FarmPluginStateContext<TState, TIntegrationInstance>, ShutdownPayload {}\n\nexport interface FarmPluginRuntimeHooks<\n TState = unknown,\n TRequestContext extends object = Record<string, unknown>,\n TIntegrationInstance = unknown,\n> {\n start?(event: FarmPluginRuntimeStartEvent<TState, TIntegrationInstance>): MaybePromise<void>;\n context?(\n event: FarmPluginRuntimeContextEvent<TState, TIntegrationInstance>,\n ): MaybePromise<TRequestContext>;\n before?(\n event: FarmPluginRuntimeBeforeEvent<TState, TRequestContext, TIntegrationInstance>,\n ): MaybePromise<Request | Response | void>;\n after?(\n event: FarmPluginRuntimeAfterEvent<TState, TRequestContext, TIntegrationInstance>,\n ): MaybePromise<Response | void>;\n error?(\n event: FarmPluginRuntimeErrorEvent<TState, TRequestContext, TIntegrationInstance>,\n ): MaybePromise<void>;\n close?(event: FarmPluginRuntimeCloseEvent<TState, TIntegrationInstance>): MaybePromise<void>;\n}\n\nexport interface FarmPluginRuntimeRequestOptions {\n kind?: FarmPluginRuntimeKind;\n route?: FarmPluginRouteRuntimePayload;\n waitUntil?: (promise: Promise<unknown>) => void;\n}\n\nexport type FarmPluginRuntimeRequestHandler = (request: Request) => MaybePromise<Response>;\n\nexport interface FarmPluginRuntimeSession {\n request: Request;\n response?: Response;\n ctx: Readonly<Record<string, unknown>>;\n startedAt: number;\n options: FarmPluginRuntimeRequestOptions;\n waitUntil(promise: Promise<unknown>): void;\n}\n\nexport type FarmPluginDiscoveredRoute =\n | RouteDiscoveredPayload\n | ({ kind: \"middleware\" } & MiddlewareDiscoveredPayload)\n | ({ kind: \"api\" } & APIRouteDiscoveredPayload);\n\nexport interface FarmPluginRouterHooks<TState = unknown, TIntegrationInstance = unknown> {\n discovered?(\n route: FarmPluginDiscoveredRoute,\n context: FarmPluginStateContext<TState, TIntegrationInstance>,\n ): MaybePromise<void>;\n generated?(\n routes: RoutesGeneratedPayload,\n context: FarmPluginStateContext<TState, TIntegrationInstance>,\n ): MaybePromise<void>;\n before?(\n route: RouteMatchPayload,\n context: FarmPluginStateContext<TState, TIntegrationInstance>,\n ): MaybePromise<void>;\n after?(\n result: RouteMatchResultPayload,\n context: FarmPluginStateContext<TState, TIntegrationInstance>,\n ): MaybePromise<void>;\n}\n\nexport interface FarmPluginRenderHooks<TState = unknown, TIntegrationInstance = unknown> {\n before?(\n render: RenderLifecyclePayload,\n context: FarmPluginStateContext<TState, TIntegrationInstance>,\n ): MaybePromise<void>;\n html?(\n html: string,\n render: RenderLifecyclePayload,\n context: FarmPluginStateContext<TState, TIntegrationInstance>,\n ): MaybePromise<string | void>;\n}\n\nexport interface FarmPluginBuildHooks<TState = unknown, TIntegrationInstance = unknown> {\n before?(\n bundle: BundleLifecyclePayload,\n context: FarmPluginStateContext<TState, TIntegrationInstance>,\n ): MaybePromise<void>;\n configure?(\n buildConfig: any,\n context: FarmPluginStateContext<TState, TIntegrationInstance>,\n ): MaybePromise<any>;\n after?(\n result: BundleResultPayload,\n context: FarmPluginStateContext<TState, TIntegrationInstance>,\n ): MaybePromise<void>;\n}\n\nexport interface FarmPluginDevHooks<TState = unknown, TIntegrationInstance = unknown> {\n server?(\n viteServer: ViteDevServer,\n context: FarmPluginStateContext<TState, TIntegrationInstance>,\n ): MaybePromise<void>;\n update?(\n update: HMRUpdatePayload,\n context: FarmPluginStateContext<TState, TIntegrationInstance>,\n ): MaybePromise<void>;\n}\n\nexport interface FarmPluginClientConfig<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientPlugin<TState, TPublic> {\n /** Explicitly public, JSON-safe data embedded in the browser bundle. */\n public?: TPublic;\n}\n\nexport interface FarmPlugin<\n TState = any,\n TRequestContext extends object = Record<string, unknown>,\n TClientState = any,\n TClientPublic = any,\n TIntegrationInstance = unknown,\n> {\n name: string;\n version?: string;\n enforce?: \"pre\" | \"post\";\n\n /** Transform Farm config before it is resolved. */\n configure?: (\n config: FarmConfig,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => MaybePromise<FarmConfig | void>;\n /** Initialize private plugin state once for this plugin manager. */\n setup?: (context: FarmPluginSetupContext<TIntegrationInstance>) => MaybePromise<TState>;\n\n runtime?: FarmPluginRuntimeHooks<TState, TRequestContext, TIntegrationInstance>;\n router?: FarmPluginRouterHooks<TState, TIntegrationInstance>;\n render?: FarmPluginRenderHooks<TState, TIntegrationInstance>;\n build?: FarmPluginBuildHooks<TState, TIntegrationInstance>;\n dev?: FarmPluginDevHooks<TState, TIntegrationInstance>;\n /** Optional browser lifecycle for this logical plugin. */\n client?: FarmPluginClientConfig<TClientState, TClientPublic>;\n\n /** @internal Carries the expected integration instance type without runtime data. */\n readonly [FARM_PLUGIN_INTEGRATION_INSTANCE]?: (instance: TIntegrationInstance) => void;\n\n /** @deprecated Use `setup` instead. */\n init?: (context: FarmPluginContext<TIntegrationInstance>) => void | Promise<void>;\n /** @deprecated Use `runtime.start` instead. */\n ready?: (context: FarmPluginContext<TIntegrationInstance>) => void | Promise<void>;\n /** @deprecated Use `dev.server` instead. */\n devServerCreated?: (\n viteServer: ViteDevServer,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n\n /** @deprecated Use `configure` instead. */\n config?: (\n config: FarmConfig,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => FarmConfig | Promise<FarmConfig>;\n configResolved?: (\n config: FarmConfig,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n /** @deprecated Use `build.before` instead. */\n buildStart?: (context: FarmPluginContext<TIntegrationInstance>) => void | Promise<void>;\n /** @deprecated Use `build.after` instead. */\n buildEnd?: (context: FarmPluginContext<TIntegrationInstance>) => void | Promise<void>;\n\n /** @deprecated Use `router.discovered` instead. */\n routeDiscovered?: (\n route: RouteDiscoveredPayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n /** @deprecated Use `router.generated` instead. */\n routesGenerated?: (\n routes: RoutesGeneratedPayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n /** @deprecated Use `router.discovered` instead. */\n middlewareDiscovered?: (\n middleware: MiddlewareDiscoveredPayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n /** @deprecated Use `router.discovered` instead. */\n apiRouteDiscovered?: (\n route: APIRouteDiscoveredPayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n /** @deprecated Use `router.before` instead. */\n beforeRouteMatch?: (\n route: RouteMatchPayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n /** @deprecated Use `router.after` instead. */\n afterRouteMatch?: (\n result: RouteMatchResultPayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n /** @deprecated Use `render.before` instead. */\n beforeRender?: (\n render: RenderLifecyclePayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n /** @deprecated Use `render.html` instead. */\n afterRender?: (\n html: string,\n render: RenderLifecyclePayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => string | Promise<string> | void | Promise<void>;\n /** @deprecated Use `runtime.before` instead. */\n beforeApiHandler?: (\n request: Request,\n api: APIHandlerLifecyclePayload,\n context: FarmRequestPluginContext<TIntegrationInstance>,\n ) => Request | Promise<Request> | void | Promise<void>;\n /** @deprecated Use `runtime.after` instead. */\n afterApiHandler?: (\n response: Response,\n api: APIHandlerLifecyclePayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => Response | Promise<Response> | void | Promise<void>;\n onError?: (\n error: ErrorLifecyclePayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n /** @deprecated Use `dev.update` instead. */\n hmrUpdate?: (\n update: HMRUpdatePayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n /** @deprecated Use `build.before` instead. */\n beforeBundle?: (\n bundle: BundleLifecyclePayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n /** @deprecated Use `build.after` instead. */\n afterBundle?: (\n result: BundleResultPayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n /** @deprecated Use `build.configure` instead. */\n beforeNitroBuild?: (\n nitroConfig: any,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => any | Promise<any>;\n afterNitroBuild?: (\n payload: NitroBuildLifecyclePayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n /** @deprecated Use `runtime.close` instead. */\n shutdown?: (\n payload: ShutdownPayload,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n\n /** @deprecated Use the Web Request based `runtime.before` hook instead. */\n beforeRequest?: (\n req: FarmRequest,\n res: FarmResponse,\n context: FarmRequestPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n /** @deprecated Use the Web Response based `runtime.after` hook instead. */\n afterResponse?: (\n req: FarmRequest,\n res: FarmResponse,\n context: FarmRequestPluginContext<TIntegrationInstance>,\n ) => void | Promise<void>;\n\n // Transform hooks\n /** @deprecated Use `render.html` instead. */\n transformHTML?: (\n html: string,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => string | Promise<string>;\n /** @deprecated Use `render.before` or `render.html` instead. */\n transformPage?: (\n component: any,\n context: FarmPluginContext<TIntegrationInstance>,\n ) => any | Promise<any>;\n}\n\nexport class PluginManager {\n private plugins: FarmPlugin[] = [];\n private hookPresence = new Map<keyof FarmPlugin, boolean>();\n private runtimeHookPresence = new Map<\"context\" | \"before\" | \"after\" | \"error\", boolean>();\n private context: FarmPluginContext;\n private pluginStates = new Map<FarmPlugin, unknown>();\n private setupComplete = false;\n private initialized = false;\n private runtimeReady = false;\n private runtimeClosed = false;\n private runtimeStartPromise?: Promise<void>;\n private runtimeClosePromise?: Promise<void>;\n private runtimeShutdownHooksRunning = false;\n private runtimeDisposers: Array<() => void | Promise<void>> = [];\n private runtimeRequestContexts = new WeakMap<Request, Readonly<Record<string, unknown>>>();\n private failedRuntimeSessions = new WeakSet<FarmPluginRuntimeSession>();\n\n constructor(context: Omit<FarmPluginContext, \"requestContext\" | \"lifecycle\">) {\n this.context = {\n ...context,\n lifecycle: {\n onShutdown: (dispose) => {\n if (typeof dispose !== \"function\") {\n throw new TypeError(\"Farm lifecycle.onShutdown requires a cleanup function\");\n }\n if (this.runtimeClosePromise || this.runtimeClosed) {\n throw new Error(\"Farm runtime cleanup cannot be registered after shutdown begins\");\n }\n\n this.runtimeDisposers.push(dispose);\n let registered = true;\n return () => {\n if (!registered) return;\n registered = false;\n const index = this.runtimeDisposers.indexOf(dispose);\n if (index >= 0) this.runtimeDisposers.splice(index, 1);\n };\n },\n },\n requestContext: {\n set(target, key, value, options) {\n setRequestContext(target as object, key, value, options);\n },\n get(target, key) {\n return getRequestContext(target as object, key);\n },\n has(target, key) {\n return hasRequestContext(target as object, key);\n },\n delete(target, key) {\n return deleteRequestContext(target as object, key);\n },\n clear(target) {\n clearRequestContext(target as object);\n },\n getAll(target, options) {\n return getRequestContextSnapshot(target as object, options);\n },\n },\n };\n }\n\n private createPluginHookContext(\n plugin: FarmPlugin,\n context: FarmPluginContext = this.context,\n ): FarmPluginContext {\n const integration = getFarmPluginIntegrationContext(plugin);\n return integration ? { ...context, integration } : context;\n }\n\n private createRequestHookContext(\n target: FarmRequest | Request,\n plugin: FarmPlugin,\n ): FarmRequestPluginContext {\n const requestContext = this.context.requestContext;\n\n return {\n ...this.createPluginHookContext(plugin),\n req: {\n set(key, value, options) {\n requestContext.set(target, key, value, options);\n },\n get(key) {\n return requestContext.get(target, key);\n },\n has(key) {\n return requestContext.has(target, key);\n },\n delete(key) {\n return requestContext.delete(target, key);\n },\n clear() {\n requestContext.clear(target);\n },\n snapshot(options) {\n return requestContext.getAll(target, options);\n },\n },\n };\n }\n\n private copyRequestStore(source: FarmRequest | Request, target: FarmRequest | Request): void {\n const requestContext = this.context.requestContext;\n const values = requestContext.getAll(source);\n const exposed = requestContext.getAll(source, { exposedOnly: true });\n\n for (const [key, value] of values) {\n requestContext.set(target, key, value, {\n exposeToPage: exposed.has(key),\n });\n }\n }\n\n private copyRuntimeRequestContext(source: Request, target: Request): void {\n const runtimeContext = this.runtimeRequestContexts.get(source);\n if (runtimeContext) {\n this.runtimeRequestContexts.set(target, runtimeContext);\n }\n }\n\n private createRuntimeBaseEvent(\n plugin: FarmPlugin,\n request: Request,\n options: FarmPluginRuntimeRequestOptions,\n waitUntil: (promise: Promise<unknown>) => void,\n ): FarmPluginRuntimeBaseEvent {\n return {\n ...this.createStateHookContext(plugin),\n request,\n req: this.createRequestHookContext(request, plugin).req,\n kind: options.kind ?? \"request\",\n route: options.route,\n signal: request.signal,\n waitUntil,\n };\n }\n\n private async createRuntimeRequestContext(\n request: Request,\n options: FarmPluginRuntimeRequestOptions,\n waitUntil: (promise: Promise<unknown>) => void,\n ): Promise<Readonly<Record<string, unknown>>> {\n const values: Record<string, unknown> = {};\n const owners = new Map<string, string>();\n\n for (const plugin of this.getSortedPlugins()) {\n const createContext = plugin.runtime?.context;\n if (!createContext) continue;\n\n const result = await createContext(\n this.createRuntimeBaseEvent(plugin, request, options, waitUntil),\n );\n if (result === undefined) continue;\n if (!result || typeof result !== \"object\" || Array.isArray(result)) {\n throw new TypeError(`Farm plugin \"${plugin.name}\" runtime.context must return an object`);\n }\n\n for (const [key, value] of Object.entries(result)) {\n const owner = owners.get(key);\n if (owner) {\n throw new Error(\n `Farm plugin context key \"${key}\" from \"${plugin.name}\" conflicts with \"${owner}\"`,\n );\n }\n owners.set(key, plugin.name);\n values[key] = value;\n }\n }\n\n const runtimeContext = Object.freeze(values);\n this.runtimeRequestContexts.set(request, runtimeContext);\n return runtimeContext;\n }\n\n private async runRuntimeErrorHooks(\n request: Request,\n error: unknown,\n ctx: Readonly<Record<string, unknown>>,\n durationMs: number,\n options: FarmPluginRuntimeRequestOptions,\n waitUntil: (promise: Promise<unknown>) => void,\n ): Promise<void> {\n for (const plugin of this.getSortedPlugins()) {\n const onError = plugin.runtime?.error;\n if (!onError) continue;\n\n try {\n await onError({\n ...this.createRuntimeBaseEvent(plugin, request, options, waitUntil),\n ctx,\n error,\n durationMs,\n });\n } catch (hookError) {\n console.error(`Farm plugin \"${plugin.name}\" runtime.error failed:`, hookError);\n }\n }\n\n try {\n await this.runHookParallel(\"onError\", {\n phase: \"runtime\",\n error,\n meta: {\n kind: options.kind ?? \"request\",\n pathname: new URL(request.url).pathname,\n durationMs,\n },\n });\n } catch (hookError) {\n console.error(\"Farm plugin onError hook failed:\", hookError);\n }\n }\n\n private createStateHookContext(\n plugin: FarmPlugin,\n context: FarmPluginContext = this.context,\n ): FarmPluginStateContext {\n return {\n ...this.createPluginHookContext(plugin, context),\n state: this.pluginStates.get(plugin),\n };\n }\n\n private getPluginHooks(\n plugin: FarmPlugin,\n hookName: keyof FarmPlugin,\n ): Array<(...args: any[]) => any> {\n const hooks: Array<(...args: any[]) => any> = [];\n const legacyHook = plugin[hookName];\n if (typeof legacyHook === \"function\") {\n hooks.push(legacyHook);\n }\n\n const withState = (context: FarmPluginContext) => this.createStateHookContext(plugin, context);\n\n switch (hookName) {\n case \"config\":\n if (plugin.configure) {\n hooks.push((config: FarmConfig, context: FarmPluginContext) =>\n plugin.configure?.(config, context),\n );\n }\n break;\n case \"ready\":\n if (plugin.runtime?.start) {\n hooks.push((context: FarmPluginContext) => plugin.runtime?.start?.(withState(context)));\n }\n break;\n case \"shutdown\":\n if (plugin.runtime?.close) {\n hooks.push((payload: ShutdownPayload, context: FarmPluginContext) =>\n plugin.runtime?.close?.({\n ...withState(context),\n reason: payload.reason,\n }),\n );\n }\n break;\n case \"routeDiscovered\":\n if (plugin.router?.discovered) {\n hooks.push((route: RouteDiscoveredPayload, context: FarmPluginContext) =>\n plugin.router?.discovered?.(route, withState(context)),\n );\n }\n break;\n case \"middlewareDiscovered\":\n if (plugin.router?.discovered) {\n hooks.push((route: MiddlewareDiscoveredPayload, context: FarmPluginContext) =>\n plugin.router?.discovered?.({ kind: \"middleware\", ...route }, withState(context)),\n );\n }\n break;\n case \"apiRouteDiscovered\":\n if (plugin.router?.discovered) {\n hooks.push((route: APIRouteDiscoveredPayload, context: FarmPluginContext) =>\n plugin.router?.discovered?.({ kind: \"api\", ...route }, withState(context)),\n );\n }\n break;\n case \"routesGenerated\":\n if (plugin.router?.generated) {\n hooks.push((routes: RoutesGeneratedPayload, context: FarmPluginContext) =>\n plugin.router?.generated?.(routes, withState(context)),\n );\n }\n break;\n case \"beforeRouteMatch\":\n if (plugin.router?.before) {\n hooks.push((route: RouteMatchPayload, context: FarmPluginContext) =>\n plugin.router?.before?.(route, withState(context)),\n );\n }\n break;\n case \"afterRouteMatch\":\n if (plugin.router?.after) {\n hooks.push((result: RouteMatchResultPayload, context: FarmPluginContext) =>\n plugin.router?.after?.(result, withState(context)),\n );\n }\n break;\n case \"beforeRender\":\n if (plugin.render?.before) {\n hooks.push((render: RenderLifecyclePayload, context: FarmPluginContext) =>\n plugin.render?.before?.(render, withState(context)),\n );\n }\n break;\n case \"afterRender\":\n if (plugin.render?.html) {\n hooks.push((html: string, render: RenderLifecyclePayload, context: FarmPluginContext) =>\n plugin.render?.html?.(html, render, withState(context)),\n );\n }\n break;\n case \"beforeBundle\":\n if (plugin.build?.before) {\n hooks.push((bundle: BundleLifecyclePayload, context: FarmPluginContext) =>\n plugin.build?.before?.(bundle, withState(context)),\n );\n }\n break;\n case \"beforeNitroBuild\":\n if (plugin.build?.configure) {\n hooks.push((buildConfig: any, context: FarmPluginContext) =>\n plugin.build?.configure?.(buildConfig, withState(context)),\n );\n }\n break;\n case \"afterBundle\":\n if (plugin.build?.after) {\n hooks.push((result: BundleResultPayload, context: FarmPluginContext) =>\n plugin.build?.after?.(result, withState(context)),\n );\n }\n break;\n case \"devServerCreated\":\n if (plugin.dev?.server) {\n hooks.push((server: ViteDevServer, context: FarmPluginContext) =>\n plugin.dev?.server?.(server, withState(context)),\n );\n }\n break;\n case \"hmrUpdate\":\n if (plugin.dev?.update) {\n hooks.push((update: HMRUpdatePayload, context: FarmPluginContext) =>\n plugin.dev?.update?.(update, withState(context)),\n );\n }\n break;\n }\n\n return hooks;\n }\n\n private getHookContext(\n plugin: FarmPlugin,\n hookName: keyof FarmPlugin,\n args: any[],\n ): FarmPluginContext {\n if (\n hookName === \"beforeRequest\" ||\n hookName === \"afterResponse\" ||\n hookName === \"beforeApiHandler\"\n ) {\n const target = args[0];\n if (target && typeof target === \"object\") {\n return this.createRequestHookContext(target, plugin);\n }\n }\n\n return this.createPluginHookContext(plugin);\n }\n\n addPlugin(plugin: FarmPlugin) {\n this.plugins.push(plugin);\n this.hookPresence.clear();\n this.runtimeHookPresence.clear();\n }\n\n addPlugins(plugins: FarmPlugin[]) {\n for (const plugin of plugins) {\n this.addPlugin(plugin);\n }\n }\n\n getPlugins(): FarmPlugin[] {\n return [...this.plugins];\n }\n\n getSortedPlugins(): FarmPlugin[] {\n const pre = this.plugins.filter((p) => p.enforce === \"pre\");\n const normal = this.plugins.filter((p) => !p.enforce);\n const post = this.plugins.filter((p) => p.enforce === \"post\");\n return [...pre, ...normal, ...post];\n }\n\n hasHook(hookName: keyof FarmPlugin): boolean {\n const cached = this.hookPresence.get(hookName);\n if (cached !== undefined) return cached;\n\n const present = this.plugins.some((plugin) => this.getPluginHooks(plugin, hookName).length > 0);\n this.hookPresence.set(hookName, present);\n return present;\n }\n\n hasRuntimeHook(hookName: \"context\" | \"before\" | \"after\" | \"error\"): boolean {\n const cached = this.runtimeHookPresence.get(hookName);\n if (cached !== undefined) return cached;\n\n const present = this.plugins.some((plugin) => typeof plugin.runtime?.[hookName] === \"function\");\n this.runtimeHookPresence.set(hookName, present);\n return present;\n }\n\n hasRuntimeRequestHooks(): boolean {\n return (\n this.hasRuntimeHook(\"context\") ||\n this.hasRuntimeHook(\"before\") ||\n this.hasRuntimeHook(\"after\") ||\n this.hasRuntimeHook(\"error\")\n );\n }\n\n copyRequestContext(source: FarmRequest | Request, target: FarmRequest | Request): void {\n this.copyRequestStore(source, target);\n if (source instanceof Request && target instanceof Request) {\n this.copyRuntimeRequestContext(source, target);\n }\n }\n\n async setupPlugins(): Promise<void> {\n if (this.setupComplete) return;\n\n for (const plugin of this.getSortedPlugins()) {\n if (!plugin.setup) continue;\n const state = await plugin.setup({\n ...this.createPluginHookContext(plugin),\n env: getResolvedEnv(),\n });\n this.pluginStates.set(plugin, state);\n }\n\n this.setupComplete = true;\n }\n\n async startRuntime(): Promise<void> {\n if (this.runtimeReady) return;\n if (this.runtimeStartPromise) return this.runtimeStartPromise;\n\n this.runtimeStartPromise = (async () => {\n if (!this.initialized) {\n await this.runHookParallel(\"init\");\n }\n await this.setupPlugins();\n if (!this.runtimeReady) {\n await this.runHookParallel(\"ready\");\n }\n })();\n\n try {\n await this.runtimeStartPromise;\n } catch (error) {\n this.runtimeStartPromise = undefined;\n throw error;\n }\n }\n\n async closeRuntime(reason = \"runtime-closed\"): Promise<void> {\n if (this.runtimeClosePromise) return this.runtimeClosePromise;\n if (this.runtimeClosed) return;\n\n this.runtimeClosePromise = (async () => {\n const errors: unknown[] = [];\n this.runtimeShutdownHooksRunning = true;\n try {\n await this.runHookParallel(\"shutdown\", { reason });\n } catch (error) {\n if (error instanceof FarmRuntimeShutdownError) errors.push(...error.errors);\n else errors.push(error);\n } finally {\n this.runtimeShutdownHooksRunning = false;\n }\n\n const disposers = this.runtimeDisposers.splice(0).reverse();\n for (const dispose of disposers) {\n try {\n await dispose();\n } catch (error) {\n errors.push(error);\n }\n }\n\n this.runtimeClosed = true;\n if (errors.length > 0) {\n throw new FarmRuntimeShutdownError(\"Farm runtime shutdown failed\", errors);\n }\n })();\n return this.runtimeClosePromise;\n }\n\n async beginRuntimeRequest(\n request: Request,\n options: FarmPluginRuntimeRequestOptions = {},\n ): Promise<FarmPluginRuntimeSession> {\n await this.startRuntime();\n\n const startedAt = Date.now();\n const waitUntil = options.waitUntil\n ? (promise: Promise<unknown>) => options.waitUntil?.(Promise.resolve(promise))\n : (promise: Promise<unknown>) => {\n void Promise.resolve(promise).catch(() => {});\n };\n let activeRequest = request;\n let runtimeContext: Readonly<Record<string, unknown>> = Object.freeze({});\n\n try {\n runtimeContext = await this.createRuntimeRequestContext(activeRequest, options, waitUntil);\n\n let response: Response | undefined;\n for (const plugin of this.getSortedPlugins()) {\n const before = plugin.runtime?.before;\n if (!before) continue;\n\n const result = await before({\n ...this.createRuntimeBaseEvent(plugin, activeRequest, options, waitUntil),\n ctx: runtimeContext,\n });\n\n if (result instanceof Request) {\n this.copyRequestStore(activeRequest, result);\n this.copyRuntimeRequestContext(activeRequest, result);\n activeRequest = result;\n continue;\n }\n if (result instanceof Response) {\n response = result;\n break;\n }\n if (result !== undefined) {\n throw new TypeError(\n `Farm plugin \"${plugin.name}\" runtime.before must return a Request, Response, or undefined`,\n );\n }\n }\n\n return {\n request: activeRequest,\n response,\n ctx: runtimeContext,\n startedAt,\n options,\n waitUntil,\n };\n } catch (error) {\n await this.runRuntimeErrorHooks(\n activeRequest,\n error,\n runtimeContext,\n Date.now() - startedAt,\n options,\n waitUntil,\n );\n throw error;\n }\n }\n\n async endRuntimeRequest(\n session: FarmPluginRuntimeSession,\n initialResponse: Response,\n ): Promise<Response> {\n let response = initialResponse;\n\n try {\n for (const plugin of this.getSortedPlugins()) {\n const after = plugin.runtime?.after;\n if (!after) continue;\n\n const result = await after({\n ...this.createRuntimeBaseEvent(\n plugin,\n session.request,\n session.options,\n session.waitUntil,\n ),\n ctx: session.ctx,\n response,\n durationMs: Date.now() - session.startedAt,\n });\n if (result !== undefined) {\n if (!(result instanceof Response)) {\n throw new TypeError(\n `Farm plugin \"${plugin.name}\" runtime.after must return a Response or undefined`,\n );\n }\n response = result;\n }\n }\n\n return response;\n } catch (error) {\n await this.failRuntimeRequest(session, error);\n throw error;\n }\n }\n\n async failRuntimeRequest(session: FarmPluginRuntimeSession, error: unknown): Promise<void> {\n if (this.failedRuntimeSessions.has(session)) return;\n this.failedRuntimeSessions.add(session);\n await this.runRuntimeErrorHooks(\n session.request,\n error,\n session.ctx,\n Date.now() - session.startedAt,\n session.options,\n session.waitUntil,\n );\n }\n\n async runRuntimeRequest(\n request: Request,\n handler: FarmPluginRuntimeRequestHandler,\n options: FarmPluginRuntimeRequestOptions = {},\n ): Promise<Response> {\n const session = await this.beginRuntimeRequest(request, options);\n try {\n const response = session.response ?? (await handler(session.request));\n if (!(response instanceof Response)) {\n throw new TypeError(\"Farm plugin runtime handlers must return a Response\");\n }\n return await this.endRuntimeRequest(session, response);\n } catch (error) {\n await this.failRuntimeRequest(session, error);\n throw error;\n }\n }\n\n async runHook<K extends keyof FarmPlugin>(hookName: K, ...args: any[]): Promise<any> {\n const plugins = this.getSortedPlugins();\n\n for (const plugin of plugins) {\n for (const hook of this.getPluginHooks(plugin, hookName)) {\n const hookContext = this.getHookContext(plugin, hookName, args);\n const result = await (hook as any).apply(plugin, [...args, hookContext]);\n if (result !== undefined) {\n return result;\n }\n }\n }\n }\n\n async runHookSerial<K extends keyof FarmPlugin>(\n hookName: K,\n initialValue: any,\n ...args: any[]\n ): Promise<any> {\n const plugins = this.getSortedPlugins();\n let value = initialValue;\n\n for (const plugin of plugins) {\n for (const hook of this.getPluginHooks(plugin, hookName)) {\n const hookArgs = [value, ...args];\n const hookContext = this.getHookContext(plugin, hookName, hookArgs);\n const result = await (hook as any).apply(plugin, [...hookArgs, hookContext]);\n if (result !== undefined) {\n if (\n hookName === \"beforeApiHandler\" &&\n result !== value &&\n value &&\n result &&\n typeof value === \"object\" &&\n typeof result === \"object\"\n ) {\n this.copyRequestStore(value as FarmRequest | Request, result as FarmRequest | Request);\n }\n value = result;\n }\n }\n }\n\n return value;\n }\n\n async runHookParallel<K extends keyof FarmPlugin>(hookName: K, ...args: any[]): Promise<boolean> {\n return this.runHookParallelFiltered(hookName, () => true, ...args);\n }\n\n /** @internal Runs hooks for only the plugins selected by the runtime adapter. */\n async runHookParallelFiltered<K extends keyof FarmPlugin>(\n hookName: K,\n include: (plugin: FarmPlugin) => boolean,\n ...args: any[]\n ): Promise<boolean> {\n if (hookName === \"shutdown\" && !this.runtimeShutdownHooksRunning) {\n await this.closeRuntime(args[0]?.reason);\n return false;\n }\n\n const plugins = this.getSortedPlugins().filter(include);\n\n // Run selected hooks sequentially for deterministic execution and short-circuiting.\n const sequentialHooks = new Set<keyof FarmPlugin>([\n \"ready\",\n \"shutdown\",\n \"beforeRequest\",\n \"afterResponse\",\n \"beforeApiHandler\",\n \"afterApiHandler\",\n \"beforeRouteMatch\",\n \"afterRouteMatch\",\n \"beforeRender\",\n \"afterRender\",\n ]);\n\n if (sequentialHooks.has(hookName)) {\n const shutdownErrors: unknown[] = [];\n for (const plugin of plugins) {\n for (const hook of this.getPluginHooks(plugin, hookName)) {\n // Check if response is already sent (only for beforeRequest)\n if (hookName === \"beforeRequest\") {\n const res = args[1];\n if (res && res.writableEnded) {\n return true;\n }\n }\n\n const hookContext = this.getHookContext(plugin, hookName, args);\n try {\n await (hook as any).apply(plugin, [...args, hookContext]);\n } catch (error) {\n if (hookName !== \"shutdown\") throw error;\n shutdownErrors.push(error);\n }\n\n // Check again after plugin execution (only for beforeRequest)\n if (hookName === \"beforeRequest\") {\n const res = args[1];\n if (res && res.writableEnded) {\n return true;\n }\n }\n }\n }\n if (hookName === \"shutdown\" && shutdownErrors.length > 0) {\n throw new FarmRuntimeShutdownError(\"Farm plugin shutdown hooks failed\", shutdownErrors);\n }\n } else {\n // Run other hooks in parallel\n const promises: Promise<any>[] = [];\n for (const plugin of plugins) {\n for (const hook of this.getPluginHooks(plugin, hookName)) {\n const hookContext = this.getHookContext(plugin, hookName, args);\n promises.push((hook as any).apply(plugin, [...args, hookContext]));\n }\n }\n await Promise.all(promises);\n }\n\n if (hookName === \"init\") this.initialized = true;\n if (hookName === \"ready\") this.runtimeReady = true;\n\n return false;\n }\n\n updateContext(updates: Partial<FarmPluginContext>) {\n this.context = {\n ...this.context,\n ...updates,\n requestContext: this.context.requestContext,\n };\n }\n}\n\nexport function definePlugin<\n TState = undefined,\n TRequestContext extends object = Record<string, never>,\n TClientState = unknown,\n TClientPublic = undefined,\n TIntegrationInstance = unknown,\n>(\n plugin: FarmPlugin<TState, TRequestContext, TClientState, TClientPublic, TIntegrationInstance>,\n): FarmPlugin<TState, TRequestContext, TClientState, TClientPublic, TIntegrationInstance> {\n return plugin;\n}\n\nexport namespace definePlugin {\n /** Bind an integration instance type while preserving inference for plugin state and context. */\n export function forIntegration<TIntegrationInstance>() {\n return function defineBoundPlugin<\n TState = undefined,\n TRequestContext extends object = Record<string, never>,\n TClientState = unknown,\n TClientPublic = undefined,\n >(\n plugin: FarmPlugin<\n TState,\n TRequestContext,\n TClientState,\n TClientPublic,\n TIntegrationInstance\n >,\n ): FarmPlugin<TState, TRequestContext, TClientState, TClientPublic, TIntegrationInstance> {\n return plugin;\n };\n }\n}\nexport { farmPlugin } from \"./vite\";\n"],"mappings":"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","names":["definePlugin"]}