{"version":3,"sources":["../src/api/vite-plugin.ts"],"sourcesContent":["/**\n * Farm.js API Routes Vite Plugin\n *\n * Standalone API route support that works with any Vite setup.\n * Discovers and handles route.ts files in the api directory.\n * Also supports root routes.ts for custom route definitions.\n *\n * @example\n * ```ts\n * import { farmApiPlugin } from '@farm.js/core'\n *\n * export default defineConfig({\n *   plugins: [farmApiPlugin({ srcDir: 'src' })],\n * })\n * ```\n */\n\nimport type { Plugin, ViteDevServer } from \"vite\";\nimport {\n  APIRouteConflictError,\n  API_ROUTE_METHODS,\n  getAllowedAPIRouteMethods,\n  invokeAPIRouteEndpoint,\n  resolveAPIRouteEndpoint,\n} from \"./route-manager\";\nimport { matchAPIRouteAtBasePath } from \"./runtime\";\nimport { sendWebResponse } from \"../server/response\";\nimport { isFarmAPIRouteFileName } from \"./route-files\";\nimport { _withAfterNodeMiddleware } from \"../after\";\nimport { _runWithAPIRequestRuntime } from \"./server-context\";\nimport { isProgrammaticRoutesFileName } from \"../routes-shared\";\nimport { findProgrammaticRouteFilesInDir } from \"../routes.server\";\nimport { toPosixPath, toViteModuleId } from \"../utils\";\nimport {\n  createFarmRequestBodyErrorResponse,\n  readNodeRequestBody,\n  resolveFarmServerConfig,\n} from \"../server-http\";\nimport { createCliColors } from \"../cli-colors\";\nimport {\n  AmbiguousRouteError,\n  assertUniqueRouteParameters,\n  getRoutePatternShape,\n} from \"../routing/specificity\";\n\nexport interface FarmApiPluginOptions {\n  /** Source directory containing the api folder (default: 'src') */\n  srcDir?: string;\n  /** Enable debug logging */\n  debug?: boolean;\n  /** Maximum request body size, for example `\"10mb\"`. */\n  bodySizeLimit?: number | string;\n  /** Same-origin path where canonical `/api` routes are served. @default \"/api\" */\n  basePath?: string;\n}\n\nexport interface ApiRoute {\n  path: string;\n  filePath: string;\n  methods: string[];\n  endpoints: Record<string, any>;\n}\n\n/**\n * Farm.js API Routes Vite Plugin\n */\nexport function farmApiPlugin(options: FarmApiPluginOptions = {}): Plugin {\n  const srcDir = options.srcDir ?? \"src\";\n  const debug = options.debug ?? false;\n  const bodySizeLimit = resolveFarmServerConfig({\n    bodySizeLimit: options.bodySizeLimit,\n  }).bodySizeLimit;\n  const basePath = options.basePath;\n\n  // API routes cache\n  let apiRoutesCache: Map<string, ApiRoute> = new Map();\n  let apiRouterHandler: ((req: Request) => Promise<Response>) | null = null;\n  let discoveryComplete = false;\n  let discoveryPromise: Promise<void> | null = null;\n  let discoveryError: unknown;\n  let recoverFailedDiscovery: (() => Promise<boolean>) | undefined;\n  const endpointSources = new Map<string, Map<string, string>>();\n  const routeShapes = new Map<string, { routePath: string; filePath: string }>();\n\n  const log = (_message: string) => {};\n  const logResponse = (method: string, urlPath: string, status: number, duration: number) => {\n    const pc = createCliColors();\n    let statusColor = pc.green;\n    if (status >= 500) statusColor = pc.red;\n    else if (status >= 400) statusColor = pc.yellow;\n    else if (status >= 300) statusColor = pc.cyan;\n\n    const logMsg = [\n      pc.dim(\"[\") + pc.bold(pc.blue(\"FARM\")) + pc.dim(\"]\"),\n      pc.dim(\"[\") + pc.bold(pc.cyan(\"API\")) + pc.dim(\"]\"),\n      pc.dim(\"[\") + pc.bold(pc.white(method.padEnd(3))) + pc.dim(\"]\"),\n      pc.gray(urlPath),\n      pc.dim(\"-\"),\n      statusColor(status.toString()),\n      pc.dim(`(${duration}ms)`),\n    ].join(\" \");\n    console.log(logMsg);\n  };\n\n  const registerRouteShape = (routePath: string, filePath: string): void => {\n    assertUniqueRouteParameters(routePath, \"api\");\n    const shape = getRoutePatternShape(routePath, \"api\");\n    const existing = routeShapes.get(shape);\n    if (existing && existing.routePath !== routePath) {\n      throw new AmbiguousRouteError(\n        `Ambiguous API routes \"${existing.routePath}\" and \"${routePath}\" match the same URLs. Found ${existing.filePath} and ${filePath}. Keep only one route for this URL shape.`,\n      );\n    }\n    routeShapes.set(shape, { routePath, filePath });\n  };\n\n  const addEndpoint = (\n    routePath: string,\n    filePath: string,\n    method: string,\n    endpoint: any,\n  ): void => {\n    registerRouteShape(routePath, filePath);\n    const normalizedMethod = method.toUpperCase();\n    const existing = apiRoutesCache.get(routePath);\n    const existingFile = endpointSources.get(routePath)?.get(normalizedMethod);\n\n    if (existingFile) {\n      throw new APIRouteConflictError(routePath, normalizedMethod, existingFile, filePath);\n    }\n\n    if (existing) {\n      if (!existing.methods.includes(normalizedMethod)) {\n        existing.methods.push(normalizedMethod);\n      }\n      existing.endpoints[normalizedMethod] = endpoint;\n      const sources = endpointSources.get(routePath) ?? new Map();\n      sources.set(normalizedMethod, filePath);\n      endpointSources.set(routePath, sources);\n      return;\n    }\n\n    apiRoutesCache.set(routePath, {\n      path: routePath,\n      filePath,\n      methods: [normalizedMethod],\n      endpoints: { [normalizedMethod]: endpoint },\n    });\n    endpointSources.set(routePath, new Map([[normalizedMethod, filePath]]));\n  };\n\n  const removeEndpointsFromFile = (filePath: string): void => {\n    for (const [routePath, sources] of endpointSources) {\n      const route = apiRoutesCache.get(routePath);\n      if (!route) continue;\n\n      for (const [method, sourceFile] of sources) {\n        if (sourceFile !== filePath) continue;\n        sources.delete(method);\n        route.methods = route.methods.filter((candidate) => candidate !== method);\n        delete route.endpoints[method];\n      }\n\n      if (route.methods.length === 0) {\n        apiRoutesCache.delete(routePath);\n        endpointSources.delete(routePath);\n        routeShapes.delete(getRoutePatternShape(routePath, \"api\"));\n      } else {\n        const currentSource = sources.values().next().value;\n        if (route.filePath === filePath && currentSource) {\n          route.filePath = currentSource;\n        }\n        routeShapes.set(getRoutePatternShape(routePath, \"api\"), {\n          routePath,\n          filePath: currentSource ?? route.filePath,\n        });\n      }\n    }\n  };\n\n  const snapshotRouteState = () => ({\n    routes: new Map(\n      [...apiRoutesCache].map(([routePath, route]) => [\n        routePath,\n        {\n          ...route,\n          methods: [...route.methods],\n          endpoints: { ...route.endpoints },\n        },\n      ]),\n    ),\n    sources: new Map(\n      [...endpointSources].map(([routePath, sources]) => [routePath, new Map(sources)]),\n    ),\n    shapes: new Map(routeShapes),\n  });\n\n  const restoreRouteState = (snapshot: ReturnType<typeof snapshotRouteState>): void => {\n    apiRoutesCache = snapshot.routes;\n    endpointSources.clear();\n    for (const [routePath, sources] of snapshot.sources) {\n      endpointSources.set(routePath, sources);\n    }\n    routeShapes.clear();\n    for (const [shape, route] of snapshot.shapes) {\n      routeShapes.set(shape, route);\n    }\n  };\n\n  // Create API router handler\n  const createRouter = async (): Promise<void> => {\n    const totalEndpoints = Array.from(apiRoutesCache.values()).reduce(\n      (sum, route) => sum + route.methods.length,\n      0,\n    );\n\n    apiRouterHandler = null;\n\n    if (totalEndpoints > 0) {\n      apiRouterHandler = async (request: Request): Promise<Response> => {\n        const url = new URL(request.url);\n        const method = request.method.toUpperCase();\n        const pathname = url.pathname;\n\n        const match = matchAPIRouteAtBasePath(apiRoutesCache, pathname, basePath);\n        if (!match) {\n          return new Response(JSON.stringify({ error: \"Not Found\" }), {\n            status: 404,\n            headers: { \"Content-Type\": \"application/json\" },\n          });\n        }\n\n        const { route, params } = match;\n        const endpoint = resolveAPIRouteEndpoint(route, method);\n        if (!endpoint) {\n          return new Response(JSON.stringify({ error: \"Method Not Allowed\" }), {\n            status: 405,\n            headers: {\n              Allow: getAllowedAPIRouteMethods(route).join(\", \"),\n              \"Content-Type\": \"application/json\",\n            },\n          });\n        }\n\n        try {\n          return await invokeAPIRouteEndpoint(endpoint, request, params, bodySizeLimit);\n        } catch (error: any) {\n          return new Response(JSON.stringify({ error: error.message || \"Internal Server Error\" }), {\n            status: 500,\n            headers: { \"Content-Type\": \"application/json\" },\n          });\n        }\n      };\n\n      log(`API router created with ${totalEndpoints} endpoints`);\n    }\n  };\n\n  return {\n    name: \"@farm.js/core:api\",\n    enforce: \"pre\",\n\n    configureServer(server: ViteDevServer) {\n      // Discover API routes in /api directory\n      const discoverFileRoutes = async (apiDir: string): Promise<void> => {\n        const fs = await import(\"fs\");\n        const path = await import(\"path\");\n\n        if (!fs.existsSync(apiDir)) {\n          log(\"No api directory found\");\n          return;\n        }\n\n        const findRouteFiles = (dir: string): string[] => {\n          const files: string[] = [];\n          if (!fs.existsSync(dir)) return files;\n          const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n          for (const entry of entries) {\n            const fullPath = path.join(dir, entry.name);\n            if (entry.isDirectory()) {\n              files.push(...findRouteFiles(fullPath));\n            } else if (isFarmAPIRouteFileName(entry.name)) {\n              files.push(fullPath);\n            }\n          }\n          return files;\n        };\n\n        const routeFiles = findRouteFiles(apiDir);\n        apiRoutesCache.clear();\n        endpointSources.clear();\n        routeShapes.clear();\n\n        for (const filePath of routeFiles) {\n          try {\n            const relativePath = path.relative(apiDir, path.dirname(filePath));\n            const routePath =\n              \"/api/\" + (relativePath === \".\" ? \"\" : relativePath.replace(/\\\\/g, \"/\"));\n\n            const routeModule = await server.ssrLoadModule(filePath);\n            const endpoints: Record<string, any> = {};\n            const availableMethods: string[] = [];\n\n            for (const method of API_ROUTE_METHODS) {\n              if (routeModule[method]) {\n                availableMethods.push(method);\n                endpoints[method] = routeModule[method];\n              }\n            }\n\n            if (availableMethods.length > 0) {\n              for (const method of availableMethods) {\n                addEndpoint(routePath, filePath, method, endpoints[method]);\n              }\n              log(`API route discovered: ${availableMethods.join(\", \")} ${routePath}`);\n            }\n          } catch (e: any) {\n            if (e instanceof APIRouteConflictError || e instanceof AmbiguousRouteError) throw e;\n            log(`API route load failed at ${filePath}: ${e.message}`);\n          }\n        }\n      };\n\n      // Discover routes from root routes.ts file\n      const discoverRootRoutes = async (): Promise<void> => {\n        const fs = await import(\"fs\");\n        const path = await import(\"path\");\n\n        const routesFiles = [\n          path.join(server.config.root, srcDir, \"routes.ts\"),\n          path.join(server.config.root, srcDir, \"routes.tsx\"),\n          path.join(server.config.root, srcDir, \"routes.js\"),\n        ];\n\n        for (const routesFile of routesFiles) {\n          if (fs.existsSync(routesFile)) {\n            try {\n              const routesModule = await server.ssrLoadModule(routesFile);\n\n              for (const [exportName, exportValue] of Object.entries(routesModule)) {\n                const endpoint = exportValue as any;\n\n                if (endpoint && endpoint.__path) {\n                  const routePath = endpoint.__path;\n                  const method = String(endpoint.__method || \"GET\").toUpperCase();\n\n                  addEndpoint(routePath, routesFile, method, endpoint);\n                  log(`Root route discovered: ${method} ${routePath}`);\n                }\n              }\n            } catch (e: any) {\n              if (e instanceof APIRouteConflictError || e instanceof AmbiguousRouteError) throw e;\n              log(`Root routes.ts load failed: ${e.message}`);\n            }\n            break;\n          }\n        }\n      };\n\n      const discoverProgrammaticRoutes = async (): Promise<void> => {\n        const path = await import(\"path\");\n        const srcRoot = path.join(server.config.root, srcDir);\n        const routeFiles = findProgrammaticRouteFilesInDir(srcRoot);\n        if (routeFiles.length === 0) return;\n        const { getProgrammaticRouteManifest } = await import(\"../routes\");\n\n        for (const routeFile of routeFiles) {\n          try {\n            const routesModule = await server.ssrLoadModule(\n              toViteModuleId(routeFile, server.config.root),\n            );\n            const manifest = getProgrammaticRouteManifest(routesModule);\n            if (!manifest) continue;\n\n            for (const definition of manifest.routes) {\n              if (definition.kind !== \"api\") continue;\n\n              for (const [method, endpoint] of Object.entries(definition.methods)) {\n                if (endpoint) {\n                  addEndpoint(definition.path, routeFile, method, endpoint);\n                  log(`Programmatic route discovered: ${method} ${definition.path}`);\n                }\n              }\n            }\n          } catch (e: any) {\n            if (e instanceof APIRouteConflictError || e instanceof AmbiguousRouteError) throw e;\n            log(`Programmatic routes file load failed at ${routeFile}: ${e.message}`);\n          }\n        }\n      };\n\n      // Initialize discovery\n      const initializeDiscovery = async () => {\n        const path = await import(\"path\");\n        const apiDir = path.join(server.config.root, srcDir, \"api\");\n        log(`Discovering API routes in: ${apiDir}`);\n\n        await discoverFileRoutes(apiDir);\n        await discoverRootRoutes();\n        await discoverProgrammaticRoutes();\n        await createRouter();\n\n        discoveryComplete = true;\n        log(`API discovery complete: ${apiRoutesCache.size} routes found`);\n      };\n\n      discoveryPromise = initializeDiscovery().catch((e) => {\n        discoveryError = e;\n        console.error(\"[FARM] API discovery error:\", e);\n      });\n\n      const waitForDiscovery = async () => {\n        await discoveryPromise;\n        if (discoveryError) throw discoveryError;\n      };\n\n      recoverFailedDiscovery = async (): Promise<boolean> => {\n        if (!discoveryError) return false;\n\n        const previousState = snapshotRouteState();\n        try {\n          await initializeDiscovery();\n          discoveryError = undefined;\n          discoveryPromise = Promise.resolve();\n        } catch (error) {\n          restoreRouteState(previousState);\n          discoveryError = error;\n          discoveryComplete = false;\n          discoveryPromise = Promise.resolve();\n          throw error;\n        }\n\n        return true;\n      };\n\n      // Expose API router for other plugins\n      (server as any).__farmApi__ = {\n        getHandler: () => apiRouterHandler,\n        getRoutes: () => apiRoutesCache,\n        isReady: () => discoveryComplete,\n        waitForDiscovery,\n      };\n\n      // Add middleware to handle API requests\n      return () => {\n        const apiMiddleware = _withAfterNodeMiddleware(async (req, res, next) => {\n          const url = req.url || \"/\";\n          const pathname = url.split(\"?\")[0];\n          const method = req.method || \"GET\";\n\n          if (discoveryPromise) await waitForDiscovery();\n\n          if (!matchAPIRouteAtBasePath(apiRoutesCache, pathname, basePath)) {\n            return next();\n          }\n\n          if (!apiRouterHandler) {\n            return next();\n          }\n\n          const startTime = Date.now();\n\n          try {\n            // Execute middleware if available\n            const farmMiddleware = (server as any).__farmMiddleware__;\n            if (farmMiddleware) {\n              await farmMiddleware.waitForDiscovery?.();\n              const middlewareData = new Map<string, any>();\n              const handled = await farmMiddleware.execute(req, res, pathname, middlewareData);\n              if (handled) {\n                const duration = Date.now() - startTime;\n                logResponse(method, pathname, res.statusCode || 200, duration);\n                return;\n              }\n            }\n\n            // ctx.rewrite() mutates req.url; dispatch from the current\n            // value so dev matches production, where the rewritten request\n            // reaches the API router.\n            const currentUrl = req.url || url;\n            const currentPathname = currentUrl.split(\"?\")[0];\n            if (\n              currentPathname !== pathname &&\n              !matchAPIRouteAtBasePath(apiRoutesCache, currentPathname, basePath)\n            ) {\n              // Rewritten off the API surface; let the page pipeline serve it.\n              return next();\n            }\n\n            // Convert Node request to Web Request\n            const fullUrl = `http://${req.headers.host || \"localhost:3000\"}${currentUrl}`;\n            const headers = new Headers();\n            for (const [key, value] of Object.entries(req.headers)) {\n              if (value) {\n                headers.set(key, Array.isArray(value) ? value.join(\", \") : value);\n              }\n            }\n\n            let body: Buffer | undefined;\n            if (method !== \"GET\" && method !== \"HEAD\") {\n              body = await readNodeRequestBody(req as any, bodySizeLimit);\n            }\n\n            const request = new Request(fullUrl, {\n              method,\n              headers,\n              body: body\n                ? (body.buffer.slice(\n                    body.byteOffset,\n                    body.byteOffset + body.byteLength,\n                  ) as ArrayBuffer)\n                : undefined,\n            });\n\n            const response = await apiRouterHandler(request);\n\n            const duration = Date.now() - startTime;\n            logResponse(method, currentPathname, response.status, duration);\n\n            await sendWebResponse(res, response);\n          } catch (error: any) {\n            const bodyErrorResponse = createFarmRequestBodyErrorResponse(error);\n            if (bodyErrorResponse) {\n              await sendWebResponse(res, bodyErrorResponse);\n              return;\n            }\n            const duration = Date.now() - startTime;\n            logResponse(method, pathname, 500, duration);\n            console.error(\"[FARM] API error:\", error);\n            res.statusCode = 500;\n            res.setHeader(\"Content-Type\", \"application/json\");\n            res.end(JSON.stringify({ error: \"Internal server error\" }));\n          }\n        });\n        server.middlewares.use((req, res, next) => {\n          const result = _runWithAPIRequestRuntime(\n            {\n              basePath: basePath ?? \"/api\",\n              dispatch: async (request) =>\n                apiRouterHandler\n                  ? apiRouterHandler(request)\n                  : Response.json({ error: \"Not Found\" }, { status: 404 }),\n            },\n            () => apiMiddleware(req, res, next),\n          );\n          return Promise.resolve(result).catch((error) => {\n            console.error(\n              `[FARM] Unhandled API error while handling ${req.method || \"GET\"} ${req.url || \"/\"}:`,\n              error,\n            );\n            if (res.writableEnded) return;\n            if (res.headersSent) {\n              res.destroy?.(error instanceof Error ? error : new Error(String(error)));\n              return;\n            }\n            res.statusCode = 500;\n            res.setHeader(\"Content-Type\", \"application/json\");\n            res.end(JSON.stringify({ error: \"Internal server error\" }));\n          });\n        });\n      };\n    },\n\n    async handleHotUpdate({ file, server, modules }) {\n      const normalizedFile = toPosixPath(file);\n      const fileName = normalizedFile.split(\"/\").pop() || \"\";\n\n      // Handle root routes.ts updates\n      if (\n        fileName === \"routes.ts\" ||\n        fileName === \"routes.tsx\" ||\n        fileName === \"routes.js\" ||\n        isProgrammaticRoutesFileName(fileName)\n      ) {\n        log(`Root routes file updated: ${fileName}`);\n\n        for (const mod of modules) {\n          server.moduleGraph.invalidateModule(mod);\n        }\n\n        if (await recoverFailedDiscovery?.()) return [];\n\n        const previousState = snapshotRouteState();\n\n        try {\n          const routesModule = await server.ssrLoadModule(file);\n          removeEndpointsFromFile(file);\n\n          for (const [exportName, exportValue] of Object.entries(routesModule)) {\n            const endpoint = exportValue as any;\n\n            if (endpoint && endpoint.__path) {\n              const routePath = endpoint.__path;\n              const method = String(endpoint.__method || \"GET\").toUpperCase();\n\n              addEndpoint(routePath, file, method, endpoint);\n              log(`Root route reloaded: ${method} ${routePath}`);\n            }\n          }\n\n          const { getProgrammaticRouteManifest } = await import(\"../routes\");\n          const manifest = getProgrammaticRouteManifest(routesModule);\n          if (manifest) {\n            for (const definition of manifest.routes) {\n              if (definition.kind !== \"api\") continue;\n\n              for (const [method, endpoint] of Object.entries(definition.methods)) {\n                if (endpoint) {\n                  addEndpoint(definition.path, file, method, endpoint);\n                  log(`Programmatic route reloaded: ${method} ${definition.path}`);\n                }\n              }\n            }\n          }\n\n          await createRouter();\n          log(`API router recreated`);\n        } catch (e: any) {\n          restoreRouteState(previousState);\n          if (e instanceof APIRouteConflictError || e instanceof AmbiguousRouteError) throw e;\n          log(`Root routes.ts HMR failed: ${e.message}`);\n        }\n\n        return [];\n      }\n\n      // Handle file-based route updates\n      if (normalizedFile.includes(\"/api/\") && fileName.startsWith(\"route.\")) {\n        const shortPath = normalizedFile.split(\"/api/\")[1] || normalizedFile;\n        log(`API route updated: ${shortPath}`);\n\n        for (const mod of modules) {\n          server.moduleGraph.invalidateModule(mod);\n        }\n\n        if (await recoverFailedDiscovery?.()) return [];\n\n        const previousState = snapshotRouteState();\n        try {\n          const path = await import(\"path\");\n          const apiDir = path.join(server.config.root, srcDir, \"api\");\n          const relativePath = path.relative(apiDir, path.dirname(file));\n          const routePath =\n            \"/api/\" + (relativePath === \".\" ? \"\" : relativePath.replace(/\\\\/g, \"/\"));\n          const fs = await import(\"fs\");\n          if (!fs.existsSync(file)) {\n            removeEndpointsFromFile(file);\n            await createRouter();\n            log(`API route file removed: ${routePath}`);\n            return [];\n          }\n          const routeModule = await server.ssrLoadModule(file);\n\n          removeEndpointsFromFile(file);\n          const availableMethods: string[] = [];\n          for (const method of API_ROUTE_METHODS) {\n            if (!routeModule[method]) continue;\n            availableMethods.push(method);\n            addEndpoint(routePath, file, method, routeModule[method]);\n          }\n\n          await createRouter();\n          log(`API route reloaded: ${availableMethods.join(\", \")} ${routePath}`);\n          log(`API router recreated`);\n        } catch (e: any) {\n          restoreRouteState(previousState);\n          if (e instanceof APIRouteConflictError || e instanceof AmbiguousRouteError) throw e;\n          log(`API route HMR failed: ${e.message}`);\n        }\n\n        return [];\n      }\n    },\n  };\n}\n"],"mappings":"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","names":["duration"]}