@moccona/apicodegen 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +320 -25
- package/bin/cli.cjs +24 -0
- package/npm/index.cjs +2097 -2382
- package/npm/index.cjs.map +1 -1
- package/npm/index.d.cts +603 -408
- package/npm/index.d.cts.map +1 -0
- package/npm/index.d.mts +731 -0
- package/npm/index.d.mts.map +1 -0
- package/npm/index.mjs +2078 -0
- package/npm/index.mjs.map +1 -0
- package/npm/vite/index.d.mts +39 -0
- package/npm/vite/index.d.mts.map +1 -0
- package/npm/vite/index.mjs +1990 -0
- package/npm/vite/index.mjs.map +1 -0
- package/package.json +42 -25
- package/bin/cli.js +0 -2248
- package/npm/index.d.ts +0 -536
- package/npm/index.js +0 -2367
- package/npm/index.js.map +0 -1
- package/npm/vite/index.d.ts +0 -29
- package/npm/vite/index.js +0 -2276
- package/npm/vite/index.js.map +0 -1
package/npm/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/base/Adaptor.ts","../src/core/constants/keywords.ts","../src/core/interface.ts","../src/core/base/Base.ts","../src/core/base/Provider.ts","../src/core/generator/index.ts","../src/core/client/axios.ts","../src/core/client/fetch.ts","../src/openapi/index.ts","../src/openapi/V2.ts","../src/openapi/V3.ts","../src/openapi/V3_1.ts","../src/vite-plugin/index.ts"],"sourcesContent":["export * from \"./core\";\nexport * from \"./core/interface\";\nexport * from \"./openapi\";\nexport * from \"./vite-plugin\";\n","/**\n * @file Adapter abstract class definition\n * @author wp.l\n * @description Base adapter implementation for various code generation tools\n */\n\nimport type {\n MediaTypeObject,\n ParameterObject,\n} from \"@apicodegen/core/interface\";\nimport type { Statement } from \"typescript\";\n\n/**\n * Base adapter for tool\n * This abstract class serves as the foundation for implementing adapters for different code generation tools\n */\nexport abstract class Adapter {\n /**\n * @abstract The unique name/identifier for this adapter implementation\n */\n abstract readonly name: string;\n\n /**\n * @abstract The name of the field used to specify the HTTP method in API calls\n */\n abstract readonly methodFieldName: string;\n\n /**\n * @abstract The name of the field used to specify the request body in API calls\n */\n abstract readonly bodyFieldName: string;\n\n /**\n * @abstract The name of the field used to specify request headers in API calls\n */\n abstract readonly headersFieldName: string;\n\n /**\n * @abstract The name of the field used to specify query parameters in API calls\n */\n abstract readonly queryFieldName: string;\n\n /**\n * @abstract\n * @param {string} uri - The API endpoint URI\n * @param {string} method - The HTTP method (e.g., GET, POST, etc.)\n * @param {ParameterObject[]} parameters - An array of parameters for the API call\n * @param {MediaTypeObject | undefined} requestBody - The request body payload (if applicable)\n * @param {MediaTypeObject | undefined} response - The expected response format (if applicable)\n * @param {Adapter} adapter - An instance of the adapter being used\n * @param {boolean} useFormData - Flag indicating whether to use FormData for the request body\n * @param {boolean} useJSONResponse - Flag indicating whether the response should be parsed as JSON\n * @returns {Statement[]} An array of TypeScript AST statements representing the generated code\n */\n abstract client(\n uri: string,\n method: string,\n parameters: ParameterObject[],\n requestBody: MediaTypeObject | undefined,\n response: MediaTypeObject | undefined,\n adapter: Adapter,\n useFormData: boolean,\n useJSONResponse: boolean,\n ): Statement[];\n}\n","export const typescriptKeywords = new Set([\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 \"as\",\n \"implements\",\n \"interface\",\n \"let\",\n \"package\",\n \"private\",\n \"protected\",\n \"public\",\n \"static\",\n \"yield\",\n \"abstract\",\n \"any\",\n \"async\",\n \"await\",\n \"constructor\",\n \"declare\",\n \"from\",\n \"get\",\n \"is\",\n \"module\",\n \"namespace\",\n \"never\",\n \"require\",\n \"set\",\n \"type\",\n \"unknown\",\n \"readonly\",\n \"of\",\n \"asserts\",\n \"infer\",\n \"keyof\",\n \"boolean\",\n \"number\",\n \"string\",\n \"symbol\",\n \"object\",\n \"undefined\",\n \"bigint\",\n]);\n","/**\n * Simple represenration for JSON object\n */\nexport type JSONValue = {\n [K: string]:\n | string\n | number\n | boolean\n | JSONValue\n | (string | number | boolean | JSONValue)[];\n};\n\nexport enum SchemaType {\n schemas = \"schemas\",\n parameters = \"parameters\",\n responses = \"responses\",\n requestBodies = \"requestBodies\",\n}\n\nexport enum NonArraySchemaType {\n \"object\" = \"object\",\n \"string\" = \"string\",\n \"number\" = \"number\",\n \"boolean\" = \"boolean\",\n \"integer\" = \"integer\",\n \"enum\" = \"enum\",\n \"file\" = \"file\",\n}\n\nexport enum ArraySchemaType {\n \"array\" = \"array\",\n}\n\nexport enum SchemaFormatType {\n \"string\" = \"string\",\n \"number\" = \"number\",\n \"boolean\" = \"boolean\",\n \"file\" = \"file\",\n \"binary\" = \"binary\",\n \"blob\" = \"blob\",\n}\n\nexport enum ParameterIn {\n \"header\" = \"header\",\n \"body\" = \"body\",\n \"query\" = \"query\",\n \"cookie\" = \"cookie\",\n \"path\" = \"path\",\n \"formData\" = \"formData\",\n}\n\nexport interface ReferenceObject {\n $ref: string;\n}\n\nexport interface EnumSchemaObject {\n name: string;\n enum: (string | number)[];\n}\n\nexport interface SingleTypeSchemaObject {\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n type: keyof typeof NonArraySchemaType | string;\n description?: string;\n allOf?: SchemaObject[];\n anyOf?: SchemaObject[];\n deprecated?: boolean;\n enum?: (string | number)[];\n format?: keyof typeof SchemaFormatType;\n oneOf?: SchemaObject[];\n properties?: Record<string, SchemaObject>;\n readonly?: boolean;\n required?: string[] | boolean;\n ref?: string;\n}\n\nexport interface ArrayTypeSchemaObject {\n type: keyof typeof ArraySchemaType;\n items?: SchemaObject;\n required?: boolean;\n description?: string;\n ref?: string;\n}\n\nexport type SchemaObject = SingleTypeSchemaObject | ArrayTypeSchemaObject;\n\nexport type ParameterObject = {\n name: string;\n in: keyof typeof ParameterIn;\n schema?: SchemaObject;\n required?: boolean;\n description?: string;\n deprecated?: boolean;\n ref?: string;\n};\n\nexport enum MediaTypes {\n JSON = \"application/json\",\n TEXT = \"text\",\n IMAGE = \"image\",\n AUDIO = \"audio\",\n VIDEO = \"video\",\n}\n\nexport type MediaTypeObject = {\n type: MediaTypes | keyof typeof MediaTypes;\n schema?: SchemaObject;\n};\n\nexport type ResponsesObject = Record<string, MediaTypeObject[]>;\n\nexport type RequestBodyObject = ResponsesObject;\n\nexport enum HttpMethods {\n GET = \"get\",\n PUT = \"put\",\n POST = \"post\",\n DELETE = \"delete\",\n OPTIONS = \"options\",\n HEAD = \"head\",\n PATCH = \"patch\",\n TRACE = \"trace\",\n}\n\nexport type OperationObject = {\n method: string;\n summary?: string;\n description?: string;\n operationId?: string;\n externalDocs?: { url: string; description?: string }[];\n parameters?: ParameterObject[];\n requestBody?: MediaTypeObject[];\n responses: MediaTypeObject[];\n deprecated?: boolean;\n};\n\nexport type PathObject = {\n ref?: string;\n summary?: string;\n description?: string;\n parameters?: ParameterObject[];\n} & Partial<Record<HttpMethods, OperationObject>>;\n\nexport type PathsObject = Record<string, OperationObject[]>;\n\nexport type FetchDocRequestInit = {\n method?: string;\n body?: string | FormData;\n headers?: Record<string, string>;\n};\n\nexport enum Adaptors {\n fetch = \"fetch\",\n axios = \"axios\",\n}\n\nexport type ProviderInitOptions = {\n docURL: string;\n output: string;\n baseURL?: string;\n importClientSource?: string;\n requestOptions?: FetchDocRequestInit;\n verbose?: boolean;\n adaptor?: keyof typeof Adaptors;\n};\n\nexport interface ProviderInitResult {\n readonly enums: EnumSchemaObject[];\n readonly schemas: Record<string, SchemaObject>;\n readonly parameters: Record<string, ParameterObject>;\n readonly responses: Record<string, ResponsesObject>;\n readonly requestBodies: Record<string, RequestBodyObject>;\n readonly apis: PathsObject;\n}\n","/**\n * @file Base class implementation\n * @author wp.l\n * @description Base utility class providing common methods for code generation and API handling\n */\n\nimport { typescriptKeywords } from \"@apicodegen/core/constants/keywords\";\nimport type {\n EnumSchemaObject,\n FetchDocRequestInit,\n ReferenceObject,\n SchemaObject,\n SingleTypeSchemaObject,\n} from \"@apicodegen/core/interface\";\nimport { MediaTypes } from \"@apicodegen/core/interface\";\nimport { Agent, request } from \"undici\";\n\n/**\n * Represents success HTTP status codes.\n * Each key is a string representation of a success HTTP status code.\n */\nexport const SuccessHttpStatusCode = {\n \"200\": \"200\", // OK\n \"201\": \"201\", // Created\n \"202\": \"202\", // Accepted\n \"203\": \"203\", // Non-Authoritative Information\n \"204\": \"204\", // No Content\n \"205\": \"205\", // Reset Content\n \"206\": \"206\", // Partial Content\n \"207\": \"207\", // Multi_Status\n \"208\": \"208\", // Already_Reported\n \"226\": \"226\", // IM Used\n};\n\n/**\n * Base abstract class providing common utility methods.\n */\nexport abstract class Base {\n protected constructor() {\n if (new.target === Base) {\n throw new Error(\"Cannot instantiate abstract class\");\n }\n }\n\n /**\n * Converts a reference string to a meaningful name.\n * @param ref - The reference string to process.\n * @param [doc] - Optional document reference for context.\n * @returns - The processed name.\n */\n static ref2name(ref: string, doc?: any): string {\n const paths = ref.replace(/^#/, \"\").split(\"/\").filter(Boolean);\n\n if (!doc) {\n return paths.slice(-1)[0];\n }\n\n let temporary = doc as unknown;\n let lastPath = \"\";\n for (const path of paths) {\n // For handling path prefix with ~1\n const adjustedPath = path.replaceAll(\"~1\", \"/\");\n temporary = (temporary as Record<string, any>)[adjustedPath];\n lastPath = adjustedPath;\n }\n\n if (!temporary) {\n return \"unknown\";\n }\n\n return (temporary as unknown as { $ref: string }).$ref\n ? this.ref2name((temporary as unknown as { $ref: string }).$ref, doc)\n : lastPath;\n }\n\n /**\n * Converts an API path to a function name.\n * @param path - The API endpoint path.\n * @param [method] - The HTTP method (e.g., GET, POST).\n * @param [operationId] - Unique identifier for the operation.\n * @returns - The generated function name.\n */\n static pathToFnName(\n path: string,\n method?: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _operationId: string = \"\",\n ) {\n const name = this.normalize(this.camelCase(this.normalize(path)));\n const suffix = method\n ? this.capitalize(this.upperCamelCase(`using_${method}`))\n : \"\";\n\n return name + suffix;\n }\n\n /**\n * Normalizes a string by replacing special characters and avoiding TypeScript keywords.\n * @param text - Input text to normalize.\n * @returns - The normalized string.\n */\n static normalize(text: string) {\n if (typescriptKeywords.has(text)) {\n text += \"_\";\n }\n return text\n .replace(/[/\\-_{}():\\s`,*<>$#.]/gm, \"_\")\n .replace(/^\\d./gm, \"\")\n .replaceAll(\"...\", \"\");\n }\n\n /**\n * Capitalizes the first character of a string.\n * @param text - Input string.\n * @returns - Capitalized string.\n */\n static capitalize(text: string) {\n text = text.trim();\n return `${text.charAt(0).toUpperCase()}${text.slice(1)}`;\n }\n\n /**\n * Converts a string to camelCase.\n * @param text - Input string.\n * @returns - CamelCase string.\n */\n static camelCase(text: string) {\n text = text.trim();\n return text\n .split(\"_\")\n .filter(Boolean)\n .map((t, index) => (index === 0 ? t : this.capitalize(t)))\n .join(\"\");\n }\n\n /**\n * Converts a string to UpperCamelCase.\n * @param text - Input string.\n * @returns - UpperCamelCase string.\n */\n static upperCamelCase(text: string) {\n return this.normalize(text)\n .replaceAll(\"...\", \"\")\n .split(\"_\")\n .filter(Boolean)\n .map(this.capitalize)\n .join(\"\");\n }\n\n /**\n * Fetches documentation from a given URL.\n * @param url - The URL to fetch the documentation from.\n * @param requestInit - Additional request parameters.\n * @returns - A promise resolving to the fetched documentation data.\n */\n static async fetchDoc<T = unknown>(\n url: string,\n requestInit: FetchDocRequestInit = {},\n ): Promise<T> {\n const agent = new Agent({\n connect: { rejectUnauthorized: false },\n });\n\n const { body, statusCode } = await request(url, {\n method: \"GET\",\n dispatcher: agent,\n ...requestInit,\n });\n\n if (statusCode >= 400) {\n throw new Error(\n `Failed to fetch OpenAPI documentation from ${url}: HTTP ${statusCode}`,\n );\n }\n\n try {\n return body.json() as T;\n } catch (error) {\n throw new Error(\n `Failed to parse JSON response from ${url}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Determines the media type from a given media type string.\n * @param mediaType - The media type string to evaluate.\n * @returns - The matched MediaTypes or null.\n */\n static getMediaType(mediaType: string): MediaTypes | undefined {\n const mediaTypeValues = Object.values(MediaTypes) as string[];\n const found = mediaTypeValues.find((type) =>\n mediaType.includes(type),\n );\n return found as MediaTypes | undefined;\n }\n\n /**\n * Checks if a schema is a valid enum type that isn't boolean.\n * @param a - The schema object to evaluate.\n * @returns - True if the schema is a valid non-boolean enum.\n */\n static isValidEnumType(a: SchemaObject) {\n return a.type !== \"boolean\" && !this.isBooleanEnum(a);\n }\n\n /**\n * Checks if a schema represents a boolean enum.\n * @param a - The schema object to evaluate.\n * @returns - True if the schema is a boolean enum.\n */\n static isBooleanEnum(a: SchemaObject) {\n return (\n a.type === \"boolean\" ||\n !!(a as SingleTypeSchemaObject).enum?.some(\n (member) => typeof member === \"boolean\",\n )\n );\n }\n\n /**\n * Checks if two enum schemas are identical.\n * @param a - First enum schema to compare.\n * @param b - Second enum schema to compare.\n * @returns - True if the enums are identical.\n */\n private static isSameEnum(a: EnumSchemaObject, b: EnumSchemaObject) {\n return (\n a.enum.length === b.enum.length &&\n a.enum.sort().every((v, index) => v === b.enum.sort()[index])\n );\n }\n\n /**\n * Filters out duplicate enum schemas from an array.\n * @param enums - Array of enum schemas to process.\n * @returns - Array of unique enum schemas.\n */\n static uniqueEnums(enums: EnumSchemaObject[]): EnumSchemaObject[] {\n const enumMap = new Map<string, Set<string | number>>();\n\n for (const e of enums) {\n const existing = enumMap.get(e.name);\n if (existing) {\n // Merge enum values with the same name\n for (const value of e.enum) {\n existing.add(value);\n }\n } else {\n enumMap.set(e.name, new Set(e.enum));\n }\n }\n\n // Convert back to array\n return Array.from(enumMap.entries()).map(([name, values]) => ({\n name,\n enum: Array.from(values),\n }));\n }\n\n /**\n * Finds the first occurrence of a matching enum schema in an array.\n * @param a - The enum schema to find.\n * @param enums - Array of enum schemas to search.\n * @returns - The found schema or undefined.\n */\n static findSameSchema(a: EnumSchemaObject, enums: EnumSchemaObject[]) {\n return enums.find((b) => this.isSameEnum(b, a));\n }\n\n /**\n * Checks if an object is a reference object.\n * @param schema - The object to check.\n * @returns - True if the object is a reference.\n */\n\n static isRef(schema: unknown): schema is ReferenceObject {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n \"$ref\" in schema &&\n typeof (schema as Record<string, unknown>).$ref === \"string\"\n );\n }\n}\n","/**\n * @file Base class implementation\n * @author wp.l\n * @description This file defines the `Provider` abstract class, which serves as a base for providers responsible for parsing and processing API documentation.\n */\n\nimport type {\n EnumSchemaObject,\n FetchDocRequestInit,\n OperationObject,\n ParameterObject,\n ProviderInitOptions,\n ProviderInitResult,\n RequestBodyObject,\n ResponsesObject,\n SchemaObject,\n} from \"@apicodegen/core/interface\";\n\n/**\n * Abstract Provider Class.\n *\n * The Provider class is designed to be extended by specific implementations (e.g., OpenAPI 2 provider, OpenAPI 3 provider).\n * It handles the initialization of the provider and the parsing of documentation into structured data.\n *\n * @example\n *\n * ```ts\n * /// Example of how this class might be used by a subclass:\n * class OpenAPIProvider extends Provider {\n * /// Implement the parse method to handle OpenAPI-specific documentation parsing.\n * parse(doc: unknown): ProviderInitResult {\n * /// Implementation details...\n * }\n * }\n *\n * /// Initializing a provider with configuration and documentation data:\n * const initOptions: ProviderInitOptions = {\n * docURL: \"https://example.com/api/swagger.json\",\n * baseURL: \"https://api.example.com\",\n * output: \"./generated\",\n * requestOptions: {\n * headers: { \"Content-Type\": \"application/json\" },\n * },\n * importClientSource: \"generated/client\",\n * };\n *\n * const docData = fetchSwaggerDoc();\n * const provider = new OpenAPIProvider(initOptions, docData);\n * ```\n */\nexport abstract class Provider\n implements ProviderInitResult, ProviderInitOptions\n{\n /** collection of enum schemas */\n readonly enums: EnumSchemaObject[] = [];\n /** collection of schemas indexed by name */\n readonly schemas: Record<string, SchemaObject> = {};\n /** collection of parameters indexed by name */\n readonly parameters: Record<string, ParameterObject> = {};\n /** collection of API responses indexed by name */\n readonly responses: Record<string, ResponsesObject> = {};\n /** collection of request bodies indexed by name */\n readonly requestBodies: Record<string, RequestBodyObject> = {};\n /** collection of API endpoints (operations) indexed by path */\n readonly apis: Record<string, OperationObject[]> = {};\n\n /** URL for fetching API documentation */\n readonly docURL: string;\n /** base URL for API endpoints */\n readonly baseURL: string;\n /** output directory for generated code */\n readonly output: string;\n /** request options for API documentation fetch */\n readonly requestOptions: FetchDocRequestInit;\n /** source path for imported client */\n readonly importClientSource: string;\n\n /**\n * Provider Constructor.\n * @param {ProviderInitOptions} initOptions - Initial configuration for the provider.\n * @param {unknown} doc - Raw API documentation data to be parsed.\n */\n constructor(initOptions: ProviderInitOptions, doc: unknown) {\n this.docURL = initOptions.docURL;\n this.baseURL = initOptions.baseURL ?? \"\";\n this.output = initOptions.output ?? \".\";\n this.requestOptions = initOptions.requestOptions ?? {};\n this.importClientSource = initOptions.importClientSource ?? \"\";\n\n const { enums, schemas, requestBodies, responses, parameters, apis } =\n this.parse(doc);\n\n this.enums = enums;\n this.schemas = schemas;\n this.responses = responses;\n this.parameters = parameters;\n this.requestBodies = requestBodies;\n this.apis = apis;\n }\n\n /**\n * Abstract Parse Method.\n * @abstract\n * @param {unknown} doc - Raw API documentation data.\n * @returns {ProviderInitResult} - Parsed documentation data.\n *\n * This method must be implemented by subclasses to parse the raw documentation into structured data.\n */\n abstract parse(doc: unknown): ProviderInitResult;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */\n/* eslint-disable no-case-declarations */\nimport { Adapter } from \"@apicodegen/core/base/Adaptor\";\nimport { Base } from \"@apicodegen/core/base/Base\";\nimport type {\n ArrayTypeSchemaObject,\n MediaTypeObject,\n ParameterObject,\n ProviderInitOptions,\n ProviderInitResult,\n SchemaObject,\n SingleTypeSchemaObject,\n} from \"@apicodegen/core/interface\";\nimport {\n ArraySchemaType,\n MediaTypes,\n NonArraySchemaType,\n ParameterIn,\n SchemaFormatType,\n} from \"@apicodegen/core/interface\";\nimport { writeFile } from \"fs/promises\";\nimport { format } from \"prettier\";\nimport type {\n BindingElement,\n Block,\n Node,\n ParameterDeclaration,\n PropertySignature,\n Statement,\n TypeNode,\n} from \"typescript\";\nimport {\n addSyntheticLeadingComment,\n createPrinter,\n factory as t,\n NodeFlags,\n SyntaxKind,\n} from \"typescript\";\n\n/**\n * Represents a comment object with optional tag and message.\n */\nexport type CommentObject = {\n tag?: string;\n comment: string;\n};\n\n/**\n * Array of comment objects to be added to the code.\n */\nexport type Comments = CommentObject[];\n\nexport class Generator {\n /**\n * Converts an array of TypeScript statements into a formatted string of code.\n *\n * @param statements - The array of TypeScript statement nodes.\n * @returns Formatted code as a string.\n * @throws {Error} If no valid statements are provided.\n */\n static toCode(statements: Statement[]): string {\n if (statements.length === 0) {\n return \"// No api declaration found.\";\n }\n\n const sourceFile = t.createSourceFile(\n statements,\n t.createToken(SyntaxKind.EndOfFileToken),\n NodeFlags.None,\n );\n\n return createPrinter().printFile(sourceFile);\n }\n\n static async write(code: string, filepath: string) {\n try {\n await writeFile(filepath, code);\n } catch (error) {\n console.error(error);\n }\n }\n\n /**\n * Converts a path string with parameters into a TypeScript template expression.\n * Handles query parameters and path placeholders.\n *\n * @param path - The base path string containing placeholders.\n * @param parameters - Array of parameter objects defining the parameters.\n * @param basePath - Optional base path to prepend (default: \"\").\n * @returns A TypeScript template expressi\n */\n static toUrlTemplate(\n path: string,\n parameters: ParameterObject[],\n basePath = \"\",\n ) {\n // Extract query parameters\n const queryParameters = parameters.filter(\n (p) => p.in === ParameterIn.query,\n );\n\n if (queryParameters.length > 0) {\n const queryString = queryParameters\n .map(\n (qp, index) =>\n `${index === 0 ? \"?\" : \"&\"}${encodeURIComponent(qp.name)}={${Base.camelCase(Base.normalize(qp.name))}}`,\n )\n .join(\"\");\n path += queryString;\n }\n\n // Split the path into segments\n const pathSegments = path.replaceAll(\"{\", \"${\").split(\"$\").filter(Boolean);\n\n // If path segments only got one item, it means there are no parameters in path. So just return the path literal.\n if (pathSegments.length === 1) {\n return t.createNoSubstitutionTemplateLiteral(basePath + path);\n }\n\n return t.createTemplateExpression(\n t.createTemplateHead(basePath + pathSegments[0]),\n pathSegments.slice(1).map((segment, index) => {\n const match = /^{(.+)}(.+)?/gm.exec(segment);\n const isLastSegment = index === pathSegments.length - 2;\n\n if (!match) {\n throw new Error(`Invalid path segment: ${segment}`);\n }\n\n return t.createTemplateSpan(\n t.createIdentifier(match[1]),\n !isLastSegment\n ? t.createTemplateMiddle(match[2])\n : t.createTemplateTail(match[2] || \"\"),\n );\n }),\n );\n }\n\n /**\n * Adds synthetic comments to a TypeScript AST node.\n *\n * @param node - The target AST node.\n * @param comments - Array of comment objects to add.\n */\n static addComments(node: Node, comments: Comments) {\n if (!Array.isArray(comments) || comments.filter(Boolean).length === 0)\n return;\n\n const formatComment = (comment: CommentObject): string => {\n return comment.tag\n ? ` @${comment.tag} ${comment.comment ?? \"\"}`\n : ` ${comment.comment}`;\n };\n\n const formattedComments =\n \"*\\n\" + comments.map(formatComment).join(\"\\n\").trim() + \"\\n\";\n\n addSyntheticLeadingComment(\n node,\n SyntaxKind.MultiLineCommentTrivia,\n formattedComments,\n true,\n );\n }\n\n /**\n * Checks if a schema represents a binary type.\n *\n * @param schema - The schema object to check.\n * @returns true if the schema is a binary type, false otherwise.\n */\n static isBinarySchema(schema: SchemaObject): boolean {\n if (schema.type === \"array\") {\n const arraySchema = schema as ArrayTypeSchemaObject;\n return this.isBinarySchema(arraySchema.items!);\n }\n\n const nonArraySchema = schema as SingleTypeSchemaObject;\n return (\n nonArraySchema.format === SchemaFormatType.blob ||\n nonArraySchema.format === SchemaFormatType.binary ||\n nonArraySchema.type === SchemaFormatType.file\n );\n }\n\n static toRequestBodyTypeNode(schema: SchemaObject) {\n return t.createParameterDeclaration(\n undefined,\n undefined,\n t.createIdentifier(\"req\"),\n undefined,\n this.toTypeNode(schema),\n );\n }\n\n static toTypeNode(schema: SchemaObject): TypeNode {\n const { type, ref } = schema;\n\n if (ref) {\n const identify = Base.ref2name(ref);\n return t.createTypeReferenceNode(\n t.createIdentifier(\n identify === \"unknown\" ? identify : Base.upperCamelCase(identify),\n ),\n );\n }\n\n switch (type) {\n case ArraySchemaType.array:\n const { items } = schema as ArrayTypeSchemaObject;\n return t.createArrayTypeNode(this.toTypeNode(items!));\n case NonArraySchemaType.object:\n const propsCount = Object.keys(schema.properties ?? {}).length;\n if (!schema.properties || propsCount === 0) {\n // Record<string, unknown>\n return t.createTypeReferenceNode(t.createIdentifier(\"Record\"), [\n t.createToken(SyntaxKind.StringKeyword),\n t.createToken(SyntaxKind.UnknownKeyword),\n ]);\n }\n\n const props = Object.keys(schema.properties);\n\n return t.createTypeLiteralNode(\n props.map((propKey) => {\n const propSchema = schema.properties![propKey];\n return t.createPropertySignature(\n undefined,\n t.createStringLiteral(propKey),\n // When field is required, a refrence or binary value, don't add question mark.\n schema.required || schema.ref || this.isBinarySchema(schema)\n ? undefined\n : t.createToken(SyntaxKind.QuestionToken),\n this.toTypeNode(propSchema),\n );\n }),\n );\n case NonArraySchemaType.integer:\n case NonArraySchemaType.number:\n if (schema.enum) {\n return t.createUnionTypeNode(\n schema.enum.map((e) =>\n t.createLiteralTypeNode(t.createNumericLiteral(e)),\n ),\n );\n }\n return t.createToken(SyntaxKind.NumberKeyword);\n // case NonArraySchemaType.string:\n case NonArraySchemaType.boolean:\n return t.createToken(SyntaxKind.BooleanKeyword);\n case NonArraySchemaType.file:\n return t.createTypeReferenceNode(t.createIdentifier(\"Blob\"));\n default:\n const {\n format,\n oneOf,\n allOf,\n anyOf,\n type,\n enum: enum_,\n } = schema as SingleTypeSchemaObject;\n\n switch (format) {\n case SchemaFormatType.number:\n return t.createToken(SyntaxKind.NumberKeyword);\n case SchemaFormatType.string:\n return t.createToken(SyntaxKind.StringKeyword);\n case SchemaFormatType.boolean:\n return t.createToken(SyntaxKind.BooleanKeyword);\n case SchemaFormatType.blob:\n case SchemaFormatType.binary:\n return t.createTypeReferenceNode(t.createIdentifier(\"Blob\"));\n default:\n }\n\n if (enum_) {\n return t.createUnionTypeNode(\n enum_.map((e) =>\n t.createLiteralTypeNode(t.createStringLiteral(e as string)),\n ),\n );\n }\n\n if (type === NonArraySchemaType.string) {\n return t.createToken(SyntaxKind.StringKeyword);\n }\n\n if (oneOf) {\n return t.createUnionTypeNode(\n oneOf.map((schema) => this.toTypeNode(schema)),\n );\n }\n\n if (anyOf) {\n return t.createUnionTypeNode(\n anyOf.map((schema) => this.toTypeNode(schema)),\n );\n }\n\n if (allOf) {\n return t.createIntersectionTypeNode(\n allOf.map((schema) => this.toTypeNode(schema)),\n );\n }\n\n if (type && typeof type === \"string\") {\n return t.createTypeReferenceNode(\n type !== \"unknown\" && type !== \"null\"\n ? t.createIdentifier(Base.upperCamelCase(type))\n : type,\n );\n }\n }\n\n return t.createToken(SyntaxKind.UnknownKeyword);\n }\n\n static toDeclarationNodes(\n parameters: ParameterObject[],\n ): ParameterDeclaration[] {\n const objectElements: BindingElement[] = [];\n const typeObjectElements: PropertySignature[] = [];\n const refParameters: ParameterDeclaration[] = [];\n\n for (const parameter of parameters) {\n if (parameter.ref) {\n // Handle reference parameters as standalone parameters\n const refName = Base.ref2name(parameter.ref);\n refParameters.push(\n t.createParameterDeclaration(\n undefined,\n undefined,\n t.createIdentifier(Base.camelCase(Base.normalize(refName))),\n undefined,\n t.createTypeReferenceNode(\n t.createIdentifier(Base.upperCamelCase(Base.normalize(refName))),\n ),\n undefined,\n ),\n );\n } else {\n const { name, schema, required } = parameter;\n objectElements.push(\n t.createBindingElement(\n undefined,\n undefined,\n t.createIdentifier(Base.camelCase(Base.normalize(name))),\n ),\n );\n\n typeObjectElements.push(\n t.createPropertySignature(\n [],\n t.createIdentifier(Base.camelCase(Base.normalize(name))),\n required ? undefined : t.createToken(SyntaxKind.QuestionToken),\n !schema\n ? t.createToken(SyntaxKind.UnknownKeyword)\n : this.toTypeNode(schema),\n ),\n );\n }\n }\n\n // Build object destructuring parameter for non-ref parameters\n if (objectElements.length > 0) {\n const objectParam = t.createParameterDeclaration(\n undefined,\n undefined,\n t.createObjectBindingPattern(objectElements),\n undefined,\n t.createTypeLiteralNode(typeObjectElements),\n undefined,\n );\n return [objectParam, ...refParameters];\n }\n\n return refParameters;\n }\n\n static toFormDataStatement(\n parameters: ParameterObject[],\n requestBody?: SchemaObject,\n ): Statement[] {\n const statements: Statement[] = [];\n const fdDeclaration = t.createVariableStatement(\n undefined,\n t.createVariableDeclarationList(\n [\n t.createVariableDeclaration(\n t.createIdentifier(\"fd\"),\n undefined,\n undefined,\n t.createNewExpression(\n t.createIdentifier(\"FormData\"),\n undefined,\n [],\n ),\n ),\n ],\n NodeFlags.Const,\n ),\n );\n\n statements.push(fdDeclaration);\n\n parameters.forEach((parameter) => {\n statements.push(\n t.createExpressionStatement(\n t.createBinaryExpression(\n t.createIdentifier(parameter.name),\n t.createToken(SyntaxKind.AmpersandAmpersandToken),\n t.createCallExpression(\n t.createPropertyAccessExpression(\n t.createIdentifier(\"fd\"),\n t.createIdentifier(\"append\"),\n ),\n undefined,\n [\n t.createStringLiteral(parameter.name),\n t.createIdentifier(parameter.name),\n ],\n ),\n ),\n ),\n );\n });\n\n if (\n requestBody &&\n requestBody.type === \"object\" &&\n requestBody.properties &&\n Object.keys(requestBody.properties).length !== 0\n ) {\n Object.keys(requestBody.properties).forEach((key) => {\n const schemaByKey = requestBody.properties![key];\n if (\n schemaByKey.type === ArraySchemaType.array &&\n this.isBinarySchema(schemaByKey)\n ) {\n statements.push(\n t.createForOfStatement(\n undefined,\n t.createVariableDeclarationList(\n [t.createVariableDeclaration(\"file\")],\n NodeFlags.Const,\n ),\n t.createElementAccessExpression(\n t.createIdentifier(\"req\"),\n t.createStringLiteral(key),\n ),\n t.createBlock([\n t.createExpressionStatement(\n t.createCallExpression(\n t.createPropertyAccessExpression(\n t.createIdentifier(\"fd\"),\n t.createIdentifier(\"append\"),\n ),\n [],\n [\n t.createStringLiteral(key),\n t.createIdentifier(\"file\"),\n t.createPropertyAccessExpression(\n t.createAsExpression(\n t.createIdentifier(\"file\"),\n t.createTypeReferenceNode(\n t.createIdentifier(\"File\"),\n undefined,\n ),\n ),\n t.createIdentifier(\"name\"),\n ),\n ],\n ),\n ),\n ]),\n ),\n );\n } else {\n if (schemaByKey.required) {\n statements.push(\n t.createExpressionStatement(\n t.createCallExpression(\n t.createPropertyAccessExpression(\n t.createIdentifier(\"fd\"),\n t.createIdentifier(\"append\"),\n ),\n undefined,\n [\n t.createStringLiteral(key),\n schemaByKey.type === \"string\"\n ? t.createElementAccessExpression(\n t.createIdentifier(\"req\"),\n t.createStringLiteral(key),\n )\n : t.createCallExpression(\n t.createIdentifier(\"String\"),\n undefined,\n [\n t.createElementAccessExpression(\n t.createIdentifier(\"req\"),\n t.createStringLiteral(key),\n ),\n ],\n ),\n ],\n ),\n ),\n );\n } else {\n statements.push(\n t.createExpressionStatement(\n t.createBinaryExpression(\n t.createElementAccessExpression(\n t.createIdentifier(\"req\"),\n t.createStringLiteral(key),\n ),\n t.createToken(SyntaxKind.AmpersandAmpersandToken),\n t.createCallExpression(\n t.createPropertyAccessExpression(\n t.createIdentifier(\"fd\"),\n t.createIdentifier(\"append\"),\n ),\n undefined,\n [\n t.createStringLiteral(key),\n schemaByKey.type === \"string\"\n ? t.createElementAccessExpression(\n t.createIdentifier(\"req\"),\n t.createStringLiteral(key),\n )\n : t.createCallExpression(\n t.createIdentifier(\"String\"),\n undefined,\n [\n t.createElementAccessExpression(\n t.createIdentifier(\"req\"),\n t.createStringLiteral(key),\n ),\n ],\n ),\n ],\n ),\n ),\n ),\n );\n }\n }\n });\n }\n\n return statements;\n }\n\n static bodyBlock(\n uri: string,\n method: string,\n parameters: ParameterObject[],\n requestBody: MediaTypeObject | undefined,\n response: MediaTypeObject | undefined,\n adapter: Adapter,\n ): Block {\n const isFormDataRequest =\n requestBody &&\n [\"multipart/form-data\", \"application/x-www-form-urlencoded\"].includes(\n requestBody.type,\n );\n\n const shouldParseResponseToJSON = \"application/json\" === response?.type;\n\n // Ignore one and only blob parameter.\n const isRequestBodyBinary =\n requestBody?.schema &&\n requestBody.schema.type === ArraySchemaType.array &&\n this.isBinarySchema(requestBody.schema);\n\n const parametersShouldPutInFormData = parameters.filter(\n (p) =>\n p.in === ParameterIn.formData ||\n (p.schema && this.isBinarySchema(p.schema)),\n );\n\n const parametersShouldNotPutInFormData = parameters.filter(\n (p) => !parametersShouldPutInFormData.includes(p),\n );\n\n const isRequestBodyContainsBinary =\n requestBody?.schema &&\n \"properties\" in requestBody.schema &&\n Object.values(requestBody.schema?.properties ?? {}).some((p) =>\n this.isBinarySchema(p),\n );\n\n const hasBinaryInParameters = parameters.some(\n (p) => p?.schema && this.isBinarySchema(p.schema),\n );\n\n const shouldPutParametersOrBodyInFormData =\n isFormDataRequest ||\n isRequestBodyBinary ||\n hasBinaryInParameters ||\n isRequestBodyContainsBinary ||\n parametersShouldPutInFormData.length > 0;\n\n return t.createBlock([\n ...(shouldPutParametersOrBodyInFormData\n ? this.toFormDataStatement(\n parametersShouldPutInFormData,\n requestBody?.schema,\n )\n : []),\n ...adapter.client(\n uri,\n method,\n parametersShouldNotPutInFormData,\n requestBody,\n response,\n adapter,\n shouldPutParametersOrBodyInFormData,\n shouldParseResponseToJSON,\n ),\n ]);\n }\n\n static schemaToStatemets(\n parsedDoc: ProviderInitResult,\n adaptor: Adapter,\n options: Omit<ProviderInitOptions, \"docURL\" | \"output\" | \"requestOptions\">,\n ): Statement[] {\n const statements = [] as Statement[];\n const { apis, schemas = {}, enums } = parsedDoc;\n\n const enumNames: string[] = [];\n\n for (const enumObject of enums) {\n enumNames.push(Base.capitalize(enumObject.name));\n statements.push(\n t.createEnumDeclaration(\n [t.createToken(SyntaxKind.ExportKeyword)],\n t.createIdentifier(Base.upperCamelCase(enumObject.name)),\n enumObject.enum.map((member) => {\n return t.createEnumMember(\n t.createStringLiteral(\n typeof member === \"string\" ? member : `${member}_`,\n ),\n typeof member === \"string\"\n ? t.createStringLiteral(member)\n : t.createNumericLiteral(member),\n );\n }),\n ),\n );\n }\n\n for (const schemaKey in schemas) {\n if (\n Object.hasOwnProperty.call(schemas, schemaKey) &&\n !enumNames.includes(Base.upperCamelCase(schemaKey))\n ) {\n const schema = schemas[schemaKey];\n statements.push(\n t.createTypeAliasDeclaration(\n [t.createModifier(SyntaxKind.ExportKeyword)],\n t.createIdentifier(Base.upperCamelCase(schemaKey)),\n undefined,\n this.toTypeNode(schema),\n ),\n );\n }\n }\n\n for (const uri in apis) {\n const operations = apis[uri];\n for (const operation of operations) {\n const {\n method,\n operationId,\n requestBody = [],\n responses = [],\n summary,\n deprecated,\n description,\n } = operation;\n\n let { parameters = [] } = operation;\n\n parameters = parameters.filter((p) => p.in !== \"cookie\");\n\n // Add a default request, with no schema.\n if (requestBody.length === 0) {\n requestBody.push({ type: MediaTypes.JSON });\n }\n\n const shouldAddExtraMethodNameSuffix = requestBody.length > 1;\n\n for (const req of requestBody) {\n const statement = t.createFunctionDeclaration(\n [\n t.createModifier(SyntaxKind.ExportKeyword),\n t.createModifier(SyntaxKind.AsyncKeyword),\n ],\n undefined,\n Base.pathToFnName(uri, method, operationId) +\n (shouldAddExtraMethodNameSuffix\n ? Base.capitalize(req.type.split(\"/\")[1])\n : \"\"),\n undefined,\n [\n ...(parameters.length > 0\n ? Generator.toDeclarationNodes(parameters)\n : []),\n ...(req?.schema\n ? [Generator.toRequestBodyTypeNode(req.schema)]\n : []),\n ].filter(Boolean) as ParameterDeclaration[],\n undefined,\n this.bodyBlock(\n options.baseURL + uri,\n method,\n parameters,\n req,\n responses[0],\n adaptor,\n ),\n );\n\n this.addComments(\n statement,\n [\n description && {\n comment: description,\n },\n summary && {\n comment: summary,\n },\n deprecated && {\n tag: \"deprecated\",\n },\n ].filter(Boolean) as CommentObject[],\n );\n statements.push(statement);\n }\n }\n }\n\n return statements;\n }\n\n static async prettier(code: string) {\n return await format(code, {\n parser: \"typescript\",\n });\n }\n\n static async genCode(\n schema: ProviderInitResult,\n initOptions: ProviderInitOptions,\n adaptor: Adapter,\n ) {\n const { importClientSource } = initOptions;\n const statements = this.schemaToStatemets(schema, adaptor, {\n baseURL: initOptions.baseURL ?? \"\",\n });\n let code = this.toCode(statements);\n\n if (importClientSource) {\n code = importClientSource + \"\\n\\n\" + code;\n }\n\n return await this.prettier(code);\n }\n}\n","/* eslint-disable unicorn/prefer-spread */\n/**\n * File containing the implementation of the AxiosAdapter class.\n * This adapter is responsible for generating code that uses the Axios HTTP client library.\n */\n\nimport { Adapter } from \"@apicodegen/core/base/Adaptor\";\nimport { Base } from \"@apicodegen/core/base/Base\";\nimport { Generator } from \"@apicodegen/core/generator\";\nimport { MediaTypeObject, ParameterObject } from \"@apicodegen/core/interface\";\nimport type { Statement, TypeReferenceNode } from \"typescript\";\nimport { factory as t } from \"typescript\";\n\n/**\n * Adapter class implementing support for generating code that makes use of the Axios HTTP client library.\n * This class defines custom behavior and field mappings specific to the Axios client.\n */\nexport class AxiosAdapter extends Adapter {\n /**\n * Name of the field used to specify the HTTP method in the request configuration.\n */\n readonly methodFieldName = \"method\";\n\n /**\n * Name of the field used to specify the request body (data) in the request configuration.\n */\n readonly bodyFieldName = \"data\";\n\n /**\n * Name of the field used to specify the request headers in the request configuration.\n */\n readonly headersFieldName = \"headers\";\n\n /**\n * Name of the field used to specify the query parameters in the request configuration.\n */\n readonly queryFieldName = \"params\";\n\n /**\n * The name of the client this adapter is configured for, which is 'axios' in this case.\n */\n readonly name = \"axios\";\n\n /**\n * Method that should generate and return the client-specific configuration statements.\n *\n * @returns {Statement[]} An array of TypeScript statements that define the client configuration.\n *\n * @throws {Error} Indicates that the method is not yet implemented and needs to be filled in.\n */\n public client(\n uri: string,\n method: string,\n parameters: ParameterObject[],\n requestBody: MediaTypeObject | undefined,\n response: MediaTypeObject | undefined,\n adapter: Adapter,\n shouldUseFormData: boolean,\n ): Statement[] {\n const statements: Statement[] = [];\n\n // Split parameters into header and body parameters\n const inBody = parameters.filter((p) => !p.in || p.in === \"body\");\n const inHeader = parameters.filter((p) => p.in === \"header\");\n\n /**\n * Creates the literal object expression for fetch options\n * including method, headers, and body.\n * @returns - The constructed fetch options object\n */\n const toLiterlExpression = () => {\n return t.createObjectLiteralExpression(\n [\n // Set the HTTP method\n t.createPropertyAssignment(\n t.createIdentifier(adapter.methodFieldName),\n t.createStringLiteral(method.toUpperCase()),\n ),\n ]\n .concat(\n // Add headers if there are any\n inHeader.length > 0\n ? t.createPropertyAssignment(\n t.createIdentifier(adapter.headersFieldName),\n t.createObjectLiteralExpression(\n inHeader.map((p) =>\n t.createPropertyAssignment(\n t.createStringLiteral(p.name),\n t.createCallExpression(\n t.createIdentifier(\"encodeURIComponent\"),\n undefined,\n [\n t.createCallExpression(\n t.createIdentifier(\"String\"),\n undefined,\n [\n t.createIdentifier(\n Base.camelCase(Base.normalize(p.name)),\n ),\n ],\n ),\n ],\n ),\n ),\n ),\n ),\n )\n : [],\n )\n .concat(\n shouldUseFormData || inBody.length > 0 || requestBody?.schema\n ? t.createPropertyAssignment(\n t.createIdentifier(adapter.bodyFieldName),\n shouldUseFormData\n ? t.createIdentifier(\"fd\")\n : inBody.length > 0 ||\n (requestBody?.schema &&\n !Generator.isBinarySchema(requestBody.schema))\n ? t.createIdentifier(\"req\")\n : t.createIdentifier(\"req\"),\n )\n : [],\n ),\n true,\n );\n };\n\n // Construct the fetch call and return statement\n statements.push(\n t.createReturnStatement(\n t.createCallExpression(\n t.createIdentifier(adapter.name),\n response?.schema\n ? [\n Generator.toTypeNode(\n response.schema,\n ) as unknown as TypeReferenceNode,\n ]\n : undefined,\n [Generator.toUrlTemplate(uri, parameters), toLiterlExpression()],\n ),\n ),\n );\n\n return statements;\n }\n}\n","/* eslint-disable unicorn/prefer-spread */\nimport { Adapter } from \"@apicodegen/core/base/Adaptor\";\nimport { Base } from \"@apicodegen/core/base/Base\";\nimport { Generator } from \"@apicodegen/core/generator\";\nimport { MediaTypeObject, ParameterObject } from \"@apicodegen/core/interface\";\nimport type { Statement } from \"typescript\";\nimport { factory as t, SyntaxKind } from \"typescript\";\n\n/**\n * FetchAdapter is an adapter class that generates client-side fetch requests.\n * It handles parameters, headers, and request bodies to construct proper fetch calls.\n */\nexport class FetchAdapter extends Adapter {\n readonly methodFieldName = \"method\";\n readonly bodyFieldName = \"body\";\n readonly headersFieldName = \"headers\";\n readonly queryFieldName = \"\";\n readonly name = \"fetch\";\n\n /**\n * Generates client code for making API requests using the Fetch API.\n * @param uri - The API endpoint URI\n * @param method - The HTTP method (GET, POST, etc.)\n * @param parameters - Array of parameters to include in the request\n * @param requestBody - The request body media type definition\n * @param response - The response media type definition\n * @param adapter - The adapter instance\n * @param shouldUseFormData - Flag to use FormData for the request body\n * @param shouldUseJSONResponse - Flag to use JSON parsing for the response\n * @return - An array of generated TypeScript statements\n */\n public client(\n uri: string,\n method: string,\n parameters: ParameterObject[],\n requestBody: MediaTypeObject | undefined,\n response: MediaTypeObject | undefined,\n adapter: Adapter,\n shouldUseFormData: boolean,\n shouldUseJSONResponse: boolean,\n ): Statement[] {\n const statements: Statement[] = [];\n\n // Split parameters into header and body parameters\n const inBody = parameters.filter((p) => !p.in || p.in === \"body\");\n const inHeader = parameters.filter((p) => p.in === \"header\");\n\n /**\n * Creates the literal object expression for fetch options\n * including method, headers, and body.\n * @returns - The constructed fetch options object\n */\n const toLiterlExpression = () => {\n return t.createObjectLiteralExpression(\n [\n // Set the HTTP method\n t.createPropertyAssignment(\n t.createIdentifier(adapter.methodFieldName),\n t.createStringLiteral(method.toUpperCase()),\n ),\n ]\n .concat(\n // Add headers if there are any\n inHeader.length > 0\n ? t.createPropertyAssignment(\n t.createIdentifier(adapter.headersFieldName),\n t.createObjectLiteralExpression(\n inHeader.map((p) =>\n t.createPropertyAssignment(\n t.createStringLiteral(p.name),\n t.createCallExpression(\n t.createIdentifier(\"encodeURIComponent\"),\n undefined,\n [\n t.createCallExpression(\n t.createIdentifier(\"String\"),\n undefined,\n [\n t.createIdentifier(\n Base.camelCase(Base.normalize(p.name)),\n ),\n ],\n ),\n ],\n ),\n ),\n ),\n ),\n )\n : [],\n )\n .concat(\n shouldUseFormData || inBody.length > 0 || requestBody?.schema\n ? t.createPropertyAssignment(\n t.createIdentifier(adapter.bodyFieldName),\n shouldUseFormData\n ? t.createIdentifier(\"fd\")\n : inBody.length > 0 ||\n (requestBody?.schema &&\n !Generator.isBinarySchema(requestBody.schema))\n ? t.createCallExpression(\n t.createPropertyAccessExpression(\n t.createIdentifier(\"JSON\"),\n t.createIdentifier(\"stringify\"),\n ),\n [],\n [\n requestBody\n ? t.createIdentifier(\"req\")\n : t.createObjectLiteralExpression(\n inBody.map((b) =>\n t.createShorthandPropertyAssignment(\n t.createIdentifier(b.name),\n ),\n ),\n true,\n ),\n ],\n )\n : // One File parameter\n t.createIdentifier(\"req\"),\n )\n : [],\n ),\n true,\n );\n };\n\n // Construct the fetch call and return statement\n statements.push(\n t.createReturnStatement(\n shouldUseJSONResponse\n ? // Handle JSON response with proper type checking\n t.createCallExpression(\n t.createPropertyAccessExpression(\n t.createCallExpression(\n t.createIdentifier(adapter.name),\n undefined,\n [\n Generator.toUrlTemplate(uri, parameters),\n toLiterlExpression(),\n ],\n ),\n t.createIdentifier(\"then\"),\n ),\n undefined,\n [\n t.createArrowFunction(\n [t.createModifier(SyntaxKind.AsyncKeyword)],\n [],\n [\n t.createParameterDeclaration(\n undefined,\n undefined,\n t.createIdentifier(\"response\"),\n ),\n ],\n undefined,\n t.createToken(SyntaxKind.EqualsGreaterThanToken),\n response?.schema\n ? t.createAsExpression(\n t.createParenthesizedExpression(\n t.createAwaitExpression(\n t.createCallExpression(\n t.createPropertyAccessExpression(\n t.createIdentifier(\"response\"),\n t.createIdentifier(\"json\"),\n ),\n undefined,\n [],\n ),\n ),\n ),\n response?.schema\n ? Generator.toTypeNode(response.schema)\n : t.createToken(SyntaxKind.UnknownKeyword),\n )\n : t.createParenthesizedExpression(\n t.createAwaitExpression(\n t.createCallExpression(\n t.createPropertyAccessExpression(\n t.createIdentifier(\"response\"),\n t.createIdentifier(\"json\"),\n ),\n undefined,\n [],\n ),\n ),\n ),\n ),\n ],\n )\n : // Simple fetch call without JSON parsing\n t.createCallExpression(\n t.createIdentifier(adapter.name),\n undefined,\n [Generator.toUrlTemplate(uri, parameters), toLiterlExpression()],\n ),\n ),\n );\n\n return statements;\n }\n}\n","import type {\n Adaptors,\n ProviderInitOptions,\n ProviderInitResult,\n} from \"@apicodegen/core\";\nimport {\n Adapter,\n Adaptors as ads,\n AxiosAdapter,\n Base,\n FetchAdapter,\n Generator,\n Provider,\n} from \"@apicodegen/core\";\nimport { createScopedLogger } from \"@moccona/logger\";\nimport { OpenAPI, OpenAPIV2, OpenAPIV3, OpenAPIV3_1 } from \"openapi-types\";\n\nimport { V2 } from \"./V2\";\nimport { V3 } from \"./V3\";\nimport { V3_1 } from \"./V3_1\";\n\nconst logger = createScopedLogger(\"OpenAPI\");\n\nexport enum OpenAPIVersion {\n v2 = \"v2\",\n v3 = \"v3\",\n v3_1 = \"v3_1\",\n unknown = \"unknown\",\n}\n\nfunction getDocVersion(doc: OpenAPI.Document) {\n const version = (\n (doc as OpenAPIV3.Document).openapi || (doc as OpenAPIV2.Document).swagger\n ).slice(0, 3);\n\n switch (version) {\n case \"2.0\":\n return OpenAPIVersion.v2;\n case \"3.0\":\n return OpenAPIVersion.v3;\n case \"3.1\":\n return OpenAPIVersion.v3_1;\n default:\n return OpenAPIVersion.unknown;\n }\n}\n\nexport class OpenAPIProvider extends Provider {\n public parse(doc: OpenAPIV3.Document): ProviderInitResult {\n const version = getDocVersion(doc);\n\n logger.debug(`openapi version ${version}`);\n\n let returnValue: ProviderInitResult;\n\n switch (version) {\n case OpenAPIVersion.v2:\n returnValue = new V2(doc as unknown as OpenAPIV2.Document).init();\n break;\n case OpenAPIVersion.v3:\n returnValue = new V3(doc as unknown as OpenAPIV3.Document).init();\n break;\n case OpenAPIVersion.v3_1:\n returnValue = new V3_1(doc as unknown as OpenAPIV3_1.Document).init();\n break;\n default:\n logger.error(`Not a valid OpenAPI version ${version}`);\n process.exit(1);\n }\n\n return returnValue!;\n }\n}\n\nfunction getAdaptor(type: keyof typeof Adaptors): Adapter {\n switch (type) {\n case ads.axios:\n return new AxiosAdapter();\n case ads.fetch:\n return new FetchAdapter();\n default:\n throw TypeError(`Not Supported Adaptor ${type}`);\n }\n}\n\nexport async function codeGen(initOptions: ProviderInitOptions) {\n const { verbose } = initOptions;\n\n if (verbose) {\n logger.setLevel(\"debug\");\n } else {\n logger.setLevel(\"info\");\n }\n\n logger.info(`Fech document from ${initOptions.docURL}`);\n\n const doc = await Base.fetchDoc(\n initOptions.docURL,\n initOptions.requestOptions,\n );\n\n const provider = new OpenAPIProvider(initOptions, doc);\n const { enums, schemas, parameters, responses, requestBodies, apis } =\n provider;\n\n const adaptor = getAdaptor(initOptions.adaptor ?? ads.fetch);\n const code = await Generator.genCode(\n {\n enums,\n schemas,\n parameters,\n responses,\n requestBodies,\n apis,\n },\n initOptions,\n adaptor,\n );\n\n if (process.env.NODE_ENV === \"test\") {\n await Generator.write(code, initOptions.output);\n }\n\n return code;\n}\n\nexport { type ProviderInitOptions } from \"@apicodegen/core\";\n","import {\n ArrayTypeSchemaObject,\n EnumSchemaObject,\n MediaTypeObject,\n MediaTypes,\n OperationObject,\n ParameterIn,\n ParameterObject,\n SchemaFormatType,\n SchemaObject,\n} from \"@apicodegen/core\";\nimport { Base, HttpMethods, NonArraySchemaType } from \"@apicodegen/core\";\nimport { OpenAPIV2 } from \"openapi-types\";\n\nexport class V2 {\n doc!: OpenAPIV2.Document;\n\n constructor(doc: OpenAPIV2.Document) {\n this.doc = doc;\n }\n\n /**\n * Is array schema.\n */\n private isOpenAPIArraySchema(schema: OpenAPIV2.SchemaObject): boolean {\n return typeof schema === \"object\" && schema.type === \"array\";\n }\n\n /**\n * OpenAPI schema to base schema.\n */\n private getSchemaByRef(\n schema: OpenAPIV2.SchemaObject | OpenAPIV2.ReferenceObject,\n reserveRef = false,\n enums: EnumSchemaObject[] = [],\n upLevelSchemaKey = \"\",\n ): SchemaObject {\n let refName = \"\";\n if (Base.isRef(schema)) {\n refName = Base.upperCamelCase(Base.ref2name(schema.$ref));\n if (reserveRef) {\n return {\n type: upLevelSchemaKey + refName,\n };\n }\n\n if (!this.doc.definitions) {\n this.doc.definitions = {};\n }\n\n schema = this.doc.definitions[Base.ref2name(schema.$ref, this.doc)];\n }\n\n return this.toBaseSchema(schema, enums, \"\", upLevelSchemaKey + refName);\n }\n\n /**\n * Transform all OpenAPI schema to Base Schema\n */\n private toBaseSchema(\n schema: OpenAPIV2.SchemaObject | OpenAPIV2.ReferenceObject | undefined,\n enums: EnumSchemaObject[] = [],\n schemaKey = \"\",\n upLevelSchemaKey = \"\",\n ): SchemaObject {\n if (!schema) {\n return {\n type: \"unknown\",\n };\n }\n\n if (Base.isRef(schema)) {\n return this.getSchemaByRef(schema, true);\n }\n\n if (this.isOpenAPIArraySchema(schema)) {\n const { type, description, items, required } = schema;\n\n return {\n type: type as string,\n required: !!required,\n description,\n items: this.toBaseSchema(items, enums, schemaKey, upLevelSchemaKey),\n } as ArrayTypeSchemaObject;\n } else {\n const {\n required = [],\n allOf,\n anyOf,\n description,\n enum: enum_,\n format,\n oneOf,\n properties = {},\n } = schema;\n let { type } = schema;\n\n if (enum_ && type !== \"boolean\") {\n const name =\n Base.upperCamelCase(upLevelSchemaKey) +\n Base.upperCamelCase(schemaKey);\n\n const enumObject = {\n name,\n enum: [...new Set(enum_ as (string | number)[])],\n };\n\n const sameObject = Base.findSameSchema(enumObject, enums);\n\n if (\n !sameObject &&\n Base.isValidEnumType(schema as unknown as SchemaObject)\n ) {\n enums.push(enumObject);\n }\n\n return {\n type: sameObject\n ? sameObject.name\n : Base.isBooleanEnum(schema as unknown as SchemaObject)\n ? \"boolean\"\n : enumObject.name,\n required,\n description,\n };\n }\n\n if (type === undefined && Object.keys(properties).length > 0) {\n type = NonArraySchemaType.object;\n }\n\n return {\n type: type as unknown as NonArraySchemaType,\n required,\n description,\n enum: enum_,\n format: format as unknown as SchemaFormatType,\n allOf: allOf?.map((s) =>\n Base.isRef(s)\n ? {\n ...s,\n ref: s.$ref,\n type: Base.upperCamelCase(Base.ref2name(s.$ref, this.doc)),\n }\n : this.toBaseSchema(s as OpenAPIV2.SchemaObject, enums),\n ),\n anyOf: anyOf?.map((s) =>\n Base.isRef(s)\n ? {\n ...s,\n ref: s.$ref,\n type: Base.upperCamelCase(Base.ref2name(s.$ref, this.doc)),\n }\n : this.toBaseSchema(s as OpenAPIV2.SchemaObject, enums),\n ),\n oneOf: oneOf?.map((s) =>\n Base.isRef(s)\n ? {\n ...s,\n ref: s.$ref,\n type: Base.upperCamelCase(Base.ref2name(s.$ref, this.doc)),\n }\n : this.toBaseSchema(s as OpenAPIV2.SchemaObject, enums),\n ),\n properties: Object.keys(properties).reduce((acc, p) => {\n const propSchema = properties[p];\n return {\n ...acc,\n [p]: Base.isRef(propSchema)\n ? {\n type: Base.upperCamelCase(\n Base.ref2name(propSchema.$ref, this.doc),\n ),\n }\n : this.toBaseSchema(propSchema, enums, p, upLevelSchemaKey),\n };\n }, {}),\n };\n }\n }\n\n /**\n * OpenAPI parameter to base parameter.\n */\n private getParameterByRef(\n parameter: OpenAPIV2.ParameterObject | OpenAPIV2.ReferenceObject,\n enums: EnumSchemaObject[] = [],\n upLevelSchemaKey = \"\",\n ): ParameterObject {\n if (Base.isRef(parameter)) {\n parameter = this.doc.parameters![Base.ref2name(parameter.$ref, this.doc)];\n }\n\n const {\n name,\n required,\n description,\n type,\n items,\n enum: enum_,\n properties,\n schema,\n } = parameter;\n\n if (enum_) {\n const type =\n Base.upperCamelCase(upLevelSchemaKey) + Base.upperCamelCase(name);\n\n const enumSchema = {\n name: type,\n enum: [...new Set(enum_ as (string | number)[])],\n };\n\n const sameEnum = Base.findSameSchema(enumSchema, enums);\n\n if (\n !sameEnum &&\n Base.isValidEnumType({ type, enum: enums } as SchemaObject)\n ) {\n enums.push(enumSchema);\n }\n\n return {\n name,\n required,\n description,\n in: parameter.in as ParameterIn,\n schema: {\n type: sameEnum?.name ?? type,\n },\n };\n }\n\n if (items) {\n return {\n name,\n required,\n description,\n in: parameter.in as ParameterIn,\n schema: {\n type: type as string,\n items: items as OpenAPIV2.SchemaObject | undefined,\n } as ArrayTypeSchemaObject,\n };\n }\n\n if (schema && Base.isRef(schema)) {\n return {\n name,\n required,\n description,\n in: parameter.in as ParameterIn,\n schema: {\n type: Base.upperCamelCase(Base.ref2name(schema.$ref)),\n },\n };\n }\n\n return {\n name,\n required,\n description,\n in: parameter.in as ParameterIn,\n schema: {\n type: type as string,\n properties,\n } as SchemaObject,\n };\n }\n\n /**\n * OpenAPI schema to base response\n */\n private getResponseByRef(\n schema: OpenAPIV2.ResponseObject | OpenAPIV2.ReferenceObject,\n ): MediaTypeObject[] {\n if (Base.isRef(schema)) {\n schema = this.doc.responses![Base.ref2name(schema.$ref, this.doc)]!;\n }\n\n const { schema: responseSchema } = schema;\n\n return [\n {\n type: MediaTypes.JSON,\n schema: responseSchema && this.getSchemaByRef(responseSchema, true),\n },\n ];\n }\n\n public init() {\n const { definitions = {}, responses = {}, paths = {} } = this.doc;\n const enums: EnumSchemaObject[] = [];\n\n const definitions_ = Object.keys(definitions).reduce((acc, key) => {\n const schema = definitions[key];\n\n return {\n ...acc,\n [key]: this.getSchemaByRef(schema, false, enums, key),\n };\n }, {});\n\n const responses_ = Object.keys(responses).reduce((acc, key) => {\n const response = responses[key];\n\n return {\n ...acc,\n [key]: this.getResponseByRef(response),\n };\n }, {});\n\n const apis = Object.keys(paths).reduce((acc, path) => {\n const pathObject = paths[path] ?? {};\n const { $ref } = pathObject;\n\n const methodApis: OperationObject[] = [];\n if ($ref) {\n // TODO: Need to handle ref senario\n } else {\n const { parameters = [] } = pathObject;\n Object.values(HttpMethods).forEach((method) => {\n const methodObject = pathObject[method as OpenAPIV2.HttpMethods];\n\n if (methodObject) {\n const {\n deprecated,\n operationId,\n summary: summary_,\n description: description_,\n responses = {},\n } = methodObject;\n const { parameters: parameters_ = [] } = methodObject;\n const baseParameters = [...parameters, ...parameters_].map(\n (parameter) => this.getParameterByRef(parameter, enums),\n );\n const uniqueParameterName = [\n ...new Set(baseParameters.map((p) => p.name)),\n ];\n\n if (Object.keys(responses).length === 0) {\n Object.assign(responses, {\n 200: {\n description: \"Successful response\",\n },\n });\n }\n\n const inBody = baseParameters.filter(\n (p) => p.in === \"body\" || p.in === \"formData\",\n );\n\n const notInBody = baseParameters.filter(\n (p) => p.in !== \"body\" && p.in !== \"formData\",\n );\n\n const httpCodes = Object.keys(responses);\n for (const code of httpCodes) {\n if (code in responses) {\n const response = responses[code]!;\n const responseSchema = this.getResponseByRef(response);\n\n const inBodyOnlyHasBody =\n inBody &&\n inBody.length === 1 &&\n inBody[0].in === \"body\" &&\n inBody[0].name === \"body\";\n\n methodApis.push({\n method,\n operationId,\n summary: summary_,\n deprecated: deprecated,\n description: description_,\n parameters: uniqueParameterName\n .map((name) => notInBody.find((p) => p.name === name)!)\n .filter(Boolean),\n responses: responseSchema,\n requestBody:\n inBody.length > 0\n ? inBodyOnlyHasBody\n ? [\n {\n type: MediaTypes.JSON,\n schema: inBody[0].schema,\n },\n ]\n : [\n {\n type: MediaTypes.JSON,\n schema: {\n type: NonArraySchemaType.object,\n properties: inBody.reduce<\n Record<string, SchemaObject>\n >((a, p) => {\n return {\n ...a,\n [p.name]: {\n type: p.schema?.type ?? \"unknown\",\n required: p.schema?.required,\n // @ts-expect-error items can be undefined\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n items: p.schema?.items,\n description: p.schema?.description,\n } as SchemaObject,\n };\n }, {}),\n },\n },\n ]\n : undefined,\n });\n break;\n }\n }\n }\n });\n }\n\n return {\n ...acc,\n [path]: methodApis,\n };\n }, {});\n\n return {\n enums: Base.uniqueEnums(enums),\n schemas: definitions_,\n responses: responses_,\n parameters: {},\n requestBodies: {},\n apis,\n };\n }\n}\n","import type {\n EnumSchemaObject,\n MediaTypeObject,\n MediaTypes,\n OperationObject,\n ParameterIn,\n ParameterObject,\n SchemaFormatType,\n SchemaObject,\n} from \"@apicodegen/core\";\nimport { Base, HttpMethods, NonArraySchemaType } from \"@apicodegen/core\";\nimport { OpenAPIV3 } from \"openapi-types\";\n\nexport class V3 {\n doc!: OpenAPIV3.Document;\n\n constructor(doc: OpenAPIV3.Document) {\n this.doc = doc;\n }\n\n /**\n * Is array schema.\n */\n private isOpenAPIArraySchema(\n schema: OpenAPIV3.SchemaObject,\n ): schema is OpenAPIV3.ArraySchemaObject {\n return typeof schema === \"object\" && schema.type === \"array\";\n }\n\n /**\n * OpenAPI schema to base schema.\n */\n private getSchemaByRef(\n schema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject,\n reserveRef = false,\n enums: EnumSchemaObject[] = [],\n upLevelSchemaKey = \"\",\n ): SchemaObject {\n let refName = \"\";\n if (Base.isRef(schema)) {\n refName = Base.capitalize(Base.ref2name(schema.$ref));\n if (reserveRef) {\n return {\n type: upLevelSchemaKey + refName,\n };\n }\n const resolvedSchema = this.doc.components?.schemas?.[\n Base.ref2name(schema.$ref, this.doc)\n ];\n if (!resolvedSchema) {\n return { type: \"unknown\" };\n }\n schema = resolvedSchema as OpenAPIV3.SchemaObject;\n }\n\n return this.toBaseSchema(schema, enums, \"\", upLevelSchemaKey + refName);\n }\n\n /**\n * OpenAPI parameter to base parameter.\n */\n private getParameterByRef(\n schema: OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject,\n enums: EnumSchemaObject[] = [],\n upLevelSchemaKey = \"\",\n ): ParameterObject {\n if (Base.isRef(schema)) {\n const resolvedSchema = this.doc.components?.parameters?.[\n Base.ref2name(schema.$ref, this.doc)\n ];\n if (!resolvedSchema) {\n return {\n name: \"unknown\",\n in: \"query\" as ParameterIn,\n };\n }\n schema = resolvedSchema as OpenAPIV3.ParameterObject;\n }\n\n const {\n name,\n required,\n deprecated,\n description,\n schema: parameterSchema,\n } = schema;\n\n if (\n parameterSchema &&\n !Base.isRef(parameterSchema) &&\n parameterSchema.enum\n ) {\n const type =\n Base.upperCamelCase(Base.normalize(upLevelSchemaKey)) +\n Base.upperCamelCase(Base.normalize(name));\n\n const enumSchema = {\n name: type,\n enum: [...new Set(parameterSchema.enum as (string | number)[])],\n };\n\n const sameEnum = Base.findSameSchema(enumSchema, enums);\n\n if (\n !sameEnum &&\n Base.isValidEnumType(parameterSchema as unknown as SchemaObject)\n ) {\n enums.push(enumSchema);\n }\n\n return {\n name,\n required,\n description,\n deprecated,\n in: schema.in as ParameterIn,\n schema: {\n type: sameEnum?.name ?? type,\n },\n };\n }\n\n return {\n name,\n required,\n description,\n deprecated,\n in: schema.in as ParameterIn,\n schema:\n schema.schema &&\n this.getSchemaByRef(\n schema.schema,\n false,\n enums,\n upLevelSchemaKey + Base.capitalize(name),\n ),\n };\n }\n\n /**\n * OpenAPI schema to base response\n */\n private getResponseByRef(\n schema: OpenAPIV3.ResponseObject | OpenAPIV3.ReferenceObject,\n ): MediaTypeObject[] {\n if (Base.isRef(schema)) {\n const resolvedSchema = this.doc.components?.responses?.[\n Base.ref2name(schema.$ref, this.doc)\n ];\n if (!resolvedSchema) {\n return [];\n }\n schema = resolvedSchema as OpenAPIV3.ResponseObject;\n }\n\n const { content = {} } = schema;\n\n return Object.keys(content).map((c) => ({\n type: c as MediaTypes,\n schema: content[c].schema && this.getSchemaByRef(content[c].schema, true),\n }));\n }\n\n /**\n * OpenAPI schema to requestBody.\n */\n private getRequestBodyByRef(\n schema: OpenAPIV3.RequestBodyObject | OpenAPIV3.ReferenceObject,\n enums: EnumSchemaObject[] = [],\n ): MediaTypeObject[] {\n if (Base.isRef(schema)) {\n const resolvedSchema = this.doc.components?.requestBodies?.[\n Base.ref2name(schema.$ref, this.doc)\n ];\n if (!resolvedSchema) {\n return [];\n }\n schema = resolvedSchema as OpenAPIV3.RequestBodyObject;\n }\n\n const { content = {} } = schema;\n\n return Object.keys(content).map((c) => ({\n type: c as MediaTypes,\n schema:\n content[c].schema &&\n this.getSchemaByRef(content[c].schema, false, enums),\n }));\n }\n\n /**\n * Transform all OpenAPI schema to Base Schema\n */\n private toBaseSchema(\n schema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject | undefined,\n enums: EnumSchemaObject[] = [],\n schemaKey = \"\",\n upLevelSchemaKey = \"\",\n ): SchemaObject {\n if (!schema) {\n return {\n type: \"unknown\",\n };\n }\n\n if (Base.isRef(schema)) {\n return this.getSchemaByRef(schema, true);\n }\n\n if (this.isOpenAPIArraySchema(schema)) {\n const { type, description, items, required } = schema;\n\n return {\n type,\n required: !!required,\n description,\n items: this.toBaseSchema(items, enums, schemaKey, upLevelSchemaKey),\n };\n } else {\n const {\n required = [],\n allOf,\n anyOf,\n description,\n deprecated,\n enum: enum_,\n format,\n oneOf,\n properties = {},\n } = schema;\n let { type } = schema;\n\n if (enum_ && type !== \"boolean\") {\n const name =\n Base.upperCamelCase(Base.normalize(upLevelSchemaKey)) +\n Base.upperCamelCase(Base.normalize(schemaKey));\n\n const enumObject = {\n name,\n enum: [...new Set(enum_ as (string | number)[])],\n };\n\n const sameObject = Base.findSameSchema(enumObject, enums);\n\n if (\n !sameObject &&\n Base.isValidEnumType(schema as unknown as SchemaObject)\n ) {\n enums.push(enumObject);\n }\n\n return {\n type: sameObject\n ? sameObject.name\n : Base.isBooleanEnum(schema as unknown as SchemaObject)\n ? \"boolean\"\n : enumObject.name,\n required,\n description,\n deprecated,\n };\n }\n\n if (type === undefined && Object.keys(properties).length > 0) {\n type = NonArraySchemaType.object;\n }\n\n return {\n type: type as unknown as NonArraySchemaType,\n required,\n description,\n deprecated,\n enum: enum_,\n format: format as unknown as SchemaFormatType,\n allOf: allOf?.map((s) =>\n Base.isRef(s)\n ? {\n ...s,\n ref: s.$ref,\n type: Base.capitalize(Base.ref2name(s.$ref, this.doc)),\n }\n : this.toBaseSchema(s, enums),\n ),\n anyOf: anyOf?.map((s) =>\n Base.isRef(s)\n ? {\n ...s,\n ref: s.$ref,\n type: Base.capitalize(Base.ref2name(s.$ref, this.doc)),\n }\n : this.toBaseSchema(s, enums),\n ),\n oneOf: oneOf?.map((s) =>\n Base.isRef(s)\n ? {\n ...s,\n ref: s.$ref,\n type: Base.capitalize(Base.ref2name(s.$ref, this.doc)),\n }\n : this.toBaseSchema(s, enums),\n ),\n properties: Object.keys(properties).reduce((acc, p) => {\n const propSchema = properties[p];\n return {\n ...acc,\n [p]: Base.isRef(propSchema)\n ? {\n type: Base.capitalize(\n Base.ref2name(propSchema.$ref, this.doc),\n ),\n }\n : this.toBaseSchema(propSchema, enums, p, upLevelSchemaKey),\n };\n }, {}),\n };\n }\n }\n\n public init() {\n const { components = {}, paths = {} } = this.doc;\n const enums: EnumSchemaObject[] = [];\n const {\n requestBodies = {},\n responses = {},\n parameters = {},\n schemas = {},\n } = components;\n\n const schemas_ = Object.keys(schemas).reduce((acc, key) => {\n const schema = schemas[key];\n\n return {\n ...acc,\n [key]: this.getSchemaByRef(schema, false, enums, key),\n };\n }, {});\n\n const parameters_ = Object.keys(parameters).reduce((acc, key) => {\n const parameter = parameters[key];\n\n return {\n ...acc,\n [key]: this.getParameterByRef(parameter, enums, key),\n };\n }, {});\n\n const responses_ = Object.keys(responses).reduce((acc, key) => {\n const response = responses[key];\n\n return {\n ...acc,\n [key]: this.getResponseByRef(response),\n };\n }, {});\n\n const requestBodies_ = Object.keys(requestBodies).reduce((acc, key) => {\n const requestBody = requestBodies[key];\n\n return {\n ...acc,\n [key]: this.getRequestBodyByRef(requestBody, enums),\n };\n }, {});\n\n const apis = Object.keys(paths).reduce((acc, path) => {\n const pathObject = paths[path] ?? {};\n const { $ref } = pathObject;\n\n const methodApis: OperationObject[] = [];\n if ($ref) {\n // TODO: Need to handle ref senario\n } else {\n const { parameters = [], description, summary } = pathObject;\n Object.values(HttpMethods).forEach((method) => {\n const methodObject = pathObject[method as OpenAPIV3.HttpMethods];\n\n if (methodObject) {\n const {\n deprecated,\n operationId,\n responses = {},\n summary: summary_,\n description: description_,\n requestBody = { content: {} },\n } = methodObject;\n const { parameters: parameters_ = [] } = methodObject;\n const baseParameters = [...parameters, ...parameters_].map(\n (parameter) => this.getParameterByRef(parameter, enums),\n );\n const baseRequestBody = this.getRequestBodyByRef(\n requestBody,\n enums,\n );\n const uniqueParameterName = [\n ...new Set(baseParameters.map((p) => p.name)),\n ];\n\n if (Object.keys(responses).length === 0) {\n Object.assign(responses, {\n 200: {\n description: \"Successful response\",\n },\n });\n }\n const httpCodes = Object.keys(responses);\n for (const code of httpCodes) {\n if (code in responses) {\n const response = responses[code];\n const responseSchema = this.getResponseByRef(response);\n methodApis.push({\n method,\n operationId,\n summary: summary_ ?? summary,\n description: description_ ?? description,\n deprecated: deprecated,\n parameters: uniqueParameterName.map(\n (name) => baseParameters.find((p) => p.name === name)!,\n ),\n responses: responseSchema,\n requestBody: baseRequestBody,\n });\n break;\n }\n }\n }\n });\n }\n\n return {\n ...acc,\n [path]: methodApis,\n };\n }, {});\n\n return {\n enums: Base.uniqueEnums(enums),\n schemas: schemas_,\n responses: responses_,\n parameters: parameters_,\n requestBodies: requestBodies_,\n apis,\n };\n }\n}\n","/* eslint-disable unicorn/filename-case */\n\nimport type {\n EnumSchemaObject,\n MediaTypeObject,\n MediaTypes,\n OperationObject,\n ParameterIn,\n ParameterObject,\n SchemaFormatType,\n SchemaObject,\n} from \"@apicodegen/core\";\nimport { Base, HttpMethods, NonArraySchemaType } from \"@apicodegen/core\";\nimport { OpenAPIV3_1 } from \"openapi-types\";\n\nexport class V3_1 {\n doc!: OpenAPIV3_1.Document;\n\n constructor(doc: OpenAPIV3_1.Document) {\n this.doc = doc;\n }\n\n /**\n * Is array schema.\n */\n private isOpenAPIArraySchema(\n schema: OpenAPIV3_1.SchemaObject,\n ): schema is OpenAPIV3_1.ArraySchemaObject {\n return typeof schema === \"object\" && schema.type === \"array\";\n }\n\n /**\n * OpenAPI schema to base schema.\n */\n private getSchemaByRef(\n schema: OpenAPIV3_1.SchemaObject | OpenAPIV3_1.ReferenceObject,\n reserveRef = false,\n enums: EnumSchemaObject[] = [],\n upLevelSchemaKey = \"\",\n ): SchemaObject {\n let refName = \"\";\n if (Base.isRef(schema)) {\n refName = Base.upperCamelCase(Base.ref2name(schema.$ref));\n if (reserveRef) {\n return {\n type: upLevelSchemaKey + refName,\n };\n }\n\n if (!this.doc.components) {\n this.doc.components = {\n schemas: {},\n };\n }\n\n schema =\n this.doc.components.schemas![Base.ref2name(schema.$ref, this.doc)];\n }\n\n return this.toBaseSchema(schema, enums, \"\", upLevelSchemaKey + refName);\n }\n\n /**\n * OpenAPI parameter to base parameter.\n */\n private getParameterByRef(\n schema: OpenAPIV3_1.ParameterObject | OpenAPIV3_1.ReferenceObject,\n enums: EnumSchemaObject[] = [],\n upLevelSchemaKey = \"\",\n ): ParameterObject {\n if (Base.isRef(schema)) {\n schema = this.doc.components?.parameters?.[\n Base.ref2name(schema.$ref, this.doc)\n ] as OpenAPIV3_1.ParameterObject;\n }\n\n const {\n name,\n required,\n deprecated,\n description,\n schema: parameterSchema,\n } = schema;\n\n if (\n parameterSchema &&\n !Base.isRef(parameterSchema) &&\n parameterSchema.enum\n ) {\n const type =\n Base.upperCamelCase(upLevelSchemaKey) + Base.upperCamelCase(name);\n\n const enumSchema = {\n name: type,\n enum: [...new Set(parameterSchema.enum as (string | number)[])],\n };\n\n const sameEnum = Base.findSameSchema(enumSchema, enums);\n\n if (\n !sameEnum &&\n Base.isValidEnumType(parameterSchema as unknown as SchemaObject)\n ) {\n enums.push(enumSchema);\n }\n\n return {\n name,\n required,\n description,\n deprecated,\n in: schema.in as ParameterIn,\n schema: {\n type: sameEnum?.name ?? type,\n },\n };\n }\n\n return {\n name,\n required,\n description,\n deprecated,\n in: schema.in as ParameterIn,\n schema:\n schema.schema &&\n this.getSchemaByRef(\n schema.schema,\n false,\n enums,\n upLevelSchemaKey + Base.capitalize(name),\n ),\n };\n }\n\n /**\n * OpenAPI schema to base response\n */\n private getResponseByRef(\n schema: OpenAPIV3_1.ResponseObject | OpenAPIV3_1.ReferenceObject,\n ): MediaTypeObject[] {\n if (Base.isRef(schema)) {\n schema = this.doc.components?.responses?.[\n Base.ref2name(schema.$ref, this.doc)\n ] as OpenAPIV3_1.ResponseObject;\n }\n\n const { content = {} } = schema;\n\n return Object.keys(content).map((c) => ({\n type: c as MediaTypes,\n schema: content[c].schema && this.getSchemaByRef(content[c].schema, true),\n }));\n }\n\n /**\n * OpenAPI schema to requestBody.\n */\n private getRequestBodyByRef(\n schema: OpenAPIV3_1.RequestBodyObject | OpenAPIV3_1.ReferenceObject,\n enums: EnumSchemaObject[] = [],\n reserveRef = false,\n ): MediaTypeObject[] {\n if (Base.isRef(schema)) {\n schema = this.doc.components?.requestBodies?.[\n Base.ref2name(schema.$ref, this.doc)\n ] as OpenAPIV3_1.RequestBodyObject;\n }\n\n const { content = {} } = schema;\n\n return Object.keys(content).map((c) => ({\n type: c as MediaTypes,\n schema:\n content[c].schema &&\n this.getSchemaByRef(content[c].schema, reserveRef, enums),\n }));\n }\n\n /**\n * Transform all OpenAPI schema to Base Schema\n */\n private toBaseSchema(\n schema: OpenAPIV3_1.SchemaObject | OpenAPIV3_1.ReferenceObject | undefined,\n enums: EnumSchemaObject[] = [],\n schemaKey = \"\",\n upLevelSchemaKey = \"\",\n ): SchemaObject {\n if (!schema) {\n return {\n type: \"unknown\",\n };\n }\n\n if (Base.isRef(schema)) {\n return this.getSchemaByRef(schema, true);\n }\n\n if (this.isOpenAPIArraySchema(schema)) {\n const { type, description, items, required } = schema;\n\n return {\n type,\n required: !!required,\n description,\n items: this.toBaseSchema(items, enums, schemaKey, upLevelSchemaKey),\n };\n } else {\n const {\n required = [],\n allOf,\n anyOf,\n description,\n deprecated,\n enum: enum_,\n format,\n oneOf,\n properties = {},\n } = schema;\n let { type } = schema;\n\n if (enum_ && type !== \"boolean\") {\n const name =\n Base.upperCamelCase(upLevelSchemaKey) +\n Base.upperCamelCase(schemaKey);\n\n const enumObject = {\n name,\n enum: [...new Set(enum_ as (string | number)[])],\n };\n\n const sameObject = Base.findSameSchema(enumObject, enums);\n\n if (\n !sameObject &&\n Base.isValidEnumType(schema as unknown as SchemaObject)\n ) {\n enums.push(enumObject);\n }\n\n return {\n type: sameObject\n ? sameObject.name\n : Base.isBooleanEnum(schema as unknown as SchemaObject)\n ? \"boolean\"\n : enumObject.name,\n required,\n description,\n deprecated,\n };\n }\n\n if (type === undefined && Object.keys(properties).length > 0) {\n type = NonArraySchemaType.object;\n }\n\n return {\n type: type as unknown as NonArraySchemaType,\n required,\n description,\n deprecated,\n enum: enum_,\n format: format as unknown as SchemaFormatType,\n allOf: allOf?.map((s) =>\n Base.isRef(s)\n ? {\n ...s,\n ref: s.$ref,\n type: Base.upperCamelCase(Base.ref2name(s.$ref, this.doc)),\n }\n : this.toBaseSchema(s, enums),\n ),\n anyOf: anyOf?.map((s) =>\n Base.isRef(s)\n ? {\n ...s,\n ref: s.$ref,\n type: Base.upperCamelCase(Base.ref2name(s.$ref, this.doc)),\n }\n : this.toBaseSchema(s, enums),\n ),\n oneOf: oneOf?.map((s) =>\n Base.isRef(s)\n ? {\n ...s,\n ref: s.$ref,\n type: Base.upperCamelCase(Base.ref2name(s.$ref, this.doc)),\n }\n : this.toBaseSchema(s, enums),\n ),\n properties: Object.keys(properties).reduce((acc, p) => {\n const propSchema = properties[p];\n return {\n ...acc,\n [p]: Base.isRef(propSchema)\n ? {\n type: Base.upperCamelCase(\n Base.ref2name(propSchema.$ref, this.doc),\n ),\n }\n : this.toBaseSchema(propSchema, enums, p, upLevelSchemaKey),\n };\n }, {}),\n };\n }\n }\n\n public init() {\n const { components = {}, paths = {} } = this.doc;\n const enums: EnumSchemaObject[] = [];\n const {\n requestBodies = {},\n responses = {},\n parameters = {},\n schemas = {},\n } = components;\n\n const schemas_ = Object.keys(schemas).reduce((acc, key) => {\n const schema = schemas[key];\n\n return {\n ...acc,\n [key]: this.getSchemaByRef(schema, false, enums, key),\n };\n }, {});\n\n const parameters_ = Object.keys(parameters).reduce((acc, key) => {\n const parameter = parameters[key];\n\n return {\n ...acc,\n [key]: this.getParameterByRef(parameter, enums, key),\n };\n }, {});\n\n const responses_ = Object.keys(responses).reduce((acc, key) => {\n const response = responses[key];\n\n return {\n ...acc,\n [key]: this.getResponseByRef(response),\n };\n }, {});\n\n const requestBodies_ = Object.keys(requestBodies).reduce((acc, key) => {\n const requestBody = requestBodies[key];\n\n return {\n ...acc,\n [key]: this.getRequestBodyByRef(requestBody, enums),\n };\n }, {});\n\n const apis = Object.keys(paths).reduce((acc, path) => {\n const pathObject = paths[path] ?? {};\n const { $ref } = pathObject;\n\n const methodApis: OperationObject[] = [];\n if ($ref) {\n // TODO: Need to handle ref senario\n } else {\n const { parameters = [], description, summary } = pathObject;\n Object.values(HttpMethods).forEach((method) => {\n const methodObject = pathObject[method as OpenAPIV3_1.HttpMethods];\n\n if (methodObject) {\n const {\n deprecated,\n operationId,\n summary: summary_,\n description: description_,\n responses = {},\n requestBody = { content: {} },\n } = methodObject;\n const { parameters: parameters_ = [] } = methodObject;\n const baseParameters = [...parameters, ...parameters_].map(\n (parameter) => this.getParameterByRef(parameter, enums),\n );\n const baseRequestBody = this.getRequestBodyByRef(\n requestBody,\n enums,\n true,\n );\n const uniqueParameterName = [\n ...new Set(baseParameters.map((p) => p.name)),\n ];\n\n if (Object.keys(responses).length === 0) {\n Object.assign(responses, {\n 200: {\n description: \"Successful response\",\n },\n });\n }\n const httpCodes = Object.keys(responses);\n for (const code of httpCodes) {\n if (code in responses) {\n const response = responses[code];\n const responseSchema = this.getResponseByRef(response);\n methodApis.push({\n method,\n operationId,\n summary: summary_ ?? summary,\n description: description_ ?? description,\n deprecated: deprecated,\n parameters: uniqueParameterName.map(\n (name) => baseParameters.find((p) => p.name === name)!,\n ),\n responses: responseSchema,\n requestBody: baseRequestBody,\n });\n break;\n }\n }\n }\n });\n }\n\n return {\n ...acc,\n [path]: methodApis,\n };\n }, {});\n\n return {\n enums: Base.uniqueEnums(enums),\n schemas: schemas_,\n responses: responses_,\n parameters: parameters_,\n requestBodies: requestBodies_,\n apis,\n };\n }\n}\n","import { codeGen, type ProviderInitOptions } from \"@apicodegen/openapi\";\nimport { createScopedLogger } from \"@moccona/logger\";\nimport { execaCommand } from \"execa\";\nimport fs from \"fs-extra\";\nimport type { PluginOption, ServerOptions } from \"vite\";\n\nconst PLUGIN_NAME = \"apiCodeGen\";\nconst logger = createScopedLogger(\"api-codegen-vite-plugin\");\n\nexport type apiCodeGenPluginOptions = ProviderInitOptions & {\n name: string;\n proxy?: ServerOptions[\"proxy\"];\n};\n\nexport const tsc = async (path: string) => {\n await execaCommand(`npx tsc ${path} --noEmit`);\n};\n\nexport function apiCodeGenPlugin(\n options: apiCodeGenPluginOptions[],\n): PluginOption {\n let firstRun = true;\n return {\n name: PLUGIN_NAME,\n async config(config) {\n if (!firstRun) return;\n firstRun = false;\n logger.info(\"-------> api codegen start <--------\");\n\n const proxies = await options.reduce(\n async (proxiesPromise_, option) => {\n const proxies_ = await proxiesPromise_;\n const { proxy = {}, name, ...codeGenInitOptions } = option;\n\n try {\n const code = await codeGen(codeGenInitOptions);\n await fs.createFile(codeGenInitOptions.output);\n await fs.writeFile(codeGenInitOptions.output, code);\n try {\n await tsc(codeGenInitOptions.output);\n } catch (error) {\n logger.error(error);\n }\n } catch (error) {\n logger.error(`Failed to generate api ${name}: ${error}`);\n }\n\n return {\n ...proxies_,\n ...proxy,\n };\n },\n Promise.resolve({} as ServerOptions[\"proxy\"]),\n );\n\n logger.info(\"-------> api codegen finished <--------\");\n\n return {\n ...config,\n server: {\n ...(config.server ?? {}),\n proxy: Object.assign({}, config.server?.proxy ?? {}, proxies),\n },\n };\n },\n };\n}\n"],"mappings":"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","names":["SchemaType","NonArraySchemaType","ArraySchemaType","SchemaFormatType","ParameterIn","MediaTypes","HttpMethods","Adaptors","t","t","format","type","schema","import_typescript","t","import_typescript","t","format","type","responses","format","parameters","responses","parameters_","format","parameters","responses","parameters_","OpenAPIVersion","import_logger","logger","fs"]}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["Agent","t","SyntaxKind","NodeFlags","t","t","SyntaxKind","path","fs","logger","path","fs"],"sources":["../src/core/base/Adaptor.ts","../src/core/constants/keywords.ts","../src/core/interface.ts","../src/core/base/Base.ts","../src/core/base/Provider.ts","../src/core/generator/index.ts","../src/core/client/axios.ts","../src/core/client/fetch.ts","../src/core/config.ts","../src/core/errors.ts","../src/openapi/V2.ts","../src/openapi/V3.ts","../src/openapi/V3_1.ts","../src/openapi/index.ts","../src/vite-plugin/index.ts"],"sourcesContent":["/**\n * @file Adapter abstract class definition\n * @author wp.l\n * @description Base adapter implementation for various code generation tools\n */\n\nimport type { Statement } from 'typescript';\nimport type { MediaTypeObject, ParameterObject } from '../interface.js';\n\n/**\n * Base adapter for tool\n * This abstract class serves as the foundation for implementing adapters for different code generation tools\n */\nexport abstract class Adapter {\n\t/**\n\t * @abstract The unique name/identifier for this adapter implementation\n\t */\n\tabstract readonly name: string;\n\n\t/**\n\t * @abstract The name of the field used to specify the HTTP method in API calls\n\t */\n\tabstract readonly methodFieldName: string;\n\n\t/**\n\t * @abstract The name of the field used to specify the request body in API calls\n\t */\n\tabstract readonly bodyFieldName: string;\n\n\t/**\n\t * @abstract The name of the field used to specify request headers in API calls\n\t */\n\tabstract readonly headersFieldName: string;\n\n\t/**\n\t * @abstract The name of the field used to specify query parameters in API calls\n\t */\n\tabstract readonly queryFieldName: string;\n\n\t/**\n\t * @abstract\n\t * @param {string} uri - The API endpoint URI\n\t * @param {string} method - The HTTP method (e.g., GET, POST, etc.)\n\t * @param {ParameterObject[]} parameters - An array of parameters for the API call\n\t * @param {MediaTypeObject | undefined} requestBody - The request body payload (if applicable)\n\t * @param {MediaTypeObject | undefined} response - The expected response format (if applicable)\n\t * @param {Adapter} adapter - An instance of the adapter being used\n\t * @param {boolean} useFormData - Flag indicating whether to use FormData for the request body\n\t * @param {boolean} useJSONResponse - Flag indicating whether the response should be parsed as JSON\n\t * @returns {Statement[]} An array of TypeScript AST statements representing the generated code\n\t */\n\tabstract client(\n\t\turi: string,\n\t\tmethod: string,\n\t\tparameters: ParameterObject[],\n\t\trequestBody: MediaTypeObject | undefined,\n\t\tresponse: MediaTypeObject | undefined,\n\t\tadapter: Adapter,\n\t\tuseFormData: boolean,\n\t\tuseJSONResponse: boolean\n\t): Statement[];\n}\n","export const typescriptKeywords = new Set([\n\t'break',\n\t'case',\n\t'catch',\n\t'class',\n\t'const',\n\t'continue',\n\t'debugger',\n\t'default',\n\t'delete',\n\t'do',\n\t'else',\n\t'enum',\n\t'export',\n\t'extends',\n\t'false',\n\t'finally',\n\t'for',\n\t'function',\n\t'if',\n\t'import',\n\t'in',\n\t'instanceof',\n\t'new',\n\t'null',\n\t'return',\n\t'super',\n\t'switch',\n\t'this',\n\t'throw',\n\t'true',\n\t'try',\n\t'typeof',\n\t'var',\n\t'void',\n\t'while',\n\t'with',\n\t'as',\n\t'implements',\n\t'interface',\n\t'let',\n\t'package',\n\t'private',\n\t'protected',\n\t'public',\n\t'static',\n\t'yield',\n\t'abstract',\n\t'any',\n\t'async',\n\t'await',\n\t'constructor',\n\t'declare',\n\t'from',\n\t'get',\n\t'is',\n\t'module',\n\t'namespace',\n\t'never',\n\t'require',\n\t'set',\n\t'type',\n\t'unknown',\n\t'readonly',\n\t'of',\n\t'asserts',\n\t'infer',\n\t'keyof',\n\t'boolean',\n\t'number',\n\t'string',\n\t'symbol',\n\t'object',\n\t'undefined',\n\t'bigint',\n]);\n","/**\n * Simple represenration for JSON object\n */\nexport type JSONValue = {\n\t[K: string]:\n\t\t| string\n\t\t| number\n\t\t| boolean\n\t\t| JSONValue\n\t\t| (string | number | boolean | JSONValue)[];\n};\n\nexport enum SchemaType {\n\tschemas = 'schemas',\n\tparameters = 'parameters',\n\tresponses = 'responses',\n\trequestBodies = 'requestBodies',\n}\n\nexport enum NonArraySchemaType {\n\tobject = 'object',\n\tstring = 'string',\n\tnumber = 'number',\n\tboolean = 'boolean',\n\tinteger = 'integer',\n\tenum = 'enum',\n\tfile = 'file',\n}\n\nexport enum ArraySchemaType {\n\tarray = 'array',\n}\n\nexport enum SchemaFormatType {\n\tstring = 'string',\n\tnumber = 'number',\n\tboolean = 'boolean',\n\tfile = 'file',\n\tbinary = 'binary',\n\tblob = 'blob',\n}\n\nexport enum ParameterIn {\n\theader = 'header',\n\tbody = 'body',\n\tquery = 'query',\n\tcookie = 'cookie',\n\tpath = 'path',\n\tformData = 'formData',\n}\n\nexport interface ReferenceObject {\n\t$ref: string;\n}\n\nexport interface EnumSchemaObject {\n\tname: string;\n\tenum: (string | number)[];\n}\n\nexport interface SingleTypeSchemaObject {\n\t// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n\ttype: keyof typeof NonArraySchemaType | string;\n\tdescription?: string;\n\tallOf?: SchemaObject[];\n\tanyOf?: SchemaObject[];\n\tdeprecated?: boolean;\n\tenum?: (string | number)[];\n\tformat?: keyof typeof SchemaFormatType;\n\toneOf?: SchemaObject[];\n\tproperties?: Record<string, SchemaObject>;\n\treadonly?: boolean;\n\trequired?: string[] | boolean;\n\tref?: string;\n}\n\nexport interface ArrayTypeSchemaObject {\n\ttype: keyof typeof ArraySchemaType;\n\titems?: SchemaObject;\n\trequired?: boolean;\n\tdescription?: string;\n\tref?: string;\n}\n\nexport type SchemaObject = SingleTypeSchemaObject | ArrayTypeSchemaObject;\n\nexport type ParameterObject = {\n\tname: string;\n\tin: keyof typeof ParameterIn;\n\tschema?: SchemaObject;\n\trequired?: boolean;\n\tdescription?: string;\n\tdeprecated?: boolean;\n\tref?: string;\n};\n\nexport enum MediaTypes {\n\tJSON = 'application/json',\n\tTEXT = 'text',\n\tIMAGE = 'image',\n\tAUDIO = 'audio',\n\tVIDEO = 'video',\n}\n\nexport type MediaTypeObject = {\n\ttype: MediaTypes | keyof typeof MediaTypes;\n\tschema?: SchemaObject;\n};\n\nexport type ResponsesObject = Record<string, MediaTypeObject[]>;\n\nexport type RequestBodyObject = ResponsesObject;\n\nexport enum HttpMethods {\n\tGET = 'get',\n\tPUT = 'put',\n\tPOST = 'post',\n\tDELETE = 'delete',\n\tOPTIONS = 'options',\n\tHEAD = 'head',\n\tPATCH = 'patch',\n\tTRACE = 'trace',\n}\n\nexport type OperationObject = {\n\tmethod: string;\n\tsummary?: string;\n\tdescription?: string;\n\toperationId?: string;\n\texternalDocs?: { url: string; description?: string }[];\n\tparameters?: ParameterObject[];\n\trequestBody?: MediaTypeObject[];\n\tresponses: MediaTypeObject[];\n\tdeprecated?: boolean;\n};\n\nexport type PathObject = {\n\tref?: string;\n\tsummary?: string;\n\tdescription?: string;\n\tparameters?: ParameterObject[];\n} & Partial<Record<HttpMethods, OperationObject>>;\n\nexport type PathsObject = Record<string, OperationObject[]>;\n\nexport type FetchDocRequestInit = {\n\tmethod?: string;\n\tbody?: string | FormData;\n\theaders?: Record<string, string>;\n};\n\nexport enum Adaptors {\n\tfetch = 'fetch',\n\taxios = 'axios',\n}\n\nexport type ProviderInitOptions = {\n\tdocURL: string;\n\toutput: string;\n\tbaseURL?: string;\n\timportClientSource?: string;\n\trequestOptions?: FetchDocRequestInit;\n\tverbose?: boolean;\n\tadaptor?: keyof typeof Adaptors;\n};\n\nexport interface ProviderInitResult {\n\treadonly enums: EnumSchemaObject[];\n\treadonly schemas: Record<string, SchemaObject>;\n\treadonly parameters: Record<string, ParameterObject>;\n\treadonly responses: Record<string, ResponsesObject>;\n\treadonly requestBodies: Record<string, RequestBodyObject>;\n\treadonly apis: PathsObject;\n}\n","/**\n * @file Base class implementation\n * @author wp.l\n * @description Base utility class providing common methods for code generation and API handling\n */\n\nimport { Agent, request } from 'undici';\nimport { typescriptKeywords } from '../constants/keywords.js';\nimport type {\n\tEnumSchemaObject,\n\tFetchDocRequestInit,\n\tReferenceObject,\n\tSchemaObject,\n\tSingleTypeSchemaObject,\n} from '../interface.js';\nimport { MediaTypes } from '../interface.js';\n\n/**\n * Represents success HTTP status codes.\n * Each key is a string representation of a success HTTP status code.\n */\nexport const SuccessHttpStatusCode = {\n\t'200': '200', // OK\n\t'201': '201', // Created\n\t'202': '202', // Accepted\n\t'203': '203', // Non-Authoritative Information\n\t'204': '204', // No Content\n\t'205': '205', // Reset Content\n\t'206': '206', // Partial Content\n\t'207': '207', // Multi_Status\n\t'208': '208', // Already_Reported\n\t'226': '226', // IM Used\n};\n\n/**\n * Base abstract class providing common utility methods.\n */\nexport abstract class Base {\n\tprotected constructor() {\n\t\tif (new.target === Base) {\n\t\t\tthrow new Error('Cannot instantiate abstract class');\n\t\t}\n\t}\n\n\t/**\n\t * Converts a reference string to a meaningful name.\n\t * @param ref - The reference string to process.\n\t * @param [doc] - Optional document reference for context.\n\t * @returns - The processed name.\n\t */\n\tstatic ref2name(ref: string, doc?: any): string {\n\t\tconst paths = ref.replace(/^#/, '').split('/').filter(Boolean);\n\n\t\tif (!doc) {\n\t\t\treturn paths.slice(-1)[0];\n\t\t}\n\n\t\tlet temporary = doc as unknown;\n\t\tlet lastPath = '';\n\t\tfor (const path of paths) {\n\t\t\t// For handling path prefix with ~1\n\t\t\tconst adjustedPath = path.replaceAll('~1', '/');\n\t\t\ttemporary = (temporary as Record<string, any>)[adjustedPath];\n\t\t\tlastPath = adjustedPath;\n\t\t}\n\n\t\tif (!temporary) {\n\t\t\treturn 'unknown';\n\t\t}\n\n\t\treturn (temporary as unknown as { $ref: string }).$ref\n\t\t\t? Base.ref2name((temporary as unknown as { $ref: string }).$ref, doc)\n\t\t\t: lastPath;\n\t}\n\n\t/**\n\t * Converts an API path to a function name.\n\t * @param path - The API endpoint path.\n\t * @param [method] - The HTTP method (e.g., GET, POST).\n\t * @param [operationId] - Unique identifier for the operation.\n\t * @returns - The generated function name.\n\t */\n\tstatic pathToFnName(\n\t\tpath: string,\n\t\tmethod?: string,\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t_operationId: string = ''\n\t) {\n\t\tconst name = Base.normalize(Base.camelCase(Base.normalize(path)));\n\t\tconst suffix = method\n\t\t\t? Base.capitalize(Base.upperCamelCase(`using_${method}`))\n\t\t\t: '';\n\n\t\treturn name + suffix;\n\t}\n\n\t/**\n\t * Normalizes a string by replacing special characters and avoiding TypeScript keywords.\n\t * @param text - Input text to normalize.\n\t * @returns - The normalized string.\n\t */\n\tstatic normalize(text: string) {\n\t\tif (typescriptKeywords.has(text)) {\n\t\t\ttext += '_';\n\t\t}\n\t\treturn text\n\t\t\t.replace(/[/\\-_{}():\\s`,*<>$#.]/gm, '_')\n\t\t\t.replace(/^\\d./gm, '')\n\t\t\t.replaceAll('...', '');\n\t}\n\n\t/**\n\t * Capitalizes the first character of a string.\n\t * @param text - Input string.\n\t * @returns - Capitalized string.\n\t */\n\tstatic capitalize(text: string) {\n\t\ttext = text.trim();\n\t\treturn `${text.charAt(0).toUpperCase()}${text.slice(1)}`;\n\t}\n\n\t/**\n\t * Converts a string to camelCase.\n\t * @param text - Input string.\n\t * @returns - CamelCase string.\n\t */\n\tstatic camelCase(text: string) {\n\t\ttext = text.trim();\n\t\treturn text\n\t\t\t.split('_')\n\t\t\t.filter(Boolean)\n\t\t\t.map((t, index) => (index === 0 ? t : Base.capitalize(t)))\n\t\t\t.join('');\n\t}\n\n\t/**\n\t * Converts a string to UpperCamelCase.\n\t * @param text - Input string.\n\t * @returns - UpperCamelCase string.\n\t */\n\tstatic upperCamelCase(text: string) {\n\t\treturn Base.normalize(text)\n\t\t\t.replaceAll('...', '')\n\t\t\t.split('_')\n\t\t\t.filter(Boolean)\n\t\t\t.map(Base.capitalize)\n\t\t\t.join('');\n\t}\n\n\t/**\n\t * Fetches documentation from a given URL.\n\t * @param url - The URL to fetch the documentation from.\n\t * @param requestInit - Additional request parameters.\n\t * @returns - A promise resolving to the fetched documentation data.\n\t */\n\tstatic async fetchDoc<T = unknown>(\n\t\turl: string,\n\t\trequestInit: FetchDocRequestInit = {}\n\t): Promise<T> {\n\t\tconst agent = new Agent({\n\t\t\tconnect: { rejectUnauthorized: false },\n\t\t});\n\n\t\tconst { body, statusCode } = await request(url, {\n\t\t\tmethod: 'GET',\n\t\t\tdispatcher: agent,\n\t\t\t...requestInit,\n\t\t});\n\n\t\tif (statusCode >= 400) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to fetch OpenAPI documentation from ${url}: HTTP ${statusCode}`\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\treturn body.json() as T;\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to parse JSON response from ${url}: ${error instanceof Error ? error.message : String(error)}`\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Determines the media type from a given media type string.\n\t * @param mediaType - The media type string to evaluate.\n\t * @returns - The matched MediaTypes or null.\n\t */\n\tstatic getMediaType(mediaType: string): MediaTypes | undefined {\n\t\tconst mediaTypeValues = Object.values(MediaTypes) as string[];\n\t\tconst found = mediaTypeValues.find((type) => mediaType.includes(type));\n\t\treturn found as MediaTypes | undefined;\n\t}\n\n\t/**\n\t * Checks if a schema is a valid enum type that isn't boolean.\n\t * @param a - The schema object to evaluate.\n\t * @returns - True if the schema is a valid non-boolean enum.\n\t */\n\tstatic isValidEnumType(a: SchemaObject) {\n\t\treturn a.type !== 'boolean' && !Base.isBooleanEnum(a);\n\t}\n\n\t/**\n\t * Checks if a schema represents a boolean enum.\n\t * @param a - The schema object to evaluate.\n\t * @returns - True if the schema is a boolean enum.\n\t */\n\tstatic isBooleanEnum(a: SchemaObject) {\n\t\treturn (\n\t\t\ta.type === 'boolean' ||\n\t\t\t!!(a as SingleTypeSchemaObject).enum?.some(\n\t\t\t\t(member) => typeof member === 'boolean'\n\t\t\t)\n\t\t);\n\t}\n\n\t/**\n\t * Checks if two enum schemas are identical.\n\t * @param a - First enum schema to compare.\n\t * @param b - Second enum schema to compare.\n\t * @returns - True if the enums are identical.\n\t */\n\tprivate static isSameEnum(a: EnumSchemaObject, b: EnumSchemaObject) {\n\t\treturn (\n\t\t\ta.enum.length === b.enum.length &&\n\t\t\ta.enum.sort().every((v, index) => v === b.enum.sort()[index])\n\t\t);\n\t}\n\n\t/**\n\t * Filters out duplicate enum schemas from an array.\n\t * @param enums - Array of enum schemas to process.\n\t * @returns - Array of unique enum schemas.\n\t */\n\tstatic uniqueEnums(enums: EnumSchemaObject[]): EnumSchemaObject[] {\n\t\tconst enumMap = new Map<string, Set<string | number>>();\n\n\t\tfor (const e of enums) {\n\t\t\tconst existing = enumMap.get(e.name);\n\t\t\tif (existing) {\n\t\t\t\t// Merge enum values with the same name\n\t\t\t\tfor (const value of e.enum) {\n\t\t\t\t\texisting.add(value);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tenumMap.set(e.name, new Set(e.enum));\n\t\t\t}\n\t\t}\n\n\t\t// Convert back to array\n\t\treturn Array.from(enumMap.entries()).map(([name, values]) => ({\n\t\t\tname,\n\t\t\tenum: Array.from(values),\n\t\t}));\n\t}\n\n\t/**\n\t * Finds the first occurrence of a matching enum schema in an array.\n\t * @param a - The enum schema to find.\n\t * @param enums - Array of enum schemas to search.\n\t * @returns - The found schema or undefined.\n\t */\n\tstatic findSameSchema(a: EnumSchemaObject, enums: EnumSchemaObject[]) {\n\t\treturn enums.find((b) => Base.isSameEnum(b, a));\n\t}\n\n\t/**\n\t * Checks if an object is a reference object.\n\t * @param schema - The object to check.\n\t * @returns - True if the object is a reference.\n\t */\n\n\tstatic isRef(schema: unknown): schema is ReferenceObject {\n\t\treturn (\n\t\t\ttypeof schema === 'object' &&\n\t\t\tschema !== null &&\n\t\t\t'$ref' in schema &&\n\t\t\ttypeof (schema as Record<string, unknown>).$ref === 'string'\n\t\t);\n\t}\n}\n","/**\n * @file Base class implementation\n * @author wp.l\n * @description This file defines the `Provider` abstract class, which serves as a base for providers responsible for parsing and processing API documentation.\n */\n\nimport type {\n\tEnumSchemaObject,\n\tFetchDocRequestInit,\n\tOperationObject,\n\tParameterObject,\n\tProviderInitOptions,\n\tProviderInitResult,\n\tRequestBodyObject,\n\tResponsesObject,\n\tSchemaObject,\n} from '../interface.js';\n\n/**\n * Abstract Provider Class.\n *\n * The Provider class is designed to be extended by specific implementations (e.g., OpenAPI 2 provider, OpenAPI 3 provider).\n * It handles the initialization of the provider and the parsing of documentation into structured data.\n *\n * @example\n *\n * ```ts\n * /// Example of how this class might be used by a subclass:\n * class OpenAPIProvider extends Provider {\n * /// Implement the parse method to handle OpenAPI-specific documentation parsing.\n * parse(doc: unknown): ProviderInitResult {\n * /// Implementation details...\n * }\n * }\n *\n * /// Initializing a provider with configuration and documentation data:\n * const initOptions: ProviderInitOptions = {\n * docURL: \"https://example.com/api/swagger.json\",\n * baseURL: \"https://api.example.com\",\n * output: \"./generated\",\n * requestOptions: {\n * headers: { \"Content-Type\": \"application/json\" },\n * },\n * importClientSource: \"generated/client\",\n * };\n *\n * const docData = fetchSwaggerDoc();\n * const provider = new OpenAPIProvider(initOptions, docData);\n * ```\n */\nexport abstract class Provider\n\timplements ProviderInitResult, ProviderInitOptions\n{\n\t/** collection of enum schemas */\n\treadonly enums: EnumSchemaObject[] = [];\n\t/** collection of schemas indexed by name */\n\treadonly schemas: Record<string, SchemaObject> = {};\n\t/** collection of parameters indexed by name */\n\treadonly parameters: Record<string, ParameterObject> = {};\n\t/** collection of API responses indexed by name */\n\treadonly responses: Record<string, ResponsesObject> = {};\n\t/** collection of request bodies indexed by name */\n\treadonly requestBodies: Record<string, RequestBodyObject> = {};\n\t/** collection of API endpoints (operations) indexed by path */\n\treadonly apis: Record<string, OperationObject[]> = {};\n\n\t/** URL for fetching API documentation */\n\treadonly docURL: string;\n\t/** base URL for API endpoints */\n\treadonly baseURL: string;\n\t/** output directory for generated code */\n\treadonly output: string;\n\t/** request options for API documentation fetch */\n\treadonly requestOptions: FetchDocRequestInit;\n\t/** source path for imported client */\n\treadonly importClientSource: string;\n\n\t/**\n\t * Provider Constructor.\n\t * @param {ProviderInitOptions} initOptions - Initial configuration for the provider.\n\t * @param {unknown} doc - Raw API documentation data to be parsed.\n\t */\n\tconstructor(initOptions: ProviderInitOptions, doc: unknown) {\n\t\tthis.docURL = initOptions.docURL;\n\t\tthis.baseURL = initOptions.baseURL ?? '';\n\t\tthis.output = initOptions.output ?? '.';\n\t\tthis.requestOptions = initOptions.requestOptions ?? {};\n\t\tthis.importClientSource = initOptions.importClientSource ?? '';\n\n\t\tconst { enums, schemas, requestBodies, responses, parameters, apis } =\n\t\t\tthis.parse(doc);\n\n\t\tthis.enums = enums;\n\t\tthis.schemas = schemas;\n\t\tthis.responses = responses;\n\t\tthis.parameters = parameters;\n\t\tthis.requestBodies = requestBodies;\n\t\tthis.apis = apis;\n\t}\n\n\t/**\n\t * Abstract Parse Method.\n\t * @abstract\n\t * @param {unknown} doc - Raw API documentation data.\n\t * @returns {ProviderInitResult} - Parsed documentation data.\n\t *\n\t * This method must be implemented by subclasses to parse the raw documentation into structured data.\n\t */\n\tabstract parse(doc: unknown): ProviderInitResult;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */\n/* eslint-disable no-case-declarations */\n\nimport { writeFile } from 'node:fs/promises';\nimport { format } from 'prettier';\nimport type {\n\tBindingElement,\n\tBlock,\n\tNode,\n\tParameterDeclaration,\n\tPropertySignature,\n\tStatement,\n\tTypeNode,\n} from 'typescript';\nimport {\n\taddSyntheticLeadingComment,\n\tcreatePrinter,\n\tNodeFlags,\n\tSyntaxKind,\n\tfactory as t,\n} from 'typescript';\nimport type { Adapter } from '../base/Adaptor.js';\nimport { Base } from '../base/Base.js';\nimport type {\n\tArrayTypeSchemaObject,\n\tMediaTypeObject,\n\tParameterObject,\n\tProviderInitOptions,\n\tProviderInitResult,\n\tSchemaObject,\n\tSingleTypeSchemaObject,\n} from '../interface.js';\nimport {\n\tArraySchemaType,\n\tMediaTypes,\n\tNonArraySchemaType,\n\tParameterIn,\n\tSchemaFormatType,\n} from '../interface.js';\n\n/**\n * Represents a comment object with optional tag and message.\n */\nexport type CommentObject = {\n\ttag?: string;\n\tcomment: string;\n};\n\n/**\n * Array of comment objects to be added to the code.\n */\nexport type Comments = CommentObject[];\n\nexport class Generator {\n\t/**\n\t * Converts an array of TypeScript statements into a formatted string of code.\n\t *\n\t * @param statements - The array of TypeScript statement nodes.\n\t * @returns Formatted code as a string.\n\t * @throws {Error} If no valid statements are provided.\n\t */\n\tstatic toCode(statements: Statement[]): string {\n\t\tif (statements.length === 0) {\n\t\t\treturn '// No api declaration found.';\n\t\t}\n\n\t\tconst sourceFile = t.createSourceFile(\n\t\t\tstatements,\n\t\t\tt.createToken(SyntaxKind.EndOfFileToken),\n\t\t\tNodeFlags.None\n\t\t);\n\n\t\treturn createPrinter().printFile(sourceFile);\n\t}\n\n\tstatic async write(code: string, filepath: string) {\n\t\ttry {\n\t\t\tawait writeFile(filepath, code);\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n\n\t/**\n\t * Converts a path string with parameters into a TypeScript template expression.\n\t * Handles query parameters and path placeholders.\n\t *\n\t * @param path - The base path string containing placeholders.\n\t * @param parameters - Array of parameter objects defining the parameters.\n\t * @param basePath - Optional base path to prepend (default: \"\").\n\t * @returns A TypeScript template expressi\n\t */\n\tstatic toUrlTemplate(\n\t\tpath: string,\n\t\tparameters: ParameterObject[],\n\t\tbasePath = ''\n\t) {\n\t\t// Extract query parameters\n\t\tconst queryParameters = parameters.filter(\n\t\t\t(p) => p.in === ParameterIn.query\n\t\t);\n\n\t\tif (queryParameters.length > 0) {\n\t\t\tconst queryString = queryParameters\n\t\t\t\t.map(\n\t\t\t\t\t(qp, index) =>\n\t\t\t\t\t\t`${index === 0 ? '?' : '&'}${encodeURIComponent(qp.name)}={${Base.camelCase(Base.normalize(qp.name))}}`\n\t\t\t\t)\n\t\t\t\t.join('');\n\t\t\tpath += queryString;\n\t\t}\n\n\t\t// Split the path into segments\n\t\tconst pathSegments = path.replaceAll('{', '${').split('$').filter(Boolean);\n\n\t\t// If path segments only got one item, it means there are no parameters in path. So just return the path literal.\n\t\tif (pathSegments.length === 1) {\n\t\t\treturn t.createNoSubstitutionTemplateLiteral(basePath + path);\n\t\t}\n\n\t\treturn t.createTemplateExpression(\n\t\t\tt.createTemplateHead(basePath + pathSegments[0]),\n\t\t\tpathSegments.slice(1).map((segment, index) => {\n\t\t\t\tconst match = /^{(.+)}(.+)?/gm.exec(segment);\n\t\t\t\tconst isLastSegment = index === pathSegments.length - 2;\n\n\t\t\t\tif (!match) {\n\t\t\t\t\tthrow new Error(`Invalid path segment: ${segment}`);\n\t\t\t\t}\n\n\t\t\t\treturn t.createTemplateSpan(\n\t\t\t\t\tt.createIdentifier(match[1]),\n\t\t\t\t\t!isLastSegment\n\t\t\t\t\t\t? t.createTemplateMiddle(match[2])\n\t\t\t\t\t\t: t.createTemplateTail(match[2] || '')\n\t\t\t\t);\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Adds synthetic comments to a TypeScript AST node.\n\t *\n\t * @param node - The target AST node.\n\t * @param comments - Array of comment objects to add.\n\t */\n\tstatic addComments(node: Node, comments: Comments) {\n\t\tif (!Array.isArray(comments) || comments.filter(Boolean).length === 0)\n\t\t\treturn;\n\n\t\tconst formatComment = (comment: CommentObject): string => {\n\t\t\treturn comment.tag\n\t\t\t\t? ` @${comment.tag} ${comment.comment ?? ''}`\n\t\t\t\t: ` ${comment.comment}`;\n\t\t};\n\n\t\tconst formattedComments =\n\t\t\t'*\\n' + comments.map(formatComment).join('\\n').trim() + '\\n';\n\n\t\taddSyntheticLeadingComment(\n\t\t\tnode,\n\t\t\tSyntaxKind.MultiLineCommentTrivia,\n\t\t\tformattedComments,\n\t\t\ttrue\n\t\t);\n\t}\n\n\t/**\n\t * Checks if a schema represents a binary type.\n\t *\n\t * @param schema - The schema object to check.\n\t * @returns true if the schema is a binary type, false otherwise.\n\t */\n\tstatic isBinarySchema(schema: SchemaObject): boolean {\n\t\tif (schema.type === 'array') {\n\t\t\tconst arraySchema = schema as ArrayTypeSchemaObject;\n\t\t\treturn Generator.isBinarySchema(arraySchema.items!);\n\t\t}\n\n\t\tconst nonArraySchema = schema as SingleTypeSchemaObject;\n\t\treturn (\n\t\t\tnonArraySchema.format === SchemaFormatType.blob ||\n\t\t\tnonArraySchema.format === SchemaFormatType.binary ||\n\t\t\tnonArraySchema.type === SchemaFormatType.file\n\t\t);\n\t}\n\n\tstatic toRequestBodyTypeNode(schema: SchemaObject) {\n\t\treturn t.createParameterDeclaration(\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tt.createIdentifier('req'),\n\t\t\tundefined,\n\t\t\tGenerator.toTypeNode(schema)\n\t\t);\n\t}\n\n\tstatic toTypeNode(schema: SchemaObject): TypeNode {\n\t\tconst { type, ref } = schema;\n\n\t\tif (ref) {\n\t\t\tconst identify = Base.ref2name(ref);\n\t\t\treturn t.createTypeReferenceNode(\n\t\t\t\tt.createIdentifier(\n\t\t\t\t\tidentify === 'unknown' ? identify : Base.upperCamelCase(identify)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tswitch (type) {\n\t\t\tcase ArraySchemaType.array: {\n\t\t\t\tconst { items } = schema as ArrayTypeSchemaObject;\n\t\t\t\treturn t.createArrayTypeNode(Generator.toTypeNode(items!));\n\t\t\t}\n\t\t\tcase NonArraySchemaType.object: {\n\t\t\t\tconst propsCount = Object.keys(schema.properties ?? {}).length;\n\t\t\t\tif (!schema.properties || propsCount === 0) {\n\t\t\t\t\t// Record<string, unknown>\n\t\t\t\t\treturn t.createTypeReferenceNode(t.createIdentifier('Record'), [\n\t\t\t\t\t\tt.createToken(SyntaxKind.StringKeyword),\n\t\t\t\t\t\tt.createToken(SyntaxKind.UnknownKeyword),\n\t\t\t\t\t]);\n\t\t\t\t}\n\n\t\t\t\tconst props = Object.keys(schema.properties);\n\n\t\t\t\treturn t.createTypeLiteralNode(\n\t\t\t\t\tprops.map((propKey) => {\n\t\t\t\t\t\tconst propSchema = schema.properties![propKey];\n\t\t\t\t\t\treturn t.createPropertySignature(\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tt.createStringLiteral(propKey),\n\t\t\t\t\t\t\t// When field is required, a refrence or binary value, don't add question mark.\n\t\t\t\t\t\t\tschema.required || schema.ref || Generator.isBinarySchema(schema)\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: t.createToken(SyntaxKind.QuestionToken),\n\t\t\t\t\t\t\tGenerator.toTypeNode(propSchema)\n\t\t\t\t\t\t);\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase NonArraySchemaType.integer:\n\t\t\tcase NonArraySchemaType.number:\n\t\t\t\tif (schema.enum) {\n\t\t\t\t\treturn t.createUnionTypeNode(\n\t\t\t\t\t\tschema.enum.map((e) =>\n\t\t\t\t\t\t\tt.createLiteralTypeNode(t.createNumericLiteral(e))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn t.createToken(SyntaxKind.NumberKeyword);\n\t\t\t// case NonArraySchemaType.string:\n\t\t\tcase NonArraySchemaType.boolean:\n\t\t\t\treturn t.createToken(SyntaxKind.BooleanKeyword);\n\t\t\tcase NonArraySchemaType.file:\n\t\t\t\treturn t.createTypeReferenceNode(t.createIdentifier('Blob'));\n\t\t\tdefault: {\n\t\t\t\tconst {\n\t\t\t\t\tformat,\n\t\t\t\t\toneOf,\n\t\t\t\t\tallOf,\n\t\t\t\t\tanyOf,\n\t\t\t\t\ttype,\n\t\t\t\t\tenum: enum_,\n\t\t\t\t} = schema as SingleTypeSchemaObject;\n\n\t\t\t\tswitch (format) {\n\t\t\t\t\tcase SchemaFormatType.number:\n\t\t\t\t\t\treturn t.createToken(SyntaxKind.NumberKeyword);\n\t\t\t\t\tcase SchemaFormatType.string:\n\t\t\t\t\t\treturn t.createToken(SyntaxKind.StringKeyword);\n\t\t\t\t\tcase SchemaFormatType.boolean:\n\t\t\t\t\t\treturn t.createToken(SyntaxKind.BooleanKeyword);\n\t\t\t\t\tcase SchemaFormatType.blob:\n\t\t\t\t\tcase SchemaFormatType.binary:\n\t\t\t\t\t\treturn t.createTypeReferenceNode(t.createIdentifier('Blob'));\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\n\t\t\t\tif (enum_) {\n\t\t\t\t\treturn t.createUnionTypeNode(\n\t\t\t\t\t\tenum_.map((e) =>\n\t\t\t\t\t\t\tt.createLiteralTypeNode(t.createStringLiteral(e as string))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (type === NonArraySchemaType.string) {\n\t\t\t\t\treturn t.createToken(SyntaxKind.StringKeyword);\n\t\t\t\t}\n\n\t\t\t\tif (oneOf) {\n\t\t\t\t\treturn t.createUnionTypeNode(\n\t\t\t\t\t\toneOf.map((schema) => Generator.toTypeNode(schema))\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (anyOf) {\n\t\t\t\t\treturn t.createUnionTypeNode(\n\t\t\t\t\t\tanyOf.map((schema) => Generator.toTypeNode(schema))\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (allOf) {\n\t\t\t\t\treturn t.createIntersectionTypeNode(\n\t\t\t\t\t\tallOf.map((schema) => Generator.toTypeNode(schema))\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (type && typeof type === 'string') {\n\t\t\t\t\treturn t.createTypeReferenceNode(\n\t\t\t\t\t\ttype !== 'unknown' && type !== 'null'\n\t\t\t\t\t\t\t? t.createIdentifier(Base.upperCamelCase(type))\n\t\t\t\t\t\t\t: type\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn t.createToken(SyntaxKind.UnknownKeyword);\n\t}\n\n\tstatic toDeclarationNodes(\n\t\tparameters: ParameterObject[]\n\t): ParameterDeclaration[] {\n\t\tconst objectElements: BindingElement[] = [];\n\t\tconst typeObjectElements: PropertySignature[] = [];\n\t\tconst refParameters: ParameterDeclaration[] = [];\n\n\t\tfor (const parameter of parameters) {\n\t\t\tif (parameter.ref) {\n\t\t\t\t// Handle reference parameters as standalone parameters\n\t\t\t\tconst refName = Base.ref2name(parameter.ref);\n\t\t\t\trefParameters.push(\n\t\t\t\t\tt.createParameterDeclaration(\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tt.createIdentifier(Base.camelCase(Base.normalize(refName))),\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tt.createTypeReferenceNode(\n\t\t\t\t\t\t\tt.createIdentifier(Base.upperCamelCase(Base.normalize(refName)))\n\t\t\t\t\t\t),\n\t\t\t\t\t\tundefined\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst { name, schema, required } = parameter;\n\t\t\t\tobjectElements.push(\n\t\t\t\t\tt.createBindingElement(\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tt.createIdentifier(Base.camelCase(Base.normalize(name)))\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\ttypeObjectElements.push(\n\t\t\t\t\tt.createPropertySignature(\n\t\t\t\t\t\t[],\n\t\t\t\t\t\tt.createIdentifier(Base.camelCase(Base.normalize(name))),\n\t\t\t\t\t\trequired ? undefined : t.createToken(SyntaxKind.QuestionToken),\n\t\t\t\t\t\t!schema\n\t\t\t\t\t\t\t? t.createToken(SyntaxKind.UnknownKeyword)\n\t\t\t\t\t\t\t: Generator.toTypeNode(schema)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Build object destructuring parameter for non-ref parameters\n\t\tif (objectElements.length > 0) {\n\t\t\tconst objectParam = t.createParameterDeclaration(\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\tt.createObjectBindingPattern(objectElements),\n\t\t\t\tundefined,\n\t\t\t\tt.createTypeLiteralNode(typeObjectElements),\n\t\t\t\tundefined\n\t\t\t);\n\t\t\treturn [objectParam, ...refParameters];\n\t\t}\n\n\t\treturn refParameters;\n\t}\n\n\tstatic toFormDataStatement(\n\t\tparameters: ParameterObject[],\n\t\trequestBody?: SchemaObject\n\t): Statement[] {\n\t\tconst statements: Statement[] = [];\n\t\tconst fdDeclaration = t.createVariableStatement(\n\t\t\tundefined,\n\t\t\tt.createVariableDeclarationList(\n\t\t\t\t[\n\t\t\t\t\tt.createVariableDeclaration(\n\t\t\t\t\t\tt.createIdentifier('fd'),\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tt.createNewExpression(t.createIdentifier('FormData'), undefined, [])\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t\tNodeFlags.Const\n\t\t\t)\n\t\t);\n\n\t\tstatements.push(fdDeclaration);\n\n\t\tparameters.forEach((parameter) => {\n\t\t\tstatements.push(\n\t\t\t\tt.createExpressionStatement(\n\t\t\t\t\tt.createBinaryExpression(\n\t\t\t\t\t\tt.createIdentifier(parameter.name),\n\t\t\t\t\t\tt.createToken(SyntaxKind.AmpersandAmpersandToken),\n\t\t\t\t\t\tt.createCallExpression(\n\t\t\t\t\t\t\tt.createPropertyAccessExpression(\n\t\t\t\t\t\t\t\tt.createIdentifier('fd'),\n\t\t\t\t\t\t\t\tt.createIdentifier('append')\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tt.createStringLiteral(parameter.name),\n\t\t\t\t\t\t\t\tt.createIdentifier(parameter.name),\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t});\n\n\t\tif (\n\t\t\trequestBody &&\n\t\t\trequestBody.type === 'object' &&\n\t\t\trequestBody.properties &&\n\t\t\tObject.keys(requestBody.properties).length !== 0\n\t\t) {\n\t\t\tObject.keys(requestBody.properties).forEach((key) => {\n\t\t\t\tconst schemaByKey = requestBody.properties![key];\n\t\t\t\tif (\n\t\t\t\t\tschemaByKey.type === ArraySchemaType.array &&\n\t\t\t\t\tGenerator.isBinarySchema(schemaByKey)\n\t\t\t\t) {\n\t\t\t\t\tstatements.push(\n\t\t\t\t\t\tt.createForOfStatement(\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tt.createVariableDeclarationList(\n\t\t\t\t\t\t\t\t[t.createVariableDeclaration('file')],\n\t\t\t\t\t\t\t\tNodeFlags.Const\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tt.createElementAccessExpression(\n\t\t\t\t\t\t\t\tt.createIdentifier('req'),\n\t\t\t\t\t\t\t\tt.createStringLiteral(key)\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tt.createBlock([\n\t\t\t\t\t\t\t\tt.createExpressionStatement(\n\t\t\t\t\t\t\t\t\tt.createCallExpression(\n\t\t\t\t\t\t\t\t\t\tt.createPropertyAccessExpression(\n\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('fd'),\n\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('append')\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t[],\n\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\tt.createStringLiteral(key),\n\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('file'),\n\t\t\t\t\t\t\t\t\t\t\tt.createPropertyAccessExpression(\n\t\t\t\t\t\t\t\t\t\t\t\tt.createAsExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('file'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.createTypeReferenceNode(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('File'),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('name')\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tif (schemaByKey.required) {\n\t\t\t\t\t\tstatements.push(\n\t\t\t\t\t\t\tt.createExpressionStatement(\n\t\t\t\t\t\t\t\tt.createCallExpression(\n\t\t\t\t\t\t\t\t\tt.createPropertyAccessExpression(\n\t\t\t\t\t\t\t\t\t\tt.createIdentifier('fd'),\n\t\t\t\t\t\t\t\t\t\tt.createIdentifier('append')\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\tt.createStringLiteral(key),\n\t\t\t\t\t\t\t\t\t\tschemaByKey.type === 'string'\n\t\t\t\t\t\t\t\t\t\t\t? t.createElementAccessExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('req'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.createStringLiteral(key)\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t: t.createCallExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('String'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createElementAccessExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('req'),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createStringLiteral(key)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstatements.push(\n\t\t\t\t\t\t\tt.createExpressionStatement(\n\t\t\t\t\t\t\t\tt.createBinaryExpression(\n\t\t\t\t\t\t\t\t\tt.createElementAccessExpression(\n\t\t\t\t\t\t\t\t\t\tt.createIdentifier('req'),\n\t\t\t\t\t\t\t\t\t\tt.createStringLiteral(key)\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tt.createToken(SyntaxKind.AmpersandAmpersandToken),\n\t\t\t\t\t\t\t\t\tt.createCallExpression(\n\t\t\t\t\t\t\t\t\t\tt.createPropertyAccessExpression(\n\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('fd'),\n\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('append')\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\tt.createStringLiteral(key),\n\t\t\t\t\t\t\t\t\t\t\tschemaByKey.type === 'string'\n\t\t\t\t\t\t\t\t\t\t\t\t? t.createElementAccessExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('req'),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createStringLiteral(key)\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t: t.createCallExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('String'),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createElementAccessExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('req'),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createStringLiteral(key)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn statements;\n\t}\n\n\tstatic bodyBlock(\n\t\turi: string,\n\t\tmethod: string,\n\t\tparameters: ParameterObject[],\n\t\trequestBody: MediaTypeObject | undefined,\n\t\tresponse: MediaTypeObject | undefined,\n\t\tadapter: Adapter\n\t): Block {\n\t\tconst isFormDataRequest =\n\t\t\trequestBody &&\n\t\t\t['multipart/form-data', 'application/x-www-form-urlencoded'].includes(\n\t\t\t\trequestBody.type\n\t\t\t);\n\n\t\tconst shouldParseResponseToJSON = 'application/json' === response?.type;\n\n\t\t// Ignore one and only blob parameter.\n\t\tconst isRequestBodyBinary =\n\t\t\trequestBody?.schema &&\n\t\t\trequestBody.schema.type === ArraySchemaType.array &&\n\t\t\tGenerator.isBinarySchema(requestBody.schema);\n\n\t\tconst parametersShouldPutInFormData = parameters.filter(\n\t\t\t(p) =>\n\t\t\t\tp.in === ParameterIn.formData ||\n\t\t\t\t(p.schema && Generator.isBinarySchema(p.schema))\n\t\t);\n\n\t\tconst parametersShouldNotPutInFormData = parameters.filter(\n\t\t\t(p) => !parametersShouldPutInFormData.includes(p)\n\t\t);\n\n\t\tconst isRequestBodyContainsBinary =\n\t\t\trequestBody?.schema &&\n\t\t\t'properties' in requestBody.schema &&\n\t\t\tObject.values(requestBody.schema?.properties ?? {}).some((p) =>\n\t\t\t\tGenerator.isBinarySchema(p)\n\t\t\t);\n\n\t\tconst hasBinaryInParameters = parameters.some(\n\t\t\t(p) => p?.schema && Generator.isBinarySchema(p.schema)\n\t\t);\n\n\t\tconst shouldPutParametersOrBodyInFormData =\n\t\t\tisFormDataRequest ||\n\t\t\tisRequestBodyBinary ||\n\t\t\thasBinaryInParameters ||\n\t\t\tisRequestBodyContainsBinary ||\n\t\t\tparametersShouldPutInFormData.length > 0;\n\n\t\treturn t.createBlock([\n\t\t\t...(shouldPutParametersOrBodyInFormData\n\t\t\t\t? Generator.toFormDataStatement(\n\t\t\t\t\t\tparametersShouldPutInFormData,\n\t\t\t\t\t\trequestBody?.schema\n\t\t\t\t\t)\n\t\t\t\t: []),\n\t\t\t...adapter.client(\n\t\t\t\turi,\n\t\t\t\tmethod,\n\t\t\t\tparametersShouldNotPutInFormData,\n\t\t\t\trequestBody,\n\t\t\t\tresponse,\n\t\t\t\tadapter,\n\t\t\t\tshouldPutParametersOrBodyInFormData,\n\t\t\t\tshouldParseResponseToJSON\n\t\t\t),\n\t\t]);\n\t}\n\n\tstatic schemaToStatemets(\n\t\tparsedDoc: ProviderInitResult,\n\t\tadaptor: Adapter,\n\t\toptions: Omit<ProviderInitOptions, 'docURL' | 'output' | 'requestOptions'>\n\t): Statement[] {\n\t\tconst statements = [] as Statement[];\n\t\tconst { apis, schemas = {}, enums } = parsedDoc;\n\n\t\tconst enumNames: string[] = [];\n\n\t\tfor (const enumObject of enums) {\n\t\t\tenumNames.push(Base.upperCamelCase(enumObject.name));\n\t\t\tstatements.push(\n\t\t\t\tt.createEnumDeclaration(\n\t\t\t\t\t[t.createToken(SyntaxKind.ExportKeyword)],\n\t\t\t\t\tt.createIdentifier(Base.upperCamelCase(enumObject.name)),\n\t\t\t\t\tenumObject.enum.map((member) => {\n\t\t\t\t\t\treturn t.createEnumMember(\n\t\t\t\t\t\t\tt.createStringLiteral(\n\t\t\t\t\t\t\t\ttypeof member === 'string' ? member : `${member}_`\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttypeof member === 'string'\n\t\t\t\t\t\t\t\t? t.createStringLiteral(member)\n\t\t\t\t\t\t\t\t: t.createNumericLiteral(member)\n\t\t\t\t\t\t);\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tfor (const schemaKey in schemas) {\n\t\t\tif (\n\t\t\t\tObject.hasOwn(schemas, schemaKey) &&\n\t\t\t\t!enumNames.includes(Base.upperCamelCase(schemaKey))\n\t\t\t) {\n\t\t\t\tconst schema = schemas[schemaKey];\n\t\t\t\tstatements.push(\n\t\t\t\t\tt.createTypeAliasDeclaration(\n\t\t\t\t\t\t[t.createModifier(SyntaxKind.ExportKeyword)],\n\t\t\t\t\t\tt.createIdentifier(Base.upperCamelCase(schemaKey)),\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tGenerator.toTypeNode(schema)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfor (const uri in apis) {\n\t\t\tconst operations = apis[uri];\n\t\t\tfor (const operation of operations) {\n\t\t\t\tconst {\n\t\t\t\t\tmethod,\n\t\t\t\t\toperationId,\n\t\t\t\t\trequestBody = [],\n\t\t\t\t\tresponses = [],\n\t\t\t\t\tsummary,\n\t\t\t\t\tdeprecated,\n\t\t\t\t\tdescription,\n\t\t\t\t} = operation;\n\n\t\t\t\tlet { parameters = [] } = operation;\n\n\t\t\t\tparameters = parameters.filter((p) => p.in !== 'cookie');\n\n\t\t\t\t// Add a default request, with no schema.\n\t\t\t\tif (requestBody.length === 0) {\n\t\t\t\t\trequestBody.push({ type: MediaTypes.JSON });\n\t\t\t\t}\n\n\t\t\t\tconst shouldAddExtraMethodNameSuffix = requestBody.length > 1;\n\n\t\t\t\tfor (const req of requestBody) {\n\t\t\t\t\tconst statement = t.createFunctionDeclaration(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tt.createModifier(SyntaxKind.ExportKeyword),\n\t\t\t\t\t\t\tt.createModifier(SyntaxKind.AsyncKeyword),\n\t\t\t\t\t\t],\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tBase.pathToFnName(uri, method, operationId) +\n\t\t\t\t\t\t\t(shouldAddExtraMethodNameSuffix\n\t\t\t\t\t\t\t\t? Base.capitalize(req.type.split('/')[1])\n\t\t\t\t\t\t\t\t: ''),\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t...(parameters.length > 0\n\t\t\t\t\t\t\t\t? Generator.toDeclarationNodes(parameters)\n\t\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t\t...(req?.schema\n\t\t\t\t\t\t\t\t? [Generator.toRequestBodyTypeNode(req.schema)]\n\t\t\t\t\t\t\t\t: []),\n\t\t\t\t\t\t].filter(Boolean) as ParameterDeclaration[],\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tGenerator.bodyBlock(\n\t\t\t\t\t\t\toptions.baseURL + uri,\n\t\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t\tparameters,\n\t\t\t\t\t\t\treq,\n\t\t\t\t\t\t\tresponses[0],\n\t\t\t\t\t\t\tadaptor\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\n\t\t\t\t\tGenerator.addComments(\n\t\t\t\t\t\tstatement,\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tdescription && {\n\t\t\t\t\t\t\t\tcomment: description,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsummary && {\n\t\t\t\t\t\t\t\tcomment: summary,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdeprecated && {\n\t\t\t\t\t\t\t\ttag: 'deprecated',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t].filter(Boolean) as CommentObject[]\n\t\t\t\t\t);\n\t\t\t\t\tstatements.push(statement);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn statements;\n\t}\n\n\tstatic async prettier(code: string) {\n\t\treturn await format(code, {\n\t\t\tparser: 'typescript',\n\t\t});\n\t}\n\n\tstatic async genCode(\n\t\tschema: ProviderInitResult,\n\t\tinitOptions: ProviderInitOptions,\n\t\tadaptor: Adapter\n\t) {\n\t\tconst { importClientSource } = initOptions;\n\t\tconst statements = Generator.schemaToStatemets(schema, adaptor, {\n\t\t\tbaseURL: initOptions.baseURL ?? '',\n\t\t});\n\t\tlet code = Generator.toCode(statements);\n\n\t\tif (importClientSource) {\n\t\t\tcode = importClientSource + '\\n\\n' + code;\n\t\t}\n\n\t\treturn await Generator.prettier(code);\n\t}\n}\n","/* eslint-disable unicorn/prefer-spread */\n/**\n * File containing the implementation of the AxiosAdapter class.\n * This adapter is responsible for generating code that uses the Axios HTTP client library.\n */\n\nimport type { Statement, TypeReferenceNode } from 'typescript';\nimport { factory as t } from 'typescript';\nimport { Adapter } from '../base/Adaptor.js';\nimport { Base } from '../base/Base.js';\nimport { Generator } from '../generator/index.js';\nimport type { MediaTypeObject, ParameterObject } from '../interface.js';\n\n/**\n * Adapter class implementing support for generating code that makes use of the Axios HTTP client library.\n * This class defines custom behavior and field mappings specific to the Axios client.\n */\nexport class AxiosAdapter extends Adapter {\n\t/**\n\t * Name of the field used to specify the HTTP method in the request configuration.\n\t */\n\treadonly methodFieldName = 'method';\n\n\t/**\n\t * Name of the field used to specify the request body (data) in the request configuration.\n\t */\n\treadonly bodyFieldName = 'data';\n\n\t/**\n\t * Name of the field used to specify the request headers in the request configuration.\n\t */\n\treadonly headersFieldName = 'headers';\n\n\t/**\n\t * Name of the field used to specify the query parameters in the request configuration.\n\t */\n\treadonly queryFieldName = 'params';\n\n\t/**\n\t * The name of the client this adapter is configured for, which is 'axios' in this case.\n\t */\n\treadonly name = 'axios';\n\n\t/**\n\t * Method that should generate and return the client-specific configuration statements.\n\t *\n\t * @returns {Statement[]} An array of TypeScript statements that define the client configuration.\n\t *\n\t * @throws {Error} Indicates that the method is not yet implemented and needs to be filled in.\n\t */\n\tpublic client(\n\t\turi: string,\n\t\tmethod: string,\n\t\tparameters: ParameterObject[],\n\t\trequestBody: MediaTypeObject | undefined,\n\t\tresponse: MediaTypeObject | undefined,\n\t\tadapter: Adapter,\n\t\tshouldUseFormData: boolean\n\t): Statement[] {\n\t\tconst statements: Statement[] = [];\n\n\t\t// Split parameters into header and body parameters\n\t\tconst inBody = parameters.filter((p) => !p.in || p.in === 'body');\n\t\tconst inHeader = parameters.filter((p) => p.in === 'header');\n\n\t\t/**\n\t\t * Creates the literal object expression for fetch options\n\t\t * including method, headers, and body.\n\t\t * @returns - The constructed fetch options object\n\t\t */\n\t\tconst toLiterlExpression = () => {\n\t\t\treturn t.createObjectLiteralExpression(\n\t\t\t\t[\n\t\t\t\t\t// Set the HTTP method\n\t\t\t\t\tt.createPropertyAssignment(\n\t\t\t\t\t\tt.createIdentifier(adapter.methodFieldName),\n\t\t\t\t\t\tt.createStringLiteral(method.toUpperCase())\n\t\t\t\t\t),\n\t\t\t\t]\n\t\t\t\t\t.concat(\n\t\t\t\t\t\t// Add headers if there are any\n\t\t\t\t\t\tinHeader.length > 0\n\t\t\t\t\t\t\t? t.createPropertyAssignment(\n\t\t\t\t\t\t\t\t\tt.createIdentifier(adapter.headersFieldName),\n\t\t\t\t\t\t\t\t\tt.createObjectLiteralExpression(\n\t\t\t\t\t\t\t\t\t\tinHeader.map((p) =>\n\t\t\t\t\t\t\t\t\t\t\tt.createPropertyAssignment(\n\t\t\t\t\t\t\t\t\t\t\t\tt.createStringLiteral(p.name),\n\t\t\t\t\t\t\t\t\t\t\t\tt.createCallExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('encodeURIComponent'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createCallExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('String'),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBase.camelCase(Base.normalize(p.name))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: []\n\t\t\t\t\t)\n\t\t\t\t\t.concat(\n\t\t\t\t\t\tshouldUseFormData || inBody.length > 0 || requestBody?.schema\n\t\t\t\t\t\t\t? t.createPropertyAssignment(\n\t\t\t\t\t\t\t\t\tt.createIdentifier(adapter.bodyFieldName),\n\t\t\t\t\t\t\t\t\tshouldUseFormData\n\t\t\t\t\t\t\t\t\t\t? t.createIdentifier('fd')\n\t\t\t\t\t\t\t\t\t\t: inBody.length > 0 ||\n\t\t\t\t\t\t\t\t\t\t\t\t(requestBody?.schema &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t!Generator.isBinarySchema(requestBody.schema))\n\t\t\t\t\t\t\t\t\t\t\t? t.createIdentifier('req')\n\t\t\t\t\t\t\t\t\t\t\t: t.createIdentifier('req')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: []\n\t\t\t\t\t),\n\t\t\t\ttrue\n\t\t\t);\n\t\t};\n\n\t\t// Construct the fetch call and return statement\n\t\tstatements.push(\n\t\t\tt.createReturnStatement(\n\t\t\t\tt.createCallExpression(\n\t\t\t\t\tt.createIdentifier(adapter.name),\n\t\t\t\t\tresponse?.schema\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\tGenerator.toTypeNode(\n\t\t\t\t\t\t\t\t\tresponse.schema\n\t\t\t\t\t\t\t\t) as unknown as TypeReferenceNode,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\t[Generator.toUrlTemplate(uri, parameters), toLiterlExpression()]\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\n\t\treturn statements;\n\t}\n}\n","/* eslint-disable unicorn/prefer-spread */\n\nimport type { Statement } from 'typescript';\nimport { SyntaxKind, factory as t } from 'typescript';\nimport { Adapter } from '../base/Adaptor.js';\nimport { Base } from '../base/Base.js';\nimport { Generator } from '../generator/index.js';\nimport type { MediaTypeObject, ParameterObject } from '../interface.js';\n\n/**\n * FetchAdapter is an adapter class that generates client-side fetch requests.\n * It handles parameters, headers, and request bodies to construct proper fetch calls.\n */\nexport class FetchAdapter extends Adapter {\n\treadonly methodFieldName = 'method';\n\treadonly bodyFieldName = 'body';\n\treadonly headersFieldName = 'headers';\n\treadonly queryFieldName = '';\n\treadonly name = 'fetch';\n\n\t/**\n\t * Generates client code for making API requests using the Fetch API.\n\t * @param uri - The API endpoint URI\n\t * @param method - The HTTP method (GET, POST, etc.)\n\t * @param parameters - Array of parameters to include in the request\n\t * @param requestBody - The request body media type definition\n\t * @param response - The response media type definition\n\t * @param adapter - The adapter instance\n\t * @param shouldUseFormData - Flag to use FormData for the request body\n\t * @param shouldUseJSONResponse - Flag to use JSON parsing for the response\n\t * @return - An array of generated TypeScript statements\n\t */\n\tpublic client(\n\t\turi: string,\n\t\tmethod: string,\n\t\tparameters: ParameterObject[],\n\t\trequestBody: MediaTypeObject | undefined,\n\t\tresponse: MediaTypeObject | undefined,\n\t\tadapter: Adapter,\n\t\tshouldUseFormData: boolean,\n\t\tshouldUseJSONResponse: boolean\n\t): Statement[] {\n\t\tconst statements: Statement[] = [];\n\n\t\t// Split parameters into header and body parameters\n\t\tconst inBody = parameters.filter((p) => !p.in || p.in === 'body');\n\t\tconst inHeader = parameters.filter((p) => p.in === 'header');\n\n\t\t/**\n\t\t * Creates the literal object expression for fetch options\n\t\t * including method, headers, and body.\n\t\t * @returns - The constructed fetch options object\n\t\t */\n\t\tconst toLiterlExpression = () => {\n\t\t\treturn t.createObjectLiteralExpression(\n\t\t\t\t[\n\t\t\t\t\t// Set the HTTP method\n\t\t\t\t\tt.createPropertyAssignment(\n\t\t\t\t\t\tt.createIdentifier(adapter.methodFieldName),\n\t\t\t\t\t\tt.createStringLiteral(method.toUpperCase())\n\t\t\t\t\t),\n\t\t\t\t]\n\t\t\t\t\t.concat(\n\t\t\t\t\t\t// Add headers if there are any\n\t\t\t\t\t\tinHeader.length > 0\n\t\t\t\t\t\t\t? t.createPropertyAssignment(\n\t\t\t\t\t\t\t\t\tt.createIdentifier(adapter.headersFieldName),\n\t\t\t\t\t\t\t\t\tt.createObjectLiteralExpression(\n\t\t\t\t\t\t\t\t\t\tinHeader.map((p) =>\n\t\t\t\t\t\t\t\t\t\t\tt.createPropertyAssignment(\n\t\t\t\t\t\t\t\t\t\t\t\tt.createStringLiteral(p.name),\n\t\t\t\t\t\t\t\t\t\t\t\tt.createCallExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('encodeURIComponent'),\n\t\t\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createCallExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('String'),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBase.camelCase(Base.normalize(p.name))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: []\n\t\t\t\t\t)\n\t\t\t\t\t.concat(\n\t\t\t\t\t\tshouldUseFormData || inBody.length > 0 || requestBody?.schema\n\t\t\t\t\t\t\t? t.createPropertyAssignment(\n\t\t\t\t\t\t\t\t\tt.createIdentifier(adapter.bodyFieldName),\n\t\t\t\t\t\t\t\t\tshouldUseFormData\n\t\t\t\t\t\t\t\t\t\t? t.createIdentifier('fd')\n\t\t\t\t\t\t\t\t\t\t: inBody.length > 0 ||\n\t\t\t\t\t\t\t\t\t\t\t\t(requestBody?.schema &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t!Generator.isBinarySchema(requestBody.schema))\n\t\t\t\t\t\t\t\t\t\t\t? t.createCallExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.createPropertyAccessExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('JSON'),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('stringify')\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t[],\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trequestBody\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? t.createIdentifier('req')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: t.createObjectLiteralExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tinBody.map((b) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createShorthandPropertyAssignment(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier(b.name)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t: // One File parameter\n\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('req')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: []\n\t\t\t\t\t),\n\t\t\t\ttrue\n\t\t\t);\n\t\t};\n\n\t\t// Construct the fetch call and return statement\n\t\tstatements.push(\n\t\t\tt.createReturnStatement(\n\t\t\t\tshouldUseJSONResponse\n\t\t\t\t\t? // Handle JSON response with proper type checking\n\t\t\t\t\t\tt.createCallExpression(\n\t\t\t\t\t\t\tt.createPropertyAccessExpression(\n\t\t\t\t\t\t\t\tt.createCallExpression(\n\t\t\t\t\t\t\t\t\tt.createIdentifier(adapter.name),\n\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\tGenerator.toUrlTemplate(uri, parameters),\n\t\t\t\t\t\t\t\t\t\ttoLiterlExpression(),\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tt.createIdentifier('then')\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tt.createArrowFunction(\n\t\t\t\t\t\t\t\t\t[t.createModifier(SyntaxKind.AsyncKeyword)],\n\t\t\t\t\t\t\t\t\t[],\n\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\tt.createParameterDeclaration(\n\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('response')\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\tt.createToken(SyntaxKind.EqualsGreaterThanToken),\n\t\t\t\t\t\t\t\t\tresponse?.schema\n\t\t\t\t\t\t\t\t\t\t? t.createAsExpression(\n\t\t\t\t\t\t\t\t\t\t\t\tt.createParenthesizedExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.createAwaitExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createCallExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createPropertyAccessExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('response'),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('json')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\tresponse?.schema\n\t\t\t\t\t\t\t\t\t\t\t\t\t? Generator.toTypeNode(response.schema)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: t.createToken(SyntaxKind.UnknownKeyword)\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t: t.createParenthesizedExpression(\n\t\t\t\t\t\t\t\t\t\t\t\tt.createAwaitExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\tt.createCallExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createPropertyAccessExpression(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('response'),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tt.createIdentifier('json')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t[]\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t)\n\t\t\t\t\t: // Simple fetch call without JSON parsing\n\t\t\t\t\t\tt.createCallExpression(\n\t\t\t\t\t\t\tt.createIdentifier(adapter.name),\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t[Generator.toUrlTemplate(uri, parameters), toLiterlExpression()]\n\t\t\t\t\t\t)\n\t\t\t)\n\t\t);\n\n\t\treturn statements;\n\t}\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\n\nimport type { Adaptors, FetchDocRequestInit } from './interface.js';\n\n/**\n * Adaptor type for HTTP client\n */\nexport type ConfigAdaptor = keyof typeof Adaptors;\n\n/**\n * Shared config interface for CLI and Vite plugin\n */\nexport interface ApicodegenConfig {\n\t/** OpenAPI spec file path or URL (required) */\n\tspec: string;\n\t/** Output file path */\n\toutput: string;\n\t/** HTTP client adaptor (fetch|axios) */\n\tadaptor?: ConfigAdaptor;\n\t/** Base URL for API endpoints */\n\tbaseURL?: string;\n\t/** Custom client import source path */\n\timportClientSource?: string;\n\t/** Enable verbose logging */\n\tverbose?: boolean;\n\t/** Run type check after generation (default: true) */\n\ttypeCheck?: boolean;\n\t/** Watch for file changes */\n\twatch?: boolean;\n\t/** Request options for fetching spec */\n\trequestOptions?: FetchDocRequestInit;\n}\n\n/**\n * Options for loading config\n */\nexport interface LoadConfigOptions {\n\t/** Explicit config file path */\n\tconfigFile?: string;\n\t/** Config file directory (defaults to cwd) */\n\tcwd?: string;\n\t/** CLI overrides */\n\tcliOptions?: Partial<ApicodegenConfig>;\n\t/** Vite plugin options (for name metadata) */\n\tname?: string;\n}\n\n/**\n * Result of config loading\n */\nexport interface ResolvedConfig extends ApicodegenConfig {\n\t/** Config file path if loaded from file */\n\tconfigFilePath?: string;\n\t/** Config name for logging */\n\tname: string;\n}\n\n/**\n * Environment variable mappings\n */\nconst ENV_MAPPINGS: Record<string, keyof ApicodegenConfig> = {\n\tAPICODEGEN_SPEC: 'spec',\n\tAPICODEGEN_OUTPUT: 'output',\n\tAPICODEGEN_BASE_URL: 'baseURL',\n\tAPICODEGEN_ADAPTOR: 'adaptor',\n\tAPICODEGEN_VERBOSE: 'verbose',\n\tAPICODEGEN_WATCH: 'watch',\n\tAPICODEGEN_TYPE_CHECK: 'typeCheck',\n};\n\n/**\n * Load config from environment variables\n */\nfunction loadFromEnv(): Partial<ApicodegenConfig> {\n\tconst config: Partial<ApicodegenConfig> = {};\n\n\tfor (const [envKey, configKey] of Object.entries(ENV_MAPPINGS)) {\n\t\tconst value = process.env[envKey];\n\t\tif (value !== undefined) {\n\t\t\t// Convert string to appropriate type\n\t\t\tswitch (configKey) {\n\t\t\t\tcase 'verbose':\n\t\t\t\tcase 'watch':\n\t\t\t\tcase 'typeCheck':\n\t\t\t\t\tconfig[configKey] = value === 'true' || value === '1';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'adaptor':\n\t\t\t\t\tconfig[configKey] = value as ConfigAdaptor;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tconfig[configKey] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn config;\n}\n\n/**\n * Load config from a file\n */\nasync function loadFromFile(\n\tfilePath: string\n): Promise<Partial<ApicodegenConfig>> {\n\tconst ext = path.extname(filePath).toLowerCase();\n\n\ttry {\n\t\tif (ext === '.json' || ext === '.jsonc') {\n\t\t\tconst content = await fs.readFile(filePath, 'utf-8');\n\t\t\treturn JSON.parse(content);\n\t\t}\n\n\t\tif (ext === '.js' || ext === '.cjs' || ext === '.mjs') {\n\t\t\tconst mod = await import(filePath);\n\t\t\treturn mod.default || mod;\n\t\t}\n\n\t\tif (ext === '.ts') {\n\t\t\t// For .ts files, try to load as JSON first\n\t\t\tconst content = await fs.readFile(filePath, 'utf-8');\n\t\t\t// Try parsing as JSON (may work for JSON-like TS files)\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(content);\n\t\t\t} catch {\n\t\t\t\t// For actual TS config, we'd need ts-node or similar\n\t\t\t\t// For now, fall back to looking for JSON export pattern\n\t\t\t\tconst jsonMatch = content.match(/export\\s+default\\s+(\\{.+\\})/s);\n\t\t\t\tif (jsonMatch) {\n\t\t\t\t\treturn JSON.parse(jsonMatch[1]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Try parsing as JSON for unknown extensions\n\t\tconst content = await fs.readFile(filePath, 'utf-8');\n\t\treturn JSON.parse(content);\n\t} catch (error) {\n\t\tthrow new Error(`Failed to load config from ${filePath}: ${error}`);\n\t}\n}\n\n/**\n * Find config file in project root\n */\nasync function findConfigFile(cwd: string): Promise<string | null> {\n\tconst configFiles = [\n\t\t'apicodegen.config.json',\n\t\t'apicodegen.config.js',\n\t\t'apicodegen.config.mjs',\n\t\t'.apicodegenrc',\n\t\t'.apicodegenrc.json',\n\t\t'.apicodegenrc.js',\n\t\t'.apicodegenrc.mjs',\n\t];\n\n\tfor (const fileName of configFiles) {\n\t\tconst filePath = path.join(cwd, fileName);\n\t\tif (await fs.pathExists(filePath)) {\n\t\t\treturn filePath;\n\t\t}\n\t}\n\n\t// Also check package.json for apicodegen field\n\tconst packageJsonPath = path.join(cwd, 'package.json');\n\tif (await fs.pathExists(packageJsonPath)) {\n\t\ttry {\n\t\t\tconst pkg = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'));\n\t\t\tif (pkg.apicodegen && typeof pkg.apicodegen === 'string') {\n\t\t\t\treturn path.resolve(cwd, pkg.apicodegen);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore package.json parse errors\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * Merge multiple config sources with priority\n * Priority: defaults < env vars < config file < CLI args\n */\nfunction mergeConfigs(\n\tbase: ApicodegenConfig,\n\t...sources: (Partial<ApicodegenConfig> | undefined)[]\n): ApicodegenConfig {\n\tconst result = { ...base };\n\n\tfor (const source of sources) {\n\t\tif (!source) continue;\n\n\t\tfor (const [key, value] of Object.entries(source)) {\n\t\t\t// Only override if value is defined (not undefined)\n\t\t\tif (value !== undefined) {\n\t\t\t\t(result as Record<string, unknown>)[key] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Validate config has required fields\n */\nfunction validateConfig(\n\tconfig: Partial<ApicodegenConfig>\n): config is ApicodegenConfig {\n\tif (!config.spec) {\n\t\tthrow new Error(\n\t\t\t'Missing required field: spec (OpenAPI spec file path or URL)'\n\t\t);\n\t}\n\treturn true;\n}\n\n/**\n * Load and resolve config from multiple sources\n */\nexport async function loadConfig(\n\toptions: LoadConfigOptions = {}\n): Promise<ResolvedConfig> {\n\tconst cwd = options.cwd || process.cwd();\n\tconst cliOptions = options.cliOptions || {};\n\n\t// 1. Load from environment variables\n\tconst envConfig = loadFromEnv();\n\n\t// 2. Load from config file (if specified or found)\n\tlet fileConfig: Partial<ApicodegenConfig> = {};\n\tlet configFilePath: string | undefined;\n\n\tif (options.configFile) {\n\t\tconfigFilePath = path.resolve(cwd, options.configFile);\n\t\tfileConfig = await loadFromFile(configFilePath);\n\t} else {\n\t\tconst foundPath = await findConfigFile(cwd);\n\t\tif (foundPath) {\n\t\t\tconfigFilePath = foundPath;\n\t\t\tfileConfig = await loadFromFile(foundPath);\n\t\t}\n\t}\n\n\t// 3. Check package.json inline config\n\tconst packageJsonPath = path.join(cwd, 'package.json');\n\tlet inlineConfig: Partial<ApicodegenConfig> = {};\n\tif (await fs.pathExists(packageJsonPath)) {\n\t\ttry {\n\t\t\tconst pkg = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'));\n\t\t\tif (pkg.apicodegen && typeof pkg.apicodegen === 'object') {\n\t\t\t\tinlineConfig = pkg.apicodegen as Partial<ApicodegenConfig>;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore\n\t\t}\n\t}\n\n\t// 4. Merge configs with priority\n\tconst merged = mergeConfigs(\n\t\t{ spec: '', output: './output.ts' }, // defaults\n\t\tenvConfig,\n\t\tinlineConfig,\n\t\tfileConfig,\n\t\tcliOptions\n\t);\n\n\t// 5. Validate\n\tvalidateConfig(merged);\n\n\t// 6. Add metadata\n\tconst name = options.name || merged.baseURL || merged.spec;\n\n\treturn {\n\t\t...merged,\n\t\tconfigFilePath,\n\t\tname,\n\t};\n}\n\n/**\n * Create CLI options from config for commander\n */\nexport function configToCLIOptions(\n\tconfig: ApicodegenConfig\n): Record<string, unknown> {\n\tconst options: Record<string, unknown> = {};\n\n\tif (config.spec) options.spec = config.spec;\n\tif (config.output) options.output = config.output;\n\tif (config.adaptor) options.adaptor = config.adaptor;\n\tif (config.baseURL) options.baseURL = config.baseURL;\n\tif (config.verbose) options.verbose = config.verbose;\n\tif (config.watch) options.watch = config.watch;\n\tif (config.importClientSource)\n\t\toptions.importClientSource = config.importClientSource;\n\n\treturn options;\n}\n\n/**\n * Convert resolved config to provider options format\n */\nexport function toProviderOptions(config: ResolvedConfig) {\n\treturn {\n\t\tdocURL: config.spec,\n\t\toutput: config.output,\n\t\tadaptor: config.adaptor,\n\t\tbaseURL: config.baseURL,\n\t\timportClientSource: config.importClientSource,\n\t\tverbose: config.verbose,\n\t\trequestOptions: config.requestOptions,\n\t};\n}\n","/**\n * Error handling utilities for api-codegen\n */\n\n// Error codes\nexport const ErrorCodes = {\n\tSPEC_NOT_FOUND: 'E_SPEC_NOT_FOUND',\n\tSPEC_FETCH_FAILED: 'E_SPEC_FETCH_FAILED',\n\tSPEC_PARSE_FAILED: 'E_SPEC_PARSE_FAILED',\n\tOUTPUT_DIR_MISSING: 'E_OUTPUT_DIR_MISSING',\n\tCONFIG_INVALID: 'E_CONFIG_INVALID',\n\tVALIDATION_FAILED: 'E_VALIDATION_FAILED',\n\tGENERATION_FAILED: 'E_GENERATION_FAILED',\n\tTYPE_CHECK_FAILED: 'E_TYPE_CHECK_FAILED',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/**\n * Error context for ApicodegenError\n */\nexport interface ApicodegenErrorContext {\n\t/** Error code */\n\tcode: ErrorCode;\n\t/** Human readable message */\n\tmessage: string;\n\t/** File/URL related to error */\n\tlocation?: string;\n\t/** Line number if applicable */\n\tline?: number;\n\t/** Column number if applicable */\n\tcolumn?: number;\n\t/** Related schema/path if applicable */\n\tpath?: string;\n\t/** Suggested fixes */\n\tsuggestions?: string[];\n\t/** Original error */\n\tcause?: Error;\n}\n\n/**\n * Custom error class for api-codegen with rich context\n */\nexport class ApicodegenError extends Error {\n\treadonly code: ErrorCode;\n\treadonly location?: string;\n\treadonly line?: number;\n\treadonly column?: number;\n\treadonly path?: string;\n\treadonly suggestions: string[];\n\treadonly cause?: Error;\n\n\tconstructor(context: ApicodegenErrorContext) {\n\t\tsuper(context.message);\n\t\tthis.name = 'ApicodegenError';\n\t\tthis.code = context.code;\n\t\tthis.location = context.location;\n\t\tthis.line = context.line;\n\t\tthis.column = context.column;\n\t\tthis.path = context.path;\n\t\tthis.suggestions = context.suggestions || [];\n\t\tthis.cause = context.cause;\n\n\t\t// Maintains proper stack trace in V8 environments\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ApicodegenError);\n\t\t}\n\t}\n\n\t/**\n\t * Convert error to formatted string for CLI output\n\t */\n\ttoString(verbose = false): string {\n\t\tconst lines: string[] = [];\n\n\t\t// Error header with code\n\t\tlines.push(`\\x1b[1;31mError [${this.code}]\\x1b[0m ${this.message}`);\n\n\t\t// Location\n\t\tif (this.location) {\n\t\t\tlines.push(` \\x1b[36m→ Location:\\x1b[0m ${this.location}`);\n\t\t}\n\n\t\t// Path\n\t\tif (this.path) {\n\t\t\tlines.push(` \\x1b[36m→ Path:\\x1b[0m ${this.path}`);\n\t\t}\n\n\t\t// Line/column\n\t\tif (this.line !== undefined) {\n\t\t\tlet lineInfo = ` \\x1b[36m→ Line:\\x1b[0m ${this.line}`;\n\t\t\tif (this.column !== undefined) {\n\t\t\t\tlineInfo += `, Column: ${this.column}`;\n\t\t\t}\n\t\t\tlines.push(lineInfo);\n\t\t}\n\n\t\t// Suggestions\n\t\tif (this.suggestions.length > 0) {\n\t\t\tfor (const suggestion of this.suggestions) {\n\t\t\t\tlines.push(` \\x1b[32m→ Suggestion:\\x1b[0m ${suggestion}`);\n\t\t\t}\n\t\t}\n\n\t\t// Stack trace in verbose mode\n\t\tif (verbose && this.cause) {\n\t\t\tlines.push(`\\n \\x1b[90mOriginal Error:\\x1b[0m ${this.cause.message}`);\n\t\t\tif (this.stack) {\n\t\t\t\t// Skip first few lines of stack (our error header)\n\t\t\t\tconst stackLines = this.stack.split('\\n').slice(1).join('\\n');\n\t\t\t\tlines.push(`\\x1b[90m${stackLines}\\x1b[0m`);\n\t\t\t}\n\t\t}\n\n\t\treturn lines.join('\\n');\n\t}\n\n\t/**\n\t * Convert to JSON-serializable object\n\t */\n\ttoJSON(): object {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tcode: this.code,\n\t\t\tmessage: this.message,\n\t\t\tlocation: this.location,\n\t\t\tline: this.line,\n\t\t\tcolumn: this.column,\n\t\t\tpath: this.path,\n\t\t\tsuggestions: this.suggestions,\n\t\t\tcause: this.cause?.message,\n\t\t};\n\t}\n}\n\n/**\n * ANSI color codes for terminal output\n */\nexport const Colors = {\n\treset: '\\x1b[0m',\n\tbold: '\\x1b[1m',\n\tred: '\\x1b[31m',\n\tgreen: '\\x1b[32m',\n\tyellow: '\\x1b[33m',\n\tblue: '\\x1b[34m',\n\tcyan: '\\x1b[36m',\n\tgray: '\\x1b[90m',\n\tbrightRed: '\\x1b[91m',\n\tbrightGreen: '\\x1b[92m',\n} as const;\n\n/**\n * Format error for CLI output\n */\nexport function formatError(error: unknown, verbose = false): string {\n\tif (error instanceof ApicodegenError) {\n\t\treturn error.toString(verbose);\n\t}\n\n\tif (error instanceof Error) {\n\t\treturn `${Colors.red}${Colors.bold}Error${Colors.reset}: ${error.message}${verbose && error.stack ? `\\n\\n${Colors.gray}${error.stack}${Colors.reset}` : ''}`;\n\t}\n\n\treturn `${Colors.red}${Colors.bold}Error${Colors.reset}: ${String(error)}`;\n}\n\n/**\n * Print error to console with formatting\n */\nexport function printError(\n\terror: unknown,\n\tverbose = false,\n\tstream: NodeJS.WriteStream = process.stderr\n): void {\n\tstream.write(formatError(error, verbose));\n\tstream.write('\\n');\n}\n\n/**\n * Create error with common patterns\n */\nexport const createErrors = {\n\tspecNotFound(path: string, cause?: Error): ApicodegenError {\n\t\treturn new ApicodegenError({\n\t\t\tcode: ErrorCodes.SPEC_NOT_FOUND,\n\t\t\tmessage: 'OpenAPI spec file not found',\n\t\t\tlocation: path,\n\t\t\tsuggestions: [\n\t\t\t\t\"Check if the file exists using 'ls -la'\",\n\t\t\t\t'Use --spec to provide the correct path',\n\t\t\t\t'For remote specs, ensure the URL is accessible',\n\t\t\t],\n\t\t\tcause,\n\t\t});\n\t},\n\n\tspecFetchFailed(\n\t\turl: string,\n\t\tstatusCode?: number,\n\t\tcause?: Error\n\t): ApicodegenError {\n\t\tconst message = statusCode\n\t\t\t? `Failed to fetch OpenAPI spec (HTTP ${statusCode})`\n\t\t\t: 'Failed to fetch OpenAPI spec from URL';\n\n\t\treturn new ApicodegenError({\n\t\t\tcode: ErrorCodes.SPEC_FETCH_FAILED,\n\t\t\tmessage,\n\t\t\tlocation: url,\n\t\t\tsuggestions: [\n\t\t\t\t'Check if the URL is accessible in a browser',\n\t\t\t\t'Download the spec file locally and use the local path',\n\t\t\t\t'Verify CORS settings if fetching from a different origin',\n\t\t\t],\n\t\t\tcause,\n\t\t});\n\t},\n\n\tspecParseFailed(\n\t\tpath: string,\n\t\tline?: number,\n\t\tcolumn?: number,\n\t\tcause?: Error\n\t): ApicodegenError {\n\t\treturn new ApicodegenError({\n\t\t\tcode: ErrorCodes.SPEC_PARSE_FAILED,\n\t\t\tmessage: 'Failed to parse OpenAPI spec (invalid JSON or YAML)',\n\t\t\tlocation: path,\n\t\t\tline,\n\t\t\tcolumn,\n\t\t\tsuggestions: [\n\t\t\t\t'Validate JSON syntax using jsonlint.com',\n\t\t\t\t'For YAML specs, ensure proper indentation',\n\t\t\t\t'Check for trailing commas or unquoted special characters',\n\t\t\t],\n\t\t\tcause,\n\t\t});\n\t},\n\n\toutputDirMissing(path: string, cause?: Error): ApicodegenError {\n\t\treturn new ApicodegenError({\n\t\t\tcode: ErrorCodes.OUTPUT_DIR_MISSING,\n\t\t\tmessage: 'Output directory does not exist',\n\t\t\tlocation: path,\n\t\t\tsuggestions: [\n\t\t\t\t'Create the directory: mkdir -p $(dirname <output>)',\n\t\t\t\t'Check if the path is correct',\n\t\t\t],\n\t\t\tcause,\n\t\t});\n\t},\n\n\tconfigInvalid(path: string, cause?: Error): ApicodegenError {\n\t\treturn new ApicodegenError({\n\t\t\tcode: ErrorCodes.CONFIG_INVALID,\n\t\t\tmessage: 'Invalid configuration file',\n\t\t\tlocation: path,\n\t\t\tsuggestions: [\n\t\t\t\t'Validate JSON syntax in the config file',\n\t\t\t\t'Check for required fields (spec, output)',\n\t\t\t],\n\t\t\tcause,\n\t\t});\n\t},\n\n\tvalidationFailed(\n\t\tpath: string,\n\t\tdetails: string,\n\t\tcause?: Error\n\t): ApicodegenError {\n\t\treturn new ApicodegenError({\n\t\t\tcode: ErrorCodes.VALIDATION_FAILED,\n\t\t\tmessage: 'OpenAPI spec validation failed',\n\t\t\tlocation: path,\n\t\t\tpath: details,\n\t\t\tsuggestions: [\n\t\t\t\t'Check OpenAPI spec structure at the specified path',\n\t\t\t\t'Ensure all required fields are present',\n\t\t\t\t'Validate using swagger.io editor',\n\t\t\t],\n\t\t\tcause,\n\t\t});\n\t},\n\n\tgenerationFailed(cause?: Error): ApicodegenError {\n\t\treturn new ApicodegenError({\n\t\t\tcode: ErrorCodes.GENERATION_FAILED,\n\t\t\tmessage: 'Code generation failed',\n\t\t\tsuggestions: [\n\t\t\t\t'Check for unsupported OpenAPI features',\n\t\t\t\t'Ensure spec follows OpenAPI 2.0, 3.0, or 3.1 specification',\n\t\t\t\t'Use --verbose for more details',\n\t\t\t],\n\t\t\tcause,\n\t\t});\n\t},\n\n\ttypeCheckFailed(\n\t\tpath: string,\n\t\t_errors: string[],\n\t\tcause?: Error\n\t): ApicodegenError {\n\t\treturn new ApicodegenError({\n\t\t\tcode: ErrorCodes.TYPE_CHECK_FAILED,\n\t\t\tmessage: 'TypeScript type check failed',\n\t\t\tlocation: path,\n\t\t\tsuggestions: [\n\t\t\t\t'Review type errors above',\n\t\t\t\t'Check for schema inconsistencies',\n\t\t\t\t'Update generated types or fix source schema',\n\t\t\t],\n\t\t\tcause,\n\t\t});\n\t},\n\n\tmissingRequiredField(field: string, context?: string): ApicodegenError {\n\t\treturn new ApicodegenError({\n\t\t\tcode: ErrorCodes.VALIDATION_FAILED,\n\t\t\tmessage: `Missing required field: ${field}`,\n\t\t\tpath: context,\n\t\t\tsuggestions: [`Add the '${field}' field to your configuration`],\n\t\t});\n\t},\n};\n\n/**\n * Wrap unknown error in ApicodegenError if needed\n */\nexport function wrapError(\n\terror: unknown,\n\tcontext?: Partial<ApicodegenErrorContext>\n): ApicodegenError {\n\tif (error instanceof ApicodegenError) {\n\t\treturn error;\n\t}\n\n\tif (error instanceof Error) {\n\t\treturn new ApicodegenError({\n\t\t\tcode: context?.code || ErrorCodes.GENERATION_FAILED,\n\t\t\tmessage: context?.message || error.message,\n\t\t\tlocation: context?.location,\n\t\t\tsuggestions: context?.suggestions,\n\t\t\tcause: error,\n\t\t});\n\t}\n\n\treturn new ApicodegenError({\n\t\tcode: context?.code || ErrorCodes.GENERATION_FAILED,\n\t\tmessage: String(error),\n\t\tsuggestions: context?.suggestions,\n\t});\n}\n\n/**\n * Check if error is an ApicodegenError\n */\nexport function isApicodegenError(error: unknown): error is ApicodegenError {\n\treturn error instanceof ApicodegenError;\n}\n","import type { OpenAPIV2 } from 'openapi-types';\nimport {\n\ttype ArrayTypeSchemaObject,\n\tBase,\n\ttype EnumSchemaObject,\n\tHttpMethods,\n\ttype MediaTypeObject,\n\tMediaTypes,\n\tNonArraySchemaType,\n\ttype OperationObject,\n\ttype ParameterIn,\n\ttype ParameterObject,\n\ttype SchemaFormatType,\n\ttype SchemaObject,\n} from '../core/index.js';\n\nexport class V2 {\n\tdoc!: OpenAPIV2.Document;\n\n\tconstructor(doc: OpenAPIV2.Document) {\n\t\tthis.doc = doc;\n\t}\n\n\t/**\n\t * Resolves a path $ref to the actual path object.\n\t */\n\tprivate resolvePathRef($ref: string): OpenAPIV2.PathItemObject | undefined {\n\t\tconst refName = Base.ref2name($ref, this.doc);\n\t\treturn this.doc.paths?.[refName];\n\t}\n\n\t/**\n\t * Is array schema.\n\t */\n\tprivate isOpenAPIArraySchema(schema: OpenAPIV2.SchemaObject): boolean {\n\t\treturn typeof schema === 'object' && schema.type === 'array';\n\t}\n\n\t/**\n\t * OpenAPI schema to base schema.\n\t */\n\tprivate getSchemaByRef(\n\t\tschema: OpenAPIV2.SchemaObject | OpenAPIV2.ReferenceObject,\n\t\treserveRef = false,\n\t\tenums: EnumSchemaObject[] = [],\n\t\tupLevelSchemaKey = ''\n\t): SchemaObject {\n\t\tlet refName = '';\n\t\tif (Base.isRef(schema)) {\n\t\t\trefName = Base.upperCamelCase(Base.ref2name(schema.$ref));\n\t\t\tif (reserveRef) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: upLevelSchemaKey + refName,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!this.doc.definitions) {\n\t\t\t\tthis.doc.definitions = {};\n\t\t\t}\n\n\t\t\tschema = this.doc.definitions[Base.ref2name(schema.$ref, this.doc)];\n\t\t}\n\n\t\treturn this.toBaseSchema(schema, enums, '', upLevelSchemaKey + refName);\n\t}\n\n\t/**\n\t * Transform all OpenAPI schema to Base Schema\n\t */\n\tprivate toBaseSchema(\n\t\tschema: OpenAPIV2.SchemaObject | OpenAPIV2.ReferenceObject | undefined,\n\t\tenums: EnumSchemaObject[] = [],\n\t\tschemaKey = '',\n\t\tupLevelSchemaKey = ''\n\t): SchemaObject {\n\t\tif (!schema) {\n\t\t\treturn {\n\t\t\t\ttype: 'unknown',\n\t\t\t};\n\t\t}\n\n\t\tif (Base.isRef(schema)) {\n\t\t\treturn this.getSchemaByRef(schema, true);\n\t\t}\n\n\t\tif (this.isOpenAPIArraySchema(schema)) {\n\t\t\tconst { type, description, items, required } = schema;\n\n\t\t\treturn {\n\t\t\t\ttype: type as string,\n\t\t\t\trequired: !!required,\n\t\t\t\tdescription,\n\t\t\t\titems: this.toBaseSchema(items, enums, schemaKey, upLevelSchemaKey),\n\t\t\t} as ArrayTypeSchemaObject;\n\t\t} else {\n\t\t\tconst {\n\t\t\t\trequired = [],\n\t\t\t\tallOf,\n\t\t\t\tanyOf,\n\t\t\t\tdescription,\n\t\t\t\tenum: enum_,\n\t\t\t\tformat,\n\t\t\t\toneOf,\n\t\t\t\tproperties = {},\n\t\t\t} = schema;\n\t\t\tlet { type } = schema;\n\n\t\t\tif (enum_ && type !== 'boolean') {\n\t\t\t\tconst name =\n\t\t\t\t\tBase.upperCamelCase(Base.normalize(upLevelSchemaKey)) +\n\t\t\t\t\tBase.upperCamelCase(Base.normalize(schemaKey));\n\n\t\t\t\tconst enumObject = {\n\t\t\t\t\tname,\n\t\t\t\t\tenum: [...new Set(enum_ as (string | number)[])],\n\t\t\t\t};\n\n\t\t\t\tconst sameObject = Base.findSameSchema(enumObject, enums);\n\n\t\t\t\tif (\n\t\t\t\t\t!sameObject &&\n\t\t\t\t\tBase.isValidEnumType(schema as unknown as SchemaObject)\n\t\t\t\t) {\n\t\t\t\t\tenums.push(enumObject);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\ttype: sameObject\n\t\t\t\t\t\t? sameObject.name\n\t\t\t\t\t\t: Base.isBooleanEnum(schema as unknown as SchemaObject)\n\t\t\t\t\t\t\t? 'boolean'\n\t\t\t\t\t\t\t: enumObject.name,\n\t\t\t\t\trequired,\n\t\t\t\t\tdescription,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (type === undefined && Object.keys(properties).length > 0) {\n\t\t\t\ttype = NonArraySchemaType.object;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: type as unknown as NonArraySchemaType,\n\t\t\t\trequired,\n\t\t\t\tdescription,\n\t\t\t\tenum: enum_,\n\t\t\t\tformat: format as unknown as SchemaFormatType,\n\t\t\t\tallOf: allOf?.map((s) =>\n\t\t\t\t\tBase.isRef(s)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...s,\n\t\t\t\t\t\t\t\tref: s.$ref,\n\t\t\t\t\t\t\t\ttype: Base.capitalize(Base.ref2name(s.$ref, this.doc)),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: this.toBaseSchema(s as OpenAPIV2.SchemaObject, enums)\n\t\t\t\t),\n\t\t\t\tanyOf: anyOf?.map((s) =>\n\t\t\t\t\tBase.isRef(s)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...s,\n\t\t\t\t\t\t\t\tref: s.$ref,\n\t\t\t\t\t\t\t\ttype: Base.capitalize(Base.ref2name(s.$ref, this.doc)),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: this.toBaseSchema(s as OpenAPIV2.SchemaObject, enums)\n\t\t\t\t),\n\t\t\t\toneOf: oneOf?.map((s) =>\n\t\t\t\t\tBase.isRef(s)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...s,\n\t\t\t\t\t\t\t\tref: s.$ref,\n\t\t\t\t\t\t\t\ttype: Base.capitalize(Base.ref2name(s.$ref, this.doc)),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: this.toBaseSchema(s as OpenAPIV2.SchemaObject, enums)\n\t\t\t\t),\n\t\t\t\tproperties: Object.keys(properties).reduce((acc, p) => {\n\t\t\t\t\tconst propSchema = properties[p];\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t[p]: Base.isRef(propSchema)\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\ttype: Base.capitalize(\n\t\t\t\t\t\t\t\t\t\tBase.ref2name(propSchema.$ref, this.doc)\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: this.toBaseSchema(propSchema, enums, p, upLevelSchemaKey),\n\t\t\t\t\t};\n\t\t\t\t}, {}),\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * OpenAPI parameter to base parameter.\n\t */\n\tprivate getParameterByRef(\n\t\tparameter: OpenAPIV2.ParameterObject | OpenAPIV2.ReferenceObject,\n\t\tenums: EnumSchemaObject[] = [],\n\t\tupLevelSchemaKey = ''\n\t): ParameterObject {\n\t\tif (Base.isRef(parameter)) {\n\t\t\tconst refName = Base.ref2name(parameter.$ref, this.doc);\n\t\t\tconst resolved = this.doc.parameters?.[refName];\n\t\t\tif (!resolved) {\n\t\t\t\tthrow new Error(`Parameter reference not found: ${parameter.$ref}`);\n\t\t\t}\n\t\t\tparameter = resolved;\n\t\t}\n\n\t\tconst p = parameter as OpenAPIV2.ParameterObject;\n\t\tconst {\n\t\t\tname,\n\t\t\trequired,\n\t\t\tdescription,\n\t\t\ttype,\n\t\t\titems,\n\t\t\tenum: enum_,\n\t\t\tproperties,\n\t\t\tschema,\n\t\t} = p;\n\n\t\tif (enum_) {\n\t\t\tconst type =\n\t\t\t\tBase.upperCamelCase(Base.normalize(upLevelSchemaKey)) +\n\t\t\t\tBase.upperCamelCase(Base.normalize(name));\n\n\t\t\tconst enumSchema = {\n\t\t\t\tname: type,\n\t\t\t\tenum: [...new Set(enum_ as (string | number)[])],\n\t\t\t};\n\n\t\t\tconst sameEnum = Base.findSameSchema(enumSchema, enums);\n\n\t\t\tif (\n\t\t\t\t!sameEnum &&\n\t\t\t\tBase.isValidEnumType({ type, enum: enum_ } as SchemaObject)\n\t\t\t) {\n\t\t\t\tenums.push(enumSchema);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\trequired,\n\t\t\t\tdescription,\n\t\t\t\tin: p.in as ParameterIn,\n\t\t\t\tschema: {\n\t\t\t\t\ttype: sameEnum?.name ?? type,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (items) {\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\trequired,\n\t\t\t\tdescription,\n\t\t\t\tin: p.in as ParameterIn,\n\t\t\t\tschema: {\n\t\t\t\t\ttype: type as string,\n\t\t\t\t\titems: items as OpenAPIV2.SchemaObject | undefined,\n\t\t\t\t} as ArrayTypeSchemaObject,\n\t\t\t};\n\t\t}\n\n\t\tif (schema && Base.isRef(schema)) {\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\trequired,\n\t\t\t\tdescription,\n\t\t\t\tin: p.in as ParameterIn,\n\t\t\t\tschema: {\n\t\t\t\t\ttype: Base.capitalize(Base.ref2name(schema.$ref)),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tname,\n\t\t\trequired,\n\t\t\tdescription,\n\t\t\tin: p.in as ParameterIn,\n\t\t\tschema: {\n\t\t\t\ttype: type as string,\n\t\t\t\tproperties,\n\t\t\t} as SchemaObject,\n\t\t};\n\t}\n\n\t/**\n\t * OpenAPI schema to base response\n\t */\n\tprivate getResponseByRef(\n\t\tschema: OpenAPIV2.ResponseObject | OpenAPIV2.ReferenceObject\n\t): MediaTypeObject[] {\n\t\tif (Base.isRef(schema)) {\n\t\t\tschema = this.doc.responses![Base.ref2name(schema.$ref, this.doc)]!;\n\t\t}\n\n\t\tconst { schema: responseSchema } = schema;\n\n\t\treturn [\n\t\t\t{\n\t\t\t\ttype: MediaTypes.JSON,\n\t\t\t\tschema: responseSchema && this.getSchemaByRef(responseSchema, true),\n\t\t\t},\n\t\t];\n\t}\n\n\tpublic init() {\n\t\tconst { definitions = {}, responses = {}, paths = {} } = this.doc;\n\t\tconst enums: EnumSchemaObject[] = [];\n\n\t\tconst definitions_ = Object.keys(definitions).reduce((acc, key) => {\n\t\t\tconst schema = definitions[key];\n\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[key]: this.getSchemaByRef(schema, false, enums, key),\n\t\t\t};\n\t\t}, {});\n\n\t\tconst responses_ = Object.keys(responses).reduce((acc, key) => {\n\t\t\tconst response = responses[key];\n\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[key]: this.getResponseByRef(response),\n\t\t\t};\n\t\t}, {});\n\n\t\tconst apis = Object.keys(paths).reduce((acc, path) => {\n\t\t\tlet pathObject = paths[path] ?? {};\n\n\t\t\t// Handle path-level $ref\n\t\t\tif (pathObject.$ref) {\n\t\t\t\tconst resolved = this.resolvePathRef(pathObject.$ref);\n\t\t\t\tif (resolved) {\n\t\t\t\t\tpathObject = resolved;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst { parameters = [] } = pathObject;\n\t\t\tconst methodApis: OperationObject[] = [];\n\n\t\t\tObject.values(HttpMethods).forEach((method) => {\n\t\t\t\tconst methodObject = pathObject[method as OpenAPIV2.HttpMethods];\n\n\t\t\t\tif (methodObject) {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tdeprecated,\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tsummary: summary_,\n\t\t\t\t\t\tdescription: description_,\n\t\t\t\t\t\tresponses = {},\n\t\t\t\t\t} = methodObject;\n\t\t\t\t\tconst { parameters: parameters_ = [] } = methodObject;\n\t\t\t\t\tconst baseParameters = [...parameters, ...parameters_].map(\n\t\t\t\t\t\t(parameter) => this.getParameterByRef(parameter, enums)\n\t\t\t\t\t);\n\t\t\t\t\tconst uniqueParameterName = [\n\t\t\t\t\t\t...new Set(baseParameters.map((p) => p.name)),\n\t\t\t\t\t];\n\n\t\t\t\t\tif (Object.keys(responses).length === 0) {\n\t\t\t\t\t\tObject.assign(responses, {\n\t\t\t\t\t\t\t200: {\n\t\t\t\t\t\t\t\tdescription: 'Successful response',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst inBody = baseParameters.filter(\n\t\t\t\t\t\t(p) => p.in === 'body' || p.in === 'formData'\n\t\t\t\t\t);\n\n\t\t\t\t\tconst notInBody = baseParameters.filter(\n\t\t\t\t\t\t(p) => p.in !== 'body' && p.in !== 'formData'\n\t\t\t\t\t);\n\n\t\t\t\t\tconst httpCodes = Object.keys(responses);\n\t\t\t\t\tfor (const code of httpCodes) {\n\t\t\t\t\t\tif (code in responses) {\n\t\t\t\t\t\t\tconst response = responses[code]!;\n\t\t\t\t\t\t\tconst responseSchema = this.getResponseByRef(response);\n\n\t\t\t\t\t\t\tconst inBodyOnlyHasBody =\n\t\t\t\t\t\t\t\tinBody &&\n\t\t\t\t\t\t\t\tinBody.length === 1 &&\n\t\t\t\t\t\t\t\tinBody[0].in === 'body' &&\n\t\t\t\t\t\t\t\tinBody[0].name === 'body';\n\n\t\t\t\t\t\t\tmethodApis.push({\n\t\t\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\tsummary: summary_,\n\t\t\t\t\t\t\t\tdeprecated: deprecated,\n\t\t\t\t\t\t\t\tdescription: description_,\n\t\t\t\t\t\t\t\tparameters: uniqueParameterName\n\t\t\t\t\t\t\t\t\t.map((name) => notInBody.find((p) => p.name === name)!)\n\t\t\t\t\t\t\t\t\t.filter(Boolean),\n\t\t\t\t\t\t\t\tresponses: responseSchema,\n\t\t\t\t\t\t\t\trequestBody:\n\t\t\t\t\t\t\t\t\tinBody.length > 0\n\t\t\t\t\t\t\t\t\t\t? inBodyOnlyHasBody\n\t\t\t\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: MediaTypes.JSON,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tschema: inBody[0].schema,\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: MediaTypes.JSON,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: NonArraySchemaType.object,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tproperties: inBody.reduce<\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tRecord<string, SchemaObject>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>((a, p) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t...a,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[p.name]: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: p.schema?.type ?? 'unknown',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trequired: p.schema?.required,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// @ts-expect-error items can be undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\titems: p.schema?.items,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdescription: p.schema?.description,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t} as SchemaObject,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}, {}),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[path]: methodApis,\n\t\t\t};\n\t\t}, {});\n\n\t\treturn {\n\t\t\tenums: Base.uniqueEnums(enums),\n\t\t\tschemas: definitions_,\n\t\t\tresponses: responses_,\n\t\t\tparameters: {},\n\t\t\trequestBodies: {},\n\t\t\tapis,\n\t\t};\n\t}\n}\n","import type { OpenAPIV3 } from 'openapi-types';\nimport type {\n\tEnumSchemaObject,\n\tMediaTypeObject,\n\tMediaTypes,\n\tOperationObject,\n\tParameterIn,\n\tParameterObject,\n\tSchemaFormatType,\n\tSchemaObject,\n} from '../core/index.js';\nimport { Base, HttpMethods, NonArraySchemaType } from '../core/index.js';\n\nexport class V3 {\n\tdoc!: OpenAPIV3.Document;\n\n\tconstructor(doc: OpenAPIV3.Document) {\n\t\tthis.doc = doc;\n\t}\n\n\t/**\n\t * Resolves a path $ref to the actual path object.\n\t */\n\tprivate resolvePathRef($ref: string): OpenAPIV3.PathItemObject | undefined {\n\t\tconst refName = Base.ref2name($ref, this.doc);\n\t\treturn this.doc.paths?.[refName];\n\t}\n\n\t/**\n\t * Is array schema.\n\t */\n\tprivate isOpenAPIArraySchema(\n\t\tschema: OpenAPIV3.SchemaObject\n\t): schema is OpenAPIV3.ArraySchemaObject {\n\t\treturn typeof schema === 'object' && schema.type === 'array';\n\t}\n\n\t/**\n\t * OpenAPI schema to base schema.\n\t */\n\tprivate getSchemaByRef(\n\t\tschema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject,\n\t\treserveRef = false,\n\t\tenums: EnumSchemaObject[] = [],\n\t\tupLevelSchemaKey = ''\n\t): SchemaObject {\n\t\tlet refName = '';\n\t\tif (Base.isRef(schema)) {\n\t\t\trefName = Base.capitalize(Base.ref2name(schema.$ref));\n\t\t\tif (reserveRef) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: upLevelSchemaKey + refName,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst resolvedSchema =\n\t\t\t\tthis.doc.components?.schemas?.[Base.ref2name(schema.$ref, this.doc)];\n\t\t\tif (!resolvedSchema) {\n\t\t\t\treturn { type: 'unknown' };\n\t\t\t}\n\t\t\tschema = resolvedSchema as OpenAPIV3.SchemaObject;\n\t\t}\n\n\t\treturn this.toBaseSchema(schema, enums, '', upLevelSchemaKey + refName);\n\t}\n\n\t/**\n\t * OpenAPI parameter to base parameter.\n\t */\n\tprivate getParameterByRef(\n\t\tschema: OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject,\n\t\tenums: EnumSchemaObject[] = [],\n\t\tupLevelSchemaKey = ''\n\t): ParameterObject {\n\t\tif (Base.isRef(schema)) {\n\t\t\tconst resolvedSchema =\n\t\t\t\tthis.doc.components?.parameters?.[Base.ref2name(schema.$ref, this.doc)];\n\t\t\tif (!resolvedSchema) {\n\t\t\t\treturn {\n\t\t\t\t\tname: 'unknown',\n\t\t\t\t\tin: 'query' as ParameterIn,\n\t\t\t\t};\n\t\t\t}\n\t\t\tschema = resolvedSchema as OpenAPIV3.ParameterObject;\n\t\t}\n\n\t\tconst {\n\t\t\tname,\n\t\t\trequired,\n\t\t\tdeprecated,\n\t\t\tdescription,\n\t\t\tschema: parameterSchema,\n\t\t} = schema;\n\n\t\tif (\n\t\t\tparameterSchema &&\n\t\t\t!Base.isRef(parameterSchema) &&\n\t\t\tparameterSchema.enum\n\t\t) {\n\t\t\tconst type =\n\t\t\t\tBase.upperCamelCase(Base.normalize(upLevelSchemaKey)) +\n\t\t\t\tBase.upperCamelCase(Base.normalize(name));\n\n\t\t\tconst enumSchema = {\n\t\t\t\tname: type,\n\t\t\t\tenum: [...new Set(parameterSchema.enum as (string | number)[])],\n\t\t\t};\n\n\t\t\tconst sameEnum = Base.findSameSchema(enumSchema, enums);\n\n\t\t\tif (\n\t\t\t\t!sameEnum &&\n\t\t\t\tBase.isValidEnumType(parameterSchema as unknown as SchemaObject)\n\t\t\t) {\n\t\t\t\tenums.push(enumSchema);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\trequired,\n\t\t\t\tdescription,\n\t\t\t\tdeprecated,\n\t\t\t\tin: schema.in as ParameterIn,\n\t\t\t\tschema: {\n\t\t\t\t\ttype: sameEnum?.name ?? type,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tname,\n\t\t\trequired,\n\t\t\tdescription,\n\t\t\tdeprecated,\n\t\t\tin: schema.in as ParameterIn,\n\t\t\tschema:\n\t\t\t\tschema.schema &&\n\t\t\t\tthis.getSchemaByRef(\n\t\t\t\t\tschema.schema,\n\t\t\t\t\tfalse,\n\t\t\t\t\tenums,\n\t\t\t\t\tupLevelSchemaKey + Base.capitalize(name)\n\t\t\t\t),\n\t\t};\n\t}\n\n\t/**\n\t * OpenAPI schema to base response\n\t */\n\tprivate getResponseByRef(\n\t\tschema: OpenAPIV3.ResponseObject | OpenAPIV3.ReferenceObject\n\t): MediaTypeObject[] {\n\t\tif (Base.isRef(schema)) {\n\t\t\tconst resolvedSchema =\n\t\t\t\tthis.doc.components?.responses?.[Base.ref2name(schema.$ref, this.doc)];\n\t\t\tif (!resolvedSchema) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tschema = resolvedSchema as OpenAPIV3.ResponseObject;\n\t\t}\n\n\t\tconst { content = {} } = schema;\n\n\t\treturn Object.keys(content).map((c) => ({\n\t\t\ttype: c as MediaTypes,\n\t\t\tschema: content[c].schema && this.getSchemaByRef(content[c].schema, true),\n\t\t}));\n\t}\n\n\t/**\n\t * OpenAPI schema to requestBody.\n\t */\n\tprivate getRequestBodyByRef(\n\t\tschema: OpenAPIV3.RequestBodyObject | OpenAPIV3.ReferenceObject,\n\t\tenums: EnumSchemaObject[] = []\n\t): MediaTypeObject[] {\n\t\tif (Base.isRef(schema)) {\n\t\t\tconst resolvedSchema =\n\t\t\t\tthis.doc.components?.requestBodies?.[\n\t\t\t\t\tBase.ref2name(schema.$ref, this.doc)\n\t\t\t\t];\n\t\t\tif (!resolvedSchema) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tschema = resolvedSchema as OpenAPIV3.RequestBodyObject;\n\t\t}\n\n\t\tconst { content = {} } = schema;\n\n\t\treturn Object.keys(content).map((c) => ({\n\t\t\ttype: c as MediaTypes,\n\t\t\tschema:\n\t\t\t\tcontent[c].schema &&\n\t\t\t\tthis.getSchemaByRef(content[c].schema, false, enums),\n\t\t}));\n\t}\n\n\t/**\n\t * Transform all OpenAPI schema to Base Schema\n\t */\n\tprivate toBaseSchema(\n\t\tschema: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject | undefined,\n\t\tenums: EnumSchemaObject[] = [],\n\t\tschemaKey = '',\n\t\tupLevelSchemaKey = ''\n\t): SchemaObject {\n\t\tif (!schema) {\n\t\t\treturn {\n\t\t\t\ttype: 'unknown',\n\t\t\t};\n\t\t}\n\n\t\tif (Base.isRef(schema)) {\n\t\t\treturn this.getSchemaByRef(schema, true);\n\t\t}\n\n\t\tif (this.isOpenAPIArraySchema(schema)) {\n\t\t\tconst { type, description, items, required } = schema;\n\n\t\t\treturn {\n\t\t\t\ttype,\n\t\t\t\trequired: !!required,\n\t\t\t\tdescription,\n\t\t\t\titems: this.toBaseSchema(items, enums, schemaKey, upLevelSchemaKey),\n\t\t\t};\n\t\t} else {\n\t\t\tconst {\n\t\t\t\trequired = [],\n\t\t\t\tallOf,\n\t\t\t\tanyOf,\n\t\t\t\tdescription,\n\t\t\t\tdeprecated,\n\t\t\t\tenum: enum_,\n\t\t\t\tformat,\n\t\t\t\toneOf,\n\t\t\t\tproperties = {},\n\t\t\t} = schema;\n\t\t\tlet { type } = schema;\n\n\t\t\tif (enum_ && type !== 'boolean') {\n\t\t\t\tconst name =\n\t\t\t\t\tBase.upperCamelCase(Base.normalize(upLevelSchemaKey)) +\n\t\t\t\t\tBase.upperCamelCase(Base.normalize(schemaKey));\n\n\t\t\t\tconst enumObject = {\n\t\t\t\t\tname,\n\t\t\t\t\tenum: [...new Set(enum_ as (string | number)[])],\n\t\t\t\t};\n\n\t\t\t\tconst sameObject = Base.findSameSchema(enumObject, enums);\n\n\t\t\t\tif (\n\t\t\t\t\t!sameObject &&\n\t\t\t\t\tBase.isValidEnumType(schema as unknown as SchemaObject)\n\t\t\t\t) {\n\t\t\t\t\tenums.push(enumObject);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\ttype: sameObject\n\t\t\t\t\t\t? sameObject.name\n\t\t\t\t\t\t: Base.isBooleanEnum(schema as unknown as SchemaObject)\n\t\t\t\t\t\t\t? 'boolean'\n\t\t\t\t\t\t\t: enumObject.name,\n\t\t\t\t\trequired,\n\t\t\t\t\tdescription,\n\t\t\t\t\tdeprecated,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (type === undefined && Object.keys(properties).length > 0) {\n\t\t\t\ttype = NonArraySchemaType.object;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: type as unknown as NonArraySchemaType,\n\t\t\t\trequired,\n\t\t\t\tdescription,\n\t\t\t\tdeprecated,\n\t\t\t\tenum: enum_,\n\t\t\t\tformat: format as unknown as SchemaFormatType,\n\t\t\t\tallOf: allOf?.map((s) =>\n\t\t\t\t\tBase.isRef(s)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...s,\n\t\t\t\t\t\t\t\tref: s.$ref,\n\t\t\t\t\t\t\t\ttype: Base.capitalize(Base.ref2name(s.$ref, this.doc)),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: this.toBaseSchema(s, enums)\n\t\t\t\t),\n\t\t\t\tanyOf: anyOf?.map((s) =>\n\t\t\t\t\tBase.isRef(s)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...s,\n\t\t\t\t\t\t\t\tref: s.$ref,\n\t\t\t\t\t\t\t\ttype: Base.capitalize(Base.ref2name(s.$ref, this.doc)),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: this.toBaseSchema(s, enums)\n\t\t\t\t),\n\t\t\t\toneOf: oneOf?.map((s) =>\n\t\t\t\t\tBase.isRef(s)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...s,\n\t\t\t\t\t\t\t\tref: s.$ref,\n\t\t\t\t\t\t\t\ttype: Base.capitalize(Base.ref2name(s.$ref, this.doc)),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: this.toBaseSchema(s, enums)\n\t\t\t\t),\n\t\t\t\tproperties: Object.keys(properties).reduce((acc, p) => {\n\t\t\t\t\tconst propSchema = properties[p];\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t[p]: Base.isRef(propSchema)\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\ttype: Base.capitalize(\n\t\t\t\t\t\t\t\t\t\tBase.ref2name(propSchema.$ref, this.doc)\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: this.toBaseSchema(propSchema, enums, p, upLevelSchemaKey),\n\t\t\t\t\t};\n\t\t\t\t}, {}),\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic init() {\n\t\tconst { components = {}, paths = {} } = this.doc;\n\t\tconst enums: EnumSchemaObject[] = [];\n\t\tconst {\n\t\t\trequestBodies = {},\n\t\t\tresponses = {},\n\t\t\tparameters = {},\n\t\t\tschemas = {},\n\t\t} = components;\n\n\t\tconst schemas_ = Object.keys(schemas).reduce((acc, key) => {\n\t\t\tconst schema = schemas[key];\n\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[key]: this.getSchemaByRef(schema, false, enums, key),\n\t\t\t};\n\t\t}, {});\n\n\t\tconst parameters_ = Object.keys(parameters).reduce((acc, key) => {\n\t\t\tconst parameter = parameters[key];\n\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[key]: this.getParameterByRef(parameter, enums, key),\n\t\t\t};\n\t\t}, {});\n\n\t\tconst responses_ = Object.keys(responses).reduce((acc, key) => {\n\t\t\tconst response = responses[key];\n\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[key]: this.getResponseByRef(response),\n\t\t\t};\n\t\t}, {});\n\n\t\tconst requestBodies_ = Object.keys(requestBodies).reduce((acc, key) => {\n\t\t\tconst requestBody = requestBodies[key];\n\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[key]: this.getRequestBodyByRef(requestBody, enums),\n\t\t\t};\n\t\t}, {});\n\n\t\tconst apis = Object.keys(paths).reduce((acc, path) => {\n\t\t\tlet pathObject = paths[path] ?? {};\n\n\t\t\t// Handle path-level $ref\n\t\t\tif (pathObject.$ref) {\n\t\t\t\tconst resolved = this.resolvePathRef(pathObject.$ref);\n\t\t\t\tif (resolved) {\n\t\t\t\t\tpathObject = resolved;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst { parameters = [], description, summary } = pathObject;\n\t\t\tconst methodApis: OperationObject[] = [];\n\n\t\t\tObject.values(HttpMethods).forEach((method) => {\n\t\t\t\tconst methodObject = pathObject[method as OpenAPIV3.HttpMethods];\n\n\t\t\t\tif (methodObject) {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tdeprecated,\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tresponses = {},\n\t\t\t\t\t\tsummary: summary_,\n\t\t\t\t\t\tdescription: description_,\n\t\t\t\t\t\trequestBody = { content: {} },\n\t\t\t\t\t} = methodObject;\n\t\t\t\t\tconst { parameters: parameters_ = [] } = methodObject;\n\t\t\t\t\tconst baseParameters = [...parameters, ...parameters_].map(\n\t\t\t\t\t\t(parameter) => this.getParameterByRef(parameter, enums)\n\t\t\t\t\t);\n\t\t\t\t\tconst baseRequestBody = this.getRequestBodyByRef(requestBody, enums);\n\t\t\t\t\tconst uniqueParameterName = [\n\t\t\t\t\t\t...new Set(baseParameters.map((p) => p.name)),\n\t\t\t\t\t];\n\n\t\t\t\t\tif (Object.keys(responses).length === 0) {\n\t\t\t\t\t\tObject.assign(responses, {\n\t\t\t\t\t\t\t200: {\n\t\t\t\t\t\t\t\tdescription: 'Successful response',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst httpCodes = Object.keys(responses);\n\t\t\t\t\tfor (const code of httpCodes) {\n\t\t\t\t\t\tif (code in responses) {\n\t\t\t\t\t\t\tconst response = responses[code];\n\t\t\t\t\t\t\tconst responseSchema = this.getResponseByRef(response);\n\t\t\t\t\t\t\tmethodApis.push({\n\t\t\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\tsummary: summary_ ?? summary,\n\t\t\t\t\t\t\t\tdescription: description_ ?? description,\n\t\t\t\t\t\t\t\tdeprecated: deprecated,\n\t\t\t\t\t\t\t\tparameters: uniqueParameterName\n\t\t\t\t\t\t\t\t\t.map((name) => baseParameters.find((p) => p.name === name))\n\t\t\t\t\t\t\t\t\t.filter((p): p is ParameterObject => p !== undefined),\n\t\t\t\t\t\t\t\tresponses: responseSchema,\n\t\t\t\t\t\t\t\trequestBody: baseRequestBody,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[path]: methodApis,\n\t\t\t};\n\t\t}, {});\n\n\t\treturn {\n\t\t\tenums: Base.uniqueEnums(enums),\n\t\t\tschemas: schemas_,\n\t\t\tresponses: responses_,\n\t\t\tparameters: parameters_,\n\t\t\trequestBodies: requestBodies_,\n\t\t\tapis,\n\t\t};\n\t}\n}\n","/* eslint-disable unicorn/filename-case */\n\nimport type { OpenAPIV3_1 } from 'openapi-types';\nimport type {\n\tEnumSchemaObject,\n\tMediaTypeObject,\n\tMediaTypes,\n\tOperationObject,\n\tParameterIn,\n\tParameterObject,\n\tSchemaFormatType,\n\tSchemaObject,\n} from '../core/index.js';\nimport { Base, HttpMethods, NonArraySchemaType } from '../core/index.js';\n\nexport class V3_1 {\n\tdoc!: OpenAPIV3_1.Document;\n\n\tconstructor(doc: OpenAPIV3_1.Document) {\n\t\tthis.doc = doc;\n\t}\n\n\t/**\n\t * Resolves a path $ref to the actual path object.\n\t */\n\tprivate resolvePathRef($ref: string): OpenAPIV3_1.PathItemObject | undefined {\n\t\tconst refName = Base.ref2name($ref, this.doc);\n\t\treturn this.doc.paths?.[refName];\n\t}\n\n\t/**\n\t * Is array schema.\n\t */\n\tprivate isOpenAPIArraySchema(\n\t\tschema: OpenAPIV3_1.SchemaObject\n\t): schema is OpenAPIV3_1.ArraySchemaObject {\n\t\treturn typeof schema === 'object' && schema.type === 'array';\n\t}\n\n\t/**\n\t * OpenAPI schema to base schema.\n\t */\n\tprivate getSchemaByRef(\n\t\tschema: OpenAPIV3_1.SchemaObject | OpenAPIV3_1.ReferenceObject,\n\t\treserveRef = false,\n\t\tenums: EnumSchemaObject[] = [],\n\t\tupLevelSchemaKey = ''\n\t): SchemaObject {\n\t\tlet refName = '';\n\t\tif (Base.isRef(schema)) {\n\t\t\tconst upperRefName = Base.upperCamelCase(Base.ref2name(schema.$ref));\n\t\t\trefName = upperRefName;\n\t\t\tif (reserveRef) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: upLevelSchemaKey + refName,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!this.doc.components) {\n\t\t\t\tthis.doc.components = {\n\t\t\t\t\tschemas: {},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst resolvedSchema =\n\t\t\t\tthis.doc.components.schemas?.[Base.ref2name(schema.$ref, this.doc)];\n\t\t\tif (!resolvedSchema) {\n\t\t\t\tthrow new Error(`Schema reference not found: ${refName}`);\n\t\t\t}\n\t\t\tschema = resolvedSchema;\n\t\t}\n\n\t\treturn this.toBaseSchema(schema, enums, '', upLevelSchemaKey + refName);\n\t}\n\n\t/**\n\t * OpenAPI parameter to base parameter.\n\t */\n\tprivate getParameterByRef(\n\t\tschema: OpenAPIV3_1.ParameterObject | OpenAPIV3_1.ReferenceObject,\n\t\tenums: EnumSchemaObject[] = [],\n\t\tupLevelSchemaKey = ''\n\t): ParameterObject {\n\t\tif (Base.isRef(schema)) {\n\t\t\tschema = this.doc.components?.parameters?.[\n\t\t\t\tBase.ref2name(schema.$ref, this.doc)\n\t\t\t] as OpenAPIV3_1.ParameterObject;\n\t\t}\n\n\t\tconst {\n\t\t\tname,\n\t\t\trequired,\n\t\t\tdeprecated,\n\t\t\tdescription,\n\t\t\tschema: parameterSchema,\n\t\t} = schema;\n\n\t\tif (\n\t\t\tparameterSchema &&\n\t\t\t!Base.isRef(parameterSchema) &&\n\t\t\tparameterSchema.enum\n\t\t) {\n\t\t\tconst type =\n\t\t\t\tBase.upperCamelCase(Base.normalize(upLevelSchemaKey)) +\n\t\t\t\tBase.upperCamelCase(Base.normalize(name));\n\n\t\t\tconst enumSchema = {\n\t\t\t\tname: type,\n\t\t\t\tenum: [...new Set(parameterSchema.enum as (string | number)[])],\n\t\t\t};\n\n\t\t\tconst sameEnum = Base.findSameSchema(enumSchema, enums);\n\n\t\t\tif (\n\t\t\t\t!sameEnum &&\n\t\t\t\tBase.isValidEnumType(parameterSchema as unknown as SchemaObject)\n\t\t\t) {\n\t\t\t\tenums.push(enumSchema);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\trequired,\n\t\t\t\tdescription,\n\t\t\t\tdeprecated,\n\t\t\t\tin: schema.in as ParameterIn,\n\t\t\t\tschema: {\n\t\t\t\t\ttype: sameEnum?.name ?? type,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tname,\n\t\t\trequired,\n\t\t\tdescription,\n\t\t\tdeprecated,\n\t\t\tin: schema.in as ParameterIn,\n\t\t\tschema:\n\t\t\t\tschema.schema &&\n\t\t\t\tthis.getSchemaByRef(\n\t\t\t\t\tschema.schema,\n\t\t\t\t\tfalse,\n\t\t\t\t\tenums,\n\t\t\t\t\tupLevelSchemaKey + Base.capitalize(name)\n\t\t\t\t),\n\t\t};\n\t}\n\n\t/**\n\t * OpenAPI schema to base response\n\t */\n\tprivate getResponseByRef(\n\t\tschema: OpenAPIV3_1.ResponseObject | OpenAPIV3_1.ReferenceObject\n\t): MediaTypeObject[] {\n\t\tif (Base.isRef(schema)) {\n\t\t\tschema = this.doc.components?.responses?.[\n\t\t\t\tBase.ref2name(schema.$ref, this.doc)\n\t\t\t] as OpenAPIV3_1.ResponseObject;\n\t\t}\n\n\t\tconst { content = {} } = schema;\n\n\t\treturn Object.keys(content).map((c) => ({\n\t\t\ttype: c as MediaTypes,\n\t\t\tschema: content[c].schema && this.getSchemaByRef(content[c].schema, true),\n\t\t}));\n\t}\n\n\t/**\n\t * OpenAPI schema to requestBody.\n\t */\n\tprivate getRequestBodyByRef(\n\t\tschema: OpenAPIV3_1.RequestBodyObject | OpenAPIV3_1.ReferenceObject,\n\t\tenums: EnumSchemaObject[] = []\n\t): MediaTypeObject[] {\n\t\tif (Base.isRef(schema)) {\n\t\t\tschema = this.doc.components?.requestBodies?.[\n\t\t\t\tBase.ref2name(schema.$ref, this.doc)\n\t\t\t] as OpenAPIV3_1.RequestBodyObject;\n\t\t}\n\n\t\tconst { content = {} } = schema;\n\n\t\treturn Object.keys(content).map((c) => ({\n\t\t\ttype: c as MediaTypes,\n\t\t\tschema:\n\t\t\t\tcontent[c].schema &&\n\t\t\t\tthis.getSchemaByRef(content[c].schema, true, enums),\n\t\t}));\n\t}\n\n\t/**\n\t * Transform all OpenAPI schema to Base Schema\n\t */\n\tprivate toBaseSchema(\n\t\tschema: OpenAPIV3_1.SchemaObject | OpenAPIV3_1.ReferenceObject | undefined,\n\t\tenums: EnumSchemaObject[] = [],\n\t\tschemaKey = '',\n\t\tupLevelSchemaKey = ''\n\t): SchemaObject {\n\t\tif (!schema) {\n\t\t\treturn {\n\t\t\t\ttype: 'unknown',\n\t\t\t};\n\t\t}\n\n\t\tif (Base.isRef(schema)) {\n\t\t\treturn this.getSchemaByRef(schema, true);\n\t\t}\n\n\t\tif (this.isOpenAPIArraySchema(schema)) {\n\t\t\tconst { type, description, items, required } = schema;\n\n\t\t\treturn {\n\t\t\t\ttype,\n\t\t\t\trequired: !!required,\n\t\t\t\tdescription,\n\t\t\t\titems: this.toBaseSchema(items, enums, schemaKey, upLevelSchemaKey),\n\t\t\t};\n\t\t} else {\n\t\t\tconst {\n\t\t\t\trequired = [],\n\t\t\t\tallOf,\n\t\t\t\tanyOf,\n\t\t\t\tdescription,\n\t\t\t\tdeprecated,\n\t\t\t\tenum: enum_,\n\t\t\t\tformat,\n\t\t\t\toneOf,\n\t\t\t\tproperties = {},\n\t\t\t} = schema;\n\t\t\tlet { type } = schema;\n\n\t\t\tif (enum_ && type !== 'boolean') {\n\t\t\t\tconst name =\n\t\t\t\t\tBase.upperCamelCase(Base.normalize(upLevelSchemaKey)) +\n\t\t\t\t\tBase.upperCamelCase(Base.normalize(schemaKey));\n\n\t\t\t\tconst enumObject = {\n\t\t\t\t\tname,\n\t\t\t\t\tenum: [...new Set(enum_ as (string | number)[])],\n\t\t\t\t};\n\n\t\t\t\tconst sameObject = Base.findSameSchema(enumObject, enums);\n\n\t\t\t\tif (\n\t\t\t\t\t!sameObject &&\n\t\t\t\t\tBase.isValidEnumType(schema as unknown as SchemaObject)\n\t\t\t\t) {\n\t\t\t\t\tenums.push(enumObject);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\ttype: sameObject\n\t\t\t\t\t\t? sameObject.name\n\t\t\t\t\t\t: Base.isBooleanEnum(schema as unknown as SchemaObject)\n\t\t\t\t\t\t\t? 'boolean'\n\t\t\t\t\t\t\t: enumObject.name,\n\t\t\t\t\trequired,\n\t\t\t\t\tdescription,\n\t\t\t\t\tdeprecated,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (type === undefined && Object.keys(properties).length > 0) {\n\t\t\t\ttype = NonArraySchemaType.object;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttype: type as unknown as NonArraySchemaType,\n\t\t\t\trequired,\n\t\t\t\tdescription,\n\t\t\t\tdeprecated,\n\t\t\t\tenum: enum_,\n\t\t\t\tformat: format as unknown as SchemaFormatType,\n\t\t\t\tallOf: allOf?.map((s) =>\n\t\t\t\t\tBase.isRef(s)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...s,\n\t\t\t\t\t\t\t\tref: s.$ref,\n\t\t\t\t\t\t\t\ttype: Base.capitalize(Base.ref2name(s.$ref, this.doc)),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: this.toBaseSchema(s, enums)\n\t\t\t\t),\n\t\t\t\tanyOf: anyOf?.map((s) =>\n\t\t\t\t\tBase.isRef(s)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...s,\n\t\t\t\t\t\t\t\tref: s.$ref,\n\t\t\t\t\t\t\t\ttype: Base.capitalize(Base.ref2name(s.$ref, this.doc)),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: this.toBaseSchema(s, enums)\n\t\t\t\t),\n\t\t\t\toneOf: oneOf?.map((s) =>\n\t\t\t\t\tBase.isRef(s)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...s,\n\t\t\t\t\t\t\t\tref: s.$ref,\n\t\t\t\t\t\t\t\ttype: Base.capitalize(Base.ref2name(s.$ref, this.doc)),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: this.toBaseSchema(s, enums)\n\t\t\t\t),\n\t\t\t\tproperties: Object.keys(properties).reduce((acc, p) => {\n\t\t\t\t\tconst propSchema = properties[p];\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t[p]: Base.isRef(propSchema)\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\ttype: Base.capitalize(\n\t\t\t\t\t\t\t\t\t\tBase.ref2name(propSchema.$ref, this.doc)\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: this.toBaseSchema(propSchema, enums, p, upLevelSchemaKey),\n\t\t\t\t\t};\n\t\t\t\t}, {}),\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic init() {\n\t\tconst { components = {}, paths = {} } = this.doc;\n\t\tconst enums: EnumSchemaObject[] = [];\n\t\tconst {\n\t\t\trequestBodies = {},\n\t\t\tresponses = {},\n\t\t\tparameters = {},\n\t\t\tschemas = {},\n\t\t} = components;\n\n\t\tconst schemas_ = Object.keys(schemas).reduce((acc, key) => {\n\t\t\tconst schema = schemas[key];\n\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[key]: this.getSchemaByRef(schema, false, enums, key),\n\t\t\t};\n\t\t}, {});\n\n\t\tconst parameters_ = Object.keys(parameters).reduce((acc, key) => {\n\t\t\tconst parameter = parameters[key];\n\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[key]: this.getParameterByRef(parameter, enums, key),\n\t\t\t};\n\t\t}, {});\n\n\t\tconst responses_ = Object.keys(responses).reduce((acc, key) => {\n\t\t\tconst response = responses[key];\n\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[key]: this.getResponseByRef(response),\n\t\t\t};\n\t\t}, {});\n\n\t\tconst requestBodies_ = Object.keys(requestBodies).reduce((acc, key) => {\n\t\t\tconst requestBody = requestBodies[key];\n\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[key]: this.getRequestBodyByRef(requestBody, enums),\n\t\t\t};\n\t\t}, {});\n\n\t\tconst apis = Object.keys(paths).reduce((acc, path) => {\n\t\t\tlet pathObject = paths[path] ?? {};\n\n\t\t\t// Handle path-level $ref\n\t\t\tif (pathObject.$ref) {\n\t\t\t\tconst resolved = this.resolvePathRef(pathObject.$ref);\n\t\t\t\tif (resolved) {\n\t\t\t\t\tpathObject = resolved;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst { parameters = [], description, summary } = pathObject;\n\t\t\tconst methodApis: OperationObject[] = [];\n\n\t\t\tObject.values(HttpMethods).forEach((method) => {\n\t\t\t\tconst methodObject = pathObject[method as OpenAPIV3_1.HttpMethods];\n\n\t\t\t\tif (methodObject) {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tdeprecated,\n\t\t\t\t\t\toperationId,\n\t\t\t\t\t\tsummary: summary_,\n\t\t\t\t\t\tdescription: description_,\n\t\t\t\t\t\tresponses = {},\n\t\t\t\t\t\trequestBody = { content: {} },\n\t\t\t\t\t} = methodObject;\n\t\t\t\t\tconst { parameters: parameters_ = [] } = methodObject;\n\t\t\t\t\tconst baseParameters = [...parameters, ...parameters_].map(\n\t\t\t\t\t\t(parameter) => this.getParameterByRef(parameter, enums)\n\t\t\t\t\t);\n\t\t\t\t\tconst baseRequestBody = this.getRequestBodyByRef(requestBody, enums);\n\t\t\t\t\tconst uniqueParameterName = [\n\t\t\t\t\t\t...new Set(baseParameters.map((p) => p.name)),\n\t\t\t\t\t];\n\n\t\t\t\t\tif (Object.keys(responses).length === 0) {\n\t\t\t\t\t\tObject.assign(responses, {\n\t\t\t\t\t\t\t200: {\n\t\t\t\t\t\t\t\tdescription: 'Successful response',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst httpCodes = Object.keys(responses);\n\t\t\t\t\tfor (const code of httpCodes) {\n\t\t\t\t\t\tif (code in responses) {\n\t\t\t\t\t\t\tconst response = responses[code];\n\t\t\t\t\t\t\tconst responseSchema = this.getResponseByRef(response);\n\t\t\t\t\t\t\tmethodApis.push({\n\t\t\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\t\tsummary: summary_ ?? summary,\n\t\t\t\t\t\t\t\tdescription: description_ ?? description,\n\t\t\t\t\t\t\t\tdeprecated: deprecated,\n\t\t\t\t\t\t\t\tparameters: uniqueParameterName\n\t\t\t\t\t\t\t\t\t.map((name) => baseParameters.find((p) => p.name === name))\n\t\t\t\t\t\t\t\t\t.filter((p): p is ParameterObject => p !== undefined),\n\t\t\t\t\t\t\t\tresponses: responseSchema,\n\t\t\t\t\t\t\t\trequestBody: baseRequestBody,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[path]: methodApis,\n\t\t\t};\n\t\t}, {});\n\n\t\treturn {\n\t\t\tenums: Base.uniqueEnums(enums),\n\t\t\tschemas: schemas_,\n\t\t\tresponses: responses_,\n\t\t\tparameters: parameters_,\n\t\t\trequestBodies: requestBodies_,\n\t\t\tapis,\n\t\t};\n\t}\n}\n","import { createScopedLogger } from '@moccona/logger';\nimport type { OpenAPI, OpenAPIV2, OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\nimport type {\n\tAdaptors,\n\tProviderInitOptions,\n\tProviderInitResult,\n} from '../core/index.js';\nimport {\n\ttype Adapter,\n\tAxiosAdapter,\n\tAdaptors as ads,\n\tBase,\n\tFetchAdapter,\n\tGenerator,\n\tProvider,\n} from '../core/index.js';\n\nimport { V2 } from './V2.js';\nimport { V3 } from './V3.js';\nimport { V3_1 } from './V3_1.js';\n\nconst logger = createScopedLogger('OpenAPI');\n\nexport enum OpenAPIVersion {\n\tv2 = 'v2',\n\tv3 = 'v3',\n\tv3_1 = 'v3_1',\n\tunknown = 'unknown',\n}\n\nfunction getDocVersion(doc: OpenAPI.Document) {\n\tconst version = (\n\t\t(doc as OpenAPIV3.Document).openapi || (doc as OpenAPIV2.Document).swagger\n\t).slice(0, 3);\n\n\tswitch (version) {\n\t\tcase '3.1':\n\t\t\treturn OpenAPIVersion.v3_1;\n\t\tcase '3.0':\n\t\t\treturn OpenAPIVersion.v3;\n\t\tcase '2.0':\n\t\t\treturn OpenAPIVersion.v2;\n\t\tdefault:\n\t\t\treturn OpenAPIVersion.unknown;\n\t}\n}\n\nexport class OpenAPIProvider extends Provider {\n\tpublic parse(doc: OpenAPIV3.Document): ProviderInitResult {\n\t\tconst version = getDocVersion(doc);\n\n\t\tlogger.debug(`openapi version ${version}`);\n\n\t\tswitch (version) {\n\t\t\tcase OpenAPIVersion.v2:\n\t\t\t\treturn new V2(doc as unknown as OpenAPIV2.Document).init();\n\t\t\tcase OpenAPIVersion.v3:\n\t\t\t\treturn new V3(doc as unknown as OpenAPIV3.Document).init();\n\t\t\tcase OpenAPIVersion.v3_1:\n\t\t\t\treturn new V3_1(doc as unknown as OpenAPIV3_1.Document).init();\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Not a valid OpenAPI version: ${version}`);\n\t\t}\n\t}\n}\n\nfunction getAdaptor(type: keyof typeof Adaptors): Adapter {\n\tswitch (type) {\n\t\tcase ads.axios:\n\t\t\treturn new AxiosAdapter();\n\t\tdefault:\n\t\t\treturn new FetchAdapter();\n\t}\n}\n\nexport interface CodeGenResult {\n\tcode: string;\n\tstats: {\n\t\tendpoints: number;\n\t\tschemas: number;\n\t\tduration: number;\n\t};\n}\n\nexport async function codeGen(\n\tinitOptions: ProviderInitOptions\n): Promise<CodeGenResult> {\n\tconst startTime = Date.now();\n\tconst { verbose } = initOptions;\n\n\tif (verbose) {\n\t\tlogger.setLevel('debug');\n\t} else {\n\t\tlogger.setLevel('info');\n\t}\n\n\tlogger.info(`Fetch document from ${initOptions.docURL}`);\n\n\tconst doc = await Base.fetchDoc(\n\t\tinitOptions.docURL,\n\t\tinitOptions.requestOptions\n\t);\n\n\tconst provider = new OpenAPIProvider(initOptions, doc);\n\tconst { enums, schemas, parameters, responses, requestBodies, apis } =\n\t\tprovider;\n\n\tconst adaptor = getAdaptor(initOptions.adaptor ?? ads.fetch);\n\tconst code = await Generator.genCode(\n\t\t{\n\t\t\tenums,\n\t\t\tschemas,\n\t\t\tparameters,\n\t\t\tresponses,\n\t\t\trequestBodies,\n\t\t\tapis,\n\t\t},\n\t\tinitOptions,\n\t\tadaptor\n\t);\n\n\tif (initOptions.output) {\n\t\tawait Generator.write(code, initOptions.output);\n\t}\n\n\tconst duration = Date.now() - startTime;\n\tconst endpoints = Object.keys(apis).length;\n\tconst schemasCount = Object.keys(schemas).length;\n\n\treturn {\n\t\tcode,\n\t\tstats: {\n\t\t\tendpoints,\n\t\t\tschemas: schemasCount,\n\t\t\tduration,\n\t\t},\n\t};\n}\n\nexport type { ProviderInitOptions } from '../core/index.js';\n","import path from 'node:path';\nimport { createScopedLogger } from '@moccona/logger';\nimport fs from 'fs-extra';\nimport type { PluginOption } from 'vite';\nimport { loadConfig, toProviderOptions } from '../core/config.js';\nimport {\n\tcreateErrors,\n\tformatError,\n\tisApicodegenError,\n\twrapError,\n} from '../core/errors.js';\nimport { codeGen } from '../openapi/index.js';\n\nconst PLUGIN_NAME = 'api-code-gen';\nconst logger = createScopedLogger('api-code-gen');\n\nexport type ApiCodeGenPluginOptions = {\n\t/** Human-readable name for this API config (required) */\n\tname: string;\n\t/** OpenAPI spec file path or URL */\n\tspec?: string;\n\t/** Output file path */\n\toutput?: string;\n\t/** HTTP client adaptor */\n\tadaptor?: 'fetch' | 'axios';\n\t/** Base URL for API endpoints */\n\tbaseURL?: string;\n\t/** Custom client import source path */\n\timportClientSource?: string;\n\t/** Enable verbose logging */\n\tverbose?: boolean;\n\t/** Run type check after generation (default: true) */\n\ttypeCheck?: boolean;\n};\n\n/**\n * Run TypeScript type checking on generated file\n */\nasync function runTypeCheck(filePath: string): Promise<string[]> {\n\tconst { execaCommand } = await import('execa');\n\tconst errors: string[] = [];\n\n\ttry {\n\t\tawait execaCommand(`npx tsc ${filePath} --noEmit`, {\n\t\t\tshell: true,\n\t\t});\n\t} catch (error) {\n\t\tif (error instanceof Error) {\n\t\t\terrors.push(error.message);\n\t\t}\n\t}\n\n\treturn errors;\n}\n\n/**\n * Validate spec path exists\n */\nasync function validateSpecPath(specPath: string): Promise<void> {\n\t// For URLs, skip file existence check\n\tif (specPath.startsWith('http://') || specPath.startsWith('https://')) {\n\t\treturn;\n\t}\n\n\tconst filePath = specPath.replace(/^file:\\/\\//, '');\n\tconst absolutePath = path.isAbsolute(filePath)\n\t\t? filePath\n\t\t: path.resolve(process.cwd(), filePath);\n\n\tconst exists = await fs.pathExists(absolutePath);\n\tif (!exists) {\n\t\tthrow createErrors.specNotFound(absolutePath);\n\t}\n}\n\n/**\n * Generate code for a single API configuration\n */\nasync function generateForOption(option: ApiCodeGenPluginOptions): Promise<{\n\tsuccess: boolean;\n\tname: string;\n\toutput?: string;\n\tstats?: { endpoints: number; schemas: number; duration: number };\n\terror?: unknown;\n}> {\n\tconst { name, typeCheck = true, verbose, ...restOptions } = option;\n\n\ttry {\n\t\tconsole.log(`\\x1b[36m├─\\x1b[0m ${name}`);\n\n\t\t// Use config loader to handle env vars and config files\n\t\tconst config = await loadConfig({\n\t\t\tname,\n\t\t\tcliOptions: { ...restOptions, verbose },\n\t\t});\n\n\t\t// Validate spec exists\n\t\tawait validateSpecPath(config.spec);\n\n\t\t// Ensure output directory exists\n\t\tif (config.output) {\n\t\t\tconst outputDir = path.dirname(config.output);\n\t\t\tawait fs.ensureDir(outputDir);\n\t\t}\n\n\t\t// Convert to provider options and resolve docURL\n\t\tlet docURL = config.spec;\n\t\tif (!docURL.startsWith('http://') && !docURL.startsWith('https://')) {\n\t\t\tif (docURL.startsWith('/') || docURL.match(/^[A-Za-z]:/)) {\n\t\t\t\tdocURL = `file://${docURL}`;\n\t\t\t} else {\n\t\t\t\tdocURL = path.resolve(process.cwd(), docURL);\n\t\t\t}\n\t\t}\n\n\t\tconst result = await codeGen({\n\t\t\t...toProviderOptions(config),\n\t\t\tdocURL,\n\t\t});\n\n\t\tif (config.output) {\n\t\t\tawait fs.writeFile(config.output, result.code);\n\t\t}\n\n\t\t// Run type check if enabled\n\t\tif (typeCheck && config.output) {\n\t\t\tconst typeErrors = await runTypeCheck(config.output);\n\t\t\tif (typeErrors.length > 0) {\n\t\t\t\tlogger.warn(`Type check failed for ${config.output}`);\n\t\t\t\tif (verbose) {\n\t\t\t\t\tfor (const error of typeErrors) {\n\t\t\t\t\t\tlogger.warn(` ${error}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tname,\n\t\t\toutput: config.output,\n\t\t\tstats: result.stats,\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tname,\n\t\t\terror,\n\t\t};\n\t}\n}\n\n/**\n * Main Vite plugin function\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import { apiCodeGenPlugin } from '@moccona/apicodegen/vite';\n *\n * export default defineConfig({\n * plugins: [\n * apiCodeGenPlugin([\n * {\n * name: 'my-api',\n * spec: './openapi.json',\n * output: './src/api/generated.ts',\n * baseURL: 'https://api.example.com',\n * },\n * ]),\n * ],\n * });\n * ```\n */\nexport function apiCodeGenPlugin(\n\toptions: ApiCodeGenPluginOptions[]\n): PluginOption {\n\tif (!Array.isArray(options) || options.length === 0) {\n\t\tlogger.warn('No API configurations provided to apiCodeGenPlugin');\n\t\treturn { name: PLUGIN_NAME };\n\t}\n\n\treturn {\n\t\tname: PLUGIN_NAME,\n\n\t\tasync config(_config, env) {\n\t\t\tconsole.log(`\\x1b[1m\\x1b[36m${'─'.repeat(50)}\\x1b[0m`);\n\t\t\tconsole.log(`\\x1b[1m\\x1b[36mAPI Code Gen\\x1b[0m`);\n\t\t\tconsole.log(`\\x1b[90mMode:\\x1b[0m ${env?.command || 'unknown'}`);\n\t\t\tconsole.log(`\\x1b[1m\\x1b[36m${'─'.repeat(50)}\\x1b[0m`);\n\n\t\t\tconst results = await Promise.all(options.map(generateForOption));\n\t\t\tconst successCount = results.filter((r) => r.success).length;\n\t\t\tconst failCount = options.length - successCount;\n\n\t\t\tconsole.log(`\\x1b[1m\\x1b[36m${'─'.repeat(50)}\\x1b[0m`);\n\n\t\t\tfor (const result of results) {\n\t\t\t\tif (result.success) {\n\t\t\t\t\tconst { name, output, stats } = result;\n\t\t\t\t\tif (stats) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`\\x1b[32m✓\\x1b[0m ${name} → ${output} (${stats.endpoints} endpoints, ${stats.schemas} schemas) ${stats.duration}ms`\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.log(`\\x1b[32m✓\\x1b[0m ${name} → ${output || 'N/A'}`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst { name, error } = result;\n\t\t\t\t\tif (isApicodegenError(error)) {\n\t\t\t\t\t\tconsole.log(`\\x1b[31m✗\\x1b[0m ${name}`);\n\t\t\t\t\t\tconsole.log(`\\x1b[90m${formatError(error, true)}\\x1b[0m`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst wrapped = wrapError(error!, {\n\t\t\t\t\t\t\tcode: 'E_GENERATION_FAILED',\n\t\t\t\t\t\t\tmessage: `Failed to generate API \"${name}\"`,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconsole.log(`\\x1b[31m✗\\x1b[0m ${name}`);\n\t\t\t\t\t\tconsole.log(`\\x1b[90m${formatError(wrapped, true)}\\x1b[0m`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconsole.log(`\\x1b[1m\\x1b[36m${'─'.repeat(50)}\\x1b[0m`);\n\n\t\t\tconst totalDuration = results.reduce(\n\t\t\t\t(sum, r) => sum + (r.stats?.duration || 0),\n\t\t\t\t0\n\t\t\t);\n\t\t\tconst totalEndpoints = results.reduce(\n\t\t\t\t(sum, r) => sum + (r.stats?.endpoints || 0),\n\t\t\t\t0\n\t\t\t);\n\t\t\tconst totalSchemas = results.reduce(\n\t\t\t\t(sum, r) => sum + (r.stats?.schemas || 0),\n\t\t\t\t0\n\t\t\t);\n\n\t\t\tif (failCount === 0) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\x1b[32m✓\\x1b[0m API Code Gen - Complete (\\x1b[90m${successCount}/${options.length} succeeded\\x1b[0m, ${totalEndpoints} endpoints, ${totalSchemas} schemas, ${totalDuration}ms\\x1b[0m)`\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`\\x1b[33m⚠\\x1b[0m API Code Gen - Complete (\\x1b[90m${successCount} succeeded, ${failCount} failed\\x1b[0m, ${totalEndpoints} endpoints, ${totalSchemas} schemas, ${totalDuration}ms\\x1b[0m)`\n\t\t\t\t);\n\t\t\t}\n\t\t\tconsole.log(`\\x1b[1m\\x1b[36m${'─'.repeat(50)}\\x1b[0m`);\n\n\t\t\treturn {};\n\t\t},\n\t};\n}\n\nexport default apiCodeGenPlugin;\n"],"mappings":"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"}
|