{"version":3,"sources":["/Users/erunion/code/readme/oas/packages/oas/dist/chunk-YFZN44KB.cjs","../src/lib/urls.ts","../src/lib/get-user-variable.ts","../src/operation/lib/dedupe-common-parameters.ts","../src/samples/index.ts","../src/samples/utils.ts","../src/operation/lib/get-mediatype-examples.ts","../src/operation/lib/get-response-examples.ts","../src/operation/lib/get-callback-examples.ts","../src/operation/lib/get-example-groups.ts","../src/operation/lib/get-requestbody-examples.ts","../src/operation/lib/operationId.ts","../src/operation/transformers/get-response-as-json-schema.ts","../src/operation/index.ts"],"names":[],"mappings":"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","file":"/Users/erunion/code/readme/oas/packages/oas/dist/chunk-YFZN44KB.cjs","sourcesContent":[null,"import type { HttpMethods, PathsObject, ServerObject, ServerVariable, ServerVariablesObject, User } from '../types';\nimport type { Match, ParamData } from 'path-to-regexp';\n\nimport { match, pathToRegexp } from 'path-to-regexp';\n\nimport { SERVER_VARIABLE_REGEX } from '../utils';\n\nimport getUserVariable from './get-user-variable';\n\nexport interface PathMatch {\n  match?: Match<ParamData>;\n  operation: PathsObject;\n  url: {\n    method?: HttpMethods;\n    nonNormalizedPath: string;\n    origin: string;\n    path: string;\n    slugs: Record<string, string>;\n  };\n}\n\nexport type PathMatches = PathMatch[];\n\nexport type SplitUrlResult = (\n  | {\n      /**\n       * A unique key, where the `value` is concatenated to its index\n       */\n      key: string;\n      type: 'text';\n      value: string;\n    }\n  | {\n      /**\n       * An optional description for the server variable.\n       *\n       * @see {@link https://spec.openapis.org/oas/v3.1.0#fixed-fields-4}\n       */\n      description?: string;\n\n      /**\n       * An enumeration of string values to be used if the substitution options are from a limited set.\n       *\n       * @see {@link https://spec.openapis.org/oas/v3.1.0#fixed-fields-4}\n       */\n      enum?: string[];\n\n      /**\n       * A unique key, where the `value` is concatenated to its index\n       */\n      key: string;\n      type: 'variable';\n      value: string;\n    }\n)[];\n\nexport function stripTrailingSlash(url: string): string {\n  if (url[url.length - 1] === '/') {\n    return url.slice(0, -1);\n  }\n\n  return url;\n}\n\nfunction ensureProtocol(url: string) {\n  // Add protocol to urls starting with // e.g. //example.com\n  // This is because httpsnippet throws a HARError when it doesnt have a protocol\n  if (url.match(/^\\/\\//)) {\n    return `https:${url}`;\n  }\n\n  // Add protocol to urls with no // within them\n  // This is because httpsnippet throws a HARError when it doesnt have a protocol\n  if (!url.match(/\\/\\//)) {\n    return `https://${url}`;\n  }\n\n  return url;\n}\n\n/**\n * Normalize an OpenAPI server URL by ensuring that it has a proper HTTP protocol and doesn't have a\n * trailing slash. If the selected server is unavailable or doesn't define a URL, fall back to\n * `https://example.com` so callers always receive an inert absolute URL.\n *\n * @param servers Server objects to choose from.\n * @param selected The index of the server object that we want to normalize.\n */\nexport function normalizedURLFromServers(servers: ServerObject[] | undefined, selected: number): string {\n  const exampleDotCom = 'https://example.com';\n  let url: string | undefined;\n  try {\n    url = servers?.[selected]?.url;\n    // This is to catch the case where servers = [{}]\n    if (!url) throw new Error('no url');\n\n    // Stripping the '/' off the end\n    url = stripTrailingSlash(url);\n\n    // Check if the URL is just a path a missing an origin, for example `/api/v3`. If so, then make\n    // `example.com` the origin to avoid it becoming something invalid like `https:///api/v3`.\n    // RM-1044\n    if (url.startsWith('/') && !url.startsWith('//')) {\n      const urlWithOrigin = new URL(exampleDotCom);\n      urlWithOrigin.pathname = url;\n      url = urlWithOrigin.href;\n    }\n  } catch {\n    url = exampleDotCom;\n  }\n\n  return ensureProtocol(url);\n}\n\nexport function variablesFromServers(servers: ServerObject[] | undefined, selected = 0): ServerVariablesObject {\n  return servers?.[selected]?.variables || {};\n}\n\nexport function defaultVariablesFromServers(\n  servers: ServerObject[] | undefined,\n  selected = 0,\n  user: User = {},\n): ServerVariable {\n  const variables = variablesFromServers(servers, selected);\n  const defaults: ServerVariable = {};\n\n  Object.keys(variables).forEach(key => {\n    defaults[key] = getUserVariable(user, key) || variables[key].default || '';\n  });\n\n  return defaults;\n}\n\nexport function splitUrlFromServers(servers: ServerObject[] | undefined, selected = 0): SplitUrlResult {\n  const url = normalizedURLFromServers(servers, selected);\n  const variables = variablesFromServers(servers, selected);\n\n  return url\n    .split(/({.+?})/)\n    .filter(Boolean)\n    .map((part, i) => {\n      const isVariable = part.match(/[{}]/);\n      const value = part.replace(/[{}]/g, '');\n      const key = `${value}-${i}`;\n\n      if (!isVariable) {\n        return {\n          type: 'text',\n          value,\n          key,\n        } as const;\n      }\n\n      const variable = variables?.[value];\n      return {\n        type: 'variable',\n        value,\n        key,\n        description: variable?.description,\n        enum: variable?.enum,\n      } as const;\n    });\n}\n\n/**\n * With a URL that may contain server variables, transform those server variables into regex that\n * we can query against.\n *\n * For example, when given `https://{region}.node.example.com/v14` this will return back:\n *\n *    https://([-_a-zA-Z0-9:.[\\\\]]+).node.example.com/v14\n *\n * @param url URL to transform\n */\nexport function transformURLIntoRegex(url: string): string {\n  return stripTrailingSlash(url.replace(SERVER_VARIABLE_REGEX, '([-_a-zA-Z0-9:.[\\\\]]+)'));\n}\n\n/**\n * Normalize a path so that we can use it with `path-to-regexp` to do operation lookups.\n *\n * @param path Path to normalize.\n */\nfunction normalizePath(path: string) {\n  return (\n    path\n      // This regex transforms `{pathParam}` into `:pathParam` so we can regex against it. We're\n      // also handling quirks here like if there's an optional proceeding or trailing curly bracket\n      // (`{{pathParam}` or `{pathParam}}`) as any unescaped curlys, which would be present in\n      // `:pathParam}`, will throw a regex exception.\n      // oxlint-disable-next-line no-unused-vars\n      .replace(/({?){(.*?)}(}?)/g, (str, ...args) => {\n        // If a path contains a path parameter with hyphens, like `:dlc-release`, when it's regexd\n        // with `path-to-regexp` it match against the `:dlc` portion of the parameter, breaking all\n        // matching against the full path.\n        //\n        // For example on `/games/:game/dlc/:dlc-release` the regex that's actually used to search\n        // against a path like `/games/destiny-2/dlc/witch-queen` is the following:\n        //    /^\\/games(?:\\/([^\\/#\\?]+?))\\/dlc(?:\\/([^\\/#\\?]+?))-release[\\/#\\?]?$/i\n        //\n        // However if `:dlc-release` is rewritten to `:dlcrelease` we end up with a functional\n        // regex: /^\\/games(?:\\/([^\\/#\\?]+?))\\/dlc(?:\\/([^\\/#\\?]+?))[\\/#\\?]?$/i.\n        return `:${args[1].replace('-', '')}`;\n      })\n\n      // In addition to transforming `{pathParam}` into `:pathParam` we also need to escape cases\n      // where a non-variabled colon is next to a variabled-colon because if we don't then\n      // `path-to-regexp` won't be able to correct identify where the variable starts.\n      //\n      // For example if the URL is `/post/:param1::param2` we'll be escaping it to\n      // `/post/:param1\\::param2`.\n      .replace(/::/, '\\\\::')\n\n      // We also need to escape question marks too because they're treated as regex modifiers.\n      .split('?')[0]\n  );\n}\n\n/**\n * Generate path matches for a given path and origin on a set of OpenAPI path objects.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#paths-object}\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#paths-object}\n * @param paths The OpenAPI Paths Object to process.\n * @param pathName Path to look for a match.\n * @param origin The origin that we're matching against.\n */\nexport function generatePathMatches(paths: PathsObject, pathName: string, origin: string): PathMatches {\n  const prunedPathName = pathName.split('?')[0];\n  const matches: PathMatches = Object.keys(paths)\n    .map(path => {\n      const cleanedPath = normalizePath(path);\n\n      let matchResult: PathMatch['match'];\n      try {\n        const matchStatement = match(cleanedPath, { decode: decodeURIComponent });\n        matchResult = matchStatement(prunedPathName);\n      } catch {\n        // If path matching fails for whatever reason (maybe they have a malformed path parameter)\n        // then we shouldn't also fail.\n        return false;\n      }\n\n      const slugs: Record<string, string> = {};\n\n      if (matchResult && Object.keys(matchResult.params).length) {\n        Object.keys(matchResult.params).forEach(param => {\n          slugs[`:${param}`] = (matchResult.params as Record<string, string>)[param];\n        });\n      }\n\n      return {\n        url: {\n          origin,\n          path: cleanedPath.replace(/\\\\::/, '::'),\n          nonNormalizedPath: path,\n          slugs,\n        },\n        operation: paths[path] as PathsObject,\n        match: matchResult,\n      } satisfies PathMatch;\n    })\n    .filter(item => item !== false);\n\n  return matches.filter(p => p.match);\n}\n\n/**\n * @param pathMatches Array of path matches to filter down.\n * @param targetMethod HTTP method to look for.\n * @returns Filtered down path matches.\n */\nexport function filterPathMethods(pathMatches: PathMatches, targetMethod: HttpMethods): PathMatch[] {\n  const regExp = pathToRegexp(targetMethod);\n  return pathMatches\n    .map(p => {\n      const captures = Object.keys(p.operation).filter(r => regExp.regexp.exec(r));\n\n      if (captures.length) {\n        const method = captures[0];\n        p.url.method = method.toUpperCase() as HttpMethods;\n\n        return {\n          url: p.url,\n          operation: p.operation[method],\n        };\n      }\n\n      return false;\n    })\n    .filter((item): item is PathMatch => Boolean(item));\n}\n\n/**\n * @param pathMatches URL and PathsObject matches to narrow down to find a target path.\n * @returns An object containing matches that were discovered in the API definition.\n */\nexport function findTargetPath(pathMatches: PathMatch[]): PathMatch | undefined {\n  if (!pathMatches.length) {\n    return undefined;\n  }\n\n  let minCount = Object.keys(pathMatches[0].url.slugs).length;\n  let found: PathMatch | undefined;\n\n  for (let m = 0; m < pathMatches.length; m += 1) {\n    const selection = pathMatches[m];\n    const paramCount = Object.keys(selection.url.slugs).length;\n    if (paramCount <= minCount) {\n      minCount = paramCount;\n      found = selection;\n    }\n  }\n\n  return found;\n}\n","import type { User } from '../types.js';\n\n/**\n * Retrieve a user variable off of a given user.\n *\n * @see {@link https://docs.readme.com/docs/passing-data-to-jwt}\n * @param user The user to get a user variable for.\n * @param property The name of the variable to retrieve.\n * @param selectedApp The user app to retrieve an auth key for.\n */\nexport default function getUserVariable(user: User, property: string, selectedApp?: number | string): unknown {\n  let key: User | undefined = user;\n\n  if ('keys' in user && Array.isArray(user.keys) && user.keys.length) {\n    if (selectedApp) {\n      key = user.keys.find(k => k.name === selectedApp);\n    } else {\n      key = user.keys[0];\n    }\n  }\n\n  return key?.[property] || user[property] || null;\n}\n","import type { ParameterObject } from '../../types.js';\n\nimport { isRef } from '../../types.js';\n\n/**\n * With an array of common parameters filter down them to what isn't already present in a list of\n * non-common parameters.\n *\n * @param parameters Array of parameters defined at the operation level.\n * @param commonParameters Array of **common** parameters defined at the path item level.\n */\nexport function dedupeCommonParameters(\n  parameters: ParameterObject[],\n  commonParameters: ParameterObject[],\n): ParameterObject[] {\n  return commonParameters.filter((param: ParameterObject) => {\n    return !parameters.find((param2: ParameterObject) => {\n      if (param.name && param2.name) {\n        return param.name === param2.name && param.in === param2.in;\n      } else if (isRef(param) && isRef(param2)) {\n        return param.$ref === param2.$ref;\n      }\n\n      return false;\n    });\n  });\n}\n","/**\n * This file has been extracted and modified from Swagger UI.\n *\n * @license Apache-2.0\n * @see {@link https://github.com/swagger-api/swagger-ui/blob/master/src/core/plugins/samples/fn.js}\n */\nimport type { OASDocument, SchemaObject } from '../types.js';\n\nimport mergeJSONSchemaAllOf from 'json-schema-merge-allof';\n\nimport { isRef } from '../types.js';\nimport { dereferenceRef, dereferenceRefDeep } from '../utils.js';\n\nimport { isFunc, normalizeArray, objectify, usesPolymorphism } from './utils.js';\n\nconst sampleDefaults = (genericSample: boolean | number | string) => {\n  return (schema: SchemaObject): typeof genericSample =>\n    typeof schema.default === typeof genericSample ? schema.default : genericSample;\n};\n\nconst primitives: Record<string, (arg: SchemaObject) => boolean | number | string> = {\n  string: sampleDefaults('string'),\n  string_email: sampleDefaults('user@example.com'),\n  'string_date-time': sampleDefaults(new Date().toISOString()),\n  string_date: sampleDefaults(new Date().toISOString().substring(0, 10)),\n  'string_YYYY-MM-DD': sampleDefaults(new Date().toISOString().substring(0, 10)),\n  string_uuid: sampleDefaults('3fa85f64-5717-4562-b3fc-2c963f66afa6'),\n  string_hostname: sampleDefaults('example.com'),\n  string_ipv4: sampleDefaults('198.51.100.42'),\n  string_ipv6: sampleDefaults('2001:0db8:5b96:0000:0000:426f:8e17:642a'),\n  number: sampleDefaults(0),\n  number_float: sampleDefaults(0.0),\n  integer: sampleDefaults(0),\n  boolean: sampleDefaults(true),\n};\n\nconst primitive = (schema: SchemaObject) => {\n  const objectifiedSchema = objectify(schema);\n  const { format } = objectifiedSchema;\n  let { type } = objectifiedSchema;\n\n  if (type === 'null') {\n    return null;\n  } else if (Array.isArray(type)) {\n    if (type.length === 1) {\n      type = type[0];\n    } else {\n      // If one of our types is `null` then we should generate a sample for the non-null value.\n      if (type.includes('null')) {\n        type = type.filter(t => t !== 'null');\n      }\n\n      type = type.shift();\n    }\n  }\n\n  // @todo add support for if `type` is an array\n  const fn = primitives[`${type}_${format}`] || primitives[type as string];\n  if (isFunc(fn)) {\n    return fn(objectifiedSchema);\n  }\n\n  return `Unknown Type: ${objectifiedSchema.type}`;\n};\n\n/**\n * Generate a piece of sample data from a JSON Schema object. If `example` declarations are present\n * they will be utilized, but generally this will generate fake data for the information present in\n * the schema.\n *\n * @param schema JSON Schema to generate a sample for.\n */\nexport default function sampleFromSchema(\n  schema: SchemaObject,\n  opts: {\n    /**\n     * An OpenAPI definition to use when resolving `$ref` pointers.\n     */\n    definition?: OASDocument;\n\n    /**\n     * If you wish to include data that's flagged as `readOnly`.\n     */\n    includeReadOnly?: boolean;\n\n    /**\n     * If you wish to include data that's flatted as `writeOnly`.\n     */\n    includeWriteOnly?: boolean;\n\n    /**\n     * Collection of `$ref` pointers to keep track of when dereferencing schemas here in order to\n     * prevent infinite loops on circular references\n     */\n    seenRefs?: Set<string>;\n  } = {},\n): Record<string, unknown> | unknown[] | boolean | number | string | null | undefined {\n  const seenRefs = opts.seenRefs || new Set<string>();\n  let objectifySchema = objectify(schema);\n\n  // If this is a `$ref` pointer we should make an attempt to resolve it so we can generate a full\n  // sample for this schema.\n  let refToRelease: string | undefined;\n  if (opts.definition && isRef(objectifySchema)) {\n    refToRelease = objectifySchema.$ref;\n    if (seenRefs.has(refToRelease)) {\n      return undefined;\n    }\n\n    objectifySchema = dereferenceRef(objectifySchema, opts.definition, seenRefs);\n    if (!objectifySchema || isRef(objectifySchema)) {\n      return undefined;\n    }\n  }\n\n  try {\n    return sampleFromResolvedSchema(objectifySchema, opts, seenRefs);\n  } finally {\n    // In order to support generating samples from schemas that have circular references we're\n    // releasing our `$ref` from the `seenRefs` store here so, it's re-used again in another\n    // top-level property we're processing, we can generated another sample for it.\n    if (refToRelease) {\n      seenRefs.delete(refToRelease);\n    }\n  }\n}\n\nfunction sampleFromResolvedSchema(\n  schema: Record<string, any>,\n  opts: {\n    definition?: OASDocument;\n    includeReadOnly?: boolean;\n    includeWriteOnly?: boolean;\n    seenRefs?: Set<string>;\n  },\n  seenRefs: Set<string>,\n) {\n  let { type } = schema;\n  const { example, additionalProperties, properties, items } = schema;\n  const { includeReadOnly, includeWriteOnly } = opts;\n\n  if (example !== undefined) {\n    // Schema-level examples are explicit authored data, so they should win before we try to merge\n    // polymorphic schemas. Merged allOf schemas can retain a `$ref` alongside sibling metadata,\n    // which would otherwise be dereferenced as a plain ref and drop this example.\n    return dereferenceRefDeep(example, opts.definition, seenRefs);\n  }\n\n  const hasPolymorphism = usesPolymorphism(schema);\n  if (hasPolymorphism === 'allOf') {\n    try {\n      const definition = opts.definition;\n      const resolvedAllOf = schema.allOf.map((subSchema: SchemaObject) => {\n        let sub = objectify(subSchema);\n        if (definition && isRef(sub)) {\n          // We need to dereference `$ref` pointers before mmerging our schemas together because\n          // `json-schema-merge-allof` does not support `$ref` resolutions.\n          const resolved = dereferenceRef(sub, definition, new Set<string>());\n          if (resolved && !isRef(resolved)) {\n            sub = resolved as SchemaObject;\n          }\n        }\n\n        return sub;\n      });\n\n      return sampleFromSchema(\n        mergeJSONSchemaAllOf(\n          { ...schema, allOf: resolvedAllOf },\n          {\n            resolvers: {\n              // Ignore any unrecognized OAS-specific keywords that might be present on the schema\n              // (like `xml`).\n              defaultResolver: mergeJSONSchemaAllOf.options.resolvers.title,\n            },\n          },\n        ),\n        {\n          ...opts,\n          seenRefs,\n        },\n      );\n    } catch {\n      return;\n    }\n  } else if (hasPolymorphism) {\n    const samples = (schema[hasPolymorphism] as SchemaObject[]).map(s => {\n      return sampleFromSchema(s, { ...opts, seenRefs });\n    });\n\n    if (samples.length === 1) {\n      return samples[0];\n    } else if (samples.some(s => s === null)) {\n      // If one of our samples is null then we should try to surface the first non-null one.\n      return samples.find(s => s !== null);\n    }\n\n    // If we still don't have a sample then we should just return whatever the first sample we've\n    // got is. The sample might not be a _full_ example but it should be enough to act as a sample.\n    return samples[0];\n  }\n\n  if (!type) {\n    if (properties || additionalProperties) {\n      type = 'object';\n    } else if (items) {\n      type = 'array';\n    } else {\n      return;\n    }\n  }\n\n  if (type === 'object' || (Array.isArray(type) && type.includes('object'))) {\n    const props = objectify(properties);\n    const obj: Record<string, any> = {};\n    for (const name in props) {\n      if (props?.[name].deprecated) {\n        continue;\n      }\n\n      if (props?.[name].readOnly && !includeReadOnly) {\n        continue;\n      }\n\n      if (props?.[name].writeOnly && !includeWriteOnly) {\n        continue;\n      }\n\n      if (props[name].examples?.length) {\n        obj[name] = props[name].examples[0];\n        continue;\n      }\n\n      obj[name] = sampleFromSchema(props[name], { ...opts, seenRefs });\n    }\n\n    if (additionalProperties === true) {\n      obj.additionalProp = {};\n    } else if (additionalProperties) {\n      const additionalProps = objectify(additionalProperties);\n      const additionalPropVal = sampleFromSchema(additionalProps, { ...opts, seenRefs });\n\n      obj.additionalProp = additionalPropVal;\n    }\n\n    return obj;\n  }\n\n  if (type === 'array' || (Array.isArray(type) && type.includes('array'))) {\n    // `items` should always be present on arrays, but if it isn't we should at least do our best\n    // to support its absence.\n    if (typeof items === 'undefined') {\n      return [];\n    }\n\n    if (Array.isArray(items.anyOf)) {\n      return items.anyOf.map((i: SchemaObject) =>\n        sampleFromSchema(i, {\n          ...opts,\n          seenRefs,\n        }),\n      );\n    }\n\n    if (Array.isArray(items.oneOf)) {\n      return items.oneOf.map((i: SchemaObject) =>\n        sampleFromSchema(i, {\n          ...opts,\n          seenRefs,\n        }),\n      );\n    }\n\n    return [sampleFromSchema(items, { ...opts, seenRefs })];\n  }\n\n  if (schema.enum) {\n    if (schema.default) {\n      return schema.default;\n    }\n\n    return normalizeArray(schema.enum as string[])[0];\n  }\n\n  if (type === 'file') {\n    return;\n  }\n\n  return primitive(schema);\n}\n","/**\n * Portions of this file have been extracted and modified from Swagger UI.\n *\n * @license Apache-2.0\n * @see {@link https://github.com/swagger-api/swagger-ui/blob/master/src/core/utils.js}\n */\nimport type { SchemaObject } from '../types.js';\n\nimport { isObject } from '../lib/helpers.js';\n\nexport function usesPolymorphism(schema: SchemaObject): 'allOf' | 'anyOf' | 'oneOf' | false {\n  if (schema.oneOf) {\n    return 'oneOf';\n  } else if (schema.anyOf) {\n    return 'anyOf';\n  } else if (schema.allOf) {\n    return 'allOf';\n  }\n\n  return false;\n}\n\nexport function objectify(thing: Record<string, unknown> | unknown): Record<string, any> {\n  if (!isObject(thing)) {\n    return {};\n  }\n\n  return thing;\n}\n\nexport function normalizeArray(arr: (number | string)[] | number | string): (number | string)[] {\n  if (Array.isArray(arr)) {\n    return arr;\n  }\n\n  return [arr];\n}\n\n// oxlint-disable-next-line typescript/no-unsafe-function-type -- This is part of a type guard.\nexport function isFunc(thing: unknown): thing is Function {\n  return typeof thing === 'function';\n}\n","import type { MediaTypeObject, OASDocument } from '../../types.js';\n\nimport matchesMimeType from '../../lib/matches-mimetype.js';\nimport { collectRefsInSchema, dereferenceRef, dereferenceRefDeep } from '../../lib/refs.js';\nimport sampleFromSchema from '../../samples/index.js';\nimport { isRef } from '../../types.js';\n\nexport interface MediaTypeExample {\n  description?: string;\n  summary?: string;\n  title?: string;\n  value: unknown;\n}\n\n/**\n * Extracts a collection of examples from an OpenAPI Media Type Object. The example will either\n * come from the `example` property, the first item in an `examples` array, or if none of those are\n * present it will generate an example based off its schema.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#media-type-object}\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object}\n * @param mediaType The media type that we're looking for examples for.\n * @param mediaTypeObject The media type object that we're looking for examples for.\n */\nexport function getMediaTypeExamples(\n  mediaType: string,\n  mediaTypeObject: MediaTypeObject,\n  definition: OASDocument,\n  opts: {\n    /**\n     * If you wish to include data that's flagged as `readOnly`.\n     */\n    includeReadOnly?: boolean;\n\n    /**\n     * If you wish to include data that's flatted as `writeOnly`.\n     */\n    includeWriteOnly?: boolean;\n  } = {},\n): MediaTypeExample[] {\n  if (mediaTypeObject.example) {\n    mediaTypeObject.example = dereferenceRefDeep(mediaTypeObject.example, definition);\n\n    // If there is no example or if it contains any `$ref` pointers that we couldn't resolve then\n    // we shouldn't return anything because to the user it'll look like we generated an invalid\n    // example.\n    if (mediaTypeObject.example === undefined || collectRefsInSchema(mediaTypeObject.example).size > 0) {\n      return [];\n    }\n\n    return [\n      {\n        value: mediaTypeObject.example,\n      },\n    ];\n  } else if (mediaTypeObject.examples) {\n    const { examples } = mediaTypeObject;\n    const multipleExamples = Object.keys(examples)\n      .map(key => {\n        let summary: string | undefined = key;\n        let description: string | undefined;\n\n        let example = examples[key];\n        if (example !== null && typeof example === 'object') {\n          if (isRef(example)) {\n            example = dereferenceRef(example, definition);\n            if (!example || isRef(example)) {\n              return false;\n            }\n          }\n\n          if ('summary' in example) {\n            summary = example.summary;\n          }\n\n          if ('description' in example) {\n            description = example.description;\n          }\n\n          if ('value' in example) {\n            example.value = dereferenceRefDeep(example.value, definition);\n\n            // If there is no example value or if it contains any `$ref` pointers that we couldn't\n            // resolve then we shouldn't return anything because to the user it'll look like we\n            // generated an invalid example.\n            if (example.value === undefined || collectRefsInSchema(example.value).size > 0) {\n              return false;\n            }\n\n            example = example.value;\n          }\n        }\n\n        const ret: MediaTypeExample = { summary, title: key, value: example };\n        if (description) {\n          ret.description = description;\n        }\n\n        return ret;\n      })\n      .filter((item): item is MediaTypeExample => item !== false);\n\n    // If we were able to grab examples from the `examples` property return them (`examples` can\n    // sometimes be an empty object), otherwise we should try to generate some instead.\n    if (multipleExamples.length) {\n      return multipleExamples;\n    }\n  }\n\n  if (mediaTypeObject.schema) {\n    // We do not fully support XML so we shouldn't generate XML samples for XML schemas.\n    if (!matchesMimeType.xml(mediaType)) {\n      return [\n        {\n          value: sampleFromSchema(structuredClone(mediaTypeObject.schema), {\n            ...opts,\n            definition,\n          }),\n        },\n      ];\n    }\n  }\n\n  return [];\n}\n","import type { OASDocument, OperationObject } from '../../types.js';\nimport type { MediaTypeExample } from './get-mediatype-examples.js';\n\nimport { dereferenceRef } from '../../lib/refs.js';\nimport { isRef } from '../../types.js';\n\nimport { getMediaTypeExamples } from './get-mediatype-examples.js';\n\nexport interface ResponseExample {\n  mediaTypes: Record<string, MediaTypeExample[]>;\n  onlyHeaders?: boolean;\n  status: string;\n}\n\n/**\n * Retrieve a collection of response examples keyed, by their media type.\n *\n * @param operation Operation to retrieve response examples for.\n */\nexport function getResponseExamples(operation: OperationObject, definition: OASDocument): ResponseExample[] {\n  return Object.keys(operation.responses || {})\n    .map(status => {\n      let response = operation.responses?.[status];\n      let onlyHeaders = false;\n\n      if (!response) return false;\n      if (isRef(response)) {\n        response = dereferenceRef(response, definition);\n        if (!response || isRef(response)) return false;\n      }\n\n      const mediaTypes: Record<string, MediaTypeExample[]> = {};\n      (response?.content ? Object.keys(response.content) : []).forEach(mediaType => {\n        if (!mediaType) return;\n\n        const mediaTypeObject = response.content?.[mediaType];\n        if (!mediaTypeObject) return;\n\n        const examples = getMediaTypeExamples(mediaType, mediaTypeObject, definition, {\n          includeReadOnly: true,\n          includeWriteOnly: false,\n        });\n\n        if (examples) {\n          mediaTypes[mediaType] = examples;\n        }\n      });\n\n      // If the response has no content, but has headers, hardcode an empty example so the headers\n      // modal will still display\n      if (response.headers && Object.keys(response.headers).length && !Object.keys(mediaTypes).length) {\n        mediaTypes['*/*'] = [];\n        onlyHeaders = true;\n      }\n\n      if (!Object.keys(mediaTypes).length) {\n        return false;\n      }\n\n      return {\n        status,\n        mediaTypes,\n        ...(onlyHeaders ? { onlyHeaders } : {}),\n      };\n    })\n    .filter((item): item is ResponseExample => item !== false);\n}\n","import type { OASDocument, OperationObject } from '../../types.js';\nimport type { ResponseExample } from './get-response-examples.js';\n\nimport { dereferenceRef } from '../../lib/refs.js';\nimport { isRef } from '../../types.js';\n\nimport { getResponseExamples } from './get-response-examples.js';\n\nexport interface CallbackExample {\n  example: ResponseExample[];\n  expression: string;\n  identifier: string;\n  method: string;\n}\n\n/**\n * With an OpenAPI Operation Object return back a collection of examples for any callbacks that may\n * be present.\n *\n * @param operation Operation to retrieve callback examples from.\n */\nexport function getCallbackExamples(operation: OperationObject, definition: OASDocument): CallbackExample[] {\n  if (!operation.callbacks) {\n    return [];\n  }\n\n  const examples = Object.keys(operation.callbacks).map(identifier => {\n    let callback = operation.callbacks?.[identifier];\n    if (!callback) return [];\n    if (isRef(callback)) {\n      callback = dereferenceRef(callback, definition);\n      if (!callback || isRef(callback)) return [];\n    }\n\n    const items = Object.keys(callback).map(expression => {\n      let callbackPath = callback[expression];\n      if (!callbackPath) return [];\n      if (isRef(callbackPath)) {\n        callbackPath = dereferenceRef(callbackPath, definition);\n        if (!callbackPath || isRef(callbackPath)) return [];\n      }\n\n      return Object.keys(callbackPath).map(method => {\n        if (['servers', 'parameters', 'summary', 'description'].includes(method)) {\n          return false;\n        }\n\n        // This is a `PathItemObject` but `PathItemObject` extends `OperationObject` so this is\n        // fine to force cast.\n        const pathItem = callbackPath as Record<string, OperationObject>;\n        const example = getResponseExamples(pathItem[method], definition);\n        if (!example.length) return false;\n\n        return {\n          identifier,\n          expression,\n          method,\n          example,\n        };\n      });\n    });\n\n    return items.flat().filter(item => item !== false);\n  });\n\n  return examples.flat();\n}\n","import type { Extensions } from '../../extensions.js';\nimport type { DataForHAR } from '../../types.js';\nimport type { Operation } from '../index.js';\nimport type { MediaTypeExample } from './get-mediatype-examples.js';\n\nimport { getExtension } from '../../extensions.js';\nimport { dereferenceRef } from '../../lib/refs.js';\nimport { isRef } from '../../types.js';\n\nexport type ExampleGroups = Record<\n  string,\n  {\n    /**\n     * Array of custom code samples that contain `correspondingExample` key.\n     * Mutually exclusive of `request`. Note that if this object is present,\n     * there may or may not be corresponding responses in the `response` object.\n     */\n    customCodeSamples?: (NonNullable<Extensions['code-samples']>[number] & {\n      /**\n       * The index in the originally defined `code-samples` array\n       */\n      originalIndex: number;\n    })[];\n\n    /**\n     * Title of example group. This is derived from the `summary` field of one of\n     * the operation's example objects. The precedence is as follows (from highest to lowest):\n     * 1. The first custom code sample's `name` field.\n     * 2. The first request parameter (e.g., cookie/header/path/query) example object that\n     *  contains a `summary` field\n     * 3. The request body example object's `summary` field\n     * 4. The response example object's `summary` field\n     *\n     * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#example-object}\n     * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#example-object}\n     */\n    name: string;\n\n    /**\n     * Object containing the example request data for the current example key.\n     * Mutually exclusive of `customCodeSamples`. If `customCodeSamples` is present,\n     * any request example definitions are ignored.\n     */\n    request?: DataForHAR;\n\n    /**\n     * Object containing the example response data for the current example key.\n     */\n    response?: {\n      /**\n       * The content type of the current example\n       *\n       * @example \"application/json\"\n       * @example \"text/plain\"\n       */\n      mediaType: string;\n\n      /**\n       * The entire response example object. The example value itself is contained\n       * within `value`.\n       *\n       * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#example-object}\n       * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#example-object}\n       */\n      mediaTypeExample: MediaTypeExample;\n\n      /**\n       * The HTTP status code for the current response example\n       *\n       * @example \"2xx\"\n       * @example \"400\"\n       */\n      status: string;\n    };\n  }\n>;\n\n/**\n * Internal key to represent custom code samples that do not have a corresponding response example.\n */\nconst noCorrespondingResponseKey = 'NoCorrespondingResponseForCustomCodeSample';\n\n/**\n * Takes a groups object and an operation and adds any matching response examples\n * to existing groups object\n */\nfunction addMatchingResponseExamples(groups: ExampleGroups, operation: Operation) {\n  operation.getResponseExamples().forEach(example => {\n    Object.entries(example.mediaTypes || {}).forEach(([mediaType, mediaTypeExamples]) => {\n      mediaTypeExamples.forEach(mediaTypeExample => {\n        // only add a response example if the `title` field exists\n        // and it matches one of the existing example keys\n        if (mediaTypeExample.title && Object.keys(groups).includes(mediaTypeExample.title)) {\n          groups[mediaTypeExample.title].response = {\n            mediaType,\n            mediaTypeExample,\n            status: example.status,\n          };\n\n          // if the current group doesn't already have a name set,\n          // use the response example object's summary field\n          if (!groups[mediaTypeExample.title].name) {\n            groups[mediaTypeExample.title].name = mediaTypeExample.summary || mediaTypeExample.title;\n          }\n        }\n      });\n    });\n  });\n}\n\n/**\n * Returns a name for the given custom code sample. If there isn't already one defined,\n * we construct a fallback value based on where the sample is in the array.\n */\nfunction getDefaultName(\n  sample: NonNullable<Extensions['code-samples']>[number],\n  count: Record<string, number>,\n): string {\n  return sample.name && sample.name.length > 0\n    ? sample.name\n    : `Default${count[sample.language] > 1 ? ` #${count[sample.language]}` : ''}`;\n}\n\n/**\n * Returns an object with groups of all example definitions (body/header/query/path/response/etc.).\n * The examples are grouped by their key when defined via the `examples` map.\n *\n * Any custom code samples defined via the `x-readme.code-samples` extension are returned,\n * regardless of if they have a matching response example.\n *\n * For standard OAS request parameter (e.g., body/header/query/path/etc.) examples,\n * they are only present in the return object if they have a corresponding response example\n * (i.e., a response example with the same key in the `examples` map).\n */\nexport function getExampleGroups(operation: Operation): ExampleGroups {\n  const namelessCodeSampleCounts: Record<string, number> = {};\n  const groups: ExampleGroups = {};\n\n  // add custom code samples\n  const codeSamples = getExtension('code-samples', operation.api, operation) as Extensions['code-samples'];\n  codeSamples?.forEach((sample, i) => {\n    if (namelessCodeSampleCounts[sample.language]) {\n      namelessCodeSampleCounts[sample.language] += 1;\n    } else {\n      namelessCodeSampleCounts[sample.language] = 1;\n    }\n    const name = getDefaultName(sample, namelessCodeSampleCounts);\n\n    // sample contains `correspondingExample` key\n    if (sample.correspondingExample) {\n      if (groups[sample.correspondingExample]?.customCodeSamples?.length) {\n        groups[sample.correspondingExample].customCodeSamples!.push({ ...sample, name, originalIndex: i });\n      } else if (sample.correspondingExample) {\n        groups[sample.correspondingExample] = {\n          name,\n          customCodeSamples: [{ ...sample, name, originalIndex: i }],\n        };\n      }\n    }\n\n    // sample does not contain a corresponding response example\n    else if (groups[noCorrespondingResponseKey]?.customCodeSamples?.length) {\n      groups[noCorrespondingResponseKey].customCodeSamples.push({ ...sample, name, originalIndex: i });\n    } else {\n      groups[noCorrespondingResponseKey] = {\n        name,\n        customCodeSamples: [{ ...sample, name, originalIndex: i }],\n      };\n    }\n  });\n\n  // if we added any custom code samples, add the corresponding response examples and return\n  if (Object.keys(groups).length) {\n    addMatchingResponseExamples(groups, operation);\n    return groups;\n  }\n\n  // add request param examples\n  operation.getParameters().forEach(param => {\n    Object.entries(param.examples || {}).forEach(([exampleKey, paramExample]) => {\n      let example = paramExample;\n      if (isRef(example)) {\n        example = dereferenceRef(example, operation.api);\n        if (!example || isRef(example)) return;\n      }\n\n      groups[exampleKey] = {\n        ...groups[exampleKey],\n        name: groups[exampleKey]?.name || example.summary || exampleKey,\n        request: {\n          ...groups[exampleKey]?.request,\n          [param.in]: {\n            ...groups[exampleKey]?.request?.[param.in],\n            [param.name]: example.value,\n          },\n        },\n      };\n    });\n  });\n\n  // add request body examples\n  operation.getRequestBodyExamples().forEach(requestExample => {\n    requestExample.examples.forEach((mediaTypeExample: MediaTypeExample) => {\n      if (mediaTypeExample.title) {\n        const mediaType = requestExample.mediaType === 'application/x-www-form-urlencoded' ? 'formData' : 'body';\n        groups[mediaTypeExample.title] = {\n          ...groups[mediaTypeExample.title],\n          name: groups[mediaTypeExample.title]?.name || mediaTypeExample.summary || mediaTypeExample.title,\n          request: {\n            ...groups[mediaTypeExample.title]?.request,\n            [mediaType]: mediaTypeExample.value,\n          },\n        };\n      }\n    });\n  });\n\n  // if we added any request examples, add the corresponding response examples\n  if (Object.keys(groups).length) {\n    addMatchingResponseExamples(groups, operation);\n  }\n\n  // prune any objects that don't have both a request and a response\n  Object.entries(groups).forEach(([groupId, group]) => {\n    if (group.request && !group.response) {\n      delete groups[groupId];\n    }\n  });\n\n  return groups;\n}\n","import type { OASDocument, OperationObject } from '../../types.js';\nimport type { MediaTypeExample } from './get-mediatype-examples.js';\n\nimport { dereferenceRef } from '../../lib/refs.js';\nimport { isRef } from '../../types.js';\n\nimport { getMediaTypeExamples } from './get-mediatype-examples.js';\n\nexport interface RequestBodyExample {\n  examples: MediaTypeExample[];\n  mediaType: string;\n}\n\n/**\n * Retrieve a collection of request body examples, keyed by their media type.\n *\n * @param operation Operation to retrieve requestBody examples for.\n */\nexport function getRequestBodyExamples(operation: OperationObject, definition: OASDocument): RequestBodyExample[] {\n  let requestBody = operation.requestBody;\n  if (!requestBody) {\n    return [];\n  } else if (isRef(requestBody)) {\n    requestBody = dereferenceRef(requestBody, definition);\n  }\n\n  // If this request body still can't be resolved then we shouldn't return anything because it's\n  // either an invalid schema or a circular reference.\n  if (!requestBody || isRef(requestBody) || !requestBody.content) {\n    return [];\n  }\n\n  return Object.keys(requestBody.content || {})\n    .map(mediaType => {\n      const mediaTypeObject = requestBody.content[mediaType];\n      const examples = getMediaTypeExamples(mediaType, mediaTypeObject, definition, {\n        includeReadOnly: false,\n        includeWriteOnly: true,\n      });\n\n      if (!examples.length) {\n        return false;\n      }\n\n      return {\n        mediaType,\n        examples,\n      };\n    })\n    .filter((item): item is RequestBodyExample => item !== false);\n}\n","import type { OperationObject } from '../../types.ts';\n\nexport interface OperationIDGeneratorOptions {\n  /**\n   * Generate a JS method-friendly operation ID when one isn't present.\n   *\n   * For backwards compatiblity reasons this option will be indefinitely supported however we\n   * recommend using `friendlyCase` instead as it's a heavily improved version of this option.\n   *\n   * @see {friendlyCase}\n   * @deprecated\n   */\n  camelCase?: boolean;\n\n  /**\n   * Generate a human-friendly, but still camelCase, operation ID when one isn't present. The\n   * difference between this and `camelCase` is that this also ensure that consecutive words are\n   * not present in the resulting ID. For example, for the endpoint `/candidate/{candidate}` will\n   * return `getCandidateCandidate` for `camelCase` however `friendlyCase` will return\n   * `getCandidate`.\n   *\n   * The reason this friendliness is just not a part of the `camelCase` option is because we have\n   * a number of consumers of the old operation ID style and making that change there would a\n   * breaking change that we don't have any easy way to resolve.\n   */\n  friendlyCase?: boolean;\n}\n\n/**\n * Determine if an operation has an `operationId` present in its schema. Note that if one is\n * present in the schema but is an empty string then this will return false.\n *\n */\nexport function hasOperationId(operation: OperationObject): boolean {\n  return Boolean('operationId' in operation && operation.operationId?.length);\n}\n\n/**\n * Get an `operationId` for an operation. If one is not present (it's not required by the spec!)\n * a hash of the path and method will be returned instead.\n *\n */\nexport function getOperationId(\n  path: string,\n  method: string,\n  operation: OperationObject,\n  opts: OperationIDGeneratorOptions = {},\n): string {\n  function sanitize(id: string) {\n    // We aren't sanitizing underscores here by default in order to preserve operation IDs that\n    // were already generated with this method in the past.\n    return id\n      .replace(opts?.camelCase || opts?.friendlyCase ? /[^a-zA-Z0-9_]/g : /[^a-zA-Z0-9]/g, '-') // Remove weird characters\n      .replace(/--+/g, '-') // Remove double --'s\n      .replace(/^-|-$/g, ''); // Don't start or end with -\n  }\n\n  const operationIdExists = hasOperationId(operation);\n  let operationId: string;\n  if (operationIdExists) {\n    // `operationId` has already been guaranteed to be a truthy string by `hasOperationId()`.\n    operationId = operation.operationId as string;\n  } else {\n    operationId = sanitize(path).toLowerCase();\n  }\n\n  const currMethod = method.toLowerCase();\n  if (opts?.camelCase || opts?.friendlyCase) {\n    if (opts?.friendlyCase) {\n      // In order to generate friendlier operation IDs we should swap out underscores with spaces\n      // so the end result will be _slightly_ more camelCase.\n      operationId = operationId.replaceAll('_', ' ');\n\n      if (!operationIdExists) {\n        // In another effort to generate friendly operation IDs we should prevent words from\n        // appearing in consecutive order (eg. `/candidate/{candidate}` should generate\n        // `getCandidate` not `getCandidateCandidate`). However we only want to do this if we're\n        // generating the operation ID as if they intentionally added a consecutive word into the\n        // operation ID then we should respect that.\n        operationId = operationId\n          .replace(/[^a-zA-Z0-9_]+(.)/g, (_, chr) => ` ${chr}`)\n          .split(' ')\n          .filter((word, i, arr) => word !== arr[i - 1])\n          .join(' ');\n      }\n    }\n\n    operationId = operationId.replace(/[^a-zA-Z0-9_]+(.)/g, (_, chr) => chr.toUpperCase());\n    if (operationIdExists) {\n      operationId = sanitize(operationId);\n    }\n\n    // Never start with a number.\n    operationId = operationId.replace(/^[0-9]/g, match => `_${match}`);\n\n    // Ensure that the first character of an `operationId` is always lowercase.\n    operationId = operationId.charAt(0).toLowerCase() + operationId.slice(1);\n\n    // If the generated `operationId` already starts with the method (eg. `getPets`) we don't want\n    // to double it up into `getGetPets`.\n    if (operationId.startsWith(currMethod)) {\n      return operationId;\n    }\n\n    // If this operation already has an `operationId` and we just cleaned it up then we shouldn't\n    // prefix it with an HTTP method.\n    if (operationIdExists) {\n      return operationId;\n    }\n\n    // Because we're merging the `operationId` into an HTTP method we need to reset the first\n    // character of it back to lowercase so we end up with `getBuster`, not `getbuster`.\n    operationId = operationId.charAt(0).toUpperCase() + operationId.slice(1);\n    return `${currMethod}${operationId}`;\n  } else if (operationIdExists) {\n    return operationId;\n  }\n\n  return `${currMethod}_${operationId}`;\n}\n","import type { toJSONSchemaOptions } from '../../lib/openapi-to-json-schema.js';\nimport type { HeaderObject, MediaTypeObject, OASDocument, ResponseObject, SchemaObject } from '../../types.js';\nimport type { Operation } from '../index.js';\n\nimport { applyDiscriminatorOneOfToUsedSchemas } from '../../lib/build-discriminator-one-of.js';\nimport { cloneObject } from '../../lib/clone-object.js';\nimport { isPrimitive } from '../../lib/helpers.js';\nimport matches from '../../lib/matches-mimetype.js';\nimport { getSchemaVersionString, toJSONSchema } from '../../lib/openapi-to-json-schema.js';\nimport {\n  collectRefsInSchema,\n  dereferenceRef,\n  filterRequiredRefsToReferenced,\n  mergeReferencedSchemasIntoRoot,\n} from '../../lib/refs.js';\nimport { isRef } from '../../types.js';\n\nexport interface ResponseSchemaObject {\n  description?: string;\n  label: string;\n  schema: SchemaObject;\n  type: string[] | string;\n}\n\nconst isJSON = matches.json;\n\n/**\n * Turn a header map from OpenAPI 3.0 (and some earlier versions too) into a schema.\n *\n * Note: This does not support OpenAPI 3.1's header format.\n *\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#header-object}\n * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.3.md#header-object}\n * @param response Response object to build a JSON Schema object for its headers for.\n * @param schemaOptions Optional options to pass to toJSONSchema (e.g. for ref resolution).\n */\nfunction buildHeadersSchema(response: ResponseObject, schemaOptions: toJSONSchemaOptions) {\n  const headersSchema: SchemaObject = {\n    type: 'object',\n    properties: {},\n  };\n\n  const api = schemaOptions.definition;\n  const seenRefs = schemaOptions.seenRefs ?? new Set<string>();\n\n  if (response.headers) {\n    Object.keys(response.headers).forEach(key => {\n      let headerEntry = response.headers?.[key];\n      if (!headerEntry) return;\n      if (isRef(headerEntry)) {\n        headerEntry = dereferenceRef(headerEntry, api, seenRefs);\n        if (!headerEntry || isRef(headerEntry)) return;\n      }\n\n      if (headerEntry.schema) {\n        const header: HeaderObject = headerEntry;\n\n        let headerSchema = header.schema;\n        if (!headerSchema) return;\n        if (isRef(headerSchema)) {\n          headerSchema = dereferenceRef(headerSchema, api, seenRefs);\n          if (!headerSchema || isRef(headerSchema)) return;\n        }\n\n        // TODO: Response headers are essentially parameters in OAS\n        //    This means they can have content instead of schema.\n        //    We should probably support that in the future\n        headersSchema.properties![key] = toJSONSchema(cloneObject(headerSchema), {\n          addEnumsToDescriptions: true,\n          ...schemaOptions,\n        });\n\n        if (header.description) {\n          headersSchema.properties![key].description = header.description;\n        }\n      }\n    });\n  }\n\n  const headersWrapper: {\n    description?: string;\n    label: string;\n    schema: SchemaObject;\n    type: string;\n  } = {\n    schema: headersSchema,\n    type: 'object',\n    label: 'Headers',\n  };\n\n  if (response.description && headersWrapper.schema) {\n    headersWrapper.description = response.description;\n  }\n\n  return headersWrapper;\n}\n\n/**\n * Extract all the response schemas, matching the format of `get-parameters-as-json-schema`.\n *\n * This automatically resolves `$ref` pointers on the fly and attaches used schemas as components\n * within the generated JSON Schema object.\n *\n * @param operation Operation to construct a response JSON Schema for.\n * @param api The OpenAPI definition that this operation originates.\n * @param statusCode The response status code to generate a schema for.\n * @param opts Options for schema generation.\n * @param opts.contentType Optional content-type to use. If specified and the response doesn't have\n *   this content-type, the function will return null.\n */\nexport function getResponseAsJSONSchema(\n  operation: Operation,\n  api: OASDocument,\n  statusCode: number | string,\n  opts?: {\n    includeDiscriminatorMappingRefs?: boolean;\n    /**\n     * Optional content-type to use. If specified and the response doesn't have this content-type,\n     * the function will return null.\n     */\n    contentType?: string;\n  },\n): ResponseSchemaObject[] | null {\n  const response = operation.getResponseByStatusCode(statusCode);\n  const jsonSchema: ResponseSchemaObject[] = [];\n\n  if (!response) {\n    return null;\n  }\n\n  const usedSchemas = new Map<string, SchemaObject>();\n  const seenRefs = new Set<string>();\n  const refsByGroup = new Map<'body' | 'headers', Set<string>>();\n\n  function refLoggerForSchemaGroup(group: 'body' | 'headers'): Set<string> {\n    let set = refsByGroup.get(group);\n    if (!set) {\n      set = new Set();\n      refsByGroup.set(group, set);\n    }\n    return set;\n  }\n\n  const baseSchemaOptions: toJSONSchemaOptions = {\n    addEnumsToDescriptions: true,\n    definition: api,\n    seenRefs,\n    usedSchemas,\n    refLogger: ref => refLoggerForSchemaGroup('body').add(ref),\n  };\n\n  /**\n   * @param content An array of `MediaTypeObject`'s to retrieve a preferred schema out of. We\n   *    prefer JSON media types.\n   * @param preferredContentType Optional content-type to use. If specified and not found, returns null.\n   */\n  function getPreferredSchema(content: Record<string, MediaTypeObject> | undefined, preferredContentType?: string) {\n    if (!content) {\n      return null;\n    }\n\n    const contentTypes = Object.keys(content);\n    if (!contentTypes.length) {\n      return null;\n    }\n\n    // If a specific content-type is requested, use it if it exists\n    if (preferredContentType) {\n      if (contentTypes.includes(preferredContentType)) {\n        const schema = cloneObject(content[preferredContentType].schema);\n        if (!schema) {\n          return null;\n        }\n\n        return toJSONSchema(schema, baseSchemaOptions);\n      }\n\n      // Requested `content-type` not found, return null\n      return null;\n    }\n\n    // Default behavior: prefer JSON media types\n    for (let i = 0; i < contentTypes.length; i++) {\n      if (isJSON(contentTypes[i])) {\n        const schema = cloneObject(content[contentTypes[i]].schema);\n        if (!schema) {\n          return {};\n        }\n\n        return toJSONSchema(schema, baseSchemaOptions);\n      }\n    }\n\n    // We always want to prefer the JSON-compatible content types over everything else but if we\n    // haven't found one we should default to the first available.\n    const contentType = contentTypes.shift();\n    if (!contentType) {\n      return {};\n    }\n\n    const schema = cloneObject(content[contentType].schema);\n    if (!schema) {\n      return {};\n    }\n\n    return toJSONSchema(schema, baseSchemaOptions);\n  }\n\n  const foundSchema = getPreferredSchema(response.content, opts?.contentType);\n\n  // If a specific content-type was requested but not found, return null immediately\n  if (opts?.contentType && !foundSchema) {\n    return null;\n  }\n\n  if (foundSchema) {\n    const schema = structuredClone(foundSchema);\n    let schemaType = foundSchema.type;\n\n    // If our found schema is a `$ref` pointer then we should try to resolve its type so we can\n    // surface that to the root schema as its overall `type`.\n    if (schemaType === undefined && isRef(foundSchema) && usedSchemas.size > 0) {\n      const resolvedSchema = usedSchemas.get(foundSchema.$ref);\n      const resolvedType =\n        resolvedSchema && typeof resolvedSchema === 'object' && 'type' in resolvedSchema\n          ? resolvedSchema.type\n          : undefined;\n\n      schemaType = Array.isArray(resolvedType) ? resolvedType[0] : resolvedType;\n    }\n\n    const schemaWrapper: {\n      description?: string;\n      label: string;\n      schema: SchemaObject;\n      type: string[] | string;\n    } = {\n      // If there's no `type` then the root schema is a circular `$ref` that we likely won't be\n      // able to render so instead of generating a JSON Schema with an `undefined` type we should\n      // default to `string` so there's at least *something* the end-user can interact with.\n      type: schemaType ?? 'string',\n      schema: isPrimitive(schema)\n        ? schema\n        : {\n            ...schema,\n            $schema: getSchemaVersionString(schema, api),\n          },\n      label: 'Response body',\n    };\n\n    if (response.description && schemaWrapper.schema) {\n      schemaWrapper.description = response.description;\n    }\n\n    // Apply discriminator `oneOf` to used schemas.\n    applyDiscriminatorOneOfToUsedSchemas(api, usedSchemas, (ref: string) => {\n      if (usedSchemas.has(ref)) {\n        return usedSchemas.get(ref);\n      }\n\n      try {\n        const resolved = dereferenceRef({ $ref: ref }, api, seenRefs);\n        if (isRef(resolved)) return;\n        const converted = toJSONSchema(structuredClone(resolved), {\n          ...baseSchemaOptions,\n          seenRefs,\n        });\n\n        usedSchemas.set(ref, converted);\n        return converted;\n      } catch {\n        // no-op\n      }\n    });\n\n    // Include only schemas that are still referenced in the output; merge them into the root at their ref paths.\n    if (schemaWrapper.schema && usedSchemas.size > 0) {\n      // Because the `refLogger` does not see every `$ref` that is present in the generated schema\n      // (eg. nested refs inside an `anyOf` branch that was inlined from cache) we need to collect\n      // everything else.\n      const refsInOutput = collectRefsInSchema(schemaWrapper.schema);\n      const refsInGroup = refsByGroup.get('body') ?? new Set<string>();\n      const referencedSchemas = filterRequiredRefsToReferenced(new Set([...refsInGroup, ...refsInOutput]), usedSchemas);\n\n      if (referencedSchemas.size > 0) {\n        mergeReferencedSchemasIntoRoot(schemaWrapper.schema, referencedSchemas);\n      }\n    }\n\n    jsonSchema.push(schemaWrapper);\n  }\n\n  // 3.0.3 and earlier headers. TODO: New format for 3.1.0\n  if (response.headers) {\n    const headersWrapper = buildHeadersSchema(response, {\n      ...baseSchemaOptions,\n      refLogger: ref => refLoggerForSchemaGroup('headers').add(ref),\n    });\n\n    if (headersWrapper.schema && usedSchemas.size > 0) {\n      const refsInGroup = refsByGroup.get('headers') ?? new Set();\n      const refsInOutput = collectRefsInSchema(headersWrapper.schema);\n      const referencedSchemas = filterRequiredRefsToReferenced(new Set([...refsInGroup, ...refsInOutput]), usedSchemas);\n\n      if (referencedSchemas.size > 0) {\n        mergeReferencedSchemasIntoRoot(headersWrapper.schema, referencedSchemas);\n      }\n    }\n\n    jsonSchema.push(headersWrapper);\n  }\n\n  return jsonSchema.length ? jsonSchema : null;\n}\n","import type { Extensions } from '../extensions.js';\nimport type Oas from '../index.js';\nimport type { SplitUrlResult } from '../lib/urls.js';\nimport type {\n  HttpMethods,\n  KeyedSecuritySchemeObject,\n  MediaTypeObject,\n  OAS31Document,\n  OASDocument,\n  OperationObject,\n  ParameterObject,\n  PathItemObject,\n  ReferenceObject,\n  RequestBodyObject,\n  ResponseObject,\n  SchemaWrapper,\n  SecurityRequirementObject,\n  SecuritySchemeObject,\n  SecurityType,\n  ServerObject,\n  ServerVariable,\n  ServerVariablesObject,\n  TagObject,\n} from '../types.js';\nimport type { CallbackExample } from './lib/get-callback-examples.js';\nimport type { ExampleGroups } from './lib/get-example-groups.js';\nimport type { RequestBodyExample } from './lib/get-requestbody-examples.js';\nimport type { ResponseExample } from './lib/get-response-examples.js';\nimport type { OperationIDGeneratorOptions } from './lib/operationId.js';\nimport type { getParametersAsJSONSchemaOptions } from './transformers/get-parameters-as-json-schema.js';\nimport type { ResponseSchemaObject } from './transformers/get-response-as-json-schema.js';\n\nimport matchesMimeType from '../lib/matches-mimetype.js';\nimport { decorateComponentSchemasWithRefName, dereferenceRef } from '../lib/refs.js';\nimport {\n  defaultVariablesFromServers,\n  normalizedURLFromServers,\n  splitUrlFromServers,\n  variablesFromServers,\n} from '../lib/urls.js';\nimport { isRef } from '../types.js';\nimport { supportedMethods } from '../utils.js';\n\nimport { dedupeCommonParameters } from './lib/dedupe-common-parameters.js';\nimport { getCallbackExamples } from './lib/get-callback-examples.js';\nimport { getExampleGroups } from './lib/get-example-groups.js';\nimport { getRequestBodyExamples } from './lib/get-requestbody-examples.js';\nimport { getResponseExamples } from './lib/get-response-examples.js';\nimport { getOperationId, hasOperationId } from './lib/operationId.js';\nimport { getParametersAsJSONSchema } from './transformers/get-parameters-as-json-schema.js';\nimport { getResponseAsJSONSchema } from './transformers/get-response-as-json-schema.js';\n\nexport class Operation {\n  /**\n   * The `Oas` instance that this operation belongs to.\n   */\n  oas: Oas;\n\n  /**\n   * Schema of the operation from the API Definition.\n   */\n  schema: OperationObject;\n\n  /**\n   * OpenAPI API Definition that this operation originated from.\n   */\n  api: OASDocument;\n\n  /**\n   * Path that this operation is targeted towards.\n   */\n  path: string;\n\n  /**\n   * HTTP Method that this operation is targeted towards.\n   */\n  method: HttpMethods;\n\n  /**\n   * The primary Content Type that this operation accepts.\n   */\n  contentType: string | undefined;\n\n  /**\n   * An object with groups of all example definitions (body/header/query/path/response/etc.)\n   */\n  exampleGroups: ExampleGroups | undefined;\n\n  /**\n   * Request body examples for this operation.\n   */\n  requestBodyExamples: RequestBodyExample[] | undefined;\n\n  /**\n   * Response examples for this operation.\n   */\n  responseExamples: ResponseExample[] | undefined;\n\n  /**\n   * Callback examples for this operation (if it has callbacks).\n   */\n  callbackExamples: CallbackExample[] | undefined;\n\n  /**\n   * Flattened out arrays of both request and response headers that are utilized on this operation.\n   */\n  headers: {\n    request: string[];\n    response: string[];\n  };\n\n  constructor(oas: Oas, path: string, method: HttpMethods, operation: OperationObject) {\n    this.oas = oas;\n    this.schema = operation;\n    this.api = oas.api;\n    this.path = path;\n    this.method = method;\n\n    this.contentType = undefined;\n    this.requestBodyExamples = undefined;\n    this.responseExamples = undefined;\n    this.callbackExamples = undefined;\n    this.exampleGroups = undefined;\n    this.headers = {\n      request: [],\n      response: [],\n    };\n  }\n\n  /**\n   * Retrieve the `summary` for this operation.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationsummary}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-summary}\n   */\n  getSummary(): string | undefined {\n    if (this.schema?.summary && typeof this.schema.summary === 'string') {\n      return this.schema.summary;\n    }\n\n    const pathItem = this.api.paths?.[this.path];\n    if (pathItem?.summary && typeof pathItem.summary === 'string') {\n      return pathItem.summary;\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Retrieve the `description` for this operation.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationdescription}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-description}\n   */\n  getDescription(): string | undefined {\n    if (this.schema?.description && typeof this.schema.description === 'string') {\n      return this.schema.description;\n    }\n\n    const pathItem = this.api.paths?.[this.path];\n    if (pathItem?.description && typeof pathItem.description === 'string') {\n      return pathItem.description;\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Retrieve the server objects that apply to this operation, using OpenAPI server precedence:\n   * operation-level servers, then path-item servers, then root-level servers.\n   */\n  getServers(): ServerObject[] {\n    if (this.schema.servers?.length) {\n      return this.schema.servers;\n    }\n\n    if (this.api.paths?.[this.path]) {\n      const pathItem = dereferenceRef(this.api.paths[this.path], this.api);\n      if (pathItem && !isRef(pathItem) && pathItem.servers?.length) {\n        return pathItem.servers;\n      }\n    }\n\n    return this.api.servers || [];\n  }\n\n  url(selected = 0, variables?: ServerVariable): string {\n    const url = normalizedURLFromServers(this.getServers(), selected);\n    return this.oas.replaceUrl(url, variables || this.defaultVariables(selected)).trim();\n  }\n\n  variables(selected = 0): ServerVariablesObject {\n    return variablesFromServers(this.getServers(), selected);\n  }\n\n  defaultVariables(selected = 0): ServerVariable {\n    return defaultVariablesFromServers(this.getServers(), selected, this.oas.user);\n  }\n\n  splitUrl(selected = 0): SplitUrlResult {\n    return splitUrlFromServers(this.getServers(), selected);\n  }\n\n  /**\n   * Retrieve the primary content type for this operation. If multiple exist, the first JSON-like\n   * type will be returned.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-requestbodycontent}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-request-body-content}\n   */\n  getContentType(): string {\n    if (this.contentType) {\n      return this.contentType;\n    }\n\n    let types: string[] = [];\n    if (this.schema.requestBody) {\n      if (isRef(this.schema.requestBody)) {\n        this.schema.requestBody = dereferenceRef(this.schema.requestBody, this.api);\n      }\n\n      if (this.schema.requestBody && 'content' in this.schema.requestBody) {\n        types = Object.keys(this.schema.requestBody.content);\n      }\n    }\n\n    this.contentType = 'application/json';\n    if (types?.length) {\n      this.contentType = types[0];\n    }\n\n    // Favor JSON if it exists\n    types.forEach(t => {\n      if (matchesMimeType.json(t)) {\n        this.contentType = t;\n      }\n    });\n\n    return this.contentType;\n  }\n\n  /**\n   * Checks if the current operation has a `x-www-form-urlencoded` content type payload.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-requestbodycontent}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-request-body-content}\n   */\n  isFormUrlEncoded(): boolean {\n    return matchesMimeType.formUrlEncoded(this.getContentType());\n  }\n\n  /**\n   * Checks if the current operation has a mutipart content type payload.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-requestbodycontent}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-request-body-content}\n   */\n  isMultipart(): boolean {\n    return matchesMimeType.multipart(this.getContentType());\n  }\n\n  /**\n   * Checks if the current operation has a JSON-like content type payload.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-requestbodycontent}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-request-body-content}\n   */\n  isJson(): boolean {\n    return matchesMimeType.json(this.getContentType());\n  }\n\n  /**\n   * Checks if the current operation has an XML content type payload.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-requestbodycontent}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-request-body-content}\n   */\n  isXml(): boolean {\n    return matchesMimeType.xml(this.getContentType());\n  }\n\n  /**\n   * Checks if the current operation is a webhook or not.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#oas-webhooks}\n   */\n  isWebhook(): boolean {\n    return this instanceof Webhook;\n  }\n\n  /**\n   * Returns an array of all security requirements associated wtih this operation. If none are\n   * defined at the operation level, the securities for the entire API definition are returned\n   * (with an empty array as a final fallback).\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-requirement-object}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#security-requirement-object}\n   */\n  getSecurity(): SecurityRequirementObject[] {\n    // If this definition doesn't have any security schemes defined then regardless if there are\n    // `security` requirements defined anywhere we should return an empty array because they're all\n    // invalid an unusable without the accompanying schemes.\n    if (!this.api?.components?.securitySchemes || !Object.keys(this.api.components.securitySchemes).length) {\n      return [];\n    }\n\n    return this.schema.security || this.api.security || [];\n  }\n\n  /**\n   * Retrieve a collection of grouped security schemes. The inner array determines AND-grouped\n   * security schemes, the outer array determines OR-groups.\n   *\n   * @see {@link https://swagger.io/docs/specification/authentication/#multiple}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-requirement-object}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#security-requirement-object}\n   * @param filterInvalid Optional flag that, when set to `true`, filters out invalid/nonexistent\n   *    security schemes, rather than returning `false`.\n   */\n  getSecurityWithTypes(\n    filterInvalid = false,\n  ): ((false | { security: KeyedSecuritySchemeObject; type: SecurityType })[] | false)[] {\n    return this.getSecurity().map(requirement => {\n      let keys: string[];\n      try {\n        keys = Object.keys(requirement);\n      } catch {\n        return false;\n      }\n\n      const keysWithTypes = keys.map(key => {\n        let security: SecuritySchemeObject | ReferenceObject | undefined;\n        try {\n          security = this.api?.components?.securitySchemes?.[key];\n          if (!security) return false;\n          if (isRef(security)) {\n            security = dereferenceRef(security, this.api);\n            if (!security || isRef(security)) return false;\n          }\n        } catch {\n          return false;\n        }\n\n        if (!security || isRef(security)) return false;\n\n        let type: SecurityType | null = null;\n\n        if (security.type === 'http') {\n          if (security.scheme === 'basic') type = 'Basic';\n          else if (security.scheme === 'bearer') type = 'Bearer';\n          else type = security.type;\n        } else if (security.type === 'oauth2') {\n          type = 'OAuth2';\n        } else if (security.type === 'apiKey') {\n          if (security.in === 'query') type = 'Query';\n          else if (security.in === 'header') type = 'Header';\n          else if (security.in === 'cookie') type = 'Cookie';\n          else type = security.type;\n        } else {\n          return false;\n        }\n\n        return {\n          type,\n          security: {\n            ...security,\n            _key: key,\n            _requirements: requirement[key],\n          },\n        };\n      });\n\n      if (filterInvalid) return keysWithTypes.filter(key => key !== false);\n\n      return keysWithTypes;\n    });\n  }\n\n  /**\n   * Retrieve an object where the keys are unique scheme types, and the values are arrays\n   * containing each security scheme of that type.\n   *\n   */\n  prepareSecurity(): Record<SecurityType, KeyedSecuritySchemeObject[]> {\n    return this.getSecurityWithTypes().reduce(\n      (prev, securities) => {\n        if (!securities) return prev;\n\n        securities.forEach(security => {\n          // Remove non-existent schemes\n          if (!security) return;\n          if (!prev[security.type]) prev[security.type] = [];\n\n          // Only add schemes we haven't seen yet.\n          const exists = prev[security.type].some(sec => sec._key === security.security._key);\n          if (!exists) {\n            // Since an operation can require the same security scheme several times (each with\n            // different scope requirements), including the `_requirements` in this object would be\n            // misleading since we dedupe the security schemes.\n            if (security.security?._requirements) delete security.security._requirements;\n            prev[security.type].push(security.security);\n          }\n        });\n\n        return prev;\n      },\n      {} as Record<SecurityType, KeyedSecuritySchemeObject[]>,\n    );\n  }\n\n  /**\n   * Retrieve all of the headers, request and response, that are associated with this operation.\n   *\n   */\n  getHeaders(): Operation['headers'] {\n    const security = this.prepareSecurity();\n    if (security.Header) {\n      this.headers.request = security.Header.map((h: KeyedSecuritySchemeObject) => {\n        // Only `apiKey` security schemes contain headers.\n        if (!('name' in h)) return false;\n        return h.name;\n      }).filter((item): item is string => item !== false);\n    }\n\n    if (security.Bearer || security.Basic || security.OAuth2) {\n      this.headers.request.push('Authorization');\n    }\n\n    if (security.Cookie) {\n      this.headers.request.push('Cookie');\n    }\n\n    if (this.schema.parameters) {\n      this.headers.request = this.headers.request.concat(\n        this.schema.parameters\n          .map(p => {\n            let param = p;\n            if (isRef(param)) {\n              param = dereferenceRef(param, this.api);\n              if (!param || isRef(param)) return;\n            }\n\n            if (param.in && param.in === 'header') return param.name;\n            // oxlint-disable-next-line no-useless-return\n            return;\n          })\n          .filter((item): item is string => item !== undefined),\n      );\n    }\n\n    if (this.schema.responses) {\n      this.headers.response = Object.keys(this.schema.responses)\n        .map(r => {\n          let response = this.schema.responses![r];\n          if (!response) return [];\n          if (isRef(response)) {\n            this.schema.responses![r] = dereferenceRef(response, this.api);\n            response = this.schema.responses![r];\n            if (!response || isRef(response)) {\n              return [];\n            }\n          }\n\n          return response?.headers ? Object.keys(response.headers) : [];\n        })\n        .reduce((a, b) => a.concat(b), []);\n    }\n\n    // If the operation doesn't already specify a `content-type` request header, we check if the\n    // path operation request body contains content, which implies that we should also include the\n    // `content-type` header.\n    if (!this.headers.request.includes('Content-Type') && this.schema.requestBody) {\n      let requestBody = this.schema.requestBody;\n      if (requestBody) {\n        if (isRef(requestBody)) {\n          this.schema.requestBody = dereferenceRef(requestBody, this.api);\n          requestBody = this.schema.requestBody;\n        }\n\n        if (requestBody && !isRef(requestBody) && 'content' in requestBody && Object.keys(requestBody.content)) {\n          this.headers.request.push('Content-Type');\n        }\n      }\n    }\n\n    // This is a similar approach, but in this case if we check the response content and prioritize\n    // the `accept` request header and `content-type` request header.\n    if (this.schema.responses) {\n      const hasResponseContent = Object.keys(this.schema.responses).some(r => {\n        let response = this.schema.responses?.[r];\n        if (!response) return false;\n        if (isRef(response)) {\n          this.schema.responses![r] = dereferenceRef(response, this.api);\n          response = this.schema.responses![r];\n          if (!response || isRef(response)) {\n            return false;\n          }\n        }\n\n        return response.content && Object.keys(response.content).length > 0;\n      });\n\n      if (hasResponseContent) {\n        if (!this.headers.request.includes('Accept')) this.headers.request.push('Accept');\n        if (!this.headers.response.includes('Content-Type')) this.headers.response.push('Content-Type');\n      }\n    }\n\n    return this.headers;\n  }\n\n  /**\n   * Determine if this operation has an `operationId` present in its schema. Note that if one is\n   * present in the schema but is an empty string then this will return `false`.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationid}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-id}\n   */\n  hasOperationId(): boolean {\n    return hasOperationId(this.schema);\n  }\n\n  /**\n   * Determine if an operation has an `operationId` present in its schema. Note that if one is\n   * present in the schema but is an empty string then this will return `false`.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationid}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-id}\n   */\n  static hasOperationId(schema: OperationObject): boolean {\n    return hasOperationId(schema);\n  }\n\n  /**\n   * Get an `operationId` for this operation. If one is not present (it's not required by the spec!)\n   * a hash of the path and method will be returned instead.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationid}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-id}\n   */\n  getOperationId(opts: OperationIDGeneratorOptions = {}): string {\n    return getOperationId(this.path, this.method, this.schema, opts);\n  }\n\n  /**\n   * Get an `operationId` for an operation. If one is not present (it's not required by the spec!)\n   * a hash of the path and method will be returned instead.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationid}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-id}\n   */\n  static getOperationId(\n    path: string,\n    method: string,\n    schema: OperationObject,\n    opts: OperationIDGeneratorOptions = {},\n  ): string {\n    return getOperationId(path, method, schema, opts);\n  }\n\n  /**\n   * Return an array of all tags, and their metadata, that exist on this operation.\n   *\n   */\n  getTags(): TagObject[] {\n    if (!('tags' in this.schema)) {\n      return [];\n    }\n\n    const oasTagMap: Map<string, TagObject> = new Map();\n    if (Array.isArray(this.api?.tags)) {\n      this.api.tags.forEach(tag => {\n        oasTagMap.set(tag.name, tag);\n      });\n    }\n\n    const oasTags = Object.fromEntries(oasTagMap);\n\n    const tags: TagObject[] = [];\n    if (Array.isArray(this.schema.tags)) {\n      this.schema.tags.forEach(tag => {\n        if (tag in oasTags) {\n          tags.push(oasTags[tag]);\n        } else {\n          tags.push({\n            name: tag,\n          });\n        }\n      });\n    }\n\n    return tags;\n  }\n\n  /**\n   * Return is the operation is flagged as `deprecated` or not.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationdeprecated}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-deprecated}\n   */\n  isDeprecated(): boolean {\n    return Boolean('deprecated' in this.schema ? this.schema.deprecated : false);\n  }\n\n  /**\n   * Determine if the operation has any (non-request body) parameters.\n   *\n   */\n  hasParameters(): boolean {\n    return !!this.getParameters().length;\n  }\n\n  /**\n   * Return the parameters (non-request body) on the operation.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationparameters}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-parameters}\n   */\n  getParameters(): ParameterObject[] {\n    let parameters = (this.schema?.parameters || [])\n      .map(p => {\n        let param = p;\n        if (isRef(param)) {\n          param = dereferenceRef(param, this.api);\n          if (!param || isRef(param)) return;\n        }\n\n        return param;\n      })\n      .filter((param): param is ParameterObject => param !== undefined);\n\n    const commonParams = (this.api?.paths?.[this.path]?.parameters || [])\n      .map(p => {\n        let param = p;\n        if (isRef(param)) {\n          param = dereferenceRef(param, this.api);\n          if (!param || isRef(param)) return;\n        }\n\n        return param;\n      })\n      .filter((param): param is ParameterObject => param !== undefined);\n\n    if (commonParams.length) {\n      parameters = parameters.concat(dedupeCommonParameters(parameters, commonParams) || []);\n    }\n\n    return parameters;\n  }\n\n  /**\n   * Determine if this operation has any required parameters.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationparameters}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-parameters}\n   */\n  hasRequiredParameters(): boolean {\n    return this.getParameters().some(param => 'required' in param && param.required);\n  }\n\n  /**\n   * Convert the operation into an array of JSON Schema schemas for each available type of\n   * parameter available on the operation.\n   *\n   * Note that this method is not compatible with an operation or OpenAPI definition that has been\n   * processed with `.dereference()`. This method can only be called with the _original_ API\n   * definition that was used to initialize the `Operation` and `Oas` instance. If a dereferenced\n   * schema is present when this is called a `TypeError` will be thrown.\n   *\n   * @throws {TypeError} If the operation or OpenAPI definition has been run through `.dereference().`\n   *\n   */\n  getParametersAsJSONSchema(opts: getParametersAsJSONSchemaOptions = {}): SchemaWrapper[] | null {\n    // Because some downstream tooling that use these JSON Schema objects may need to know original\n    // schema names, like in some cases of discriminator mappings in our ReadMe API Explorer, we\n    // need to decorate our component schemas with a `x-readme-ref-name` property with that original\n    // schema name.\n    decorateComponentSchemasWithRefName(this.api);\n\n    return getParametersAsJSONSchema(this, this.api, {\n      includeDiscriminatorMappingRefs: true,\n      ...opts,\n    });\n  }\n\n  /**\n   * Get a single response for this status code, formatted as JSON schema.\n   *\n   * Note that this method is not compatible with an operation or OpenAPI definition that has been\n   * processed with `.dereference()`. This method can only be called with the _original_ API\n   * definition that was used to initialize the `Operation` and `Oas` instance. If a dereferenced\n   * schema is present when this is called a `TypeError` will be thrown.\n   *\n   * @param statusCode Status code to pull a JSON Schema response for.\n   * @param opts Options for schema generation.\n   * @param opts.contentType Optional content-type to use. If specified and the response doesn't have\n   *   this content-type, the function will return null.\n   */\n  getResponseAsJSONSchema(\n    statusCode: number | string,\n    opts: {\n      /**\n       * If you wish to include discriminator mapping `$ref` components alongside your\n       * `discriminator` in schemas. Defaults to `true`.\n       */\n      includeDiscriminatorMappingRefs?: boolean;\n\n      /**\n       * Optional content-type to use. If specified and the response doesn't have this content-type,\n       * the function will return null.\n       */\n      contentType?: string;\n    } = {},\n  ): ResponseSchemaObject[] | null {\n    // Because some downstream tooling that use these JSON Schema objects may need to know original\n    // schema names, like in some cases of discriminator mappings in our ReadMe API Explorer, we\n    // need to decorate our component schemas with a `x-readme-ref-name` property with that original\n    // schema name.\n    decorateComponentSchemasWithRefName(this.api);\n\n    return getResponseAsJSONSchema(this, this.api, statusCode, {\n      includeDiscriminatorMappingRefs: true,\n      ...opts,\n    });\n  }\n\n  /**\n   * Get an array of all valid response status codes for this operation.\n   *\n   */\n  getResponseStatusCodes(): string[] {\n    if (!this.schema.responses) return [];\n\n    if (isRef(this.schema.responses)) {\n      this.schema.responses = dereferenceRef(this.schema.responses, this.api);\n      if (!this.schema.responses || isRef(this.schema.responses)) {\n        return [];\n      }\n    }\n\n    return Object.keys(this.schema.responses).filter(key => {\n      // `x-` extensions aren't valid HTTP status codes so we shouldn't return them as one.\n      if (key.startsWith('x-')) {\n        return false;\n      }\n\n      const response = this.schema.responses?.[key];\n      return response && typeof response === 'object';\n    });\n  }\n\n  /**\n   * Retrieve an array of all content types that this operation can return.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#response-object}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#response-object}\n   */\n  getResponseContentTypes(): string[] {\n    if (!this.schema.responses) return [];\n\n    const contentTypes = new Set<string>();\n    Object.values(this.schema.responses).forEach((response: ReferenceObject | ResponseObject) => {\n      let resp = response;\n      if (!resp) return;\n      if (isRef(resp)) {\n        resp = dereferenceRef(resp, this.api);\n\n        // If this response still can't be resolved then we shouldn't return anything because it's\n        // either an invalid schema or a circular reference.\n        if (!resp || isRef(resp)) {\n          return;\n        }\n      }\n\n      Object.keys(resp.content || {}).forEach(mimeType => {\n        contentTypes.add(mimeType);\n      });\n    });\n\n    return Array.from(contentTypes);\n  }\n\n  /**\n   * Determine if the operation has any request bodies.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationrequestbody}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-request-body}\n   */\n  hasRequestBody(): boolean {\n    return !!this.schema.requestBody;\n  }\n\n  /**\n   * Return the current `requestBody` object, dereferencing it in the process if it's a `$ref`\n   * pointer.\n   *\n   */\n  private getResolvedRequestBody(): RequestBodyObject | false {\n    let requestBody = this.schema.requestBody;\n    if (!requestBody) return false;\n    if (isRef(requestBody)) {\n      this.schema.requestBody = dereferenceRef(requestBody, this.api);\n      requestBody = this.schema.requestBody;\n      if (!requestBody || isRef(requestBody)) {\n        return false;\n      }\n    }\n\n    return requestBody;\n  }\n\n  /**\n   * Retrieve the list of all available media types that the operations request body can accept.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#media-type-object}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object}\n   */\n  getRequestBodyMediaTypes(): string[] {\n    if (!this.hasRequestBody()) {\n      return [];\n    }\n\n    const requestBody = this.getResolvedRequestBody();\n    if (!requestBody) return [];\n\n    return Object.keys(requestBody.content);\n  }\n\n  /**\n   * Determine if this operation has a required request body.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#media-type-object}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object}\n   */\n  hasRequiredRequestBody(): boolean {\n    if (!this.hasRequestBody()) {\n      return false;\n    }\n\n    const requestBody = this.getResolvedRequestBody();\n    if (!requestBody) return false;\n\n    if (requestBody.required) {\n      return true;\n    }\n\n    // The OpenAPI spec isn't clear on the differentiation between schema `required` and\n    // `requestBody.required` because you can have required top-level schema properties but a\n    // non-required requestBody that negates each other.\n    //\n    // To kind of work ourselves around this and present a better QOL for this accessor, if at this\n    // final point where we don't have a required request body, but the underlying Media Type Object\n    // schema says that it has required properties then we should ultimately recognize that this\n    // request body is required -- even as the request body description says otherwise.\n    const parameters = this.getParametersAsJSONSchema();\n    if (parameters === null) {\n      return false;\n    }\n\n    return !!parameters\n      .filter(js => ['body', 'formData'].includes(js.type))\n      .find(js => js.schema && Array.isArray(js.schema.required) && js.schema.required.length);\n  }\n\n  /**\n   * Retrieve a specific request body content schema off this operation.\n   *\n   * If no media type is supplied this will return either the first available JSON-like request\n   * body, or the first available if there are no JSON-like media types present. The return value\n   * is an object containing the selected media type, the media type object, and an optional\n   * description.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#media-type-object}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object}\n   * @param mediaType Specific request body media type to retrieve if present.\n   */\n  getRequestBody(\n    mediaType?: string,\n  ): false | { mediaType: string; mediaTypeObject: MediaTypeObject; description?: string } {\n    if (!this.hasRequestBody()) {\n      return false;\n    }\n\n    const requestBody = this.getResolvedRequestBody();\n    if (!requestBody) return false;\n\n    if (mediaType) {\n      if (!(mediaType in requestBody.content)) {\n        return false;\n      }\n\n      return {\n        mediaType,\n        mediaTypeObject: requestBody.content[mediaType],\n        description: requestBody.description,\n      };\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 availableMediaType: string | undefined;\n    const mediaTypes = this.getRequestBodyMediaTypes();\n    mediaTypes.forEach((mt: string) => {\n      if (!availableMediaType && matchesMimeType.json(mt)) {\n        availableMediaType = mt;\n      }\n    });\n\n    if (!availableMediaType) {\n      mediaTypes.forEach((mt: string) => {\n        if (!availableMediaType) {\n          availableMediaType = mt;\n        }\n      });\n    }\n\n    if (availableMediaType) {\n      return {\n        mediaType: availableMediaType,\n        mediaTypeObject: requestBody.content[availableMediaType],\n        description: requestBody.description,\n      };\n    }\n\n    return false;\n  }\n\n  /**\n   * Retrieve an array of request body examples that this operation has.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#request-body-examples}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#request-body-examples}\n   */\n  getRequestBodyExamples(): RequestBodyExample[] {\n    const isRequestExampleValueDefined = typeof this.requestBodyExamples?.[0]?.examples?.[0].value !== 'undefined';\n\n    if (this.requestBodyExamples && isRequestExampleValueDefined) {\n      return this.requestBodyExamples;\n    }\n\n    this.requestBodyExamples = getRequestBodyExamples(this.schema, this.api);\n    return this.requestBodyExamples;\n  }\n\n  /**\n   * Return a specific response out of the operation by a given HTTP status code.\n   *\n   * @param statusCode Status code to pull a response object for.\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#response-object}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#response-object}\n   */\n  getResponseByStatusCode(statusCode: number | string): ResponseObject | false {\n    if (!this.schema.responses) {\n      return false;\n    }\n\n    let response = this.schema.responses[statusCode];\n    if (!response) return false;\n    if (isRef(response)) {\n      this.schema.responses[statusCode] = dereferenceRef(response, this.api);\n      response = this.schema.responses[statusCode];\n      if (!response || isRef(response)) {\n        return false;\n      }\n    }\n\n    return response;\n  }\n\n  /**\n   * Retrieve an array of response examples that this operation has.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#response-object-examples}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#response-object-examples}\n   */\n  getResponseExamples(): ResponseExample[] {\n    if (this.responseExamples) {\n      return this.responseExamples;\n    }\n\n    this.responseExamples = getResponseExamples(this.schema, this.api);\n    return this.responseExamples;\n  }\n\n  /**\n   * Determine if the operation has callbacks.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#callback-object}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#callback-object}\n   */\n  hasCallbacks(): boolean {\n    return Boolean(this.schema.callbacks);\n  }\n\n  /**\n   * Retrieve a specific callback.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#callback-object}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#callback-object}\n   * @param identifier Callback identifier to look for.\n   * @param expression Callback expression to look for.\n   * @param method HTTP Method on the callback to look for.\n   */\n  getCallback(identifier: string, expression: string, method: HttpMethods): Callback | false {\n    if (!this.schema.callbacks) return false;\n\n    let callbackObj = this.schema.callbacks[identifier];\n    if (!callbackObj) return false;\n    if (isRef(callbackObj)) {\n      this.schema.callbacks[identifier] = dereferenceRef(callbackObj, this.api);\n      callbackObj = this.schema.callbacks[identifier];\n      if (!callbackObj || isRef(callbackObj)) {\n        return false;\n      }\n    }\n\n    let callback = callbackObj[expression];\n    if (!callback) return false;\n    if (isRef(callback)) {\n      callbackObj[expression] = dereferenceRef(callback, this.api);\n      callback = callbackObj[expression];\n      if (!callback || isRef(callback)) {\n        return false;\n      }\n    }\n\n    if (!callback[method]) {\n      return false;\n    }\n\n    return new Callback(this.oas, expression, method, callback[method], identifier, callback);\n  }\n\n  /**\n   * Retrieve an array of operations created from each callback.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#callback-object}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#callback-object}\n   */\n  getCallbacks(): Callback[] {\n    if (!this.hasCallbacks()) return [];\n\n    const callbacks: Callback[] = [];\n    Object.keys(this.schema.callbacks!).forEach(callback => {\n      let cb = this.schema.callbacks?.[callback];\n      if (!cb) return;\n      if (isRef(cb)) {\n        this.schema.callbacks![callback] = dereferenceRef(cb, this.api);\n        cb = this.schema.callbacks![callback];\n        if (!cb || isRef(cb)) {\n          return;\n        }\n      }\n\n      Object.keys(cb).forEach(expression => {\n        let callbackPath = cb[expression];\n        if (!callbackPath) return;\n        if (isRef(callbackPath)) {\n          cb[expression] = dereferenceRef(callbackPath, this.api);\n          callbackPath = cb[expression];\n          if (!callbackPath || isRef(callbackPath)) {\n            return;\n          }\n        }\n\n        Object.keys(callbackPath).forEach(method => {\n          if (!supportedMethods.includes(method as HttpMethods)) return;\n\n          const found = this.getCallback(callback, expression, method as HttpMethods);\n          if (found) {\n            callbacks.push(found);\n          }\n        });\n      });\n    });\n\n    return callbacks;\n  }\n\n  /**\n   * Retrieve an array of callback examples that this operation has.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#callback-object}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#callback-object}\n   */\n  getCallbackExamples(): CallbackExample[] {\n    if (this.callbackExamples) {\n      return this.callbackExamples;\n    }\n\n    this.callbackExamples = getCallbackExamples(this.schema, this.api);\n    return this.callbackExamples;\n  }\n\n  /**\n   * Determine if a given a custom specification extension exists within the operation.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specification-extensions}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#specification-extensions}\n   * @param extension Specification extension to lookup.\n   */\n  hasExtension(extension: string): boolean {\n    return Boolean(this.schema && extension in this.schema);\n  }\n\n  /**\n   * Retrieve a custom specification extension off of the operation.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specification-extensions}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#specification-extensions}\n   * @param extension Specification extension to lookup.\n   *\n   * @deprecated Use `oas.getExtension(extension, operation)` instead.\n   */\n  getExtension(extension: string | keyof Extensions): any {\n    return this.schema?.[extension];\n  }\n\n  /**\n   * Returns an object with groups of all example definitions (body/header/query/path/response/etc.).\n   * The examples are grouped by their key when defined via the `examples` map.\n   *\n   * Any custom code samples defined via the `x-readme.code-samples` extension are returned,\n   * regardless of if they have a matching response example.\n   *\n   * For standard OAS request parameter (e.g., body/header/query/path/etc.) examples,\n   * they are only present in the return object if they have a corresponding response example\n   * (i.e., a response example with the same key in the `examples` map).\n   */\n  getExampleGroups(): ExampleGroups {\n    if (this.exampleGroups) return this.exampleGroups;\n\n    const groups = getExampleGroups(this);\n\n    this.exampleGroups = groups;\n\n    return groups;\n  }\n}\n\nexport class Callback extends Operation {\n  /**\n   * The identifier that this callback is set to.\n   */\n  identifier: string;\n\n  /**\n   * The parent path item object that this Callback exists within.\n   */\n  parentSchema: PathItemObject;\n\n  constructor(\n    oas: Oas,\n    path: string,\n    method: HttpMethods,\n    operation: OperationObject,\n    identifier: string,\n    parentPathItem: PathItemObject,\n  ) {\n    super(oas, path, method, operation);\n\n    this.identifier = identifier;\n    this.parentSchema = parentPathItem;\n  }\n\n  /**\n   * Return the primary identifier for this callback.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#callback-object}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#callback-object}\n   */\n  getIdentifier(): string {\n    return this.identifier;\n  }\n\n  /**\n   * Retrieve the `summary` for this callback.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationsummary}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-summary}\n   */\n  getSummary(): string | undefined {\n    if (this.schema?.summary && typeof this.schema.summary === 'string') {\n      return this.schema.summary;\n    } else if (this.parentSchema.summary && typeof this.parentSchema.summary === 'string') {\n      return this.parentSchema.summary;\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Retrieve the `description` for this operation.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationdescription}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-description}\n   */\n  getDescription(): string | undefined {\n    if (this.schema?.description && typeof this.schema.description === 'string') {\n      return this.schema.description;\n    } else if (this.parentSchema.description && typeof this.parentSchema.description === 'string') {\n      return this.parentSchema.description;\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Return the parameters (non-request body) on the operation.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationparameters}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-parameters}\n   */\n  getParameters(): ParameterObject[] {\n    let parameters = (this.schema?.parameters || [])\n      .map(p => {\n        let param = p;\n        if (isRef(param)) {\n          param = dereferenceRef(param, this.api);\n          if (!param || isRef(param)) return;\n        }\n\n        return param;\n      })\n      .filter((param): param is ParameterObject => param !== undefined);\n\n    const commonParams = (this.parentSchema.parameters || [])\n      .map(p => {\n        let param = p;\n        if (isRef(param)) {\n          param = dereferenceRef(param, this.api);\n          if (!param || isRef(param)) return;\n        }\n\n        return param;\n      })\n      .filter((param): param is ParameterObject => param !== undefined);\n\n    if (commonParams.length) {\n      parameters = parameters.concat(dedupeCommonParameters(parameters, commonParams) || []);\n    }\n\n    return parameters;\n  }\n}\n\nexport class Webhook extends Operation {\n  /**\n   * OpenAPI API Definition that this webhook originated from.\n   */\n  declare api: OAS31Document;\n\n  /**\n   * Retrieve the `summary` for this callback.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationsummary}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-summary}\n   */\n  getSummary(): string | undefined {\n    if (this.schema?.summary && typeof this.schema.summary === 'string') {\n      return this.schema.summary;\n    } else if (!this.api.webhooks) {\n      return undefined;\n    }\n\n    let webhookPath = this.api.webhooks[this.path];\n    if (isRef(webhookPath)) {\n      this.api.webhooks[this.path] = dereferenceRef(webhookPath, this.api);\n      webhookPath = this.api.webhooks[this.path];\n    }\n\n    return webhookPath?.summary;\n  }\n\n  /**\n   * Retrieve the `description` for this operation.\n   *\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#user-content-operationdescription}\n   * @see {@link https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.2.md#user-content-operation-description}\n   */\n  getDescription(): string | undefined {\n    if (this.schema?.description && typeof this.schema.description === 'string') {\n      return this.schema.description;\n    } else if (!this.api.webhooks) {\n      return undefined;\n    }\n\n    let webhookPath = this.api.webhooks[this.path];\n    if (isRef(webhookPath)) {\n      this.api.webhooks[this.path] = dereferenceRef(webhookPath, this.api);\n      webhookPath = this.api.webhooks[this.path];\n    }\n\n    return webhookPath?.description;\n  }\n}\n"]}