@zodios/openapi
Version:
Openapi for zodios
7 lines (4 loc) • 3.61 kB
JavaScript
import { zodToJsonSchema } from 'zod-to-json-schema';
import { z as z$1 } from 'zod';
function a(e,t){var i,s,o;return ((i=e._def)==null?void 0:i.typeName)===t?!0:((s=e._def)==null?void 0:s.typeName)===z$1.ZodFirstPartyTypeKind.ZodEffects&&e._def.effect.type==="refinement"?a(e.innerType(),t):(o=e._def)!=null&&o.innerType?a(e._def.innerType,t):!1}var u=/:([a-zA-Z_][a-zA-Z0-9_]*)/g,Z=["Body","Path"];function V(e){return e.indexOf("?")>-1?e.split("?")[0]:e.indexOf("#")>-1?e.split("#")[0]:e}function j(e){let t=V(e).replace(u,"").split("/").filter(i=>i!=="");return t?[t[t.length-1]]:void 0}function z(e){return {type:"http",scheme:"bearer",bearerFormat:"JWT",description:e}}function q(e){return {type:"http",scheme:"basic",description:e}}function K(e,t){return {type:"apiKey",description:t,...e}}function R(e,t){return {type:"oauth2",description:t,flows:e}}function F(e,t){var i;return (i=e.parameters)==null?void 0:i.find(s=>s.type==="Path"&&s.name===t)}function h(e){return zodToJsonSchema(e,{target:"openApi3",$refStrategy:"none"})}function A(e){var s;let{tagsFromPathFn:t=j}=e,i={openapi:"3.0.0",info:e.info??{title:"Zodios : add an info object to 'toOpenApi' options",version:"1.0.0"},servers:e.servers,paths:{}};e.securitySchemes&&(i.components={securitySchemes:e.securitySchemes});for(let o of e.apis)for(let r of o.definitions){let y={[`${r.status??200}`]:{description:r.responseDescription??r.response.description??"Success",content:{"application/json":{schema:h(r.response)}}}};for(let n of r.errors??[])y[`${n.status}`]={description:n.description??n.schema.description??"Error",content:{"application/json":{schema:h(n.schema)}}};let m=[],O=r.path.match(u);if(O)for(let n of O){let c=n.slice(1),p=F(r,c);p?m.push({name:c,description:p.description??p.schema.description,in:"path",schema:h(p.schema),required:!0}):m.push({name:c,in:"path",schema:{type:"string"},required:!0});}for(let n of r.parameters??[])if(!Z.includes(n.type)){let c=!n.schema.isOptional(),p=n.schema.description,I=c||!a(n.schema,z$1.ZodFirstPartyTypeKind.ZodOptional)?n.schema:n.schema.unwrap();m.push({name:n.type==="Query"&&a(n.schema,z$1.ZodFirstPartyTypeKind.ZodArray)?`${n.name}[]`:n.name,in:n.type.toLowerCase(),schema:h(I),description:n.description??p,required:c});}let P=r.path.replace(u,"{$1}"),d=(s=r.parameters)==null?void 0:s.find(n=>n.type==="Body"),g={operationId:r.alias,summary:r.description,description:r.description,tags:t(r.path),security:"scheme"in o&&o.scheme?[{[o.scheme]:o.securityRequirement??[]}]:void 0,requestBody:d?{description:d.description??d.schema.description,content:{"application/json":{schema:h(d.schema)}}}:void 0,parameters:m,responses:y};i.paths[P]={...i.paths[P],[r.method]:g};}return i}function _(e,t){return A({apis:[{scheme:"auth",definitions:e}],securitySchemes:t!=null&&t.securityScheme?{auth:t.securityScheme}:void 0,...t})}var f=class{constructor(t){this.apis=[];this.options={info:t};}addSecurityScheme(t,i){var s;return (s=this.options).securitySchemes??(s.securitySchemes={}),this.options.securitySchemes[t]=i,this}addPublicApi(t){return this.apis.push({definitions:t}),this}addProtectedApi(t,i,s){return this.apis.push({scheme:t,definitions:i,securityRequirement:s}),this}addServer(t){var i;return (i=this.options).servers??(i.servers=[]),this.options.servers.push(t),this}setCustomTagsFn(t){return this.options.tagsFromPathFn=t,this}build(){return A({apis:this.apis,...this.options})}};function $(e){return new f(e)}
export { f as OpenApiBuilder, K as apiKeyAuthScheme, q as basicAuthScheme, z as bearerAuthScheme, R as oauth2Scheme, $ as openApiBuilder, _ as toOpenApi };