@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 +6 -7
- package/npm/index.cjs +70 -11
- package/npm/index.cjs.map +1 -1
- package/npm/index.d.cts +6 -1
- package/npm/index.d.cts.map +1 -1
- package/npm/index.d.mts +6 -1
- package/npm/index.d.mts.map +1 -1
- package/npm/index.mjs +70 -11
- package/npm/index.mjs.map +1 -1
- package/npm/vite/index.mjs +70 -11
- package/npm/vite/index.mjs.map +1 -1
- package/package.json +1 -1
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
-
|
|
634
|
-
|
|
635
|
-
|
|
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) ? {
|
|
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) ? {
|
|
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
|
};
|