@moccona/apicodegen 0.0.4 → 0.0.7

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/bin/cli.cjs CHANGED
@@ -1,13 +1,12 @@
1
- #!/bin/env node
2
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("node:path");c=s(c,1);let l=require("commander"),u=require("fs-extra");u=s(u,1);let d=require("@moccona/logger"),f=require("undici"),p=require("typescript"),m=require("node:fs/promises"),h=require("prettier");var g={name:`@moccona/apicodegen`,version:`0.0.4`,description:``,type:`module`,engines:{node:`>=24`},bin:{apicodegen:`./bin/cli.cjs`},scripts:{dev:`tsdown --watch`,build:`tsdown`,test:`vitest --watch false`,prepublishOnly:`npm run build`,lint:`pnpm exec biome check src`,"lint:fix":`pnpm exec biome check --write src`,format:`pnpm exec biome format --write src`,debug:`node --inspect-brk=9229 bin/cli.cjs`,prepare:`husky`,typecheck:`tsc --noEmit`,version:`changeset version`,publish:`changeset publish`},exports:{"./package.json":`./package.json`,"./vite":{types:`./npm/vite/index.d.mts`,import:`./npm/vite/index.mjs`},"./*":{types:`./npm/*/index.d.mts`,import:`./npm/*/index.mjs`,require:`./npm/*/index.cjs`},".":{types:`./npm/index.d.mts`,import:`./npm/index.mjs`,require:`./npm/index.cjs`}},keywords:[`api-codegen`],repository:{type:`git`,url:`https://github.com/freemode1614/api-codegen`},author:`freemode`,license:`MIT`,publishConfig:{access:`public`},dependencies:{"@moccona/logger":`^0.0.2`,commander:`^13.1.0`,execa:`^9.5.2`,"fs-extra":`^11.3.0`,"openapi-types":`^12.1.3`,prettier:`^3.6.2`,undici:`^7.8.0`},devDependencies:{"@arethetypeswrong/core":`^0.18.2`,"@biomejs/biome":`^2.4.16`,"@changesets/cli":`^2.31.0`,"@types/fs-extra":`^11.0.4`,"@types/node":`^22.14.1`,axios:`^1.11.0`,"fast-glob":`^3.3.3`,husky:`^9.1.7`,"lint-staged":`^17.0.5`,prettier:`^3.6.2`,serve:`^14.2.4`,"serve-handler":`^6.1.7`,tsdown:`^0.22.1`,typescript:`^5.9.2`,vite:`^7.1.5`,"vite-tsconfig-paths":`^6.1.1`,vitest:`^3.2.4`},peerDependencies:{prettier:`^3`,typescript:`^5`,vite:`^7`},peerDependenciesMeta:{vite:{optional:!0}},"lint-staged":{"src/**/*":[`biome check --write`,`biome format --write`]},packageManager:`pnpm@10.9.0`};const _={APICODEGEN_SPEC:`spec`,APICODEGEN_OUTPUT:`output`,APICODEGEN_BASE_URL:`baseURL`,APICODEGEN_ADAPTOR:`adaptor`,APICODEGEN_VERBOSE:`verbose`,APICODEGEN_WATCH:`watch`,APICODEGEN_TYPE_CHECK:`typeCheck`};function v(){let e={};for(let[t,n]of Object.entries(_)){let r=process.env[t];if(r!==void 0)switch(n){case`verbose`:case`watch`:case`typeCheck`:e[n]=r===`true`||r===`1`;break;case`adaptor`:e[n]=r;break;default:e[n]=r}}return e}async function y(e){let t=c.default.extname(e).toLowerCase();try{if(t===`.json`||t===`.jsonc`){let t=await u.default.readFile(e,`utf-8`);return JSON.parse(t)}if(t===`.js`||t===`.cjs`||t===`.mjs`){let t=await import(e);return t.default||t}if(t===`.ts`){let t=await u.default.readFile(e,`utf-8`);try{return JSON.parse(t)}catch{let e=t.match(/export\s+default\s+(\{.+\})/s);if(e)return JSON.parse(e[1])}}let n=await u.default.readFile(e,`utf-8`);return JSON.parse(n)}catch(t){throw Error(`Failed to load config from ${e}: ${t}`)}}async function b(e){for(let t of[`apicodegen.config.json`,`apicodegen.config.js`,`apicodegen.config.mjs`,`.apicodegenrc`,`.apicodegenrc.json`,`.apicodegenrc.js`,`.apicodegenrc.mjs`]){let n=c.default.join(e,t);if(await u.default.pathExists(n))return n}let t=c.default.join(e,`package.json`);if(await u.default.pathExists(t))try{let n=JSON.parse(await u.default.readFile(t,`utf-8`));if(n.apicodegen&&typeof n.apicodegen==`string`)return c.default.resolve(e,n.apicodegen)}catch{}return null}function x(e,...t){let n={...e};for(let e of t)if(e)for(let[t,r]of Object.entries(e))r!==void 0&&(n[t]=r);return n}function ee(e){if(!e.spec)throw Error(`Missing required field: spec (OpenAPI spec file path or URL)`);return!0}async function S(e={}){let t=e.cwd||process.cwd(),n=e.cliOptions||{},r=v(),i={},a;if(e.configFile)a=c.default.resolve(t,e.configFile),i=await y(a);else{let e=await b(t);e&&(a=e,i=await y(e))}let o=c.default.join(t,`package.json`),s={};if(await u.default.pathExists(o))try{let e=JSON.parse(await u.default.readFile(o,`utf-8`));e.apicodegen&&typeof e.apicodegen==`object`&&(s=e.apicodegen)}catch{}let l=x({spec:``,output:`./output.ts`},r,s,i,n);ee(l);let d=e.name||l.baseURL||l.spec;return{...l,configFilePath:a,name:d}}function C(e){return{docURL:e.spec,output:e.output,adaptor:e.adaptor,baseURL:e.baseURL,importClientSource:e.importClientSource,verbose:e.verbose,requestOptions:e.requestOptions}}const w={SPEC_NOT_FOUND:`E_SPEC_NOT_FOUND`,SPEC_FETCH_FAILED:`E_SPEC_FETCH_FAILED`,SPEC_PARSE_FAILED:`E_SPEC_PARSE_FAILED`,OUTPUT_DIR_MISSING:`E_OUTPUT_DIR_MISSING`,CONFIG_INVALID:`E_CONFIG_INVALID`,VALIDATION_FAILED:`E_VALIDATION_FAILED`,GENERATION_FAILED:`E_GENERATION_FAILED`,TYPE_CHECK_FAILED:`E_TYPE_CHECK_FAILED`};var T=class e extends Error{code;location;line;column;path;suggestions;cause;constructor(t){super(t.message),this.name=`ApicodegenError`,this.code=t.code,this.location=t.location,this.line=t.line,this.column=t.column,this.path=t.path,this.suggestions=t.suggestions||[],this.cause=t.cause,Error.captureStackTrace&&Error.captureStackTrace(this,e)}toString(e=!1){let t=[];if(t.push(`\x1b[1;31mError [${this.code}]\x1b[0m ${this.message}`),this.location&&t.push(` \x1b[36m→ Location:\x1b[0m ${this.location}`),this.path&&t.push(` \x1b[36m→ Path:\x1b[0m ${this.path}`),this.line!==void 0){let e=` \x1b[36m→ Line:\x1b[0m ${this.line}`;this.column!==void 0&&(e+=`, Column: ${this.column}`),t.push(e)}if(this.suggestions.length>0)for(let e of this.suggestions)t.push(` \x1b[32m→ Suggestion:\x1b[0m ${e}`);if(e&&this.cause&&(t.push(`\n \x1b[90mOriginal Error:\x1b[0m ${this.cause.message}`),this.stack)){let e=this.stack.split(`
1
+ #!/usr/bin/env node
2
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("node:path");c=s(c,1);let l=require("commander"),u=require("fs-extra");u=s(u,1);let d=require("@moccona/logger"),f=require("undici"),p=require("typescript"),m=require("node:fs/promises"),h=require("prettier");var g={name:`@moccona/apicodegen`,version:`0.0.7`,description:``,type:`module`,engines:{node:`>=24`},bin:{apicodegen:`./bin/cli.cjs`},scripts:{dev:`tsdown --watch`,build:`tsdown`,test:`vitest --watch false`,prepublishOnly:`npm run build`,lint:`pnpm exec biome check src`,"lint:fix":`pnpm exec biome check --write src`,format:`pnpm exec biome format --write src`,debug:`node --inspect-brk=9229 bin/cli.cjs`,prepare:`husky`,typecheck:`tsc --noEmit`,version:`changeset version`,publish:`changeset publish`},exports:{"./package.json":`./package.json`,"./vite":{types:`./npm/vite/index.d.mts`,import:`./npm/vite/index.mjs`},"./*":{types:`./npm/*/index.d.mts`,import:`./npm/*/index.mjs`,require:`./npm/*/index.cjs`},".":{types:`./npm/index.d.mts`,import:`./npm/index.mjs`,require:`./npm/index.cjs`}},keywords:[`api-codegen`],repository:{type:`git`,url:`https://github.com/freemode1614/api-codegen`},author:`freemode`,license:`MIT`,publishConfig:{access:`public`},dependencies:{"@moccona/logger":`^0.0.2`,commander:`^13.1.0`,execa:`^9.5.2`,"fs-extra":`^11.3.0`,"openapi-types":`^12.1.3`,prettier:`^3.6.2`,undici:`^7.8.0`},devDependencies:{"@arethetypeswrong/core":`^0.18.2`,"@biomejs/biome":`^2.4.16`,"@changesets/cli":`^2.31.0`,"@types/fs-extra":`^11.0.4`,"@types/node":`^22.14.1`,axios:`^1.11.0`,"fast-glob":`^3.3.3`,husky:`^9.1.7`,"lint-staged":`^17.0.5`,prettier:`^3.6.2`,serve:`^14.2.4`,"serve-handler":`^6.1.7`,tsdown:`^0.22.1`,typescript:`^5.9.2`,vite:`^7.1.5`,"vite-tsconfig-paths":`^6.1.1`,vitest:`^3.2.4`},peerDependencies:{prettier:`^3`,typescript:`^5`,vite:`^7`},peerDependenciesMeta:{vite:{optional:!0}},"lint-staged":{"src/**/*":[`biome check --write`,`biome format --write`]},packageManager:`pnpm@10.9.0`};const _={APICODEGEN_SPEC:`spec`,APICODEGEN_OUTPUT:`output`,APICODEGEN_BASE_URL:`baseURL`,APICODEGEN_ADAPTOR:`adaptor`,APICODEGEN_VERBOSE:`verbose`,APICODEGEN_WATCH:`watch`,APICODEGEN_TYPE_CHECK:`typeCheck`};function ee(){let e={};for(let[t,n]of Object.entries(_)){let r=process.env[t];if(r!==void 0)switch(n){case`verbose`:case`watch`:case`typeCheck`:e[n]=r===`true`||r===`1`;break;case`adaptor`:e[n]=r;break;default:e[n]=r}}return e}async function v(e){let t=c.default.extname(e).toLowerCase();try{if(t===`.json`||t===`.jsonc`){let t=await u.default.readFile(e,`utf-8`);return JSON.parse(t)}if(t===`.js`||t===`.cjs`||t===`.mjs`){let t=await import(e);return t.default||t}if(t===`.ts`){let t=await u.default.readFile(e,`utf-8`);try{return JSON.parse(t)}catch{let e=t.match(/export\s+default\s+(\{.+\})/s);if(e)return JSON.parse(e[1])}}let n=await u.default.readFile(e,`utf-8`);return JSON.parse(n)}catch(t){throw Error(`Failed to load config from ${e}: ${t}`)}}async function y(e){for(let t of[`apicodegen.config.json`,`apicodegen.config.js`,`apicodegen.config.mjs`,`.apicodegenrc`,`.apicodegenrc.json`,`.apicodegenrc.js`,`.apicodegenrc.mjs`]){let n=c.default.join(e,t);if(await u.default.pathExists(n))return n}let t=c.default.join(e,`package.json`);if(await u.default.pathExists(t))try{let n=JSON.parse(await u.default.readFile(t,`utf-8`));if(n.apicodegen&&typeof n.apicodegen==`string`)return c.default.resolve(e,n.apicodegen)}catch{}return null}function b(e,...t){let n={...e};for(let e of t)if(e)for(let[t,r]of Object.entries(e))r!==void 0&&(n[t]=r);return n}function x(e){if(!e.spec)throw Error(`Missing required field: spec (OpenAPI spec file path or URL)`);return!0}async function te(e={}){let t=e.cwd||process.cwd(),n=e.cliOptions||{},r=ee(),i={},a;if(e.configFile)a=c.default.resolve(t,e.configFile),i=await v(a);else{let e=await y(t);e&&(a=e,i=await v(e))}let o=c.default.join(t,`package.json`),s={};if(await u.default.pathExists(o))try{let e=JSON.parse(await u.default.readFile(o,`utf-8`));e.apicodegen&&typeof e.apicodegen==`object`&&(s=e.apicodegen)}catch{}let l=b({spec:``,output:`./output.ts`},r,s,i,n);x(l);let d=e.name||l.baseURL||l.spec;return{...l,configFilePath:a,name:d}}function S(e){return{docURL:e.spec,output:e.output,adaptor:e.adaptor,baseURL:e.baseURL,importClientSource:e.importClientSource,verbose:e.verbose,requestOptions:e.requestOptions}}const C={SPEC_NOT_FOUND:`E_SPEC_NOT_FOUND`,SPEC_FETCH_FAILED:`E_SPEC_FETCH_FAILED`,SPEC_PARSE_FAILED:`E_SPEC_PARSE_FAILED`,OUTPUT_DIR_MISSING:`E_OUTPUT_DIR_MISSING`,CONFIG_INVALID:`E_CONFIG_INVALID`,VALIDATION_FAILED:`E_VALIDATION_FAILED`,GENERATION_FAILED:`E_GENERATION_FAILED`,TYPE_CHECK_FAILED:`E_TYPE_CHECK_FAILED`};var w=class e extends Error{code;location;line;column;path;suggestions;cause;constructor(t){super(t.message),this.name=`ApicodegenError`,this.code=t.code,this.location=t.location,this.line=t.line,this.column=t.column,this.path=t.path,this.suggestions=t.suggestions||[],this.cause=t.cause,Error.captureStackTrace&&Error.captureStackTrace(this,e)}toString(e=!1){let t=[];if(t.push(`\x1b[1;31mError [${this.code}]\x1b[0m ${this.message}`),this.location&&t.push(` \x1b[36m→ Location:\x1b[0m ${this.location}`),this.path&&t.push(` \x1b[36m→ Path:\x1b[0m ${this.path}`),this.line!==void 0){let e=` \x1b[36m→ Line:\x1b[0m ${this.line}`;this.column!==void 0&&(e+=`, Column: ${this.column}`),t.push(e)}if(this.suggestions.length>0)for(let e of this.suggestions)t.push(` \x1b[32m→ Suggestion:\x1b[0m ${e}`);if(e&&this.cause&&(t.push(`\n \x1b[90mOriginal Error:\x1b[0m ${this.cause.message}`),this.stack)){let e=this.stack.split(`
3
3
  `).slice(1).join(`
4
4
  `);t.push(`\x1b[90m${e}\x1b[0m`)}return t.join(`
5
- `)}toJSON(){return{name:this.name,code:this.code,message:this.message,location:this.location,line:this.line,column:this.column,path:this.path,suggestions:this.suggestions,cause:this.cause?.message}}};const E={specNotFound(e,t){return new T({code:w.SPEC_NOT_FOUND,message:`OpenAPI spec file not found`,location:e,suggestions:[`Check if the file exists using 'ls -la'`,`Use --spec to provide the correct path`,`For remote specs, ensure the URL is accessible`],cause:t})},specFetchFailed(e,t,n){let r=t?`Failed to fetch OpenAPI spec (HTTP ${t})`:`Failed to fetch OpenAPI spec from URL`;return new T({code:w.SPEC_FETCH_FAILED,message:r,location:e,suggestions:[`Check if the URL is accessible in a browser`,`Download the spec file locally and use the local path`,`Verify CORS settings if fetching from a different origin`],cause:n})},specParseFailed(e,t,n,r){return new T({code:w.SPEC_PARSE_FAILED,message:`Failed to parse OpenAPI spec (invalid JSON or YAML)`,location:e,line:t,column:n,suggestions:[`Validate JSON syntax using jsonlint.com`,`For YAML specs, ensure proper indentation`,`Check for trailing commas or unquoted special characters`],cause:r})},outputDirMissing(e,t){return new T({code:w.OUTPUT_DIR_MISSING,message:`Output directory does not exist`,location:e,suggestions:[`Create the directory: mkdir -p $(dirname <output>)`,`Check if the path is correct`],cause:t})},configInvalid(e,t){return new T({code:w.CONFIG_INVALID,message:`Invalid configuration file`,location:e,suggestions:[`Validate JSON syntax in the config file`,`Check for required fields (spec, output)`],cause:t})},validationFailed(e,t,n){return new T({code:w.VALIDATION_FAILED,message:`OpenAPI spec validation failed`,location:e,path:t,suggestions:[`Check OpenAPI spec structure at the specified path`,`Ensure all required fields are present`,`Validate using swagger.io editor`],cause:n})},generationFailed(e){return new T({code:w.GENERATION_FAILED,message:`Code generation failed`,suggestions:[`Check for unsupported OpenAPI features`,`Ensure spec follows OpenAPI 2.0, 3.0, or 3.1 specification`,`Use --verbose for more details`],cause:e})},typeCheckFailed(e,t,n){return new T({code:w.TYPE_CHECK_FAILED,message:`TypeScript type check failed`,location:e,suggestions:[`Review type errors above`,`Check for schema inconsistencies`,`Update generated types or fix source schema`],cause:n})},missingRequiredField(e,t){return new T({code:w.VALIDATION_FAILED,message:`Missing required field: ${e}`,path:t,suggestions:[`Add the '${e}' field to your configuration`]})}};function te(e,t){return e instanceof T?e:e instanceof Error?new T({code:t?.code||w.GENERATION_FAILED,message:t?.message||e.message,location:t?.location,suggestions:t?.suggestions,cause:e}):new T({code:t?.code||w.GENERATION_FAILED,message:String(e),suggestions:t?.suggestions})}function D(e){return e instanceof T}var O=class{};const k=new Set(`break.case.catch.class.const.continue.debugger.default.delete.do.else.enum.export.extends.false.finally.for.function.if.import.in.instanceof.new.null.return.super.switch.this.throw.true.try.typeof.var.void.while.with.as.implements.interface.let.package.private.protected.public.static.yield.abstract.any.async.await.constructor.declare.from.get.is.module.namespace.never.require.set.type.unknown.readonly.of.asserts.infer.keyof.boolean.number.string.symbol.object.undefined.bigint`.split(`.`));let A=function(e){return e.JSON=`application/json`,e.TEXT=`text`,e.IMAGE=`image`,e.AUDIO=`audio`,e.VIDEO=`video`,e}({}),j=function(e){return e.GET=`get`,e.PUT=`put`,e.POST=`post`,e.DELETE=`delete`,e.OPTIONS=`options`,e.HEAD=`head`,e.PATCH=`patch`,e.TRACE=`trace`,e}({});var M=class e{constructor(){if(new.target===e)throw Error(`Cannot instantiate abstract class`)}static ref2name(t,n){let r=t.replace(/^#/,``).split(`/`).filter(Boolean);if(!n)return r.slice(-1)[0];let i=n,a=``;for(let e of r){let t=e.replaceAll(`~1`,`/`);i=i[t],a=t}return i?i.$ref?e.ref2name(i.$ref,n):a:`unknown`}static pathToFnName(t,n,r=``){return e.normalize(e.camelCase(e.normalize(t)))+(n?e.capitalize(e.upperCamelCase(`using_${n}`)):``)}static normalize(e){return k.has(e)&&(e+=`_`),e.replace(/[/\-_{}():\s`,*<>$#.]/gm,`_`).replace(/^\d./gm,``).replaceAll(`...`,``)}static capitalize(e){return e=e.trim(),`${e.charAt(0).toUpperCase()}${e.slice(1)}`}static camelCase(t){return t=t.trim(),t.split(`_`).filter(Boolean).map((t,n)=>n===0?t:e.capitalize(t)).join(``)}static upperCamelCase(t){return e.normalize(t).replaceAll(`...`,``).split(`_`).filter(Boolean).map(e.capitalize).join(``)}static async fetchDoc(e,t={}){let{body:n,statusCode:r}=await(0,f.request)(e,{method:`GET`,dispatcher:new f.Agent({connect:{rejectUnauthorized:!1}}),...t});if(r>=400)throw Error(`Failed to fetch OpenAPI documentation from ${e}: HTTP ${r}`);try{return n.json()}catch(t){throw Error(`Failed to parse JSON response from ${e}: ${t instanceof Error?t.message:String(t)}`)}}static getMediaType(e){return Object.values(A).find(t=>e.includes(t))}static isValidEnumType(t){return t.type!==`boolean`&&!e.isBooleanEnum(t)}static isBooleanEnum(e){return e.type===`boolean`||!!e.enum?.some(e=>typeof e==`boolean`)}static isSameEnum(e,t){return e.enum.length===t.enum.length&&e.enum.sort().every((e,n)=>e===t.enum.sort()[n])}static uniqueEnums(e){let t=new Map;for(let n of e){let e=t.get(n.name);if(e)for(let t of n.enum)e.add(t);else t.set(n.name,new Set(n.enum))}return Array.from(t.entries()).map(([e,t])=>({name:e,enum:Array.from(t)}))}static findSameSchema(t,n){return n.find(n=>e.isSameEnum(n,t))}static isRef(e){return typeof e==`object`&&!!e&&`$ref`in e&&typeof e.$ref==`string`}},ne=class{enums=[];schemas={};parameters={};responses={};requestBodies={};apis={};docURL;baseURL;output;requestOptions;importClientSource;constructor(e,t){this.docURL=e.docURL,this.baseURL=e.baseURL??``,this.output=e.output??`.`,this.requestOptions=e.requestOptions??{},this.importClientSource=e.importClientSource??``;let{enums:n,schemas:r,requestBodies:i,responses:a,parameters:o,apis:s}=this.parse(t);this.enums=n,this.schemas=r,this.responses=a,this.parameters=o,this.requestBodies=i,this.apis=s}},N=class e{static toCode(e){if(e.length===0)return`// No api declaration found.`;let t=p.factory.createSourceFile(e,p.factory.createToken(p.SyntaxKind.EndOfFileToken),p.NodeFlags.None);return(0,p.createPrinter)().printFile(t)}static async write(e,t){try{await(0,m.writeFile)(t,e)}catch(e){console.error(e)}}static toUrlTemplate(e,t,n=``){let r=t.filter(e=>e.in===`query`);if(r.length>0){let t=r.map((e,t)=>`${t===0?`?`:`&`}${encodeURIComponent(e.name)}={${M.camelCase(M.normalize(e.name))}}`).join(``);e+=t}let i=e.replaceAll(`{`,"${").split(`$`).filter(Boolean);return i.length===1?p.factory.createNoSubstitutionTemplateLiteral(n+e):p.factory.createTemplateExpression(p.factory.createTemplateHead(n+i[0]),i.slice(1).map((e,t)=>{let n=/^{(.+)}(.+)?/gm.exec(e),r=t===i.length-2;if(!n)throw Error(`Invalid path segment: ${e}`);return p.factory.createTemplateSpan(p.factory.createIdentifier(n[1]),r?p.factory.createTemplateTail(n[2]||``):p.factory.createTemplateMiddle(n[2]))}))}static addComments(e,t){if(!Array.isArray(t)||t.filter(Boolean).length===0)return;let n=`*
6
- `+t.map(e=>e.tag?` @${e.tag} ${e.comment??``}`:` ${e.comment}`).join(`
5
+ `)}toJSON(){return{name:this.name,code:this.code,message:this.message,location:this.location,line:this.line,column:this.column,path:this.path,suggestions:this.suggestions,cause:this.cause?.message}}};const T={specNotFound(e,t){return new w({code:C.SPEC_NOT_FOUND,message:`OpenAPI spec file not found`,location:e,suggestions:[`Check if the file exists using 'ls -la'`,`Use --spec to provide the correct path`,`For remote specs, ensure the URL is accessible`],cause:t})},specFetchFailed(e,t,n){let r=t?`Failed to fetch OpenAPI spec (HTTP ${t})`:`Failed to fetch OpenAPI spec from URL`;return new w({code:C.SPEC_FETCH_FAILED,message:r,location:e,suggestions:[`Check if the URL is accessible in a browser`,`Download the spec file locally and use the local path`,`Verify CORS settings if fetching from a different origin`],cause:n})},specParseFailed(e,t,n,r){return new w({code:C.SPEC_PARSE_FAILED,message:`Failed to parse OpenAPI spec (invalid JSON or YAML)`,location:e,line:t,column:n,suggestions:[`Validate JSON syntax using jsonlint.com`,`For YAML specs, ensure proper indentation`,`Check for trailing commas or unquoted special characters`],cause:r})},outputDirMissing(e,t){return new w({code:C.OUTPUT_DIR_MISSING,message:`Output directory does not exist`,location:e,suggestions:[`Create the directory: mkdir -p $(dirname <output>)`,`Check if the path is correct`],cause:t})},configInvalid(e,t){return new w({code:C.CONFIG_INVALID,message:`Invalid configuration file`,location:e,suggestions:[`Validate JSON syntax in the config file`,`Check for required fields (spec, output)`],cause:t})},validationFailed(e,t,n){return new w({code:C.VALIDATION_FAILED,message:`OpenAPI spec validation failed`,location:e,path:t,suggestions:[`Check OpenAPI spec structure at the specified path`,`Ensure all required fields are present`,`Validate using swagger.io editor`],cause:n})},generationFailed(e){return new w({code:C.GENERATION_FAILED,message:`Code generation failed`,suggestions:[`Check for unsupported OpenAPI features`,`Ensure spec follows OpenAPI 2.0, 3.0, or 3.1 specification`,`Use --verbose for more details`],cause:e})},typeCheckFailed(e,t,n){return new w({code:C.TYPE_CHECK_FAILED,message:`TypeScript type check failed`,location:e,suggestions:[`Review type errors above`,`Check for schema inconsistencies`,`Update generated types or fix source schema`],cause:n})},missingRequiredField(e,t){return new w({code:C.VALIDATION_FAILED,message:`Missing required field: ${e}`,path:t,suggestions:[`Add the '${e}' field to your configuration`]})}};function E(e,t){return e instanceof w?e:e instanceof Error?new w({code:t?.code||C.GENERATION_FAILED,message:t?.message||e.message,location:t?.location,suggestions:t?.suggestions,cause:e}):new w({code:t?.code||C.GENERATION_FAILED,message:String(e),suggestions:t?.suggestions})}function D(e){return e instanceof w}var O=class{};const k=new Set(`break.case.catch.class.const.continue.debugger.default.delete.do.else.enum.export.extends.false.finally.for.function.if.import.in.instanceof.new.null.return.super.switch.this.throw.true.try.typeof.var.void.while.with.as.implements.interface.let.package.private.protected.public.static.yield.abstract.any.async.await.constructor.declare.from.get.is.module.namespace.never.require.set.type.unknown.readonly.of.asserts.infer.keyof.boolean.number.string.symbol.object.undefined.bigint`.split(`.`));let A=function(e){return e.JSON=`application/json`,e.TEXT=`text`,e.IMAGE=`image`,e.AUDIO=`audio`,e.VIDEO=`video`,e}({}),j=function(e){return e.GET=`get`,e.PUT=`put`,e.POST=`post`,e.DELETE=`delete`,e.OPTIONS=`options`,e.HEAD=`head`,e.PATCH=`patch`,e.TRACE=`trace`,e}({});var M=class e{constructor(){if(new.target===e)throw Error(`Cannot instantiate abstract class`)}static ref2name(t,n){let r=t.replace(/^#/,``).split(`/`).filter(Boolean);if(!n)return r.slice(-1)[0];let i=n,a=``;for(let e of r){let t=e.replaceAll(`~1`,`/`);i=i[t],a=t}return i?i.$ref?e.ref2name(i.$ref,n):a:`unknown`}static pathToFnName(t,n,r=``){return e.normalize(e.camelCase(e.normalize(t)))+(n?e.capitalize(e.upperCamelCase(`using_${n}`)):``)}static normalize(e){return k.has(e)&&(e+=`_`),e.replace(/[/\-_{}():\s`,*<>$#.]/gm,`_`).replace(/^\d./gm,``).replaceAll(`...`,``)}static capitalize(e){return e=e.trim(),`${e.charAt(0).toUpperCase()}${e.slice(1)}`}static camelCase(t){t=t.trim();let n=t.split(`_`).filter(Boolean);for(;n[0]?.match(/^\d/);)n.shift();return n.map((t,n)=>n===0?t:e.capitalize(t)).join(``)}static upperCamelCase(t){return e.normalize(t).replaceAll(`...`,``).split(`_`).filter(Boolean).map(e.capitalize).join(``)}static async fetchDoc(e,t={}){let{body:n,statusCode:r}=await(0,f.request)(e,{method:`GET`,dispatcher:new f.Agent({connect:{rejectUnauthorized:!1}}),...t});if(r>=400)throw Error(`Failed to fetch OpenAPI documentation from ${e}: HTTP ${r}`);try{return n.json()}catch(t){throw Error(`Failed to parse JSON response from ${e}: ${t instanceof Error?t.message:String(t)}`)}}static getMediaType(e){return Object.values(A).find(t=>e.includes(t))}static isValidEnumType(t){return t.type!==`boolean`&&!e.isBooleanEnum(t)}static isBooleanEnum(e){return e.type===`boolean`||!!e.enum?.some(e=>typeof e==`boolean`)}static isSameEnum(e,t){return e.enum.length===t.enum.length&&e.enum.sort().every((e,n)=>e===t.enum.sort()[n])}static uniqueEnums(e){let t=new Map;for(let n of e){let e=t.get(n.name);if(e)for(let t of n.enum)e.add(t);else t.set(n.name,new Set(n.enum))}return Array.from(t.entries()).map(([e,t])=>({name:e,enum:Array.from(t)}))}static findSameSchema(t,n){return n.find(n=>e.isSameEnum(n,t))}static isRef(e){return typeof e==`object`&&!!e&&`$ref`in e&&typeof e.$ref==`string`}},ne=class{enums=[];schemas={};parameters={};responses={};requestBodies={};apis={};docURL;baseURL;output;requestOptions;importClientSource;constructor(e,t){this.docURL=e.docURL,this.baseURL=e.baseURL??``,this.output=e.output??`.`,this.requestOptions=e.requestOptions??{},this.importClientSource=e.importClientSource??``;let{enums:n,schemas:r,requestBodies:i,responses:a,parameters:o,apis:s}=this.parse(t);this.enums=n,this.schemas=r,this.responses=a,this.parameters=o,this.requestBodies=i,this.apis=s}},N=class e{static toCode(e){if(e.length===0)return`// No api declaration found.`;let t=p.factory.createSourceFile(e,p.factory.createToken(p.SyntaxKind.EndOfFileToken),p.NodeFlags.None);return(0,p.createPrinter)().printFile(t)}static async write(e,t){try{await(0,m.writeFile)(t,e)}catch(e){console.error(e)}}static toUrlTemplate(e,t,n=``){let r=t.filter(e=>e.in===`query`);if(r.length>0){let t=r.map((e,t)=>`${t===0?`?`:`&`}${encodeURIComponent(e.name)}={${M.camelCase(M.normalize(e.name))}}`).join(``);e+=t}let i=e.replaceAll(`{`,"${").split(`$`).filter(Boolean);return i.length===1?p.factory.createNoSubstitutionTemplateLiteral(n+e):p.factory.createTemplateExpression(p.factory.createTemplateHead(n+i[0]),i.slice(1).map((e,t)=>{let n=/^{(.+)}(.+)?/gm.exec(e),r=t===i.length-2;if(!n)throw Error(`Invalid path segment: ${e}`);return p.factory.createTemplateSpan(p.factory.createIdentifier(n[1]),r?p.factory.createTemplateTail(n[2]||``):p.factory.createTemplateMiddle(n[2]))}))}static addComments(e,t){if(!Array.isArray(t)||t.filter(Boolean).length===0)return;let n=t.map(e=>e.tag===`returns`?`* @returns {${e.type}} ${e.comment??``}`:e.tag===`param`?e.comment?`* @param ${e.paramName} - ${e.comment}`:`* @param ${e.paramName}`:e.tag?`* @${e.tag} ${e.comment??``}`:`* ${e.comment}`).join(`
7
6
  `).trim()+`
8
- `;(0,p.addSyntheticLeadingComment)(e,p.SyntaxKind.MultiLineCommentTrivia,n,!0)}static isBinarySchema(t){if(t.type===`array`){let n=t;return e.isBinarySchema(n.items)}let n=t;return n.format===`blob`||n.format===`binary`||n.type===`file`}static toRequestBodyTypeNode(t){return p.factory.createParameterDeclaration(void 0,void 0,p.factory.createIdentifier(`req`),void 0,e.toTypeNode(t))}static toTypeNode(t){let{type:n,ref:r}=t;if(r){let e=M.ref2name(r);return p.factory.createTypeReferenceNode(p.factory.createIdentifier(e===`unknown`?e:M.upperCamelCase(e)))}switch(n){case`array`:{let{items:n}=t;return p.factory.createArrayTypeNode(e.toTypeNode(n))}case`object`:{let n=Object.keys(t.properties??{}).length;if(!t.properties||n===0)return p.factory.createTypeReferenceNode(p.factory.createIdentifier(`Record`),[p.factory.createToken(p.SyntaxKind.StringKeyword),p.factory.createToken(p.SyntaxKind.UnknownKeyword)]);let r=Object.keys(t.properties);return p.factory.createTypeLiteralNode(r.map(n=>{let r=t.properties[n];return p.factory.createPropertySignature(void 0,p.factory.createStringLiteral(n),t.required||t.ref||e.isBinarySchema(t)?void 0:p.factory.createToken(p.SyntaxKind.QuestionToken),e.toTypeNode(r))}))}case`integer`:case`number`:return t.enum?p.factory.createUnionTypeNode(t.enum.map(e=>p.factory.createLiteralTypeNode(p.factory.createNumericLiteral(e)))):p.factory.createToken(p.SyntaxKind.NumberKeyword);case`boolean`:return p.factory.createToken(p.SyntaxKind.BooleanKeyword);case`file`:return p.factory.createTypeReferenceNode(p.factory.createIdentifier(`Blob`));default:{let{format:n,oneOf:r,allOf:i,anyOf:a,type:o,enum:s}=t;switch(n){case`number`:return p.factory.createToken(p.SyntaxKind.NumberKeyword);case`string`:return p.factory.createToken(p.SyntaxKind.StringKeyword);case`boolean`:return p.factory.createToken(p.SyntaxKind.BooleanKeyword);case`blob`:case`binary`:return p.factory.createTypeReferenceNode(p.factory.createIdentifier(`Blob`));default:}if(s)return p.factory.createUnionTypeNode(s.map(e=>p.factory.createLiteralTypeNode(p.factory.createStringLiteral(e))));if(o===`string`)return p.factory.createToken(p.SyntaxKind.StringKeyword);if(r)return p.factory.createUnionTypeNode(r.map(t=>e.toTypeNode(t)));if(a)return p.factory.createUnionTypeNode(a.map(t=>e.toTypeNode(t)));if(i)return p.factory.createIntersectionTypeNode(i.map(t=>e.toTypeNode(t)));if(o&&typeof o==`string`)return p.factory.createTypeReferenceNode(o!==`unknown`&&o!==`null`?p.factory.createIdentifier(M.upperCamelCase(o)):o)}}return p.factory.createToken(p.SyntaxKind.UnknownKeyword)}static toDeclarationNodes(t){let n=[],r=[],i=[];for(let a of t)if(a.ref){let e=M.ref2name(a.ref);i.push(p.factory.createParameterDeclaration(void 0,void 0,p.factory.createIdentifier(M.camelCase(M.normalize(e))),void 0,p.factory.createTypeReferenceNode(p.factory.createIdentifier(M.upperCamelCase(M.normalize(e)))),void 0))}else{let{name:t,schema:i,required:o}=a;n.push(p.factory.createBindingElement(void 0,void 0,p.factory.createIdentifier(M.camelCase(M.normalize(t))))),r.push(p.factory.createPropertySignature([],p.factory.createIdentifier(M.camelCase(M.normalize(t))),o?void 0:p.factory.createToken(p.SyntaxKind.QuestionToken),i?e.toTypeNode(i):p.factory.createToken(p.SyntaxKind.UnknownKeyword)))}return n.length>0?[p.factory.createParameterDeclaration(void 0,void 0,p.factory.createObjectBindingPattern(n),void 0,p.factory.createTypeLiteralNode(r),void 0),...i]:i}static toFormDataStatement(t,n){let r=[],i=p.factory.createVariableStatement(void 0,p.factory.createVariableDeclarationList([p.factory.createVariableDeclaration(p.factory.createIdentifier(`fd`),void 0,void 0,p.factory.createNewExpression(p.factory.createIdentifier(`FormData`),void 0,[]))],p.NodeFlags.Const));return r.push(i),t.forEach(e=>{r.push(p.factory.createExpressionStatement(p.factory.createBinaryExpression(p.factory.createIdentifier(e.name),p.factory.createToken(p.SyntaxKind.AmpersandAmpersandToken),p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`fd`),p.factory.createIdentifier(`append`)),void 0,[p.factory.createStringLiteral(e.name),p.factory.createIdentifier(e.name)]))))}),n&&n.type===`object`&&n.properties&&Object.keys(n.properties).length!==0&&Object.keys(n.properties).forEach(t=>{let i=n.properties[t];i.type===`array`&&e.isBinarySchema(i)?r.push(p.factory.createForOfStatement(void 0,p.factory.createVariableDeclarationList([p.factory.createVariableDeclaration(`file`)],p.NodeFlags.Const),p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t)),p.factory.createBlock([p.factory.createExpressionStatement(p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`fd`),p.factory.createIdentifier(`append`)),[],[p.factory.createStringLiteral(t),p.factory.createIdentifier(`file`),p.factory.createPropertyAccessExpression(p.factory.createAsExpression(p.factory.createIdentifier(`file`),p.factory.createTypeReferenceNode(p.factory.createIdentifier(`File`),void 0)),p.factory.createIdentifier(`name`))]))]))):i.required?r.push(p.factory.createExpressionStatement(p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`fd`),p.factory.createIdentifier(`append`)),void 0,[p.factory.createStringLiteral(t),i.type===`string`?p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t)):p.factory.createCallExpression(p.factory.createIdentifier(`String`),void 0,[p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t))])]))):r.push(p.factory.createExpressionStatement(p.factory.createBinaryExpression(p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t)),p.factory.createToken(p.SyntaxKind.AmpersandAmpersandToken),p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`fd`),p.factory.createIdentifier(`append`)),void 0,[p.factory.createStringLiteral(t),i.type===`string`?p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t)):p.factory.createCallExpression(p.factory.createIdentifier(`String`),void 0,[p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t))])]))))}),r}static bodyBlock(t,n,r,i,a,o){let s=i&&[`multipart/form-data`,`application/x-www-form-urlencoded`].includes(i.type),c=a?.type===`application/json`,l=i?.schema&&i.schema.type===`array`&&e.isBinarySchema(i.schema),u=r.filter(t=>t.in===`formData`||t.schema&&e.isBinarySchema(t.schema)),d=r.filter(e=>!u.includes(e)),f=i?.schema&&`properties`in i.schema&&Object.values(i.schema?.properties??{}).some(t=>e.isBinarySchema(t)),m=r.some(t=>t?.schema&&e.isBinarySchema(t.schema)),h=s||l||m||f||u.length>0;return p.factory.createBlock([...h?e.toFormDataStatement(u,i?.schema):[],...o.client(t,n,d,i,a,o,h,c)])}static schemaToStatemets(t,n,r){let i=[],{apis:a,schemas:o={},enums:s}=t,c=[];for(let e of s)c.push(M.upperCamelCase(e.name)),i.push(p.factory.createEnumDeclaration([p.factory.createToken(p.SyntaxKind.ExportKeyword)],p.factory.createIdentifier(M.upperCamelCase(e.name)),e.enum.map(e=>p.factory.createEnumMember(p.factory.createStringLiteral(typeof e==`string`?e:`${e}_`),typeof e==`string`?p.factory.createStringLiteral(e):p.factory.createNumericLiteral(e)))));for(let t in o)if(Object.hasOwn(o,t)&&!c.includes(M.upperCamelCase(t))){let n=o[t];i.push(p.factory.createTypeAliasDeclaration([p.factory.createModifier(p.SyntaxKind.ExportKeyword)],p.factory.createIdentifier(M.upperCamelCase(t)),void 0,e.toTypeNode(n)))}for(let t in a){let o=a[t];for(let a of o){let{method:o,operationId:s,requestBody:c=[],responses:l=[],summary:u,deprecated:d,description:f}=a,{parameters:m=[]}=a;m=m.filter(e=>e.in!==`cookie`),c.length===0&&c.push({type:`application/json`});let h=c.length>1;for(let a of c){let c=p.factory.createFunctionDeclaration([p.factory.createModifier(p.SyntaxKind.ExportKeyword),p.factory.createModifier(p.SyntaxKind.AsyncKeyword)],void 0,M.pathToFnName(t,o,s)+(h?M.capitalize(a.type.split(`/`)[1]):``),void 0,[...m.length>0?e.toDeclarationNodes(m):[],...a?.schema?[e.toRequestBodyTypeNode(a.schema)]:[]].filter(Boolean),void 0,e.bodyBlock(r.baseURL+t,o,m,a,l[0],n));e.addComments(c,[f&&{comment:f},u&&{comment:u},d&&{tag:`deprecated`}].filter(Boolean)),i.push(c)}}}return i}static async prettier(e){return await(0,h.format)(e,{parser:`typescript`})}static async genCode(t,n,r){let{importClientSource:i}=n,a=e.schemaToStatemets(t,r,{baseURL:n.baseURL??``}),o=e.toCode(a);return i&&(o=i+`
7
+ `;(0,p.addSyntheticLeadingComment)(e,p.SyntaxKind.MultiLineCommentTrivia,n,!0)}static isBinarySchema(t){if(t.type===`array`){let n=t;return e.isBinarySchema(n.items)}let n=t;return n.format===`blob`||n.format===`binary`||n.type===`file`}static schemaToTypeString(t){if(t.type===`array`){let n=t;return n.items?`${e.schemaToTypeString(n.items)}[]`:`unknown`}let n=t;return t.type===`string`?`string`:t.type===`number`||t.type===`integer`?`number`:t.type===`boolean`?`boolean`:t.type===`object`||t.properties?`object`:n.format===`binary`||n.type===`file`||n.format===`blob`?`Blob`:n.ref?n.ref:`unknown`}static generateParamTags(t,n){let r=[];for(let n of t){let t=M.camelCase(M.normalize(n.name)),i=`unknown`;n.schema&&(i=e.schemaToTypeString(n.schema));let a=n.required===!1;r.push({tag:`param`,paramName:t,type:`${i}${a?` | undefined`:``}`,comment:n.description??``})}if(n?.schema&&`properties`in n.schema){let t=n.schema.properties,i=n.schema.required,a=Array.isArray(i)?i:[];for(let[n,i]of Object.entries(t??{})){let t=`req.${n}`,o=e.schemaToTypeString(i),s=!a.includes(n);r.push({tag:`param`,paramName:t,type:`${o}${s?` | undefined`:``}`,comment:i.description??``})}}return r}static toRequestBodyTypeNode(t){return p.factory.createParameterDeclaration(void 0,void 0,p.factory.createIdentifier(`req`),void 0,e.toTypeNode(t))}static toTypeNode(t){let{type:n,ref:r}=t;if(r){let e=M.ref2name(r);return p.factory.createTypeReferenceNode(p.factory.createIdentifier(e===`unknown`?e:M.upperCamelCase(e)))}switch(n){case`array`:{let{items:n}=t;return p.factory.createArrayTypeNode(e.toTypeNode(n))}case`object`:{let n=Object.keys(t.properties??{}).length;if(!t.properties||n===0)return p.factory.createTypeReferenceNode(p.factory.createIdentifier(`Record`),[p.factory.createToken(p.SyntaxKind.StringKeyword),p.factory.createToken(p.SyntaxKind.UnknownKeyword)]);let r=Object.keys(t.properties);return p.factory.createTypeLiteralNode(r.map(n=>{let r=t.properties[n];return p.factory.createPropertySignature(void 0,p.factory.createStringLiteral(n),t.required||t.ref||e.isBinarySchema(t)?void 0:p.factory.createToken(p.SyntaxKind.QuestionToken),e.toTypeNode(r))}))}case`integer`:case`number`:return t.enum?p.factory.createUnionTypeNode(t.enum.map(e=>p.factory.createLiteralTypeNode(p.factory.createNumericLiteral(e)))):p.factory.createToken(p.SyntaxKind.NumberKeyword);case`boolean`:return p.factory.createToken(p.SyntaxKind.BooleanKeyword);case`file`:return p.factory.createTypeReferenceNode(p.factory.createIdentifier(`Blob`));default:{let{format:n,oneOf:r,allOf:i,anyOf:a,type:o,enum:s}=t;switch(n){case`number`:return p.factory.createToken(p.SyntaxKind.NumberKeyword);case`string`:return p.factory.createToken(p.SyntaxKind.StringKeyword);case`boolean`:return p.factory.createToken(p.SyntaxKind.BooleanKeyword);case`blob`:case`binary`:return p.factory.createTypeReferenceNode(p.factory.createIdentifier(`Blob`));default:}if(s)return p.factory.createUnionTypeNode(s.map(e=>p.factory.createLiteralTypeNode(p.factory.createStringLiteral(e))));if(o===`string`)return p.factory.createToken(p.SyntaxKind.StringKeyword);if(r)return p.factory.createUnionTypeNode(r.map(t=>e.toTypeNode(t)));if(a)return p.factory.createUnionTypeNode(a.map(t=>e.toTypeNode(t)));if(i)return p.factory.createIntersectionTypeNode(i.map(t=>e.toTypeNode(t)));if(o&&typeof o==`string`)return p.factory.createTypeReferenceNode(o!==`unknown`&&o!==`null`?p.factory.createIdentifier(M.upperCamelCase(o)):o)}}return p.factory.createToken(p.SyntaxKind.UnknownKeyword)}static toDeclarationNodes(t){let n=[],r=[],i=[];for(let a of t)if(a.ref){let e=M.ref2name(a.ref);i.push(p.factory.createParameterDeclaration(void 0,void 0,p.factory.createIdentifier(M.camelCase(M.normalize(e))),void 0,p.factory.createTypeReferenceNode(p.factory.createIdentifier(M.upperCamelCase(M.normalize(e)))),void 0))}else{let{name:t,schema:i,required:o}=a;n.push(p.factory.createBindingElement(void 0,void 0,p.factory.createIdentifier(M.camelCase(M.normalize(t))))),r.push(p.factory.createPropertySignature([],p.factory.createIdentifier(M.camelCase(M.normalize(t))),o?void 0:p.factory.createToken(p.SyntaxKind.QuestionToken),i?e.toTypeNode(i):p.factory.createToken(p.SyntaxKind.UnknownKeyword)))}return n.length>0?[p.factory.createParameterDeclaration(void 0,void 0,p.factory.createObjectBindingPattern(n),void 0,p.factory.createTypeLiteralNode(r),void 0),...i]:i}static toFormDataStatement(t,n){let r=[],i=p.factory.createVariableStatement(void 0,p.factory.createVariableDeclarationList([p.factory.createVariableDeclaration(p.factory.createIdentifier(`fd`),void 0,void 0,p.factory.createNewExpression(p.factory.createIdentifier(`FormData`),void 0,[]))],p.NodeFlags.Const));return r.push(i),t.forEach(e=>{r.push(p.factory.createExpressionStatement(p.factory.createBinaryExpression(p.factory.createIdentifier(e.name),p.factory.createToken(p.SyntaxKind.AmpersandAmpersandToken),p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`fd`),p.factory.createIdentifier(`append`)),void 0,[p.factory.createStringLiteral(e.name),p.factory.createIdentifier(e.name)]))))}),n&&n.type===`object`&&n.properties&&Object.keys(n.properties).length!==0&&Object.keys(n.properties).forEach(t=>{let i=n.properties[t];i.type===`array`&&e.isBinarySchema(i)?r.push(p.factory.createForOfStatement(void 0,p.factory.createVariableDeclarationList([p.factory.createVariableDeclaration(`file`)],p.NodeFlags.Const),p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t)),p.factory.createBlock([p.factory.createExpressionStatement(p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`fd`),p.factory.createIdentifier(`append`)),[],[p.factory.createStringLiteral(t),p.factory.createIdentifier(`file`),p.factory.createPropertyAccessExpression(p.factory.createAsExpression(p.factory.createIdentifier(`file`),p.factory.createTypeReferenceNode(p.factory.createIdentifier(`File`),void 0)),p.factory.createIdentifier(`name`))]))]))):i.required?r.push(p.factory.createExpressionStatement(p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`fd`),p.factory.createIdentifier(`append`)),void 0,[p.factory.createStringLiteral(t),i.type===`string`||e.isBinarySchema(i)||i.isRef?p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t)):i.type===`array`||i.type===`object`?p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`JSON`),p.factory.createIdentifier(`stringify`)),void 0,[p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t))]):p.factory.createCallExpression(p.factory.createIdentifier(`String`),void 0,[p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t))])]))):r.push(p.factory.createExpressionStatement(p.factory.createBinaryExpression(p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t)),p.factory.createToken(p.SyntaxKind.AmpersandAmpersandToken),p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`fd`),p.factory.createIdentifier(`append`)),void 0,[p.factory.createStringLiteral(t),i.type===`string`||e.isBinarySchema(i)||i.isRef?p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t)):i.type===`array`||i.type===`object`?p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`JSON`),p.factory.createIdentifier(`stringify`)),void 0,[p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t))]):p.factory.createCallExpression(p.factory.createIdentifier(`String`),void 0,[p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t))])]))))}),r}static bodyBlock(t,n,r,i,a,o){let s=i&&[`multipart/form-data`,`application/x-www-form-urlencoded`].includes(i.type),c=a?.type===`application/json`,l=i?.schema&&i.schema.type===`array`&&e.isBinarySchema(i.schema),u=r.filter(t=>t.in===`formData`||t.schema&&e.isBinarySchema(t.schema)),d=r.filter(e=>!u.includes(e)),f=i?.schema&&`properties`in i.schema&&Object.values(i.schema?.properties??{}).some(t=>e.isBinarySchema(t)),m=r.some(t=>t?.schema&&e.isBinarySchema(t.schema)),h=!!s&&(l||m||f||u.length>0);return p.factory.createBlock([...h?e.toFormDataStatement(u,i?.schema):[],...o.client(t,n,d,i,a,o,h,c)])}static schemaToStatemets(t,n,r){let i=[],{apis:a,schemas:o={},enums:s}=t,c=[];for(let e of s)c.push(M.upperCamelCase(e.name)),i.push(p.factory.createEnumDeclaration([p.factory.createToken(p.SyntaxKind.ExportKeyword)],p.factory.createIdentifier(M.upperCamelCase(e.name)),e.enum.map(e=>p.factory.createEnumMember(p.factory.createStringLiteral(typeof e==`string`?e:`${e}_`),typeof e==`string`?p.factory.createStringLiteral(e):p.factory.createNumericLiteral(e)))));for(let t in o)if(Object.hasOwn(o,t)&&!c.includes(M.upperCamelCase(t))){let n=o[t];i.push(p.factory.createTypeAliasDeclaration([p.factory.createModifier(p.SyntaxKind.ExportKeyword)],p.factory.createIdentifier(M.upperCamelCase(t)),void 0,e.toTypeNode(n)))}for(let t in a){let o=a[t];for(let a of o){let{method:o,operationId:s,requestBody:c=[],responses:l=[],summary:u,deprecated:d,description:f}=a,{parameters:m=[]}=a;m=m.filter(e=>e.in!==`cookie`),c.length===0&&c.push({type:`application/json`});let h=c.length>1;for(let a of c){let c=p.factory.createFunctionDeclaration([p.factory.createModifier(p.SyntaxKind.ExportKeyword),p.factory.createModifier(p.SyntaxKind.AsyncKeyword)],void 0,M.pathToFnName(t,o,s)+(h?M.capitalize(a.type.split(`/`)[1]):``),void 0,[...m.length>0?e.toDeclarationNodes(m):[],...a?.schema?[e.toRequestBodyTypeNode(a.schema)]:[]].filter(Boolean),void 0,e.bodyBlock(r.baseURL+t,o,m,a,l[0],n)),g=[f,u].filter(Boolean).join(`. `);e.addComments(c,[g&&{comment:g},d&&{tag:`deprecated`},...e.generateParamTags(m,a)].filter(Boolean)),i.push(c)}}}return i}static async prettier(e){return await(0,h.format)(e,{parser:`typescript`})}static async genCode(t,n,r){let{importClientSource:i}=n,a=e.schemaToStatemets(t,r,{baseURL:n.baseURL??``}),o=e.toCode(a);return i&&(o=i+`
9
8
 
10
- `+o),await e.prettier(o)}},P=class extends O{methodFieldName=`method`;bodyFieldName=`data`;headersFieldName=`headers`;queryFieldName=`params`;name=`axios`;client(e,t,n,r,i,a,o){let s=[],c=n.filter(e=>!e.in||e.in===`body`),l=n.filter(e=>e.in===`header`);return s.push(p.factory.createReturnStatement(p.factory.createCallExpression(p.factory.createIdentifier(a.name),i?.schema?[N.toTypeNode(i.schema)]:void 0,[N.toUrlTemplate(e,n),p.factory.createObjectLiteralExpression([p.factory.createPropertyAssignment(p.factory.createIdentifier(a.methodFieldName),p.factory.createStringLiteral(t.toUpperCase()))].concat(l.length>0?p.factory.createPropertyAssignment(p.factory.createIdentifier(a.headersFieldName),p.factory.createObjectLiteralExpression(l.map(e=>p.factory.createPropertyAssignment(p.factory.createStringLiteral(e.name),p.factory.createCallExpression(p.factory.createIdentifier(`encodeURIComponent`),void 0,[p.factory.createCallExpression(p.factory.createIdentifier(`String`),void 0,[p.factory.createIdentifier(M.camelCase(M.normalize(e.name)))])]))))):[],o||c.length>0||r?.schema?p.factory.createPropertyAssignment(p.factory.createIdentifier(a.bodyFieldName),o?p.factory.createIdentifier(`fd`):(c.length>0||r?.schema&&N.isBinarySchema(r.schema),p.factory.createIdentifier(`req`))):[]),!0)]))),s}},F=class extends O{methodFieldName=`method`;bodyFieldName=`body`;headersFieldName=`headers`;queryFieldName=``;name=`fetch`;client(e,t,n,r,i,a,o,s){let c=[],l=n.filter(e=>!e.in||e.in===`body`),u=n.filter(e=>e.in===`header`),d=()=>p.factory.createObjectLiteralExpression([p.factory.createPropertyAssignment(p.factory.createIdentifier(a.methodFieldName),p.factory.createStringLiteral(t.toUpperCase()))].concat(u.length>0?p.factory.createPropertyAssignment(p.factory.createIdentifier(a.headersFieldName),p.factory.createObjectLiteralExpression(u.map(e=>p.factory.createPropertyAssignment(p.factory.createStringLiteral(e.name),p.factory.createCallExpression(p.factory.createIdentifier(`encodeURIComponent`),void 0,[p.factory.createCallExpression(p.factory.createIdentifier(`String`),void 0,[p.factory.createIdentifier(M.camelCase(M.normalize(e.name)))])]))))):[],o||l.length>0||r?.schema?p.factory.createPropertyAssignment(p.factory.createIdentifier(a.bodyFieldName),o?p.factory.createIdentifier(`fd`):l.length>0||r?.schema&&!N.isBinarySchema(r.schema)?p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`JSON`),p.factory.createIdentifier(`stringify`)),[],[r?p.factory.createIdentifier(`req`):p.factory.createObjectLiteralExpression(l.map(e=>p.factory.createShorthandPropertyAssignment(p.factory.createIdentifier(e.name))),!0)]):p.factory.createIdentifier(`req`)):[]),!0);return c.push(p.factory.createReturnStatement(s?p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createCallExpression(p.factory.createIdentifier(a.name),void 0,[N.toUrlTemplate(e,n),d()]),p.factory.createIdentifier(`then`)),void 0,[p.factory.createArrowFunction([p.factory.createModifier(p.SyntaxKind.AsyncKeyword)],[],[p.factory.createParameterDeclaration(void 0,void 0,p.factory.createIdentifier(`response`))],void 0,p.factory.createToken(p.SyntaxKind.EqualsGreaterThanToken),i?.schema?p.factory.createAsExpression(p.factory.createParenthesizedExpression(p.factory.createAwaitExpression(p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`response`),p.factory.createIdentifier(`json`)),void 0,[]))),i?.schema?N.toTypeNode(i.schema):p.factory.createToken(p.SyntaxKind.UnknownKeyword)):p.factory.createParenthesizedExpression(p.factory.createAwaitExpression(p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`response`),p.factory.createIdentifier(`json`)),void 0,[]))))]):p.factory.createCallExpression(p.factory.createIdentifier(a.name),void 0,[N.toUrlTemplate(e,n),d()]))),c}},I=class{doc;constructor(e){this.doc=e}resolvePathRef(e){let t=M.ref2name(e,this.doc);return this.doc.paths?.[t]}isOpenAPIArraySchema(e){return typeof e==`object`&&e.type===`array`}getSchemaByRef(e,t=!1,n=[],r=``){let i=``;if(M.isRef(e)){if(i=M.upperCamelCase(M.ref2name(e.$ref)),t)return{type:r+i};this.doc.definitions||(this.doc.definitions={}),e=this.doc.definitions[M.ref2name(e.$ref,this.doc)]}return this.toBaseSchema(e,n,``,r+i)}toBaseSchema(e,t=[],n=``,r=``){if(!e)return{type:`unknown`};if(M.isRef(e))return this.getSchemaByRef(e,!0);if(this.isOpenAPIArraySchema(e)){let{type:i,description:a,items:o,required:s}=e;return{type:i,required:!!s,description:a,items:this.toBaseSchema(o,t,n,r)}}else{let{required:i=[],allOf:a,anyOf:o,description:s,enum:c,format:l,oneOf:u,properties:d={}}=e,{type:f}=e;if(c&&f!==`boolean`){let a={name:M.upperCamelCase(M.normalize(r))+M.upperCamelCase(M.normalize(n)),enum:[...new Set(c)]},o=M.findSameSchema(a,t);return!o&&M.isValidEnumType(e)&&t.push(a),{type:o?o.name:M.isBooleanEnum(e)?`boolean`:a.name,required:i,description:s}}return f===void 0&&Object.keys(d).length>0&&(f=`object`),{type:f,required:i,description:s,enum:c,format:l,allOf:a?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),anyOf:o?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),oneOf:u?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),properties:Object.keys(d).reduce((e,n)=>{let i=d[n];return{...e,[n]:M.isRef(i)?{type:M.capitalize(M.ref2name(i.$ref,this.doc))}:this.toBaseSchema(i,t,n,r)}},{})}}}getParameterByRef(e,t=[],n=``){if(M.isRef(e)){let t=M.ref2name(e.$ref,this.doc),n=this.doc.parameters?.[t];if(!n)throw Error(`Parameter reference not found: ${e.$ref}`);e=n}let r=e,{name:i,required:a,description:o,type:s,items:c,enum:l,properties:u,schema:d}=r;if(l){let e=M.upperCamelCase(M.normalize(n))+M.upperCamelCase(M.normalize(i)),s={name:e,enum:[...new Set(l)]},c=M.findSameSchema(s,t);return!c&&M.isValidEnumType({type:e,enum:l})&&t.push(s),{name:i,required:a,description:o,in:r.in,schema:{type:c?.name??e}}}return c?{name:i,required:a,description:o,in:r.in,schema:{type:s,items:c}}:d&&M.isRef(d)?{name:i,required:a,description:o,in:r.in,schema:{type:M.capitalize(M.ref2name(d.$ref))}}:{name:i,required:a,description:o,in:r.in,schema:{type:s,properties:u}}}getResponseByRef(e){M.isRef(e)&&(e=this.doc.responses[M.ref2name(e.$ref,this.doc)]);let{schema:t}=e;return[{type:`application/json`,schema:t&&this.getSchemaByRef(t,!0)}]}init(){let{definitions:e={},responses:t={},paths:n={}}=this.doc,r=[],i=Object.keys(e).reduce((t,n)=>{let i=e[n];return{...t,[n]:this.getSchemaByRef(i,!1,r,n)}},{}),a=Object.keys(t).reduce((e,n)=>{let r=t[n];return{...e,[n]:this.getResponseByRef(r)}},{}),o=Object.keys(n).reduce((e,t)=>{let i=n[t]??{};if(i.$ref){let e=this.resolvePathRef(i.$ref);e&&(i=e)}let{parameters:a=[]}=i,o=[];return Object.values(j).forEach(e=>{let t=i[e];if(t){let{deprecated:n,operationId:i,summary:s,description:c,responses:l={}}=t,{parameters:u=[]}=t,d=[...a,...u].map(e=>this.getParameterByRef(e,r)),f=[...new Set(d.map(e=>e.name))];Object.keys(l).length===0&&Object.assign(l,{200:{description:`Successful response`}});let p=d.filter(e=>e.in===`body`||e.in===`formData`),m=d.filter(e=>e.in!==`body`&&e.in!==`formData`),h=Object.keys(l);for(let t of h)if(t in l){let r=l[t],a=this.getResponseByRef(r),u=p&&p.length===1&&p[0].in===`body`&&p[0].name===`body`;o.push({method:e,operationId:i,summary:s,deprecated:n,description:c,parameters:f.map(e=>m.find(t=>t.name===e)).filter(Boolean),responses:a,requestBody:p.length>0?u?[{type:`application/json`,schema:p[0].schema}]:[{type:`application/json`,schema:{type:`object`,properties:p.reduce((e,t)=>({...e,[t.name]:{type:t.schema?.type??`unknown`,required:t.schema?.required,items:t.schema?.items,description:t.schema?.description}}),{})}}]:void 0});break}}}),{...e,[t]:o}},{});return{enums:M.uniqueEnums(r),schemas:i,responses:a,parameters:{},requestBodies:{},apis:o}}},L=class{doc;constructor(e){this.doc=e}resolvePathRef(e){let t=M.ref2name(e,this.doc);return this.doc.paths?.[t]}isOpenAPIArraySchema(e){return typeof e==`object`&&e.type===`array`}getSchemaByRef(e,t=!1,n=[],r=``){let i=``;if(M.isRef(e)){if(i=M.capitalize(M.ref2name(e.$ref)),t)return{type:r+i};let n=this.doc.components?.schemas?.[M.ref2name(e.$ref,this.doc)];if(!n)return{type:`unknown`};e=n}return this.toBaseSchema(e,n,``,r+i)}getParameterByRef(e,t=[],n=``){if(M.isRef(e)){let t=this.doc.components?.parameters?.[M.ref2name(e.$ref,this.doc)];if(!t)return{name:`unknown`,in:`query`};e=t}let{name:r,required:i,deprecated:a,description:o,schema:s}=e;if(s&&!M.isRef(s)&&s.enum){let c=M.upperCamelCase(M.normalize(n))+M.upperCamelCase(M.normalize(r)),l={name:c,enum:[...new Set(s.enum)]},u=M.findSameSchema(l,t);return!u&&M.isValidEnumType(s)&&t.push(l),{name:r,required:i,description:o,deprecated:a,in:e.in,schema:{type:u?.name??c}}}return{name:r,required:i,description:o,deprecated:a,in:e.in,schema:e.schema&&this.getSchemaByRef(e.schema,!1,t,n+M.capitalize(r))}}getResponseByRef(e){if(M.isRef(e)){let t=this.doc.components?.responses?.[M.ref2name(e.$ref,this.doc)];if(!t)return[];e=t}let{content:t={}}=e;return Object.keys(t).map(e=>({type:e,schema:t[e].schema&&this.getSchemaByRef(t[e].schema,!0)}))}getRequestBodyByRef(e,t=[]){if(M.isRef(e)){let t=this.doc.components?.requestBodies?.[M.ref2name(e.$ref,this.doc)];if(!t)return[];e=t}let{content:n={}}=e;return Object.keys(n).map(e=>({type:e,schema:n[e].schema&&this.getSchemaByRef(n[e].schema,!1,t)}))}toBaseSchema(e,t=[],n=``,r=``){if(!e)return{type:`unknown`};if(M.isRef(e))return this.getSchemaByRef(e,!0);if(this.isOpenAPIArraySchema(e)){let{type:i,description:a,items:o,required:s}=e;return{type:i,required:!!s,description:a,items:this.toBaseSchema(o,t,n,r)}}else{let{required:i=[],allOf:a,anyOf:o,description:s,deprecated:c,enum:l,format:u,oneOf:d,properties:f={}}=e,{type:p}=e;if(l&&p!==`boolean`){let a={name:M.upperCamelCase(M.normalize(r))+M.upperCamelCase(M.normalize(n)),enum:[...new Set(l)]},o=M.findSameSchema(a,t);return!o&&M.isValidEnumType(e)&&t.push(a),{type:o?o.name:M.isBooleanEnum(e)?`boolean`:a.name,required:i,description:s,deprecated:c}}return p===void 0&&Object.keys(f).length>0&&(p=`object`),{type:p,required:i,description:s,deprecated:c,enum:l,format:u,allOf:a?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),anyOf:o?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),oneOf:d?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),properties:Object.keys(f).reduce((e,n)=>{let i=f[n];return{...e,[n]:M.isRef(i)?{type:M.capitalize(M.ref2name(i.$ref,this.doc))}:this.toBaseSchema(i,t,n,r)}},{})}}}init(){let{components:e={},paths:t={}}=this.doc,n=[],{requestBodies:r={},responses:i={},parameters:a={},schemas:o={}}=e,s=Object.keys(o).reduce((e,t)=>{let r=o[t];return{...e,[t]:this.getSchemaByRef(r,!1,n,t)}},{}),c=Object.keys(a).reduce((e,t)=>{let r=a[t];return{...e,[t]:this.getParameterByRef(r,n,t)}},{}),l=Object.keys(i).reduce((e,t)=>{let n=i[t];return{...e,[t]:this.getResponseByRef(n)}},{}),u=Object.keys(r).reduce((e,t)=>{let i=r[t];return{...e,[t]:this.getRequestBodyByRef(i,n)}},{}),d=Object.keys(t).reduce((e,r)=>{let i=t[r]??{};if(i.$ref){let e=this.resolvePathRef(i.$ref);e&&(i=e)}let{parameters:a=[],description:o,summary:s}=i,c=[];return Object.values(j).forEach(e=>{let t=i[e];if(t){let{deprecated:r,operationId:i,responses:l={},summary:u,description:d,requestBody:f={content:{}}}=t,{parameters:p=[]}=t,m=[...a,...p].map(e=>this.getParameterByRef(e,n)),h=this.getRequestBodyByRef(f,n),g=[...new Set(m.map(e=>e.name))];Object.keys(l).length===0&&Object.assign(l,{200:{description:`Successful response`}});let _=Object.keys(l);for(let t of _)if(t in l){let n=l[t],a=this.getResponseByRef(n);c.push({method:e,operationId:i,summary:u??s,description:d??o,deprecated:r,parameters:g.map(e=>m.find(t=>t.name===e)).filter(e=>e!==void 0),responses:a,requestBody:h});break}}}),{...e,[r]:c}},{});return{enums:M.uniqueEnums(n),schemas:s,responses:l,parameters:c,requestBodies:u,apis:d}}},R=class{doc;constructor(e){this.doc=e}resolvePathRef(e){let t=M.ref2name(e,this.doc);return this.doc.paths?.[t]}isOpenAPIArraySchema(e){return typeof e==`object`&&e.type===`array`}getSchemaByRef(e,t=!1,n=[],r=``){let i=``;if(M.isRef(e)){if(i=M.upperCamelCase(M.ref2name(e.$ref)),t)return{type:r+i};this.doc.components||(this.doc.components={schemas:{}});let n=this.doc.components.schemas?.[M.ref2name(e.$ref,this.doc)];if(!n)throw Error(`Schema reference not found: ${i}`);e=n}return this.toBaseSchema(e,n,``,r+i)}getParameterByRef(e,t=[],n=``){M.isRef(e)&&(e=this.doc.components?.parameters?.[M.ref2name(e.$ref,this.doc)]);let{name:r,required:i,deprecated:a,description:o,schema:s}=e;if(s&&!M.isRef(s)&&s.enum){let c=M.upperCamelCase(M.normalize(n))+M.upperCamelCase(M.normalize(r)),l={name:c,enum:[...new Set(s.enum)]},u=M.findSameSchema(l,t);return!u&&M.isValidEnumType(s)&&t.push(l),{name:r,required:i,description:o,deprecated:a,in:e.in,schema:{type:u?.name??c}}}return{name:r,required:i,description:o,deprecated:a,in:e.in,schema:e.schema&&this.getSchemaByRef(e.schema,!1,t,n+M.capitalize(r))}}getResponseByRef(e){M.isRef(e)&&(e=this.doc.components?.responses?.[M.ref2name(e.$ref,this.doc)]);let{content:t={}}=e;return Object.keys(t).map(e=>({type:e,schema:t[e].schema&&this.getSchemaByRef(t[e].schema,!0)}))}getRequestBodyByRef(e,t=[]){M.isRef(e)&&(e=this.doc.components?.requestBodies?.[M.ref2name(e.$ref,this.doc)]);let{content:n={}}=e;return Object.keys(n).map(e=>({type:e,schema:n[e].schema&&this.getSchemaByRef(n[e].schema,!0,t)}))}toBaseSchema(e,t=[],n=``,r=``){if(!e)return{type:`unknown`};if(M.isRef(e))return this.getSchemaByRef(e,!0);if(this.isOpenAPIArraySchema(e)){let{type:i,description:a,items:o,required:s}=e;return{type:i,required:!!s,description:a,items:this.toBaseSchema(o,t,n,r)}}else{let{required:i=[],allOf:a,anyOf:o,description:s,deprecated:c,enum:l,format:u,oneOf:d,properties:f={}}=e,{type:p}=e;if(l&&p!==`boolean`){let a={name:M.upperCamelCase(M.normalize(r))+M.upperCamelCase(M.normalize(n)),enum:[...new Set(l)]},o=M.findSameSchema(a,t);return!o&&M.isValidEnumType(e)&&t.push(a),{type:o?o.name:M.isBooleanEnum(e)?`boolean`:a.name,required:i,description:s,deprecated:c}}return p===void 0&&Object.keys(f).length>0&&(p=`object`),{type:p,required:i,description:s,deprecated:c,enum:l,format:u,allOf:a?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),anyOf:o?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),oneOf:d?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),properties:Object.keys(f).reduce((e,n)=>{let i=f[n];return{...e,[n]:M.isRef(i)?{type:M.capitalize(M.ref2name(i.$ref,this.doc))}:this.toBaseSchema(i,t,n,r)}},{})}}}init(){let{components:e={},paths:t={}}=this.doc,n=[],{requestBodies:r={},responses:i={},parameters:a={},schemas:o={}}=e,s=Object.keys(o).reduce((e,t)=>{let r=o[t];return{...e,[t]:this.getSchemaByRef(r,!1,n,t)}},{}),c=Object.keys(a).reduce((e,t)=>{let r=a[t];return{...e,[t]:this.getParameterByRef(r,n,t)}},{}),l=Object.keys(i).reduce((e,t)=>{let n=i[t];return{...e,[t]:this.getResponseByRef(n)}},{}),u=Object.keys(r).reduce((e,t)=>{let i=r[t];return{...e,[t]:this.getRequestBodyByRef(i,n)}},{}),d=Object.keys(t).reduce((e,r)=>{let i=t[r]??{};if(i.$ref){let e=this.resolvePathRef(i.$ref);e&&(i=e)}let{parameters:a=[],description:o,summary:s}=i,c=[];return Object.values(j).forEach(e=>{let t=i[e];if(t){let{deprecated:r,operationId:i,summary:l,description:u,responses:d={},requestBody:f={content:{}}}=t,{parameters:p=[]}=t,m=[...a,...p].map(e=>this.getParameterByRef(e,n)),h=this.getRequestBodyByRef(f,n),g=[...new Set(m.map(e=>e.name))];Object.keys(d).length===0&&Object.assign(d,{200:{description:`Successful response`}});let _=Object.keys(d);for(let t of _)if(t in d){let n=d[t],a=this.getResponseByRef(n);c.push({method:e,operationId:i,summary:l??s,description:u??o,deprecated:r,parameters:g.map(e=>m.find(t=>t.name===e)).filter(e=>e!==void 0),responses:a,requestBody:h});break}}}),{...e,[r]:c}},{});return{enums:M.uniqueEnums(n),schemas:s,responses:l,parameters:c,requestBodies:u,apis:d}}};const z=(0,d.createScopedLogger)(`OpenAPI`);function B(e){switch((e.openapi||e.swagger).slice(0,3)){case`3.1`:return`v3_1`;case`3.0`:return`v3`;case`2.0`:return`v2`;default:return`unknown`}}var V=class extends ne{parse(e){let t=B(e);switch(z.debug(`openapi version ${t}`),t){case`v2`:return new I(e).init();case`v3`:return new L(e).init();case`v3_1`:return new R(e).init();default:throw Error(`Not a valid OpenAPI version: ${t}`)}}};function H(e){switch(e){case`axios`:return new P;default:return new F}}async function U(e){let t=Date.now(),{verbose:n}=e;n?z.setLevel(`debug`):z.setLevel(`info`),z.info(`Fetch document from ${e.docURL}`);let{enums:r,schemas:i,parameters:a,responses:o,requestBodies:s,apis:c}=new V(e,await M.fetchDoc(e.docURL,e.requestOptions)),l=H(e.adaptor??`fetch`),u=await N.genCode({enums:r,schemas:i,parameters:a,responses:o,requestBodies:s,apis:c},e,l);e.output&&await N.write(u,e.output);let d=Date.now()-t;return{code:u,stats:{endpoints:Object.keys(c).length,schemas:Object.keys(i).length,duration:d}}}const W=e=>`\x1b[36m${e}\x1b[0m`,G=e=>`\x1b[32m${e}\x1b[0m`,K=e=>`\x1b[31m${e}\x1b[0m`,q=e=>`\x1b[34m${e}\x1b[0m`,J=e=>`\x1b[33m${e}\x1b[0m`,Y=e=>`\x1b[35m${e}\x1b[0m`,X=e=>`\x1b[90m${e}\x1b[0m`,Z={banner(e){console.log(W(`
9
+ `+o),await e.prettier(o)}},P=class extends O{methodFieldName=`method`;bodyFieldName=`data`;headersFieldName=`headers`;queryFieldName=`params`;name=`axios`;client(e,t,n,r,i,a,o){let s=[],c=n.filter(e=>!e.in||e.in===`body`),l=n.filter(e=>e.in===`header`);return s.push(p.factory.createReturnStatement(p.factory.createCallExpression(p.factory.createIdentifier(a.name),i?.schema?[N.toTypeNode(i.schema)]:void 0,[N.toUrlTemplate(e,n),p.factory.createObjectLiteralExpression([p.factory.createPropertyAssignment(p.factory.createIdentifier(a.methodFieldName),p.factory.createStringLiteral(t.toUpperCase()))].concat(l.length>0?p.factory.createPropertyAssignment(p.factory.createIdentifier(a.headersFieldName),p.factory.createObjectLiteralExpression(l.map(e=>p.factory.createPropertyAssignment(p.factory.createStringLiteral(e.name),p.factory.createCallExpression(p.factory.createIdentifier(`encodeURIComponent`),void 0,[p.factory.createCallExpression(p.factory.createIdentifier(`String`),void 0,[p.factory.createIdentifier(M.camelCase(M.normalize(e.name)))])]))))):[],o||c.length>0||r?.schema?p.factory.createPropertyAssignment(p.factory.createIdentifier(a.bodyFieldName),o?p.factory.createIdentifier(`fd`):(c.length>0||r?.schema&&N.isBinarySchema(r.schema),p.factory.createIdentifier(`req`))):[]),!0)]))),s}},F=class extends O{methodFieldName=`method`;bodyFieldName=`body`;headersFieldName=`headers`;queryFieldName=``;name=`fetch`;client(e,t,n,r,i,a,o,s){let c=[],l=n.filter(e=>!e.in||e.in===`body`),u=n.filter(e=>e.in===`header`),d=()=>p.factory.createObjectLiteralExpression([p.factory.createPropertyAssignment(p.factory.createIdentifier(a.methodFieldName),p.factory.createStringLiteral(t.toUpperCase()))].concat(u.length>0?p.factory.createPropertyAssignment(p.factory.createIdentifier(a.headersFieldName),p.factory.createObjectLiteralExpression(u.map(e=>p.factory.createPropertyAssignment(p.factory.createStringLiteral(e.name),p.factory.createCallExpression(p.factory.createIdentifier(`encodeURIComponent`),void 0,[p.factory.createCallExpression(p.factory.createIdentifier(`String`),void 0,[p.factory.createIdentifier(M.camelCase(M.normalize(e.name)))])]))))):[],o||l.length>0||r?.schema?p.factory.createPropertyAssignment(p.factory.createIdentifier(a.bodyFieldName),o?p.factory.createIdentifier(`fd`):l.length>0||r?.schema&&!N.isBinarySchema(r.schema)?p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`JSON`),p.factory.createIdentifier(`stringify`)),[],[r?p.factory.createIdentifier(`req`):p.factory.createObjectLiteralExpression(l.map(e=>p.factory.createShorthandPropertyAssignment(p.factory.createIdentifier(e.name))),!0)]):p.factory.createIdentifier(`req`)):[]),!0);return c.push(p.factory.createReturnStatement(s?p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createCallExpression(p.factory.createIdentifier(a.name),void 0,[N.toUrlTemplate(e,n),d()]),p.factory.createIdentifier(`then`)),void 0,[p.factory.createArrowFunction([p.factory.createModifier(p.SyntaxKind.AsyncKeyword)],[],[p.factory.createParameterDeclaration(void 0,void 0,p.factory.createIdentifier(`response`))],void 0,p.factory.createToken(p.SyntaxKind.EqualsGreaterThanToken),i?.schema?p.factory.createAsExpression(p.factory.createParenthesizedExpression(p.factory.createAwaitExpression(p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`response`),p.factory.createIdentifier(`json`)),void 0,[]))),i?.schema?N.toTypeNode(i.schema):p.factory.createToken(p.SyntaxKind.UnknownKeyword)):p.factory.createParenthesizedExpression(p.factory.createAwaitExpression(p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`response`),p.factory.createIdentifier(`json`)),void 0,[]))))]):p.factory.createCallExpression(p.factory.createIdentifier(a.name),void 0,[N.toUrlTemplate(e,n),d()]))),c}},I=class{doc;constructor(e){this.doc=e}resolvePathRef(e){let t=M.ref2name(e,this.doc);return this.doc.paths?.[t]}isOpenAPIArraySchema(e){return typeof e==`object`&&e.type===`array`}getSchemaByRef(e,t=!1,n=[],r=``){let i=``;if(M.isRef(e)){if(i=M.upperCamelCase(M.ref2name(e.$ref)),t)return{type:r+i};this.doc.definitions||(this.doc.definitions={}),e=this.doc.definitions[M.ref2name(e.$ref,this.doc)]}return this.toBaseSchema(e,n,``,r+i)}toBaseSchema(e,t=[],n=``,r=``){if(!e)return{type:`unknown`};if(M.isRef(e))return this.getSchemaByRef(e,!0);if(this.isOpenAPIArraySchema(e)){let{type:i,description:a,items:o,required:s}=e;return{type:i,required:!!s,description:a,items:this.toBaseSchema(o,t,n,r)}}else{let{required:i=[],allOf:a,anyOf:o,description:s,enum:c,format:l,oneOf:u,properties:d={}}=e,{type:f}=e;if(c&&f!==`boolean`){let a={name:M.upperCamelCase(M.normalize(r))+M.upperCamelCase(M.normalize(n)),enum:[...new Set(c)]},o=M.findSameSchema(a,t);return!o&&M.isValidEnumType(e)&&t.push(a),{type:o?o.name:M.isBooleanEnum(e)?`boolean`:a.name,required:i,description:s}}return f===void 0&&Object.keys(d).length>0&&(f=`object`),{type:f,required:i,description:s,enum:c,format:l,allOf:a?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),anyOf:o?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),oneOf:u?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),properties:Object.keys(d).reduce((e,n)=>{let i=d[n];return{...e,[n]:M.isRef(i)?{type:M.capitalize(M.ref2name(i.$ref,this.doc))}:this.toBaseSchema(i,t,n,r)}},{})}}}getParameterByRef(e,t=[],n=``){if(M.isRef(e)){let t=M.ref2name(e.$ref,this.doc),n=this.doc.parameters?.[t];if(!n)throw Error(`Parameter reference not found: ${e.$ref}`);e=n}let r=e,{name:i,required:a,description:o,type:s,items:c,enum:l,properties:u,schema:d}=r;if(l){let e=M.upperCamelCase(M.normalize(n))+M.upperCamelCase(M.normalize(i)),s={name:e,enum:[...new Set(l)]},c=M.findSameSchema(s,t);return!c&&M.isValidEnumType({type:e,enum:l})&&t.push(s),{name:i,required:a,description:o,in:r.in,schema:{type:c?.name??e}}}return c?{name:i,required:a,description:o,in:r.in,schema:{type:s,items:c}}:d&&M.isRef(d)?{name:i,required:a,description:o,in:r.in,schema:{type:M.capitalize(M.ref2name(d.$ref))}}:{name:i,required:a,description:o,in:r.in,schema:{type:s,properties:u}}}getResponseByRef(e){M.isRef(e)&&(e=this.doc.responses[M.ref2name(e.$ref,this.doc)]);let{schema:t}=e;return[{type:`application/json`,schema:t&&this.getSchemaByRef(t,!0)}]}init(){let{definitions:e={},responses:t={},paths:n={}}=this.doc,r=[],i=Object.keys(e).reduce((t,n)=>{let i=e[n];return{...t,[n]:this.getSchemaByRef(i,!1,r,n)}},{}),a=Object.keys(t).reduce((e,n)=>{let r=t[n];return{...e,[n]:this.getResponseByRef(r)}},{}),o=Object.keys(n).reduce((e,t)=>{let i=n[t]??{};if(i.$ref){let e=this.resolvePathRef(i.$ref);e&&(i=e)}let{parameters:a=[]}=i,o=[];return Object.values(j).forEach(e=>{let t=i[e];if(t){let{deprecated:n,operationId:i,summary:s,description:c,responses:l={}}=t,{parameters:u=[]}=t,d=[...a,...u].map(e=>this.getParameterByRef(e,r)),f=[...new Set(d.map(e=>e.name))];Object.keys(l).length===0&&Object.assign(l,{200:{description:`Successful response`}});let p=d.filter(e=>e.in===`body`||e.in===`formData`),m=d.filter(e=>e.in!==`body`&&e.in!==`formData`),h=Object.keys(l);for(let t of h)if(t in l){let r=l[t],a=this.getResponseByRef(r),u=p&&p.length===1&&p[0].in===`body`&&p[0].name===`body`;o.push({method:e,operationId:i,summary:s,deprecated:n,description:c,parameters:f.map(e=>m.find(t=>t.name===e)).filter(Boolean),responses:a,requestBody:p.length>0?u?[{type:`application/json`,schema:p[0].schema}]:[{type:`application/json`,schema:{type:`object`,properties:p.reduce((e,t)=>({...e,[t.name]:{type:t.schema?.type??`unknown`,required:t.schema?.required,items:t.schema?.items,description:t.schema?.description}}),{})}}]:void 0});break}}}),{...e,[t]:o}},{});return{enums:M.uniqueEnums(r),schemas:i,responses:a,parameters:{},requestBodies:{},apis:o}}},L=class{doc;constructor(e){this.doc=e}resolvePathRef(e){let t=M.ref2name(e,this.doc);return this.doc.paths?.[t]}isOpenAPIArraySchema(e){return typeof e==`object`&&e.type===`array`}getSchemaByRef(e,t=!1,n=[],r=``){let i=``;if(M.isRef(e)){if(i=M.capitalize(M.ref2name(e.$ref)),t)return{type:r+i};let n=this.doc.components?.schemas?.[M.ref2name(e.$ref,this.doc)];if(!n)return{type:`unknown`};e=n}return this.toBaseSchema(e,n,``,r+i)}getParameterByRef(e,t=[],n=``){if(M.isRef(e)){let t=this.doc.components?.parameters?.[M.ref2name(e.$ref,this.doc)];if(!t)return{name:`unknown`,in:`query`};e=t}let{name:r,required:i,deprecated:a,description:o,schema:s}=e;if(s&&!M.isRef(s)&&s.enum){let c=M.upperCamelCase(M.normalize(n))+M.upperCamelCase(M.normalize(r)),l={name:c,enum:[...new Set(s.enum)]},u=M.findSameSchema(l,t);return!u&&M.isValidEnumType(s)&&t.push(l),{name:r,required:i,description:o,deprecated:a,in:e.in,schema:{type:u?.name??c}}}return{name:r,required:i,description:o,deprecated:a,in:e.in,schema:e.schema&&this.getSchemaByRef(e.schema,!1,t,n+M.capitalize(r))}}getResponseByRef(e){if(M.isRef(e)){let t=this.doc.components?.responses?.[M.ref2name(e.$ref,this.doc)];if(!t)return[];e=t}let{content:t={}}=e;return Object.keys(t).map(e=>({type:e,schema:t[e].schema&&this.getSchemaByRef(t[e].schema,!0)}))}getRequestBodyByRef(e,t=[]){if(M.isRef(e)){let t=this.doc.components?.requestBodies?.[M.ref2name(e.$ref,this.doc)];if(!t)return[];e=t}let{content:n={}}=e;return Object.keys(n).map(e=>({type:e,schema:n[e].schema&&this.getSchemaByRef(n[e].schema,!1,t)}))}toBaseSchema(e,t=[],n=``,r=``){if(!e)return{type:`unknown`};if(M.isRef(e))return this.getSchemaByRef(e,!0);if(this.isOpenAPIArraySchema(e)){let{type:i,description:a,items:o,required:s}=e;return{type:i,required:!!s,description:a,items:this.toBaseSchema(o,t,n,r)}}else{let{required:i=[],allOf:a,anyOf:o,description:s,deprecated:c,enum:l,format:u,oneOf:d,properties:f={}}=e,{type:p}=e;if(l&&p!==`boolean`){let a={name:M.upperCamelCase(M.normalize(r))+M.upperCamelCase(M.normalize(n)),enum:[...new Set(l)]},o=M.findSameSchema(a,t);return!o&&M.isValidEnumType(e)&&t.push(a),{type:o?o.name:M.isBooleanEnum(e)?`boolean`:a.name,required:i,description:s,deprecated:c}}return p===void 0&&Object.keys(f).length>0&&(p=`object`),{type:p,required:i,description:s,deprecated:c,enum:l,format:u,allOf:a?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),anyOf:o?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),oneOf:d?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),properties:Object.keys(f).reduce((e,n)=>{let i=f[n];return{...e,[n]:M.isRef(i)?{type:M.capitalize(M.ref2name(i.$ref,this.doc)),isRef:!0}:this.toBaseSchema(i,t,n,r)}},{})}}}init(){let{components:e={},paths:t={}}=this.doc,n=[],{requestBodies:r={},responses:i={},parameters:a={},schemas:o={}}=e,s=Object.keys(o).reduce((e,t)=>{let r=o[t];return{...e,[t]:this.getSchemaByRef(r,!1,n,t)}},{}),c=Object.keys(a).reduce((e,t)=>{let r=a[t];return{...e,[t]:this.getParameterByRef(r,n,t)}},{}),l=Object.keys(i).reduce((e,t)=>{let n=i[t];return{...e,[t]:this.getResponseByRef(n)}},{}),u=Object.keys(r).reduce((e,t)=>{let i=r[t];return{...e,[t]:this.getRequestBodyByRef(i,n)}},{}),d=Object.keys(t).reduce((e,r)=>{let i=t[r]??{};if(i.$ref){let e=this.resolvePathRef(i.$ref);e&&(i=e)}let{parameters:a=[],description:o,summary:s}=i,c=[];return Object.values(j).forEach(e=>{let t=i[e];if(t){let{deprecated:r,operationId:i,responses:l={},summary:u,description:d,requestBody:f={content:{}}}=t,{parameters:p=[]}=t,m=[...a,...p].map(e=>this.getParameterByRef(e,n)),h=this.getRequestBodyByRef(f,n),g=[...new Set(m.map(e=>e.name))];Object.keys(l).length===0&&Object.assign(l,{200:{description:`Successful response`}});let _=Object.keys(l);for(let t of _)if(t in l){let n=l[t],a=this.getResponseByRef(n);c.push({method:e,operationId:i,summary:u??s,description:d??o,deprecated:r,parameters:g.map(e=>m.find(t=>t.name===e)).filter(e=>e!==void 0),responses:a,requestBody:h});break}}}),{...e,[r]:c}},{});return{enums:M.uniqueEnums(n),schemas:s,responses:l,parameters:c,requestBodies:u,apis:d}}},R=class{doc;constructor(e){this.doc=e}resolvePathRef(e){let t=M.ref2name(e,this.doc);return this.doc.paths?.[t]}isOpenAPIArraySchema(e){return typeof e==`object`&&e.type===`array`}getSchemaByRef(e,t=!1,n=[],r=``){let i=``;if(M.isRef(e)){if(i=M.upperCamelCase(M.ref2name(e.$ref)),t)return{type:r+i};this.doc.components||(this.doc.components={schemas:{}});let n=this.doc.components.schemas?.[M.ref2name(e.$ref,this.doc)];if(!n)throw Error(`Schema reference not found: ${i}`);e=n}return this.toBaseSchema(e,n,``,r+i)}getParameterByRef(e,t=[],n=``){M.isRef(e)&&(e=this.doc.components?.parameters?.[M.ref2name(e.$ref,this.doc)]);let{name:r,required:i,deprecated:a,description:o,schema:s}=e;if(s&&!M.isRef(s)&&s.enum){let c=M.upperCamelCase(M.normalize(n))+M.upperCamelCase(M.normalize(r)),l={name:c,enum:[...new Set(s.enum)]},u=M.findSameSchema(l,t);return!u&&M.isValidEnumType(s)&&t.push(l),{name:r,required:i,description:o,deprecated:a,in:e.in,schema:{type:u?.name??c}}}return{name:r,required:i,description:o,deprecated:a,in:e.in,schema:e.schema&&this.getSchemaByRef(e.schema,!1,t,n+M.capitalize(r))}}getResponseByRef(e){M.isRef(e)&&(e=this.doc.components?.responses?.[M.ref2name(e.$ref,this.doc)]);let{content:t={}}=e;return Object.keys(t).map(e=>({type:e,schema:t[e].schema&&this.getSchemaByRef(t[e].schema,!0)}))}getRequestBodyByRef(e,t=[]){M.isRef(e)&&(e=this.doc.components?.requestBodies?.[M.ref2name(e.$ref,this.doc)]);let{content:n={}}=e;return Object.keys(n).map(e=>({type:e,schema:n[e].schema&&this.getSchemaByRef(n[e].schema,!0,t)}))}toBaseSchema(e,t=[],n=``,r=``){if(!e)return{type:`unknown`};if(M.isRef(e))return this.getSchemaByRef(e,!0);if(this.isOpenAPIArraySchema(e)){let{type:i,description:a,items:o,required:s}=e;return{type:i,required:!!s,description:a,items:this.toBaseSchema(o,t,n,r)}}else{let{required:i=[],allOf:a,anyOf:o,description:s,deprecated:c,enum:l,format:u,oneOf:d,properties:f={}}=e,{type:p}=e;if(l&&p!==`boolean`){let a={name:M.upperCamelCase(M.normalize(r))+M.upperCamelCase(M.normalize(n)),enum:[...new Set(l)]},o=M.findSameSchema(a,t);return!o&&M.isValidEnumType(e)&&t.push(a),{type:o?o.name:M.isBooleanEnum(e)?`boolean`:a.name,required:i,description:s,deprecated:c}}return p===void 0&&Object.keys(f).length>0&&(p=`object`),{type:p,required:i,description:s,deprecated:c,enum:l,format:u,allOf:a?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),anyOf:o?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),oneOf:d?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),properties:Object.keys(f).reduce((e,n)=>{let i=f[n];return{...e,[n]:M.isRef(i)?{type:M.capitalize(M.ref2name(i.$ref,this.doc)),isRef:!0}:this.toBaseSchema(i,t,n,r)}},{})}}}init(){let{components:e={},paths:t={}}=this.doc,n=[],{requestBodies:r={},responses:i={},parameters:a={},schemas:o={}}=e,s=Object.keys(o).reduce((e,t)=>{let r=o[t];return{...e,[t]:this.getSchemaByRef(r,!1,n,t)}},{}),c=Object.keys(a).reduce((e,t)=>{let r=a[t];return{...e,[t]:this.getParameterByRef(r,n,t)}},{}),l=Object.keys(i).reduce((e,t)=>{let n=i[t];return{...e,[t]:this.getResponseByRef(n)}},{}),u=Object.keys(r).reduce((e,t)=>{let i=r[t];return{...e,[t]:this.getRequestBodyByRef(i,n)}},{}),d=Object.keys(t).reduce((e,r)=>{let i=t[r]??{};if(i.$ref){let e=this.resolvePathRef(i.$ref);e&&(i=e)}let{parameters:a=[],description:o,summary:s}=i,c=[];return Object.values(j).forEach(e=>{let t=i[e];if(t){let{deprecated:r,operationId:i,summary:l,description:u,responses:d={},requestBody:f={content:{}}}=t,{parameters:p=[]}=t,m=[...a,...p].map(e=>this.getParameterByRef(e,n)),h=this.getRequestBodyByRef(f,n),g=[...new Set(m.map(e=>e.name))];Object.keys(d).length===0&&Object.assign(d,{200:{description:`Successful response`}});let _=Object.keys(d);for(let t of _)if(t in d){let n=d[t],a=this.getResponseByRef(n);c.push({method:e,operationId:i,summary:l??s,description:u??o,deprecated:r,parameters:g.map(e=>m.find(t=>t.name===e)).filter(e=>e!==void 0),responses:a,requestBody:h});break}}}),{...e,[r]:c}},{});return{enums:M.uniqueEnums(n),schemas:s,responses:l,parameters:c,requestBodies:u,apis:d}}};const z=(0,d.createScopedLogger)(`OpenAPI`);function B(e){switch((e.openapi||e.swagger).slice(0,3)){case`3.1`:return`v3_1`;case`3.0`:return`v3`;case`2.0`:return`v2`;default:return`unknown`}}var V=class extends ne{parse(e){let t=B(e);switch(z.debug(`openapi version ${t}`),t){case`v2`:return new I(e).init();case`v3`:return new L(e).init();case`v3_1`:return new R(e).init();default:throw Error(`Not a valid OpenAPI version: ${t}`)}}};function H(e){switch(e){case`axios`:return new P;default:return new F}}async function U(e){let t=Date.now(),{verbose:n}=e;n?z.setLevel(`debug`):z.setLevel(`info`),z.info(`Fetch document from ${e.docURL}`);let{enums:r,schemas:i,parameters:a,responses:o,requestBodies:s,apis:c}=new V(e,await M.fetchDoc(e.docURL,e.requestOptions)),l=H(e.adaptor??`fetch`),u=await N.genCode({enums:r,schemas:i,parameters:a,responses:o,requestBodies:s,apis:c},e,l);e.output&&await N.write(u,e.output);let d=Date.now()-t;return{code:u,stats:{endpoints:Object.keys(c).length,schemas:Object.keys(i).length,duration:d}}}const W=e=>`\x1b[36m${e}\x1b[0m`,G=e=>`\x1b[32m${e}\x1b[0m`,K=e=>`\x1b[31m${e}\x1b[0m`,q=e=>`\x1b[34m${e}\x1b[0m`,J=e=>`\x1b[33m${e}\x1b[0m`,Y=e=>`\x1b[35m${e}\x1b[0m`,X=e=>`\x1b[90m${e}\x1b[0m`,Z={banner(e){console.log(W(`
11
10
 
12
11
  ▄▄▄ ██▓███ ██▓ ▄████▄ ▒█████ ▓█████▄ ▓█████ ▄████ ▓█████ ███▄ █
13
12
  ▒████▄ ▓██░ ██▒▓██▒▒██▀ ▀█ ▒██▒ ██▒▒██▀ ██▌▓█ ▀ ██▒ ▀█▒▓█ ▀ ██ ▀█ █
@@ -21,4 +20,4 @@ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=
21
20
  ░ ░
22
21
 
23
22
  API Code Generator v${e}
24
- `))},success(e){console.log(`${G(`✓`)} ${e}`)},error(e,t=!1){if(D(e))console.error(`${K(`✗`)} ${e.toString(t)}`);else if(e instanceof Error){let n=`Error: ${e.message}`;console.error(`${K(`✗`)} ${n}${t&&e.stack?`\n${X(e.stack)}`:``}`)}else console.error(`${K(`✗`)} ${String(e)}`)},info(e){console.log(`${q(`ℹ`)} ${e}`)},warn(e){console.log(`${J(`⚠`)} ${e}`)},loading(e){console.log(`${J(`🔄`)} ${e}`)},watching(e){console.log(`${Y(`⟳`)} ${e}`)},fileChange(e){console.log(`${J(`↓`)} ${e}`)},fileAdd(e){console.log(`${G(`+`)} ${e}`)},shutdown(){console.log(`\n${X(`👋 Shutting down...`)}`)}},Q=g.version;async function re(e){let t=async()=>{try{let{endpoints:t,schemas:n,duration:r}=(await U(e)).stats;Z.success(`Regenerated ${e.output} (${t} endpoints, ${n} schemas) ${r}ms`)}catch(e){Z.error(e,!0)}},n=e.docURL,r=c.default.dirname(c.default.isAbsolute(n)?n:c.default.resolve(process.cwd(),n));return u.default.watch(r,{persistent:!0},async(e,n)=>{n&&(e===`change`||e===`rename`)&&(Z.fileChange(n),await t())})}function ie(e,t){return e.startsWith(`http://`)||e.startsWith(`https://`)?e:e.startsWith(`/`)||e.match(/^[A-Za-z]:/)?`file://${e}`:t?new URL(e,t).href:c.default.resolve(process.cwd(),e)}async function ae(e){if(e.startsWith(`http://`)||e.startsWith(`https://`))return;let t=e.replace(/^file:\/\//,``),n=c.default.isAbsolute(t)?t:c.default.resolve(process.cwd(),t);if(!await u.default.pathExists(n))throw E.specNotFound(n)}function oe(e){return e.startsWith(`http://`)||e.startsWith(`https://`)}const $=(0,l.createCommand)(`apicodegen`);$.name(`apicodegen`).version(Q).description(`API code generation from OpenAPI specifications`).argument(`[spec]`,`URL or path to OpenAPI documentation`).option(`-s, --spec <path>`,`OpenAPI spec file path or URL`).option(`-o, --output <path>`,`Output file path`).option(`-a, --adaptor <type>`,`HTTP client adaptor (fetch|axios)`,`fetch`).option(`-b, --baseURL <url>`,`Base URL for API endpoints`).option(`-c, --config <path>`,`Path to config file`).option(`-w, --watch`,`Watch for file changes and regenerate`).option(`-v, --verbose`,`Enable verbose logging`).option(`--importClientSource <path>`,`Custom client import source path`).action(async(e,t)=>{if(Z.banner(Q),!e&&!t.spec){Z.info(`Usage: apicodegen [options] [spec]`),Z.info(`Run 'apicodegen --help' for full options.`);return}let n={};t.spec&&(n.spec=t.spec),t.output&&(n.output=t.output),t.adaptor&&(n.adaptor=t.adaptor),t.baseURL&&(n.baseURL=t.baseURL),t.verbose&&(n.verbose=t.verbose),t.watch&&(n.watch=t.watch),t.importClientSource&&(n.importClientSource=t.importClientSource),t.config&&(n.configFile=t.config),e&&(n.spec=e);try{let e=await S({cwd:process.cwd(),cliOptions:n});await ae(e.spec);let t=ie(e.spec,e.baseURL),r={...C(e),docURL:t};if(e.watch){Z.watching(`Watching for changes...`);let e=[];if(!t.startsWith(`http`)){let n=t.replace(/^file:\/\//,``),r=c.default.dirname(n);e.push(`${r}/**/*.json`,`${r}/**/*.yaml`,`${r}/**/*.yml`)}let n=await re(r),i=async()=>{Z.shutdown(),n&&await n.close(),process.exit(0)};process.on(`SIGINT`,i),process.on(`SIGTERM`,i)}else{oe(t)&&Z.loading(`Fetching spec from ${t}...`);let{endpoints:n,schemas:i,duration:a}=(await U(r)).stats;Z.success(`Generated ${e.output} (${n} endpoints, ${i} schemas) ${a}ms`)}}catch(e){if(D(e))Z.error(e,t.verbose);else{let n=te(e,{code:`E_GENERATION_FAILED`,message:`An unexpected error occurred`});Z.error(n,t.verbose)}process.exit(1)}}),$.parse();
23
+ `))},success(e){console.log(`${G(`✓`)} ${e}`)},error(e,t=!1){if(D(e))console.error(`${K(`✗`)} ${e.toString(t)}`);else if(e instanceof Error){let n=`Error: ${e.message}`;console.error(`${K(`✗`)} ${n}${t&&e.stack?`\n${X(e.stack)}`:``}`)}else console.error(`${K(`✗`)} ${String(e)}`)},info(e){console.log(`${q(`ℹ`)} ${e}`)},warn(e){console.log(`${J(`⚠`)} ${e}`)},loading(e){console.log(`${J(`🔄`)} ${e}`)},watching(e){console.log(`${Y(`⟳`)} ${e}`)},fileChange(e){console.log(`${J(`↓`)} ${e}`)},fileAdd(e){console.log(`${G(`+`)} ${e}`)},shutdown(){console.log(`\n${X(`👋 Shutting down...`)}`)}},Q=g.version;async function re(e){let t=async()=>{try{let{endpoints:t,schemas:n,duration:r}=(await U(e)).stats;Z.success(`Regenerated ${e.output} (${t} endpoints, ${n} schemas) ${r}ms`)}catch(e){Z.error(e,!0)}},n=e.docURL,r=c.default.dirname(c.default.isAbsolute(n)?n:c.default.resolve(process.cwd(),n));return u.default.watch(r,{persistent:!0},async(e,n)=>{n&&(e===`change`||e===`rename`)&&(Z.fileChange(n),await t())})}function ie(e,t){return e.startsWith(`http://`)||e.startsWith(`https://`)?e:e.startsWith(`/`)||e.match(/^[A-Za-z]:/)?`file://${e}`:t?new URL(e,t).href:c.default.resolve(process.cwd(),e)}async function ae(e){if(e.startsWith(`http://`)||e.startsWith(`https://`))return;let t=e.replace(/^file:\/\//,``),n=c.default.isAbsolute(t)?t:c.default.resolve(process.cwd(),t);if(!await u.default.pathExists(n))throw T.specNotFound(n)}function oe(e){return e.startsWith(`http://`)||e.startsWith(`https://`)}const $=(0,l.createCommand)(`apicodegen`);$.name(`apicodegen`).version(Q).description(`API code generation from OpenAPI specifications`).argument(`[spec]`,`URL or path to OpenAPI documentation`).option(`-s, --spec <path>`,`OpenAPI spec file path or URL`).option(`-o, --output <path>`,`Output file path`).option(`-a, --adaptor <type>`,`HTTP client adaptor (fetch|axios)`,`fetch`).option(`-b, --baseURL <url>`,`Base URL for API endpoints`).option(`-c, --config <path>`,`Path to config file`).option(`-w, --watch`,`Watch for file changes and regenerate`).option(`-v, --verbose`,`Enable verbose logging`).option(`--importClientSource <path>`,`Custom client import source path`).action(async(e,t)=>{if(Z.banner(Q),!e&&!t.spec){Z.info(`Usage: apicodegen [options] [spec]`),Z.info(`Run 'apicodegen --help' for full options.`);return}let n={};t.spec&&(n.spec=t.spec),t.output&&(n.output=t.output),t.adaptor&&(n.adaptor=t.adaptor),t.baseURL&&(n.baseURL=t.baseURL),t.verbose&&(n.verbose=t.verbose),t.watch&&(n.watch=t.watch),t.importClientSource&&(n.importClientSource=t.importClientSource),t.config&&(n.configFile=t.config),e&&(n.spec=e);try{let e=await te({cwd:process.cwd(),cliOptions:n});await ae(e.spec);let t=ie(e.spec,e.baseURL),r={...S(e),docURL:t};if(e.watch){Z.watching(`Watching for changes...`);let e=[];if(!t.startsWith(`http`)){let n=t.replace(/^file:\/\//,``),r=c.default.dirname(n);e.push(`${r}/**/*.json`,`${r}/**/*.yaml`,`${r}/**/*.yml`)}let n=await re(r),i=async()=>{Z.shutdown(),n&&await n.close(),process.exit(0)};process.on(`SIGINT`,i),process.on(`SIGTERM`,i)}else{oe(t)&&Z.loading(`Fetching spec from ${t}...`);let{endpoints:n,schemas:i,duration:a}=(await U(r)).stats;Z.success(`Generated ${e.output} (${n} endpoints, ${i} schemas) ${a}ms`)}}catch(e){if(D(e))Z.error(e,t.verbose);else{let n=E(e,{code:`E_GENERATION_FAILED`,message:`An unexpected error occurred`});Z.error(n,t.verbose)}process.exit(1)}}),$.parse();
package/npm/index.cjs CHANGED
@@ -263,7 +263,9 @@ var Base = class Base {
263
263
  */
264
264
  static camelCase(text) {
265
265
  text = text.trim();
266
- return text.split("_").filter(Boolean).map((t, index) => index === 0 ? t : Base.capitalize(t)).join("");
266
+ const parts = text.split("_").filter(Boolean);
267
+ while (parts[0]?.match(/^\d/)) parts.shift();
268
+ return parts.map((t, index) => index === 0 ? t : Base.capitalize(t)).join("");
267
269
  }
268
270
  /**
269
271
  * Converts a string to UpperCamelCase.
@@ -492,9 +494,12 @@ var Generator = class Generator {
492
494
  static addComments(node, comments) {
493
495
  if (!Array.isArray(comments) || comments.filter(Boolean).length === 0) return;
494
496
  const formatComment = (comment) => {
495
- return comment.tag ? ` @${comment.tag} ${comment.comment ?? ""}` : ` ${comment.comment}`;
497
+ if (comment.tag === "returns") return `* @returns {${comment.type}} ${comment.comment ?? ""}`;
498
+ if (comment.tag === "param") return comment.comment ? `* @param ${comment.paramName} - ${comment.comment}` : `* @param ${comment.paramName}`;
499
+ if (comment.tag) return `* @${comment.tag} ${comment.comment ?? ""}`;
500
+ return `* ${comment.comment}`;
496
501
  };
497
- const formattedComments = "*\n" + comments.map(formatComment).join("\n").trim() + "\n";
502
+ const formattedComments = comments.map(formatComment).join("\n").trim() + "\n";
498
503
  (0, typescript.addSyntheticLeadingComment)(node, typescript.SyntaxKind.MultiLineCommentTrivia, formattedComments, true);
499
504
  }
500
505
  /**
@@ -511,6 +516,53 @@ var Generator = class Generator {
511
516
  const nonArraySchema = schema;
512
517
  return nonArraySchema.format === "blob" || nonArraySchema.format === "binary" || nonArraySchema.type === "file";
513
518
  }
519
+ static schemaToTypeString(schema) {
520
+ if (schema.type === "array") {
521
+ const arraySchema = schema;
522
+ return arraySchema.items ? `${Generator.schemaToTypeString(arraySchema.items)}[]` : "unknown";
523
+ }
524
+ const singleSchema = schema;
525
+ if (schema.type === "string") return "string";
526
+ if (schema.type === "number" || schema.type === "integer") return "number";
527
+ if (schema.type === "boolean") return "boolean";
528
+ if (schema.type === "object" || schema.properties) return "object";
529
+ if (singleSchema.format === "binary" || singleSchema.type === "file") return "Blob";
530
+ if (singleSchema.format === "blob") return "Blob";
531
+ if (singleSchema.ref) return singleSchema.ref;
532
+ return "unknown";
533
+ }
534
+ static generateParamTags(parameters, requestBody) {
535
+ const tags = [];
536
+ for (const p of parameters) {
537
+ const paramName = Base.camelCase(Base.normalize(p.name));
538
+ let paramType = "unknown";
539
+ if (p.schema) paramType = Generator.schemaToTypeString(p.schema);
540
+ const isOptional = p.required === false;
541
+ tags.push({
542
+ tag: "param",
543
+ paramName,
544
+ type: `${paramType}${isOptional ? " | undefined" : ""}`,
545
+ comment: p.description ?? ""
546
+ });
547
+ }
548
+ if (requestBody?.schema && "properties" in requestBody.schema) {
549
+ const properties = requestBody.schema.properties;
550
+ const required = requestBody.schema.required;
551
+ const requiredArray = Array.isArray(required) ? required : [];
552
+ for (const [key, schema] of Object.entries(properties ?? {})) {
553
+ const paramName = `req.${key}`;
554
+ const paramType = Generator.schemaToTypeString(schema);
555
+ const isOptional = !requiredArray.includes(key);
556
+ tags.push({
557
+ tag: "param",
558
+ paramName,
559
+ type: `${paramType}${isOptional ? " | undefined" : ""}`,
560
+ comment: schema.description ?? ""
561
+ });
562
+ }
563
+ }
564
+ return tags;
565
+ }
514
566
  static toRequestBodyTypeNode(schema) {
515
567
  return typescript.factory.createParameterDeclaration(void 0, void 0, typescript.factory.createIdentifier("req"), void 0, Generator.toTypeNode(schema));
516
568
  }
@@ -589,8 +641,8 @@ var Generator = class Generator {
589
641
  typescript.factory.createIdentifier("file"),
590
642
  typescript.factory.createPropertyAccessExpression(typescript.factory.createAsExpression(typescript.factory.createIdentifier("file"), typescript.factory.createTypeReferenceNode(typescript.factory.createIdentifier("File"), void 0)), typescript.factory.createIdentifier("name"))
591
643
  ]))])));
592
- else if (schemaByKey.required) statements.push(typescript.factory.createExpressionStatement(typescript.factory.createCallExpression(typescript.factory.createPropertyAccessExpression(typescript.factory.createIdentifier("fd"), typescript.factory.createIdentifier("append")), void 0, [typescript.factory.createStringLiteral(key), schemaByKey.type === "string" ? typescript.factory.createElementAccessExpression(typescript.factory.createIdentifier("req"), typescript.factory.createStringLiteral(key)) : typescript.factory.createCallExpression(typescript.factory.createIdentifier("String"), void 0, [typescript.factory.createElementAccessExpression(typescript.factory.createIdentifier("req"), typescript.factory.createStringLiteral(key))])])));
593
- else statements.push(typescript.factory.createExpressionStatement(typescript.factory.createBinaryExpression(typescript.factory.createElementAccessExpression(typescript.factory.createIdentifier("req"), typescript.factory.createStringLiteral(key)), typescript.factory.createToken(typescript.SyntaxKind.AmpersandAmpersandToken), typescript.factory.createCallExpression(typescript.factory.createPropertyAccessExpression(typescript.factory.createIdentifier("fd"), typescript.factory.createIdentifier("append")), void 0, [typescript.factory.createStringLiteral(key), schemaByKey.type === "string" ? typescript.factory.createElementAccessExpression(typescript.factory.createIdentifier("req"), typescript.factory.createStringLiteral(key)) : typescript.factory.createCallExpression(typescript.factory.createIdentifier("String"), void 0, [typescript.factory.createElementAccessExpression(typescript.factory.createIdentifier("req"), typescript.factory.createStringLiteral(key))])]))));
644
+ else if (schemaByKey.required) statements.push(typescript.factory.createExpressionStatement(typescript.factory.createCallExpression(typescript.factory.createPropertyAccessExpression(typescript.factory.createIdentifier("fd"), typescript.factory.createIdentifier("append")), void 0, [typescript.factory.createStringLiteral(key), schemaByKey.type === "string" || Generator.isBinarySchema(schemaByKey) || schemaByKey.isRef ? typescript.factory.createElementAccessExpression(typescript.factory.createIdentifier("req"), typescript.factory.createStringLiteral(key)) : schemaByKey.type === "array" || schemaByKey.type === "object" ? typescript.factory.createCallExpression(typescript.factory.createPropertyAccessExpression(typescript.factory.createIdentifier("JSON"), typescript.factory.createIdentifier("stringify")), void 0, [typescript.factory.createElementAccessExpression(typescript.factory.createIdentifier("req"), typescript.factory.createStringLiteral(key))]) : typescript.factory.createCallExpression(typescript.factory.createIdentifier("String"), void 0, [typescript.factory.createElementAccessExpression(typescript.factory.createIdentifier("req"), typescript.factory.createStringLiteral(key))])])));
645
+ else statements.push(typescript.factory.createExpressionStatement(typescript.factory.createBinaryExpression(typescript.factory.createElementAccessExpression(typescript.factory.createIdentifier("req"), typescript.factory.createStringLiteral(key)), typescript.factory.createToken(typescript.SyntaxKind.AmpersandAmpersandToken), typescript.factory.createCallExpression(typescript.factory.createPropertyAccessExpression(typescript.factory.createIdentifier("fd"), typescript.factory.createIdentifier("append")), void 0, [typescript.factory.createStringLiteral(key), schemaByKey.type === "string" || Generator.isBinarySchema(schemaByKey) || schemaByKey.isRef ? typescript.factory.createElementAccessExpression(typescript.factory.createIdentifier("req"), typescript.factory.createStringLiteral(key)) : schemaByKey.type === "array" || schemaByKey.type === "object" ? typescript.factory.createCallExpression(typescript.factory.createPropertyAccessExpression(typescript.factory.createIdentifier("JSON"), typescript.factory.createIdentifier("stringify")), void 0, [typescript.factory.createElementAccessExpression(typescript.factory.createIdentifier("req"), typescript.factory.createStringLiteral(key))]) : typescript.factory.createCallExpression(typescript.factory.createIdentifier("String"), void 0, [typescript.factory.createElementAccessExpression(typescript.factory.createIdentifier("req"), typescript.factory.createStringLiteral(key))])]))));
594
646
  });
595
647
  return statements;
596
648
  }
@@ -602,7 +654,7 @@ var Generator = class Generator {
602
654
  const parametersShouldNotPutInFormData = parameters.filter((p) => !parametersShouldPutInFormData.includes(p));
603
655
  const isRequestBodyContainsBinary = requestBody?.schema && "properties" in requestBody.schema && Object.values(requestBody.schema?.properties ?? {}).some((p) => Generator.isBinarySchema(p));
604
656
  const hasBinaryInParameters = parameters.some((p) => p?.schema && Generator.isBinarySchema(p.schema));
605
- const shouldPutParametersOrBodyInFormData = isFormDataRequest || isRequestBodyBinary || hasBinaryInParameters || isRequestBodyContainsBinary || parametersShouldPutInFormData.length > 0;
657
+ const shouldPutParametersOrBodyInFormData = !!isFormDataRequest && (isRequestBodyBinary || hasBinaryInParameters || isRequestBodyContainsBinary || parametersShouldPutInFormData.length > 0);
606
658
  return typescript.factory.createBlock([...shouldPutParametersOrBodyInFormData ? Generator.toFormDataStatement(parametersShouldPutInFormData, requestBody?.schema) : [], ...adapter.client(uri, method, parametersShouldNotPutInFormData, requestBody, response, adapter, shouldPutParametersOrBodyInFormData, shouldParseResponseToJSON)]);
607
659
  }
608
660
  static schemaToStatemets(parsedDoc, adaptor, options) {
@@ -629,10 +681,11 @@ var Generator = class Generator {
629
681
  const shouldAddExtraMethodNameSuffix = requestBody.length > 1;
630
682
  for (const req of requestBody) {
631
683
  const statement = typescript.factory.createFunctionDeclaration([typescript.factory.createModifier(typescript.SyntaxKind.ExportKeyword), typescript.factory.createModifier(typescript.SyntaxKind.AsyncKeyword)], void 0, Base.pathToFnName(uri, method, operationId) + (shouldAddExtraMethodNameSuffix ? Base.capitalize(req.type.split("/")[1]) : ""), void 0, [...parameters.length > 0 ? Generator.toDeclarationNodes(parameters) : [], ...req?.schema ? [Generator.toRequestBodyTypeNode(req.schema)] : []].filter(Boolean), void 0, Generator.bodyBlock(options.baseURL + uri, method, parameters, req, responses[0], adaptor));
684
+ const mergedDescription = [description, summary].filter(Boolean).join(". ");
632
685
  Generator.addComments(statement, [
633
- description && { comment: description },
634
- summary && { comment: summary },
635
- deprecated && { tag: "deprecated" }
686
+ mergedDescription && { comment: mergedDescription },
687
+ deprecated && { tag: "deprecated" },
688
+ ...Generator.generateParamTags(parameters, req)
636
689
  ].filter(Boolean));
637
690
  statements.push(statement);
638
691
  }
@@ -1570,7 +1623,10 @@ var V3 = class {
1570
1623
  const propSchema = properties[p];
1571
1624
  return {
1572
1625
  ...acc,
1573
- [p]: Base.isRef(propSchema) ? { type: Base.capitalize(Base.ref2name(propSchema.$ref, this.doc)) } : this.toBaseSchema(propSchema, enums, p, upLevelSchemaKey)
1626
+ [p]: Base.isRef(propSchema) ? {
1627
+ type: Base.capitalize(Base.ref2name(propSchema.$ref, this.doc)),
1628
+ isRef: true
1629
+ } : this.toBaseSchema(propSchema, enums, p, upLevelSchemaKey)
1574
1630
  };
1575
1631
  }, {})
1576
1632
  };
@@ -1805,7 +1861,10 @@ var V3_1 = class {
1805
1861
  const propSchema = properties[p];
1806
1862
  return {
1807
1863
  ...acc,
1808
- [p]: Base.isRef(propSchema) ? { type: Base.capitalize(Base.ref2name(propSchema.$ref, this.doc)) } : this.toBaseSchema(propSchema, enums, p, upLevelSchemaKey)
1864
+ [p]: Base.isRef(propSchema) ? {
1865
+ type: Base.capitalize(Base.ref2name(propSchema.$ref, this.doc)),
1866
+ isRef: true
1867
+ } : this.toBaseSchema(propSchema, enums, p, upLevelSchemaKey)
1809
1868
  };
1810
1869
  }, {})
1811
1870
  };