@moccona/apicodegen 0.0.1 → 0.0.3
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 +48 -0
- package/bin/{cli.cjs → cli.js} +411 -300
- package/npm/index.cjs +212 -108
- package/npm/index.cjs.map +1 -1
- package/npm/index.d.cts +10 -10
- package/npm/index.d.ts +10 -10
- package/npm/index.js +212 -108
- package/npm/index.js.map +1 -1
- package/npm/vite/index.d.ts +29 -0
- package/npm/vite/index.js +2276 -0
- package/npm/vite/index.js.map +1 -0
- package/package.json +27 -30
package/npm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"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/openapi/index.ts","../src/openapi/V2.ts","../src/openapi/V3.ts","../src/openapi/V3_1.ts","../src/vite-plugin/index.ts"],"sourcesContent":["/**\n * @file Adapter abstract class definition\n * @author [Your Name]\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","/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * @file Base class implementation\n * @author [Your Name]\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(path: string, method?: string, operationId?: string) {\n const name = this.camelCase(this.normalize(path));\n const suffix = method\n ? this.capitalize(this.upperCamelCase(`using_${method}`))\n : \"\";\n\n return (\n (operationId ? this.camelCase(this.normalize(operationId)) : name) +\n suffix\n );\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.replace(/[/\\-_{}():\\s`,*<>$]/gm, \"_\").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: {\n rejectUnauthorized: false,\n },\n });\n\n // eslint-disable-next-line no-useless-catch\n try {\n const { body } = await request(url, {\n method: \"GET\",\n dispatcher: agent,\n ...requestInit,\n });\n return body.json() as T;\n } catch (error) {\n throw error;\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 // eslint-disable-next-line @typescript-eslint/no-for-in-array\n for (const type in Object.values(MediaTypes)) {\n if (new RegExp(type).test(mediaType)) {\n return type as MediaTypes;\n }\n }\n return;\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[]) {\n const uniqueEnums_: EnumSchemaObject[] = [];\n for (const enumObject of enums) {\n if (uniqueEnums_.length === 0) {\n uniqueEnums_.push(enumObject);\n } else {\n if (!uniqueEnums_.some((a) => this.isSameEnum(a, enumObject))) {\n uniqueEnums_.push(enumObject);\n }\n }\n }\n return uniqueEnums_;\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: any): schema is ReferenceObject {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return \"$ref\" in schema && typeof schema.$ref === \"string\";\n }\n}\n","/**\n * @file Provider abstract class.\n * This file defines the `Provider` abstract class, which serves as a base for providers responsible for parsing\n * 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/restrict-plus-operands */\n/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */\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 expression node.\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)}={${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(\"File\"));\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(\"File\"));\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.createUnionTypeNode(\n allOf.map((schema) => this.toTypeNode(schema)),\n );\n }\n\n if (type && typeof type === \"string\") {\n return t.createTypeReferenceNode(\n type !== \"unknown\"\n ? t.createIdentifier(Base.upperCamelCase(type))\n : type,\n );\n // t.createTypeOperatorNode(\n // SyntaxKind.KeyOfKeyword,\n // t.createTypeQueryNode(t.createIdentifier(type)),\n // );\n // t.createTypeReferenceNode(t.createIdentifier(type));\n }\n }\n\n return t.createToken(SyntaxKind.UnknownKeyword);\n }\n\n static toDeclarationNode(\n parameters: ParameterObject[],\n ): ParameterDeclaration {\n const objectElements: BindingElement[] = [];\n const typeObjectElements: PropertySignature[] = [];\n\n for (const parameter of parameters) {\n if (parameter.ref) {\n t.createParameterDeclaration(\n undefined,\n undefined,\n t.createIdentifier(\n Base.camelCase(Base.normalize(Base.ref2name(parameter.ref))),\n ),\n undefined,\n t.createTypeReferenceNode(\n t.createIdentifier(\n Base.upperCamelCase(Base.normalize(Base.ref2name(parameter.ref))),\n ),\n ),\n undefined,\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 return t.createParameterDeclaration(\n undefined,\n undefined,\n t.createObjectBindingPattern(objectElements),\n undefined,\n t.createTypeLiteralNode(typeObjectElements),\n undefined,\n );\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\n .filter(\n (parameter) =>\n parameter.ref !== undefined &&\n (parameter.in === ParameterIn.formData ||\n (parameter.schema && this.isBinarySchema(parameter.schema))),\n )\n .forEach((parameter) => {\n statements.push(\n t.createExpressionStatement(\n t.createBinaryExpression(\n t.createElementAccessExpression(\n t.createIdentifier(\"req\"),\n t.createStringLiteral(parameter.name),\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(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.createIdentifier(\"file\"),\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 inFormDataParameters = parameters.filter(\n (p) => p.in === ParameterIn.formData,\n );\n\n const notInFormDataParameters = parameters.filter(\n (p) => p.in !== ParameterIn.formData,\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 inFormDataParameters.length > 0;\n\n return t.createBlock([\n ...(shouldPutParametersOrBodyInFormData\n ? this.toFormDataStatement(inFormDataParameters, requestBody?.schema)\n : []),\n ...adapter.client(\n uri,\n method,\n notInFormDataParameters,\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.toDeclarationNode(parameters)\n : undefined,\n req?.schema\n ? Generator.toRequestBodyTypeNode(req.schema)\n : undefined,\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 code;\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 // Add body if needed\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 // Add body if needed\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 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 ),\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","/* eslint-disable unicorn/filename-case */\n\nimport {\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 ? { type: Base.upperCamelCase(Base.ref2name(s.$ref, this.doc)) }\n : this.toBaseSchema(s as OpenAPIV2.SchemaObject, enums),\n ),\n anyOf: anyOf?.map((s) =>\n Base.isRef(s)\n ? { type: Base.upperCamelCase(Base.ref2name(s.$ref, this.doc)) }\n : this.toBaseSchema(s as OpenAPIV2.SchemaObject, enums),\n ),\n oneOf: oneOf?.map((s) =>\n Base.isRef(s)\n ? { type: Base.upperCamelCase(Base.ref2name(s.$ref, this.doc)) }\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 } = 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 return {\n name,\n required,\n description,\n in: parameter.in as ParameterIn,\n schema: items\n ? ({\n type: type as string,\n items: items as OpenAPIV2.SchemaObject | undefined,\n } as ArrayTypeSchemaObject)\n : ({\n type: type as string,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const inBody = baseParameters.filter(\n (p) => p.in === \"body\" || p.in === \"formData\",\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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 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 ? [\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 schema = this.doc.components?.schemas?.[\n Base.ref2name(schema.$ref, this.doc)\n ] 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 schema = this.doc.components?.parameters?.[\n Base.ref2name(schema.$ref, this.doc)\n ] 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 schema = this.doc.components?.responses?.[\n Base.ref2name(schema.$ref, this.doc)\n ] 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 schema = this.doc.components?.requestBodies?.[\n Base.ref2name(schema.$ref, this.doc)\n ] 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 ? { type: Base.capitalize(Base.ref2name(s.$ref, this.doc)) }\n : this.toBaseSchema(s, enums),\n ),\n anyOf: anyOf?.map((s) =>\n Base.isRef(s)\n ? { type: Base.capitalize(Base.ref2name(s.$ref, this.doc)) }\n : this.toBaseSchema(s, enums),\n ),\n oneOf: oneOf?.map((s) =>\n Base.isRef(s)\n ? { type: Base.capitalize(Base.ref2name(s.$ref, this.doc)) }\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 ? { type: Base.upperCamelCase(Base.ref2name(s.$ref, this.doc)) }\n : this.toBaseSchema(s, enums),\n ),\n anyOf: anyOf?.map((s) =>\n Base.isRef(s)\n ? { type: Base.upperCamelCase(Base.ref2name(s.$ref, this.doc)) }\n : this.toBaseSchema(s, enums),\n ),\n oneOf: oneOf?.map((s) =>\n Base.isRef(s)\n ? { type: Base.upperCamelCase(Base.ref2name(s.$ref, this.doc)) }\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 () => {\n await execaCommand(\"npx tsc -b\");\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 } catch (error) {\n logger.error(`Failed to generate api ${name}`);\n console.error(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 try {\n await tsc();\n } catch (error) {\n logger.error(error);\n process.exit(1);\n }\n\n return {\n ...config,\n server: {\n ...(config.server ?? {}),\n proxy: proxies,\n },\n };\n },\n };\n}\n"],"mappings":"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","names":["SchemaType","NonArraySchemaType","ArraySchemaType","SchemaFormatType","ParameterIn","MediaTypes","HttpMethods","Adaptors","t","format","type","schema","t","t","SyntaxKind","format","type","responses","format","parameters","responses","parameters_","format","parameters","responses","parameters_","OpenAPIVersion","createScopedLogger","logger"]}
|
|
1
|
+
{"version":3,"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/openapi/index.ts","../src/openapi/V2.ts","../src/openapi/V3.ts","../src/openapi/V3_1.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 {\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","format","type","schema","t","t","SyntaxKind","format","type","responses","format","parameters","responses","parameters_","format","parameters","responses","parameters_","OpenAPIVersion","createScopedLogger","logger"]}
|