{"version":3,"file":"getSchemas-BTCpbjet.cjs","names":["sorted: string[]","sortedSchemas: Record<string, OasTypes.SchemaObject>","schemas: Record<string, OasTypes.SchemaObject>"],"sources":["../src/utils/getSchemaFactory.ts","../src/utils/getSchemas.ts"],"sourcesContent":["import type { Oas, OpenAPIV3, OpenAPIV3_1, SchemaObject } from '@kubb/oas'\nimport { isOpenApiV3_1Document } from '@kubb/oas'\n\n/**\n * Make it possible to narrow down the schema based on a specific version(3 or 3.1)\n */\ntype SchemaResult<TWithRef extends boolean = false> =\n  | {\n      schemaObject?: (TWithRef extends true ? OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject : OpenAPIV3.SchemaObject) & {\n        nullable?: boolean\n        'x-nullable'?: boolean\n      }\n      version: '3.0'\n    }\n  | {\n      schemaObject?: (TWithRef extends true ? OpenAPIV3_1.SchemaObject | OpenAPIV3_1.ReferenceObject : OpenAPIV3_1.SchemaObject) & {\n        nullable?: boolean\n        'x-nullable'?: boolean\n      }\n      version: '3.1'\n    }\n\n/**\n * Creates a factory function that generates a versioned OpenAPI schema result.\n *\n * The returned function accepts an optional schema object and produces a {@link SchemaResult} containing the dereferenced schema and the OpenAPI version ('3.0' or '3.1').\n *\n * @returns A function that takes an optional schema and returns a versioned schema result.\n */\nexport function getSchemaFactory<TWithRef extends boolean = false>(oas: Oas): (schema?: SchemaObject) => SchemaResult<TWithRef> {\n  return (schema?: SchemaObject) => {\n    const version = isOpenApiV3_1Document(oas.api) ? '3.1' : '3.0'\n\n    return {\n      schemaObject: oas.dereferenceWithRef(schema),\n      version,\n    } as SchemaResult<TWithRef>\n  }\n}\n","import type { contentType, Oas, OasTypes } from '@kubb/oas'\n\ntype Mode = 'schemas' | 'responses' | 'requestBodies'\n\ntype GetSchemasProps = {\n  oas: Oas\n  contentType?: contentType\n  includes?: Mode[]\n}\n\n/**\n * Collect all schema $ref dependencies recursively.\n */\nfunction 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 */\nfunction sortSchemas(schemas: Record<string, OasTypes.SchemaObject>): Record<string, OasTypes.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, OasTypes.SchemaObject> = {}\n  for (const name of sorted) {\n    sortedSchemas[name] = schemas[name]!\n  }\n  return sortedSchemas\n}\n\n/**\n * Collect schemas from OpenAPI components (schemas, responses, requestBodies)\n * and return them in dependency order.\n */\nexport function getSchemas({ oas, contentType, includes = ['schemas', 'requestBodies', 'responses'] }: GetSchemasProps): Record<string, OasTypes.SchemaObject> {\n  const components = oas.getDefinition().components\n  let schemas: Record<string, OasTypes.SchemaObject> = {}\n\n  if (includes.includes('schemas')) {\n    schemas = {\n      ...schemas,\n      ...((components?.schemas as Record<string, OasTypes.SchemaObject>) || {}),\n    }\n  }\n\n  if (includes.includes('responses')) {\n    const responses = components?.responses || {}\n    for (const [name, response] of Object.entries(responses)) {\n      const r = response as OasTypes.ResponseObject\n      if (r.content && !schemas[name]) {\n        const firstContentType = Object.keys(r.content)[0] || 'application/json'\n        schemas[name] = r.content?.[contentType || firstContentType]?.schema as OasTypes.SchemaObject\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 r = request as OasTypes.RequestBodyObject\n      if (r.content && !schemas[name]) {\n        const firstContentType = Object.keys(r.content)[0] || 'application/json'\n        schemas[name] = r.content?.[contentType || firstContentType]?.schema as OasTypes.SchemaObject\n      }\n    }\n  }\n\n  return sortSchemas(schemas)\n}\n"],"mappings":";;;;;;;;;;;AA6BA,SAAgB,iBAAmD,KAA6D;AAC9H,SAAQ,WAA0B;EAChC,MAAM,gDAAgC,IAAI,IAAI,GAAG,QAAQ;AAEzD,SAAO;GACL,cAAc,IAAI,mBAAmB,OAAO;GAC5C;GACD;;;;;;;;;ACvBL,SAAS,YAAY,QAAiB,uBAAO,IAAI,KAAa,EAAe;AAC3E,KAAI,MAAM,QAAQ,OAAO,EAAE;AACzB,OAAK,MAAM,QAAQ,OACjB,aAAY,MAAM,KAAK;AAEzB,SAAO;;AAGT,KAAI,UAAU,OAAO,WAAW,SAC9B,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,CAC/C,KAAI,QAAQ,UAAU,OAAO,UAAU,UAAU;EAC/C,MAAM,QAAQ,MAAM,MAAM,iCAAiC;AAC3D,MAAI,MACF,MAAK,IAAI,MAAM,GAAI;OAGrB,aAAY,OAAO,KAAK;AAK9B,QAAO;;;;;AAMT,SAAS,YAAY,SAAuF;CAC1G,MAAM,uBAAO,IAAI,KAAuB;AAExC,MAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,QAAQ,CAClD,MAAK,IAAI,MAAM,MAAM,KAAK,YAAY,OAAO,CAAC,CAAC;CAGjD,MAAMA,SAAmB,EAAE;CAC3B,MAAM,0BAAU,IAAI,KAAa;CAEjC,SAAS,MAAM,MAAc,wBAAQ,IAAI,KAAa,EAAE;AACtD,MAAI,QAAQ,IAAI,KAAK,CACnB;AAEF,MAAI,MAAM,IAAI,KAAK,CACjB;AAEF,QAAM,IAAI,KAAK;EACf,MAAM,WAAW,KAAK,IAAI,KAAK,IAAI,EAAE;AACrC,OAAK,MAAM,SAAS,SAClB,KAAI,KAAK,IAAI,MAAM,CACjB,OAAM,OAAO,MAAM;AAGvB,QAAM,OAAO,KAAK;AAClB,UAAQ,IAAI,KAAK;AACjB,SAAO,KAAK,KAAK;;AAGnB,MAAK,MAAM,QAAQ,OAAO,KAAK,QAAQ,CACrC,OAAM,KAAK;CAGb,MAAMC,gBAAuD,EAAE;AAC/D,MAAK,MAAM,QAAQ,OACjB,eAAc,QAAQ,QAAQ;AAEhC,QAAO;;;;;;AAOT,SAAgB,WAAW,EAAE,KAAK,aAAa,WAAW;CAAC;CAAW;CAAiB;CAAY,IAA4D;CAC7J,MAAM,aAAa,IAAI,eAAe,CAAC;CACvC,IAAIC,UAAiD,EAAE;AAEvD,KAAI,SAAS,SAAS,UAAU,CAC9B,WAAU;EACR,GAAG;EACH,GAAK,YAAY,WAAqD,EAAE;EACzE;AAGH,KAAI,SAAS,SAAS,YAAY,EAAE;EAClC,MAAM,YAAY,YAAY,aAAa,EAAE;AAC7C,OAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,UAAU,EAAE;GACxD,MAAM,IAAI;AACV,OAAI,EAAE,WAAW,CAAC,QAAQ,OAAO;IAC/B,MAAM,mBAAmB,OAAO,KAAK,EAAE,QAAQ,CAAC,MAAM;AACtD,YAAQ,QAAQ,EAAE,UAAU,eAAe,mBAAmB;;;;AAKpE,KAAI,SAAS,SAAS,gBAAgB,EAAE;EACtC,MAAM,gBAAgB,YAAY,iBAAiB,EAAE;AACrD,OAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,cAAc,EAAE;GAC3D,MAAM,IAAI;AACV,OAAI,EAAE,WAAW,CAAC,QAAQ,OAAO;IAC/B,MAAM,mBAAmB,OAAO,KAAK,EAAE,QAAQ,CAAC,MAAM;AACtD,YAAQ,QAAQ,EAAE,UAAU,eAAe,mBAAmB;;;;AAKpE,QAAO,YAAY,QAAQ"}