{"version":3,"file":"index.cjs","names":["#options","#transformParam","#eachParam","OASNormalize","yaml","path","BaseOas","#options","#applyDiscriminatorInheritance","#setDiscriminator","matchesMimeType","#getResponseBodyFactory"],"sources":["../src/constants.ts","../../../internals/utils/src/casing.ts","../../../internals/utils/src/reserved.ts","../../../internals/utils/src/urlPath.ts","../src/utils.ts","../src/Oas.ts","../src/resolveServerUrl.ts"],"sourcesContent":["import type { MediaType, SchemaType } from '@kubb/ast/types'\nimport type { HttpMethods as OASHttpMethods } from 'oas/types'\n\n/**\n * JSON Schema keywords that indicate structural composition.\n * Used when deciding whether an inline `allOf` fragment can be safely flattened\n * into its parent (fragments containing any of these keys must not be inlined).\n */\nexport const STRUCTURAL_KEYS = new Set<string>(['properties', 'items', 'additionalProperties', 'oneOf', 'anyOf', 'allOf', 'not'])\n\n/**\n * Maps OAS/JSON Schema `format` strings to their Kubb `SchemaType` equivalents.\n *\n * Only formats that require a type different from the raw OAS `type` are listed here.\n * `int64`, `date-time`, `date`, and `time` are handled separately because their\n * output depends on runtime parser options and cannot live in a static map.\n *\n * Note: `ipv4`, `ipv6`, and `hostname` map to `'url'` — not semantically accurate,\n * but `'url'` is the closest supported scalar type in the Kubb AST.\n */\nexport const FORMAT_MAP = {\n  uuid: 'uuid',\n  email: 'email',\n  'idn-email': 'email',\n  uri: 'url',\n  'uri-reference': 'url',\n  url: 'url',\n  ipv4: 'url',\n  ipv6: 'url',\n  hostname: 'url',\n  'idn-hostname': 'url',\n  binary: 'blob',\n  byte: 'blob',\n  // Numeric formats — format is more specific than type, so these override type.\n  // see https://json-schema.org/draft/2020-12/draft-bhutton-json-schema-validation-00#rfc.section.7\n  int32: 'integer',\n  float: 'number',\n  double: 'number',\n} as const satisfies Record<string, SchemaType>\n\n/**\n * Exhaustive list of media types that Kubb recognizes.\n * Kept as a module-level constant to avoid re-allocating the array on every call.\n */\nexport const KNOWN_MEDIA_TYPES = [\n  'application/json',\n  'application/xml',\n  'application/x-www-form-urlencoded',\n  'application/octet-stream',\n  'application/pdf',\n  'application/zip',\n  'application/graphql',\n  'multipart/form-data',\n  'text/plain',\n  'text/html',\n  'text/csv',\n  'text/xml',\n  'image/png',\n  'image/jpeg',\n  'image/gif',\n  'image/webp',\n  'image/svg+xml',\n  'audio/mpeg',\n  'video/mp4',\n] as const satisfies ReadonlyArray<MediaType>\n\n/**\n * Vendor extension keys used by various spec generators to attach human-readable\n * labels to enum values. Checked in priority order: the first key found wins.\n */\nexport const ENUM_EXTENSION_KEYS = ['x-enumNames', 'x-enum-varnames'] as const\n\n/**\n * Canonical HTTP method names used throughout the Kubb OAS layer.\n * Keys are uppercase (as used in generated code); values are the lowercase\n * strings that the `oas` library uses internally.\n * @deprecated use httpMethods from @kubb/ast\n */\nexport const httpMethods = {\n  GET: 'get',\n  POST: 'post',\n  PUT: 'put',\n  PATCH: 'patch',\n  DELETE: 'delete',\n  HEAD: 'head',\n  OPTIONS: 'options',\n  TRACE: 'trace',\n} as const satisfies Record<Uppercase<OASHttpMethods>, OASHttpMethods>\n","type Options = {\n  /** When `true`, dot-separated segments are split on `.` and joined with `/` after casing. */\n  isFile?: boolean\n  /** Text prepended before casing is applied. */\n  prefix?: string\n  /** Text appended before casing is applied. */\n  suffix?: string\n}\n\n/**\n * Shared implementation for camelCase and PascalCase conversion.\n * Splits on common word boundaries (spaces, hyphens, underscores, dots, slashes, colons)\n * and capitalizes each word according to `pascal`.\n *\n * When `pascal` is `true` the first word is also capitalized (PascalCase), otherwise only subsequent words are.\n */\nfunction toCamelOrPascal(text: string, pascal: boolean): string {\n  const normalized = text\n    .trim()\n    .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n    .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n    .replace(/(\\d)([a-z])/g, '$1 $2')\n\n  const words = normalized.split(/[\\s\\-_./\\\\:]+/).filter(Boolean)\n\n  return words\n    .map((word, i) => {\n      const allUpper = word.length > 1 && word === word.toUpperCase()\n      if (allUpper) return word\n      if (i === 0 && !pascal) return word.charAt(0).toLowerCase() + word.slice(1)\n      return word.charAt(0).toUpperCase() + word.slice(1)\n    })\n    .join('')\n    .replace(/[^a-zA-Z0-9]/g, '')\n}\n\n/**\n * Splits `text` on `.` and applies `transformPart` to each segment.\n * The last segment receives `isLast = true`, all earlier segments receive `false`.\n * Segments are joined with `/` to form a file path.\n */\nfunction applyToFileParts(text: string, transformPart: (part: string, isLast: boolean) => string): string {\n  const parts = text.split('.')\n  return parts.map((part, i) => transformPart(part, i === parts.length - 1)).join('/')\n}\n\n/**\n * Converts `text` to camelCase.\n * When `isFile` is `true`, dot-separated segments are each cased independently and joined with `/`.\n *\n * @example\n * camelCase('hello-world')                   // 'helloWorld'\n * camelCase('pet.petId', { isFile: true })   // 'pet/petId'\n */\nexport function camelCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n  if (isFile) {\n    return applyToFileParts(text, (part, isLast) => camelCase(part, isLast ? { prefix, suffix } : {}))\n  }\n\n  return toCamelOrPascal(`${prefix} ${text} ${suffix}`, false)\n}\n\n/**\n * Converts `text` to PascalCase.\n * When `isFile` is `true`, the last dot-separated segment is PascalCased and earlier segments are camelCased.\n *\n * @example\n * pascalCase('hello-world')                  // 'HelloWorld'\n * pascalCase('pet.petId', { isFile: true })  // 'pet/PetId'\n */\nexport function pascalCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n  if (isFile) {\n    return applyToFileParts(text, (part, isLast) => (isLast ? pascalCase(part, { prefix, suffix }) : camelCase(part)))\n  }\n\n  return toCamelOrPascal(`${prefix} ${text} ${suffix}`, true)\n}\n\n/**\n * Converts `text` to snake_case.\n *\n * @example\n * snakeCase('helloWorld')  // 'hello_world'\n * snakeCase('Hello-World') // 'hello_world'\n */\nexport function snakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n  const processed = `${prefix} ${text} ${suffix}`.trim()\n  return processed\n    .replace(/([a-z])([A-Z])/g, '$1_$2')\n    .replace(/[\\s\\-.]+/g, '_')\n    .replace(/[^a-zA-Z0-9_]/g, '')\n    .toLowerCase()\n    .split('_')\n    .filter(Boolean)\n    .join('_')\n}\n\n/**\n * Converts `text` to SCREAMING_SNAKE_CASE.\n *\n * @example\n * screamingSnakeCase('helloWorld') // 'HELLO_WORLD'\n */\nexport function screamingSnakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n  return snakeCase(text, { prefix, suffix }).toUpperCase()\n}\n","/**\n * JavaScript and Java reserved words.\n * @link https://github.com/jonschlinkert/reserved/blob/master/index.js\n */\nconst reservedWords = [\n  'abstract',\n  'arguments',\n  'boolean',\n  'break',\n  'byte',\n  'case',\n  'catch',\n  'char',\n  'class',\n  'const',\n  'continue',\n  'debugger',\n  'default',\n  'delete',\n  'do',\n  'double',\n  'else',\n  'enum',\n  'eval',\n  'export',\n  'extends',\n  'false',\n  'final',\n  'finally',\n  'float',\n  'for',\n  'function',\n  'goto',\n  'if',\n  'implements',\n  'import',\n  'in',\n  'instanceof',\n  'int',\n  'interface',\n  'let',\n  'long',\n  'native',\n  'new',\n  'null',\n  'package',\n  'private',\n  'protected',\n  'public',\n  'return',\n  'short',\n  'static',\n  'super',\n  'switch',\n  'synchronized',\n  'this',\n  'throw',\n  'throws',\n  'transient',\n  'true',\n  'try',\n  'typeof',\n  'var',\n  'void',\n  'volatile',\n  'while',\n  'with',\n  'yield',\n  'Array',\n  'Date',\n  'hasOwnProperty',\n  'Infinity',\n  'isFinite',\n  'isNaN',\n  'isPrototypeOf',\n  'length',\n  'Math',\n  'name',\n  'NaN',\n  'Number',\n  'Object',\n  'prototype',\n  'String',\n  'toString',\n  'undefined',\n  'valueOf',\n]\n\n/**\n * Prefixes a word with `_` when it is a reserved JavaScript/Java identifier\n * or starts with a digit.\n */\nexport function transformReservedWord(word: string): string {\n  const firstChar = word.charCodeAt(0)\n  if (word && (reservedWords.includes(word) || (firstChar >= 48 && firstChar <= 57))) {\n    return `_${word}`\n  }\n  return word\n}\n\n/**\n * Returns `true` when `name` is a syntactically valid JavaScript variable name.\n */\nexport function isValidVarName(name: string): boolean {\n  try {\n    new Function(`var ${name}`)\n  } catch {\n    return false\n  }\n  return true\n}\n","import { camelCase } from './casing.ts'\nimport { isValidVarName } from './reserved.ts'\n\nexport type URLObject = {\n  /** The resolved URL string (Express-style or template literal, depending on context). */\n  url: string\n  /** Extracted path parameters as a key-value map, or `undefined` when the path has none. */\n  params?: Record<string, string>\n}\n\ntype ObjectOptions = {\n  /** Controls whether the `url` is rendered as an Express path or a template literal. Defaults to `'path'`. */\n  type?: 'path' | 'template'\n  /** Optional transform applied to each extracted parameter name. */\n  replacer?: (pathParam: string) => string\n  /** When `true`, the result is serialized to a string expression instead of a plain object. */\n  stringify?: boolean\n}\n\n/** Supported identifier casing strategies for path parameters. */\ntype PathCasing = 'camelcase'\n\ntype Options = {\n  /** Casing strategy applied to path parameter names. Defaults to the original identifier. */\n  casing?: PathCasing\n}\n\n/**\n * Parses and transforms an OpenAPI/Swagger path string into various URL formats.\n *\n * @example\n * const p = new URLPath('/pet/{petId}')\n * p.URL      // '/pet/:petId'\n * p.template // '`/pet/${petId}`'\n */\nexport class URLPath {\n  /** The raw OpenAPI/Swagger path string, e.g. `/pet/{petId}`. */\n  path: string\n\n  #options: Options\n\n  constructor(path: string, options: Options = {}) {\n    this.path = path\n    this.#options = options\n  }\n\n  /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`. */\n  get URL(): string {\n    return this.toURLPath()\n  }\n\n  /** Returns `true` when `path` is a fully-qualified URL (e.g. starts with `https://`). */\n  get isURL(): boolean {\n    try {\n      return !!new URL(this.path).href\n    } catch {\n      return false\n    }\n  }\n\n  /**\n   * Converts the OpenAPI path to a TypeScript template literal string.\n   *\n   * @example\n   * new URLPath('/pet/{petId}').template              // '`/pet/${petId}`'\n   * new URLPath('/account/monetary-accountID').template // '`/account/${monetaryAccountId}`'\n   */\n  get template(): string {\n    return this.toTemplateString()\n  }\n\n  /** Returns the path and its extracted params as a structured `URLObject`, or as a stringified expression when `stringify` is set. */\n  get object(): URLObject | string {\n    return this.toObject()\n  }\n\n  /** Returns a map of path parameter names, or `undefined` when the path has no parameters. */\n  get params(): Record<string, string> | undefined {\n    return this.getParams()\n  }\n\n  #transformParam(raw: string): string {\n    const param = isValidVarName(raw) ? raw : camelCase(raw)\n    return this.#options.casing === 'camelcase' ? camelCase(param) : param\n  }\n\n  /** Iterates over every `{param}` token in `path`, calling `fn` with the raw token and transformed name. */\n  #eachParam(fn: (raw: string, param: string) => void): void {\n    for (const match of this.path.matchAll(/\\{([^}]+)\\}/g)) {\n      const raw = match[1]!\n      fn(raw, this.#transformParam(raw))\n    }\n  }\n\n  toObject({ type = 'path', replacer, stringify }: ObjectOptions = {}): URLObject | string {\n    const object = {\n      url: type === 'path' ? this.toURLPath() : this.toTemplateString({ replacer }),\n      params: this.getParams(),\n    }\n\n    if (stringify) {\n      if (type === 'template') {\n        return JSON.stringify(object).replaceAll(\"'\", '').replaceAll(`\"`, '')\n      }\n\n      if (object.params) {\n        return `{ url: '${object.url}', params: ${JSON.stringify(object.params).replaceAll(\"'\", '').replaceAll(`\"`, '')} }`\n      }\n\n      return `{ url: '${object.url}' }`\n    }\n\n    return object\n  }\n\n  /**\n   * Converts the OpenAPI path to a TypeScript template literal string.\n   * An optional `replacer` can transform each extracted parameter name before interpolation.\n   *\n   * @example\n   * new URLPath('/pet/{petId}').toTemplateString() // '`/pet/${petId}`'\n   */\n  toTemplateString({ prefix = '', replacer }: { prefix?: string; replacer?: (pathParam: string) => string } = {}): string {\n    const parts = this.path.split(/\\{([^}]+)\\}/)\n    const result = parts\n      .map((part, i) => {\n        if (i % 2 === 0) return part\n        const param = this.#transformParam(part)\n        return `\\${${replacer ? replacer(param) : param}}`\n      })\n      .join('')\n\n    return `\\`${prefix}${result}\\``\n  }\n\n  /**\n   * Extracts all `{param}` segments from the path and returns them as a key-value map.\n   * An optional `replacer` transforms each parameter name in both key and value positions.\n   * Returns `undefined` when no path parameters are found.\n   */\n  getParams(replacer?: (pathParam: string) => string): Record<string, string> | undefined {\n    const params: Record<string, string> = {}\n\n    this.#eachParam((_raw, param) => {\n      const key = replacer ? replacer(param) : param\n      params[key] = key\n    })\n\n    return Object.keys(params).length > 0 ? params : undefined\n  }\n\n  /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`. */\n  toURLPath(): string {\n    return this.path.replace(/\\{([^}]+)\\}/g, ':$1')\n  }\n}\n","import path from 'node:path'\nimport { pascalCase, URLPath } from '@internals/utils'\nimport type { Config } from '@kubb/core'\nimport { bundle, loadConfig } from '@redocly/openapi-core'\nimport yaml from '@stoplight/yaml'\nimport type { ParameterObject } from 'oas/types'\nimport { isRef, isSchema } from 'oas/types'\nimport OASNormalize from 'oas-normalize'\nimport type { OpenAPIV2, OpenAPIV3, OpenAPIV3_1 } from 'openapi-types'\nimport { isPlainObject, mergeDeep } from 'remeda'\nimport swagger2openapi from 'swagger2openapi'\nimport { STRUCTURAL_KEYS } from './constants.ts'\nimport { Oas } from './Oas.ts'\nimport type { contentType, Document, SchemaObject } from './types.ts'\n\n/**\n * Returns `true` when `doc` looks like a Swagger 2.0 document (no `openapi` key).\n */\nexport function isOpenApiV2Document(doc: unknown): doc is OpenAPIV2.Document {\n  return !!doc && isPlainObject(doc) && !('openapi' in doc)\n}\n\n/**\n * Returns `true` when `doc` looks like an OpenAPI 3.x document (has `openapi` key).\n */\nexport function isOpenApiV3Document(doc: unknown): doc is OpenAPIV3.Document {\n  return !!doc && isPlainObject(doc) && 'openapi' in doc\n}\n\n/**\n * Returns `true` when `doc` is an OpenAPI 3.1 document.\n */\nexport function isOpenApiV3_1Document(doc: unknown): doc is OpenAPIV3_1.Document {\n  return !!doc && isPlainObject(doc) && 'openapi' in (doc as object) && (doc as { openapi: string }).openapi.startsWith('3.1')\n}\n\n/**\n * Returns `true` when `obj` is a JSON Schema object recognized by the `oas` library.\n */\nexport function isJSONSchema(obj?: unknown): obj is SchemaObject {\n  return !!obj && isSchema(obj)\n}\n\n/**\n * Returns `true` when `obj` is a parameter object (has an `in` field distinguishing it from a schema).\n */\nexport function isParameterObject(obj: ParameterObject | SchemaObject): obj is ParameterObject {\n  return !!obj && 'in' in obj\n}\n\n/**\n * Determines if a schema is nullable, considering:\n * - OpenAPI 3.0 `nullable` / `x-nullable`\n * - OpenAPI 3.1 JSON Schema `type: ['null', ...]` or `type: 'null'`\n */\nexport function isNullable(schema?: SchemaObject & { 'x-nullable'?: boolean }): boolean {\n  const explicitNullable = schema?.nullable ?? schema?.['x-nullable']\n  if (explicitNullable === true) {\n    return true\n  }\n\n  const schemaType = schema?.type\n  if (schemaType === 'null') {\n    return true\n  }\n  if (Array.isArray(schemaType)) {\n    return schemaType.includes('null')\n  }\n\n  return false\n}\n\n/**\n * Returns `true` when `obj` is an OpenAPI `$ref` pointer object.\n */\nexport function isReference(obj?: unknown): obj is OpenAPIV3.ReferenceObject | OpenAPIV3_1.ReferenceObject {\n  return !!obj && isRef(obj as object)\n}\n\n/**\n * Returns `true` when `obj` is a schema that carries a structured `discriminator` object\n * (as opposed to a plain string discriminator used in some older specs).\n */\nexport function isDiscriminator(obj?: unknown): obj is SchemaObject & { discriminator: OpenAPIV3.DiscriminatorObject } {\n  const record = obj as Record<string, unknown>\n  return !!obj && !!record['discriminator'] && typeof record['discriminator'] !== 'string'\n}\n\n/**\n * Determines whether a schema is required.\n *\n * Returns true if the schema has a non-empty {@link SchemaObject.required} array or a truthy {@link SchemaObject.required} property.\n */\nexport function isRequired(schema?: SchemaObject): boolean {\n  if (!schema) {\n    return false\n  }\n\n  return Array.isArray(schema.required) ? !!schema.required?.length : !!schema.required\n}\n\n// Helper to determine if a schema (and its composed children) has no required fields\n// This prefers structural optionality over top-level optional flag\ntype JSONSchemaLike =\n  | {\n      required?: readonly string[]\n      allOf?: readonly unknown[]\n      anyOf?: readonly unknown[]\n      oneOf?: readonly unknown[]\n    }\n  | undefined\n\n//TODO make isAllOptional more like isOptional with better typings\nexport function isAllOptional(schema: unknown): boolean {\n  // If completely absent, consider it optional in context of defaults\n  if (!schema) return true\n  // If the entire schema itself is optional, it's safe to default\n  if (isOptional(schema)) return true\n\n  const s = schema as JSONSchemaLike\n  const hasRequired = Array.isArray(s?.required) && s?.required.length > 0\n  if (hasRequired) return false\n\n  const groups = [s?.allOf, s?.anyOf, s?.oneOf].filter((g): g is readonly unknown[] => Array.isArray(g))\n  if (groups.length === 0) return true\n\n  // Be conservative: only when all composed parts are all-optional we treat it as all-optional\n  return groups.every((arr) => arr.every((child) => isAllOptional(child)))\n}\n\nexport function isOptional(schema?: SchemaObject): boolean {\n  return !isRequired(schema)\n}\n\n/**\n * Determines the appropriate default value for a schema parameter.\n * - For array types: returns '[]'\n * - For union types (anyOf/oneOf):\n *   - If at least one variant has all-optional fields: returns '{}'\n *   - Otherwise: returns undefined (no default)\n * - For object types with optional fields: returns '{}'\n * - For primitive types (string, number, boolean): returns undefined (no default)\n * - For required types: returns undefined (no default)\n */\nexport function getDefaultValue(schema?: SchemaObject): string | undefined {\n  if (!schema || !isOptional(schema)) {\n    return undefined\n  }\n\n  // For array types, use empty array as default\n  if (schema.type === 'array') {\n    return '[]'\n  }\n\n  // For union types (anyOf/oneOf), check if any variant could accept an empty object\n  if (schema.anyOf || schema.oneOf) {\n    const variants = schema.anyOf || schema.oneOf\n    if (!Array.isArray(variants)) {\n      return undefined\n    }\n    // Only provide default if at least one variant has all-optional fields\n    const hasEmptyObjectVariant = variants.some((variant) => isAllOptional(variant))\n    if (!hasEmptyObjectVariant) {\n      return undefined\n    }\n    // At least one variant accepts empty object\n    return '{}'\n  }\n\n  // For object types (or schemas with properties), use empty object as default\n  // This is safe because we already checked isOptional above\n  if (schema.type === 'object' || schema.properties) {\n    return '{}'\n  }\n\n  // For other types (primitives like string, number, boolean), no default\n  return undefined\n}\n\nexport async function parse(\n  pathOrApi: string | Document,\n  { oasClass = Oas, canBundle = true, enablePaths = true }: { oasClass?: typeof Oas; canBundle?: boolean; enablePaths?: boolean } = {},\n): Promise<Oas> {\n  if (typeof pathOrApi === 'string' && canBundle) {\n    // resolve external refs\n    const config = await loadConfig()\n    const bundleResults = await bundle({ ref: pathOrApi, config, base: pathOrApi })\n\n    return parse(bundleResults.bundle.parsed as string, { oasClass, canBundle, enablePaths })\n  }\n\n  const oasNormalize = new OASNormalize(pathOrApi, {\n    enablePaths,\n    colorizeErrors: true,\n  })\n  const document = (await oasNormalize.load()) as Document\n\n  if (isOpenApiV2Document(document)) {\n    const { openapi } = await swagger2openapi.convertObj(document, {\n      anchors: true,\n    })\n\n    return new oasClass(openapi as Document)\n  }\n\n  return new oasClass(document)\n}\n\nexport async function merge(pathOrApi: Array<string | Document>, { oasClass = Oas }: { oasClass?: typeof Oas } = {}): Promise<Oas> {\n  const instances = await Promise.all(pathOrApi.map((p) => parse(p, { oasClass, enablePaths: false, canBundle: false })))\n\n  if (instances.length === 0) {\n    throw new Error('No OAS instances provided for merging.')\n  }\n\n  const merged = instances.reduce(\n    (acc, current) => {\n      return mergeDeep(acc, current.document as Document)\n    },\n    {\n      openapi: '3.0.0',\n      info: {\n        title: 'Merged API',\n        version: '1.0.0',\n      },\n      paths: {},\n      components: {\n        schemas: {},\n      },\n    } as any,\n  )\n\n  return parse(merged, { oasClass })\n}\n\nexport function parseFromConfig(config: Config, oasClass: typeof Oas = Oas): Promise<Oas> {\n  if ('data' in config.input) {\n    if (typeof config.input.data === 'object') {\n      const api: Document = structuredClone(config.input.data) as Document\n      return parse(api, { oasClass })\n    }\n\n    // data is a string - try YAML first, then fall back to passing to parse()\n    try {\n      const api: string = yaml.parse(config.input.data as string)\n      return parse(api, { oasClass })\n    } catch (_e) {\n      // YAML parse failed, let parse() handle it (supports JSON strings and more)\n      return parse(config.input.data as string, { oasClass })\n    }\n  }\n\n  if (Array.isArray(config.input)) {\n    return merge(\n      config.input.map((input) => path.resolve(config.root, input.path)),\n      { oasClass },\n    )\n  }\n\n  if (new URLPath(config.input.path).isURL) {\n    return parse(config.input.path, { oasClass })\n  }\n\n  return parse(path.resolve(config.root, config.input.path), { oasClass })\n}\n\n/**\n * Flatten allOf schemas by merging keyword-only fragments.\n * Only flattens schemas where allOf items don't contain structural keys or $refs.\n */\nexport function flattenSchema(schema: SchemaObject | null): SchemaObject | null {\n  if (!schema?.allOf || schema.allOf.length === 0) {\n    return schema || null\n  }\n\n  // Never touch ref-based or structural composition\n  if (schema.allOf.some((item) => isRef(item))) {\n    return schema\n  }\n\n  const isPlainFragment = (item: SchemaObject) => !Object.keys(item).some((key) => STRUCTURAL_KEYS.has(key))\n\n  // Only flatten keyword-only fragments\n  if (!schema.allOf.every((item) => isPlainFragment(item as SchemaObject))) {\n    return schema\n  }\n\n  const merged: SchemaObject = { ...schema }\n  delete merged.allOf\n\n  for (const fragment of schema.allOf as SchemaObject[]) {\n    for (const [key, value] of Object.entries(fragment)) {\n      if (merged[key as keyof typeof merged] === undefined) {\n        merged[key as keyof typeof merged] = value\n      }\n    }\n  }\n\n  return merged\n}\n\n/**\n * Validate an OpenAPI document using oas-normalize.\n */\nexport async function validate(document: Document) {\n  const oasNormalize = new OASNormalize(document, {\n    enablePaths: true,\n    colorizeErrors: true,\n  })\n\n  return oasNormalize.validate({\n    parser: {\n      validate: {\n        errors: {\n          colorize: true,\n        },\n      },\n    },\n  })\n}\n\ntype SchemaSourceMode = 'schemas' | 'responses' | 'requestBodies'\n\nexport type SchemaWithMetadata = {\n  schema: SchemaObject\n  source: SchemaSourceMode\n  originalName: string\n}\n\ntype GetSchemasResult = {\n  schemas: Record<string, SchemaObject>\n  nameMapping: Map<string, string>\n}\n\n/**\n * Collect all schema $ref dependencies recursively.\n */\nexport function collectRefs(schema: unknown, refs = new Set<string>()): Set<string> {\n  if (Array.isArray(schema)) {\n    for (const item of schema) {\n      collectRefs(item, refs)\n    }\n    return refs\n  }\n\n  if (schema && typeof schema === 'object') {\n    for (const [key, value] of Object.entries(schema)) {\n      if (key === '$ref' && typeof value === 'string') {\n        const match = value.match(/^#\\/components\\/schemas\\/(.+)$/)\n        if (match) {\n          refs.add(match[1]!)\n        }\n      } else {\n        collectRefs(value, refs)\n      }\n    }\n  }\n\n  return refs\n}\n\n/**\n * Sort schemas topologically so referenced schemas appear first.\n */\nexport function sortSchemas(schemas: Record<string, SchemaObject>): Record<string, SchemaObject> {\n  const deps = new Map<string, string[]>()\n\n  for (const [name, schema] of Object.entries(schemas)) {\n    deps.set(name, Array.from(collectRefs(schema)))\n  }\n\n  const sorted: string[] = []\n  const visited = new Set<string>()\n\n  function visit(name: string, stack = new Set<string>()) {\n    if (visited.has(name)) {\n      return\n    }\n    if (stack.has(name)) {\n      return\n    } // circular refs, ignore\n    stack.add(name)\n    const children = deps.get(name) || []\n    for (const child of children) {\n      if (deps.has(child)) {\n        visit(child, stack)\n      }\n    }\n    stack.delete(name)\n    visited.add(name)\n    sorted.push(name)\n  }\n\n  for (const name of Object.keys(schemas)) {\n    visit(name)\n  }\n\n  const sortedSchemas: Record<string, SchemaObject> = {}\n  for (const name of sorted) {\n    sortedSchemas[name] = schemas[name]!\n  }\n  return sortedSchemas\n}\n\n/**\n * Extract schema from content object (used by responses and requestBodies).\n * Returns null if the schema is just a $ref (not a unique type definition).\n */\nexport function extractSchemaFromContent(content: Record<string, unknown> | undefined, preferredContentType?: contentType): SchemaObject | null {\n  if (!content) {\n    return null\n  }\n  const firstContentType = Object.keys(content)[0] || 'application/json'\n  const targetContentType = preferredContentType || firstContentType\n  const contentSchema = content[targetContentType] as { schema?: SchemaObject } | undefined\n  const schema = contentSchema?.schema\n\n  // Skip schemas that are just references - they don't define unique types\n  if (schema && '$ref' in schema) {\n    return null\n  }\n\n  return schema || null\n}\n\n/**\n * Get semantic suffix for a schema source.\n */\nexport function getSemanticSuffix(source: SchemaSourceMode): string {\n  switch (source) {\n    case 'schemas':\n      return 'Schema'\n    case 'responses':\n      return 'Response'\n    case 'requestBodies':\n      return 'Request'\n  }\n}\n\n/**\n * Legacy resolution strategy - no collision detection, just use original names.\n * This preserves backward compatibility when collisionDetection is false.\n * @deprecated\n */\nexport function legacyResolve(schemasWithMeta: SchemaWithMetadata[]): GetSchemasResult {\n  const schemas: Record<string, SchemaObject> = {}\n  const nameMapping = new Map<string, string>()\n\n  // Simply use original names without collision detection\n  for (const item of schemasWithMeta) {\n    schemas[item.originalName] = item.schema\n    // Map using full $ref path for consistency\n    const refPath = `#/components/${item.source}/${item.originalName}`\n    nameMapping.set(refPath, item.originalName)\n  }\n\n  return { schemas, nameMapping }\n}\n\n/**\n * Resolve name collisions by applying suffixes based on collision type.\n *\n * Strategy:\n * - Same-component collisions (e.g., \"Variant\" + \"variant\" both in schemas): numeric suffixes (Variant, Variant2)\n * - Cross-component collisions (e.g., \"Pet\" in schemas + \"Pet\" in requestBodies): semantic suffixes (PetSchema, PetRequest)\n */\nexport function resolveCollisions(schemasWithMeta: SchemaWithMetadata[]): GetSchemasResult {\n  const schemas: Record<string, SchemaObject> = {}\n  const nameMapping = new Map<string, string>()\n  const normalizedNames = new Map<string, SchemaWithMetadata[]>()\n\n  // Group schemas by normalized (PascalCase) name for collision detection\n  for (const item of schemasWithMeta) {\n    const normalized = pascalCase(item.originalName)\n    if (!normalizedNames.has(normalized)) {\n      normalizedNames.set(normalized, [])\n    }\n    normalizedNames.get(normalized)!.push(item)\n  }\n\n  // Process each collision group\n  for (const [, items] of normalizedNames) {\n    if (items.length === 1) {\n      // No collision, use original name\n      const item = items[0]!\n      schemas[item.originalName] = item.schema\n      // Map using full $ref path: #/components/{source}/{originalName}\n      const refPath = `#/components/${item.source}/${item.originalName}`\n      nameMapping.set(refPath, item.originalName)\n      continue\n    }\n\n    // Multiple schemas normalize to same name - resolve collision\n    const sources = new Set(items.map((item) => item.source))\n\n    if (sources.size === 1) {\n      // Same-component collision: add numeric suffixes\n      // Preserve original order from OpenAPI spec for deterministic behavior\n      items.forEach((item, index) => {\n        const suffix = index === 0 ? '' : (index + 1).toString()\n        const uniqueName = item.originalName + suffix\n        schemas[uniqueName] = item.schema\n        // Map using full $ref path: #/components/{source}/{originalName}\n        const refPath = `#/components/${item.source}/${item.originalName}`\n        nameMapping.set(refPath, uniqueName)\n      })\n    } else {\n      // Cross-component collision: add semantic suffixes\n      // Preserve original order from OpenAPI spec for deterministic behavior\n      items.forEach((item) => {\n        const suffix = getSemanticSuffix(item.source)\n        const uniqueName = item.originalName + suffix\n        schemas[uniqueName] = item.schema\n        // Map using full $ref path: #/components/{source}/{originalName}\n        const refPath = `#/components/${item.source}/${item.originalName}`\n        nameMapping.set(refPath, uniqueName)\n      })\n    }\n  }\n\n  return { schemas, nameMapping }\n}\n","import jsonpointer from 'jsonpointer'\nimport BaseOas from 'oas'\nimport type { ParameterObject } from 'oas/types'\nimport { matchesMimeType } from 'oas/utils'\nimport type { contentType, DiscriminatorObject, Document, MediaTypeObject, Operation, ReferenceObject, ResponseObject, SchemaObject } from './types.ts'\nimport {\n  extractSchemaFromContent,\n  flattenSchema,\n  isDiscriminator,\n  isReference,\n  legacyResolve,\n  resolveCollisions,\n  type SchemaWithMetadata,\n  sortSchemas,\n  validate,\n} from './utils.ts'\n\n/**\n * Prefix used to create synthetic `$ref` values for anonymous (inline) discriminator schemas.\n * The suffix is the schema index within the discriminator's `oneOf`/`anyOf` array.\n * @example `#kubb-inline-0`\n */\nexport const KUBB_INLINE_REF_PREFIX = '#kubb-inline-'\n\ntype OasOptions = {\n  contentType?: contentType\n  discriminator?: 'strict' | 'inherit'\n  /**\n   * Resolve name collisions when schemas from different components share the same name (case-insensitive).\n   * @default false\n   */\n  collisionDetection?: boolean\n}\n\nexport class Oas extends BaseOas {\n  #options: OasOptions = {\n    discriminator: 'strict',\n  }\n  document: Document\n\n  constructor(document: Document) {\n    super(document, undefined)\n\n    this.document = document\n  }\n\n  setOptions(options: OasOptions) {\n    this.#options = {\n      ...this.#options,\n      ...options,\n    }\n\n    if (this.#options.discriminator === 'inherit') {\n      this.#applyDiscriminatorInheritance()\n    }\n  }\n\n  get options(): OasOptions {\n    return this.#options\n  }\n\n  get<T = unknown>($ref: string): T | null {\n    const origRef = $ref\n    $ref = $ref.trim()\n    if ($ref === '') {\n      return null\n    }\n    if ($ref.startsWith('#')) {\n      $ref = globalThis.decodeURIComponent($ref.substring(1))\n    } else {\n      return null\n    }\n    const current = jsonpointer.get(this.api, $ref)\n\n    if (!current) {\n      throw new Error(`Could not find a definition for ${origRef}.`)\n    }\n    return current as T\n  }\n\n  getKey($ref: string) {\n    const key = $ref.split('/').pop()\n    return key === '' ? undefined : key\n  }\n  set($ref: string, value: unknown) {\n    $ref = $ref.trim()\n    if ($ref === '') {\n      return false\n    }\n    if ($ref.startsWith('#')) {\n      $ref = globalThis.decodeURIComponent($ref.substring(1))\n\n      jsonpointer.set(this.api, $ref, value)\n    }\n  }\n\n  #setDiscriminator(schema: SchemaObject & { discriminator: DiscriminatorObject }): void {\n    const { mapping = {}, propertyName } = schema.discriminator\n\n    if (this.#options.discriminator === 'inherit') {\n      Object.entries(mapping).forEach(([mappingKey, mappingValue]) => {\n        if (mappingValue) {\n          const childSchema = this.get<any>(mappingValue)\n          if (!childSchema) {\n            return\n          }\n\n          if (!childSchema.properties) {\n            childSchema.properties = {}\n          }\n\n          const property = childSchema.properties[propertyName] as SchemaObject\n\n          if (childSchema.properties) {\n            childSchema.properties[propertyName] = {\n              ...((childSchema.properties ? childSchema.properties[propertyName] : {}) as SchemaObject),\n              enum: [...(property?.enum?.filter((value) => value !== mappingKey) ?? []), mappingKey],\n            }\n\n            childSchema.required =\n              typeof childSchema.required === 'boolean' ? childSchema.required : [...new Set([...(childSchema.required ?? []), propertyName])]\n\n            this.set(mappingValue, childSchema)\n          }\n        }\n      })\n    }\n  }\n\n  getDiscriminator(schema: SchemaObject | null): DiscriminatorObject | null {\n    if (!isDiscriminator(schema) || !schema) {\n      return null\n    }\n\n    const { mapping = {}, propertyName } = schema.discriminator\n\n    /**\n     * Helper to extract discriminator value from a schema.\n     * Checks in order:\n     * 1. Extension property matching propertyName (e.g., x-linode-ref-name)\n     * 2. Property with const value\n     * 3. Property with single enum value\n     * 4. Title as fallback\n     */\n    const getDiscriminatorValue = (schema: SchemaObject | null): string | null => {\n      if (!schema) {\n        return null\n      }\n\n      // Check extension properties first (e.g., x-linode-ref-name)\n      // Only check if propertyName starts with 'x-' to avoid conflicts with standard properties\n      if (propertyName.startsWith('x-')) {\n        const extensionValue = (schema as Record<string, unknown>)[propertyName]\n        if (extensionValue && typeof extensionValue === 'string') {\n          return extensionValue\n        }\n      }\n\n      // Check if property has const value\n      const propertySchema = schema.properties?.[propertyName] as SchemaObject\n      if (propertySchema && 'const' in propertySchema && propertySchema.const !== undefined) {\n        return String(propertySchema.const)\n      }\n\n      // Check if property has single enum value\n      if (propertySchema && propertySchema.enum?.length === 1) {\n        return String(propertySchema.enum[0])\n      }\n\n      // Fallback to title if available\n      return schema.title || null\n    }\n\n    /**\n     * Process oneOf/anyOf items to build mapping.\n     * Handles both $ref and inline schemas.\n     */\n    const processSchemas = (schemas: Array<SchemaObject>, existingMapping: Record<string, string>) => {\n      schemas.forEach((schemaItem, index) => {\n        if (isReference(schemaItem)) {\n          // Handle $ref case\n          const key = this.getKey(schemaItem.$ref)\n\n          try {\n            const refSchema = this.get<SchemaObject>(schemaItem.$ref)\n            const discriminatorValue = getDiscriminatorValue(refSchema)\n            const canAdd = key && !Object.values(existingMapping).includes(schemaItem.$ref)\n\n            if (canAdd && discriminatorValue) {\n              existingMapping[discriminatorValue] = schemaItem.$ref\n            } else if (canAdd) {\n              existingMapping[key] = schemaItem.$ref\n            }\n          } catch (_error) {\n            // If we can't resolve the reference, skip it and use the key as fallback\n            if (key && !Object.values(existingMapping).includes(schemaItem.$ref)) {\n              existingMapping[key] = schemaItem.$ref\n            }\n          }\n        } else {\n          // Handle inline schema case\n          const inlineSchema = schemaItem as SchemaObject\n          const discriminatorValue = getDiscriminatorValue(inlineSchema)\n\n          if (discriminatorValue) {\n            // Create a synthetic ref for inline schemas using index\n            // The value points to the inline schema itself via a special marker\n            existingMapping[discriminatorValue] = `${KUBB_INLINE_REF_PREFIX}${index}`\n          }\n        }\n      })\n    }\n\n    // Process oneOf schemas\n    if (schema.oneOf) {\n      processSchemas(schema.oneOf as Array<SchemaObject>, mapping)\n    }\n\n    // Process anyOf schemas\n    if (schema.anyOf) {\n      processSchemas(schema.anyOf as Array<SchemaObject>, mapping)\n    }\n\n    return {\n      ...schema.discriminator,\n      mapping,\n    }\n  }\n\n  // TODO add better typing\n  dereferenceWithRef<T = unknown>(schema?: T): T {\n    if (isReference(schema)) {\n      return {\n        ...schema,\n        ...this.get(schema.$ref),\n        $ref: schema.$ref,\n      }\n    }\n\n    return schema as T\n  }\n\n  #applyDiscriminatorInheritance() {\n    const components = this.api.components\n    if (!components?.schemas) {\n      return\n    }\n\n    const visited = new WeakSet<object>()\n    const enqueue = (value: unknown) => {\n      if (!value) {\n        return\n      }\n\n      if (Array.isArray(value)) {\n        for (const item of value) {\n          enqueue(item)\n        }\n        return\n      }\n\n      if (typeof value === 'object') {\n        visit(value as SchemaObject)\n      }\n    }\n\n    const visit = (schema?: SchemaObject | ReferenceObject | null) => {\n      if (!schema || typeof schema !== 'object') {\n        return\n      }\n\n      if (isReference(schema)) {\n        visit(this.get(schema.$ref) as SchemaObject)\n        return\n      }\n\n      const schemaObject = schema as SchemaObject\n\n      if (visited.has(schemaObject as object)) {\n        return\n      }\n\n      visited.add(schemaObject as object)\n\n      if (isDiscriminator(schemaObject)) {\n        this.#setDiscriminator(schemaObject)\n      }\n\n      if ('allOf' in schemaObject) {\n        enqueue(schemaObject.allOf)\n      }\n      if ('oneOf' in schemaObject) {\n        enqueue(schemaObject.oneOf)\n      }\n      if ('anyOf' in schemaObject) {\n        enqueue(schemaObject.anyOf)\n      }\n      if ('not' in schemaObject) {\n        enqueue(schemaObject.not)\n      }\n      if ('items' in schemaObject) {\n        enqueue(schemaObject.items)\n      }\n      if ('prefixItems' in schemaObject) {\n        enqueue(schemaObject.prefixItems)\n      }\n\n      if (schemaObject.properties) {\n        enqueue(Object.values(schemaObject.properties))\n      }\n\n      if (schemaObject.additionalProperties && typeof schemaObject.additionalProperties === 'object') {\n        enqueue(schemaObject.additionalProperties)\n      }\n    }\n\n    for (const schema of Object.values(components.schemas)) {\n      visit(schema as SchemaObject)\n    }\n  }\n\n  /**\n   * Oas does not have a getResponseBody(contentType)\n   */\n  #getResponseBodyFactory(responseBody: boolean | ResponseObject): (contentType?: string) => MediaTypeObject | false | [string, MediaTypeObject, ...string[]] {\n    function hasResponseBody(res = responseBody): res is ResponseObject {\n      return !!res\n    }\n\n    return (contentType) => {\n      if (!hasResponseBody(responseBody)) {\n        return false\n      }\n\n      if (isReference(responseBody)) {\n        // If the request body is still a `$ref` pointer we should return false because this library\n        // assumes that you've run dereferencing beforehand.\n        return false\n      }\n\n      if (!responseBody.content) {\n        return false\n      }\n\n      if (contentType) {\n        if (!(contentType in responseBody.content)) {\n          return false\n        }\n\n        return responseBody.content[contentType]!\n      }\n\n      // Since no media type was supplied we need to find either the first JSON-like media type that\n      // we've got, or the first available of anything else if no JSON-like media types are present.\n      let availableContentType: string | undefined\n      const contentTypes = Object.keys(responseBody.content)\n      contentTypes.forEach((mt: string) => {\n        if (!availableContentType && matchesMimeType.json(mt)) {\n          availableContentType = mt\n        }\n      })\n\n      if (!availableContentType) {\n        contentTypes.forEach((mt: string) => {\n          if (!availableContentType) {\n            availableContentType = mt\n          }\n        })\n      }\n\n      if (availableContentType) {\n        return [availableContentType, responseBody.content[availableContentType]!, ...(responseBody.description ? [responseBody.description] : [])]\n      }\n\n      return false\n    }\n  }\n\n  getResponseSchema(operation: Operation, statusCode: string | number): SchemaObject {\n    if (operation.schema.responses) {\n      Object.keys(operation.schema.responses).forEach((key) => {\n        const schema = operation.schema.responses![key]\n        const $ref = isReference(schema) ? schema.$ref : undefined\n\n        if (schema && $ref) {\n          operation.schema.responses![key] = this.get<any>($ref)\n        }\n      })\n    }\n\n    const getResponseBody = this.#getResponseBodyFactory(operation.getResponseByStatusCode(statusCode))\n\n    const { contentType } = this.#options\n    const responseBody = getResponseBody(contentType)\n\n    if (responseBody === false) {\n      // return empty object because response will always be defined(request does not need a body)\n      return {}\n    }\n\n    const schema = Array.isArray(responseBody) ? responseBody[1].schema : responseBody.schema\n\n    if (!schema) {\n      // return empty object because response will always be defined(request does not need a body)\n\n      return {}\n    }\n\n    return this.dereferenceWithRef(schema)\n  }\n\n  getRequestSchema(operation: Operation): SchemaObject | undefined {\n    const { contentType } = this.#options\n\n    if (operation.schema.requestBody) {\n      operation.schema.requestBody = this.dereferenceWithRef(operation.schema.requestBody)\n    }\n\n    const requestBody = operation.getRequestBody(contentType)\n\n    if (requestBody === false) {\n      return undefined\n    }\n\n    const schema = Array.isArray(requestBody) ? requestBody[1].schema : requestBody.schema\n\n    if (!schema) {\n      return undefined\n    }\n\n    return this.dereferenceWithRef(schema)\n  }\n\n  getParametersSchema(operation: Operation, inKey: 'path' | 'query' | 'header'): SchemaObject | null {\n    const { contentType = operation.getContentType() } = this.#options\n\n    // Collect parameters from both operation-level and path-level, resolving $ref pointers.\n    // oas v31+ filters out $ref parameters in getParameters(), so we access raw parameters\n    // directly and resolve refs ourselves to preserve backward compatibility.\n    // Note: dereferenceWithRef preserves the $ref property on resolved objects, so we check\n    // for 'in' and 'name' fields to validate successful resolution instead of !isReference().\n    const resolveParams = (params: unknown[]): Array<ParameterObject> =>\n      params.map((p) => this.dereferenceWithRef(p)).filter((p): p is ParameterObject => !!p && typeof p === 'object' && 'in' in p && 'name' in p)\n\n    const operationParams = resolveParams(operation.schema?.parameters || [])\n    const pathItem = this.api?.paths?.[operation.path]\n    const pathLevelParams = resolveParams(pathItem && !isReference(pathItem) && pathItem.parameters ? pathItem.parameters : [])\n\n    // Deduplicate: operation-level parameters override path-level ones with the same name+in\n    const paramMap = new Map<string, ParameterObject>()\n    for (const p of pathLevelParams) {\n      if (p.name && p.in) {\n        paramMap.set(`${p.in}:${p.name}`, p)\n      }\n    }\n    for (const p of operationParams) {\n      if (p.name && p.in) {\n        paramMap.set(`${p.in}:${p.name}`, p)\n      }\n    }\n\n    const params = Array.from(paramMap.values()).filter((v) => v.in === inKey)\n\n    if (!params.length) {\n      return null\n    }\n\n    return params.reduce(\n      (schema, pathParameters) => {\n        const property = (pathParameters.content?.[contentType]?.schema ?? (pathParameters.schema as SchemaObject)) as SchemaObject | null\n        const required =\n          typeof schema.required === 'boolean'\n            ? schema.required\n            : [...(schema.required || []), pathParameters.required ? pathParameters.name : undefined].filter(Boolean)\n\n        // Handle explode=true with style=form for object with additionalProperties\n        // According to OpenAPI spec, when explode is true, object properties are flattened\n        const getDefaultStyle = (location: string): string => {\n          if (location === 'query') return 'form'\n          if (location === 'path') return 'simple'\n          return 'simple'\n        }\n        const style = pathParameters.style || getDefaultStyle(inKey)\n        const explode = pathParameters.explode !== undefined ? pathParameters.explode : style === 'form'\n\n        if (\n          inKey === 'query' &&\n          style === 'form' &&\n          explode === true &&\n          property?.type === 'object' &&\n          property?.additionalProperties &&\n          !property?.properties\n        ) {\n          // When explode is true for an object with only additionalProperties,\n          // flatten it to the root level by merging additionalProperties with existing schema.\n          // This preserves other query parameters while allowing dynamic key-value pairs.\n          return {\n            ...schema,\n            description: pathParameters.description || schema.description,\n            deprecated: schema.deprecated,\n            example: property.example || schema.example,\n            additionalProperties: property.additionalProperties,\n          } as SchemaObject\n        }\n\n        return {\n          ...schema,\n          description: schema.description,\n          deprecated: schema.deprecated,\n          example: schema.example,\n          required,\n          properties: {\n            ...schema.properties,\n            [pathParameters.name]: {\n              description: pathParameters.description,\n              ...property,\n            },\n          },\n        } as SchemaObject\n      },\n      { type: 'object', required: [], properties: {} } as SchemaObject,\n    )\n  }\n\n  async validate() {\n    return validate(this.api)\n  }\n\n  flattenSchema(schema: SchemaObject | null): SchemaObject | null {\n    return flattenSchema(schema)\n  }\n\n  /**\n   * Get schemas from OpenAPI components (schemas, responses, requestBodies).\n   * Returns schemas in dependency order along with name mapping for collision resolution.\n   */\n  getSchemas(options: { contentType?: contentType; includes?: Array<'schemas' | 'responses' | 'requestBodies'>; collisionDetection?: boolean } = {}): {\n    schemas: Record<string, SchemaObject>\n    nameMapping: Map<string, string>\n  } {\n    const contentType = options.contentType ?? this.#options.contentType\n    const includes = options.includes ?? ['schemas', 'requestBodies', 'responses']\n    const shouldResolveCollisions = options.collisionDetection ?? this.#options.collisionDetection ?? false\n\n    const components = this.getDefinition().components\n    const schemasWithMeta: SchemaWithMetadata[] = []\n\n    // Collect schemas from components\n    if (includes.includes('schemas')) {\n      const componentSchemas = (components?.schemas as Record<string, SchemaObject>) || {}\n      for (const [name, schemaObject] of Object.entries(componentSchemas)) {\n        // Resolve schema if it's a $ref (can happen when the bundler deduplicates schemas\n        // referenced from multiple external files). Without this, a $ref schema would be\n        // parsed as a reference to itself, generating `z.lazy(() => schemaName)`.\n        let schema = schemaObject\n        if (isReference(schemaObject)) {\n          const resolved = this.get<SchemaObject>(schemaObject.$ref)\n          if (resolved && !isReference(resolved)) {\n            schema = resolved\n          }\n        }\n        schemasWithMeta.push({ schema, source: 'schemas', originalName: name })\n      }\n    }\n\n    if (includes.includes('responses')) {\n      const responses = components?.responses || {}\n      for (const [name, response] of Object.entries(responses)) {\n        const responseObject = response as ResponseObject\n        const schema = extractSchemaFromContent(responseObject.content, contentType)\n        if (schema) {\n          // Resolve schema if it's a $ref (can happen when the bundler deduplicates schemas\n          // referenced from multiple external files). Without this, a $ref schema would be\n          // parsed as a reference to itself, generating `z.lazy(() => schemaName)`.\n          let resolvedSchema = schema\n          if (isReference(schema)) {\n            const resolved = this.get<SchemaObject>(schema.$ref)\n            if (resolved && !isReference(resolved)) {\n              resolvedSchema = resolved\n            }\n          }\n          schemasWithMeta.push({ schema: resolvedSchema, source: 'responses', originalName: name })\n        }\n      }\n    }\n\n    if (includes.includes('requestBodies')) {\n      const requestBodies = components?.requestBodies || {}\n      for (const [name, request] of Object.entries(requestBodies)) {\n        const requestObject = request as { content?: Record<string, unknown> }\n        const schema = extractSchemaFromContent(requestObject.content, contentType)\n        if (schema) {\n          // Resolve schema if it's a $ref (can happen when the bundler deduplicates schemas\n          // referenced from multiple external files). Without this, a $ref schema would be\n          // parsed as a reference to itself, generating `z.lazy(() => schemaName)`.\n          let resolvedSchema = schema\n          if (isReference(schema)) {\n            const resolved = this.get<SchemaObject>(schema.$ref)\n            if (resolved && !isReference(resolved)) {\n              resolvedSchema = resolved\n            }\n          }\n          schemasWithMeta.push({ schema: resolvedSchema, source: 'requestBodies', originalName: name })\n        }\n      }\n    }\n\n    // Apply collision resolution only if enabled\n    const { schemas, nameMapping } = shouldResolveCollisions ? resolveCollisions(schemasWithMeta) : legacyResolve(schemasWithMeta)\n\n    return {\n      schemas: sortSchemas(schemas),\n      nameMapping,\n    }\n  }\n}\n","type ServerVariable = {\n  default?: string | number\n  enum?: (string | number)[]\n}\n\ntype ServerObject = {\n  url: string\n  variables?: Record<string, ServerVariable>\n}\n\n/**\n * Resolves an OpenAPI server URL by substituting `{variable}` placeholders\n * with values from `overrides` (user-provided) or the spec-defined defaults.\n *\n * Throws if an override value is not in the variable's `enum` list.\n */\nexport function resolveServerUrl(server: ServerObject, overrides?: Record<string, string>): string {\n  if (!server.variables) {\n    return server.url\n  }\n\n  let url = server.url\n  for (const [key, variable] of Object.entries(server.variables)) {\n    const value = overrides?.[key] ?? (variable.default != null ? String(variable.default) : undefined)\n    if (value === undefined) {\n      continue\n    }\n\n    if (variable.enum?.length && !variable.enum.some((e) => String(e) === value)) {\n      throw new Error(`Invalid server variable value '${value}' for '${key}' when resolving ${server.url}. Valid values are: ${variable.enum.join(', ')}.`)\n    }\n\n    url = url.replaceAll(`{${key}}`, value)\n  }\n\n  return url\n}\n"],"mappings":"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"}