@kubb/oas 5.0.0-alpha.3 → 5.0.0-alpha.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -145,9 +145,12 @@ function toCamelOrPascal(text, pascal) {
145
145
  * Splits `text` on `.` and applies `transformPart` to each segment.
146
146
  * The last segment receives `isLast = true`, all earlier segments receive `false`.
147
147
  * Segments are joined with `/` to form a file path.
148
+ *
149
+ * Only splits on dots followed by a letter so that version numbers
150
+ * embedded in operationIds (e.g. `v2025.0`) are kept intact.
148
151
  */
149
152
  function applyToFileParts(text, transformPart) {
150
- const parts = text.split(".");
153
+ const parts = text.split(/\.(?=[a-zA-Z])/);
151
154
  return parts.map((part, i) => transformPart(part, i === parts.length - 1)).join("/");
152
155
  }
153
156
  /**
@@ -184,6 +187,13 @@ function pascalCase(text, { isFile, prefix = "", suffix = "" } = {}) {
184
187
  //#region ../../internals/utils/src/reserved.ts
185
188
  /**
186
189
  * Returns `true` when `name` is a syntactically valid JavaScript variable name.
190
+ *
191
+ * @example
192
+ * ```ts
193
+ * isValidVarName('status') // true
194
+ * isValidVarName('class') // false (reserved word)
195
+ * isValidVarName('42foo') // false (starts with digit)
196
+ * ```
187
197
  */
188
198
  function isValidVarName(name) {
189
199
  try {
@@ -204,18 +214,33 @@ function isValidVarName(name) {
204
214
  * p.template // '`/pet/${petId}`'
205
215
  */
206
216
  var URLPath = class {
207
- /** The raw OpenAPI/Swagger path string, e.g. `/pet/{petId}`. */
217
+ /**
218
+ * The raw OpenAPI/Swagger path string, e.g. `/pet/{petId}`.
219
+ */
208
220
  path;
209
221
  #options;
210
222
  constructor(path, options = {}) {
211
223
  this.path = path;
212
224
  this.#options = options;
213
225
  }
214
- /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`. */
226
+ /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`.
227
+ *
228
+ * @example
229
+ * ```ts
230
+ * new URLPath('/pet/{petId}').URL // '/pet/:petId'
231
+ * ```
232
+ */
215
233
  get URL() {
216
234
  return this.toURLPath();
217
235
  }
218
- /** Returns `true` when `path` is a fully-qualified URL (e.g. starts with `https://`). */
236
+ /** Returns `true` when `path` is a fully-qualified URL (e.g. starts with `https://`).
237
+ *
238
+ * @example
239
+ * ```ts
240
+ * new URLPath('https://petstore.swagger.io/v2/pet').isURL // true
241
+ * new URLPath('/pet/{petId}').isURL // false
242
+ * ```
243
+ */
219
244
  get isURL() {
220
245
  try {
221
246
  return !!new URL(this.path).href;
@@ -233,11 +258,25 @@ var URLPath = class {
233
258
  get template() {
234
259
  return this.toTemplateString();
235
260
  }
236
- /** Returns the path and its extracted params as a structured `URLObject`, or as a stringified expression when `stringify` is set. */
261
+ /** Returns the path and its extracted params as a structured `URLObject`, or as a stringified expression when `stringify` is set.
262
+ *
263
+ * @example
264
+ * ```ts
265
+ * new URLPath('/pet/{petId}').object
266
+ * // { url: '/pet/:petId', params: { petId: 'petId' } }
267
+ * ```
268
+ */
237
269
  get object() {
238
270
  return this.toObject();
239
271
  }
240
- /** Returns a map of path parameter names, or `undefined` when the path has no parameters. */
272
+ /** Returns a map of path parameter names, or `undefined` when the path has no parameters.
273
+ *
274
+ * @example
275
+ * ```ts
276
+ * new URLPath('/pet/{petId}').params // { petId: 'petId' }
277
+ * new URLPath('/pet').params // undefined
278
+ * ```
279
+ */
241
280
  get params() {
242
281
  return this.getParams();
243
282
  }
@@ -245,7 +284,9 @@ var URLPath = class {
245
284
  const param = isValidVarName(raw) ? raw : camelCase(raw);
246
285
  return this.#options.casing === "camelcase" ? camelCase(param) : param;
247
286
  }
248
- /** Iterates over every `{param}` token in `path`, calling `fn` with the raw token and transformed name. */
287
+ /**
288
+ * Iterates over every `{param}` token in `path`, calling `fn` with the raw token and transformed name.
289
+ */
249
290
  #eachParam(fn) {
250
291
  for (const match of this.path.matchAll(/\{([^}]+)\}/g)) {
251
292
  const raw = match[1];
@@ -282,6 +323,12 @@ var URLPath = class {
282
323
  * Extracts all `{param}` segments from the path and returns them as a key-value map.
283
324
  * An optional `replacer` transforms each parameter name in both key and value positions.
284
325
  * Returns `undefined` when no path parameters are found.
326
+ *
327
+ * @example
328
+ * ```ts
329
+ * new URLPath('/pet/{petId}/tag/{tagId}').getParams()
330
+ * // { petId: 'petId', tagId: 'tagId' }
331
+ * ```
285
332
  */
286
333
  getParams(replacer) {
287
334
  const params = {};
@@ -291,7 +338,13 @@ var URLPath = class {
291
338
  });
292
339
  return Object.keys(params).length > 0 ? params : void 0;
293
340
  }
294
- /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`. */
341
+ /** Converts the OpenAPI path to Express-style colon syntax.
342
+ *
343
+ * @example
344
+ * ```ts
345
+ * new URLPath('/pet/{petId}').toURLPath() // '/pet/:petId'
346
+ * ```
347
+ */
295
348
  toURLPath() {
296
349
  return this.path.replace(/\{([^}]+)\}/g, ":$1");
297
350
  }
@@ -409,11 +462,12 @@ async function parse(pathOrApi, { oasClass = Oas, canBundle = true, enablePaths
409
462
  return new oasClass(document);
410
463
  }
411
464
  async function merge(pathOrApi, { oasClass = Oas } = {}) {
412
- const instances = await Promise.all(pathOrApi.map((p) => parse(p, {
465
+ const instances = [];
466
+ for (const p of pathOrApi) instances.push(await parse(p, {
413
467
  oasClass,
414
468
  enablePaths: false,
415
469
  canBundle: false
416
- })));
470
+ }));
417
471
  if (instances.length === 0) throw new Error("No OAS instances provided for merging.");
418
472
  return parse(instances.reduce((acc, current) => {
419
473
  return (0, remeda.mergeDeep)(acc, current.document);
@@ -1 +1 @@
1
- {"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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"}
1
+ {"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 /**\n * When `true`, dot-separated segments are split on `.` and joined with `/` after casing.\n */\n isFile?: boolean\n /**\n * Text prepended before casing is applied.\n */\n prefix?: string\n /**\n * Text appended before casing is applied.\n */\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 *\n * Only splits on dots followed by a letter so that version numbers\n * embedded in operationIds (e.g. `v2025.0`) are kept intact.\n */\nfunction applyToFileParts(text: string, transformPart: (part: string, isLast: boolean) => string): string {\n const parts = text.split(/\\.(?=[a-zA-Z])/)\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 = new Set([\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] as const)\n\n/**\n * Prefixes `word` with `_` when it is a reserved JavaScript/Java identifier or starts with a digit.\n *\n * @example\n * ```ts\n * transformReservedWord('class') // '_class'\n * transformReservedWord('42foo') // '_42foo'\n * transformReservedWord('status') // 'status'\n * ```\n */\nexport function transformReservedWord(word: string): string {\n const firstChar = word.charCodeAt(0)\n if (word && (reservedWords.has(word as 'valueOf') || (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 *\n * @example\n * ```ts\n * isValidVarName('status') // true\n * isValidVarName('class') // false (reserved word)\n * isValidVarName('42foo') // false (starts with digit)\n * ```\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 /**\n * The resolved URL string (Express-style or template literal, depending on context).\n */\n url: string\n /**\n * Extracted path parameters as a key-value map, or `undefined` when the path has none.\n */\n params?: Record<string, string>\n}\n\ntype ObjectOptions = {\n /**\n * Controls whether the `url` is rendered as an Express path or a template literal.\n * @default 'path'\n */\n type?: 'path' | 'template'\n /**\n * Optional transform applied to each extracted parameter name.\n */\n replacer?: (pathParam: string) => string\n /**\n * When `true`, the result is serialized to a string expression instead of a plain object.\n */\n stringify?: boolean\n}\n\n/**\n * Supported identifier casing strategies for path parameters.\n */\ntype PathCasing = 'camelcase'\n\ntype Options = {\n /**\n * Casing strategy applied to path parameter names.\n * @default undefined (original identifier preserved)\n */\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 /**\n * The raw OpenAPI/Swagger path string, e.g. `/pet/{petId}`.\n */\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 *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').URL // '/pet/:petId'\n * ```\n */\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 *\n * @example\n * ```ts\n * new URLPath('https://petstore.swagger.io/v2/pet').isURL // true\n * new URLPath('/pet/{petId}').isURL // false\n * ```\n */\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 *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').object\n * // { url: '/pet/:petId', params: { petId: 'petId' } }\n * ```\n */\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 *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').params // { petId: 'petId' }\n * new URLPath('/pet').params // undefined\n * ```\n */\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 /**\n * Iterates over every `{param}` token in `path`, calling `fn` with the raw token and transformed name.\n */\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 * @example\n * ```ts\n * new URLPath('/pet/{petId}/tag/{tagId}').getParams()\n * // { petId: 'petId', tagId: 'tagId' }\n * ```\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.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').toURLPath() // '/pet/:petId'\n * ```\n */\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: Oas[] = []\n for (const p of pathOrApi) {\n instances.push(await parse(p, { oasClass, enablePaths: false, canBundle: false }))\n }\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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"}
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import { t as __name } from "./chunk--u3MIqq1.js";
2
2
  import BaseOas from "oas";
3
3
  import * as OasTypes from "oas/types";
4
4
  import { DiscriminatorObject as DiscriminatorObject$1, HttpMethods, MediaTypeObject as MediaTypeObject$1, OASDocument, ParameterObject, ResponseObject as ResponseObject$1, SchemaObject as SchemaObject$1 } from "oas/types";
5
- import * as oas_normalize_lib_types0 from "oas-normalize/lib/types";
5
+ import * as _$oas_normalize_lib_types0 from "oas-normalize/lib/types";
6
6
  import { Operation as Operation$1 } from "oas/operation";
7
7
  import { OpenAPIV3, OpenAPIV3 as OpenAPIV3$1, OpenAPIV3_1, OpenAPIV3_1 as OpenAPIV3_1$1 } from "openapi-types";
8
8
  import { Config } from "@kubb/core";
@@ -125,7 +125,7 @@ declare class Oas extends BaseOas {
125
125
  getResponseSchema(operation: Operation, statusCode: string | number): SchemaObject;
126
126
  getRequestSchema(operation: Operation): SchemaObject | undefined;
127
127
  getParametersSchema(operation: Operation, inKey: 'path' | 'query' | 'header'): SchemaObject | null;
128
- validate(): Promise<oas_normalize_lib_types0.ValidationResult>;
128
+ validate(): Promise<_$oas_normalize_lib_types0.ValidationResult>;
129
129
  flattenSchema(schema: SchemaObject | null): SchemaObject | null;
130
130
  /**
131
131
  * Get schemas from OpenAPI components (schemas, responses, requestBodies).
@@ -228,7 +228,7 @@ declare function flattenSchema(schema: SchemaObject | null): SchemaObject | null
228
228
  /**
229
229
  * Validate an OpenAPI document using oas-normalize.
230
230
  */
231
- declare function validate(document: Document): Promise<oas_normalize_lib_types0.ValidationResult>;
231
+ declare function validate(document: Document): Promise<_$oas_normalize_lib_types0.ValidationResult>;
232
232
  //#endregion
233
233
  export { DiscriminatorObject, Document, ENUM_EXTENSION_KEYS, FORMAT_MAP, HttpMethod, httpMethods as HttpMethods, httpMethods, KNOWN_MEDIA_TYPES, KUBB_INLINE_REF_PREFIX, MediaTypeObject, Oas, type OasTypes, type OpenAPIV3, type OpenAPIV3_1, Operation, ReferenceObject, ResponseObject, STRUCTURAL_KEYS, SchemaObject, contentType, flattenSchema, getDefaultValue, isAllOptional, isDiscriminator, isNullable, isOpenApiV3_1Document, isOptional, isParameterObject, isReference, isRequired, merge, parse, parseFromConfig, resolveServerUrl, validate };
234
234
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -117,9 +117,12 @@ function toCamelOrPascal(text, pascal) {
117
117
  * Splits `text` on `.` and applies `transformPart` to each segment.
118
118
  * The last segment receives `isLast = true`, all earlier segments receive `false`.
119
119
  * Segments are joined with `/` to form a file path.
120
+ *
121
+ * Only splits on dots followed by a letter so that version numbers
122
+ * embedded in operationIds (e.g. `v2025.0`) are kept intact.
120
123
  */
121
124
  function applyToFileParts(text, transformPart) {
122
- const parts = text.split(".");
125
+ const parts = text.split(/\.(?=[a-zA-Z])/);
123
126
  return parts.map((part, i) => transformPart(part, i === parts.length - 1)).join("/");
124
127
  }
125
128
  /**
@@ -156,6 +159,13 @@ function pascalCase(text, { isFile, prefix = "", suffix = "" } = {}) {
156
159
  //#region ../../internals/utils/src/reserved.ts
157
160
  /**
158
161
  * Returns `true` when `name` is a syntactically valid JavaScript variable name.
162
+ *
163
+ * @example
164
+ * ```ts
165
+ * isValidVarName('status') // true
166
+ * isValidVarName('class') // false (reserved word)
167
+ * isValidVarName('42foo') // false (starts with digit)
168
+ * ```
159
169
  */
160
170
  function isValidVarName(name) {
161
171
  try {
@@ -176,18 +186,33 @@ function isValidVarName(name) {
176
186
  * p.template // '`/pet/${petId}`'
177
187
  */
178
188
  var URLPath = class {
179
- /** The raw OpenAPI/Swagger path string, e.g. `/pet/{petId}`. */
189
+ /**
190
+ * The raw OpenAPI/Swagger path string, e.g. `/pet/{petId}`.
191
+ */
180
192
  path;
181
193
  #options;
182
194
  constructor(path, options = {}) {
183
195
  this.path = path;
184
196
  this.#options = options;
185
197
  }
186
- /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`. */
198
+ /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`.
199
+ *
200
+ * @example
201
+ * ```ts
202
+ * new URLPath('/pet/{petId}').URL // '/pet/:petId'
203
+ * ```
204
+ */
187
205
  get URL() {
188
206
  return this.toURLPath();
189
207
  }
190
- /** Returns `true` when `path` is a fully-qualified URL (e.g. starts with `https://`). */
208
+ /** Returns `true` when `path` is a fully-qualified URL (e.g. starts with `https://`).
209
+ *
210
+ * @example
211
+ * ```ts
212
+ * new URLPath('https://petstore.swagger.io/v2/pet').isURL // true
213
+ * new URLPath('/pet/{petId}').isURL // false
214
+ * ```
215
+ */
191
216
  get isURL() {
192
217
  try {
193
218
  return !!new URL(this.path).href;
@@ -205,11 +230,25 @@ var URLPath = class {
205
230
  get template() {
206
231
  return this.toTemplateString();
207
232
  }
208
- /** Returns the path and its extracted params as a structured `URLObject`, or as a stringified expression when `stringify` is set. */
233
+ /** Returns the path and its extracted params as a structured `URLObject`, or as a stringified expression when `stringify` is set.
234
+ *
235
+ * @example
236
+ * ```ts
237
+ * new URLPath('/pet/{petId}').object
238
+ * // { url: '/pet/:petId', params: { petId: 'petId' } }
239
+ * ```
240
+ */
209
241
  get object() {
210
242
  return this.toObject();
211
243
  }
212
- /** Returns a map of path parameter names, or `undefined` when the path has no parameters. */
244
+ /** Returns a map of path parameter names, or `undefined` when the path has no parameters.
245
+ *
246
+ * @example
247
+ * ```ts
248
+ * new URLPath('/pet/{petId}').params // { petId: 'petId' }
249
+ * new URLPath('/pet').params // undefined
250
+ * ```
251
+ */
213
252
  get params() {
214
253
  return this.getParams();
215
254
  }
@@ -217,7 +256,9 @@ var URLPath = class {
217
256
  const param = isValidVarName(raw) ? raw : camelCase(raw);
218
257
  return this.#options.casing === "camelcase" ? camelCase(param) : param;
219
258
  }
220
- /** Iterates over every `{param}` token in `path`, calling `fn` with the raw token and transformed name. */
259
+ /**
260
+ * Iterates over every `{param}` token in `path`, calling `fn` with the raw token and transformed name.
261
+ */
221
262
  #eachParam(fn) {
222
263
  for (const match of this.path.matchAll(/\{([^}]+)\}/g)) {
223
264
  const raw = match[1];
@@ -254,6 +295,12 @@ var URLPath = class {
254
295
  * Extracts all `{param}` segments from the path and returns them as a key-value map.
255
296
  * An optional `replacer` transforms each parameter name in both key and value positions.
256
297
  * Returns `undefined` when no path parameters are found.
298
+ *
299
+ * @example
300
+ * ```ts
301
+ * new URLPath('/pet/{petId}/tag/{tagId}').getParams()
302
+ * // { petId: 'petId', tagId: 'tagId' }
303
+ * ```
257
304
  */
258
305
  getParams(replacer) {
259
306
  const params = {};
@@ -263,7 +310,13 @@ var URLPath = class {
263
310
  });
264
311
  return Object.keys(params).length > 0 ? params : void 0;
265
312
  }
266
- /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`. */
313
+ /** Converts the OpenAPI path to Express-style colon syntax.
314
+ *
315
+ * @example
316
+ * ```ts
317
+ * new URLPath('/pet/{petId}').toURLPath() // '/pet/:petId'
318
+ * ```
319
+ */
267
320
  toURLPath() {
268
321
  return this.path.replace(/\{([^}]+)\}/g, ":$1");
269
322
  }
@@ -381,11 +434,12 @@ async function parse(pathOrApi, { oasClass = Oas, canBundle = true, enablePaths
381
434
  return new oasClass(document);
382
435
  }
383
436
  async function merge(pathOrApi, { oasClass = Oas } = {}) {
384
- const instances = await Promise.all(pathOrApi.map((p) => parse(p, {
437
+ const instances = [];
438
+ for (const p of pathOrApi) instances.push(await parse(p, {
385
439
  oasClass,
386
440
  enablePaths: false,
387
441
  canBundle: false
388
- })));
442
+ }));
389
443
  if (instances.length === 0) throw new Error("No OAS instances provided for merging.");
390
444
  return parse(instances.reduce((acc, current) => {
391
445
  return mergeDeep(acc, current.document);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["#options","#transformParam","#eachParam","#options","#applyDiscriminatorInheritance","#setDiscriminator","#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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"}
1
+ {"version":3,"file":"index.js","names":["#options","#transformParam","#eachParam","#options","#applyDiscriminatorInheritance","#setDiscriminator","#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 /**\n * When `true`, dot-separated segments are split on `.` and joined with `/` after casing.\n */\n isFile?: boolean\n /**\n * Text prepended before casing is applied.\n */\n prefix?: string\n /**\n * Text appended before casing is applied.\n */\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 *\n * Only splits on dots followed by a letter so that version numbers\n * embedded in operationIds (e.g. `v2025.0`) are kept intact.\n */\nfunction applyToFileParts(text: string, transformPart: (part: string, isLast: boolean) => string): string {\n const parts = text.split(/\\.(?=[a-zA-Z])/)\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 = new Set([\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] as const)\n\n/**\n * Prefixes `word` with `_` when it is a reserved JavaScript/Java identifier or starts with a digit.\n *\n * @example\n * ```ts\n * transformReservedWord('class') // '_class'\n * transformReservedWord('42foo') // '_42foo'\n * transformReservedWord('status') // 'status'\n * ```\n */\nexport function transformReservedWord(word: string): string {\n const firstChar = word.charCodeAt(0)\n if (word && (reservedWords.has(word as 'valueOf') || (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 *\n * @example\n * ```ts\n * isValidVarName('status') // true\n * isValidVarName('class') // false (reserved word)\n * isValidVarName('42foo') // false (starts with digit)\n * ```\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 /**\n * The resolved URL string (Express-style or template literal, depending on context).\n */\n url: string\n /**\n * Extracted path parameters as a key-value map, or `undefined` when the path has none.\n */\n params?: Record<string, string>\n}\n\ntype ObjectOptions = {\n /**\n * Controls whether the `url` is rendered as an Express path or a template literal.\n * @default 'path'\n */\n type?: 'path' | 'template'\n /**\n * Optional transform applied to each extracted parameter name.\n */\n replacer?: (pathParam: string) => string\n /**\n * When `true`, the result is serialized to a string expression instead of a plain object.\n */\n stringify?: boolean\n}\n\n/**\n * Supported identifier casing strategies for path parameters.\n */\ntype PathCasing = 'camelcase'\n\ntype Options = {\n /**\n * Casing strategy applied to path parameter names.\n * @default undefined (original identifier preserved)\n */\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 /**\n * The raw OpenAPI/Swagger path string, e.g. `/pet/{petId}`.\n */\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 *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').URL // '/pet/:petId'\n * ```\n */\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 *\n * @example\n * ```ts\n * new URLPath('https://petstore.swagger.io/v2/pet').isURL // true\n * new URLPath('/pet/{petId}').isURL // false\n * ```\n */\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 *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').object\n * // { url: '/pet/:petId', params: { petId: 'petId' } }\n * ```\n */\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 *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').params // { petId: 'petId' }\n * new URLPath('/pet').params // undefined\n * ```\n */\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 /**\n * Iterates over every `{param}` token in `path`, calling `fn` with the raw token and transformed name.\n */\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 * @example\n * ```ts\n * new URLPath('/pet/{petId}/tag/{tagId}').getParams()\n * // { petId: 'petId', tagId: 'tagId' }\n * ```\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.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').toURLPath() // '/pet/:petId'\n * ```\n */\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: Oas[] = []\n for (const p of pathOrApi) {\n instances.push(await parse(p, { oasClass, enablePaths: false, canBundle: false }))\n }\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubb/oas",
3
- "version": "5.0.0-alpha.3",
3
+ "version": "5.0.0-alpha.30",
4
4
  "description": "OpenAPI Specification (OAS) utilities and helpers for Kubb, providing parsing, normalization, and manipulation of OpenAPI/Swagger schemas.",
5
5
  "keywords": [
6
6
  "openapi",
@@ -52,24 +52,24 @@
52
52
  }
53
53
  ],
54
54
  "dependencies": {
55
- "@kubb/fabric-core": "0.13.3",
56
- "@redocly/openapi-core": "^2.22.1",
55
+ "@kubb/fabric-core": "0.15.1",
56
+ "@redocly/openapi-core": "^2.25.4",
57
57
  "@stoplight/yaml": "^4.3.0",
58
58
  "jsonpointer": "^5.0.1",
59
59
  "oas": "^31.1.2",
60
- "oas-normalize": "^16.0.2",
60
+ "oas-normalize": "^16.0.4",
61
61
  "openapi-types": "^12.1.3",
62
- "remeda": "^2.33.6",
62
+ "remeda": "^2.33.7",
63
63
  "swagger2openapi": "^7.0.8",
64
- "@kubb/ast": "5.0.0-alpha.3",
65
- "@kubb/core": "5.0.0-alpha.3"
64
+ "@kubb/ast": "5.0.0-alpha.30",
65
+ "@kubb/core": "5.0.0-alpha.30"
66
66
  },
67
67
  "devDependencies": {
68
68
  "@types/swagger2openapi": "^7.0.4",
69
69
  "@internals/utils": "0.0.0"
70
70
  },
71
71
  "peerDependencies": {
72
- "@kubb/fabric-core": "0.13.3"
72
+ "@kubb/fabric-core": "0.15.1"
73
73
  },
74
74
  "engines": {
75
75
  "node": ">=22"
package/src/utils.ts CHANGED
@@ -207,7 +207,10 @@ export async function parse(
207
207
  }
208
208
 
209
209
  export async function merge(pathOrApi: Array<string | Document>, { oasClass = Oas }: { oasClass?: typeof Oas } = {}): Promise<Oas> {
210
- const instances = await Promise.all(pathOrApi.map((p) => parse(p, { oasClass, enablePaths: false, canBundle: false })))
210
+ const instances: Oas[] = []
211
+ for (const p of pathOrApi) {
212
+ instances.push(await parse(p, { oasClass, enablePaths: false, canBundle: false }))
213
+ }
211
214
 
212
215
  if (instances.length === 0) {
213
216
  throw new Error('No OAS instances provided for merging.')