express-zod-api 20.18.0-beta.2 → 20.18.0
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/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -15,7 +15,7 @@ ${o}888${t}
|
|
|
15
15
|
${r}
|
|
16
16
|
`.split(`
|
|
17
17
|
`).map((d,c)=>a[c]?a[c](d):d).join(`
|
|
18
|
-
`)};var io=e=>{e.startupLogo!==!1&&console.log(oo());let t=e.errorHandler||ze,r=Nr(e.logger)?e.logger:new we(e.logger);r.debug("Running",{build:"v20.18.0-beta.2 (CJS)",env:process.env.NODE_ENV||"development"}),to(r);let o=Xr({rootLogger:r,config:e}),i={getChildLogger:eo(r),errorHandler:t},a=Qr(i),p=Yr(i);return{...i,rootLogger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},ao=(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,loggingMiddleware:i}=io(e);return Bt({app:e.app.use(i),rootLogger:r,routing:t,getChildLogger:o,config:e}),{notFoundHandler:n,logger:r}},po=async(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=io(e),p=(0,yt.default)().disable("x-powered-by").use(a);if(e.server.compression){let f=await ve("compression");p.use(f(typeof e.server.compression=="object"?e.server.compression:void 0))}let d={json:[e.server.jsonParser||yt.default.json()],raw:[e.server.rawParser||yt.default.raw(),Wr],upload:e.server.upload?await Jr({config:e,getChildLogger:o}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:p,logger:r,getChildLogger:o}),Bt({app:p,routing:t,rootLogger:r,getChildLogger:o,config:e,parsers:d}),p.use(i,n);let c=(f,T)=>f.listen(T,()=>r.info("Listening",T)),u=no.default.createServer(p),m=e.https&&so.default.createServer(e.https.options,p);return e.gracefulShutdown&&ro({servers:[u].concat(m||[]),logger:r,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,httpServer:c(u,e.server.listen),httpsServer:m&&c(m,e.https?.listen)}};var Po=O(require("node:assert/strict"),1),zo=require("openapi3-ts/oas31"),bt=require("ramda");var Q=O(require("node:assert/strict"),1),V=require("openapi3-ts/oas31"),l=require("ramda"),b=require("zod");var de=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[h]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>de(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var co=50,mo="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",un={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},uo=/:([A-Za-z0-9_]+)/g,fn=e=>e.match(uo)?.map(t=>t.slice(1))||[],fo=e=>e.replace(uo,t=>`{${t.slice(1)}}`),yn=({_def:e},{next:t})=>({...t(e.innerType),default:e[h]?.defaultLabel||e.defaultValue()}),gn=({_def:{innerType:e}},{next:t})=>t(e),hn=()=>({format:"any"}),xn=({},e)=>((0,Q.default)(!e.isResponse,new v({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),bn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.z.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Sn=({options:e},{next:t})=>({oneOf:e.map(t)}),Tn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),On=e=>{let[t,r]=e.filter(V.isSchemaObject).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));(0,Q.default)(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,l.mergeDeepWith)((n,i)=>Array.isArray(n)&&Array.isArray(i)?(0,l.concat)(n,i):n===i?i:Q.default.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,l.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=re(t.examples||[],r.examples||[],([n,i])=>(0,l.mergeDeepRight)(n,i))),o},Rn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return On(o)}catch{}return{allOf:o}},An=(e,{next:t})=>t(e.unwrap()),Pn=(e,{next:t})=>t(e.unwrap()),zn=(e,{next:t})=>{let r=t(e.unwrap());return(0,V.isSchemaObject)(r)&&(r.type=go(r)),r},yo=e=>{let t=(0,l.toLower)((0,l.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},lo=e=>({type:yo(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Cn=({value:e})=>({type:yo(e),const:e}),wn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Ke(p)?p instanceof b.z.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=gt(e,r)),i.length&&(a.required=i),a},In=()=>({type:"null"}),Zn=({},e)=>((0,Q.default)(!e.isResponse,new v({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:mo}}),En=({},e)=>((0,Q.default)(e.isResponse,new v({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:mo}}),vn=({},e)=>Q.default.fail(new v({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),jn=()=>({type:"boolean"}),Ln=()=>({type:"integer",format:"bigint"}),Nn=e=>e.every(t=>t instanceof b.z.ZodLiteral),kn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.z.ZodEnum||e instanceof b.z.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=gt(b.z.object((0,l.fromPairs)((0,l.xprod)(o,[t]))),r),n.required=o),n}if(e instanceof b.z.ZodLiteral)return{type:"object",properties:gt(b.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.z.ZodUnion&&Nn(e.options)){let o=(0,l.map)(i=>`${i.value}`,e.options),n=(0,l.fromPairs)((0,l.xprod)(o,[t]));return{type:"object",properties:gt(b.z.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},Mn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},Un=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Hn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:m}})=>{let f=m.find(P=>P.kind==="regex"),T=m.find(P=>P.kind==="datetime"),R=f?f.regex:T?T.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,Z={type:"string"},x={"date-time":u,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let P in x)if(x[P]){Z.format=P;break}return r!==null&&(Z.minLength=r),o!==null&&(Z.maxLength=o),R&&(Z.pattern=R.source),Z},Dn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(m=>m.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(m=>m.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,u={type:e?"integer":"number",format:e?"int64":"double"};return a?u.minimum=i:u.exclusiveMinimum=i,c?u.maximum=d:u.exclusiveMaximum=d,u},gt=({shape:e},t)=>(0,l.map)(t,e),Kn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return un?.[t]},go=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},Fn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,V.isSchemaObject)(o)){let i=et(e,Kn(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(b.z.any())}if(!t&&n.type==="preprocess"&&(0,V.isSchemaObject)(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},Bn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),qn=(e,{next:t})=>t(e.unwrap()),Vn=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),$n=(e,{next:t})=>t(e.unwrap().shape.raw),ho=e=>e.length?(0,l.fromPairs)((0,l.zip)((0,l.range)(1,e.length+1).map(t=>`example${t}`),(0,l.map)((0,l.objOf)("value"),e))):void 0,xo=(e,t,r=[])=>(0,l.pipe)(B,(0,l.map)((0,l.when)(o=>(0,l.type)(o)==="Object",(0,l.omit)(r))),ho)({schema:e,variant:t?"parsed":"original",validate:!0}),_n=(e,t)=>(0,l.pipe)(B,(0,l.filter)((0,l.has)(t)),(0,l.pluck)(t),ho)({schema:e,variant:"original",validate:!0}),le=e=>e instanceof b.z.ZodObject?e:e instanceof b.z.ZodBranded?le(e.unwrap()):e instanceof b.z.ZodUnion||e instanceof b.z.ZodDiscriminatedUnion?e.options.map(t=>le(t)).reduce((t,r)=>t.merge(r.partial()),b.z.object({})):e instanceof b.z.ZodEffects?le(e._def.schema):e instanceof b.z.ZodPipeline?le(e._def.in):le(e._def.left).merge(le(e._def.right)),bo=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=le(r),c=fn(e),u=o.includes("query"),m=o.includes("params"),f=o.includes("headers"),T=x=>m&&c.includes(x),R=x=>f&&Zt(x);return Object.keys(d).map(x=>({name:x,location:T(x)?"path":R(x)?"header":u?"query":void 0})).filter(x=>x.location!==void 0).map(({name:x,location:P})=>{let X=de(d[x],{rules:{...a,...Vt},onEach:$t,onMissing:_t,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),fe=i==="components"?n(d[x],X,M(p,x)):X;return{name:x,in:P,required:!d[x].isOptional(),description:X.description||p,schema:fe,examples:_n(r,x)}})},Vt={ZodString:Hn,ZodNumber:Dn,ZodBigInt:Ln,ZodBoolean:jn,ZodNull:In,ZodArray:Mn,ZodTuple:Un,ZodRecord:kn,ZodObject:wn,ZodLiteral:Cn,ZodIntersection:Rn,ZodUnion:Sn,ZodAny:hn,ZodDefault:yn,ZodEnum:lo,ZodNativeEnum:lo,ZodEffects:Fn,ZodOptional:An,ZodNullable:zn,ZodDiscriminatedUnion:Tn,ZodBranded:qn,ZodDate:vn,ZodCatch:gn,ZodPipeline:Bn,ZodLazy:Vn,ZodReadonly:Pn,[D]:bn,[Se]:xn,[ie]:En,[se]:Zn,[Y]:$n},$t=(e,{isResponse:t,prev:r})=>{if((0,V.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof b.z.ZodLazy,i=r.type!==void 0,a=t&&Ke(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=go(r)),!n){let c=B({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},_t=(e,t)=>Q.default.fail(new v({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),qt=(e,t)=>{if((0,V.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,l.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,l.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>qt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>qt(o,t))),r},So=e=>(0,V.isReferenceObject)(e)?e:(0,l.omit)(["examples"],e),To=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:u=`${e.toUpperCase()} ${t} ${Et(n)} response ${p?d:""}`.trim()})=>{let m=So(de(r,{rules:{...c,...Vt},onEach:$t,onMissing:_t,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),f={schema:a==="components"?i(r,m,M(u)):m,examples:xo(r,!0)};return{description:u,content:(0,l.fromPairs)((0,l.xprod)(o,[f]))}},Gn=()=>({type:"http",scheme:"basic"}),Yn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Qn=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},Jn=({name:e})=>({type:"apiKey",in:"header",name:e}),Wn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Xn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),es=({flows:e={}})=>({type:"oauth2",flows:(0,l.map)(t=>({...t,scopes:t.scopes||{}}),(0,l.reject)(l.isNil,e))}),Oo=(e,t)=>{let r={basic:Gn,bearer:Yn,input:Qn,header:Jn,cookie:Wn,openid:Xn,oauth2:es};return dt(e,o=>r[o.type](o,t))},ht=e=>"or"in e?e.or.map(t=>"and"in t?(0,l.mergeAll)((0,l.map)(({name:r,scopes:o})=>(0,l.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?ht(kt(e)):ht({or:[e]}),Ro=({method:e,path:t,schema:r,mimeTypes:o,makeRef:n,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=So(qt(de(r,{rules:{...a,...Vt},onEach:$t,onMissing:_t,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),u={schema:i==="components"?n(r,c,M(d)):c,examples:xo(r,!1,p)};return{description:d,content:(0,l.fromPairs)((0,l.xprod)(o,[u]))}},Ao=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Gt=e=>e.length<=co?e:e.slice(0,co-1)+"\u2026";var xt=class extends zo.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=(0,bt.keys)(pe);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||M(r,t),i=this.lastOperationIdSuffixes.get(n);return i===void 0?(this.lastOperationIdSuffixes.set(n,1),n):(o&&Po.default.fail(new v({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:n});for(let m of typeof i=="string"?[i]:i)this.addServer({url:m});ce({routing:t,onEndpoint:(m,f,T)=>{let R=T,Z={path:f,method:R,endpoint:m,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[x,P]=["short","long"].map(m.getDescription.bind(m)),X=x?Gt(x):d&&P?Gt(P):void 0,fe=m.getTags(),Ne=r.inputSources?.[R]||wt[R],ye=this.ensureUniqOperationId(f,R,m.getOperationId(R)),ke=bo({...Z,inputSources:Ne,schema:m.getSchema("input"),description:a?.requestParameter?.call(null,{method:R,path:f,operationId:ye})}),Ge={};for(let F of this.responseVariants){let ee=m.getResponses(F);for(let{mimeTypes:Me,schema:C,statusCodes:w}of ee)for(let E of w)Ge[E]=To({...Z,variant:F,schema:C,mimeTypes:Me,statusCode:E,hasMultipleStatusCodes:ee.length>1||w.length>1,description:a?.[`${F}Response`]?.call(null,{method:R,path:f,operationId:ye,statusCode:E})})}let Ct=Ne.includes("body")?Ro({...Z,paramNames:(0,bt.pluck)("name",ke),schema:m.getSchema("input"),mimeTypes:m.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:R,path:f,operationId:ye})}):void 0,Ye=ht(dt(Oo(m.getSecurity(),Ne),F=>{let ee=this.ensureUniqSecuritySchemaName(F),Me=["oauth2","openIdConnect"].includes(F.type)?m.getScopes().slice():[];return this.addSecurityScheme(ee,F),{name:ee,scopes:Me}}));this.addPath(fo(f),{[R]:{operationId:ye,summary:X,description:P,tags:fe.length>0?fe:void 0,parameters:ke.length>0?ke:void 0,requestBody:Ct,security:Ye.length>0?Ye:void 0,responses:Ge}})}}),this.rootDoc.tags=r.tags?Ao(r.tags):[]}};var St=require("node-mocks-http"),ts=e=>(0,St.createRequest)({...e,headers:{"content-type":z.json,...e?.headers}}),rs=e=>(0,St.createResponse)(e),os=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:kr(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},Co=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=ts(e),i=rs({req:n,...t});i.req=t?.req||n,n.res=i;let a=os(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},wo=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=Co(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},Io=async({middleware:e,options:t={},...r})=>{let{requestMock:o,responseMock:n,loggerMock:i,configMock:a}=Co(r),p=Xe(o,a.inputSources),d=await e.execute({request:o,response:n,logger:i,input:p,options:t});return{requestMock:o,responseMock:n,loggerMock:i,output:d}};var N=O(require("typescript"),1);var K=O(require("typescript"),1),je=require("ramda"),s=K.default.factory,J=[s.createModifier(K.default.SyntaxKind.ExportKeyword)],ns=[s.createModifier(K.default.SyntaxKind.AsyncKeyword)],ss=[s.createModifier(K.default.SyntaxKind.PublicKeyword),s.createModifier(K.default.SyntaxKind.ReadonlyKeyword)],Zo=[s.createModifier(K.default.SyntaxKind.ProtectedKeyword),s.createModifier(K.default.SyntaxKind.ReadonlyKeyword)],Yt=s.createTemplateHead(""),Le=s.createTemplateTail(""),Qt=s.createTemplateMiddle(" "),Jt=e=>s.createTemplateLiteralType(Yt,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?Le:Qt))),Wt=Jt(["M","P"]),Tt=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Ot=(e,t)=>(0,je.chain)(([r,o])=>[Tt(s.createIdentifier(r),o,t)],(0,je.toPairs)(e)),Xt=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),Eo=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),vo=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),W=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],K.default.NodeFlags.Const),er=(e,t)=>s.createTypeAliasDeclaration(J,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),Rt=(e,t)=>s.createTypeAliasDeclaration(J,e,void 0,t),jo=(e,t,r)=>s.createPropertyDeclaration(ss,e,void 0,t,r),Lo=(e,t,r)=>s.createClassDeclaration(J,e,void 0,void 0,[t,...r]),No=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),ko=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(K.default.SyntaxKind.AnyKeyword)]),Mo=(e,t,r)=>s.createInterfaceDeclaration(J,e,void 0,t,r),is=(0,je.chain)(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),Uo=e=>is((0,je.toPairs)(e)),tr=(e,t,r)=>s.createArrowFunction(r?ns:void 0,void 0,e.map(o=>Tt(o)),void 0,void 0,t),rr=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,Ot({acc:void 0,key:void 0}),void 0,void 0,t),r]),Ho=(...e)=>`"${e.join(" ")}"`;var Do=["get","post","put","delete","patch"];var g=O(require("typescript"),1),Pt=require("zod");var S=O(require("typescript"),1),{factory:At}=S.default,or=(e,t)=>{S.default.addSyntheticLeadingComment(e,S.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},me=(e,t,r)=>{let o=At.createTypeAliasDeclaration(void 0,At.createIdentifier(t),void 0,e);return r&&or(o,r),o},nr=(e,t)=>{let r=S.default.createSourceFile("print.ts","",S.default.ScriptTarget.Latest,!1,S.default.ScriptKind.TS);return S.default.createPrinter(t).printNode(S.default.EmitHint.Unspecified,e,r)},as=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Ko=e=>as.test(e)?At.createIdentifier(e):At.createStringLiteral(e),ps=[S.default.SyntaxKind.AnyKeyword,S.default.SyntaxKind.BigIntKeyword,S.default.SyntaxKind.BooleanKeyword,S.default.SyntaxKind.NeverKeyword,S.default.SyntaxKind.NumberKeyword,S.default.SyntaxKind.ObjectKeyword,S.default.SyntaxKind.StringKeyword,S.default.SyntaxKind.SymbolKeyword,S.default.SyntaxKind.UndefinedKeyword,S.default.SyntaxKind.UnknownKeyword,S.default.SyntaxKind.VoidKeyword],Fo=e=>ps.includes(e.kind);var{factory:y}=g.default,cs={[g.default.SyntaxKind.AnyKeyword]:"",[g.default.SyntaxKind.BigIntKeyword]:BigInt(0),[g.default.SyntaxKind.BooleanKeyword]:!1,[g.default.SyntaxKind.NumberKeyword]:0,[g.default.SyntaxKind.ObjectKeyword]:{},[g.default.SyntaxKind.StringKeyword]:"",[g.default.SyntaxKind.UndefinedKeyword]:void 0},ds=({value:e})=>y.createLiteralTypeNode(typeof e=="number"?y.createNumericLiteral(e):typeof e=="boolean"?e?y.createTrue():y.createFalse():y.createStringLiteral(e)),ls=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&Ke(a)?a instanceof Pt.z.ZodOptional:a.isOptional(),d=y.createPropertySignature(void 0,Ko(i),p&&o?y.createToken(g.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&or(d,a.description),d});return y.createTypeLiteralNode(n)},ms=({element:e},{next:t})=>y.createArrayTypeNode(t(e)),us=({options:e})=>y.createUnionTypeNode(e.map(t=>y.createLiteralTypeNode(y.createStringLiteral(t)))),Bo=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(Fo(n)?n.kind:n,n)}return y.createUnionTypeNode(Array.from(r.values()))},fs=e=>cs?.[e.kind],ys=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=et(e,fs(o)),i={number:g.default.SyntaxKind.NumberKeyword,bigint:g.default.SyntaxKind.BigIntKeyword,boolean:g.default.SyntaxKind.BooleanKeyword,string:g.default.SyntaxKind.StringKeyword,undefined:g.default.SyntaxKind.UndefinedKeyword,object:g.default.SyntaxKind.ObjectKeyword};return y.createKeywordTypeNode(n&&i[n]||g.default.SyntaxKind.AnyKeyword)}return o},gs=e=>y.createUnionTypeNode(Object.values(e.enum).map(t=>y.createLiteralTypeNode(typeof t=="number"?y.createNumericLiteral(t):y.createStringLiteral(t)))),hs=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?y.createUnionTypeNode([o,y.createKeywordTypeNode(g.default.SyntaxKind.UndefinedKeyword)]):o},xs=(e,{next:t})=>y.createUnionTypeNode([t(e.unwrap()),y.createLiteralTypeNode(y.createNull())]),bs=({items:e,_def:{rest:t}},{next:r})=>y.createTupleTypeNode(e.map(r).concat(t===null?[]:y.createRestTypeNode(r(t)))),Ss=({keySchema:e,valueSchema:t},{next:r})=>y.createExpressionWithTypeArguments(y.createIdentifier("Record"),[e,t].map(r)),Ts=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(g.default.isTypeLiteralNode)?y.createTypeLiteralNode(o.flatMap(({members:i})=>i)):y.createIntersectionTypeNode(o)},Os=({_def:e},{next:t})=>t(e.innerType),ue=e=>()=>y.createKeywordTypeNode(e),Rs=(e,{next:t})=>t(e.unwrap()),As=(e,{next:t})=>t(e.unwrap()),Ps=({_def:e},{next:t})=>t(e.innerType),zs=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Cs=()=>y.createLiteralTypeNode(y.createNull()),ws=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),Is=e=>{let t=e.unwrap(),r=y.createKeywordTypeNode(g.default.SyntaxKind.StringKeyword),o=y.createTypeReferenceNode("Buffer"),n=y.createUnionTypeNode([r,o]);return t instanceof Pt.z.ZodString?r:t instanceof Pt.z.ZodUnion?n:o},Zs=(e,{next:t})=>t(e.unwrap().shape.raw),Es={ZodString:ue(g.default.SyntaxKind.StringKeyword),ZodNumber:ue(g.default.SyntaxKind.NumberKeyword),ZodBigInt:ue(g.default.SyntaxKind.BigIntKeyword),ZodBoolean:ue(g.default.SyntaxKind.BooleanKeyword),ZodAny:ue(g.default.SyntaxKind.AnyKeyword),[se]:ue(g.default.SyntaxKind.StringKeyword),[ie]:ue(g.default.SyntaxKind.StringKeyword),ZodNull:Cs,ZodArray:ms,ZodTuple:bs,ZodRecord:Ss,ZodObject:ls,ZodLiteral:ds,ZodIntersection:Ts,ZodUnion:Bo,ZodDefault:Os,ZodEnum:us,ZodNativeEnum:gs,ZodEffects:ys,ZodOptional:hs,ZodNullable:xs,ZodDiscriminatedUnion:Bo,ZodBranded:Rs,ZodCatch:Ps,ZodPipeline:zs,ZodLazy:ws,ZodReadonly:As,[D]:Is,[Y]:Zs},_e=(e,{brandHandling:t,ctx:r})=>de(e,{rules:{...t,...Es},onMissing:()=>y.createKeywordTypeNode(g.default.SyntaxKind.AnyKeyword),ctx:r});var zt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let n=s.createLiteralTypeNode(s.createNull());this.aliases.set(t,me(n,o)),this.aliases.set(t,me(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0}}){ce({routing:t,onEndpoint:(C,w,E)=>{let ge={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},Ue=M(E,w,"input"),He=_e(C.getSchema("input"),{brandHandling:r,ctx:{...ge,isResponse:!1}}),k=n?M(E,w,"positive.response"):void 0,sr=C.getSchema("positive"),ir=n?_e(sr,{brandHandling:r,ctx:{...ge,isResponse:!0}}):void 0,De=n?M(E,w,"negative.response"):void 0,ar=C.getSchema("negative"),pr=n?_e(ar,{brandHandling:r,ctx:{...ge,isResponse:!0}}):void 0,cr=M(E,w,"response"),Vo=k&&De?s.createUnionTypeNode([s.createTypeReferenceNode(k),s.createTypeReferenceNode(De)]):_e(sr.or(ar),{brandHandling:r,ctx:{...ge,isResponse:!0}});this.program.push(me(He,Ue)),ir&&k&&this.program.push(me(ir,k)),pr&&De&&this.program.push(me(pr,De)),this.program.push(me(Vo,cr)),E!=="options"&&(this.paths.push(w),this.registry.set({method:E,path:w},{input:Ue,positive:k,negative:De,response:cr,isJson:C.getMimeTypes("positive").includes(z.json),tags:C.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(er(this.ids.pathType,this.paths)),this.program.push(er(this.ids.methodType,Do)),this.program.push(Rt(this.ids.methodPathType,Jt([this.ids.methodType,this.ids.pathType])));let a=[s.createHeritageClause(N.default.SyntaxKind.ExtendsKeyword,[Xt(this.ids.methodPathType,N.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),n&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let p=[],d=[];for(let[{method:C,path:w},{isJson:E,tags:ge,...Ue}]of this.registry){let He=Ho(C,w);for(let k of this.interfaces)k.kind in Ue&&k.props.push(vo(He,Ue[k.kind]));o!=="types"&&(E&&p.push(s.createPropertyAssignment(He,s.createTrue())),d.push(s.createPropertyAssignment(He,s.createArrayLiteralExpression(ge.map(k=>s.createStringLiteral(k))))))}for(let{id:C,props:w}of this.interfaces)this.program.push(Mo(C,a,w));if(o==="types")return;let c=s.createVariableStatement(J,W(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(p))),u=s.createVariableStatement(J,W(this.ids.endpointTagsConst,s.createObjectLiteralExpression(d))),m=Rt(this.ids.providerType,s.createFunctionTypeNode(Uo({M:this.ids.methodType,P:this.ids.pathType}),Ot({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Wt)}),No(this.ids.responseInterface,Wt))),f=Rt(this.ids.implementationType,s.createFunctionTypeNode(void 0,Ot({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(N.default.SyntaxKind.StringKeyword),params:Xt(N.default.SyntaxKind.StringKeyword,N.default.SyntaxKind.AnyKeyword)}),ko())),T=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,Le)]),R=rr(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[T,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),Z=rr(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[T]),N.default.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),x=Lo(this.ids.clientClass,Eo([Tt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),Zo)]),[jo(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),tr([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,R,Z]),!0))]);this.program.push(c,u,m,f,x);let P=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),X=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(z.json))]),void 0,this.ids.undefinedValue)),fe=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),Ne=s.createVariableStatement(void 0,W(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,Le)]),s.createObjectLiteralExpression([P,X,fe])])))),ye=s.createVariableStatement(void 0,W(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),ke=s.createVariableStatement(void 0,W(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),Le)])))),[Ge,Ct]=["json","text"].map(C=>s.createReturnStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.responseConst,C),void 0,void 0))),Ye=s.createIfStatement(s.createBinaryExpression(s.createTemplateExpression(Yt,[s.createTemplateSpan(this.ids.methodParameter,Qt),s.createTemplateSpan(this.ids.pathParameter,Le)]),N.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),s.createBlock([Ge])),F=s.createVariableStatement(J,W(this.ids.exampleImplementationConst,tr([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([ye,ke,Ne,Ye,Ct]),!0),s.createTypeReferenceNode(this.ids.implementationType))),ee=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),Me=s.createVariableStatement(void 0,W(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(F,Me,ee)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:nr(r,t)).join(`
|
|
18
|
+
`)};var io=e=>{e.startupLogo!==!1&&console.log(oo());let t=e.errorHandler||ze,r=Nr(e.logger)?e.logger:new we(e.logger);r.debug("Running",{build:"v20.18.0 (CJS)",env:process.env.NODE_ENV||"development"}),to(r);let o=Xr({rootLogger:r,config:e}),i={getChildLogger:eo(r),errorHandler:t},a=Qr(i),p=Yr(i);return{...i,rootLogger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},ao=(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,loggingMiddleware:i}=io(e);return Bt({app:e.app.use(i),rootLogger:r,routing:t,getChildLogger:o,config:e}),{notFoundHandler:n,logger:r}},po=async(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=io(e),p=(0,yt.default)().disable("x-powered-by").use(a);if(e.server.compression){let f=await ve("compression");p.use(f(typeof e.server.compression=="object"?e.server.compression:void 0))}let d={json:[e.server.jsonParser||yt.default.json()],raw:[e.server.rawParser||yt.default.raw(),Wr],upload:e.server.upload?await Jr({config:e,getChildLogger:o}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:p,logger:r,getChildLogger:o}),Bt({app:p,routing:t,rootLogger:r,getChildLogger:o,config:e,parsers:d}),p.use(i,n);let c=(f,T)=>f.listen(T,()=>r.info("Listening",T)),u=no.default.createServer(p),m=e.https&&so.default.createServer(e.https.options,p);return e.gracefulShutdown&&ro({servers:[u].concat(m||[]),logger:r,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,httpServer:c(u,e.server.listen),httpsServer:m&&c(m,e.https?.listen)}};var Po=O(require("node:assert/strict"),1),zo=require("openapi3-ts/oas31"),bt=require("ramda");var Q=O(require("node:assert/strict"),1),V=require("openapi3-ts/oas31"),l=require("ramda"),b=require("zod");var de=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[h]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>de(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var co=50,mo="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",un={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},uo=/:([A-Za-z0-9_]+)/g,fn=e=>e.match(uo)?.map(t=>t.slice(1))||[],fo=e=>e.replace(uo,t=>`{${t.slice(1)}}`),yn=({_def:e},{next:t})=>({...t(e.innerType),default:e[h]?.defaultLabel||e.defaultValue()}),gn=({_def:{innerType:e}},{next:t})=>t(e),hn=()=>({format:"any"}),xn=({},e)=>((0,Q.default)(!e.isResponse,new v({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),bn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.z.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Sn=({options:e},{next:t})=>({oneOf:e.map(t)}),Tn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),On=e=>{let[t,r]=e.filter(V.isSchemaObject).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));(0,Q.default)(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,l.mergeDeepWith)((n,i)=>Array.isArray(n)&&Array.isArray(i)?(0,l.concat)(n,i):n===i?i:Q.default.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,l.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=re(t.examples||[],r.examples||[],([n,i])=>(0,l.mergeDeepRight)(n,i))),o},Rn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return On(o)}catch{}return{allOf:o}},An=(e,{next:t})=>t(e.unwrap()),Pn=(e,{next:t})=>t(e.unwrap()),zn=(e,{next:t})=>{let r=t(e.unwrap());return(0,V.isSchemaObject)(r)&&(r.type=go(r)),r},yo=e=>{let t=(0,l.toLower)((0,l.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},lo=e=>({type:yo(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Cn=({value:e})=>({type:yo(e),const:e}),wn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Ke(p)?p instanceof b.z.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=gt(e,r)),i.length&&(a.required=i),a},In=()=>({type:"null"}),Zn=({},e)=>((0,Q.default)(!e.isResponse,new v({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:mo}}),En=({},e)=>((0,Q.default)(e.isResponse,new v({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:mo}}),vn=({},e)=>Q.default.fail(new v({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),jn=()=>({type:"boolean"}),Ln=()=>({type:"integer",format:"bigint"}),Nn=e=>e.every(t=>t instanceof b.z.ZodLiteral),kn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.z.ZodEnum||e instanceof b.z.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=gt(b.z.object((0,l.fromPairs)((0,l.xprod)(o,[t]))),r),n.required=o),n}if(e instanceof b.z.ZodLiteral)return{type:"object",properties:gt(b.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.z.ZodUnion&&Nn(e.options)){let o=(0,l.map)(i=>`${i.value}`,e.options),n=(0,l.fromPairs)((0,l.xprod)(o,[t]));return{type:"object",properties:gt(b.z.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},Mn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},Un=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Hn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:m}})=>{let f=m.find(P=>P.kind==="regex"),T=m.find(P=>P.kind==="datetime"),R=f?f.regex:T?T.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,Z={type:"string"},x={"date-time":u,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let P in x)if(x[P]){Z.format=P;break}return r!==null&&(Z.minLength=r),o!==null&&(Z.maxLength=o),R&&(Z.pattern=R.source),Z},Dn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(m=>m.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(m=>m.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,u={type:e?"integer":"number",format:e?"int64":"double"};return a?u.minimum=i:u.exclusiveMinimum=i,c?u.maximum=d:u.exclusiveMaximum=d,u},gt=({shape:e},t)=>(0,l.map)(t,e),Kn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return un?.[t]},go=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},Fn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,V.isSchemaObject)(o)){let i=et(e,Kn(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(b.z.any())}if(!t&&n.type==="preprocess"&&(0,V.isSchemaObject)(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},Bn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),qn=(e,{next:t})=>t(e.unwrap()),Vn=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),$n=(e,{next:t})=>t(e.unwrap().shape.raw),ho=e=>e.length?(0,l.fromPairs)((0,l.zip)((0,l.range)(1,e.length+1).map(t=>`example${t}`),(0,l.map)((0,l.objOf)("value"),e))):void 0,xo=(e,t,r=[])=>(0,l.pipe)(B,(0,l.map)((0,l.when)(o=>(0,l.type)(o)==="Object",(0,l.omit)(r))),ho)({schema:e,variant:t?"parsed":"original",validate:!0}),_n=(e,t)=>(0,l.pipe)(B,(0,l.filter)((0,l.has)(t)),(0,l.pluck)(t),ho)({schema:e,variant:"original",validate:!0}),le=e=>e instanceof b.z.ZodObject?e:e instanceof b.z.ZodBranded?le(e.unwrap()):e instanceof b.z.ZodUnion||e instanceof b.z.ZodDiscriminatedUnion?e.options.map(t=>le(t)).reduce((t,r)=>t.merge(r.partial()),b.z.object({})):e instanceof b.z.ZodEffects?le(e._def.schema):e instanceof b.z.ZodPipeline?le(e._def.in):le(e._def.left).merge(le(e._def.right)),bo=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=le(r),c=fn(e),u=o.includes("query"),m=o.includes("params"),f=o.includes("headers"),T=x=>m&&c.includes(x),R=x=>f&&Zt(x);return Object.keys(d).map(x=>({name:x,location:T(x)?"path":R(x)?"header":u?"query":void 0})).filter(x=>x.location!==void 0).map(({name:x,location:P})=>{let X=de(d[x],{rules:{...a,...Vt},onEach:$t,onMissing:_t,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),fe=i==="components"?n(d[x],X,M(p,x)):X;return{name:x,in:P,required:!d[x].isOptional(),description:X.description||p,schema:fe,examples:_n(r,x)}})},Vt={ZodString:Hn,ZodNumber:Dn,ZodBigInt:Ln,ZodBoolean:jn,ZodNull:In,ZodArray:Mn,ZodTuple:Un,ZodRecord:kn,ZodObject:wn,ZodLiteral:Cn,ZodIntersection:Rn,ZodUnion:Sn,ZodAny:hn,ZodDefault:yn,ZodEnum:lo,ZodNativeEnum:lo,ZodEffects:Fn,ZodOptional:An,ZodNullable:zn,ZodDiscriminatedUnion:Tn,ZodBranded:qn,ZodDate:vn,ZodCatch:gn,ZodPipeline:Bn,ZodLazy:Vn,ZodReadonly:Pn,[D]:bn,[Se]:xn,[ie]:En,[se]:Zn,[Y]:$n},$t=(e,{isResponse:t,prev:r})=>{if((0,V.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof b.z.ZodLazy,i=r.type!==void 0,a=t&&Ke(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=go(r)),!n){let c=B({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},_t=(e,t)=>Q.default.fail(new v({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),qt=(e,t)=>{if((0,V.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,l.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,l.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>qt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>qt(o,t))),r},So=e=>(0,V.isReferenceObject)(e)?e:(0,l.omit)(["examples"],e),To=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:u=`${e.toUpperCase()} ${t} ${Et(n)} response ${p?d:""}`.trim()})=>{let m=So(de(r,{rules:{...c,...Vt},onEach:$t,onMissing:_t,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),f={schema:a==="components"?i(r,m,M(u)):m,examples:xo(r,!0)};return{description:u,content:(0,l.fromPairs)((0,l.xprod)(o,[f]))}},Gn=()=>({type:"http",scheme:"basic"}),Yn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Qn=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},Jn=({name:e})=>({type:"apiKey",in:"header",name:e}),Wn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Xn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),es=({flows:e={}})=>({type:"oauth2",flows:(0,l.map)(t=>({...t,scopes:t.scopes||{}}),(0,l.reject)(l.isNil,e))}),Oo=(e,t)=>{let r={basic:Gn,bearer:Yn,input:Qn,header:Jn,cookie:Wn,openid:Xn,oauth2:es};return dt(e,o=>r[o.type](o,t))},ht=e=>"or"in e?e.or.map(t=>"and"in t?(0,l.mergeAll)((0,l.map)(({name:r,scopes:o})=>(0,l.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?ht(kt(e)):ht({or:[e]}),Ro=({method:e,path:t,schema:r,mimeTypes:o,makeRef:n,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=So(qt(de(r,{rules:{...a,...Vt},onEach:$t,onMissing:_t,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),u={schema:i==="components"?n(r,c,M(d)):c,examples:xo(r,!1,p)};return{description:d,content:(0,l.fromPairs)((0,l.xprod)(o,[u]))}},Ao=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Gt=e=>e.length<=co?e:e.slice(0,co-1)+"\u2026";var xt=class extends zo.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=(0,bt.keys)(pe);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||M(r,t),i=this.lastOperationIdSuffixes.get(n);return i===void 0?(this.lastOperationIdSuffixes.set(n,1),n):(o&&Po.default.fail(new v({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:n});for(let m of typeof i=="string"?[i]:i)this.addServer({url:m});ce({routing:t,onEndpoint:(m,f,T)=>{let R=T,Z={path:f,method:R,endpoint:m,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[x,P]=["short","long"].map(m.getDescription.bind(m)),X=x?Gt(x):d&&P?Gt(P):void 0,fe=m.getTags(),Ne=r.inputSources?.[R]||wt[R],ye=this.ensureUniqOperationId(f,R,m.getOperationId(R)),ke=bo({...Z,inputSources:Ne,schema:m.getSchema("input"),description:a?.requestParameter?.call(null,{method:R,path:f,operationId:ye})}),Ge={};for(let F of this.responseVariants){let ee=m.getResponses(F);for(let{mimeTypes:Me,schema:C,statusCodes:w}of ee)for(let E of w)Ge[E]=To({...Z,variant:F,schema:C,mimeTypes:Me,statusCode:E,hasMultipleStatusCodes:ee.length>1||w.length>1,description:a?.[`${F}Response`]?.call(null,{method:R,path:f,operationId:ye,statusCode:E})})}let Ct=Ne.includes("body")?Ro({...Z,paramNames:(0,bt.pluck)("name",ke),schema:m.getSchema("input"),mimeTypes:m.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:R,path:f,operationId:ye})}):void 0,Ye=ht(dt(Oo(m.getSecurity(),Ne),F=>{let ee=this.ensureUniqSecuritySchemaName(F),Me=["oauth2","openIdConnect"].includes(F.type)?m.getScopes().slice():[];return this.addSecurityScheme(ee,F),{name:ee,scopes:Me}}));this.addPath(fo(f),{[R]:{operationId:ye,summary:X,description:P,tags:fe.length>0?fe:void 0,parameters:ke.length>0?ke:void 0,requestBody:Ct,security:Ye.length>0?Ye:void 0,responses:Ge}})}}),this.rootDoc.tags=r.tags?Ao(r.tags):[]}};var St=require("node-mocks-http"),ts=e=>(0,St.createRequest)({...e,headers:{"content-type":z.json,...e?.headers}}),rs=e=>(0,St.createResponse)(e),os=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:kr(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},Co=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=ts(e),i=rs({req:n,...t});i.req=t?.req||n,n.res=i;let a=os(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},wo=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=Co(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},Io=async({middleware:e,options:t={},...r})=>{let{requestMock:o,responseMock:n,loggerMock:i,configMock:a}=Co(r),p=Xe(o,a.inputSources),d=await e.execute({request:o,response:n,logger:i,input:p,options:t});return{requestMock:o,responseMock:n,loggerMock:i,output:d}};var N=O(require("typescript"),1);var K=O(require("typescript"),1),je=require("ramda"),s=K.default.factory,J=[s.createModifier(K.default.SyntaxKind.ExportKeyword)],ns=[s.createModifier(K.default.SyntaxKind.AsyncKeyword)],ss=[s.createModifier(K.default.SyntaxKind.PublicKeyword),s.createModifier(K.default.SyntaxKind.ReadonlyKeyword)],Zo=[s.createModifier(K.default.SyntaxKind.ProtectedKeyword),s.createModifier(K.default.SyntaxKind.ReadonlyKeyword)],Yt=s.createTemplateHead(""),Le=s.createTemplateTail(""),Qt=s.createTemplateMiddle(" "),Jt=e=>s.createTemplateLiteralType(Yt,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?Le:Qt))),Wt=Jt(["M","P"]),Tt=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Ot=(e,t)=>(0,je.chain)(([r,o])=>[Tt(s.createIdentifier(r),o,t)],(0,je.toPairs)(e)),Xt=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),Eo=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),vo=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),W=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],K.default.NodeFlags.Const),er=(e,t)=>s.createTypeAliasDeclaration(J,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),Rt=(e,t)=>s.createTypeAliasDeclaration(J,e,void 0,t),jo=(e,t,r)=>s.createPropertyDeclaration(ss,e,void 0,t,r),Lo=(e,t,r)=>s.createClassDeclaration(J,e,void 0,void 0,[t,...r]),No=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),ko=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(K.default.SyntaxKind.AnyKeyword)]),Mo=(e,t,r)=>s.createInterfaceDeclaration(J,e,void 0,t,r),is=(0,je.chain)(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),Uo=e=>is((0,je.toPairs)(e)),tr=(e,t,r)=>s.createArrowFunction(r?ns:void 0,void 0,e.map(o=>Tt(o)),void 0,void 0,t),rr=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,Ot({acc:void 0,key:void 0}),void 0,void 0,t),r]),Ho=(...e)=>`"${e.join(" ")}"`;var Do=["get","post","put","delete","patch"];var g=O(require("typescript"),1),Pt=require("zod");var S=O(require("typescript"),1),{factory:At}=S.default,or=(e,t)=>{S.default.addSyntheticLeadingComment(e,S.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},me=(e,t,r)=>{let o=At.createTypeAliasDeclaration(void 0,At.createIdentifier(t),void 0,e);return r&&or(o,r),o},nr=(e,t)=>{let r=S.default.createSourceFile("print.ts","",S.default.ScriptTarget.Latest,!1,S.default.ScriptKind.TS);return S.default.createPrinter(t).printNode(S.default.EmitHint.Unspecified,e,r)},as=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Ko=e=>as.test(e)?At.createIdentifier(e):At.createStringLiteral(e),ps=[S.default.SyntaxKind.AnyKeyword,S.default.SyntaxKind.BigIntKeyword,S.default.SyntaxKind.BooleanKeyword,S.default.SyntaxKind.NeverKeyword,S.default.SyntaxKind.NumberKeyword,S.default.SyntaxKind.ObjectKeyword,S.default.SyntaxKind.StringKeyword,S.default.SyntaxKind.SymbolKeyword,S.default.SyntaxKind.UndefinedKeyword,S.default.SyntaxKind.UnknownKeyword,S.default.SyntaxKind.VoidKeyword],Fo=e=>ps.includes(e.kind);var{factory:y}=g.default,cs={[g.default.SyntaxKind.AnyKeyword]:"",[g.default.SyntaxKind.BigIntKeyword]:BigInt(0),[g.default.SyntaxKind.BooleanKeyword]:!1,[g.default.SyntaxKind.NumberKeyword]:0,[g.default.SyntaxKind.ObjectKeyword]:{},[g.default.SyntaxKind.StringKeyword]:"",[g.default.SyntaxKind.UndefinedKeyword]:void 0},ds=({value:e})=>y.createLiteralTypeNode(typeof e=="number"?y.createNumericLiteral(e):typeof e=="boolean"?e?y.createTrue():y.createFalse():y.createStringLiteral(e)),ls=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&Ke(a)?a instanceof Pt.z.ZodOptional:a.isOptional(),d=y.createPropertySignature(void 0,Ko(i),p&&o?y.createToken(g.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&or(d,a.description),d});return y.createTypeLiteralNode(n)},ms=({element:e},{next:t})=>y.createArrayTypeNode(t(e)),us=({options:e})=>y.createUnionTypeNode(e.map(t=>y.createLiteralTypeNode(y.createStringLiteral(t)))),Bo=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(Fo(n)?n.kind:n,n)}return y.createUnionTypeNode(Array.from(r.values()))},fs=e=>cs?.[e.kind],ys=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=et(e,fs(o)),i={number:g.default.SyntaxKind.NumberKeyword,bigint:g.default.SyntaxKind.BigIntKeyword,boolean:g.default.SyntaxKind.BooleanKeyword,string:g.default.SyntaxKind.StringKeyword,undefined:g.default.SyntaxKind.UndefinedKeyword,object:g.default.SyntaxKind.ObjectKeyword};return y.createKeywordTypeNode(n&&i[n]||g.default.SyntaxKind.AnyKeyword)}return o},gs=e=>y.createUnionTypeNode(Object.values(e.enum).map(t=>y.createLiteralTypeNode(typeof t=="number"?y.createNumericLiteral(t):y.createStringLiteral(t)))),hs=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?y.createUnionTypeNode([o,y.createKeywordTypeNode(g.default.SyntaxKind.UndefinedKeyword)]):o},xs=(e,{next:t})=>y.createUnionTypeNode([t(e.unwrap()),y.createLiteralTypeNode(y.createNull())]),bs=({items:e,_def:{rest:t}},{next:r})=>y.createTupleTypeNode(e.map(r).concat(t===null?[]:y.createRestTypeNode(r(t)))),Ss=({keySchema:e,valueSchema:t},{next:r})=>y.createExpressionWithTypeArguments(y.createIdentifier("Record"),[e,t].map(r)),Ts=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(g.default.isTypeLiteralNode)?y.createTypeLiteralNode(o.flatMap(({members:i})=>i)):y.createIntersectionTypeNode(o)},Os=({_def:e},{next:t})=>t(e.innerType),ue=e=>()=>y.createKeywordTypeNode(e),Rs=(e,{next:t})=>t(e.unwrap()),As=(e,{next:t})=>t(e.unwrap()),Ps=({_def:e},{next:t})=>t(e.innerType),zs=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Cs=()=>y.createLiteralTypeNode(y.createNull()),ws=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),Is=e=>{let t=e.unwrap(),r=y.createKeywordTypeNode(g.default.SyntaxKind.StringKeyword),o=y.createTypeReferenceNode("Buffer"),n=y.createUnionTypeNode([r,o]);return t instanceof Pt.z.ZodString?r:t instanceof Pt.z.ZodUnion?n:o},Zs=(e,{next:t})=>t(e.unwrap().shape.raw),Es={ZodString:ue(g.default.SyntaxKind.StringKeyword),ZodNumber:ue(g.default.SyntaxKind.NumberKeyword),ZodBigInt:ue(g.default.SyntaxKind.BigIntKeyword),ZodBoolean:ue(g.default.SyntaxKind.BooleanKeyword),ZodAny:ue(g.default.SyntaxKind.AnyKeyword),[se]:ue(g.default.SyntaxKind.StringKeyword),[ie]:ue(g.default.SyntaxKind.StringKeyword),ZodNull:Cs,ZodArray:ms,ZodTuple:bs,ZodRecord:Ss,ZodObject:ls,ZodLiteral:ds,ZodIntersection:Ts,ZodUnion:Bo,ZodDefault:Os,ZodEnum:us,ZodNativeEnum:gs,ZodEffects:ys,ZodOptional:hs,ZodNullable:xs,ZodDiscriminatedUnion:Bo,ZodBranded:Rs,ZodCatch:Ps,ZodPipeline:zs,ZodLazy:ws,ZodReadonly:As,[D]:Is,[Y]:Zs},_e=(e,{brandHandling:t,ctx:r})=>de(e,{rules:{...t,...Es},onMissing:()=>y.createKeywordTypeNode(g.default.SyntaxKind.AnyKeyword),ctx:r});var zt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let n=s.createLiteralTypeNode(s.createNull());this.aliases.set(t,me(n,o)),this.aliases.set(t,me(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0}}){ce({routing:t,onEndpoint:(C,w,E)=>{let ge={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},Ue=M(E,w,"input"),He=_e(C.getSchema("input"),{brandHandling:r,ctx:{...ge,isResponse:!1}}),k=n?M(E,w,"positive.response"):void 0,sr=C.getSchema("positive"),ir=n?_e(sr,{brandHandling:r,ctx:{...ge,isResponse:!0}}):void 0,De=n?M(E,w,"negative.response"):void 0,ar=C.getSchema("negative"),pr=n?_e(ar,{brandHandling:r,ctx:{...ge,isResponse:!0}}):void 0,cr=M(E,w,"response"),Vo=k&&De?s.createUnionTypeNode([s.createTypeReferenceNode(k),s.createTypeReferenceNode(De)]):_e(sr.or(ar),{brandHandling:r,ctx:{...ge,isResponse:!0}});this.program.push(me(He,Ue)),ir&&k&&this.program.push(me(ir,k)),pr&&De&&this.program.push(me(pr,De)),this.program.push(me(Vo,cr)),E!=="options"&&(this.paths.push(w),this.registry.set({method:E,path:w},{input:Ue,positive:k,negative:De,response:cr,isJson:C.getMimeTypes("positive").includes(z.json),tags:C.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(er(this.ids.pathType,this.paths)),this.program.push(er(this.ids.methodType,Do)),this.program.push(Rt(this.ids.methodPathType,Jt([this.ids.methodType,this.ids.pathType])));let a=[s.createHeritageClause(N.default.SyntaxKind.ExtendsKeyword,[Xt(this.ids.methodPathType,N.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),n&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let p=[],d=[];for(let[{method:C,path:w},{isJson:E,tags:ge,...Ue}]of this.registry){let He=Ho(C,w);for(let k of this.interfaces)k.kind in Ue&&k.props.push(vo(He,Ue[k.kind]));o!=="types"&&(E&&p.push(s.createPropertyAssignment(He,s.createTrue())),d.push(s.createPropertyAssignment(He,s.createArrayLiteralExpression(ge.map(k=>s.createStringLiteral(k))))))}for(let{id:C,props:w}of this.interfaces)this.program.push(Mo(C,a,w));if(o==="types")return;let c=s.createVariableStatement(J,W(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(p))),u=s.createVariableStatement(J,W(this.ids.endpointTagsConst,s.createObjectLiteralExpression(d))),m=Rt(this.ids.providerType,s.createFunctionTypeNode(Uo({M:this.ids.methodType,P:this.ids.pathType}),Ot({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Wt)}),No(this.ids.responseInterface,Wt))),f=Rt(this.ids.implementationType,s.createFunctionTypeNode(void 0,Ot({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(N.default.SyntaxKind.StringKeyword),params:Xt(N.default.SyntaxKind.StringKeyword,N.default.SyntaxKind.AnyKeyword)}),ko())),T=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,Le)]),R=rr(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[T,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),Z=rr(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[T]),N.default.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),x=Lo(this.ids.clientClass,Eo([Tt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),Zo)]),[jo(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),tr([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,R,Z]),!0))]);this.program.push(c,u,m,f,x);let P=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),X=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(z.json))]),void 0,this.ids.undefinedValue)),fe=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),Ne=s.createVariableStatement(void 0,W(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,Le)]),s.createObjectLiteralExpression([P,X,fe])])))),ye=s.createVariableStatement(void 0,W(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),ke=s.createVariableStatement(void 0,W(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),Le)])))),[Ge,Ct]=["json","text"].map(C=>s.createReturnStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.responseConst,C),void 0,void 0))),Ye=s.createIfStatement(s.createBinaryExpression(s.createTemplateExpression(Yt,[s.createTemplateSpan(this.ids.methodParameter,Qt),s.createTemplateSpan(this.ids.pathParameter,Le)]),N.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),s.createBlock([Ge])),F=s.createVariableStatement(J,W(this.ids.exampleImplementationConst,tr([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([ye,ke,Ne,Ye,Ct]),!0),s.createTypeReferenceNode(this.ids.implementationType))),ee=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),Me=s.createVariableStatement(void 0,W(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(F,Me,ee)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:nr(r,t)).join(`
|
|
19
19
|
`):void 0}print(t){let r=this.printUsage(t),o=r&&N.default.addSyntheticLeadingComment(N.default.addSyntheticLeadingComment(s.createEmptyStatement(),N.default.SyntaxKind.SingleLineCommentTrivia," Usage example:"),N.default.SyntaxKind.MultiLineCommentTrivia,`
|
|
20
20
|
${r}`);return this.program.concat(o||[]).map((n,i)=>nr(n,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
|
|
21
21
|
|
package/dist/index.js
CHANGED
|
@@ -15,7 +15,7 @@ ${o}888${t}
|
|
|
15
15
|
${r}
|
|
16
16
|
`.split(`
|
|
17
17
|
`).map((d,c)=>a[c]?a[c](d):d).join(`
|
|
18
|
-
`)};var kr=e=>{e.startupLogo!==!1&&console.log(Nr());let t=e.errorHandler||ve,r=mr(e.logger)?e.logger:new Le(e.logger);r.debug("Running",{build:"v20.18.0-beta.2 (ESM)",env:process.env.NODE_ENV||"development"}),vr(r);let o=Zr({rootLogger:r,config:e}),i={getChildLogger:Er(r),errorHandler:t},a=Cr(i),p=zr(i);return{...i,rootLogger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},On=(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,loggingMiddleware:i}=kr(e);return Pt({app:e.app.use(i),rootLogger:r,routing:t,getChildLogger:o,config:e}),{notFoundHandler:n,logger:r}},Rn=async(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=kr(e),p=zt().disable("x-powered-by").use(a);if(e.server.compression){let u=await ge("compression");p.use(u(typeof e.server.compression=="object"?e.server.compression:void 0))}let d={json:[e.server.jsonParser||zt.json()],raw:[e.server.rawParser||zt.raw(),Ir],upload:e.server.upload?await wr({config:e,getChildLogger:o}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:p,logger:r,getChildLogger:o}),Pt({app:p,routing:t,rootLogger:r,getChildLogger:o,config:e,parsers:d}),p.use(i,n);let c=(u,S)=>u.listen(S,()=>r.info("Listening",S)),m=Sn.createServer(p),l=e.https&&Tn.createServer(e.https.options,p);return e.gracefulShutdown&&jr({servers:[m].concat(l||[]),logger:r,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,httpServer:c(m,e.server.listen),httpsServer:l&&c(l,e.https?.listen)}};import zs from"node:assert/strict";import{OpenApiBuilder as Cs}from"openapi3-ts/oas31";import{keys as ws,pluck as Is}from"ramda";import oe from"node:assert/strict";import{isReferenceObject as wt,isSchemaObject as nt}from"openapi3-ts/oas31";import{concat as An,type as Hr,filter as Pn,fromPairs as Me,has as zn,isNil as Cn,map as he,mergeAll as wn,mergeDeepRight as In,mergeDeepWith as Zn,objOf as Dr,omit as st,pipe as Kr,pluck as En,range as vn,reject as jn,toLower as Ln,union as Nn,when as kn,xprod as it,zip as Mn}from"ramda";import{z as x}from"zod";var te=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[g]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>te(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var Mr=50,Fr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Un={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Br=/:([A-Za-z0-9_]+)/g,Hn=e=>e.match(Br)?.map(t=>t.slice(1))||[],qr=e=>e.replace(Br,t=>`{${t.slice(1)}}`),Dn=({_def:e},{next:t})=>({...t(e.innerType),default:e[g]?.defaultLabel||e.defaultValue()}),Kn=({_def:{innerType:e}},{next:t})=>t(e),Fn=()=>({format:"any"}),Bn=({},e)=>(oe(!e.isResponse,new Z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),qn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof x.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Vn=({options:e},{next:t})=>({oneOf:e.map(t)}),$n=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),_n=e=>{let[t,r]=e.filter(nt).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));oe(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=Zn((n,i)=>Array.isArray(n)&&Array.isArray(i)?An(n,i):n===i?i:oe.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=Nn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=G(t.examples||[],r.examples||[],([n,i])=>In(n,i))),o},Gn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return _n(o)}catch{}return{allOf:o}},Yn=(e,{next:t})=>t(e.unwrap()),Qn=(e,{next:t})=>t(e.unwrap()),Jn=(e,{next:t})=>{let r=t(e.unwrap());return nt(r)&&(r.type=$r(r)),r},Vr=e=>{let t=Ln(Hr(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Ur=e=>({type:Vr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Wn=({value:e})=>({type:Vr(e),const:e}),Xn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&ze(p)?p instanceof x.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=ot(e,r)),i.length&&(a.required=i),a},es=()=>({type:"null"}),ts=({},e)=>(oe(!e.isResponse,new Z({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:Fr}}),rs=({},e)=>(oe(e.isResponse,new Z({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Fr}}),os=({},e)=>oe.fail(new Z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),ns=()=>({type:"boolean"}),ss=()=>({type:"integer",format:"bigint"}),is=e=>e.every(t=>t instanceof x.ZodLiteral),as=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof x.ZodEnum||e instanceof x.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=ot(x.object(Me(it(o,[t]))),r),n.required=o),n}if(e instanceof x.ZodLiteral)return{type:"object",properties:ot(x.object({[e.value]:t}),r),required:[e.value]};if(e instanceof x.ZodUnion&&is(e.options)){let o=he(i=>`${i.value}`,e.options),n=Me(it(o,[t]));return{type:"object",properties:ot(x.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},ps=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},cs=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),ds=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:m,_def:{checks:l}})=>{let u=l.find(O=>O.kind==="regex"),S=l.find(O=>O.kind==="datetime"),T=u?u.regex:S?S.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,C={type:"string"},h={"date-time":m,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let O in h)if(h[O]){C.format=O;break}return r!==null&&(C.minLength=r),o!==null&&(C.maxLength=o),T&&(C.pattern=T.source),C},ls=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(l=>l.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(l=>l.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=i:m.exclusiveMinimum=i,c?m.maximum=d:m.exclusiveMaximum=d,m},ot=({shape:e},t)=>he(t,e),ms=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Un?.[t]},$r=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},us=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&nt(o)){let i=Be(e,ms(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(x.any())}if(!t&&n.type==="preprocess"&&nt(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},fs=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),ys=(e,{next:t})=>t(e.unwrap()),gs=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),hs=(e,{next:t})=>t(e.unwrap().shape.raw),_r=e=>e.length?Me(Mn(vn(1,e.length+1).map(t=>`example${t}`),he(Dr("value"),e))):void 0,Gr=(e,t,r=[])=>Kr(H,he(kn(o=>Hr(o)==="Object",st(r))),_r)({schema:e,variant:t?"parsed":"original",validate:!0}),xs=(e,t)=>Kr(H,Pn(zn(t)),En(t),_r)({schema:e,variant:"original",validate:!0}),re=e=>e instanceof x.ZodObject?e:e instanceof x.ZodBranded?re(e.unwrap()):e instanceof x.ZodUnion||e instanceof x.ZodDiscriminatedUnion?e.options.map(t=>re(t)).reduce((t,r)=>t.merge(r.partial()),x.object({})):e instanceof x.ZodEffects?re(e._def.schema):e instanceof x.ZodPipeline?re(e._def.in):re(e._def.left).merge(re(e._def.right)),Yr=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=re(r),c=Hn(e),m=o.includes("query"),l=o.includes("params"),u=o.includes("headers"),S=h=>l&&c.includes(h),T=h=>u&&yt(h);return Object.keys(d).map(h=>({name:h,location:S(h)?"path":T(h)?"header":m?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:O})=>{let q=te(d[h],{rules:{...a,...It},onEach:Zt,onMissing:Et,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),ie=i==="components"?n(d[h],q,E(p,h)):q;return{name:h,in:O,required:!d[h].isOptional(),description:q.description||p,schema:ie,examples:xs(r,h)}})},It={ZodString:ds,ZodNumber:ls,ZodBigInt:ss,ZodBoolean:ns,ZodNull:es,ZodArray:ps,ZodTuple:cs,ZodRecord:as,ZodObject:Xn,ZodLiteral:Wn,ZodIntersection:Gn,ZodUnion:Vn,ZodAny:Fn,ZodDefault:Dn,ZodEnum:Ur,ZodNativeEnum:Ur,ZodEffects:us,ZodOptional:Yn,ZodNullable:Jn,ZodDiscriminatedUnion:$n,ZodBranded:ys,ZodDate:os,ZodCatch:Kn,ZodPipeline:fs,ZodLazy:gs,ZodReadonly:Qn,[j]:qn,[me]:Bn,[J]:rs,[Q]:ts,[D]:hs},Zt=(e,{isResponse:t,prev:r})=>{if(wt(r))return{};let{description:o}=e,n=e instanceof x.ZodLazy,i=r.type!==void 0,a=t&&ze(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=$r(r)),!n){let c=H({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},Et=(e,t)=>oe.fail(new Z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Ct=(e,t)=>{if(wt(e))return e;let r={...e};return r.properties&&(r.properties=st(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>st(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Ct(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Ct(o,t))),r},Qr=e=>wt(e)?e:st(["examples"],e),Jr=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:m=`${e.toUpperCase()} ${t} ${gt(n)} response ${p?d:""}`.trim()})=>{let l=Qr(te(r,{rules:{...c,...It},onEach:Zt,onMissing:Et,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),u={schema:a==="components"?i(r,l,E(m)):l,examples:Gr(r,!0)};return{description:m,content:Me(it(o,[u]))}},bs=()=>({type:"http",scheme:"basic"}),Ss=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Ts=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},Os=({name:e})=>({type:"apiKey",in:"header",name:e}),Rs=({name:e})=>({type:"apiKey",in:"cookie",name:e}),As=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Ps=({flows:e={}})=>({type:"oauth2",flows:he(t=>({...t,scopes:t.scopes||{}}),jn(Cn,e))}),Wr=(e,t)=>{let r={basic:bs,bearer:Ss,input:Ts,header:Os,cookie:Rs,openid:As,oauth2:Ps};return We(e,o=>r[o.type](o,t))},at=e=>"or"in e?e.or.map(t=>"and"in t?wn(he(({name:r,scopes:o})=>Dr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?at(Tt(e)):at({or:[e]}),Xr=({method:e,path:t,schema:r,mimeTypes:o,makeRef:n,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=Qr(Ct(te(r,{rules:{...a,...It},onEach:Zt,onMissing:Et,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),m={schema:i==="components"?n(r,c,E(d)):c,examples:Gr(r,!1,p)};return{description:d,content:Me(it(o,[m]))}},eo=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),vt=e=>e.length<=Mr?e:e.slice(0,Mr-1)+"\u2026";var jt=class extends Cs{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=ws(X);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||E(r,t),i=this.lastOperationIdSuffixes.get(n);return i===void 0?(this.lastOperationIdSuffixes.set(n,1),n):(o&&zs.fail(new Z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:n});for(let l of typeof i=="string"?[i]:i)this.addServer({url:l});ee({routing:t,onEndpoint:(l,u,S)=>{let T=S,C={path:u,method:T,endpoint:l,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[h,O]=["short","long"].map(l.getDescription.bind(l)),q=h?vt(h):d&&O?vt(O):void 0,ie=l.getTags(),be=r.inputSources?.[T]||ut[T],ae=this.ensureUniqOperationId(u,T,l.getOperationId(T)),Se=Yr({...C,inputSources:be,schema:l.getSchema("input"),description:a?.requestParameter?.call(null,{method:T,path:u,operationId:ae})}),He={};for(let N of this.responseVariants){let V=l.getResponses(N);for(let{mimeTypes:Te,schema:P,statusCodes:z}of V)for(let w of z)He[w]=Jr({...C,variant:N,schema:P,mimeTypes:Te,statusCode:w,hasMultipleStatusCodes:V.length>1||z.length>1,description:a?.[`${N}Response`]?.call(null,{method:T,path:u,operationId:ae,statusCode:w})})}let mt=be.includes("body")?Xr({...C,paramNames:Is("name",Se),schema:l.getSchema("input"),mimeTypes:l.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:T,path:u,operationId:ae})}):void 0,De=at(We(Wr(l.getSecurity(),be),N=>{let V=this.ensureUniqSecuritySchemaName(N),Te=["oauth2","openIdConnect"].includes(N.type)?l.getScopes().slice():[];return this.addSecurityScheme(V,N),{name:V,scopes:Te}}));this.addPath(qr(u),{[T]:{operationId:ae,summary:q,description:O,tags:ie.length>0?ie:void 0,parameters:Se.length>0?Se:void 0,requestBody:mt,security:De.length>0?De:void 0,responses:He}})}}),this.rootDoc.tags=r.tags?eo(r.tags):[]}};import{createRequest as Zs,createResponse as Es}from"node-mocks-http";var vs=e=>Zs({...e,headers:{"content-type":R.json,...e?.headers}}),js=e=>Es(e),Ls=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:ur(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},to=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=vs(e),i=js({req:n,...t});i.req=t?.req||n,n.res=i;let a=Ls(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},Ns=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=to(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},ks=async({middleware:e,options:t={},...r})=>{let{requestMock:o,responseMock:n,loggerMock:i,configMock:a}=to(r),p=Fe(o,a.inputSources),d=await e.execute({request:o,response:n,logger:i,input:p,options:t});return{requestMock:o,responseMock:n,loggerMock:i,output:d}};import v from"typescript";import M from"typescript";import{chain as ro,toPairs as oo}from"ramda";var s=M.factory,F=[s.createModifier(M.SyntaxKind.ExportKeyword)],Ms=[s.createModifier(M.SyntaxKind.AsyncKeyword)],Us=[s.createModifier(M.SyntaxKind.PublicKeyword),s.createModifier(M.SyntaxKind.ReadonlyKeyword)],no=[s.createModifier(M.SyntaxKind.ProtectedKeyword),s.createModifier(M.SyntaxKind.ReadonlyKeyword)],Lt=s.createTemplateHead(""),xe=s.createTemplateTail(""),Nt=s.createTemplateMiddle(" "),kt=e=>s.createTemplateLiteralType(Lt,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?xe:Nt))),Mt=kt(["M","P"]),pt=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),ct=(e,t)=>ro(([r,o])=>[pt(s.createIdentifier(r),o,t)],oo(e)),Ut=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),so=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),io=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),B=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],M.NodeFlags.Const),Ht=(e,t)=>s.createTypeAliasDeclaration(F,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),dt=(e,t)=>s.createTypeAliasDeclaration(F,e,void 0,t),ao=(e,t,r)=>s.createPropertyDeclaration(Us,e,void 0,t,r),po=(e,t,r)=>s.createClassDeclaration(F,e,void 0,void 0,[t,...r]),co=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),lo=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(M.SyntaxKind.AnyKeyword)]),mo=(e,t,r)=>s.createInterfaceDeclaration(F,e,void 0,t,r),Hs=ro(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),uo=e=>Hs(oo(e)),Dt=(e,t,r)=>s.createArrowFunction(r?Ms:void 0,void 0,e.map(o=>pt(o)),void 0,void 0,t),Kt=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,ct({acc:void 0,key:void 0}),void 0,void 0,t),r]),fo=(...e)=>`"${e.join(" ")}"`;var yo=["get","post","put","delete","patch"];import y from"typescript";import{z as qt}from"zod";import b from"typescript";var{factory:lt}=b,Ft=(e,t)=>{b.addSyntheticLeadingComment(e,b.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ne=(e,t,r)=>{let o=lt.createTypeAliasDeclaration(void 0,lt.createIdentifier(t),void 0,e);return r&&Ft(o,r),o},Bt=(e,t)=>{let r=b.createSourceFile("print.ts","",b.ScriptTarget.Latest,!1,b.ScriptKind.TS);return b.createPrinter(t).printNode(b.EmitHint.Unspecified,e,r)},Ds=/^[A-Za-z_$][A-Za-z0-9_$]*$/,go=e=>Ds.test(e)?lt.createIdentifier(e):lt.createStringLiteral(e),Ks=[b.SyntaxKind.AnyKeyword,b.SyntaxKind.BigIntKeyword,b.SyntaxKind.BooleanKeyword,b.SyntaxKind.NeverKeyword,b.SyntaxKind.NumberKeyword,b.SyntaxKind.ObjectKeyword,b.SyntaxKind.StringKeyword,b.SyntaxKind.SymbolKeyword,b.SyntaxKind.UndefinedKeyword,b.SyntaxKind.UnknownKeyword,b.SyntaxKind.VoidKeyword],ho=e=>Ks.includes(e.kind);var{factory:f}=y,Fs={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},Bs=({value:e})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),qs=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&ze(a)?a instanceof qt.ZodOptional:a.isOptional(),d=f.createPropertySignature(void 0,go(i),p&&o?f.createToken(y.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Ft(d,a.description),d});return f.createTypeLiteralNode(n)},Vs=({element:e},{next:t})=>f.createArrayTypeNode(t(e)),$s=({options:e})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),xo=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(ho(n)?n.kind:n,n)}return f.createUnionTypeNode(Array.from(r.values()))},_s=e=>Fs?.[e.kind],Gs=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Be(e,_s(o)),i={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(n&&i[n]||y.SyntaxKind.AnyKeyword)}return o},Ys=e=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),Qs=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},Js=(e,{next:t})=>f.createUnionTypeNode([t(e.unwrap()),f.createLiteralTypeNode(f.createNull())]),Ws=({items:e,_def:{rest:t}},{next:r})=>f.createTupleTypeNode(e.map(r).concat(t===null?[]:f.createRestTypeNode(r(t)))),Xs=({keySchema:e,valueSchema:t},{next:r})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e,t].map(r)),ei=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(y.isTypeLiteralNode)?f.createTypeLiteralNode(o.flatMap(({members:i})=>i)):f.createIntersectionTypeNode(o)},ti=({_def:e},{next:t})=>t(e.innerType),se=e=>()=>f.createKeywordTypeNode(e),ri=(e,{next:t})=>t(e.unwrap()),oi=(e,{next:t})=>t(e.unwrap()),ni=({_def:e},{next:t})=>t(e.innerType),si=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ii=()=>f.createLiteralTypeNode(f.createNull()),ai=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),pi=e=>{let t=e.unwrap(),r=f.createKeywordTypeNode(y.SyntaxKind.StringKeyword),o=f.createTypeReferenceNode("Buffer"),n=f.createUnionTypeNode([r,o]);return t instanceof qt.ZodString?r:t instanceof qt.ZodUnion?n:o},ci=(e,{next:t})=>t(e.unwrap().shape.raw),di={ZodString:se(y.SyntaxKind.StringKeyword),ZodNumber:se(y.SyntaxKind.NumberKeyword),ZodBigInt:se(y.SyntaxKind.BigIntKeyword),ZodBoolean:se(y.SyntaxKind.BooleanKeyword),ZodAny:se(y.SyntaxKind.AnyKeyword),[Q]:se(y.SyntaxKind.StringKeyword),[J]:se(y.SyntaxKind.StringKeyword),ZodNull:ii,ZodArray:Vs,ZodTuple:Ws,ZodRecord:Xs,ZodObject:qs,ZodLiteral:Bs,ZodIntersection:ei,ZodUnion:xo,ZodDefault:ti,ZodEnum:$s,ZodNativeEnum:Ys,ZodEffects:Gs,ZodOptional:Qs,ZodNullable:Js,ZodDiscriminatedUnion:xo,ZodBranded:ri,ZodCatch:ni,ZodPipeline:si,ZodLazy:ai,ZodReadonly:oi,[j]:pi,[D]:ci},Ue=(e,{brandHandling:t,ctx:r})=>te(e,{rules:{...t,...di},onMissing:()=>f.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),ctx:r});var Vt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let n=s.createLiteralTypeNode(s.createNull());this.aliases.set(t,ne(n,o)),this.aliases.set(t,ne(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(P,z,w)=>{let pe={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},Oe=E(w,z,"input"),Re=Ue(P.getSchema("input"),{brandHandling:r,ctx:{...pe,isResponse:!1}}),I=n?E(w,z,"positive.response"):void 0,$t=P.getSchema("positive"),_t=n?Ue($t,{brandHandling:r,ctx:{...pe,isResponse:!0}}):void 0,Ae=n?E(w,z,"negative.response"):void 0,Gt=P.getSchema("negative"),Yt=n?Ue(Gt,{brandHandling:r,ctx:{...pe,isResponse:!0}}):void 0,Qt=E(w,z,"response"),bo=I&&Ae?s.createUnionTypeNode([s.createTypeReferenceNode(I),s.createTypeReferenceNode(Ae)]):Ue($t.or(Gt),{brandHandling:r,ctx:{...pe,isResponse:!0}});this.program.push(ne(Re,Oe)),_t&&I&&this.program.push(ne(_t,I)),Yt&&Ae&&this.program.push(ne(Yt,Ae)),this.program.push(ne(bo,Qt)),w!=="options"&&(this.paths.push(z),this.registry.set({method:w,path:z},{input:Oe,positive:I,negative:Ae,response:Qt,isJson:P.getMimeTypes("positive").includes(R.json),tags:P.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(Ht(this.ids.pathType,this.paths)),this.program.push(Ht(this.ids.methodType,yo)),this.program.push(dt(this.ids.methodPathType,kt([this.ids.methodType,this.ids.pathType])));let a=[s.createHeritageClause(v.SyntaxKind.ExtendsKeyword,[Ut(this.ids.methodPathType,v.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),n&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let p=[],d=[];for(let[{method:P,path:z},{isJson:w,tags:pe,...Oe}]of this.registry){let Re=fo(P,z);for(let I of this.interfaces)I.kind in Oe&&I.props.push(io(Re,Oe[I.kind]));o!=="types"&&(w&&p.push(s.createPropertyAssignment(Re,s.createTrue())),d.push(s.createPropertyAssignment(Re,s.createArrayLiteralExpression(pe.map(I=>s.createStringLiteral(I))))))}for(let{id:P,props:z}of this.interfaces)this.program.push(mo(P,a,z));if(o==="types")return;let c=s.createVariableStatement(F,B(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(p))),m=s.createVariableStatement(F,B(this.ids.endpointTagsConst,s.createObjectLiteralExpression(d))),l=dt(this.ids.providerType,s.createFunctionTypeNode(uo({M:this.ids.methodType,P:this.ids.pathType}),ct({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Mt)}),co(this.ids.responseInterface,Mt))),u=dt(this.ids.implementationType,s.createFunctionTypeNode(void 0,ct({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(v.SyntaxKind.StringKeyword),params:Ut(v.SyntaxKind.StringKeyword,v.SyntaxKind.AnyKeyword)}),lo())),S=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,xe)]),T=Kt(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[S,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),C=Kt(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[S]),v.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),h=po(this.ids.clientClass,so([pt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),no)]),[ao(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),Dt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,T,C]),!0))]);this.program.push(c,m,l,u,h);let O=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),q=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(R.json))]),void 0,this.ids.undefinedValue)),ie=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),be=s.createVariableStatement(void 0,B(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,xe)]),s.createObjectLiteralExpression([O,q,ie])])))),ae=s.createVariableStatement(void 0,B(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),Se=s.createVariableStatement(void 0,B(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),xe)])))),[He,mt]=["json","text"].map(P=>s.createReturnStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.responseConst,P),void 0,void 0))),De=s.createIfStatement(s.createBinaryExpression(s.createTemplateExpression(Lt,[s.createTemplateSpan(this.ids.methodParameter,Nt),s.createTemplateSpan(this.ids.pathParameter,xe)]),v.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),s.createBlock([He])),N=s.createVariableStatement(F,B(this.ids.exampleImplementationConst,Dt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([ae,Se,be,De,mt]),!0),s.createTypeReferenceNode(this.ids.implementationType))),V=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),Te=s.createVariableStatement(void 0,B(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(N,Te,V)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Bt(r,t)).join(`
|
|
18
|
+
`)};var kr=e=>{e.startupLogo!==!1&&console.log(Nr());let t=e.errorHandler||ve,r=mr(e.logger)?e.logger:new Le(e.logger);r.debug("Running",{build:"v20.18.0 (ESM)",env:process.env.NODE_ENV||"development"}),vr(r);let o=Zr({rootLogger:r,config:e}),i={getChildLogger:Er(r),errorHandler:t},a=Cr(i),p=zr(i);return{...i,rootLogger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},On=(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,loggingMiddleware:i}=kr(e);return Pt({app:e.app.use(i),rootLogger:r,routing:t,getChildLogger:o,config:e}),{notFoundHandler:n,logger:r}},Rn=async(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=kr(e),p=zt().disable("x-powered-by").use(a);if(e.server.compression){let u=await ge("compression");p.use(u(typeof e.server.compression=="object"?e.server.compression:void 0))}let d={json:[e.server.jsonParser||zt.json()],raw:[e.server.rawParser||zt.raw(),Ir],upload:e.server.upload?await wr({config:e,getChildLogger:o}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:p,logger:r,getChildLogger:o}),Pt({app:p,routing:t,rootLogger:r,getChildLogger:o,config:e,parsers:d}),p.use(i,n);let c=(u,S)=>u.listen(S,()=>r.info("Listening",S)),m=Sn.createServer(p),l=e.https&&Tn.createServer(e.https.options,p);return e.gracefulShutdown&&jr({servers:[m].concat(l||[]),logger:r,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,httpServer:c(m,e.server.listen),httpsServer:l&&c(l,e.https?.listen)}};import zs from"node:assert/strict";import{OpenApiBuilder as Cs}from"openapi3-ts/oas31";import{keys as ws,pluck as Is}from"ramda";import oe from"node:assert/strict";import{isReferenceObject as wt,isSchemaObject as nt}from"openapi3-ts/oas31";import{concat as An,type as Hr,filter as Pn,fromPairs as Me,has as zn,isNil as Cn,map as he,mergeAll as wn,mergeDeepRight as In,mergeDeepWith as Zn,objOf as Dr,omit as st,pipe as Kr,pluck as En,range as vn,reject as jn,toLower as Ln,union as Nn,when as kn,xprod as it,zip as Mn}from"ramda";import{z as x}from"zod";var te=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[g]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>te(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var Mr=50,Fr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Un={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Br=/:([A-Za-z0-9_]+)/g,Hn=e=>e.match(Br)?.map(t=>t.slice(1))||[],qr=e=>e.replace(Br,t=>`{${t.slice(1)}}`),Dn=({_def:e},{next:t})=>({...t(e.innerType),default:e[g]?.defaultLabel||e.defaultValue()}),Kn=({_def:{innerType:e}},{next:t})=>t(e),Fn=()=>({format:"any"}),Bn=({},e)=>(oe(!e.isResponse,new Z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),qn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof x.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Vn=({options:e},{next:t})=>({oneOf:e.map(t)}),$n=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),_n=e=>{let[t,r]=e.filter(nt).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));oe(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=Zn((n,i)=>Array.isArray(n)&&Array.isArray(i)?An(n,i):n===i?i:oe.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=Nn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=G(t.examples||[],r.examples||[],([n,i])=>In(n,i))),o},Gn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return _n(o)}catch{}return{allOf:o}},Yn=(e,{next:t})=>t(e.unwrap()),Qn=(e,{next:t})=>t(e.unwrap()),Jn=(e,{next:t})=>{let r=t(e.unwrap());return nt(r)&&(r.type=$r(r)),r},Vr=e=>{let t=Ln(Hr(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Ur=e=>({type:Vr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Wn=({value:e})=>({type:Vr(e),const:e}),Xn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&ze(p)?p instanceof x.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=ot(e,r)),i.length&&(a.required=i),a},es=()=>({type:"null"}),ts=({},e)=>(oe(!e.isResponse,new Z({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:Fr}}),rs=({},e)=>(oe(e.isResponse,new Z({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Fr}}),os=({},e)=>oe.fail(new Z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),ns=()=>({type:"boolean"}),ss=()=>({type:"integer",format:"bigint"}),is=e=>e.every(t=>t instanceof x.ZodLiteral),as=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof x.ZodEnum||e instanceof x.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=ot(x.object(Me(it(o,[t]))),r),n.required=o),n}if(e instanceof x.ZodLiteral)return{type:"object",properties:ot(x.object({[e.value]:t}),r),required:[e.value]};if(e instanceof x.ZodUnion&&is(e.options)){let o=he(i=>`${i.value}`,e.options),n=Me(it(o,[t]));return{type:"object",properties:ot(x.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},ps=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},cs=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),ds=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:m,_def:{checks:l}})=>{let u=l.find(O=>O.kind==="regex"),S=l.find(O=>O.kind==="datetime"),T=u?u.regex:S?S.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,C={type:"string"},h={"date-time":m,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let O in h)if(h[O]){C.format=O;break}return r!==null&&(C.minLength=r),o!==null&&(C.maxLength=o),T&&(C.pattern=T.source),C},ls=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(l=>l.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(l=>l.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=i:m.exclusiveMinimum=i,c?m.maximum=d:m.exclusiveMaximum=d,m},ot=({shape:e},t)=>he(t,e),ms=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Un?.[t]},$r=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},us=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&nt(o)){let i=Be(e,ms(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(x.any())}if(!t&&n.type==="preprocess"&&nt(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},fs=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),ys=(e,{next:t})=>t(e.unwrap()),gs=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),hs=(e,{next:t})=>t(e.unwrap().shape.raw),_r=e=>e.length?Me(Mn(vn(1,e.length+1).map(t=>`example${t}`),he(Dr("value"),e))):void 0,Gr=(e,t,r=[])=>Kr(H,he(kn(o=>Hr(o)==="Object",st(r))),_r)({schema:e,variant:t?"parsed":"original",validate:!0}),xs=(e,t)=>Kr(H,Pn(zn(t)),En(t),_r)({schema:e,variant:"original",validate:!0}),re=e=>e instanceof x.ZodObject?e:e instanceof x.ZodBranded?re(e.unwrap()):e instanceof x.ZodUnion||e instanceof x.ZodDiscriminatedUnion?e.options.map(t=>re(t)).reduce((t,r)=>t.merge(r.partial()),x.object({})):e instanceof x.ZodEffects?re(e._def.schema):e instanceof x.ZodPipeline?re(e._def.in):re(e._def.left).merge(re(e._def.right)),Yr=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=re(r),c=Hn(e),m=o.includes("query"),l=o.includes("params"),u=o.includes("headers"),S=h=>l&&c.includes(h),T=h=>u&&yt(h);return Object.keys(d).map(h=>({name:h,location:S(h)?"path":T(h)?"header":m?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:O})=>{let q=te(d[h],{rules:{...a,...It},onEach:Zt,onMissing:Et,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),ie=i==="components"?n(d[h],q,E(p,h)):q;return{name:h,in:O,required:!d[h].isOptional(),description:q.description||p,schema:ie,examples:xs(r,h)}})},It={ZodString:ds,ZodNumber:ls,ZodBigInt:ss,ZodBoolean:ns,ZodNull:es,ZodArray:ps,ZodTuple:cs,ZodRecord:as,ZodObject:Xn,ZodLiteral:Wn,ZodIntersection:Gn,ZodUnion:Vn,ZodAny:Fn,ZodDefault:Dn,ZodEnum:Ur,ZodNativeEnum:Ur,ZodEffects:us,ZodOptional:Yn,ZodNullable:Jn,ZodDiscriminatedUnion:$n,ZodBranded:ys,ZodDate:os,ZodCatch:Kn,ZodPipeline:fs,ZodLazy:gs,ZodReadonly:Qn,[j]:qn,[me]:Bn,[J]:rs,[Q]:ts,[D]:hs},Zt=(e,{isResponse:t,prev:r})=>{if(wt(r))return{};let{description:o}=e,n=e instanceof x.ZodLazy,i=r.type!==void 0,a=t&&ze(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=$r(r)),!n){let c=H({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},Et=(e,t)=>oe.fail(new Z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Ct=(e,t)=>{if(wt(e))return e;let r={...e};return r.properties&&(r.properties=st(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>st(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Ct(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Ct(o,t))),r},Qr=e=>wt(e)?e:st(["examples"],e),Jr=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:m=`${e.toUpperCase()} ${t} ${gt(n)} response ${p?d:""}`.trim()})=>{let l=Qr(te(r,{rules:{...c,...It},onEach:Zt,onMissing:Et,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),u={schema:a==="components"?i(r,l,E(m)):l,examples:Gr(r,!0)};return{description:m,content:Me(it(o,[u]))}},bs=()=>({type:"http",scheme:"basic"}),Ss=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Ts=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},Os=({name:e})=>({type:"apiKey",in:"header",name:e}),Rs=({name:e})=>({type:"apiKey",in:"cookie",name:e}),As=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Ps=({flows:e={}})=>({type:"oauth2",flows:he(t=>({...t,scopes:t.scopes||{}}),jn(Cn,e))}),Wr=(e,t)=>{let r={basic:bs,bearer:Ss,input:Ts,header:Os,cookie:Rs,openid:As,oauth2:Ps};return We(e,o=>r[o.type](o,t))},at=e=>"or"in e?e.or.map(t=>"and"in t?wn(he(({name:r,scopes:o})=>Dr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?at(Tt(e)):at({or:[e]}),Xr=({method:e,path:t,schema:r,mimeTypes:o,makeRef:n,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=Qr(Ct(te(r,{rules:{...a,...It},onEach:Zt,onMissing:Et,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),m={schema:i==="components"?n(r,c,E(d)):c,examples:Gr(r,!1,p)};return{description:d,content:Me(it(o,[m]))}},eo=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),vt=e=>e.length<=Mr?e:e.slice(0,Mr-1)+"\u2026";var jt=class extends Cs{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=ws(X);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||E(r,t),i=this.lastOperationIdSuffixes.get(n);return i===void 0?(this.lastOperationIdSuffixes.set(n,1),n):(o&&zs.fail(new Z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:n});for(let l of typeof i=="string"?[i]:i)this.addServer({url:l});ee({routing:t,onEndpoint:(l,u,S)=>{let T=S,C={path:u,method:T,endpoint:l,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[h,O]=["short","long"].map(l.getDescription.bind(l)),q=h?vt(h):d&&O?vt(O):void 0,ie=l.getTags(),be=r.inputSources?.[T]||ut[T],ae=this.ensureUniqOperationId(u,T,l.getOperationId(T)),Se=Yr({...C,inputSources:be,schema:l.getSchema("input"),description:a?.requestParameter?.call(null,{method:T,path:u,operationId:ae})}),He={};for(let N of this.responseVariants){let V=l.getResponses(N);for(let{mimeTypes:Te,schema:P,statusCodes:z}of V)for(let w of z)He[w]=Jr({...C,variant:N,schema:P,mimeTypes:Te,statusCode:w,hasMultipleStatusCodes:V.length>1||z.length>1,description:a?.[`${N}Response`]?.call(null,{method:T,path:u,operationId:ae,statusCode:w})})}let mt=be.includes("body")?Xr({...C,paramNames:Is("name",Se),schema:l.getSchema("input"),mimeTypes:l.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:T,path:u,operationId:ae})}):void 0,De=at(We(Wr(l.getSecurity(),be),N=>{let V=this.ensureUniqSecuritySchemaName(N),Te=["oauth2","openIdConnect"].includes(N.type)?l.getScopes().slice():[];return this.addSecurityScheme(V,N),{name:V,scopes:Te}}));this.addPath(qr(u),{[T]:{operationId:ae,summary:q,description:O,tags:ie.length>0?ie:void 0,parameters:Se.length>0?Se:void 0,requestBody:mt,security:De.length>0?De:void 0,responses:He}})}}),this.rootDoc.tags=r.tags?eo(r.tags):[]}};import{createRequest as Zs,createResponse as Es}from"node-mocks-http";var vs=e=>Zs({...e,headers:{"content-type":R.json,...e?.headers}}),js=e=>Es(e),Ls=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:ur(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},to=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=vs(e),i=js({req:n,...t});i.req=t?.req||n,n.res=i;let a=Ls(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},Ns=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=to(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},ks=async({middleware:e,options:t={},...r})=>{let{requestMock:o,responseMock:n,loggerMock:i,configMock:a}=to(r),p=Fe(o,a.inputSources),d=await e.execute({request:o,response:n,logger:i,input:p,options:t});return{requestMock:o,responseMock:n,loggerMock:i,output:d}};import v from"typescript";import M from"typescript";import{chain as ro,toPairs as oo}from"ramda";var s=M.factory,F=[s.createModifier(M.SyntaxKind.ExportKeyword)],Ms=[s.createModifier(M.SyntaxKind.AsyncKeyword)],Us=[s.createModifier(M.SyntaxKind.PublicKeyword),s.createModifier(M.SyntaxKind.ReadonlyKeyword)],no=[s.createModifier(M.SyntaxKind.ProtectedKeyword),s.createModifier(M.SyntaxKind.ReadonlyKeyword)],Lt=s.createTemplateHead(""),xe=s.createTemplateTail(""),Nt=s.createTemplateMiddle(" "),kt=e=>s.createTemplateLiteralType(Lt,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?xe:Nt))),Mt=kt(["M","P"]),pt=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),ct=(e,t)=>ro(([r,o])=>[pt(s.createIdentifier(r),o,t)],oo(e)),Ut=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),so=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),io=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),B=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],M.NodeFlags.Const),Ht=(e,t)=>s.createTypeAliasDeclaration(F,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),dt=(e,t)=>s.createTypeAliasDeclaration(F,e,void 0,t),ao=(e,t,r)=>s.createPropertyDeclaration(Us,e,void 0,t,r),po=(e,t,r)=>s.createClassDeclaration(F,e,void 0,void 0,[t,...r]),co=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),lo=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(M.SyntaxKind.AnyKeyword)]),mo=(e,t,r)=>s.createInterfaceDeclaration(F,e,void 0,t,r),Hs=ro(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),uo=e=>Hs(oo(e)),Dt=(e,t,r)=>s.createArrowFunction(r?Ms:void 0,void 0,e.map(o=>pt(o)),void 0,void 0,t),Kt=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,ct({acc:void 0,key:void 0}),void 0,void 0,t),r]),fo=(...e)=>`"${e.join(" ")}"`;var yo=["get","post","put","delete","patch"];import y from"typescript";import{z as qt}from"zod";import b from"typescript";var{factory:lt}=b,Ft=(e,t)=>{b.addSyntheticLeadingComment(e,b.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ne=(e,t,r)=>{let o=lt.createTypeAliasDeclaration(void 0,lt.createIdentifier(t),void 0,e);return r&&Ft(o,r),o},Bt=(e,t)=>{let r=b.createSourceFile("print.ts","",b.ScriptTarget.Latest,!1,b.ScriptKind.TS);return b.createPrinter(t).printNode(b.EmitHint.Unspecified,e,r)},Ds=/^[A-Za-z_$][A-Za-z0-9_$]*$/,go=e=>Ds.test(e)?lt.createIdentifier(e):lt.createStringLiteral(e),Ks=[b.SyntaxKind.AnyKeyword,b.SyntaxKind.BigIntKeyword,b.SyntaxKind.BooleanKeyword,b.SyntaxKind.NeverKeyword,b.SyntaxKind.NumberKeyword,b.SyntaxKind.ObjectKeyword,b.SyntaxKind.StringKeyword,b.SyntaxKind.SymbolKeyword,b.SyntaxKind.UndefinedKeyword,b.SyntaxKind.UnknownKeyword,b.SyntaxKind.VoidKeyword],ho=e=>Ks.includes(e.kind);var{factory:f}=y,Fs={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},Bs=({value:e})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),qs=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&ze(a)?a instanceof qt.ZodOptional:a.isOptional(),d=f.createPropertySignature(void 0,go(i),p&&o?f.createToken(y.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Ft(d,a.description),d});return f.createTypeLiteralNode(n)},Vs=({element:e},{next:t})=>f.createArrayTypeNode(t(e)),$s=({options:e})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),xo=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(ho(n)?n.kind:n,n)}return f.createUnionTypeNode(Array.from(r.values()))},_s=e=>Fs?.[e.kind],Gs=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Be(e,_s(o)),i={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(n&&i[n]||y.SyntaxKind.AnyKeyword)}return o},Ys=e=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),Qs=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},Js=(e,{next:t})=>f.createUnionTypeNode([t(e.unwrap()),f.createLiteralTypeNode(f.createNull())]),Ws=({items:e,_def:{rest:t}},{next:r})=>f.createTupleTypeNode(e.map(r).concat(t===null?[]:f.createRestTypeNode(r(t)))),Xs=({keySchema:e,valueSchema:t},{next:r})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e,t].map(r)),ei=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(y.isTypeLiteralNode)?f.createTypeLiteralNode(o.flatMap(({members:i})=>i)):f.createIntersectionTypeNode(o)},ti=({_def:e},{next:t})=>t(e.innerType),se=e=>()=>f.createKeywordTypeNode(e),ri=(e,{next:t})=>t(e.unwrap()),oi=(e,{next:t})=>t(e.unwrap()),ni=({_def:e},{next:t})=>t(e.innerType),si=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ii=()=>f.createLiteralTypeNode(f.createNull()),ai=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),pi=e=>{let t=e.unwrap(),r=f.createKeywordTypeNode(y.SyntaxKind.StringKeyword),o=f.createTypeReferenceNode("Buffer"),n=f.createUnionTypeNode([r,o]);return t instanceof qt.ZodString?r:t instanceof qt.ZodUnion?n:o},ci=(e,{next:t})=>t(e.unwrap().shape.raw),di={ZodString:se(y.SyntaxKind.StringKeyword),ZodNumber:se(y.SyntaxKind.NumberKeyword),ZodBigInt:se(y.SyntaxKind.BigIntKeyword),ZodBoolean:se(y.SyntaxKind.BooleanKeyword),ZodAny:se(y.SyntaxKind.AnyKeyword),[Q]:se(y.SyntaxKind.StringKeyword),[J]:se(y.SyntaxKind.StringKeyword),ZodNull:ii,ZodArray:Vs,ZodTuple:Ws,ZodRecord:Xs,ZodObject:qs,ZodLiteral:Bs,ZodIntersection:ei,ZodUnion:xo,ZodDefault:ti,ZodEnum:$s,ZodNativeEnum:Ys,ZodEffects:Gs,ZodOptional:Qs,ZodNullable:Js,ZodDiscriminatedUnion:xo,ZodBranded:ri,ZodCatch:ni,ZodPipeline:si,ZodLazy:ai,ZodReadonly:oi,[j]:pi,[D]:ci},Ue=(e,{brandHandling:t,ctx:r})=>te(e,{rules:{...t,...di},onMissing:()=>f.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),ctx:r});var Vt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let n=s.createLiteralTypeNode(s.createNull());this.aliases.set(t,ne(n,o)),this.aliases.set(t,ne(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(P,z,w)=>{let pe={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},Oe=E(w,z,"input"),Re=Ue(P.getSchema("input"),{brandHandling:r,ctx:{...pe,isResponse:!1}}),I=n?E(w,z,"positive.response"):void 0,$t=P.getSchema("positive"),_t=n?Ue($t,{brandHandling:r,ctx:{...pe,isResponse:!0}}):void 0,Ae=n?E(w,z,"negative.response"):void 0,Gt=P.getSchema("negative"),Yt=n?Ue(Gt,{brandHandling:r,ctx:{...pe,isResponse:!0}}):void 0,Qt=E(w,z,"response"),bo=I&&Ae?s.createUnionTypeNode([s.createTypeReferenceNode(I),s.createTypeReferenceNode(Ae)]):Ue($t.or(Gt),{brandHandling:r,ctx:{...pe,isResponse:!0}});this.program.push(ne(Re,Oe)),_t&&I&&this.program.push(ne(_t,I)),Yt&&Ae&&this.program.push(ne(Yt,Ae)),this.program.push(ne(bo,Qt)),w!=="options"&&(this.paths.push(z),this.registry.set({method:w,path:z},{input:Oe,positive:I,negative:Ae,response:Qt,isJson:P.getMimeTypes("positive").includes(R.json),tags:P.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(Ht(this.ids.pathType,this.paths)),this.program.push(Ht(this.ids.methodType,yo)),this.program.push(dt(this.ids.methodPathType,kt([this.ids.methodType,this.ids.pathType])));let a=[s.createHeritageClause(v.SyntaxKind.ExtendsKeyword,[Ut(this.ids.methodPathType,v.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),n&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let p=[],d=[];for(let[{method:P,path:z},{isJson:w,tags:pe,...Oe}]of this.registry){let Re=fo(P,z);for(let I of this.interfaces)I.kind in Oe&&I.props.push(io(Re,Oe[I.kind]));o!=="types"&&(w&&p.push(s.createPropertyAssignment(Re,s.createTrue())),d.push(s.createPropertyAssignment(Re,s.createArrayLiteralExpression(pe.map(I=>s.createStringLiteral(I))))))}for(let{id:P,props:z}of this.interfaces)this.program.push(mo(P,a,z));if(o==="types")return;let c=s.createVariableStatement(F,B(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(p))),m=s.createVariableStatement(F,B(this.ids.endpointTagsConst,s.createObjectLiteralExpression(d))),l=dt(this.ids.providerType,s.createFunctionTypeNode(uo({M:this.ids.methodType,P:this.ids.pathType}),ct({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Mt)}),co(this.ids.responseInterface,Mt))),u=dt(this.ids.implementationType,s.createFunctionTypeNode(void 0,ct({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(v.SyntaxKind.StringKeyword),params:Ut(v.SyntaxKind.StringKeyword,v.SyntaxKind.AnyKeyword)}),lo())),S=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,xe)]),T=Kt(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[S,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),C=Kt(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[S]),v.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),h=po(this.ids.clientClass,so([pt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),no)]),[ao(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),Dt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,T,C]),!0))]);this.program.push(c,m,l,u,h);let O=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),q=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(R.json))]),void 0,this.ids.undefinedValue)),ie=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),be=s.createVariableStatement(void 0,B(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,xe)]),s.createObjectLiteralExpression([O,q,ie])])))),ae=s.createVariableStatement(void 0,B(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),Se=s.createVariableStatement(void 0,B(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),xe)])))),[He,mt]=["json","text"].map(P=>s.createReturnStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.responseConst,P),void 0,void 0))),De=s.createIfStatement(s.createBinaryExpression(s.createTemplateExpression(Lt,[s.createTemplateSpan(this.ids.methodParameter,Nt),s.createTemplateSpan(this.ids.pathParameter,xe)]),v.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),s.createBlock([He])),N=s.createVariableStatement(F,B(this.ids.exampleImplementationConst,Dt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([ae,Se,be,De,mt]),!0),s.createTypeReferenceNode(this.ids.implementationType))),V=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),Te=s.createVariableStatement(void 0,B(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(N,Te,V)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Bt(r,t)).join(`
|
|
19
19
|
`):void 0}print(t){let r=this.printUsage(t),o=r&&v.addSyntheticLeadingComment(v.addSyntheticLeadingComment(s.createEmptyStatement(),v.SyntaxKind.SingleLineCommentTrivia," Usage example:"),v.SyntaxKind.MultiLineCommentTrivia,`
|
|
20
20
|
${r}`);return this.program.concat(o||[]).map((n,i)=>Bt(n,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
|
|
21
21
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "express-zod-api",
|
|
3
|
-
"version": "20.18.0
|
|
3
|
+
"version": "20.18.0",
|
|
4
4
|
"description": "A Typescript library to help you get an API server up and running with I/O schema validation and custom middlewares in minutes.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|