{"version":3,"file":"index.mjs","sources":["../src/const.ts","../src/types/openapi.ts","../src/utils/path.ts","../src/utils/string.ts","../src/utils/type-is.ts","../src/printer/const.ts","../src/printer/helpers.ts","../src/printer/JsDoc.ts","../src/printer/Parser.ts","../src/printer/VarPath.ts","../src/printer/Arg.ts","../src/printer/Args.ts","../src/printer/Content.ts","../src/printer/Named.ts","../src/printer/index.ts","../src/utils/object.ts","../src/migrations/openapi-2_0.ts","../src/migrations/openapi-3_0.ts","../src/migrations/index.ts","../src/generator/Reader.ts","../src/generator/Generator.ts","../src/generator/Logger.ts","../src/command.ts","../src/cli.ts"],"sourcesContent":["export const pkgName = PKG_NAME;\nexport const pkgVersion = PKG_VERSION;\nexport const configFileBaseName = 'openapi-axios.config';\n","export type * as OpenAPIV2 from './openapi-2_0';\nexport type * as OpenAPIV3 from './openapi-3_0';\nexport type * as OpenAPIV3_1 from './openapi-3_1';\nexport type * as OpenAPILatest from './openapi-3_1';\nexport type * as OpenAPIAll from './openapi-all';\n\nexport enum OpenAPIVersion {\n  /**\n   * OpenAPI 2.0.0\n   * {@link} https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md\n   */\n  V2_0 = '2.0.0',\n\n  /**\n   * OpenAPI 3.0.3\n   * {@link} https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md\n   */\n  V3_0 = '3.0.3',\n\n  /**\n   * OpenAPI 3.1.0\n   * {@link} https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md\n   */\n  V3_1 = '3.1.0',\n}\n","import path from 'node:path';\n\nexport function isRelative(toFile: string) {\n  return /^\\.{1,2}[/\\\\]/.test(toFile);\n}\n\nexport function toRelative(toFile: string, fromFile?: string) {\n  if (!fromFile)\n    return toFile;\n\n  if (!path.isAbsolute(toFile))\n    return toFile;\n\n  const relative = path.relative(path.dirname(fromFile), toFile);\n  return /^\\.{1,2}\\//.test(relative) ? relative : `./${relative}`;\n}\n\nexport function toImportPath(toFile: string, cwd: string, fromFile?: string) {\n  // /a/b/c, /cwd\n  if (path.isAbsolute(toFile)) {\n    return fromFile ? toRelative(toFile, fromFile) : toFile;\n  }\n\n  // ./a/b/c, /cwd\n  if (isRelative(toFile)) {\n    return toImportPath(path.join(cwd, toFile), cwd, fromFile);\n  }\n\n  // a/b/c, /cwd\n  return toFile;\n}\n","import type { Options } from 'prettier';\nimport path from 'node:path';\nimport process from 'node:process';\n\nexport function fixVarName(origin: string, bigger = false, fallback = 'var') {\n  const name\n        = origin\n          .replace(/\\W/g, '_')\n          .replace(/(^_+|_+$)/g, '')\n          .replace(/_(.)/g, ($0, $1: string) => $1.toUpperCase())\n          .replace(/^\\d+/, '') || fallback;\n\n  return (bigger ? name[0].toUpperCase() : name[0].toLowerCase()) + name.slice(1);\n}\n\nexport function nextUniqueName(refName: string, nameCountMap: Map<string, number>) {\n  // abc_123 -> abc\n  const baseName = refName.replace(/_[1-9]\\d*$/, '');\n  const count = nameCountMap.get(baseName) || 0;\n  const nextCount = count + 1;\n  nameCountMap.set(baseName, nextCount);\n  return nextCount === 1 ? baseName : `${baseName}_${nextCount}`;\n}\n\nexport function refToType(ref: string): string {\n  const segs = ref.split('/').slice(3);\n  const props = segs.slice(1);\n  return segs[0]! + props.map(prop => `[${JSON.stringify(prop)}]`).join('');\n}\n\nexport async function formatTsCode(tsCode: string, userOptions?: Options, cwd = process.cwd()) {\n  try {\n    const prettier = await import('prettier');\n    // 这里末尾加上 1 是因为 prettier 内部会有容错查找\n    const cwdOptions = (await prettier.resolveConfig(cwd)) || (await prettier.resolveConfig(path.join(cwd, '1')));\n    return prettier.format(tsCode, {\n      ...cwdOptions,\n      ...userOptions,\n      parser: 'typescript',\n    });\n  }\n  catch (cause) {\n    return tsCode;\n  }\n}\n","export function isString(any: unknown): any is string {\n  return typeof any === 'string';\n}\n\nexport function isBoolean(any: unknown): any is boolean {\n  return typeof any === 'boolean';\n}\n\nexport function isNumber(any: unknown): any is number {\n  return typeof any === 'number';\n}\n\nexport function isArray(any: unknown): any is unknown[] {\n  return Array.isArray(any);\n}\n\nexport function isVarName(varName: string) {\n  return /^[a-z_$]\\w*$/i.test(varName);\n}\n\nexport function isUndefined(any: unknown): any is undefined {\n  return any === undefined;\n}\n\nexport function isNever(never: never) {\n  //\n}\n","// @ref https://github.com/microsoft/TypeScript/issues/2536\nexport const KEYWORD_VARS = [\n  // 保留字\n  'break',\n  'case',\n  'catch',\n  'class',\n  'const',\n  'continue',\n  'debugger',\n  'default',\n  'delete',\n  'do',\n  'else',\n  'enum',\n  'export',\n  'extends',\n  'false',\n  'finally',\n  'for',\n  'function',\n  'if',\n  'import',\n  'in',\n  'instanceof',\n  'new',\n  'null',\n  'return',\n  'super',\n  'switch',\n  'this',\n  'throw',\n  'true',\n  'try',\n  'typeof',\n  'var',\n  'void',\n  'while',\n  'with',\n  // 严格保留字\n  'as',\n  'implements',\n  'interface',\n  'let',\n  'package',\n  'private',\n  'protected',\n  'public',\n  'static',\n  'yield',\n  'namespace',\n  'async',\n  'await',\n  // // 上下文关键字\n  // 'any',\n  // 'boolean',\n  // 'constructor',\n  // 'declare',\n  // 'get',\n  // 'module',\n  // 'require',\n  // 'number',\n  // 'set',\n  // 'string',\n  // 'symbol',\n  // 'type',\n  // 'from',\n  // 'of',\n];\n\nexport const AXIOS_IMPORT_NAME = 'axios';\nexport const ZOD_IMPORT_NAME = 'z';\nexport const FAKER_IMPORT_NAME = 'faker';\nexport const AXIOS_IMPORT_FILE = 'axios';\nexport const FAKER_IMPORT_FILE = '@faker-js/faker';\nexport const AXIOS_PARAM_CONFIG_NAME = 'config';\nexport const AXIOS_RESPONSE_NAME = 'resp';\nexport const ENABLE_MOCK_NAME = 'enableMock';\nexport const AXIOS_PARAM_TRANSFORM_RESPONSE_NAME = 'transformResponse';\nexport const AXIOS_REQUEST_TYPE_NAME = 'AxiosRequestConfig';\nexport const INTERNAL_VARS = [\n  AXIOS_IMPORT_NAME,\n  ZOD_IMPORT_NAME,\n  FAKER_IMPORT_NAME,\n  AXIOS_PARAM_CONFIG_NAME,\n  AXIOS_RESPONSE_NAME,\n  ENABLE_MOCK_NAME,\n];\n/**\n * 合并导出类型名称\n */\nexport const TYPE_FILE_EXPORT_NAME = 'Type';\nexport const INTERNAL_TYPES = [\n  // native\n  'Blob',\n  'Array',\n  'Object',\n  // typeScript\n  'string',\n  'number',\n  'boolean',\n  'any',\n  'unknown',\n  'void',\n  'never',\n  'null',\n  'undefined',\n  'object',\n  'symbol',\n  'bigint',\n  'Record',\n  // type\n  TYPE_FILE_EXPORT_NAME,\n  AXIOS_REQUEST_TYPE_NAME,\n];\n\nexport const DEFAULT_ENABLE_CONDITION = 'process.env.NODE_ENV !== \"production\"';\nexport const DEFAULT_RESPONSE_DATA_PROPS = ['data'];\n","import type { OpenAPILatest } from '../types/openapi';\nimport { isString } from '../utils/type-is';\n\nexport type OpenApiLatest_Schema = OpenAPILatest.SchemaObject | OpenAPILatest.ReferenceObject;\n\nexport function isRefSchema(schema: OpenApiLatest_Schema): schema is OpenAPILatest.ReferenceObject {\n  return '$ref' in schema && isString(schema.$ref);\n}\n\nexport type OpenApiLatest_Parameter = OpenAPILatest.ReferenceObject | OpenAPILatest.ParameterObject;\n\nexport function isRefParameter(parameter: OpenApiLatest_Parameter): parameter is OpenAPILatest.ReferenceObject {\n  return '$ref' in parameter && isString(parameter.$ref);\n}\n\nexport type OpenApiLatest_Request = OpenAPILatest.ReferenceObject | OpenAPILatest.RequestBodyObject;\n\nexport function isRefRequest(request: OpenApiLatest_Request): request is OpenAPILatest.ReferenceObject {\n  return '$ref' in request && isString(request.$ref);\n}\n\nexport type OpenApiLatest_Media = OpenAPILatest.ReferenceObject | OpenAPILatest.MediaTypeObject;\n\nexport function isRefMedia(request: OpenApiLatest_Media): request is OpenAPILatest.ReferenceObject {\n  return '$ref' in request && isString(request.$ref);\n}\n\nexport type OpenApiLatest_PathItem = OpenAPILatest.PathItemObject | OpenAPILatest.ReferenceObject;\n\nexport function isRefPathItem(pathItem: OpenApiLatest_PathItem): pathItem is OpenAPILatest.ReferenceObject {\n  return '$ref' in pathItem && isString(pathItem.$ref);\n}\n\nexport type OpenApiLatest_Operation = OpenAPILatest.OperationObject | OpenAPILatest.ReferenceObject;\n\nexport function isRefOperation(operation: OpenApiLatest_Operation): operation is OpenAPILatest.ReferenceObject {\n  return '$ref' in operation && isString(operation.$ref);\n}\n\nexport type OpenApiLatest_Response = OpenAPILatest.ResponseObject | OpenAPILatest.ReferenceObject;\n\nexport function isRefResponse(response: OpenApiLatest_Response): response is OpenAPILatest.ReferenceObject {\n  return '$ref' in response && isString(response.$ref);\n}\n\nexport function requiredTypeStringify(required?: boolean) {\n  return required ? ':' : '?:';\n}\n\nexport function requiredKeyStringify(key: string, required: boolean) {\n  return required ? key : `[${key}]`;\n}\n\nexport function toImportString(id: string, name: string, path: string, isType = false) {\n  const isDefault = name === '';\n  const type = isType ? (isDefault ? ' type ' : 'type ') : (isDefault ? ' ' : '');\n  return isDefault\n  // 默认导入\n    ? `import${type}${id} from \"${path}\";`\n  // 具名导入\n    : `import {${type}${name} as ${id}} from \"${path}\";`;\n}\n\nexport function toZodName(typeName: string) {\n  return `z-${typeName}`;\n}\n\nexport interface OrderlyItem {\n  name: string;\n  deps: string[];\n}\n/**\n * 根据依赖进行排序\n * @param depList\n * @returns\n */\nexport function sortingByDeps<T extends OrderlyItem>(depList: T[]) {\n  return depList.sort((a, b) => {\n    if (a.deps.includes(b.name)) {\n      return 1;\n    }\n    else if (b.deps.includes(a.name)) {\n      return -1;\n    }\n    else {\n      return 0;\n    }\n  });\n}\n\nexport function withGroup(texts: string[], options?: {\n  sep?: string;\n  wrap?: [start: string, end: string];\n  always?: boolean;\n}) {\n  const {\n    sep = ',',\n    wrap = ['(', ')'],\n    always = false,\n  } = options || {};\n  const [start, end] = wrap;\n  return !always && texts.length < 2 ? (texts.at(0) || '') : start + texts.join(sep) + end;\n}\n","import type { OpenAPILatest } from '../types/openapi';\nimport { isArray, isBoolean, isNumber, isString } from '../utils/type-is';\n\nfunction formatLine(key: string, val: unknown) {\n  val = key === 'externalDocs' ? JsDoc.printExternalDoc(val as OpenAPILatest.ExternalDocumentationObject) : val;\n  key = key === 'externalDocs' ? 'see' : key;\n\n  if (isBoolean(val) && val)\n    return `@${key}`;\n  if (isString(val) || isNumber(val))\n    return `@${key} ${val}`;\n}\n\nconst supportTypes = ['string', 'number', 'boolean', 'object', 'array', 'null'];\n\nexport class JsDoc {\n  lines: string[] = [];\n\n  constructor(private tags: OpenAPILatest.TagObject[] = []) {}\n\n  addComments(comments: Record<string, unknown>) {\n    if ('tags' in comments) {\n      const tags = (comments.tags || []) as string[];\n      comments.tags = undefined;\n      tags.forEach((tag) => {\n        const info = this.tags.find(t => t.name === tag);\n        if (!info)\n          return;\n\n        comments[`see ${tag}`] = [info.description, JsDoc.printExternalDoc(info.externalDocs)].filter(Boolean).join(' ');\n      });\n    }\n\n    this.addLines(JsDoc.toLines(comments));\n  }\n\n  addLines(lines: string[]) {\n    this.lines.push(...lines);\n  }\n\n  print() {\n    if (this.lines.length === 0)\n      return '';\n\n    return [\n      //\n      '/**',\n      ...this.lines.map((line) => {\n        const slices = line.split('\\n');\n        return slices.map(s => ` * ${s}`).join('\\n');\n      }),\n      ' */',\n    ].join('\\n');\n  }\n\n  static toLines(comments: Record<string, unknown>) {\n    return Object.entries(comments)\n      .map(([key, val]) => {\n        if (isArray(val))\n          return val.map(v => formatLine(key, v));\n        return formatLine(key, val);\n      })\n      .flat()\n      .filter(Boolean) as string[];\n  }\n\n  static fromRef(ref: OpenAPILatest.ReferenceObject) {\n    const { description, summary } = ref;\n    return { description, summary };\n  }\n\n  static fromSchema(schema: OpenAPILatest.SchemaObject) {\n    const { deprecated, description, default: defaultValue, format, example, examples, title, externalDocs, type } = schema;\n    const types = isArray(type) ? type : isString(type) ? [type] : undefined;\n\n    return {\n      summary: title,\n      description,\n      deprecated,\n      default: defaultValue,\n      format: format || types?.filter(type => !supportTypes.includes(type)).join(' | ') || undefined,\n      example,\n      examples,\n      externalDocs,\n    };\n  }\n\n  static fromParameter(parameter: OpenAPILatest.ParameterObject) {\n    const { deprecated, description, example, examples } = parameter;\n    return {\n      deprecated,\n      description,\n      example,\n    };\n  }\n\n  static fromOperation(operation: OpenAPILatest.OperationObject) {\n    const { deprecated, description, summary, tags } = operation;\n    return {\n      deprecated,\n      description,\n      summary,\n      tags,\n    };\n  }\n\n  static printExternalDoc(externalDoc?: OpenAPILatest.ExternalDocumentationObject) {\n    const { url, description } = externalDoc || {};\n\n    // {@link https://github.com GitHub}\n    if (url && description)\n      return `{@link ${url} ${description}}`;\n    if (url)\n      return `{@link ${url}}`;\n    if (description)\n      return description;\n    return false;\n  }\n}\n","import type { OpenAPILatest } from '../types/openapi';\nimport type { OpenApiLatest_Schema } from './helpers';\nimport type { Named } from './Named';\nimport { isArray, isBoolean, isNever, isNumber, isString, isUndefined } from '../utils/type-is';\nimport { ZOD_IMPORT_NAME } from './const';\nimport { isRefSchema, requiredTypeStringify, toZodName, withGroup } from './helpers';\nimport { JsDoc } from './JsDoc';\n\nexport interface ParseResult {\n  required: boolean;\n  comments: Record<string, unknown>;\n  deps: string[];\n  type: string;\n  zod: string;\n}\n\nexport class Parser {\n  constructor(readonly named: Named, readonly schema: OpenApiLatest_Schema) {\n    //\n  }\n\n  #depSets = new Set<string>();\n\n  #prepareVarName(refId: string) {\n    const typeName = this.named.getRefType(refId);\n\n    if (!typeName) {\n      throw new Error(`未找到 refId: ${refId} 的类型`);\n    }\n\n    const varName = this.named.prepareVarName(toZodName(typeName));\n    this.#depSets.add(varName);\n    return varName;\n  }\n\n  get #depNames() {\n    return [...this.#depSets.values()];\n  }\n\n  #mergeResultDeps(parseResult: ParseResult) {\n    parseResult.deps.forEach((d) => {\n      this.#depSets.add(d);\n    });\n  }\n\n  #mergeParserDeps(parser: Parser) {\n    parser.#depSets.forEach((d) => {\n      this.#depSets.add(d);\n    });\n  }\n\n  parse(): ParseResult {\n    const { schema } = this;\n\n    if (isRefSchema(schema)) {\n      const typeName = this.named.getRefType(schema.$ref);\n      const zodName = typeName ? this.#prepareVarName(schema.$ref) : `${ZOD_IMPORT_NAME}.unknown()`;\n\n      if (!typeName) {\n        throw new Error(`未找到 refId: ${schema.$ref} 的类型`);\n      }\n\n      return {\n        type: typeName,\n        zod: zodName,\n        comments: JsDoc.fromRef(schema),\n        required: false,\n        deps: [...this.#depSets.values()],\n      };\n    }\n\n    const { type, allOf, oneOf, anyOf, required } = schema;\n    const requiredBool = isBoolean(required) ? required : false;\n    const comments = JsDoc.fromSchema(schema);\n\n    if (allOf && allOf.length > 0) {\n      const group = allOf.map(a => Parser.#parseInner(this, a));\n\n      return {\n        comments,\n        required: false,\n        deps: this.#depNames,\n        type: withGroup(group.map(g => g.type), {\n          sep: '&',\n        }),\n        zod: withGroup(\n          group.map(g => g.zod),\n          {\n            sep: ',',\n            wrap: [`${ZOD_IMPORT_NAME}.intersection(`, ')'],\n          },\n        ),\n      };\n    }\n\n    // TODO 不是精确的 oneof\n    // https://arif.thedev.id/blogs/typescript/the-oneof-type\n    // 但为了能够将类型转换为 zod schema，暂时保持模糊\n    if (oneOf && oneOf.length > 0) {\n      const group = oneOf.map(o => Parser.#parseInner(this, o));\n\n      return {\n        comments,\n        required: false,\n        deps: this.#depNames,\n        type: withGroup(group.map(g => g.type), {\n          sep: '|',\n        }),\n        zod: withGroup(\n          group.map(g => g.zod),\n          {\n            wrap: [`${ZOD_IMPORT_NAME}.union([`, '])'],\n          },\n        ),\n      };\n    }\n\n    if (anyOf && anyOf.length > 0) {\n      const group = anyOf.map(a => Parser.#parseInner(this, a));\n\n      return {\n        comments,\n        required: false,\n        deps: this.#depNames,\n        type: withGroup(group.map(g => g.type), {\n          sep: '|',\n        }),\n        zod: withGroup(\n          group.map(g => g.zod),\n          {\n            sep: ',',\n            wrap: [`${ZOD_IMPORT_NAME}.union([`, '])'],\n          },\n        ),\n      };\n    }\n\n    if (isArray(type)) {\n      if (type.length === 0) {\n        return Parser.#parseAsUnknown(schema, requiredBool);\n      }\n\n      if (type.length === 1) {\n        return Parser.#parseInner(this, {\n          ...schema,\n          // eslint-disable-next-line ts/ban-ts-comment\n          // @ts-ignore\n          type: type[0],\n        });\n      }\n\n      const group = type.map(type => Parser.#parseInner(this, type === 'null'\n        // null\n        ? { type }\n        // origin\n        : ({ ...schema, type } as OpenAPILatest.SchemaObject)),\n      );\n\n      return {\n        comments,\n        required: false,\n        deps: this.#depNames,\n        type: withGroup(group.map(g => g.type), {\n          sep: '|',\n        }),\n        zod: withGroup(\n          group.map(g => g.zod),\n          {\n            wrap: [`${ZOD_IMPORT_NAME}.union([`, '])'],\n          },\n        ),\n      };\n    }\n\n    switch (type) {\n      case 'string': {\n        const { enum: enumValues = [], format, minLength, maxLength, pattern } = schema;\n        const isBlob = format === 'binary';\n        const required = Boolean(schema.required);\n\n        return {\n          comments: {\n            ...comments,\n            minLength,\n            maxLength,\n            pattern,\n          },\n          required,\n          deps: this.#depNames,\n          type: enumValues.length > 0\n            ? withGroup(\n                enumValues.map(e => (isString(e)\n                  ? JSON.stringify(e)\n                  : this.named.getRefType(e.$ref) || 'unknown')),\n                {\n                  sep: '|',\n                },\n              )\n            : isBlob\n              ? 'Blob'\n              : 'string',\n          zod: enumValues.length > 0\n            ? withGroup(\n                enumValues.map(e => (isString(e))\n                  ? `${ZOD_IMPORT_NAME}.literal(${JSON.stringify(e)})`\n                  : this.#prepareVarName(e.$ref)),\n                {\n                  wrap: [`${ZOD_IMPORT_NAME}.union([`, '])'],\n                },\n              )\n            : isBlob\n              ? `${ZOD_IMPORT_NAME}.instanceof(Blob)`\n              : `${ZOD_IMPORT_NAME}.string()`,\n        };\n      }\n\n      case 'number':\n      case 'integer': {\n        const { enum: enumValues = [], const: const_, minimum, maximum } = schema;\n        const required = Boolean(schema.required);\n\n        if (!isUndefined(const_))\n          enumValues.push(const_);\n\n        return {\n          comments: {\n            ...comments,\n            minimum,\n            maximum,\n          },\n          required,\n          deps: this.#depNames,\n          type: enumValues.length > 0\n            ? withGroup(\n                enumValues.map(e => (isNumber(e)\n                  ? String(e)\n                  : this.named.getRefType(e.$ref) || 'unknown')),\n                {\n                  sep: '|',\n                },\n              )\n            : 'number',\n          zod: enumValues.length > 0\n            ? withGroup(\n                enumValues.map(e => (isNumber(e)\n                  ? `${ZOD_IMPORT_NAME}.literal(${e})`\n                  : this.#prepareVarName(e.$ref))),\n                {\n                  wrap: [`${ZOD_IMPORT_NAME}.union([`, '])'],\n                },\n              )\n            : `${ZOD_IMPORT_NAME}.number()`,\n        };\n      }\n\n      case 'boolean': {\n        const { enum: enumValues = [] } = schema;\n        const required = Boolean(schema.required);\n\n        return {\n          comments,\n          required,\n          deps: this.#depNames,\n          type: enumValues.length > 0\n            ? withGroup(\n                enumValues.map(e => (isBoolean(e)\n                  ? String(e)\n                  : this.named.getRefType(e.$ref) || 'unknown')),\n                {\n                  sep: '|',\n                },\n              )\n            : type,\n          zod: enumValues.length > 0\n            ? withGroup(\n                enumValues.map(e => (isBoolean(e)\n                  ? `${ZOD_IMPORT_NAME}.literal(${e})`\n                  : this.#prepareVarName(e.$ref))),\n                {\n                  sep: ',',\n                  wrap: [`${ZOD_IMPORT_NAME}.union([`, '])'],\n                },\n              )\n            : `${ZOD_IMPORT_NAME}.boolean()`,\n        };\n      }\n\n      case 'null': {\n        const required = Boolean(schema.required);\n\n        return {\n          comments,\n          required,\n          deps: this.#depNames,\n          type,\n          zod: `${ZOD_IMPORT_NAME}.null()`,\n        };\n      }\n\n      case 'array':\n        return Parser.#parseArray(this, schema);\n\n      case 'object':\n        return Parser.#parseObject(this, schema);\n\n      case undefined: {\n        // 智能判断类型\n        if ('properties' in schema) {\n          return Parser.#parseObject(this, schema);\n        }\n        else if ('additionalProperties' in schema) {\n          return Parser.#parseObject(this, schema);\n        }\n        else if ('items' in schema) {\n          return Parser.#parseArray(this, schema as unknown as OpenAPILatest.ArraySchemaObject);\n        }\n        else {\n          return Parser.#parseAsUnknown(schema, requiredBool);\n        }\n      }\n\n      default:\n        isNever(type);\n        return Parser.#parseAsUnknown(schema, requiredBool);\n    }\n  }\n\n  static parse(named: Named, schema: OpenApiLatest_Schema) {\n    return new Parser(named, schema).parse();\n  }\n\n  static #parseInner(parent: Parser, schema: OpenApiLatest_Schema) {\n    const result = new Parser(parent.named, schema).parse();\n    parent.#mergeResultDeps(result);\n    return result;\n  }\n\n  static #parseAsUnknown(schema: OpenApiLatest_Schema, required = false, spec?: { type?: string; zod?: string }): ParseResult {\n    const comments = JsDoc.fromSchema(schema);\n\n    return {\n      comments,\n      required,\n      deps: [],\n      type: spec?.type || 'unknown',\n      zod: spec?.zod || `${ZOD_IMPORT_NAME}.unknown()`,\n    };\n  }\n\n  static #parseArray(parent: Parser, schema: OpenAPILatest.ArraySchemaObject) {\n    const comments = JsDoc.fromSchema(schema);\n    const { minItems, maxItems, items } = schema;\n    const result = Parser.#parseInner(parent, items);\n\n    return {\n      comments: {\n        ...comments,\n        minItems,\n        maxItems,\n      },\n      required: false,\n      deps: result.deps,\n      type: `Array<${result.type}>`,\n      zod: `${ZOD_IMPORT_NAME}.array(${result.zod})`,\n    };\n  }\n\n  static #parseObject(parent: Parser, schema: OpenAPILatest.SchemaObject): ParseResult {\n    const parser = new Parser(parent.named, schema);\n    const required = isBoolean(schema.required) ? schema.required : false;\n    const comments = JsDoc.fromSchema(schema);\n    const explicitProps = 'properties' in schema ? schema.properties : undefined;\n\n    // additionalProperties: true\n    // additionalProperties: false\n    // additionalProperties: {...}\n    const genericProps = 'additionalProperties' in schema ? schema.additionalProperties : undefined;\n    const explicitEntries = Object.entries(explicitProps || {});\n\n    const noExplicitProps = explicitEntries.length === 0;\n    const noGenericProps = isUndefined(genericProps) || genericProps === false || Object.keys(genericProps).length === 0;\n\n    const typeList: string[] = [];\n    const zodList: string[] = [];\n\n    // 有显式属性\n    if (!noExplicitProps) {\n      const propTypeList: string[] = [];\n      const propZodList: string[] = [];\n\n      explicitEntries.forEach(([name, propSchema]) => {\n        const { type, zod } = Parser.#parseObjectProp(parser, name, propSchema, isArray(schema.required) ? schema.required?.includes(name) : false);\n        propTypeList.push(type);\n        propZodList.push(zod);\n      });\n\n      typeList.push(withGroup(propTypeList, {\n        sep: '\\n',\n        wrap: ['{\\n', '\\n}'],\n        always: true,\n      }));\n      zodList.push(withGroup(propZodList, {\n        sep: '\\n',\n        wrap: [`${ZOD_IMPORT_NAME}.object({\\n`, '\\n})'],\n        always: true,\n      }));\n    }\n\n    // 有泛型属性\n    if (!noGenericProps) {\n      const { type, zod } = Parser.#parseInner(parser, genericProps as OpenApiLatest_Schema);\n\n      typeList.push(`Record<string, ${type}>`);\n      zodList.push(`${ZOD_IMPORT_NAME}.record(${ZOD_IMPORT_NAME}.string(), ${zod})`);\n    }\n\n    // 无显式属性 && 无泛型属性\n    if (typeList.length === 0) {\n      return Parser.#parseAsUnknown(schema, required, {\n        type: 'Record<string, unknown>',\n        zod: `${ZOD_IMPORT_NAME}.record(${ZOD_IMPORT_NAME}.string(), ${ZOD_IMPORT_NAME}.unknown())`,\n      });\n    }\n\n    parent.#mergeParserDeps(parser);\n\n    return {\n      comments,\n      required: isBoolean(schema.required) ? schema.required : false,\n      deps: parser.#depNames,\n      type: withGroup(typeList, {\n        sep: '&',\n      }),\n      zod: withGroup(zodList, {\n        wrap: [`${ZOD_IMPORT_NAME}.intersection(`, ')'],\n      }),\n    };\n  }\n\n  static #parseObjectProp(parent: Parser, propName: string, propSchema: boolean | OpenAPILatest.SchemaObject | OpenAPILatest.ReferenceObject, propRequired1: boolean) {\n    const { required: propRequired2, comments, type, zod } = isBoolean(propSchema) ? Parser.#parsePropBoolean(propSchema) : Parser.#parseInner(parent, propSchema);\n    const jsDoc = new JsDoc();\n    jsDoc.addComments(comments);\n    const required = propRequired1 || propRequired2 || false;\n\n    return {\n      type: [jsDoc.print(), `${JSON.stringify(propName)}${requiredTypeStringify(required)}${type};`].filter(Boolean).join('\\n'),\n      zod: `${JSON.stringify(propName)}: ${required ? zod : `${ZOD_IMPORT_NAME}.optional(${zod})`},`,\n    };\n  }\n\n  static #parsePropBoolean(bool: boolean): ParseResult {\n    return {\n      comments: {},\n      deps: [],\n      required: true,\n      type: bool ? 'any' : 'never',\n      zod: bool ? `${ZOD_IMPORT_NAME}.any()` : `${ZOD_IMPORT_NAME}.never()`,\n    };\n  }\n}\n","export interface PathSlice {\n  type: 'param' | 'segment';\n  value: string;\n};\n\nexport class VarPath {\n  #slices: PathSlice[] = [];\n  props: string[] = [];\n  constructor(readonly path: string) {\n    this.#slices = path.split('/').map((s) => {\n      const type = s.startsWith('{') && s.endsWith('}') ? 'param' : 'segment';\n      const value = type === 'segment' ? s : s.slice(1, -1);\n\n      if (type === 'param')\n        this.props.push(value);\n\n      return { type, value };\n    });\n  }\n\n  toString(vars: Record<string, string>) {\n    if (!this.props.length) {\n      return JSON.stringify(this.path);\n    }\n\n    const path = this.#slices.map(({ type, value }) => {\n      if (type === 'segment')\n        return value;\n\n      const varName = vars[value];\n\n      if (varName === undefined) {\n        throw new Error(`路径参数 ${value} 未定义`);\n      }\n\n      return `\\${${vars[value]}}`;\n    }).join('/');\n    return `\\`${path}\\``;\n  }\n\n  toPattern() {\n    if (!this.props.length) {\n      return JSON.stringify(this.path);\n    }\n\n    const main = this.#slices.map(({ type, value }) => {\n      return type === 'segment' ? value : '[^/]+';\n    }).join('\\\\/');\n    return `/^${main}$/`;\n  }\n}\n","import type { OpenAPILatest } from '../types/openapi';\nimport type { OpenApiLatest_Parameter } from './helpers';\nimport type { Named } from './Named';\nimport type { PrinterOptions } from './types';\nimport { AXIOS_PARAM_CONFIG_NAME, AXIOS_REQUEST_TYPE_NAME } from './const';\nimport { isRefParameter, requiredKeyStringify, toZodName } from './helpers';\nimport { Parser } from './Parser';\nimport { VarPath } from './VarPath';\n\nexport type ArgKind = 'path' | 'headers' | 'cookies' | 'params' | 'data' | 'config' | 'response';\n\nexport interface ArgProp {\n  name: string;\n  parameter: OpenAPILatest.ParameterObject;\n  schema: OpenAPILatest.SchemaObject;\n}\n\nexport class Arg {\n  parameters: OpenApiLatest_Parameter[] = [];\n  originName: string = '';\n\n  /**\n   * 作为属性的名称\n   */\n  propName = '';\n  /**\n   * 作为参数的注释名称\n   */\n  docName = '';\n  /**\n   * 作为参数的变量名称\n   */\n  argName = '';\n  /**\n   * 作为 zod 的变量名称\n   */\n  zodName = '';\n  /**\n   * 是否必填\n   */\n  required = false;\n  /**\n   * 类型名称\n   */\n  typeName = '';\n  /**\n   * 类型值\n   */\n  typeValue = '';\n  /**\n   * zod 值\n   */\n  zodValue = '';\n  comments: Record<string, unknown> = {};\n  props: ArgProp[] = [];\n\n  constructor(\n    readonly kind: ArgKind,\n    readonly operationName: string,\n    readonly docNamed: Named,\n    readonly argNamed: Named,\n    readonly printOptions: PrinterOptions,\n    /**\n     * 是否单参数（如 data、config、response）\n     */\n    readonly isSingle: boolean = false,\n  ) {\n    this.originName = kind;\n    this.propName = kind === 'path' ? 'url' : kind;\n    this.docName = kind;\n    this.argName = '';\n    this.typeName = docNamed.nextTypeName(`${operationName}-${kind}`);\n    this.zodName = docNamed.prepareVarName(toZodName(this.typeName));\n  }\n\n  varPath = new VarPath('');\n\n  add(parameter?: OpenApiLatest_Parameter) {\n    if (!parameter)\n      return;\n\n    this.parameters.push(parameter);\n  }\n\n  parse(): Arg | null {\n    const fixedParameters = this.parameters.filter(p => !isRefParameter(p) && 'schema' in p && p.schema) as OpenAPILatest.ParameterObject[];\n    const propLength = fixedParameters.length;\n    const requiredNames: string[] = [];\n\n    fixedParameters.forEach((parameter) => {\n      const { required, schema, name } = parameter;\n\n      if (!schema)\n        return;\n\n      if (required || parameter.in === 'path') {\n        requiredNames.push(name);\n        parameter.required = true;\n      }\n\n      this.props.push({\n        parameter,\n        name,\n        schema: schema!,\n      });\n    });\n\n    switch (propLength) {\n      case 0: {\n        switch (this.kind) {\n          case 'path':\n            this.required = true;\n            this.typeValue = '';\n            this.argName = this.argNamed.nextVarName(this.docName);\n            return this;\n\n          case 'config':\n            this.typeValue = AXIOS_REQUEST_TYPE_NAME;\n            this.argName = AXIOS_PARAM_CONFIG_NAME;\n            this.comments = {\n              [`param [${this.argName}]`]: `request ${this.propName}`,\n            };\n            return this;\n        }\n        return null;\n      }\n\n      case 1: {\n        // prop0: type0\n        const [firstArg] = this.props;\n        const { parameter, schema } = firstArg;\n        const result = Parser.parse(this.docNamed, schema);\n        const isResponse = this.kind === 'response';\n        const required = parameter.required || result.required || false;\n\n        this.originName = firstArg.name;\n        this.argName = this.argNamed.nextVarName(firstArg.name);\n        this.required = required;\n        this.typeValue = result.type;\n        this.zodValue = result.zod;\n        this.comments = isResponse\n          ? {\n              returns: parameter.description || schema.description || false,\n            }\n          : {\n              [\n              `param ${requiredKeyStringify(this.argName, required)}`]: parameter.description || schema.description\n                || (this.kind === 'data' ? 'request data' : `request ${this.docName} ${JSON.stringify(firstArg.name)}`),\n            };\n        return this;\n      }\n\n      default: {\n        // name: {prop0: type0, prop1: type1, ...}\n        const rootSchema: OpenAPILatest.SchemaObject = {\n          type: 'object',\n          properties: this.props.reduce(\n            (acc, { parameter, schema, name: originName }) => {\n              acc[originName] = {\n                ...schema,\n                description: parameter.description || schema.description,\n                deprecated: parameter.deprecated || schema.deprecated,\n              };\n              return acc;\n            },\n            {} as Record<string, OpenAPILatest.SchemaObject>,\n          ),\n          required: requiredNames,\n        };\n        const result = Parser.parse(this.docNamed, rootSchema);\n        const required = requiredNames.length > 0;\n\n        this.required = required;\n        this.typeValue = result.type;\n        this.zodValue = result.zod;\n        this.argName = this.argNamed.nextVarName(this.docName);\n        this.comments = this.kind === 'response'\n          ? {\n              returns: result.comments.description,\n            }\n          : {\n              [`param ${requiredKeyStringify(this.docName, required)}`]: `request ${this.docName}`,\n            };\n        return this;\n      }\n    }\n  }\n}\n","import type { Arg } from './Arg';\nimport { TYPE_FILE_EXPORT_NAME } from './const';\nimport { requiredTypeStringify } from './helpers';\n\nexport class Args {\n  fixedArgs: Arg[];\n  constructor(private args: (Arg | null)[]) {\n    this.fixedArgs = this._sort();\n  }\n\n  private _sort() {\n    const fixedArgs = this.args.filter(Boolean) as Arg[];\n    return fixedArgs.sort((a, b) => Number(b.required) - Number(a.required));\n  }\n\n  toComments() {\n    return this.fixedArgs.reduce(\n      (acc, arg) => {\n        return {\n          ...acc,\n          ...arg.comments,\n        };\n      },\n      {} as Record<string, unknown>,\n    );\n  }\n\n  printFormalParams() {\n    return this.fixedArgs\n      .filter(fixArg => fixArg.typeValue !== '')\n      .map((fixArg) => {\n        const typeValue = fixArg.kind === 'config' ? fixArg.typeValue : `${TYPE_FILE_EXPORT_NAME}.${fixArg.typeName}`;\n        return `${fixArg.argName}${requiredTypeStringify(fixArg.required)}${typeValue}`;\n      })\n      .join(',');\n  }\n\n  filterValidateAble() {\n    return this.fixedArgs\n      .filter(fixArg => fixArg.typeValue !== '' && fixArg.kind !== 'config');\n  }\n\n  printSchemaTypes() {\n    return this.filterValidateAble()\n      .map(fixArg => `export type ${fixArg.typeName} = ${fixArg.typeValue};`);\n  }\n\n  printActualParams() {\n    return this.fixedArgs\n      .map((fixedArg) => {\n        const { originName, argName: varName, propName, kind, props, varPath, isSingle } = fixedArg;\n\n        switch (kind) {\n          case 'config':\n            return `...${varName}`;\n\n          case 'path': {\n            const singleProp = varPath.props.length === 1;\n            const resolvedURL = varPath.toString(props.reduce((acc, cur) => {\n              acc[cur.name] = singleProp ? varName : `${varName}[${JSON.stringify(cur.name)}]`;\n              return acc;\n            }, {} as Record<string, string>));\n            return `url: ${resolvedURL}`;\n          }\n\n          default: {\n            const value = props.length === 1 && !isSingle ? `{${JSON.stringify(originName)}: ${varName}}` : varName;\n            return `${propName}: ${value}`;\n          }\n        }\n      })\n      .join(',\\n');\n  }\n}\n","import type { OrderlyItem } from './helpers';\nimport { isArray } from '../utils/type-is';\nimport { sortingByDeps } from './helpers';\n\nconst contentTypes = [\n  'header',\n  'alert',\n  'info',\n  'import',\n  'block',\n  'footer',\n] as const;\nexport type ContentType = typeof contentTypes[number];\nexport interface OrderlyCode extends OrderlyItem {\n  code: string;\n}\n\nexport class Content {\n  parts = new Map<ContentType, string[]>();\n  orderlyCodes: OrderlyCode[] = [];\n\n  push(type: ContentType, code: string | string[]) {\n    const part = this.parts.get(type) || [];\n    part.push(...isArray(code) ? code : [code]);\n    this.parts.set(type, part);\n  }\n\n  unshift(type: ContentType, code: string | string[]) {\n    const part = this.parts.get(type) || [];\n    part.unshift(...isArray(code) ? code : [code]);\n    this.parts.set(type, part);\n  }\n\n  add(orderlyCode: OrderlyCode) {\n    this.orderlyCodes.push(orderlyCode);\n  }\n\n  print() {\n    this.unshift('block', sortingByDeps(this.orderlyCodes).map(i => i.code));\n    this.orderlyCodes.length = 0;\n    const parts = [...contentTypes].map(t => this.parts.get(t)).filter(Boolean) as string[][];\n    return parts.map(p => p.join('\\n')).join('\\n\\n');\n  }\n\n  errors: string[] = [];\n  pushError(message: string) {\n    this.errors.push(message);\n  }\n}\n","import { fixVarName, nextUniqueName } from '../utils/string';\nimport { INTERNAL_TYPES, INTERNAL_VARS, KEYWORD_VARS } from './const';\n\nexport class Named {\n  // eslint-disable-next-line style/type-generic-spacing\n  varNameCountMap = new Map<string /* var */, number /* count */>();\n  // eslint-disable-next-line style/type-generic-spacing\n  typeNameCountMap = new Map<string /* type */, number /* count */>();\n  // eslint-disable-next-line style/type-generic-spacing\n  refIdTypeMap = new Map<string /* refId */, string /* refType */>();\n\n  constructor({ keywordVars, internalTypes, internalVars }: {\n    keywordVars?: boolean;\n    internalVars?: boolean;\n    internalTypes?: boolean;\n  } = {}) {\n    if (keywordVars)\n      KEYWORD_VARS.forEach(this.internalVarName.bind(this));\n\n    if (internalVars)\n      INTERNAL_VARS.forEach(this.internalVarName.bind(this));\n\n    if (internalTypes)\n      INTERNAL_TYPES.forEach(this.internalTypeName.bind(this));\n  }\n\n  /**\n   * 注册内部变量\n   * @param {string} varName\n   */\n  internalVarName(varName: string) {\n    this.varNameCountMap.set(varName, 1);\n  }\n\n  /**\n   * 注册内部类型\n   * @param {string} typeName\n   */\n  internalTypeName(typeName: string) {\n    this.typeNameCountMap.set(typeName, 1);\n  }\n\n  nextVarName(name: string) {\n    return nextUniqueName(fixVarName(name), this.varNameCountMap);\n  }\n\n  prepareVars = new Map<string, string>();\n  /**\n   * 预设变量名，如果存在则返回，否则创建\n   * @param {string} name\n   */\n  prepareVarName(name: string) {\n    const next = this.prepareVars.get(name) || this.nextVarName(name);\n    this.prepareVars.set(name, next);\n    return next;\n  }\n\n  nextOperationId(method: string, url: string, operationId?: string) {\n    operationId = operationId\n      || fixVarName(\n        [\n          method,\n          url\n            .replace(/\\{.*?\\}/g, '')\n            .split('/')\n            .filter(Boolean),\n        ].join('_'),\n      );\n    return nextUniqueName(operationId, this.varNameCountMap);\n  }\n\n  nextTypeName(typeName: string) {\n    const fixedTypeName = fixVarName(typeName, true, 'Type');\n    return nextUniqueName(fixedTypeName, this.typeNameCountMap);\n  }\n\n  nextRefType(refType: string, refId: string) {\n    const uniqueTypeName = this.nextTypeName(refType);\n    this.setRefType(refId, uniqueTypeName);\n    return uniqueTypeName;\n  }\n\n  setRefType(refId: string, refType: string) {\n    this.refIdTypeMap.set(refId, refType);\n  }\n\n  getRefType(refId: string) {\n    return this.refIdTypeMap.get(refId);\n  }\n}\n","import type { OpenAPILatest } from '../types/openapi';\nimport type {\n  OpenApiLatest_Media,\n  OpenApiLatest_Operation,\n  OpenApiLatest_Parameter,\n  OpenApiLatest_PathItem,\n  OpenApiLatest_Request,\n  OpenApiLatest_Response,\n  OpenApiLatest_Schema,\n} from './helpers';\nimport type { PrinterConfigs, PrinterOptions, PrintResults } from './types';\nimport { isPackageExists } from 'local-pkg';\nimport { pkgName, pkgVersion } from '../const';\nimport { OpenAPIVersion } from '../types/openapi';\nimport { toImportPath, toRelative } from '../utils/path';\nimport { fixVarName } from '../utils/string';\nimport { isBoolean, isString, isUndefined } from '../utils/type-is';\nimport { Arg } from './Arg';\nimport { Args } from './Args';\nimport {\n  AXIOS_IMPORT_FILE,\n  AXIOS_IMPORT_NAME,\n  AXIOS_PARAM_TRANSFORM_RESPONSE_NAME,\n  AXIOS_REQUEST_TYPE_NAME,\n  AXIOS_RESPONSE_NAME,\n  DEFAULT_ENABLE_CONDITION,\n  DEFAULT_RESPONSE_DATA_PROPS,\n  ENABLE_MOCK_NAME,\n  FAKER_IMPORT_FILE,\n  FAKER_IMPORT_NAME,\n  TYPE_FILE_EXPORT_NAME,\n  ZOD_IMPORT_NAME,\n} from './const';\nimport { Content } from './Content';\nimport {\n  isRefMedia,\n  isRefOperation,\n  isRefParameter,\n  isRefPathItem,\n  isRefRequest,\n  isRefResponse,\n  isRefSchema,\n  toImportString,\n  toZodName,\n} from './helpers';\nimport { JsDoc } from './JsDoc';\nimport { Named } from './Named';\nimport { Parser } from './Parser';\nimport { VarPath } from './VarPath';\n\nconst allowMethods = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'];\nconst parameterTypes = ['query', 'header', 'path', 'cookie'];\n\ntype RequestMediaMatch = (contentType: string, content: OpenApiLatest_Media) => boolean;\ntype ResponseMediaMatch = (\n  contentType: string,\n  content: OpenApiLatest_Media,\n  response: OpenAPILatest.ResponseObject,\n) => boolean;\n\ntype ResponseMatch = (statusCode: string, response: OpenApiLatest_Response) => boolean;\n\ntype WithId<T> = T & {\n  nodeId: string;\n  namedId?: string;\n};\ntype SchemaInfo = WithId<{\n  position: 'root' | 'anchor';\n  schema: OpenApiLatest_Schema;\n  typeName: string;\n  nodeName: string;\n}>;\ntype RequestBodyInfo = WithId<{ requestBody: OpenApiLatest_Request }>;\ntype ParameterInfo = WithId<{ parameter: OpenApiLatest_Parameter }>;\ntype ResponseInfo = WithId<{ response: OpenApiLatest_Response }>;\ntype PathItemInfo = WithId<{ pathItem: OpenApiLatest_PathItem }>;\n\nexport class Printer {\n  named = new Named({ internalVars: true, internalTypes: true });\n\n  #mainContent = new Content();\n  #typeContent = new Content();\n  #zodContent = new Content();\n  #mockContent = new Content();\n\n  private configs: PrinterConfigs = {};\n\n  constructor(\n    private readonly document: OpenAPILatest.Document,\n    private options?: PrinterOptions,\n  ) {\n    const { openapi } = document;\n\n    if (!openapi)\n      throw new Error('未找到 openapi 版本号');\n    if (!openapi.startsWith(OpenAPIVersion.V3_1)) {\n      throw new Error(`当前仅支持 openapi ${OpenAPIVersion.V3_1}，当前版本为 ${openapi}`);\n    }\n\n    this.registerComponents();\n  }\n\n  schemas: Record<string /** nodeId */, SchemaInfo> = {};\n  requestBodies: Record<string /** nodeId */, RequestBodyInfo> = {};\n  parameters: Record<string /** nodeId */, ParameterInfo> = {};\n  responses: Record<string /** nodeId */, ResponseInfo> = {};\n  pathItems: Record<string /** nodeId */, PathItemInfo> = {};\n\n  #pathZodNames = new Set<string>();\n  #respZodNames = new Set<string>();\n\n  #parseRefComponent<T>(\n    {\n      kind,\n      name,\n      obj,\n    }: {\n      kind: keyof OpenAPILatest.ComponentsObject;\n      name: string;\n      obj: { $ref: string } | { $id?: string };\n    },\n    processor: (nodeId: string, namedId?: string) => unknown,\n  ) {\n    const nodeId = `#/components/${kind}/${name}`;\n    const refId = '$ref' in obj ? obj.$ref : '';\n    const namedId = '$ref' in obj ? '' : obj.$id;\n\n    if (refId === nodeId) {\n      throw new Error(`${kind}/${name} 引用了自身`);\n    }\n\n    processor(nodeId, namedId);\n  }\n\n  registerComponents() {\n    const {\n      schemas = {},\n      requestBodies = {},\n      parameters = {},\n      responses = {},\n      pathItems = {},\n    } = this.document.components || {};\n\n    for (const [name, schema] of Object.entries(schemas)) {\n      this.#parseRefComponent(\n        {\n          kind: 'schemas',\n          name,\n          obj: schema,\n        },\n        (nodeId, namedId) => {\n          if (this.schemas[nodeId]) {\n            throw new Error(`重复的 schema 引用 id：${nodeId}`);\n          }\n\n          const typeName = this.named.nextRefType(name, nodeId);\n          this.schemas[nodeId] = {\n            position: 'root',\n            typeName,\n            schema,\n            nodeId,\n            namedId,\n            nodeName: name,\n          };\n          this.#tryRegisterAnchors({ namedId, nodeId, typeName }, schema);\n\n          if (namedId) {\n            this.named.setRefType(namedId, typeName);\n          }\n        },\n      );\n    }\n\n    for (const [name, requestBody] of Object.entries(requestBodies)) {\n      this.#parseRefComponent(\n        {\n          kind: 'requestBodies',\n          name,\n          obj: requestBody,\n        },\n        (nodeId, namedId) => {\n          if (this.requestBodies[nodeId]) {\n            throw new Error(`重复的 requestBody 引用 id：${nodeId}`);\n          }\n\n          this.requestBodies[nodeId] = { nodeId, namedId, requestBody };\n        },\n      );\n    }\n\n    for (const [name, parameter] of Object.entries(parameters)) {\n      this.#parseRefComponent(\n        {\n          kind: 'parameters',\n          name,\n          obj: parameter,\n        },\n        (nodeId, namedId) => {\n          if (this.parameters[nodeId]) {\n            throw new Error(`重复的 parameter 引用 id：${nodeId}`);\n          }\n\n          this.parameters[nodeId] = { nodeId, namedId, parameter };\n        },\n      );\n    }\n\n    for (const [name, response] of Object.entries(responses)) {\n      this.#parseRefComponent(\n        {\n          kind: 'responses',\n          name,\n          obj: response,\n        },\n        (nodeId, namedId) => {\n          if (this.responses[nodeId]) {\n            throw new Error(`重复的 response 引用 id：${nodeId}`);\n          }\n\n          this.responses[nodeId] = { nodeId, namedId, response };\n        },\n      );\n    }\n\n    for (const [name, pathItem] of Object.entries(pathItems)) {\n      this.#parseRefComponent(\n        {\n          kind: 'pathItems',\n          name,\n          obj: pathItem,\n        },\n        (nodeId, namedId) => {\n          if (this.pathItems[nodeId]) {\n            throw new Error(`重复的 pathItem 引用 id：${nodeId}`);\n          }\n\n          this.pathItems[nodeId] = { nodeId, namedId, pathItem };\n        },\n      );\n    }\n  }\n\n  #tryRegisterAnchors(info: { nodeId: string; namedId?: string; typeName: string }, schema: OpenApiLatest_Schema) {\n    const { nodeId, namedId, typeName } = info;\n\n    if (isRefSchema(schema))\n      return;\n\n    if (schema.$anchor) {\n      const anchorId = `${nodeId}#${schema.$anchor}`;\n\n      if (this.schemas[anchorId]) {\n        throw new Error(`重复的 anchor 引用 id：${anchorId}`);\n      }\n\n      const anchorNamedId = namedId && `${namedId}#${schema.$anchor}`;\n      const anchorTypeName = this.named.nextTypeName(`${typeName}-${schema.$anchor}`);\n\n      this.schemas[anchorId] = {\n        position: 'anchor',\n        nodeId: anchorId,\n        namedId: anchorNamedId,\n        typeName: anchorTypeName,\n        schema,\n        nodeName: anchorId,\n      };\n\n      this.named.setRefType(anchorId, anchorTypeName);\n      anchorNamedId && this.named.setRefType(anchorNamedId, anchorTypeName);\n    }\n\n    if ('items' in schema && schema.items) {\n      this.#tryRegisterAnchors(info, schema.items);\n    }\n    else if ('properties' in schema && schema.properties) {\n      for (const [prop, property] of Object.entries(schema.properties)) {\n        this.#tryRegisterAnchors(info, property);\n      }\n    }\n  }\n\n  print(configs?: PrinterConfigs): PrintResults {\n    Object.assign(this.configs, configs);\n    const {\n      hideHeaders,\n      hideFooters,\n      hideAlert,\n      hideInfo,\n      hideSchemas,\n      hideImports,\n      hidePaths,\n    } = this.configs;\n\n    !hideInfo && this.#printInfo();\n    !hideAlert && this.#printAlert();\n    !hideSchemas && this.#printSchemas();\n    !hidePaths && this.#printPaths();\n    !hideHeaders && this.#printHeader();\n    !hideFooters && this.#printFooter();\n    // 一定要放在最后，因为在 printSchemas 和 printPaths 阶段有更新 zodName\n    !hideImports && this.#printImports();\n\n    return {\n      main: {\n        lang: 'ts',\n        code: this.#mainContent.print(),\n        errors: this.#mainContent.errors,\n      },\n      type: {\n        lang: 'ts',\n        code: this.#typeContent.print(),\n        errors: this.#typeContent.errors,\n      },\n      zod: {\n        lang: 'ts',\n        code: this.#zodContent.print(),\n        errors: this.#zodContent.errors,\n      },\n      mock: {\n        lang: 'ts',\n        code: this.#mockContent.print(),\n        errors: this.#mockContent.errors,\n      },\n    };\n  }\n\n  #printAlert() {\n    const alert = [\n      `/**`,\n      ` * 由 ${pkgName}@${pkgVersion} 生成，建议忽略此文件的格式校验`,\n      ` */`,\n    ];\n\n    this.#mainContent.push('alert', alert);\n    this.#typeContent.push('alert', alert);\n    this.#zodContent.push('alert', alert);\n    this.#mockContent.push('alert', alert);\n  }\n\n  #printInfo() {\n    const { contact, description, license, summary, termsOfService, title, version } = this.document.info;\n    const { externalDocs } = this.document;\n    const { name, email, url } = contact || {};\n\n    const jsDoc = new JsDoc();\n    const { document } = this.configs;\n    document && jsDoc.addComments({ document });\n\n    const extDoc = JsDoc.printExternalDoc(externalDocs);\n    jsDoc.addComments({\n      title,\n      version,\n      contact:\n        name || url || email\n          ? [name, email ? `<${email}>` : '', url ? `(${url})` : ''].filter(Boolean).join(' ')\n          : undefined,\n      description,\n      summary,\n      see: extDoc,\n    });\n    const code = jsDoc.print();\n\n    this.#mainContent.push('info', code);\n    this.#typeContent.push('info', code);\n    this.#zodContent.push('info', code);\n    this.#mockContent.push('info', code);\n  }\n\n  #printImports() {\n    const {\n      axiosImportName = '',\n      axiosImportFile,\n      runtimeValidate,\n      runtimeMock,\n    } = this.options || {};\n    const { cwd = '/', mainFile, typeFile = '.', zodFile = '.', mockFile = '.' } = this.configs;\n    const axiosImportFile2 = axiosImportFile || AXIOS_IMPORT_FILE;\n    const importPath = toImportPath(axiosImportFile2, cwd, mainFile);\n\n    this.#mainContent.push('import', [\n      toImportString(AXIOS_IMPORT_NAME, axiosImportName, importPath),\n      `import type * as ${TYPE_FILE_EXPORT_NAME} from \"${toRelative(typeFile, mainFile)}\";`,\n    ]);\n\n    // 依赖 axios\n    if (!axiosImportFile || axiosImportFile === AXIOS_IMPORT_FILE) {\n      if (!isPackageExists(AXIOS_IMPORT_FILE)) {\n        this.#mockContent.pushError(`需要安装 ${AXIOS_IMPORT_FILE}`);\n      }\n    }\n\n    // 依赖 zod\n    if ((runtimeValidate || runtimeMock)) {\n      if (!isPackageExists('zod')) {\n        this.#zodContent.errors.push(`需要安装 zod`);\n      }\n    }\n\n    if (runtimeValidate) {\n      const zodNames = [...this.#pathZodNames.values()].join(',');\n      this.#mainContent.push('import', [\n        `import {${zodNames}} from \"${toRelative(zodFile, mainFile)}\";`,\n      ]);\n    }\n\n    if (runtimeMock) {\n      const {\n        fakerImportName = FAKER_IMPORT_NAME,\n        fakerImportFile = FAKER_IMPORT_FILE,\n      } = isBoolean(runtimeMock) ? {} : runtimeMock;\n\n      const fakerImportPath = toImportPath(fakerImportFile, cwd, mockFile);\n      const zodNames = [...this.#respZodNames.values()].join(',');\n      this.#mainContent.push('import', [\n        `import ${ENABLE_MOCK_NAME} from \"${toRelative(mockFile, mainFile)}\";`,\n      ]);\n      this.#mockContent.push('import', [\n        `import { generateMock } from \"@anatine/zod-mock\";`,\n        `import AxiosMockAdapter from \"axios-mock-adapter\";`,\n        toImportString(AXIOS_IMPORT_NAME, axiosImportName, importPath),\n        toImportString(FAKER_IMPORT_NAME, fakerImportName, fakerImportPath),\n        `import {${zodNames}} from \"${toRelative(zodFile, mainFile)}\";`,\n      ]);\n\n      if (!fakerImportFile || fakerImportFile === FAKER_IMPORT_FILE) {\n        if (!isPackageExists(FAKER_IMPORT_FILE)) {\n          this.#mockContent.pushError(`需要安装 ${FAKER_IMPORT_FILE}`);\n        }\n      }\n\n      if (!isPackageExists('@anatine/zod-mock')) {\n        this.#mockContent.pushError(`需要安装 @anatine/zod-mock`);\n      }\n\n      if (!isPackageExists('axios-mock-adapter')) {\n        this.#mockContent.pushError(`需要安装 axios-mock-adapter`);\n      }\n    }\n\n    this.#zodContent.push('import', `import { ${ZOD_IMPORT_NAME} } from \"zod\";`);\n  }\n\n  #printHeader() {\n    const { header } = this.options || {};\n    header && this.#mainContent.push('header', header);\n    header && this.#typeContent.push('header', header);\n    header && this.#zodContent.push('header', header);\n  }\n\n  #printFooter() {\n    const { footer } = this.options || {};\n    footer && this.#mainContent.push('footer', footer);\n    footer && this.#typeContent.push('footer', footer);\n    footer && this.#zodContent.push('footer', footer);\n  }\n\n  #printSchemas() {\n    Object.entries(this.schemas)\n      .forEach(([nodeId, schemaInfo]) => {\n        this.#printSchema(schemaInfo);\n      });\n  }\n\n  #printSchema({ schema, nodeId, nodeName, typeName }: SchemaInfo) {\n    if (isUndefined(typeName)) {\n      throw new Error(`未发现 schema 引用：${nodeId}`);\n    }\n\n    const zodName = this.named.prepareVarName(toZodName(typeName));\n\n    const { comments, deps, type, zod } = Parser.parse(this.named, schema);\n    const jsDoc = new JsDoc();\n    jsDoc.addComments({ name: nodeName });\n    jsDoc.addComments(comments);\n\n    this.#typeContent.push('block', [\n      jsDoc.print(),\n      `export type ${typeName} = ${type};`,\n    ]);\n    this.#zodContent.add({\n      name: zodName,\n      deps,\n      code: `export const ${zodName} = ${zod};`,\n    });\n  }\n\n  #printPaths() {\n    const { runtimeMock } = this.options || {};\n\n    if (runtimeMock) {\n      const enableCondition = isBoolean(runtimeMock) ? DEFAULT_ENABLE_CONDITION : runtimeMock.enableCondition || DEFAULT_ENABLE_CONDITION;\n      this.#mainContent.push('block', [\n        `if (${enableCondition}) {`,\n        `${ENABLE_MOCK_NAME}();`,\n        '}',\n      ]);\n      this.#mockContent.push('block', [\n        `export default function ${ENABLE_MOCK_NAME}() {`,\n        `const mock = new AxiosMockAdapter(axios);`,\n      ]);\n    }\n\n    this.#mainContent.push('block', ['', `type ${AXIOS_REQUEST_TYPE_NAME} = Parameters<typeof axios.request>[0];`, '']);\n\n    Object.entries(this.document.paths || {})\n      .forEach(([url, pathItem]) => {\n        this.#printPathItem(url, pathItem);\n      });\n\n    this.#mockContent.push('block', `}`);\n  }\n\n  #printPathItem(\n    url: string,\n    pathItem: OpenApiLatest_PathItem,\n  ) {\n    if (isRefPathItem(pathItem)) {\n      const refPathItem = this.pathItems[pathItem.$ref];\n\n      if (isUndefined(refPathItem)) {\n        throw new Error(`未发现 pathItem 引用：${pathItem.$ref}`);\n      }\n\n      this.#printPathItem(url, refPathItem.pathItem);\n      return;\n    }\n\n    Object.entries(pathItem).forEach(([method, _operation]) => {\n      // method === 'parameters'，migration 已忽略\n\n      const isOperation = allowMethods.includes(method);\n      if (!isOperation)\n        return;\n\n      // 转换后可能有 undefined 的情况\n      if (isUndefined(_operation))\n        return;\n\n      // 已经约束了是 http method\n      const operation = _operation as OpenApiLatest_Operation;\n      this.#printOperation(method, url, operation);\n    });\n  }\n\n  #printOperation(method: string, url: string, operation: OpenApiLatest_Operation) {\n    if (isRefOperation(operation))\n      return;\n\n    const options = this.options || {};\n    const { responseStatusCode, responseContentType, requestContentType, runtimeValidate, runtimeMock } = options;\n    const { parameters, requestBody, responses, operationId } = operation;\n\n    const argNamed = new Named({\n      keywordVars: true,\n      internalVars: true,\n      internalTypes: true,\n    });\n    argNamed.internalVarName(AXIOS_PARAM_TRANSFORM_RESPONSE_NAME);\n    const operationName = this.named.nextOperationId(method, url, operationId);\n\n    const headerArg = new Arg('headers', operationName, this.named, argNamed, options);\n    const cookie = new Arg('cookies', operationName, this.named, argNamed, options);\n    const queryArg = new Arg('params', operationName, this.named, argNamed, options);\n    const pathArg = new Arg('path', operationName, this.named, argNamed, options);\n    const dataArg = new Arg('data', operationName, this.named, argNamed, options, true);\n    const configArg = new Arg('config', operationName, this.named, argNamed, options, true);\n    const respArg = new Arg('response', operationName, this.named, argNamed, options, true);\n\n    pathArg.varPath = new VarPath(url); // 设置 url，用于解析 path 参数\n\n    if (parameters) {\n      for (const parameter of parameters) {\n        this.#parseParameter(parameter, {\n          header: headerArg,\n          cookie,\n          path: pathArg,\n          query: queryArg,\n        });\n      }\n    }\n\n    if (requestBody) {\n      this.#parseRequestBody(dataArg, requestBody, (contentType, content) => {\n        if (isString(requestContentType))\n          return requestContentType === contentType;\n        if (!requestContentType)\n          return true;\n\n        return requestContentType(contentType, {\n          content,\n          method,\n          operation,\n          url,\n        });\n      });\n    }\n\n    if (responses) {\n      this.#parseResponses(\n        respArg,\n        responses,\n        (statusCode, response) => {\n          if (isString(responseStatusCode))\n            return responseStatusCode === statusCode;\n          if (!responseStatusCode)\n            return statusCode.startsWith('2');\n\n          return responseStatusCode(statusCode, {\n            method,\n            url,\n            operation,\n            response,\n            responses,\n          });\n        },\n        (contentType, content, response) => {\n          if (isString(responseContentType))\n            return responseContentType === contentType;\n          if (!responseContentType)\n            return true;\n\n          return responseContentType(contentType, {\n            content,\n            method,\n            operation,\n            url,\n            response,\n            responses,\n          });\n        },\n      );\n    }\n\n    const requestArgs = new Args([headerArg.parse(), pathArg.parse(), queryArg.parse(), dataArg.parse(), configArg.parse()]);\n    const responseArgs = new Args([respArg.parse()]);\n\n    const formalParams = requestArgs.printFormalParams();\n    const responseArg = responseArgs.fixedArgs.at(0);\n\n    const validateAbleRequestArgs = requestArgs.filterValidateAble();\n\n    // jsdoc\n    {\n      const jsDoc = new JsDoc(this.document.tags);\n      const comments = JsDoc.fromOperation(operation);\n      const { document: module } = this.configs;\n\n      module && jsDoc.addComments({ module });\n      jsDoc.addComments(comments);\n      jsDoc.addComments(requestArgs.toComments());\n      jsDoc.addComments(responseArgs.toComments());\n      this.#mainContent.push('block', jsDoc.print());\n    }\n\n    let responseType = responseArg?.typeName;\n    responseType = responseType ? `${TYPE_FILE_EXPORT_NAME}.${responseType}` : 'unknown';\n    this.#mainContent.push('block', `export async function ${operationName}(${formalParams}) {`);\n\n    // validate request\n    if (runtimeValidate) {\n      this.#mainContent.push('block', validateAbleRequestArgs.map((arg) => {\n        const optionalIf = arg.required ? '' : `(${arg.argName} !== undefined) && `;\n        return `${optionalIf}${arg.zodName}.parse(${arg.argName});`;\n      }));\n    }\n\n    this.#mainContent.push('block', `const ${AXIOS_RESPONSE_NAME} = await ${AXIOS_IMPORT_NAME}<${responseType}>({`);\n    this.#mainContent.push('block', `  method: ${JSON.stringify(method.toUpperCase())},`);\n    this.#mainContent.push('block', requestArgs.printActualParams());\n    this.#mainContent.push('block', '});');\n\n    // validate response\n    if (runtimeValidate && responseArg) {\n      const props = isBoolean(runtimeValidate) ? DEFAULT_RESPONSE_DATA_PROPS : runtimeValidate.responseDataProps || DEFAULT_RESPONSE_DATA_PROPS;\n      const propString = props.map(prop => `[${JSON.stringify(prop)}]`).join('');\n      this.#mainContent.push('block', `${responseArg.zodName}.parse(${AXIOS_RESPONSE_NAME}${propString});`);\n    }\n\n    this.#mainContent.push('block', `return ${AXIOS_RESPONSE_NAME};`);\n    this.#mainContent.push('block', '}');\n\n    validateAbleRequestArgs.forEach((arg) => {\n      this.#pathZodNames.add(arg.zodName);\n      this.#zodContent.push('block', `export const ${arg.zodName} = ${arg.zodValue};`);\n    });\n\n    if (responseArg) {\n      this.#pathZodNames.add(responseArg.zodName);\n      this.#respZodNames.add(responseArg.zodName);\n      this.#zodContent.push('block', `export const ${responseArg.zodName} = ${responseArg.zodValue};`);\n    }\n\n    this.#typeContent.push('block', requestArgs.printSchemaTypes());\n    this.#typeContent.push('block', responseArgs.printSchemaTypes());\n\n    if (runtimeMock) {\n      const fnName = fixVarName(`on-${method}`);\n      this.#mockContent.push('block', [\n        `mock.${fnName}(${pathArg.varPath.toPattern()}).reply(() => {`,\n        responseArg ? `return [200, generateMock(${responseArg.zodName}, {faker: ${FAKER_IMPORT_NAME}})];` : 'return [200];',\n        `});`,\n      ]);\n    }\n  }\n\n  #parseContents(\n    arg: Arg,\n    contents: {\n      [contentType: string]: OpenAPILatest.MediaTypeObject | OpenAPILatest.ReferenceObject;\n    },\n    comments: {\n      description?: string;\n      required?: boolean;\n    },\n    match: RequestMediaMatch,\n  ) {\n    const content = Object.entries(contents).find(([contentType, content]) => {\n      return match(contentType, content);\n    })?.[1];\n\n    if (!content)\n      return;\n\n    this.#parseContent(arg, content, comments);\n  }\n\n  #parseContent(\n    arg: Arg,\n    content: OpenApiLatest_Media,\n    comments: {\n      description?: string;\n      required?: boolean;\n    },\n  ) {\n    if (isRefMedia(content)) {\n      const { $ref } = content;\n      const label = arg.kind === 'response' ? '响应' : '请求';\n\n      throw new Error(`不支持引用${label}内容：${$ref}`);\n    }\n\n    arg.add({\n      in: 'query',\n      name: 'data',\n      ...comments,\n      schema: content.schema,\n      required: true,\n    });\n  }\n\n  #parseParameter(parameter: OpenApiLatest_Parameter, args: Record<OpenAPILatest.ParameterObject['in'], Arg>) {\n    if (isRefParameter(parameter)) {\n      const { $ref } = parameter;\n      const refParameter = this.parameters[$ref];\n\n      if (!refParameter) {\n        throw new Error(`未发现 parameter 引用：${$ref}`);\n      }\n\n      this.#parseParameter(refParameter.parameter, args);\n      return;\n    }\n\n    if (parameterTypes.includes(parameter.in)) {\n      args[parameter.in].add(parameter);\n    }\n  }\n\n  #parseRequestBody(arg: Arg, requestBody: OpenApiLatest_Request, match: RequestMediaMatch) {\n    if (!requestBody)\n      return;\n\n    if (isRefRequest(requestBody)) {\n      const { $ref } = requestBody;\n      const refRequestBody = this.requestBodies[$ref];\n\n      if (!refRequestBody)\n        throw new Error(`未发现 requestBody 引用：${$ref}`);\n\n      this.#parseRequestBody(arg, refRequestBody.requestBody, match);\n      return;\n    }\n\n    this.#parseContents(arg, requestBody.content, requestBody, match);\n  }\n\n  #parseResponses(\n    arg: Arg,\n    responses: OpenAPILatest.ResponsesObject,\n    responseMatch: ResponseMatch,\n    contentMatch: ResponseMediaMatch,\n  ) {\n    const response = Object.entries(responses).find(([statusCode, response]) => {\n      return responseMatch(statusCode, response);\n    })?.[1];\n\n    if (!response)\n      return;\n\n    this.#parseResponse(arg, response, contentMatch);\n  }\n\n  #parseResponse(arg: Arg, response: OpenApiLatest_Response, contentMatch: ResponseMediaMatch) {\n    if (isRefResponse(response)) {\n      const { $ref } = response;\n      const refResponse = this.responses[$ref];\n\n      if (!refResponse)\n        throw new Error(`未发现 response 引用：${$ref}`);\n\n      this.#parseResponse(arg, refResponse.response, contentMatch);\n      return;\n    }\n\n    const { content } = response;\n    if (!content)\n      return;\n\n    this.#parseContents(arg, content, response, (contentType, content) => contentMatch(contentType, content, response));\n  }\n}\n","export function objectMap<T extends Record<string, any>>(obj: T, fn: (value: T[keyof T], key: keyof T) => any) {\n  return Object.fromEntries(\n    Object.entries(obj).map(([key, value]) => [\n      key,\n      fn(\n        value,\n        key,\n      ),\n    ]),\n  );\n}\n","import type { OpenAPIV2, OpenAPIV3 } from '../types/openapi';\nimport path from 'node:path';\nimport { OpenAPIVersion } from '../types/openapi';\nimport { objectMap } from '../utils/object';\nimport { isBoolean, isUndefined } from '../utils/type-is';\n\n// https://liqiang.io/post/openapi-30-vs-swagger-20\n// https://blog.postman.com/openapi-vs-swagger/\n\nfunction migRef(\n  refObj: {\n    $ref: string;\n    [key: string]: any;\n  },\n  position: keyof OpenAPIV3.ComponentsObject,\n) {\n  return {\n    ...refObj,\n    $ref: refObj.$ref.replace(/^#\\/[^/]+\\//, `#/components/${position}/`),\n  };\n}\n\nfunction migSchema(schema: OpenAPIV2.SchemaObject | OpenAPIV2.ReferenceObject): OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject {\n  if (isUndefined(schema))\n    return schema;\n  if ('$ref' in schema)\n    return migRef(schema as OpenAPIV3.ReferenceObject, 'schemas');\n\n  // TODO not discriminator 未处理\n  const { id, type, format, properties, items, additionalProperties, allOf, oneOf, anyOf, not, discriminator, ...rest } = schema;\n\n  if (allOf || oneOf || anyOf) {\n    return {\n      ...rest,\n      allOf: allOf && allOf.map(migSchema),\n      oneOf: oneOf && oneOf.map(migSchema),\n      anyOf: anyOf && anyOf.map(migSchema),\n    };\n  }\n\n  if (type === 'array') {\n    return {\n      // ...rest,\n      type,\n      items: migSchema(items || {}),\n    };\n  }\n\n  const isFile = type === 'file';\n\n  return {\n    ...rest,\n    type: type === 'file' ? 'string' : type,\n    format: isFile ? 'binary' : format,\n    properties: properties && objectMap(properties, migSchema),\n    additionalProperties: isBoolean(additionalProperties) ? additionalProperties : additionalProperties && migSchema(additionalProperties),\n  };\n}\n\nfunction migHeader(header: OpenAPIV2.HeaderObject | OpenAPIV2.ReferenceObject | undefined): OpenAPIV3.HeaderObject | OpenAPIV3.ReferenceObject | undefined {\n  if (!header)\n    return header;\n  if ('$ref' in header)\n    return migRef(header as OpenAPIV2.ReferenceObject, 'headers');\n\n  const { ...schema } = header;\n\n  return {\n    schema: schema && migSchema(schema),\n  };\n}\n\nfunction migResponse(\n  response: OpenAPIV2.ResponseObject | OpenAPIV2.ReferenceObject | undefined,\n  medias: string[],\n): OpenAPIV3.ResponseObject | OpenAPIV3.ReferenceObject | undefined {\n  if (isUndefined(response))\n    return response;\n  if ('$ref' in response)\n    return migRef(response, 'responses');\n\n  const { description, schema, headers, examples } = response;\n  const schemaV3 = schema && migSchema(schema);\n\n  return {\n    description,\n    headers: headers && objectMap(headers, migHeader),\n    content: schemaV3\n      ? medias.reduce(\n          (content, media) => {\n            content[media] = {\n              examples,\n              schema: schemaV3,\n            };\n            return content;\n          },\n          {} as NonNullable<OpenAPIV3.ResponseObject['content']>,\n        )\n      : {},\n  };\n}\n\nfunction extractParameterSchema(parameter: OpenAPIV2.Parameter | OpenAPIV2.ReferenceObject): OpenAPIV2.SchemaObject | OpenAPIV2.ReferenceObject {\n  if ('$ref' in parameter)\n    return { $ref: parameter.$ref };\n  if ('schema' in parameter)\n    return parameter.schema;\n\n  const { in: in_, required, name, description, ...schema } = parameter;\n  return schema;\n}\n\n// https://swagger.io/docs/specification/2-0/describing-parameters/\n// https://swagger.io/docs/specification/serialization/\nconst collectionFormatMap: Record<string, OpenAPIV3.ParameterBaseObject['style']> = {\n  csv: 'form',\n  ssv: 'spaceDelimited',\n  tsv: 'form',\n  pipes: 'pipeDelimited',\n  multi: 'form',\n};\nconst explodeMap = {\n  csv: false,\n  ssv: false,\n  tsv: false,\n  pipes: false,\n  multi: true,\n};\nfunction migGeneralParameter(parameter: OpenAPIV2.GeneralParameterObject | OpenAPIV2.ReferenceObject): OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject {\n  if ('$ref' in parameter) {\n    return migRef(parameter as OpenAPIV3.ReferenceObject, 'parameters');\n  }\n\n  const { $ref, in: in_, name, required, description, ...schema } = parameter;\n  const inV3 = in_ === 'cookie' || in_ === 'header' || in_ === 'path' ? in_ : 'query';\n  const inQuery = inV3 === 'query';\n  const style = inQuery ? collectionFormatMap[parameter.collectionFormat || 'csv'] : undefined;\n  const explode = inQuery ? explodeMap[parameter.collectionFormat || 'csv'] : undefined;\n\n  return {\n    in: inV3,\n    name,\n    required,\n    description,\n    schema: migSchema(extractParameterSchema(parameter)),\n    style,\n    explode,\n  };\n}\n\nfunction makeRequestBody(bodySchemas: BodySchema[], medias: string[]): OpenAPIV3.RequestBodyObject {\n  let requestBodySchema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject | undefined;\n  const bodyRequest = bodySchemas.find(({ parameter }) => parameter.in === 'body');\n  const requestBodyRest = {};\n\n  // @ref https://swagger.io/docs/specification/v2_0/describing-request-body/\n  // requestBodySchema.name 忽略，其本身作为 body\n  if (bodyRequest) {\n    requestBodySchema = bodyRequest.schema;\n    const { required, description } = bodyRequest.parameter;\n    Object.assign(requestBodyRest, { required, description });\n  }\n  // @ref https://swagger.io/docs/specification/v2_0/file-upload/\n  // 其余内容为 form-data\n  else if (bodySchemas.length > 0) {\n    requestBodySchema = {\n      type: 'object',\n      properties: bodySchemas.reduce(\n        (properties, { parameter, schema }) => {\n          const { required, default: default_, description } = parameter;\n          properties[parameter.name] = {\n            required,\n            default: default_,\n            description,\n            ...schema,\n          };\n          return properties;\n        },\n        {} as Record<string, OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject>,\n      ),\n    };\n  }\n\n  return {\n    ...requestBodyRest,\n    content: requestBodySchema\n      ? medias.reduce(\n          (content, media) => {\n            content[media] = { schema: requestBodySchema };\n            return content;\n          },\n          {} as OpenAPIV3.RequestBodyObject['content'],\n        )\n      : {},\n  };\n}\n\nconst bodyIns = ['body', 'formData'];\ninterface BodySchema {\n  parameter: OpenAPIV2.Parameter;\n  schema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject;\n}\nfunction migOperation(operation: OpenAPIV2.OperationObject, migBody = false): OpenAPIV3.OperationObject {\n  const { parameters, responses, consumes, produces, ...rest } = operation;\n  const generalParameters: (OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject)[] = [];\n  const inBodySchemas: BodySchema[] = [];\n\n  parameters?.forEach((parameter) => {\n    if (migBody && 'in' in parameter && bodyIns.includes(parameter.in)) {\n      const schema = extractParameterSchema(parameter);\n      inBodySchemas.push({\n        parameter,\n        schema: migSchema(schema),\n      });\n    }\n    else {\n      generalParameters.push(migGeneralParameter(parameter as OpenAPIV2.GeneralParameterObject | OpenAPIV2.ReferenceObject));\n    }\n  });\n\n  return {\n    ...rest,\n    parameters: generalParameters.length > 0 ? generalParameters : undefined,\n    requestBody: makeRequestBody(inBodySchemas, consumes || ['*']),\n    responses: objectMap(responses, resp => migResponse(resp, produces || ['*'])),\n  };\n}\n\nfunction migPathItem(pathItem: OpenAPIV2.PathItemObject | undefined): OpenAPIV3.PathItemObject | undefined {\n  if (isUndefined(pathItem))\n    return pathItem;\n\n  const { parameters, get, delete: delete_, head, options, patch, post, $ref, put } = pathItem;\n\n  return {\n    $ref,\n    // 忽略\n    // parameters: parameters && parameters.map(migParameter),\n    get: get && migOperation(get),\n    delete: delete_ && migOperation(delete_, true),\n    head: head && migOperation(head),\n    options: options && migOperation(options),\n    patch: patch && migOperation(patch, true),\n    post: post && migOperation(post, true),\n    put: put && migOperation(put, true),\n  };\n}\n\nfunction migServers(host: string | undefined, basePath: string | undefined, schemes: string[] | undefined): OpenAPIV3.ServerObject[] | undefined {\n  if (schemes?.length && host) {\n    return schemes.map(scheme => ({\n      url: `${scheme.replace(/:.*$/, '')}://${path.join(host, basePath || '/')}`,\n    }));\n  }\n  else if (host || basePath) {\n    return [\n      {\n        url: path.join(host || '', basePath || '/'),\n      },\n    ];\n  }\n}\n\nexport function migrate_2_0To3_0(v2: OpenAPIV2.Document): OpenAPIV3.Document {\n  const { info, paths, definitions, swagger, tags, parameters, responses, externalDocs, host, basePath, schemes } = v2;\n\n  return {\n    openapi: OpenAPIVersion.V3_0,\n    info,\n    tags,\n    externalDocs,\n    paths: objectMap(paths, migPathItem),\n    components: {\n      schemas: definitions && objectMap(definitions, migSchema),\n      parameters: parameters && objectMap(parameters, migGeneralParameter),\n      responses: responses && objectMap(responses, resp => migResponse(resp, ['*'])),\n    },\n    servers: migServers(host, basePath, schemes),\n  };\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from '../types/openapi';\nimport { OpenAPIVersion } from '../types/openapi';\nimport { objectMap } from '../utils/object';\nimport { isBoolean, isUndefined } from '../utils/type-is';\n\n// https://www.openapis.org/blog/2021/02/16/migrating-from-openapi-3-0-to-3-1-0\n// https://www.apimatic.io/blog/2021/09/migrating-to-and-from-openapi-3-1\n\nfunction migSchema(schema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject): OpenAPIV3_1.SchemaObject | OpenAPIV3_1.ReferenceObject {\n  if (isUndefined(schema))\n    return schema;\n\n  if ('$ref' in schema) {\n    if (schema.nullable) {\n      return {\n        oneOf: [{ $ref: schema.$ref }, { type: 'null' }],\n      };\n    }\n\n    return schema;\n  }\n\n  const { type, nullable, properties, additionalProperties, allOf, oneOf, anyOf, ...rest } = schema;\n\n  if (allOf || oneOf || anyOf) {\n    const schemaOf = {\n      ...rest,\n      allOf: allOf && allOf.map(migSchema),\n      oneOf: oneOf && oneOf.map(migSchema),\n      anyOf: anyOf && anyOf.map(migSchema),\n    };\n\n    if (nullable) {\n      return {\n        oneOf: [schemaOf, { type: 'null' }],\n      };\n    }\n\n    return schemaOf;\n  }\n\n  if (type === 'array') {\n    return {\n      ...rest,\n      type: nullable ? [type, 'null'] : [type],\n      items: migSchema(schema.items),\n    };\n  }\n\n  if (isUndefined(type)) {\n    return {\n      ...rest,\n      type: nullable ? ['null'] : [],\n    };\n  }\n\n  return {\n    ...rest,\n    type: nullable ? [type, 'null'] : [type],\n    properties: properties && objectMap(properties, migSchema),\n    additionalProperties: isBoolean(additionalProperties) ? additionalProperties : additionalProperties && migSchema(additionalProperties),\n  };\n}\n\nfunction migOperation(operation: OpenAPIV3.OperationObject): OpenAPIV3_1.OperationObject {\n  // TODO callbacks、severs 未处理\n  const { parameters, requestBody, responses, callbacks, servers, ...rest } = operation;\n\n  return {\n    ...rest,\n    parameters: parameters?.map(migParameter),\n    requestBody: requestBody && migRequest(requestBody),\n    responses: objectMap(responses, migResponse),\n  };\n}\n\nfunction migPathItem(pathItem: OpenAPIV3.PathItemObject | undefined): OpenAPIV3_1.PathItemObject | OpenAPIV3_1.ReferenceObject | undefined {\n  if (!pathItem)\n    return pathItem;\n\n  // TODO parameters、reset 未处理\n  const { parameters, get, post, delete: delete_, description, head, $ref, options, patch, put, trace, ...rest } = pathItem;\n\n  if ($ref) {\n    return {\n      description,\n      $ref,\n    };\n  }\n\n  return {\n    // ...rest,\n    // 忽略\n    // parameters: parameters && parameters.map(migParameter),\n    description,\n    get: get && migOperation(get),\n    post: post && migOperation(post),\n    delete: delete_ && migOperation(delete_),\n    head: head && migOperation(head),\n    options: options && migOperation(options),\n    patch: patch && migOperation(patch),\n    put: put && migOperation(put),\n    trace: trace && migOperation(trace),\n  };\n}\n\nfunction migRequest(req: OpenAPIV3.RequestBodyObject | OpenAPIV3.ReferenceObject): OpenAPIV3_1.RequestBodyObject | OpenAPIV3_1.ReferenceObject {\n  if ('$ref' in req)\n    return req;\n\n  const { content, ...rest } = req;\n\n  return {\n    ...rest,\n    content: objectMap(content, content => ({\n      ...content,\n      schema: content.schema && migSchema(content.schema),\n    })),\n  };\n}\n\nfunction migResponse(\n  response: OpenAPIV3.ResponseObject | OpenAPIV3.ReferenceObject | undefined,\n): OpenAPIV3_1.ResponseObject | OpenAPIV3_1.ReferenceObject | undefined {\n  if (isUndefined(response))\n    return response;\n  if ('$ref' in response)\n    return response;\n\n  const { content, description, headers } = response;\n\n  if (isUndefined(content)) {\n    return {\n      description,\n      headers: headers && objectMap(headers, migHeader),\n    };\n  }\n\n  return {\n    description,\n    headers: headers && objectMap(headers, migHeader),\n    content: objectMap(content, value => ({\n      ...value,\n      schema: value.schema && migSchema(value.schema),\n    })),\n  };\n}\n\nfunction migParameter(param: OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject): OpenAPIV3_1.ParameterObject | OpenAPIV3_1.ReferenceObject {\n  if ('$ref' in param)\n    return param;\n\n  const { schema, ...rest } = param;\n\n  return {\n    ...rest,\n    schema: schema && migSchema(schema),\n  };\n}\n\nfunction migHeader(header: OpenAPIV3.HeaderObject | OpenAPIV3.ReferenceObject | undefined): OpenAPIV3_1.HeaderObject | OpenAPIV3_1.ReferenceObject | undefined {\n  if (!header)\n    return header;\n  if ('$ref' in header)\n    return header;\n\n  const { schema, ...rest } = header;\n\n  return {\n    ...rest,\n    schema: schema && migSchema(schema),\n  };\n}\n\nfunction migComponents(v3: OpenAPIV3.ComponentsObject): OpenAPIV3_1.ComponentsObject {\n  const { schemas = {}, requestBodies = {}, responses = {}, parameters = {}, headers = {} } = v3;\n\n  return {\n    schemas: objectMap(schemas, migSchema),\n    requestBodies: objectMap(requestBodies, migRequest),\n    responses: objectMap(responses, migResponse),\n    parameters: objectMap(parameters, migParameter),\n    headers: objectMap(headers, migHeader),\n  };\n}\n\nexport function migrate_3_0To3_1(v3_0: OpenAPIV3.Document): OpenAPIV3_1.Document {\n  const { info, tags, paths, components, servers, security } = v3_0;\n\n  // TODO servers、security 未处理\n  return {\n    openapi: OpenAPIVersion.V3_1,\n    info,\n    tags,\n    paths: objectMap(paths, migPathItem),\n    components: components && migComponents(components),\n  };\n}\n","import type { OpenAPIAll, OpenAPIV2, OpenAPIV3, OpenAPIV3_1 } from '../types/openapi';\nimport { OpenAPIVersion } from '../types/openapi';\nimport { migrate_2_0To3_0 } from './openapi-2_0';\nimport { migrate_3_0To3_1 } from './openapi-3_0';\n\nexport function detectVersion(openapi: OpenAPIAll.Document): OpenAPIVersion {\n  if ('swagger' in openapi) {\n    return OpenAPIVersion.V2_0;\n  }\n\n  if (openapi.openapi.startsWith('3.0')) {\n    return OpenAPIVersion.V3_0;\n  }\n\n  if (openapi.openapi.startsWith('3.1')) {\n    return OpenAPIVersion.V3_1;\n  }\n\n  throw new Error(`Unsupported OpenAPI version: ${openapi.openapi}`);\n}\n\nconst migrations = [\n  //\n  { from: OpenAPIVersion.V2_0, migrate: migrate_2_0To3_0 },\n  { from: OpenAPIVersion.V3_0, migrate: migrate_3_0To3_1 },\n  { from: OpenAPIVersion.V3_1 },\n];\n\nexport interface MigratedV2_0 { version: OpenAPIVersion.V2_0; document: OpenAPIV2.Document; errors: string[] }\nexport interface MigratedV3_0 { version: OpenAPIVersion.V3_0; document: OpenAPIV3.Document; errors: string[] }\nexport interface MigratedV3_1 { version: OpenAPIVersion.V3_1; document: OpenAPIV3_1.Document; errors: string[] }\n\nexport function migrate(openapi: OpenAPIAll.Document) {\n  const migrated: Array<MigratedV2_0 | MigratedV3_0 | MigratedV3_1> = [];\n\n  migrations.reduce((acc, { from, migrate }) => {\n    if (detectVersion(acc) === from) {\n      // eslint-disable-next-line ts/ban-ts-comment\n      // @ts-expect-error\n      const result = migrate?.(acc) || acc;\n      // eslint-disable-next-line ts/ban-ts-comment\n      // @ts-expect-error\n      migrated.push({ version: from, document: acc, errors: [] });\n      return result;\n    }\n\n    return acc;\n  }, openapi);\n\n  return migrated;\n}\n","import type { OpenAPIAll } from '../types/openapi';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { bundleFromString, createConfig } from '@redocly/openapi-core';\nimport { migrate } from '../migrations';\nimport { isString } from '../utils/type-is';\n\ntype AcceptDocument = OpenAPIAll.Document | string;\n\nexport class Reader {\n  cwd = process.cwd();\n\n  async read(document: AcceptDocument) {\n    const source = await this._read(document);\n    const config = await createConfig({});\n    const { problems, bundle } = await bundleFromString({ config, source });\n    const errors: string[] = [];\n\n    if (problems.length) {\n      problems.forEach((p) => {\n        errors.push(p.message);\n      });\n    }\n\n    const migrated = migrate(bundle.parsed);\n    migrated[0].errors.push(...errors);\n    return migrated;\n  }\n\n  private async _read(document: AcceptDocument): Promise<string> {\n    if (isString(document)) {\n      if (/^https?:/i.test(document)) {\n        return await this.readRemote(document);\n      }\n      else {\n        return this.readLocal(document);\n      }\n    }\n    else {\n      return JSON.stringify(document);\n    }\n  }\n\n  protected readLocal(file: string) {\n    return fs.readFileSync(path.resolve(this.cwd, file), 'utf8');\n  }\n\n  protected async readRemote(url: string) {\n    const resp = await fetch(url);\n    if (resp.ok)\n      return await resp.text();\n\n    throw new Error(`${resp.status} ${resp.statusText}`);\n  }\n\n  protected readObject(document: OpenAPIAll.Document) {\n    return document;\n  }\n}\n","import type { PrintResult } from '../printer/types';\nimport type { OpenAPILatest } from '../types/openapi';\nimport type {\n  GeneratingOptions,\n  GeneratingPayload,\n  GeneratingStage,\n  GeneratorEmits,\n  GeneratorOptions,\n  GeneratorPayload,\n  OpenAPIOptions,\n  StrictGeneratorOptions,\n} from './types';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { Emitter } from 'strict-event-emitter';\nimport { normalizeError } from 'try-flatten';\nimport { Printer } from '../printer';\nimport { OpenAPIVersion } from '../types/openapi';\nimport { formatTsCode } from '../utils/string';\nimport { isString } from '../utils/type-is';\nimport { Reader } from './Reader';\n\nexport class Generator extends Emitter<GeneratorEmits> {\n  static defaults: StrictGeneratorOptions = {\n    cwd: process.cwd(),\n    dest: '/src/apis',\n    documents: {},\n  };\n\n  options: StrictGeneratorOptions;\n  constructor(options: GeneratorOptions) {\n    super();\n    this.options = Object.assign({}, Generator.defaults, options) as StrictGeneratorOptions;\n  }\n\n  async generate() {\n    const entries = Object.entries(this.options.documents);\n    const count = entries.length;\n    const payload: GeneratorPayload = { count };\n    this.emit('start', payload);\n\n    try {\n      let index = 0;\n      for (const [name, module] of entries) {\n        const openAPI: OpenAPIOptions = isString(module) ? { document: module } : module;\n        await this.#generateOpenAPI({ index, count, name }, openAPI);\n        index++;\n      }\n    }\n    catch (cause) {\n      const err = normalizeError(cause);\n      this.emit('error', err, payload);\n      throw err;\n    }\n\n    this.emit('end', payload);\n  }\n\n  async #generateOpenAPI({ index, count, name }: { index: number; count: number; name: string }, openAPIOptions: OpenAPIOptions) {\n    const { cwd, dest, ...globalPrinter } = this.options;\n    const { document, fileName = `${name}.ts`, ...scopePrinter } = openAPIOptions;\n    const mainFile = path.join(cwd, dest, fileName);\n    const typeFile = mainFile.replace(/\\.ts$/, '.type.ts');\n    const zodFile = mainFile.replace(/\\.ts$/, '.zod.ts');\n    const mockFile = mainFile.replace(/\\.ts$/, '.mock.ts');\n    const schemaFiles: Record<OpenAPIVersion, string> = {\n      [OpenAPIVersion.V2_0]: mainFile.replace(/\\.ts$/, '.v2_0.json'),\n      [OpenAPIVersion.V3_0]: mainFile.replace(/\\.ts$/, '.v3_0.json'),\n      [OpenAPIVersion.V3_1]: mainFile.replace(/\\.ts$/, '.v3_1.json'),\n    };\n\n    // 1. 参数合并\n    const printerOptions = Object.assign({}, globalPrinter, scopePrinter);\n    const options: GeneratingOptions = {\n      ...openAPIOptions,\n      cwd,\n      dest,\n      ...printerOptions,\n    };\n    const makePayload = (stage: GeneratingStage): GeneratingPayload => ({\n      index,\n      count,\n      name,\n      stage,\n      options,\n      file: mainFile,\n    });\n    const { runtimeValidate, runtimeMock, writeSchema } = printerOptions;\n\n    // 2. 读取\n    this.emit('process', makePayload('reading'));\n    const reader = new Reader();\n    reader.cwd = cwd;\n    const migrated = await reader.read(document);\n\n    // 3. 输出\n    this.emit('process', makePayload('printing'));\n    const printer = new Printer(migrated.at(-1)!.document! as OpenAPILatest.Document, printerOptions);\n    const { type, main, zod, mock } = printer.print({ document: name, cwd, mainFile, typeFile, zodFile, mockFile });\n\n    // 4. 写入\n    this.emit('process', makePayload('writing'));\n    fs.mkdirSync(path.dirname(mainFile), { recursive: true });\n\n    await this.#writePrintResult('main', mainFile, main);\n    await this.#writePrintResult('type', typeFile, type);\n\n    if (runtimeValidate || runtimeMock) {\n      await this.#writePrintResult('zod', zodFile, zod);\n    }\n\n    if (runtimeMock) {\n      await this.#writePrintResult('mock', mockFile, mock);\n    }\n\n    if (writeSchema) {\n      for (const { version, document, errors } of migrated) {\n        await this.#writePrintResult(`schema@${version}`, schemaFiles[version], {\n          lang: 'json',\n          code: JSON.stringify(document, null, 2),\n          errors,\n        });\n      }\n    }\n\n    this.emit('process', makePayload('generated'));\n  }\n\n  async #writePrintResult(ns: string, file: string, printResult: PrintResult) {\n    if (!printResult.code)\n      return;\n\n    const { cwd } = this.options;\n    const { lang, code, errors } = printResult;\n    const code2 = lang === 'ts' ? await formatTsCode(code) : code;\n\n    fs.writeFileSync(file, code2, 'utf8');\n\n    if (errors.length) {\n      const p = path.relative(cwd, file);\n      console.warn(`[${ns}] 发现了 ${errors.length} 处错误，请检查文件 ${p}，可能会出现非预期错误`);\n      errors.forEach((error) => {\n        console.warn(error);\n      });\n    }\n  }\n}\n","/* eslint-disable no-console */\nimport type { GeneratingStage, GeneratorEmits } from './types';\nimport path from 'node:path';\nimport chalk from 'chalk';\n\nconst stateOrders: Record<GeneratingStage, number> = {\n  reading: 1,\n  printing: 2,\n  writing: 3,\n  generated: 4,\n};\n\nexport class Logger {\n  pipeStartEvent(...[payload]: GeneratorEmits['start']) {\n    console.log(chalk.magenta('▶'), `即将处理 ${payload.count} 个 openAPI 文档`);\n  }\n\n  pipeProcessEvent(...[payload]: GeneratorEmits['process']) {\n    const width = payload.count.toString().length;\n    const step = (payload.index + 1).toString().padStart(width, '0');\n    const order = stateOrders[payload.stage];\n\n    console.log(\n      chalk.magenta('▷'),\n      chalk.yellow(`[${step}/${payload.count}]`),\n      chalk.cyan(`<${payload.name}>`),\n      payload.stage,\n      chalk.green(payload.stage === 'generated' ? path.relative(payload.options.cwd, payload.file) : ''),\n    );\n  }\n\n  pipeEndEvent(...[payload]: GeneratorEmits['end']) {\n    console.log(chalk.magenta('■'), chalk.green('处理完成'));\n  }\n\n  pipeErrorEvent(...[err]: GeneratorEmits['error']) {\n    console.log(chalk.magenta('●'), '处理失败');\n    console.log(chalk.red(err.message));\n  }\n\n  pipeConfigError(err: Error) {\n    console.log(chalk.magenta('○'), '配置错误');\n    console.log(chalk.red(err.message));\n  }\n}\n","import type { GeneratorOptions } from './generator/types';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { tryFlatten } from 'try-flatten';\nimport { configFileBaseName } from './const';\nimport { Generator } from './generator/Generator';\nimport { Logger } from './generator/Logger';\n\nexport function defineConfig(options: GeneratorOptions): GeneratorOptions {\n  return options;\n}\n\nexport const configFileNameOrder = [\n  `${configFileBaseName}.cjs`,\n  `${configFileBaseName}.js`,\n];\n\nexport function resolveConfigFile(cwd: string) {\n  for (const fileName of configFileNameOrder.values()) {\n    const filePath = path.join(cwd, fileName);\n\n    if (fs.existsSync(filePath)) {\n      return filePath;\n    }\n  }\n}\n\nexport function resolveConfig(cwd: string): GeneratorOptions {\n  const configFile = resolveConfigFile(cwd);\n\n  if (!configFile) {\n    throw new Error(\n      `配置文件未找到，配置文件可以是 ${configFileNameOrder.join('、')} 之一\\n可以使用 npx openapi-axios init 自动生成`,\n    );\n  }\n\n  const [err, config] = tryFlatten(() => {\n    delete require.cache[require.resolve(configFile)];\n\n    // eslint-disable-next-line ts/no-require-imports\n    return require(configFile) as GeneratorOptions;\n  });\n\n  if (err) {\n    throw err;\n  }\n\n  return config;\n}\n\nexport async function generate(cwd = process.cwd()) {\n  const logger = new Logger();\n  const [err, config] = tryFlatten(() => resolveConfig(cwd));\n\n  if (err)\n    return logger.pipeConfigError(err);\n\n  const generator = new Generator({\n    ...config,\n    cwd: config.cwd || cwd,\n  });\n\n  generator.on('start', logger.pipeStartEvent);\n  generator.on('end', logger.pipeEndEvent);\n  generator.on('error', logger.pipeErrorEvent);\n  generator.on('process', logger.pipeProcessEvent);\n\n  await tryFlatten(generator.generate());\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { Command } from 'commander';\nimport { generate, resolveConfigFile } from './command';\nimport { configFileBaseName, pkgName, pkgVersion } from './const';\n\nexport function createCLI() {\n  const program = new Command();\n\n  program\n    .name(pkgName)\n    .version(pkgVersion)\n    .description(PKG_DESCRIPTION)\n    .action((options, command) => {\n      if (command.args.length === 0)\n        return generate();\n\n      program.help();\n    });\n\n  program\n    .command('init')\n    .description('初始化配置文件')\n    .action(async () => {\n      const configFile = resolveConfigFile(process.cwd());\n\n      if (configFile) {\n        console.log(`配置文件已存在`, path.relative(process.cwd(), configFile));\n        return;\n      }\n\n      const configFilename = `${configFileBaseName}.cjs`;\n      const configFilePath = path.join(process.cwd(), configFilename);\n\n      fs.writeFileSync(\n        configFilePath,\n        `${`\nconst { defineConfig } = require('openapi-axios');\n\n/**\n * openapi-axios config\n * @ref https://github.com/FrontEndDev-org/openapi-axios\n */\nmodule.exports = defineConfig({\n  documents: {\n    'petStore3': 'https://petstore3.swagger.io/api/v3/openapi.json'\n  },\n});`.trim()}\\n`,\n      );\n      console.log('生成配置文件', configFilename);\n    });\n\n  program.parse();\n}\n"],"names":["OpenAPIVersion","path","type","_a","required","_b","content","response","migSchema","migHeader","migResponse","migOperation","migPathItem","migrate","document"],"mappings":"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"}