{"version":3,"sources":["../src/openapi/generator.ts","../src/openapi/manager.ts"],"sourcesContent":["import type { OpenAPIConfig } from \"../config\";\nimport type { APIRouteInfo } from \"../type-generator\";\nimport * as z from \"zod\";\n\nexport interface OpenAPISpec {\n  openapi: string;\n  info: {\n    title: string;\n    description?: string;\n    version: string;\n    contact?: {\n      name?: string;\n      email?: string;\n      url?: string;\n    };\n    license?: {\n      name: string;\n      url?: string;\n    };\n  };\n  servers?: Array<{\n    url: string;\n    description?: string;\n  }>;\n  paths: Record<string, any>;\n  components?: {\n    schemas?: Record<string, any>;\n    securitySchemes?: Record<string, any>;\n  };\n}\n\ntype AllowedType = \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\";\nconst allowedType = new Set([\"string\", \"number\", \"boolean\", \"array\", \"object\"]);\n\n/**\n * OpenAPI `type` for a literal's value(s). A single-type literal keeps its JS\n * type; mixed-type literal sets fall back to string (the enum still carries the\n * exact values). bigint maps to integer.\n */\nfunction openAPITypeForLiteralValues(values: readonly unknown[]): AllowedType {\n  if (values.length === 0) return \"string\";\n  const jsType = typeof values[0];\n  if (!values.every((value) => typeof value === jsType)) return \"string\";\n  switch (jsType) {\n    case \"number\":\n      return \"number\";\n    case \"bigint\":\n      return \"number\";\n    case \"boolean\":\n      return \"boolean\";\n    default:\n      return \"string\";\n  }\n}\n\nexport class OpenAPIGenerator {\n  private config: OpenAPIConfig;\n  private appDir: string;\n\n  constructor(appDir: string, config: OpenAPIConfig) {\n    this.appDir = appDir;\n    this.config = config;\n  }\n\n  /**\n   * Get type from Zod type\n   */\n  private getTypeFromZodType(zodType: z.ZodType<any>): AllowedType {\n    const tag = (zodType as any)._def?.type;\n    return typeof tag === \"string\" && allowedType.has(tag) ? (tag as AllowedType) : \"string\";\n  }\n\n  /**\n   * Whether a schema field must be supplied by the caller. A field with a\n   * default is supplied by the server when omitted, so — like an explicitly\n   * optional field — it is not required. Only ZodOptional was excluded before,\n   * which documented every `.default()` field as required.\n   */\n  private isRequiredField(value: z.ZodType<any>): boolean {\n    return !(value instanceof z.ZodOptional) && !(value instanceof z.ZodDefault);\n  }\n\n  /**\n   * Process Zod type to OpenAPI schema\n   */\n  private processZodType(zodType: z.ZodType<any>): any {\n    // Handle ZodOptional and ZodNullable\n    if (zodType instanceof z.ZodOptional || zodType instanceof z.ZodNullable) {\n      const innerType = (zodType as any)._def.innerType;\n      const innerSchema = this.processZodType(innerType);\n      return {\n        ...innerSchema,\n        nullable: true,\n      };\n    }\n\n    // Handle ZodDefault. The value is always present after parsing, so the\n    // documented type is the wrapped one.\n    if (zodType instanceof z.ZodDefault) {\n      return this.processZodType((zodType as any)._def.innerType);\n    }\n\n    // Handle ZodObject\n    if (zodType instanceof z.ZodObject) {\n      const shape = (zodType as any).shape;\n      if (shape) {\n        const properties: Record<string, any> = {};\n        const required: string[] = [];\n        Object.entries(shape).forEach(([key, value]) => {\n          if (value instanceof z.ZodType) {\n            properties[key] = this.processZodType(value as z.ZodType<any>);\n            if (this.isRequiredField(value as z.ZodType<any>)) {\n              required.push(key);\n            }\n          }\n        });\n        return {\n          type: \"object\",\n          properties,\n          ...(required.length > 0 ? { required } : {}),\n          description: (zodType as any).description,\n        };\n      }\n    }\n\n    // Handle ZodArray\n    if (zodType instanceof z.ZodArray) {\n      return {\n        type: \"array\",\n        items: this.processZodType((zodType as any)._def.element),\n        description: (zodType as any).description,\n      };\n    }\n\n    // Handle ZodEnum\n    if (zodType instanceof z.ZodEnum) {\n      return {\n        type: \"string\",\n        enum: (zodType as any).options,\n        description: (zodType as any).description,\n      };\n    }\n\n    // Handle ZodLiteral: emit the concrete value(s) as an enum rather than\n    // dropping the constraint and documenting a bare string.\n    if (zodType instanceof z.ZodLiteral) {\n      const values = ((zodType as any)._def.values as unknown[]) ?? [];\n      return {\n        type: openAPITypeForLiteralValues(values),\n        ...(values.length > 0 ? { enum: [...values] } : {}),\n        description: (zodType as any).description,\n      };\n    }\n\n    // Handle ZodUnion (including discriminated unions): oneOf over the members.\n    if (zodType instanceof z.ZodUnion) {\n      const options = ((zodType as any)._def.options as z.ZodType<any>[]) ?? [];\n      return {\n        oneOf: options.map((option) => this.processZodType(option)),\n        description: (zodType as any).description,\n      };\n    }\n\n    // Handle ZodRecord: an object whose values share a schema.\n    if (zodType instanceof z.ZodRecord) {\n      return {\n        type: \"object\",\n        additionalProperties: this.processZodType((zodType as any)._def.valueType),\n        description: (zodType as any).description,\n      };\n    }\n\n    // Handle ZodTuple: a fixed-length (unless variadic) array. OpenAPI 3.0 has no\n    // positional items, so the element schemas are unioned; the length is pinned\n    // when there is no rest element.\n    if (zodType instanceof z.ZodTuple) {\n      const items = ((zodType as any)._def.items as z.ZodType<any>[]) ?? [];\n      const rest = (zodType as any)._def.rest;\n      const itemSchemas = items.map((item) => this.processZodType(item));\n      const tupleSchema: any = {\n        type: \"array\",\n        items: itemSchemas.length === 1 ? itemSchemas[0] : { oneOf: itemSchemas },\n        description: (zodType as any).description,\n      };\n      if (!rest) {\n        tupleSchema.minItems = items.length;\n        tupleSchema.maxItems = items.length;\n      }\n      return tupleSchema;\n    }\n\n    // For primitive types\n    const baseSchema: any = {\n      type: this.getTypeFromZodType(zodType),\n      description: (zodType as any).description,\n    };\n\n    // Add constraints if available. `min`/`max` are methods rather than values, so\n    // the bounds are read from `minValue`/`maxValue`. An absent bound is reported as\n    // `null` or as an infinity depending on the schema, and neither belongs in the\n    // document; a finite check keeps a `0` bound and drops both.\n    const constraints: Array<[string, unknown]> = [\n      [\"minLength\", (zodType as any).minLength],\n      [\"maxLength\", (zodType as any).maxLength],\n      [\"minimum\", (zodType as any).minValue],\n      [\"maximum\", (zodType as any).maxValue],\n    ];\n    for (const [key, value] of constraints) {\n      // Zod 4's .int() implies bounds of +/-Number.MAX_SAFE_INTEGER; those are\n      // implementation details of the safe-integer range, not author-declared\n      // constraints, and would otherwise stamp every integer field with\n      // maximum: 9007199254740991.\n      if (Number.isFinite(value) && Math.abs(value as number) !== Number.MAX_SAFE_INTEGER) {\n        baseSchema[key] = value;\n      }\n    }\n\n    return baseSchema;\n  }\n\n  /**\n   * Generate standard error responses\n   */\n  private getStandardResponses(): Record<string, any> {\n    return {\n      \"200\": {\n        description: \"Successful response\",\n        content: {\n          \"application/json\": {\n            schema: {\n              type: \"object\",\n              description: \"Response data\",\n            },\n          },\n        },\n      },\n      \"400\": {\n        description: \"Bad Request. Usually due to missing parameters, or invalid parameters.\",\n        content: {\n          \"application/json\": {\n            schema: {\n              type: \"object\",\n              properties: {\n                message: { type: \"string\" },\n                error: { type: \"string\" },\n              },\n              required: [\"message\"],\n            },\n          },\n        },\n      },\n      \"401\": {\n        description: \"Unauthorized. Due to missing or invalid authentication.\",\n        content: {\n          \"application/json\": {\n            schema: {\n              type: \"object\",\n              properties: {\n                message: { type: \"string\" },\n              },\n              required: [\"message\"],\n            },\n          },\n        },\n      },\n      \"403\": {\n        description:\n          \"Forbidden. You do not have permission to access this resource or to perform this action.\",\n        content: {\n          \"application/json\": {\n            schema: {\n              type: \"object\",\n              properties: {\n                message: { type: \"string\" },\n              },\n            },\n          },\n        },\n      },\n      \"404\": {\n        description: \"Not Found. The requested resource was not found.\",\n        content: {\n          \"application/json\": {\n            schema: {\n              type: \"object\",\n              properties: {\n                message: { type: \"string\" },\n              },\n            },\n          },\n        },\n      },\n      \"429\": {\n        description: \"Too Many Requests. You have exceeded the rate limit. Try again later.\",\n        content: {\n          \"application/json\": {\n            schema: {\n              type: \"object\",\n              properties: {\n                message: { type: \"string\" },\n              },\n            },\n          },\n        },\n      },\n      \"500\": {\n        description:\n          \"Internal Server Error. This is a problem with the server that you cannot fix.\",\n        content: {\n          \"application/json\": {\n            schema: {\n              type: \"object\",\n              properties: {\n                message: { type: \"string\" },\n                error: { type: \"string\" },\n              },\n            },\n          },\n        },\n      },\n    };\n  }\n\n  /**\n   * Generate OpenAPI spec from API routes\n   */\n  async generateSpec(routes: APIRouteInfo[]): Promise<OpenAPISpec> {\n    const spec: OpenAPISpec = {\n      openapi: \"3.0.3\",\n      info: {\n        title: this.config.title || \"API Documentation\",\n        description: this.config.description || \"Auto-generated API documentation\",\n        version: this.config.version || \"1.0.0\",\n        ...(this.config.contact && { contact: this.config.contact }),\n        ...(this.config.license && { license: this.config.license }),\n      },\n      servers: this.config.servers || [\n        { url: \"http://localhost:3000\", description: \"Development server\" },\n      ],\n      paths: {},\n      components: {\n        schemas: {},\n        securitySchemes: {\n          bearerAuth: {\n            type: \"http\",\n            scheme: \"bearer\",\n            description: \"Bearer token authentication\",\n          },\n          apiKeyCookie: {\n            type: \"apiKey\",\n            in: \"cookie\",\n            name: \"session\",\n            description: \"API Key authentication via cookie\",\n          },\n        },\n      },\n    };\n\n    // Group routes by path\n    const routeGroups = new Map<string, APIRouteInfo[]>();\n    for (const route of routes) {\n      const key = route.path;\n      if (!routeGroups.has(key)) {\n        routeGroups.set(key, []);\n      }\n      routeGroups.get(key)!.push(route);\n    }\n\n    // Generate paths\n    for (const [path, routeList] of routeGroups) {\n      const openAPIPath = this.convertToOpenAPIPath(path);\n      spec.paths[openAPIPath] = {};\n\n      for (const route of routeList) {\n        for (const method of route.methods) {\n          const operation = await this.generateOperation(route, method);\n          if (method === \"QUERY\") {\n            const additionalOperations =\n              spec.paths[openAPIPath][\"x-oai-additionalOperations\"] ?? {};\n            additionalOperations.QUERY = operation;\n            spec.paths[openAPIPath][\"x-oai-additionalOperations\"] = additionalOperations;\n          } else {\n            spec.paths[openAPIPath][method.toLowerCase()] = operation;\n          }\n        }\n      }\n    }\n\n    return spec;\n  }\n\n  /**\n   * Convert a Farm.js API path to OpenAPI path format.\n   *\n   * Strips the `/api` prefix and rewrites dynamic segments to OpenAPI's\n   * `{name}` templating: `[id]` -> `{id}`, `[...slug]` -> `{slug}`, and\n   * `[[...slug]]` -> `{slug}`. Leaving the bracket form produces a path key that\n   * is invalid OpenAPI, which breaks \"try it\" and any generated client.\n   */\n  private convertToOpenAPIPath(path: string): string {\n    return path\n      .replace(/^\\/api/, \"\")\n      .replace(/\\[\\[\\.\\.\\.([^\\]]+)\\]\\]/g, \"{$1}\")\n      .replace(/\\[\\.\\.\\.([^\\]]+)\\]/g, \"{$1}\")\n      .replace(/\\[([^\\]]+)\\]/g, \"{$1}\");\n  }\n\n  /**\n   * Path parameters implied by a Farm.js API path's dynamic segments. Every\n   * path parameter is `required: true` per the OpenAPI spec (a path parameter\n   * cannot be optional), including catch-all segments.\n   */\n  private getPathParameters(path: string): any[] {\n    const openAPIPath = this.convertToOpenAPIPath(path);\n    return [...openAPIPath.matchAll(/\\{([^}]+)\\}/g)].map((match) => ({\n      name: match[1],\n      in: \"path\",\n      required: true,\n      schema: { type: \"string\" },\n    }));\n  }\n\n  /**\n   * Extract request body schema from endpoint\n   */\n  private async getRequestBody(route: APIRouteInfo, method: string): Promise<any> {\n    if (![\"QUERY\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {\n      return undefined;\n    }\n\n    try {\n      // Try to dynamically load the route module\n      const modulePath = route.filePath;\n      const routeModule = await import(/* @vite-ignore */ modulePath);\n\n      // Get the method handler (GET, POST, etc.)\n      const handler = routeModule[method];\n\n      // Check for Farm.js endpoint format: handler.__types.body\n      if (handler && handler.__types && handler.__types.body) {\n        const bodySchema = handler.__types.body;\n\n        if (bodySchema instanceof z.ZodObject || bodySchema instanceof z.ZodOptional) {\n          const shape = (bodySchema as any).shape || (bodySchema as any)._def?.innerType?.shape;\n          if (shape) {\n            const properties: Record<string, any> = {};\n            const required: string[] = [];\n\n            Object.entries(shape).forEach(([key, value]) => {\n              if (value instanceof z.ZodType) {\n                properties[key] = this.processZodType(value as z.ZodType<any>);\n                if (this.isRequiredField(value as z.ZodType<any>)) {\n                  required.push(key);\n                }\n              }\n            });\n            return {\n              required: bodySchema instanceof z.ZodOptional ? false : true,\n              content: {\n                \"application/json\": {\n                  schema: {\n                    type: \"object\",\n                    properties,\n                    ...(required.length > 0 ? { required } : {}),\n                  },\n                },\n              },\n            };\n          }\n        }\n      }\n\n      // Fallback: Check for better-call format: handler._type.body\n      if (handler && handler._type && handler._type.body) {\n        const bodySchema = handler._type.body;\n\n        if (bodySchema instanceof z.ZodObject || bodySchema instanceof z.ZodOptional) {\n          const shape = (bodySchema as any).shape || (bodySchema as any)._def?.innerType?.shape;\n          if (shape) {\n            const properties: Record<string, any> = {};\n            const required: string[] = [];\n\n            Object.entries(shape).forEach(([key, value]) => {\n              if (value instanceof z.ZodType) {\n                properties[key] = this.processZodType(value as z.ZodType<any>);\n                if (this.isRequiredField(value as z.ZodType<any>)) {\n                  required.push(key);\n                }\n              }\n            });\n\n            return {\n              required: bodySchema instanceof z.ZodOptional ? false : true,\n              content: {\n                \"application/json\": {\n                  schema: {\n                    type: \"object\",\n                    properties,\n                    ...(required.length > 0 ? { required } : {}),\n                  },\n                },\n              },\n            };\n          }\n        }\n      }\n    } catch (error) {\n      // If we can't load the module, return generic schema\n      console.warn(`Could not extract schema from ${route.filePath}:`, error);\n    }\n\n    // Fallback to generic schema\n    return {\n      required: true,\n      content: {\n        \"application/json\": {\n          schema: {\n            type: \"object\",\n            description: \"Request body\",\n          },\n        },\n      },\n    };\n  }\n\n  /**\n   * Extract query parameters from endpoint\n   */\n  private async getParameters(route: APIRouteInfo, method: string): Promise<any[]> {\n    const parameters: any[] = [];\n\n    try {\n      // Try to dynamically load the route module\n      const modulePath = route.filePath;\n      const routeModule = await import(/* @vite-ignore */ modulePath);\n\n      // Get the method handler\n      const handler = routeModule[method];\n\n      // Check for Farm.js endpoint format: handler.__types.query\n      if (handler && handler.__types && handler.__types.query) {\n        const querySchema = handler.__types.query;\n\n        if (querySchema instanceof z.ZodObject) {\n          Object.entries((querySchema as any).shape).forEach(([key, value]) => {\n            if (value instanceof z.ZodType) {\n              parameters.push({\n                name: key,\n                in: \"query\",\n                required: this.isRequiredField(value as z.ZodType<any>),\n                schema: this.processZodType(value as z.ZodType<any>),\n              });\n            }\n          });\n        }\n      }\n\n      // Fallback: Check for better-call format: handler._type.query\n      if (handler && handler._type && handler._type.query) {\n        const querySchema = handler._type.query;\n\n        if (querySchema instanceof z.ZodObject) {\n          Object.entries((querySchema as any).shape).forEach(([key, value]) => {\n            if (value instanceof z.ZodType) {\n              parameters.push({\n                name: key,\n                in: \"query\",\n                required: this.isRequiredField(value as z.ZodType<any>),\n                schema: this.processZodType(value as z.ZodType<any>),\n              });\n            }\n          });\n        }\n      }\n    } catch (error) {\n      console.warn(`Could not extract query params from ${route.filePath}:`, error);\n    }\n\n    return parameters;\n  }\n\n  /**\n   * Generate OpenAPI operation from route info\n   */\n  private async generateOperation(route: APIRouteInfo, method: string): Promise<any> {\n    const operation: any = {\n      summary: this.generateSummary(route.path, method),\n      description: this.generateDescription(route.path, method),\n      operationId: this.generateOperationId(route.path, method),\n      tags: this.generateTags(route.path),\n      security: [{ bearerAuth: [] }, { apiKeyCookie: [] }],\n      responses: this.getStandardResponses(),\n    };\n\n    // Path parameters (from dynamic route segments) precede query parameters.\n    const parameters = [\n      ...this.getPathParameters(route.path),\n      ...(await this.getParameters(route, method)),\n    ];\n    if (parameters.length > 0) {\n      operation.parameters = parameters;\n    }\n\n    // QUERY and mutation methods can carry typed request content.\n    if ([\"QUERY\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"].includes(method)) {\n      operation.requestBody = await this.getRequestBody(route, method);\n    }\n\n    return operation;\n  }\n\n  /**\n   * Generate operation summary\n   */\n  private generateSummary(path: string, method: string): string {\n    const cleanPath = path.replace(/^\\/api\\//, \"\");\n    const pathParts = cleanPath.split(\"/\");\n    const lastPart = pathParts[pathParts.length - 1];\n\n    const action =\n      method === \"GET\"\n        ? \"Get\"\n        : method === \"QUERY\"\n          ? \"Query\"\n          : method === \"POST\"\n            ? \"Create\"\n            : method === \"PUT\"\n              ? \"Update\"\n              : method === \"DELETE\"\n                ? \"Delete\"\n                : method === \"PATCH\"\n                  ? \"Update\"\n                  : method;\n\n    return `${action} ${lastPart}`;\n  }\n\n  /**\n   * Generate operation description\n   */\n  private generateDescription(path: string, method: string): string {\n    const cleanPath = path.replace(/^\\/api\\//, \"\");\n    return `${method} ${cleanPath} endpoint`;\n  }\n\n  /**\n   * Generate operation ID\n   */\n  private generateOperationId(path: string, method: string): string {\n    const cleanPath = path.replace(/^\\/api\\//, \"\").replace(/\\//g, \"_\");\n    return `${method.toLowerCase()}_${cleanPath}`;\n  }\n\n  /**\n   * Generate tags for grouping operations\n   */\n  private generateTags(path: string): string[] {\n    const cleanPath = path.replace(/^\\/api\\//, \"\");\n    const pathParts = cleanPath.split(\"/\");\n\n    if (pathParts.length > 1) {\n      return [pathParts[0]]; // Use first part as tag\n    }\n\n    return [\"default\"];\n  }\n\n  /**\n   * Generate OpenAPI spec file\n   */\n  async generateSpecFile(routes: APIRouteInfo[], outputPath: string): Promise<void> {\n    const spec = await this.generateSpec(routes);\n    const fs = require(\"fs\");\n    const path = require(\"path\");\n\n    // Ensure directory exists\n    const dir = path.dirname(outputPath);\n    if (!fs.existsSync(dir)) {\n      fs.mkdirSync(dir, { recursive: true });\n    }\n\n    // Write spec file\n    fs.writeFileSync(outputPath, JSON.stringify(spec, null, 2));\n  }\n}\n","import { OpenAPIGenerator, type OpenAPISpec } from \"./generator\";\nimport { APITypeGenerator } from \"../type-generator\";\nimport type { OpenAPIConfig } from \"../config\";\n\nfunction escapeHTML(value: string): string {\n  return value\n    .replace(/&/g, \"&amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\")\n    .replace(/\"/g, \"&quot;\")\n    .replace(/'/g, \"&#39;\");\n}\n\nexport function renderOpenAPIReferenceHTML(spec: OpenAPISpec, config: OpenAPIConfig): string {\n  return `\n<!DOCTYPE html>\n<html>\n  <head>\n    <title>${escapeHTML(config.title || \"API Documentation\")}</title>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <link rel=\"icon\" href=\"data:,\" />\n  </head>\n  <body>\n    <script\n      id=\"api-reference\"\n      data-url=\"data:application/json;base64,${Buffer.from(JSON.stringify(spec)).toString(\"base64\")}\"\n    ></script>\n    <script src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference\"></script>\n  </body>\n</html>\n    `;\n}\n\nexport class OpenAPIManager {\n  private generator: OpenAPIGenerator;\n  private apiTypeGenerator: APITypeGenerator;\n  private config: OpenAPIConfig;\n  private appDir: string;\n  private specCache: any = null;\n\n  constructor(appDir: string | readonly string[], config: OpenAPIConfig) {\n    const appDirs = Array.isArray(appDir) ? [...appDir] : [appDir as string];\n    this.appDir = appDirs[appDirs.length - 1];\n    this.config = config;\n    this.generator = new OpenAPIGenerator(this.appDir, config);\n    this.apiTypeGenerator = new APITypeGenerator(appDirs);\n  }\n\n  /**\n   * Generate OpenAPI spec from API routes\n   */\n  async generateSpec(): Promise<any> {\n    try {\n      // Get API routes using the existing type generator\n      const routes = this.apiTypeGenerator.scanAPIRoutes();\n\n      // Generate OpenAPI spec (now async)\n      const spec = await this.generator.generateSpec(routes);\n\n      // Cache the spec\n      this.specCache = spec;\n\n      return spec;\n    } catch (error) {\n      console.error(\"Failed to generate OpenAPI spec:\", error);\n      return null;\n    }\n  }\n\n  /**\n   * Get cached spec or generate new one\n   */\n  async getSpec(): Promise<any> {\n    if (this.specCache) {\n      return this.specCache;\n    }\n\n    return await this.generateSpec();\n  }\n\n  /**\n   * Generate and save OpenAPI spec file\n   */\n  async generateSpecFile(): Promise<void> {\n    try {\n      const routes = this.apiTypeGenerator.scanAPIRoutes();\n      const outputPath = `${this.appDir}/lib/openapi.spec.json`;\n\n      await this.generator.generateSpecFile(routes, outputPath);\n      console.log(\"✅ OpenAPI spec generated at:\", outputPath);\n    } catch (error) {\n      console.error(\"Failed to generate OpenAPI spec file:\", error);\n    }\n  }\n\n  /**\n   * Invalidate cache and regenerate spec\n   */\n  async invalidateCache(): Promise<void> {\n    this.specCache = null;\n    await this.generateSpec();\n  }\n\n  /**\n   * Get the docs route handler\n   */\n  getDocsRouteHandler() {\n    return async (req: any, res: any) => {\n      try {\n        const method = String(req.method || \"GET\").toUpperCase();\n        if (method !== \"GET\" && method !== \"HEAD\") {\n          res.statusCode = 405;\n          res.setHeader(\"Allow\", \"GET, HEAD\");\n          res.setHeader(\"Content-Type\", \"text/plain; charset=utf-8\");\n          res.end(\"Method Not Allowed\");\n          return;\n        }\n\n        const spec = await this.getSpec();\n\n        if (!spec) {\n          res.statusCode = 500;\n          res.setHeader(\"Content-Type\", \"text/html\");\n          res.end(`\n            <html>\n              <body>\n                <h1>Error</h1>\n                <p>Failed to generate OpenAPI specification</p>\n              </body>\n            </html>\n          `);\n          return;\n        }\n\n        // Set headers for HTML response\n        res.statusCode = 200;\n        res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\n        res.setHeader(\"Cache-Control\", \"public, max-age=0, must-revalidate\");\n        res.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n\n        // Generate HTML with Scalar\n        res.end(method === \"HEAD\" ? undefined : renderOpenAPIReferenceHTML(spec, this.config));\n      } catch (error) {\n        console.error(\"Error serving docs route:\", error);\n        res.statusCode = 500;\n        res.setHeader(\"Content-Type\", \"text/html\");\n        res.end(`\n          <html>\n            <body>\n              <h1>Error</h1>\n              <p>Failed to load API documentation</p>\n            </body>\n          </html>\n        `);\n      }\n    };\n  }\n}\n"],"mappings":"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","names":[]}