express-zod-api 20.1.0-beta.2 → 20.1.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 CHANGED
@@ -17,7 +17,7 @@ ${o}888${t}
17
17
  ${r}
18
18
  `.split(`
19
19
  `).map((d,l)=>a[l]?a[l](d):d).join(`
20
- `)};var vr=e=>{e.startupLogo!==!1&&console.log(jr());let t=e.errorHandler||Te,r=Ar(e.logger)?e.logger:new Re(e.logger);r.debug("Running","v20.1.0-beta.2 (CJS)");let o=Er({rootLogger:r,config:e}),i=zr({rootLogger:r,errorHandler:t}),s=Cr({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:i,parserFailureHandler:s,loggingMiddleware:o}},kr=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:i}=vr(e);return Nt({app:e.app.use(i),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},Mr=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,parserFailureHandler:i,loggingMiddleware:s}=vr(e),a=(0,pt.default)().disable("x-powered-by").use(s);if(e.server.compression){let m=await Ce("compression");a.use(m(typeof e.server.compression=="object"?e.server.compression:void 0))}let p={json:[e.server.jsonParser||pt.default.json()],raw:[e.server.rawParser||pt.default.raw(),Zr],upload:e.server.upload?await wr({config:e,rootLogger:r}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:a,logger:r}),Nt({app:a,routing:t,rootLogger:r,config:e,parsers:p}),a.use(i,o);let d=(m,y)=>m.listen(y,()=>{r.info("Listening",y)}),l={httpServer:d(Lr.default.createServer(a),e.server.listen),httpsServer:e.https?d(Nr.default.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...l,logger:r}};var ro=R(require("assert/strict"),1),oo=require("openapi3-ts/oas31"),no=require("ramda");var J=R(require("assert/strict"),1),$=require("openapi3-ts/oas31"),c=require("ramda"),b=require("zod");var ze=require("zod");var ct=e=>!isNaN(e.getTime());var $e=Symbol("DateIn"),Ur=()=>ze.z.union([ze.z.string().date(),ze.z.string().datetime(),ze.z.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(ze.z.date().refine(ct)).brand($e);var Hr=require("zod");var Ve=Symbol("DateOut"),Dr=()=>Hr.z.date().refine(ct).transform(e=>e.toISOString()).brand(Ve);var pe=(e,{onEach:t,rules:r,onMissing:o,ctx:i={}})=>{let s=r[e._def[g]?.brand]||r[e._def.typeName],p=s?s(e,{...i,next:l=>pe(l,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),d=t&&t(e,{prev:p,...i});return d?{...p,...d}:p};var Fr=50,Br="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Fo={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},qr=/:([A-Za-z0-9_]+)/g,Ko=e=>e.match(qr)?.map(t=>t.slice(1))||[],$r=e=>e.replace(qr,t=>`{${t.slice(1)}}`),Bo=({_def:e},{next:t})=>({...t(e.innerType),default:e[g]?.defaultLabel||e.defaultValue()}),qo=({_def:{innerType:e}},{next:t})=>t(e),$o=()=>({format:"any"}),Vo=({},e)=>((0,J.default)(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),Go=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"}},_o=({options:e},{next:t})=>({oneOf:e.map(t)}),Yo=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),Qo=e=>{let[t,r]=e.filter($.isSchemaObject).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));(0,J.default)(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,c.mergeDeepWith)((i,s)=>Array.isArray(i)&&Array.isArray(s)?(0,c.concat)(i,s):i===s?s:J.default.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,c.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=oe(t.examples||[],r.examples||[],([i,s])=>(0,c.mergeDeepRight)(i,s))),o},Jo=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Qo(o)}catch{}return{allOf:o}},Wo=(e,{next:t})=>t(e.unwrap()),Xo=(e,{next:t})=>t(e.unwrap()),en=(e,{next:t})=>{let r=t(e.unwrap());return(0,$.isSchemaObject)(r)&&(r.type=Gr(r)),r},Vr=e=>{let t=(0,c.toLower)((0,c.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Kr=e=>({type:Vr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),tn=({value:e})=>({type:Vr(e),const:e}),rn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&He(p)?p instanceof b.z.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=dt(e,r)),s.length&&(a.required=s),a},on=()=>({type:"null"}),nn=({},e)=>((0,J.default)(!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:Br}}),sn=({},e)=>((0,J.default)(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:Br}}),an=({},e)=>J.default.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})),pn=()=>({type:"boolean"}),cn=()=>({type:"integer",format:"bigint"}),dn=e=>e.every(t=>t instanceof b.z.ZodLiteral),ln=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.z.ZodEnum||e instanceof b.z.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=dt(b.z.object((0,c.fromPairs)((0,c.xprod)(o,[t]))),r),i.required=o),i}if(e instanceof b.z.ZodLiteral)return{type:"object",properties:dt(b.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.z.ZodUnion&&dn(e.options)){let o=(0,c.map)(s=>`${s.value}`,e.options),i=(0,c.fromPairs)((0,c.xprod)(o,[t]));return{type:"object",properties:dt(b.z.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},mn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let i={type:"array",items:o(r)};return e&&(i.minItems=e.value),t&&(i.maxItems=t.value),i},un=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),fn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:l,isDatetime:m,_def:{checks:y}})=>{let f=y.find(I=>I.kind==="regex"),S=y.find(I=>I.kind==="datetime"),L=f?f.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,T={type:"string"},M={"date-time":m,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:d,emoji:l};for(let I in M)if(M[I]){T.format=I;break}return r!==null&&(T.minLength=r),o!==null&&(T.maxLength=o),L&&(T.pattern=L.source),T},yn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let i=o.find(y=>y.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=i?i.inclusive:!0,p=o.find(y=>y.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,l=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=s:m.exclusiveMinimum=s,l?m.maximum=d:m.exclusiveMaximum=d,m},dt=({shape:e},t)=>(0,c.map)(t,e),gn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Fo?.[t]},Gr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},hn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&(0,$.isSchemaObject)(o)){let s=Xe(e,gn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(b.z.any())}if(!t&&i.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},xn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),bn=(e,{next:t})=>t(e.unwrap()),Tn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},Sn=(e,{next:t})=>t(e.unwrap().shape.raw),_r=e=>e.length?(0,c.fromPairs)((0,c.zip)((0,c.range)(1,e.length+1).map(t=>`example${t}`),(0,c.map)((0,c.objOf)("value"),e))):void 0,Yr=(e,t,r=[])=>(0,c.pipe)(K,(0,c.map)((0,c.when)((0,c.both)(B,(0,c.complement)(Array.isArray)),(0,c.omit)(r))),_r)({schema:e,variant:t?"parsed":"original",validate:!0}),On=(e,t)=>(0,c.pipe)(K,(0,c.filter)((0,c.has)(t)),(0,c.pluck)(t),_r)({schema:e,variant:"original",validate:!0}),ce=e=>e instanceof b.z.ZodObject?e:e instanceof b.z.ZodBranded?ce(e.unwrap()):e instanceof b.z.ZodUnion||e instanceof b.z.ZodDiscriminatedUnion?e.options.map(t=>ce(t)).reduce((t,r)=>t.merge(r.partial()),b.z.object({})):e instanceof b.z.ZodEffects?ce(e._def.schema):e instanceof b.z.ZodPipeline?ce(e._def.in):ce(e._def.left).merge(ce(e._def.right)),Qr=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,description:l=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:m}=ce(r),y=Ko(e),f=o.includes("query"),S=o.includes("params"),L=o.includes("headers"),T=x=>S&&y.includes(x),M=x=>L&&Rt(x);return Object.keys(m).map(x=>({name:x,location:T(x)?"path":M(x)?"header":f?"query":void 0})).filter(x=>x.location!==void 0).map(({name:x,location:je})=>{let G=pe(m[x],{rules:{...d,...kt},onEach:Mt,onMissing:Ut,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),ee=p==="components"?a(v(l,x),G):G;return{name:x,in:je,required:!m[x].isOptional(),description:G.description||l,schema:ee,examples:On(r,x)}})},kt={ZodString:fn,ZodNumber:yn,ZodBigInt:cn,ZodBoolean:pn,ZodNull:on,ZodArray:mn,ZodTuple:un,ZodRecord:ln,ZodObject:rn,ZodLiteral:tn,ZodIntersection:Jo,ZodUnion:_o,ZodAny:$o,ZodDefault:Bo,ZodEnum:Kr,ZodNativeEnum:Kr,ZodEffects:hn,ZodOptional:Wo,ZodNullable:en,ZodDiscriminatedUnion:Yo,ZodBranded:bn,ZodDate:an,ZodCatch:qo,ZodPipeline:xn,ZodLazy:Tn,ZodReadonly:Xo,[Q]:Go,[Fe]:Vo,[Ve]:sn,[$e]:nn,[ie]:Sn},Mt=(e,{isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,i=e instanceof b.z.ZodLazy,s=r.type!==void 0,a=t&&He(e),p=!i&&s&&!a&&e.isNullable(),d=i?[]:K({schema:e,variant:t?"parsed":"original",validate:!0}),l={};return o&&(l.description=o),p&&(l.type=Gr(r)),d.length&&(l.examples=d.slice()),l},Ut=(e,t)=>J.default.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),vt=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,c.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,c.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>vt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>vt(o,t))),r},Jr=e=>(0,$.isReferenceObject)(e)?e:(0,c.omit)(["examples"],e),Wr=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:d,hasMultipleStatusCodes:l,statusCode:m,brandHandling:y,description:f=`${e.toUpperCase()} ${t} ${Pt(i)} response ${l?m:""}`.trim()})=>{let S=Jr(pe(r,{rules:{...y,...kt},onEach:Mt,onMissing:Ut,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),L={schema:d==="components"?p(v(f),S):S,examples:Yr(r,!0)};return{description:f,content:(0,c.fromPairs)((0,c.xprod)(o,[L]))}},Rn=()=>({type:"http",scheme:"basic"}),An=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Pn=({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},In=({name:e})=>({type:"apiKey",in:"header",name:e}),Cn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),zn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),wn=({flows:e={}})=>({type:"oauth2",flows:(0,c.map)(t=>({...t,scopes:t.scopes||{}}),(0,c.reject)(c.isNil,e))}),Xr=(e,t)=>{let r={basic:Rn,bearer:An,input:Pn,header:In,cookie:Cn,openid:zn,oauth2:wn};return nt(e,o=>r[o.type](o,t))},lt=e=>"or"in e?e.or.map(t=>"and"in t?(0,c.mergeAll)((0,c.map)(({name:r,scopes:o})=>(0,c.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?lt(zt(e)):lt({or:[e]}),eo=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,paramNames:l,description:m=`${e.toUpperCase()} ${t} Request body`})=>{let y=Jr(vt(pe(r,{rules:{...d,...kt},onEach:Mt,onMissing:Ut,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),l)),f={schema:p==="components"?a(v(m),y):y,examples:Yr(r,!1,l)};return{description:m,content:(0,c.fromPairs)((0,c.xprod)(o,[f]))}},to=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}),Ht=e=>e.length<=Fr?e:e.slice(0,Fr-1)+"\u2026";var mt=class extends oo.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let i=o||v(r,t),s=this.lastOperationIdSuffixes.get(i);return s===void 0?(this.lastOperationIdSuffixes.set(i,1),i):(o&&ro.default.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(i,s),`${i}${s}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let i in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[i]))return i;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:i,serverUrl:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:l="inline",serializer:m=We}){super(),this.addInfo({title:o,version:i});for(let f of typeof s=="string"?[s]:s)this.addServer({url:f});ae({routing:t,onEndpoint:(f,S,L)=>{let T=L,M={path:S,method:T,endpoint:f,composition:l,serializer:m,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[I,x]=["short","long"].map(f.getDescription.bind(f)),je=I?Ht(I):d&&x?Ht(x):void 0,G=f.getTags(),ee=r.inputSources?.[T]||St[T],le=this.ensureUniqOperationId(S,T,f.getOperationId(T)),Le=Qr({...M,inputSources:ee,schema:f.getSchema("input"),description:a?.requestParameter?.call(null,{method:T,path:S,operationId:le})}),_e={};for(let D of["positive","negative"]){let te=f.getResponses(D);for(let{mimeTypes:Ne,schema:A,statusCodes:P}of te)for(let C of P)_e[C]=Wr({...M,variant:D,schema:A,mimeTypes:Ne,statusCode:C,hasMultipleStatusCodes:te.length>1||P.length>1,description:a?.[`${D}Response`]?.call(null,{method:T,path:S,operationId:le,statusCode:C})})}let Tt=ee.includes("body")?eo({...M,paramNames:(0,no.pluck)("name",Le),schema:f.getSchema("input"),mimeTypes:f.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:T,path:S,operationId:le})}):void 0,Ye=lt(nt(Xr(f.getSecurity(),ee),D=>{let te=this.ensureUniqSecuritySchemaName(D),Ne=["oauth2","openIdConnect"].includes(D.type)?f.getScopes().slice():[];return this.addSecurityScheme(te,D),{name:te,scopes:Ne}}));this.addPath($r(S),{[T]:{operationId:le,summary:je,description:x,tags:G.length>0?G:void 0,parameters:Le.length>0?Le:void 0,requestBody:Tt,security:Ye.length>0?Ye:void 0,responses:_e}})}}),this.rootDoc.tags=r.tags?to(r.tags):[]}};var ut=require("node-mocks-http"),Zn=e=>(0,ut.createRequest)({...e,headers:{"content-type":w.json,...e?.headers}}),En=e=>(0,ut.createResponse)(e),jn=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,i){return o==="_getLogs"?()=>t:o in Oe?(...s)=>t[o].push(s):Reflect.get(r,o,i)}})},io=async({endpoint:e,requestProps:t,responseOptions:r,configProps:o,loggerProps:i})=>{let s=Zn(t),a=En({req:s,...r}),p=jn(i),d={cors:!1,logger:p,...o};return await e.execute({request:s,response:a,config:d,logger:p}),{requestMock:s,responseMock:a,loggerMock:p}};var j=R(require("typescript"),1);var H=R(require("typescript"),1),we=require("ramda"),n=H.default.factory,W=[n.createModifier(H.default.SyntaxKind.ExportKeyword)],Ln=[n.createModifier(H.default.SyntaxKind.AsyncKeyword)],Nn=[n.createModifier(H.default.SyntaxKind.PublicKeyword),n.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],so=[n.createModifier(H.default.SyntaxKind.ProtectedKeyword),n.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],Dt=n.createTemplateHead(""),Ze=n.createTemplateTail(""),Ft=n.createTemplateMiddle(" "),Kt=e=>n.createTemplateLiteralType(Dt,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?Ze:Ft))),Bt=Kt(["M","P"]),ft=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),yt=(e,t)=>(0,we.chain)(([r,o])=>[ft(n.createIdentifier(r),o,t)],(0,we.toPairs)(e)),qt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),ao=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),po=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),X=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],H.default.NodeFlags.Const),$t=(e,t)=>n.createTypeAliasDeclaration(W,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),gt=(e,t)=>n.createTypeAliasDeclaration(W,e,void 0,t),co=(e,t,r)=>n.createPropertyDeclaration(Nn,e,void 0,t,r),lo=(e,t,r)=>n.createClassDeclaration(W,e,void 0,void 0,[t,...r]),mo=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),uo=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(H.default.SyntaxKind.AnyKeyword)]),fo=(e,t,r)=>n.createInterfaceDeclaration(W,e,void 0,t,r),yo=e=>(0,we.chain)(([t,r])=>[n.createTypeParameterDeclaration([],t,n.createTypeReferenceNode(r))],(0,we.toPairs)(e)),Vt=(e,t,r)=>n.createArrowFunction(r?Ln:void 0,void 0,e.map(o=>ft(o)),void 0,void 0,t),Gt=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[n.createArrowFunction(void 0,void 0,yt({acc:void 0,key:void 0}),void 0,void 0,t),r]),go=(...e)=>`"${e.join(" ")}"`;var ho=["get","post","put","delete","patch"];var h=R(require("typescript"),1),xt=require("zod");var V=R(require("typescript"),1),{factory:ht}=V.default,_t=(e,t)=>{V.default.addSyntheticLeadingComment(e,V.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ee=(e,t,r)=>{let o=ht.createTypeAliasDeclaration(void 0,ht.createIdentifier(t),void 0,e);return r&&_t(o,r),o},Yt=(e,t)=>{let r=V.default.createSourceFile("print.ts","",V.default.ScriptTarget.Latest,!1,V.default.ScriptKind.TS);return V.default.createPrinter(t).printNode(V.default.EmitHint.Unspecified,e,r)},vn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,xo=e=>vn.test(e)?ht.createIdentifier(e):ht.createStringLiteral(e);var{factory:u}=h.default,kn={[h.default.SyntaxKind.AnyKeyword]:"",[h.default.SyntaxKind.BigIntKeyword]:BigInt(0),[h.default.SyntaxKind.BooleanKeyword]:!1,[h.default.SyntaxKind.NumberKeyword]:0,[h.default.SyntaxKind.ObjectKeyword]:{},[h.default.SyntaxKind.StringKeyword]:"",[h.default.SyntaxKind.UndefinedKeyword]:void 0},Mn=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Un=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&He(a)?a instanceof xt.z.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,xo(s),p&&o?u.createToken(h.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&_t(d,a.description),d});return u.createTypeLiteralNode(i)},Hn=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),Dn=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),bo=({options:e},{next:t})=>u.createUnionTypeNode(e.map(t)),Fn=e=>kn?.[e.kind],Kn=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=Xe(e,Fn(o)),s={number:h.default.SyntaxKind.NumberKeyword,bigint:h.default.SyntaxKind.BigIntKeyword,boolean:h.default.SyntaxKind.BooleanKeyword,string:h.default.SyntaxKind.StringKeyword,undefined:h.default.SyntaxKind.UndefinedKeyword,object:h.default.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(i&&s[i]||h.default.SyntaxKind.AnyKeyword)}return o},Bn=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),qn=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(h.default.SyntaxKind.UndefinedKeyword)]):o},$n=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),Vn=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),Gn=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),_n=({_def:e},{next:t})=>u.createIntersectionTypeNode([e.left,e.right].map(t)),Yn=({_def:e},{next:t})=>t(e.innerType),de=e=>()=>u.createKeywordTypeNode(e),Qn=(e,{next:t})=>t(e.unwrap()),Jn=(e,{next:t})=>t(e.unwrap()),Wn=({_def:e},{next:t})=>t(e.innerType),Xn=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ei=()=>u.createLiteralTypeNode(u.createNull()),ti=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:i})=>{let s=`Type${i(e)}`;return t(s)||(r(s,u.createLiteralTypeNode(u.createNull())),r(s,o(e)))},ri=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(h.default.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),i=u.createUnionTypeNode([r,o]);return t instanceof xt.z.ZodString?r:t instanceof xt.z.ZodUnion?i:o},oi=(e,{next:t})=>t(e.unwrap().shape.raw),ni={ZodString:de(h.default.SyntaxKind.StringKeyword),ZodNumber:de(h.default.SyntaxKind.NumberKeyword),ZodBigInt:de(h.default.SyntaxKind.BigIntKeyword),ZodBoolean:de(h.default.SyntaxKind.BooleanKeyword),ZodAny:de(h.default.SyntaxKind.AnyKeyword),[$e]:de(h.default.SyntaxKind.StringKeyword),[Ve]:de(h.default.SyntaxKind.StringKeyword),ZodNull:ei,ZodArray:Hn,ZodTuple:Vn,ZodRecord:Gn,ZodObject:Un,ZodLiteral:Mn,ZodIntersection:_n,ZodUnion:bo,ZodDefault:Yn,ZodEnum:Dn,ZodNativeEnum:Bn,ZodEffects:Kn,ZodOptional:qn,ZodNullable:$n,ZodDiscriminatedUnion:bo,ZodBranded:Qn,ZodCatch:Wn,ZodPipeline:Xn,ZodLazy:ti,ZodReadonly:Jn,[Q]:ri,[ie]:oi},Ge=(e,{brandHandling:t,ctx:r})=>pe(e,{rules:{...t,...ni},onMissing:()=>u.createKeywordTypeNode(h.default.SyntaxKind.AnyKeyword),ctx:r});var bt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:n.createIdentifier("Path"),methodType:n.createIdentifier("Method"),methodPathType:n.createIdentifier("MethodPath"),inputInterface:n.createIdentifier("Input"),posResponseInterface:n.createIdentifier("PositiveResponse"),negResponseInterface:n.createIdentifier("NegativeResponse"),responseInterface:n.createIdentifier("Response"),jsonEndpointsConst:n.createIdentifier("jsonEndpoints"),endpointTagsConst:n.createIdentifier("endpointTags"),providerType:n.createIdentifier("Provider"),implementationType:n.createIdentifier("Implementation"),clientClass:n.createIdentifier("ExpressZodAPIClient"),keyParameter:n.createIdentifier("key"),pathParameter:n.createIdentifier("path"),paramsArgument:n.createIdentifier("params"),methodParameter:n.createIdentifier("method"),accumulator:n.createIdentifier("acc"),provideMethod:n.createIdentifier("provide"),implementationArgument:n.createIdentifier("implementation"),headersProperty:n.createIdentifier("headers"),hasBodyConst:n.createIdentifier("hasBody"),undefinedValue:n.createIdentifier("undefined"),bodyProperty:n.createIdentifier("body"),responseConst:n.createIdentifier("response"),searchParamsConst:n.createIdentifier("searchParams"),exampleImplementationConst:n.createIdentifier("exampleImplementation"),clientConst:n.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?n.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,Ee(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=We,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){ae({routing:t,onEndpoint:(A,P,C)=>{let me={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},ve=v(C,P,"input"),ke=Ge(A.getSchema("input"),{brandHandling:r,ctx:{...me,isResponse:!1}}),N=s?v(C,P,"positive.response"):void 0,Qt=A.getSchema("positive"),Jt=s?Ge(Qt,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,Me=s?v(C,P,"negative.response"):void 0,Wt=A.getSchema("negative"),Xt=s?Ge(Wt,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,er=v(C,P,"response"),So=N&&Me?n.createUnionTypeNode([n.createTypeReferenceNode(N),n.createTypeReferenceNode(Me)]):Ge(Qt.or(Wt),{brandHandling:r,ctx:{...me,isResponse:!0}});this.program.push(Ee(ke,ve)),Jt&&N&&this.program.push(Ee(Jt,N)),Xt&&Me&&this.program.push(Ee(Xt,Me)),this.program.push(Ee(So,er)),C!=="options"&&(this.paths.push(P),this.registry.set({method:C,path:P},{input:ve,positive:N,negative:Me,response:er,isJson:A.getMimeTypes("positive").includes(w.json),tags:A.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push($t(this.ids.pathType,this.paths)),this.program.push($t(this.ids.methodType,ho)),this.program.push(gt(this.ids.methodPathType,Kt([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(j.default.SyntaxKind.ExtendsKeyword,[qt(this.ids.methodPathType,j.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&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 d=[],l=[];for(let[{method:A,path:P},{isJson:C,tags:me,...ve}]of this.registry){let ke=go(A,P);for(let N of this.interfaces)N.kind in ve&&N.props.push(po(ke,ve[N.kind]));o!=="types"&&(C&&d.push(n.createPropertyAssignment(ke,n.createTrue())),l.push(n.createPropertyAssignment(ke,n.createArrayLiteralExpression(me.map(N=>n.createStringLiteral(N))))))}for(let{id:A,props:P}of this.interfaces)this.program.push(fo(A,p,P));if(o==="types")return;let m=n.createVariableStatement(W,X(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(d))),y=n.createVariableStatement(W,X(this.ids.endpointTagsConst,n.createObjectLiteralExpression(l))),f=gt(this.ids.providerType,n.createFunctionTypeNode(yo({M:this.ids.methodType,P:this.ids.pathType}),yt({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),Bt)}),mo(this.ids.responseInterface,Bt))),S=gt(this.ids.implementationType,n.createFunctionTypeNode(void 0,yt({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(j.default.SyntaxKind.StringKeyword),params:qt(j.default.SyntaxKind.StringKeyword,j.default.SyntaxKind.AnyKeyword)}),uo())),L=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,Ze)]),T=Gt(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[L,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),M=Gt(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[L]),j.default.SyntaxKind.GreaterThanEqualsToken,n.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,n.createObjectLiteralExpression([n.createSpreadAssignment(this.ids.accumulator),n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),n.createObjectLiteralExpression()),I=lo(this.ids.clientClass,ao([ft(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),so)]),[co(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),Vt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,T,M]),!0))]);this.program.push(m,y,f,S,I);let x=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),je=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(w.json))]),void 0,this.ids.undefinedValue)),G=n.createPropertyAssignment(this.ids.bodyProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),ee=n.createVariableStatement(void 0,X(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier("fetch"),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,Ze)]),n.createObjectLiteralExpression([x,je,G])])))),le=n.createVariableStatement(void 0,X(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),Le=n.createVariableStatement(void 0,X(this.ids.searchParamsConst,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createStringLiteral(""),void 0,n.createTemplateExpression(n.createTemplateHead("?"),[n.createTemplateSpan(n.createNewExpression(n.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),Ze)])))),[_e,Tt]=["json","text"].map(A=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,A),void 0,void 0))),Ye=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(Dt,[n.createTemplateSpan(this.ids.methodParameter,Ft),n.createTemplateSpan(this.ids.pathParameter,Ze)]),j.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([_e])),D=n.createVariableStatement(W,X(this.ids.exampleImplementationConst,Vt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([le,Le,ee,Ye,Tt]),!0),n.createTypeReferenceNode(this.ids.implementationType))),te=n.createExpressionStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[n.createStringLiteral("get"),n.createStringLiteral("/v1/user/retrieve"),n.createObjectLiteralExpression([n.createPropertyAssignment("id",n.createStringLiteral("10"))])])),Ne=n.createVariableStatement(void 0,X(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(D,Ne,te)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Yt(r,t)).join(`
20
+ `)};var vr=e=>{e.startupLogo!==!1&&console.log(jr());let t=e.errorHandler||Te,r=Ar(e.logger)?e.logger:new Re(e.logger);r.debug("Running","v20.1.0 (CJS)");let o=Er({rootLogger:r,config:e}),i=zr({rootLogger:r,errorHandler:t}),s=Cr({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:i,parserFailureHandler:s,loggingMiddleware:o}},kr=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:i}=vr(e);return Nt({app:e.app.use(i),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},Mr=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,parserFailureHandler:i,loggingMiddleware:s}=vr(e),a=(0,pt.default)().disable("x-powered-by").use(s);if(e.server.compression){let m=await Ce("compression");a.use(m(typeof e.server.compression=="object"?e.server.compression:void 0))}let p={json:[e.server.jsonParser||pt.default.json()],raw:[e.server.rawParser||pt.default.raw(),Zr],upload:e.server.upload?await wr({config:e,rootLogger:r}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:a,logger:r}),Nt({app:a,routing:t,rootLogger:r,config:e,parsers:p}),a.use(i,o);let d=(m,y)=>m.listen(y,()=>{r.info("Listening",y)}),l={httpServer:d(Lr.default.createServer(a),e.server.listen),httpsServer:e.https?d(Nr.default.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...l,logger:r}};var ro=R(require("assert/strict"),1),oo=require("openapi3-ts/oas31"),no=require("ramda");var J=R(require("assert/strict"),1),$=require("openapi3-ts/oas31"),c=require("ramda"),b=require("zod");var ze=require("zod");var ct=e=>!isNaN(e.getTime());var $e=Symbol("DateIn"),Ur=()=>ze.z.union([ze.z.string().date(),ze.z.string().datetime(),ze.z.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(ze.z.date().refine(ct)).brand($e);var Hr=require("zod");var Ve=Symbol("DateOut"),Dr=()=>Hr.z.date().refine(ct).transform(e=>e.toISOString()).brand(Ve);var pe=(e,{onEach:t,rules:r,onMissing:o,ctx:i={}})=>{let s=r[e._def[g]?.brand]||r[e._def.typeName],p=s?s(e,{...i,next:l=>pe(l,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),d=t&&t(e,{prev:p,...i});return d?{...p,...d}:p};var Fr=50,Br="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Fo={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},qr=/:([A-Za-z0-9_]+)/g,Ko=e=>e.match(qr)?.map(t=>t.slice(1))||[],$r=e=>e.replace(qr,t=>`{${t.slice(1)}}`),Bo=({_def:e},{next:t})=>({...t(e.innerType),default:e[g]?.defaultLabel||e.defaultValue()}),qo=({_def:{innerType:e}},{next:t})=>t(e),$o=()=>({format:"any"}),Vo=({},e)=>((0,J.default)(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),Go=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"}},_o=({options:e},{next:t})=>({oneOf:e.map(t)}),Yo=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),Qo=e=>{let[t,r]=e.filter($.isSchemaObject).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));(0,J.default)(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,c.mergeDeepWith)((i,s)=>Array.isArray(i)&&Array.isArray(s)?(0,c.concat)(i,s):i===s?s:J.default.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,c.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=oe(t.examples||[],r.examples||[],([i,s])=>(0,c.mergeDeepRight)(i,s))),o},Jo=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Qo(o)}catch{}return{allOf:o}},Wo=(e,{next:t})=>t(e.unwrap()),Xo=(e,{next:t})=>t(e.unwrap()),en=(e,{next:t})=>{let r=t(e.unwrap());return(0,$.isSchemaObject)(r)&&(r.type=Gr(r)),r},Vr=e=>{let t=(0,c.toLower)((0,c.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Kr=e=>({type:Vr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),tn=({value:e})=>({type:Vr(e),const:e}),rn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&He(p)?p instanceof b.z.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=dt(e,r)),s.length&&(a.required=s),a},on=()=>({type:"null"}),nn=({},e)=>((0,J.default)(!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:Br}}),sn=({},e)=>((0,J.default)(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:Br}}),an=({},e)=>J.default.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})),pn=()=>({type:"boolean"}),cn=()=>({type:"integer",format:"bigint"}),dn=e=>e.every(t=>t instanceof b.z.ZodLiteral),ln=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.z.ZodEnum||e instanceof b.z.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=dt(b.z.object((0,c.fromPairs)((0,c.xprod)(o,[t]))),r),i.required=o),i}if(e instanceof b.z.ZodLiteral)return{type:"object",properties:dt(b.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.z.ZodUnion&&dn(e.options)){let o=(0,c.map)(s=>`${s.value}`,e.options),i=(0,c.fromPairs)((0,c.xprod)(o,[t]));return{type:"object",properties:dt(b.z.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},mn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let i={type:"array",items:o(r)};return e&&(i.minItems=e.value),t&&(i.maxItems=t.value),i},un=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),fn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:l,isDatetime:m,_def:{checks:y}})=>{let f=y.find(I=>I.kind==="regex"),S=y.find(I=>I.kind==="datetime"),L=f?f.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,T={type:"string"},M={"date-time":m,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:d,emoji:l};for(let I in M)if(M[I]){T.format=I;break}return r!==null&&(T.minLength=r),o!==null&&(T.maxLength=o),L&&(T.pattern=L.source),T},yn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let i=o.find(y=>y.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=i?i.inclusive:!0,p=o.find(y=>y.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,l=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=s:m.exclusiveMinimum=s,l?m.maximum=d:m.exclusiveMaximum=d,m},dt=({shape:e},t)=>(0,c.map)(t,e),gn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Fo?.[t]},Gr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},hn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&(0,$.isSchemaObject)(o)){let s=Xe(e,gn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(b.z.any())}if(!t&&i.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},xn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),bn=(e,{next:t})=>t(e.unwrap()),Tn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},Sn=(e,{next:t})=>t(e.unwrap().shape.raw),_r=e=>e.length?(0,c.fromPairs)((0,c.zip)((0,c.range)(1,e.length+1).map(t=>`example${t}`),(0,c.map)((0,c.objOf)("value"),e))):void 0,Yr=(e,t,r=[])=>(0,c.pipe)(K,(0,c.map)((0,c.when)((0,c.both)(B,(0,c.complement)(Array.isArray)),(0,c.omit)(r))),_r)({schema:e,variant:t?"parsed":"original",validate:!0}),On=(e,t)=>(0,c.pipe)(K,(0,c.filter)((0,c.has)(t)),(0,c.pluck)(t),_r)({schema:e,variant:"original",validate:!0}),ce=e=>e instanceof b.z.ZodObject?e:e instanceof b.z.ZodBranded?ce(e.unwrap()):e instanceof b.z.ZodUnion||e instanceof b.z.ZodDiscriminatedUnion?e.options.map(t=>ce(t)).reduce((t,r)=>t.merge(r.partial()),b.z.object({})):e instanceof b.z.ZodEffects?ce(e._def.schema):e instanceof b.z.ZodPipeline?ce(e._def.in):ce(e._def.left).merge(ce(e._def.right)),Qr=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,description:l=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:m}=ce(r),y=Ko(e),f=o.includes("query"),S=o.includes("params"),L=o.includes("headers"),T=x=>S&&y.includes(x),M=x=>L&&Rt(x);return Object.keys(m).map(x=>({name:x,location:T(x)?"path":M(x)?"header":f?"query":void 0})).filter(x=>x.location!==void 0).map(({name:x,location:je})=>{let G=pe(m[x],{rules:{...d,...kt},onEach:Mt,onMissing:Ut,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),ee=p==="components"?a(v(l,x),G):G;return{name:x,in:je,required:!m[x].isOptional(),description:G.description||l,schema:ee,examples:On(r,x)}})},kt={ZodString:fn,ZodNumber:yn,ZodBigInt:cn,ZodBoolean:pn,ZodNull:on,ZodArray:mn,ZodTuple:un,ZodRecord:ln,ZodObject:rn,ZodLiteral:tn,ZodIntersection:Jo,ZodUnion:_o,ZodAny:$o,ZodDefault:Bo,ZodEnum:Kr,ZodNativeEnum:Kr,ZodEffects:hn,ZodOptional:Wo,ZodNullable:en,ZodDiscriminatedUnion:Yo,ZodBranded:bn,ZodDate:an,ZodCatch:qo,ZodPipeline:xn,ZodLazy:Tn,ZodReadonly:Xo,[Q]:Go,[Fe]:Vo,[Ve]:sn,[$e]:nn,[ie]:Sn},Mt=(e,{isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,i=e instanceof b.z.ZodLazy,s=r.type!==void 0,a=t&&He(e),p=!i&&s&&!a&&e.isNullable(),d=i?[]:K({schema:e,variant:t?"parsed":"original",validate:!0}),l={};return o&&(l.description=o),p&&(l.type=Gr(r)),d.length&&(l.examples=d.slice()),l},Ut=(e,t)=>J.default.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),vt=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,c.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,c.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>vt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>vt(o,t))),r},Jr=e=>(0,$.isReferenceObject)(e)?e:(0,c.omit)(["examples"],e),Wr=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:d,hasMultipleStatusCodes:l,statusCode:m,brandHandling:y,description:f=`${e.toUpperCase()} ${t} ${Pt(i)} response ${l?m:""}`.trim()})=>{let S=Jr(pe(r,{rules:{...y,...kt},onEach:Mt,onMissing:Ut,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),L={schema:d==="components"?p(v(f),S):S,examples:Yr(r,!0)};return{description:f,content:(0,c.fromPairs)((0,c.xprod)(o,[L]))}},Rn=()=>({type:"http",scheme:"basic"}),An=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Pn=({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},In=({name:e})=>({type:"apiKey",in:"header",name:e}),Cn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),zn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),wn=({flows:e={}})=>({type:"oauth2",flows:(0,c.map)(t=>({...t,scopes:t.scopes||{}}),(0,c.reject)(c.isNil,e))}),Xr=(e,t)=>{let r={basic:Rn,bearer:An,input:Pn,header:In,cookie:Cn,openid:zn,oauth2:wn};return nt(e,o=>r[o.type](o,t))},lt=e=>"or"in e?e.or.map(t=>"and"in t?(0,c.mergeAll)((0,c.map)(({name:r,scopes:o})=>(0,c.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?lt(zt(e)):lt({or:[e]}),eo=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,paramNames:l,description:m=`${e.toUpperCase()} ${t} Request body`})=>{let y=Jr(vt(pe(r,{rules:{...d,...kt},onEach:Mt,onMissing:Ut,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),l)),f={schema:p==="components"?a(v(m),y):y,examples:Yr(r,!1,l)};return{description:m,content:(0,c.fromPairs)((0,c.xprod)(o,[f]))}},to=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}),Ht=e=>e.length<=Fr?e:e.slice(0,Fr-1)+"\u2026";var mt=class extends oo.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let i=o||v(r,t),s=this.lastOperationIdSuffixes.get(i);return s===void 0?(this.lastOperationIdSuffixes.set(i,1),i):(o&&ro.default.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(i,s),`${i}${s}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let i in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[i]))return i;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:i,serverUrl:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:l="inline",serializer:m=We}){super(),this.addInfo({title:o,version:i});for(let f of typeof s=="string"?[s]:s)this.addServer({url:f});ae({routing:t,onEndpoint:(f,S,L)=>{let T=L,M={path:S,method:T,endpoint:f,composition:l,serializer:m,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[I,x]=["short","long"].map(f.getDescription.bind(f)),je=I?Ht(I):d&&x?Ht(x):void 0,G=f.getTags(),ee=r.inputSources?.[T]||St[T],le=this.ensureUniqOperationId(S,T,f.getOperationId(T)),Le=Qr({...M,inputSources:ee,schema:f.getSchema("input"),description:a?.requestParameter?.call(null,{method:T,path:S,operationId:le})}),_e={};for(let D of["positive","negative"]){let te=f.getResponses(D);for(let{mimeTypes:Ne,schema:A,statusCodes:P}of te)for(let C of P)_e[C]=Wr({...M,variant:D,schema:A,mimeTypes:Ne,statusCode:C,hasMultipleStatusCodes:te.length>1||P.length>1,description:a?.[`${D}Response`]?.call(null,{method:T,path:S,operationId:le,statusCode:C})})}let Tt=ee.includes("body")?eo({...M,paramNames:(0,no.pluck)("name",Le),schema:f.getSchema("input"),mimeTypes:f.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:T,path:S,operationId:le})}):void 0,Ye=lt(nt(Xr(f.getSecurity(),ee),D=>{let te=this.ensureUniqSecuritySchemaName(D),Ne=["oauth2","openIdConnect"].includes(D.type)?f.getScopes().slice():[];return this.addSecurityScheme(te,D),{name:te,scopes:Ne}}));this.addPath($r(S),{[T]:{operationId:le,summary:je,description:x,tags:G.length>0?G:void 0,parameters:Le.length>0?Le:void 0,requestBody:Tt,security:Ye.length>0?Ye:void 0,responses:_e}})}}),this.rootDoc.tags=r.tags?to(r.tags):[]}};var ut=require("node-mocks-http"),Zn=e=>(0,ut.createRequest)({...e,headers:{"content-type":w.json,...e?.headers}}),En=e=>(0,ut.createResponse)(e),jn=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,i){return o==="_getLogs"?()=>t:o in Oe?(...s)=>t[o].push(s):Reflect.get(r,o,i)}})},io=async({endpoint:e,requestProps:t,responseOptions:r,configProps:o,loggerProps:i})=>{let s=Zn(t),a=En({req:s,...r}),p=jn(i),d={cors:!1,logger:p,...o};return await e.execute({request:s,response:a,config:d,logger:p}),{requestMock:s,responseMock:a,loggerMock:p}};var j=R(require("typescript"),1);var H=R(require("typescript"),1),we=require("ramda"),n=H.default.factory,W=[n.createModifier(H.default.SyntaxKind.ExportKeyword)],Ln=[n.createModifier(H.default.SyntaxKind.AsyncKeyword)],Nn=[n.createModifier(H.default.SyntaxKind.PublicKeyword),n.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],so=[n.createModifier(H.default.SyntaxKind.ProtectedKeyword),n.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],Dt=n.createTemplateHead(""),Ze=n.createTemplateTail(""),Ft=n.createTemplateMiddle(" "),Kt=e=>n.createTemplateLiteralType(Dt,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?Ze:Ft))),Bt=Kt(["M","P"]),ft=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),yt=(e,t)=>(0,we.chain)(([r,o])=>[ft(n.createIdentifier(r),o,t)],(0,we.toPairs)(e)),qt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),ao=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),po=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),X=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],H.default.NodeFlags.Const),$t=(e,t)=>n.createTypeAliasDeclaration(W,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),gt=(e,t)=>n.createTypeAliasDeclaration(W,e,void 0,t),co=(e,t,r)=>n.createPropertyDeclaration(Nn,e,void 0,t,r),lo=(e,t,r)=>n.createClassDeclaration(W,e,void 0,void 0,[t,...r]),mo=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),uo=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(H.default.SyntaxKind.AnyKeyword)]),fo=(e,t,r)=>n.createInterfaceDeclaration(W,e,void 0,t,r),yo=e=>(0,we.chain)(([t,r])=>[n.createTypeParameterDeclaration([],t,n.createTypeReferenceNode(r))],(0,we.toPairs)(e)),Vt=(e,t,r)=>n.createArrowFunction(r?Ln:void 0,void 0,e.map(o=>ft(o)),void 0,void 0,t),Gt=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[n.createArrowFunction(void 0,void 0,yt({acc:void 0,key:void 0}),void 0,void 0,t),r]),go=(...e)=>`"${e.join(" ")}"`;var ho=["get","post","put","delete","patch"];var h=R(require("typescript"),1),xt=require("zod");var V=R(require("typescript"),1),{factory:ht}=V.default,_t=(e,t)=>{V.default.addSyntheticLeadingComment(e,V.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ee=(e,t,r)=>{let o=ht.createTypeAliasDeclaration(void 0,ht.createIdentifier(t),void 0,e);return r&&_t(o,r),o},Yt=(e,t)=>{let r=V.default.createSourceFile("print.ts","",V.default.ScriptTarget.Latest,!1,V.default.ScriptKind.TS);return V.default.createPrinter(t).printNode(V.default.EmitHint.Unspecified,e,r)},vn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,xo=e=>vn.test(e)?ht.createIdentifier(e):ht.createStringLiteral(e);var{factory:u}=h.default,kn={[h.default.SyntaxKind.AnyKeyword]:"",[h.default.SyntaxKind.BigIntKeyword]:BigInt(0),[h.default.SyntaxKind.BooleanKeyword]:!1,[h.default.SyntaxKind.NumberKeyword]:0,[h.default.SyntaxKind.ObjectKeyword]:{},[h.default.SyntaxKind.StringKeyword]:"",[h.default.SyntaxKind.UndefinedKeyword]:void 0},Mn=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Un=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&He(a)?a instanceof xt.z.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,xo(s),p&&o?u.createToken(h.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&_t(d,a.description),d});return u.createTypeLiteralNode(i)},Hn=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),Dn=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),bo=({options:e},{next:t})=>u.createUnionTypeNode(e.map(t)),Fn=e=>kn?.[e.kind],Kn=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=Xe(e,Fn(o)),s={number:h.default.SyntaxKind.NumberKeyword,bigint:h.default.SyntaxKind.BigIntKeyword,boolean:h.default.SyntaxKind.BooleanKeyword,string:h.default.SyntaxKind.StringKeyword,undefined:h.default.SyntaxKind.UndefinedKeyword,object:h.default.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(i&&s[i]||h.default.SyntaxKind.AnyKeyword)}return o},Bn=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),qn=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(h.default.SyntaxKind.UndefinedKeyword)]):o},$n=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),Vn=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),Gn=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),_n=({_def:e},{next:t})=>u.createIntersectionTypeNode([e.left,e.right].map(t)),Yn=({_def:e},{next:t})=>t(e.innerType),de=e=>()=>u.createKeywordTypeNode(e),Qn=(e,{next:t})=>t(e.unwrap()),Jn=(e,{next:t})=>t(e.unwrap()),Wn=({_def:e},{next:t})=>t(e.innerType),Xn=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ei=()=>u.createLiteralTypeNode(u.createNull()),ti=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:i})=>{let s=`Type${i(e)}`;return t(s)||(r(s,u.createLiteralTypeNode(u.createNull())),r(s,o(e)))},ri=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(h.default.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),i=u.createUnionTypeNode([r,o]);return t instanceof xt.z.ZodString?r:t instanceof xt.z.ZodUnion?i:o},oi=(e,{next:t})=>t(e.unwrap().shape.raw),ni={ZodString:de(h.default.SyntaxKind.StringKeyword),ZodNumber:de(h.default.SyntaxKind.NumberKeyword),ZodBigInt:de(h.default.SyntaxKind.BigIntKeyword),ZodBoolean:de(h.default.SyntaxKind.BooleanKeyword),ZodAny:de(h.default.SyntaxKind.AnyKeyword),[$e]:de(h.default.SyntaxKind.StringKeyword),[Ve]:de(h.default.SyntaxKind.StringKeyword),ZodNull:ei,ZodArray:Hn,ZodTuple:Vn,ZodRecord:Gn,ZodObject:Un,ZodLiteral:Mn,ZodIntersection:_n,ZodUnion:bo,ZodDefault:Yn,ZodEnum:Dn,ZodNativeEnum:Bn,ZodEffects:Kn,ZodOptional:qn,ZodNullable:$n,ZodDiscriminatedUnion:bo,ZodBranded:Qn,ZodCatch:Wn,ZodPipeline:Xn,ZodLazy:ti,ZodReadonly:Jn,[Q]:ri,[ie]:oi},Ge=(e,{brandHandling:t,ctx:r})=>pe(e,{rules:{...t,...ni},onMissing:()=>u.createKeywordTypeNode(h.default.SyntaxKind.AnyKeyword),ctx:r});var bt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:n.createIdentifier("Path"),methodType:n.createIdentifier("Method"),methodPathType:n.createIdentifier("MethodPath"),inputInterface:n.createIdentifier("Input"),posResponseInterface:n.createIdentifier("PositiveResponse"),negResponseInterface:n.createIdentifier("NegativeResponse"),responseInterface:n.createIdentifier("Response"),jsonEndpointsConst:n.createIdentifier("jsonEndpoints"),endpointTagsConst:n.createIdentifier("endpointTags"),providerType:n.createIdentifier("Provider"),implementationType:n.createIdentifier("Implementation"),clientClass:n.createIdentifier("ExpressZodAPIClient"),keyParameter:n.createIdentifier("key"),pathParameter:n.createIdentifier("path"),paramsArgument:n.createIdentifier("params"),methodParameter:n.createIdentifier("method"),accumulator:n.createIdentifier("acc"),provideMethod:n.createIdentifier("provide"),implementationArgument:n.createIdentifier("implementation"),headersProperty:n.createIdentifier("headers"),hasBodyConst:n.createIdentifier("hasBody"),undefinedValue:n.createIdentifier("undefined"),bodyProperty:n.createIdentifier("body"),responseConst:n.createIdentifier("response"),searchParamsConst:n.createIdentifier("searchParams"),exampleImplementationConst:n.createIdentifier("exampleImplementation"),clientConst:n.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?n.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,Ee(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=We,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){ae({routing:t,onEndpoint:(A,P,C)=>{let me={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},ve=v(C,P,"input"),ke=Ge(A.getSchema("input"),{brandHandling:r,ctx:{...me,isResponse:!1}}),N=s?v(C,P,"positive.response"):void 0,Qt=A.getSchema("positive"),Jt=s?Ge(Qt,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,Me=s?v(C,P,"negative.response"):void 0,Wt=A.getSchema("negative"),Xt=s?Ge(Wt,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,er=v(C,P,"response"),So=N&&Me?n.createUnionTypeNode([n.createTypeReferenceNode(N),n.createTypeReferenceNode(Me)]):Ge(Qt.or(Wt),{brandHandling:r,ctx:{...me,isResponse:!0}});this.program.push(Ee(ke,ve)),Jt&&N&&this.program.push(Ee(Jt,N)),Xt&&Me&&this.program.push(Ee(Xt,Me)),this.program.push(Ee(So,er)),C!=="options"&&(this.paths.push(P),this.registry.set({method:C,path:P},{input:ve,positive:N,negative:Me,response:er,isJson:A.getMimeTypes("positive").includes(w.json),tags:A.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push($t(this.ids.pathType,this.paths)),this.program.push($t(this.ids.methodType,ho)),this.program.push(gt(this.ids.methodPathType,Kt([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(j.default.SyntaxKind.ExtendsKeyword,[qt(this.ids.methodPathType,j.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&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 d=[],l=[];for(let[{method:A,path:P},{isJson:C,tags:me,...ve}]of this.registry){let ke=go(A,P);for(let N of this.interfaces)N.kind in ve&&N.props.push(po(ke,ve[N.kind]));o!=="types"&&(C&&d.push(n.createPropertyAssignment(ke,n.createTrue())),l.push(n.createPropertyAssignment(ke,n.createArrayLiteralExpression(me.map(N=>n.createStringLiteral(N))))))}for(let{id:A,props:P}of this.interfaces)this.program.push(fo(A,p,P));if(o==="types")return;let m=n.createVariableStatement(W,X(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(d))),y=n.createVariableStatement(W,X(this.ids.endpointTagsConst,n.createObjectLiteralExpression(l))),f=gt(this.ids.providerType,n.createFunctionTypeNode(yo({M:this.ids.methodType,P:this.ids.pathType}),yt({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),Bt)}),mo(this.ids.responseInterface,Bt))),S=gt(this.ids.implementationType,n.createFunctionTypeNode(void 0,yt({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(j.default.SyntaxKind.StringKeyword),params:qt(j.default.SyntaxKind.StringKeyword,j.default.SyntaxKind.AnyKeyword)}),uo())),L=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,Ze)]),T=Gt(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[L,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),M=Gt(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[L]),j.default.SyntaxKind.GreaterThanEqualsToken,n.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,n.createObjectLiteralExpression([n.createSpreadAssignment(this.ids.accumulator),n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),n.createObjectLiteralExpression()),I=lo(this.ids.clientClass,ao([ft(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),so)]),[co(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),Vt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,T,M]),!0))]);this.program.push(m,y,f,S,I);let x=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),je=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(w.json))]),void 0,this.ids.undefinedValue)),G=n.createPropertyAssignment(this.ids.bodyProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),ee=n.createVariableStatement(void 0,X(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier("fetch"),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,Ze)]),n.createObjectLiteralExpression([x,je,G])])))),le=n.createVariableStatement(void 0,X(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),Le=n.createVariableStatement(void 0,X(this.ids.searchParamsConst,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createStringLiteral(""),void 0,n.createTemplateExpression(n.createTemplateHead("?"),[n.createTemplateSpan(n.createNewExpression(n.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),Ze)])))),[_e,Tt]=["json","text"].map(A=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,A),void 0,void 0))),Ye=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(Dt,[n.createTemplateSpan(this.ids.methodParameter,Ft),n.createTemplateSpan(this.ids.pathParameter,Ze)]),j.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([_e])),D=n.createVariableStatement(W,X(this.ids.exampleImplementationConst,Vt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([le,Le,ee,Ye,Tt]),!0),n.createTypeReferenceNode(this.ids.implementationType))),te=n.createExpressionStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[n.createStringLiteral("get"),n.createStringLiteral("/v1/user/retrieve"),n.createObjectLiteralExpression([n.createPropertyAssignment("id",n.createStringLiteral("10"))])])),Ne=n.createVariableStatement(void 0,X(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(D,Ne,te)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Yt(r,t)).join(`
21
21
  `):void 0}print(t){let r=this.printUsage(t),o=r&&j.default.addSyntheticLeadingComment(j.default.addSyntheticLeadingComment(n.createEmptyStatement(),j.default.SyntaxKind.SingleLineCommentTrivia," Usage example:"),j.default.SyntaxKind.MultiLineCommentTrivia,`
22
22
  ${r}`);return this.program.concat(o||[]).map((i,s)=>Yt(i,s<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
23
23
 
package/dist/index.js CHANGED
@@ -17,7 +17,7 @@ ${o}888${t}
17
17
  ${r}
18
18
  `.split(`
19
19
  `).map((c,d)=>a[d]?a[d](c):c).join(`
20
- `)};var Tr=e=>{e.startupLogo!==!1&&console.log(br());let t=e.errorHandler||ze,r=dr(e.logger)?e.logger:new Ze(e.logger);r.debug("Running","v20.1.0-beta.2 (ESM)");let o=hr({rootLogger:r,config:e}),i=fr({rootLogger:r,errorHandler:t}),s=ur({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:i,parserFailureHandler:s,loggingMiddleware:o}},_o=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:i}=Tr(e);return Tt({app:e.app.use(i),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},Yo=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,parserFailureHandler:i,loggingMiddleware:s}=Tr(e),a=St().disable("x-powered-by").use(s);if(e.server.compression){let l=await me("compression");a.use(l(typeof e.server.compression=="object"?e.server.compression:void 0))}let p={json:[e.server.jsonParser||St.json()],raw:[e.server.rawParser||St.raw(),gr],upload:e.server.upload?await yr({config:e,rootLogger:r}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:a,logger:r}),Tt({app:a,routing:t,rootLogger:r,config:e,parsers:p}),a.use(i,o);let c=(l,f)=>l.listen(f,()=>{r.info("Listening",f)}),d={httpServer:c(Vo.createServer(a),e.server.listen),httpsServer:e.https?c(Go.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...d,logger:r}};import oi from"assert/strict";import{OpenApiBuilder as ni}from"openapi3-ts/oas31";import{pluck as ii}from"ramda";import te from"assert/strict";import{isReferenceObject as Rt,isSchemaObject as et}from"openapi3-ts/oas31";import{both as Jo,complement as Wo,concat as Xo,type as en,filter as tn,fromPairs as ke,has as rn,isNil as on,map as ue,mergeAll as nn,mergeDeepRight as sn,mergeDeepWith as an,objOf as Pr,omit as tt,pipe as Ir,pluck as pn,range as cn,reject as dn,toLower as ln,union as mn,when as un,xprod as rt,zip as fn}from"ramda";import{z as b}from"zod";import{z as Le}from"zod";var We=e=>!isNaN(e.getTime());var Ne=Symbol("DateIn"),Sr=()=>Le.union([Le.string().date(),Le.string().datetime(),Le.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Le.date().refine(We)).brand(Ne);import{z as Qo}from"zod";var ve=Symbol("DateOut"),Or=()=>Qo.date().refine(We).transform(e=>e.toISOString()).brand(ve);var X=(e,{onEach:t,rules:r,onMissing:o,ctx:i={}})=>{let s=r[e._def[y]?.brand]||r[e._def.typeName],p=s?s(e,{...i,next:d=>X(d,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),c=t&&t(e,{prev:p,...i});return c?{...p,...c}:p};var Rr=50,Cr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",yn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},zr=/:([A-Za-z0-9_]+)/g,gn=e=>e.match(zr)?.map(t=>t.slice(1))||[],wr=e=>e.replace(zr,t=>`{${t.slice(1)}}`),hn=({_def:e},{next:t})=>({...t(e.innerType),default:e[y]?.defaultLabel||e.defaultValue()}),xn=({_def:{innerType:e}},{next:t})=>t(e),bn=()=>({format:"any"}),Tn=({},e)=>(te(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),Sn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},On=({options:e},{next:t})=>({oneOf:e.map(t)}),Rn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),An=e=>{let[t,r]=e.filter(et).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));te(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=an((i,s)=>Array.isArray(i)&&Array.isArray(s)?Xo(i,s):i===s?s:te.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=mn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=Y(t.examples||[],r.examples||[],([i,s])=>sn(i,s))),o},Pn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return An(o)}catch{}return{allOf:o}},In=(e,{next:t})=>t(e.unwrap()),Cn=(e,{next:t})=>t(e.unwrap()),zn=(e,{next:t})=>{let r=t(e.unwrap());return et(r)&&(r.type=Er(r)),r},Zr=e=>{let t=ln(en(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Ar=e=>({type:Zr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),wn=({value:e})=>({type:Zr(e),const:e}),Zn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&Re(p)?p instanceof b.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=Xe(e,r)),s.length&&(a.required=s),a},En=()=>({type:"null"}),jn=({},e)=>(te(!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:Cr}}),Ln=({},e)=>(te(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:Cr}}),Nn=({},e)=>te.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})),vn=()=>({type:"boolean"}),kn=()=>({type:"integer",format:"bigint"}),Mn=e=>e.every(t=>t instanceof b.ZodLiteral),Un=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.ZodEnum||e instanceof b.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=Xe(b.object(ke(rt(o,[t]))),r),i.required=o),i}if(e instanceof b.ZodLiteral)return{type:"object",properties:Xe(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&Mn(e.options)){let o=ue(s=>`${s.value}`,e.options),i=ke(rt(o,[t]));return{type:"object",properties:Xe(b.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},Hn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let i={type:"array",items:o(r)};return e&&(i.minItems=e.value),t&&(i.maxItems=t.value),i},Dn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Fn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:c,isEmoji:d,isDatetime:l,_def:{checks:f}})=>{let u=f.find(R=>R.kind==="regex"),T=f.find(R=>R.kind==="datetime"),I=u?u.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,x={type:"string"},E={"date-time":l,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:c,emoji:d};for(let R in E)if(E[R]){x.format=R;break}return r!==null&&(x.minLength=r),o!==null&&(x.maxLength=o),I&&(x.pattern=I.source),x},Kn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let i=o.find(f=>f.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=i?i.inclusive:!0,p=o.find(f=>f.kind==="max"),c=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,d=p?p.inclusive:!0,l={type:e?"integer":"number",format:e?"int64":"double"};return a?l.minimum=s:l.exclusiveMinimum=s,d?l.maximum=c:l.exclusiveMaximum=c,l},Xe=({shape:e},t)=>ue(t,e),Bn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return yn?.[t]},Er=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},qn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&et(o)){let s=Be(e,Bn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(b.any())}if(!t&&i.type==="preprocess"&&et(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},$n=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Vn=(e,{next:t})=>t(e.unwrap()),Gn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},_n=(e,{next:t})=>t(e.unwrap().shape.raw),jr=e=>e.length?ke(fn(cn(1,e.length+1).map(t=>`example${t}`),ue(Pr("value"),e))):void 0,Lr=(e,t,r=[])=>Ir(D,ue(un(Jo(v,Wo(Array.isArray)),tt(r))),jr)({schema:e,variant:t?"parsed":"original",validate:!0}),Yn=(e,t)=>Ir(D,tn(rn(t)),pn(t),jr)({schema:e,variant:"original",validate:!0}),ee=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?ee(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>ee(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?ee(e._def.schema):e instanceof b.ZodPipeline?ee(e._def.in):ee(e._def.left).merge(ee(e._def.right)),Nr=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,description:d=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:l}=ee(r),f=gn(e),u=o.includes("query"),T=o.includes("params"),I=o.includes("headers"),x=h=>T&&f.includes(h),E=h=>I&&lt(h);return Object.keys(l).map(h=>({name:h,location:x(h)?"path":E(h)?"header":u?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:ge})=>{let M=X(l[h],{rules:{...c,...At},onEach:Pt,onMissing:It,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),V=p==="components"?a(w(d,h),M):M;return{name:h,in:ge,required:!l[h].isOptional(),description:M.description||d,schema:V,examples:Yn(r,h)}})},At={ZodString:Fn,ZodNumber:Kn,ZodBigInt:kn,ZodBoolean:vn,ZodNull:En,ZodArray:Hn,ZodTuple:Dn,ZodRecord:Un,ZodObject:Zn,ZodLiteral:wn,ZodIntersection:Pn,ZodUnion:On,ZodAny:bn,ZodDefault:hn,ZodEnum:Ar,ZodNativeEnum:Ar,ZodEffects:qn,ZodOptional:In,ZodNullable:zn,ZodDiscriminatedUnion:Rn,ZodBranded:Vn,ZodDate:Nn,ZodCatch:xn,ZodPipeline:$n,ZodLazy:Gn,ZodReadonly:Cn,[F]:Sn,[Ae]:Tn,[ve]:Ln,[Ne]:jn,[Q]:_n},Pt=(e,{isResponse:t,prev:r})=>{if(Rt(r))return{};let{description:o}=e,i=e instanceof b.ZodLazy,s=r.type!==void 0,a=t&&Re(e),p=!i&&s&&!a&&e.isNullable(),c=i?[]:D({schema:e,variant:t?"parsed":"original",validate:!0}),d={};return o&&(d.description=o),p&&(d.type=Er(r)),c.length&&(d.examples=c.slice()),d},It=(e,t)=>te.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Ot=(e,t)=>{if(Rt(e))return e;let r={...e};return r.properties&&(r.properties=tt(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>tt(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Ot(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Ot(o,t))),r},vr=e=>Rt(e)?e:tt(["examples"],e),kr=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:c,hasMultipleStatusCodes:d,statusCode:l,brandHandling:f,description:u=`${e.toUpperCase()} ${t} ${ut(i)} response ${d?l:""}`.trim()})=>{let T=vr(X(r,{rules:{...f,...At},onEach:Pt,onMissing:It,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),I={schema:c==="components"?p(w(u),T):T,examples:Lr(r,!0)};return{description:u,content:ke(rt(o,[I]))}},Qn=()=>({type:"http",scheme:"basic"}),Jn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Wn=({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},Xn=({name:e})=>({type:"apiKey",in:"header",name:e}),ei=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ti=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),ri=({flows:e={}})=>({type:"oauth2",flows:ue(t=>({...t,scopes:t.scopes||{}}),dn(on,e))}),Mr=(e,t)=>{let r={basic:Qn,bearer:Jn,input:Wn,header:Xn,cookie:ei,openid:ti,oauth2:ri};return _e(e,o=>r[o.type](o,t))},ot=e=>"or"in e?e.or.map(t=>"and"in t?nn(ue(({name:r,scopes:o})=>Pr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?ot(gt(e)):ot({or:[e]}),Ur=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,paramNames:d,description:l=`${e.toUpperCase()} ${t} Request body`})=>{let f=vr(Ot(X(r,{rules:{...c,...At},onEach:Pt,onMissing:It,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),d)),u={schema:p==="components"?a(w(l),f):f,examples:Lr(r,!1,d)};return{description:l,content:ke(rt(o,[u]))}},Hr=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}),Ct=e=>e.length<=Rr?e:e.slice(0,Rr-1)+"\u2026";var zt=class extends ni{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let i=o||w(r,t),s=this.lastOperationIdSuffixes.get(i);return s===void 0?(this.lastOperationIdSuffixes.set(i,1),i):(o&&oi.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(i,s),`${i}${s}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let i in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[i]))return i;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:i,serverUrl:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:c=!0,composition:d="inline",serializer:l=Ke}){super(),this.addInfo({title:o,version:i});for(let u of typeof s=="string"?[s]:s)this.addServer({url:u});W({routing:t,onEndpoint:(u,T,I)=>{let x=I,E={path:T,method:x,endpoint:u,composition:d,serializer:l,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[R,h]=["short","long"].map(u.getDescription.bind(u)),ge=R?Ct(R):c&&h?Ct(h):void 0,M=u.getTags(),V=r.inputSources?.[x]||ct[x],oe=this.ensureUniqOperationId(T,x,u.getOperationId(x)),he=Nr({...E,inputSources:V,schema:u.getSchema("input"),description:a?.requestParameter?.call(null,{method:x,path:T,operationId:oe})}),Ue={};for(let L of["positive","negative"]){let G=u.getResponses(L);for(let{mimeTypes:xe,schema:S,statusCodes:O}of G)for(let A of O)Ue[A]=kr({...E,variant:L,schema:S,mimeTypes:xe,statusCode:A,hasMultipleStatusCodes:G.length>1||O.length>1,description:a?.[`${L}Response`]?.call(null,{method:x,path:T,operationId:oe,statusCode:A})})}let pt=V.includes("body")?Ur({...E,paramNames:ii("name",he),schema:u.getSchema("input"),mimeTypes:u.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:x,path:T,operationId:oe})}):void 0,He=ot(_e(Mr(u.getSecurity(),V),L=>{let G=this.ensureUniqSecuritySchemaName(L),xe=["oauth2","openIdConnect"].includes(L.type)?u.getScopes().slice():[];return this.addSecurityScheme(G,L),{name:G,scopes:xe}}));this.addPath(wr(T),{[x]:{operationId:oe,summary:ge,description:h,tags:M.length>0?M:void 0,parameters:he.length>0?he:void 0,requestBody:pt,security:He.length>0?He:void 0,responses:Ue}})}}),this.rootDoc.tags=r.tags?Hr(r.tags):[]}};import{createRequest as si,createResponse as ai}from"node-mocks-http";var pi=e=>si({...e,headers:{"content-type":P.json,...e?.headers}}),ci=e=>ai(e),di=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,i){return o==="_getLogs"?()=>t:o in le?(...s)=>t[o].push(s):Reflect.get(r,o,i)}})},li=async({endpoint:e,requestProps:t,responseOptions:r,configProps:o,loggerProps:i})=>{let s=pi(t),a=ci({req:s,...r}),p=di(i),c={cors:!1,logger:p,...o};return await e.execute({request:s,response:a,config:c,logger:p}),{requestMock:s,responseMock:a,loggerMock:p}};import Z from"typescript";import k from"typescript";import{chain as Dr,toPairs as Fr}from"ramda";var n=k.factory,B=[n.createModifier(k.SyntaxKind.ExportKeyword)],mi=[n.createModifier(k.SyntaxKind.AsyncKeyword)],ui=[n.createModifier(k.SyntaxKind.PublicKeyword),n.createModifier(k.SyntaxKind.ReadonlyKeyword)],Kr=[n.createModifier(k.SyntaxKind.ProtectedKeyword),n.createModifier(k.SyntaxKind.ReadonlyKeyword)],wt=n.createTemplateHead(""),fe=n.createTemplateTail(""),Zt=n.createTemplateMiddle(" "),Et=e=>n.createTemplateLiteralType(wt,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?fe:Zt))),jt=Et(["M","P"]),nt=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),it=(e,t)=>Dr(([r,o])=>[nt(n.createIdentifier(r),o,t)],Fr(e)),Lt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),Br=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),qr=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),q=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],k.NodeFlags.Const),Nt=(e,t)=>n.createTypeAliasDeclaration(B,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),st=(e,t)=>n.createTypeAliasDeclaration(B,e,void 0,t),$r=(e,t,r)=>n.createPropertyDeclaration(ui,e,void 0,t,r),Vr=(e,t,r)=>n.createClassDeclaration(B,e,void 0,void 0,[t,...r]),Gr=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),_r=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(k.SyntaxKind.AnyKeyword)]),Yr=(e,t,r)=>n.createInterfaceDeclaration(B,e,void 0,t,r),Qr=e=>Dr(([t,r])=>[n.createTypeParameterDeclaration([],t,n.createTypeReferenceNode(r))],Fr(e)),vt=(e,t,r)=>n.createArrowFunction(r?mi:void 0,void 0,e.map(o=>nt(o)),void 0,void 0,t),kt=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[n.createArrowFunction(void 0,void 0,it({acc:void 0,key:void 0}),void 0,void 0,t),r]),Jr=(...e)=>`"${e.join(" ")}"`;var Wr=["get","post","put","delete","patch"];import g from"typescript";import{z as Ht}from"zod";import $ from"typescript";var{factory:at}=$,Mt=(e,t)=>{$.addSyntheticLeadingComment(e,$.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ye=(e,t,r)=>{let o=at.createTypeAliasDeclaration(void 0,at.createIdentifier(t),void 0,e);return r&&Mt(o,r),o},Ut=(e,t)=>{let r=$.createSourceFile("print.ts","",$.ScriptTarget.Latest,!1,$.ScriptKind.TS);return $.createPrinter(t).printNode($.EmitHint.Unspecified,e,r)},fi=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Xr=e=>fi.test(e)?at.createIdentifier(e):at.createStringLiteral(e);var{factory:m}=g,yi={[g.SyntaxKind.AnyKeyword]:"",[g.SyntaxKind.BigIntKeyword]:BigInt(0),[g.SyntaxKind.BooleanKeyword]:!1,[g.SyntaxKind.NumberKeyword]:0,[g.SyntaxKind.ObjectKeyword]:{},[g.SyntaxKind.StringKeyword]:"",[g.SyntaxKind.UndefinedKeyword]:void 0},gi=({value:e})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),hi=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&Re(a)?a instanceof Ht.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,Xr(s),p&&o?m.createToken(g.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Mt(c,a.description),c});return m.createTypeLiteralNode(i)},xi=({element:e},{next:t})=>m.createArrayTypeNode(t(e)),bi=({options:e})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),eo=({options:e},{next:t})=>m.createUnionTypeNode(e.map(t)),Ti=e=>yi?.[e.kind],Si=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=Be(e,Ti(o)),s={number:g.SyntaxKind.NumberKeyword,bigint:g.SyntaxKind.BigIntKeyword,boolean:g.SyntaxKind.BooleanKeyword,string:g.SyntaxKind.StringKeyword,undefined:g.SyntaxKind.UndefinedKeyword,object:g.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(i&&s[i]||g.SyntaxKind.AnyKeyword)}return o},Oi=e=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),Ri=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(g.SyntaxKind.UndefinedKeyword)]):o},Ai=(e,{next:t})=>m.createUnionTypeNode([t(e.unwrap()),m.createLiteralTypeNode(m.createNull())]),Pi=({items:e,_def:{rest:t}},{next:r})=>m.createTupleTypeNode(e.map(r).concat(t===null?[]:m.createRestTypeNode(r(t)))),Ii=({keySchema:e,valueSchema:t},{next:r})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e,t].map(r)),Ci=({_def:e},{next:t})=>m.createIntersectionTypeNode([e.left,e.right].map(t)),zi=({_def:e},{next:t})=>t(e.innerType),re=e=>()=>m.createKeywordTypeNode(e),wi=(e,{next:t})=>t(e.unwrap()),Zi=(e,{next:t})=>t(e.unwrap()),Ei=({_def:e},{next:t})=>t(e.innerType),ji=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Li=()=>m.createLiteralTypeNode(m.createNull()),Ni=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:i})=>{let s=`Type${i(e)}`;return t(s)||(r(s,m.createLiteralTypeNode(m.createNull())),r(s,o(e)))},vi=e=>{let t=e.unwrap(),r=m.createKeywordTypeNode(g.SyntaxKind.StringKeyword),o=m.createTypeReferenceNode("Buffer"),i=m.createUnionTypeNode([r,o]);return t instanceof Ht.ZodString?r:t instanceof Ht.ZodUnion?i:o},ki=(e,{next:t})=>t(e.unwrap().shape.raw),Mi={ZodString:re(g.SyntaxKind.StringKeyword),ZodNumber:re(g.SyntaxKind.NumberKeyword),ZodBigInt:re(g.SyntaxKind.BigIntKeyword),ZodBoolean:re(g.SyntaxKind.BooleanKeyword),ZodAny:re(g.SyntaxKind.AnyKeyword),[Ne]:re(g.SyntaxKind.StringKeyword),[ve]:re(g.SyntaxKind.StringKeyword),ZodNull:Li,ZodArray:xi,ZodTuple:Pi,ZodRecord:Ii,ZodObject:hi,ZodLiteral:gi,ZodIntersection:Ci,ZodUnion:eo,ZodDefault:zi,ZodEnum:bi,ZodNativeEnum:Oi,ZodEffects:Si,ZodOptional:Ri,ZodNullable:Ai,ZodDiscriminatedUnion:eo,ZodBranded:wi,ZodCatch:Ei,ZodPipeline:ji,ZodLazy:Ni,ZodReadonly:Zi,[F]:vi,[Q]:ki},Me=(e,{brandHandling:t,ctx:r})=>X(e,{rules:{...t,...Mi},onMissing:()=>m.createKeywordTypeNode(g.SyntaxKind.AnyKeyword),ctx:r});var Dt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:n.createIdentifier("Path"),methodType:n.createIdentifier("Method"),methodPathType:n.createIdentifier("MethodPath"),inputInterface:n.createIdentifier("Input"),posResponseInterface:n.createIdentifier("PositiveResponse"),negResponseInterface:n.createIdentifier("NegativeResponse"),responseInterface:n.createIdentifier("Response"),jsonEndpointsConst:n.createIdentifier("jsonEndpoints"),endpointTagsConst:n.createIdentifier("endpointTags"),providerType:n.createIdentifier("Provider"),implementationType:n.createIdentifier("Implementation"),clientClass:n.createIdentifier("ExpressZodAPIClient"),keyParameter:n.createIdentifier("key"),pathParameter:n.createIdentifier("path"),paramsArgument:n.createIdentifier("params"),methodParameter:n.createIdentifier("method"),accumulator:n.createIdentifier("acc"),provideMethod:n.createIdentifier("provide"),implementationArgument:n.createIdentifier("implementation"),headersProperty:n.createIdentifier("headers"),hasBodyConst:n.createIdentifier("hasBody"),undefinedValue:n.createIdentifier("undefined"),bodyProperty:n.createIdentifier("body"),responseConst:n.createIdentifier("response"),searchParamsConst:n.createIdentifier("searchParams"),exampleImplementationConst:n.createIdentifier("exampleImplementation"),clientConst:n.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?n.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,ye(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=Ke,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){W({routing:t,onEndpoint:(S,O,A)=>{let ne={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},be=w(A,O,"input"),Te=Me(S.getSchema("input"),{brandHandling:r,ctx:{...ne,isResponse:!1}}),C=s?w(A,O,"positive.response"):void 0,Ft=S.getSchema("positive"),Kt=s?Me(Ft,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Se=s?w(A,O,"negative.response"):void 0,Bt=S.getSchema("negative"),qt=s?Me(Bt,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,$t=w(A,O,"response"),to=C&&Se?n.createUnionTypeNode([n.createTypeReferenceNode(C),n.createTypeReferenceNode(Se)]):Me(Ft.or(Bt),{brandHandling:r,ctx:{...ne,isResponse:!0}});this.program.push(ye(Te,be)),Kt&&C&&this.program.push(ye(Kt,C)),qt&&Se&&this.program.push(ye(qt,Se)),this.program.push(ye(to,$t)),A!=="options"&&(this.paths.push(O),this.registry.set({method:A,path:O},{input:be,positive:C,negative:Se,response:$t,isJson:S.getMimeTypes("positive").includes(P.json),tags:S.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(Nt(this.ids.pathType,this.paths)),this.program.push(Nt(this.ids.methodType,Wr)),this.program.push(st(this.ids.methodPathType,Et([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(Z.SyntaxKind.ExtendsKeyword,[Lt(this.ids.methodPathType,Z.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&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 c=[],d=[];for(let[{method:S,path:O},{isJson:A,tags:ne,...be}]of this.registry){let Te=Jr(S,O);for(let C of this.interfaces)C.kind in be&&C.props.push(qr(Te,be[C.kind]));o!=="types"&&(A&&c.push(n.createPropertyAssignment(Te,n.createTrue())),d.push(n.createPropertyAssignment(Te,n.createArrayLiteralExpression(ne.map(C=>n.createStringLiteral(C))))))}for(let{id:S,props:O}of this.interfaces)this.program.push(Yr(S,p,O));if(o==="types")return;let l=n.createVariableStatement(B,q(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(c))),f=n.createVariableStatement(B,q(this.ids.endpointTagsConst,n.createObjectLiteralExpression(d))),u=st(this.ids.providerType,n.createFunctionTypeNode(Qr({M:this.ids.methodType,P:this.ids.pathType}),it({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),jt)}),Gr(this.ids.responseInterface,jt))),T=st(this.ids.implementationType,n.createFunctionTypeNode(void 0,it({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(Z.SyntaxKind.StringKeyword),params:Lt(Z.SyntaxKind.StringKeyword,Z.SyntaxKind.AnyKeyword)}),_r())),I=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,fe)]),x=kt(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[I,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),E=kt(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[I]),Z.SyntaxKind.GreaterThanEqualsToken,n.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,n.createObjectLiteralExpression([n.createSpreadAssignment(this.ids.accumulator),n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),n.createObjectLiteralExpression()),R=Vr(this.ids.clientClass,Br([nt(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),Kr)]),[$r(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),vt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,x,E]),!0))]);this.program.push(l,f,u,T,R);let h=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),ge=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(P.json))]),void 0,this.ids.undefinedValue)),M=n.createPropertyAssignment(this.ids.bodyProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),V=n.createVariableStatement(void 0,q(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier("fetch"),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,fe)]),n.createObjectLiteralExpression([h,ge,M])])))),oe=n.createVariableStatement(void 0,q(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),he=n.createVariableStatement(void 0,q(this.ids.searchParamsConst,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createStringLiteral(""),void 0,n.createTemplateExpression(n.createTemplateHead("?"),[n.createTemplateSpan(n.createNewExpression(n.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),fe)])))),[Ue,pt]=["json","text"].map(S=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,S),void 0,void 0))),He=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(wt,[n.createTemplateSpan(this.ids.methodParameter,Zt),n.createTemplateSpan(this.ids.pathParameter,fe)]),Z.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([Ue])),L=n.createVariableStatement(B,q(this.ids.exampleImplementationConst,vt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([oe,he,V,He,pt]),!0),n.createTypeReferenceNode(this.ids.implementationType))),G=n.createExpressionStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[n.createStringLiteral("get"),n.createStringLiteral("/v1/user/retrieve"),n.createObjectLiteralExpression([n.createPropertyAssignment("id",n.createStringLiteral("10"))])])),xe=n.createVariableStatement(void 0,q(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(L,xe,G)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Ut(r,t)).join(`
20
+ `)};var Tr=e=>{e.startupLogo!==!1&&console.log(br());let t=e.errorHandler||ze,r=dr(e.logger)?e.logger:new Ze(e.logger);r.debug("Running","v20.1.0 (ESM)");let o=hr({rootLogger:r,config:e}),i=fr({rootLogger:r,errorHandler:t}),s=ur({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:i,parserFailureHandler:s,loggingMiddleware:o}},_o=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:i}=Tr(e);return Tt({app:e.app.use(i),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},Yo=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,parserFailureHandler:i,loggingMiddleware:s}=Tr(e),a=St().disable("x-powered-by").use(s);if(e.server.compression){let l=await me("compression");a.use(l(typeof e.server.compression=="object"?e.server.compression:void 0))}let p={json:[e.server.jsonParser||St.json()],raw:[e.server.rawParser||St.raw(),gr],upload:e.server.upload?await yr({config:e,rootLogger:r}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:a,logger:r}),Tt({app:a,routing:t,rootLogger:r,config:e,parsers:p}),a.use(i,o);let c=(l,f)=>l.listen(f,()=>{r.info("Listening",f)}),d={httpServer:c(Vo.createServer(a),e.server.listen),httpsServer:e.https?c(Go.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...d,logger:r}};import oi from"assert/strict";import{OpenApiBuilder as ni}from"openapi3-ts/oas31";import{pluck as ii}from"ramda";import te from"assert/strict";import{isReferenceObject as Rt,isSchemaObject as et}from"openapi3-ts/oas31";import{both as Jo,complement as Wo,concat as Xo,type as en,filter as tn,fromPairs as ke,has as rn,isNil as on,map as ue,mergeAll as nn,mergeDeepRight as sn,mergeDeepWith as an,objOf as Pr,omit as tt,pipe as Ir,pluck as pn,range as cn,reject as dn,toLower as ln,union as mn,when as un,xprod as rt,zip as fn}from"ramda";import{z as b}from"zod";import{z as Le}from"zod";var We=e=>!isNaN(e.getTime());var Ne=Symbol("DateIn"),Sr=()=>Le.union([Le.string().date(),Le.string().datetime(),Le.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Le.date().refine(We)).brand(Ne);import{z as Qo}from"zod";var ve=Symbol("DateOut"),Or=()=>Qo.date().refine(We).transform(e=>e.toISOString()).brand(ve);var X=(e,{onEach:t,rules:r,onMissing:o,ctx:i={}})=>{let s=r[e._def[y]?.brand]||r[e._def.typeName],p=s?s(e,{...i,next:d=>X(d,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),c=t&&t(e,{prev:p,...i});return c?{...p,...c}:p};var Rr=50,Cr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",yn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},zr=/:([A-Za-z0-9_]+)/g,gn=e=>e.match(zr)?.map(t=>t.slice(1))||[],wr=e=>e.replace(zr,t=>`{${t.slice(1)}}`),hn=({_def:e},{next:t})=>({...t(e.innerType),default:e[y]?.defaultLabel||e.defaultValue()}),xn=({_def:{innerType:e}},{next:t})=>t(e),bn=()=>({format:"any"}),Tn=({},e)=>(te(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),Sn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},On=({options:e},{next:t})=>({oneOf:e.map(t)}),Rn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),An=e=>{let[t,r]=e.filter(et).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));te(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=an((i,s)=>Array.isArray(i)&&Array.isArray(s)?Xo(i,s):i===s?s:te.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=mn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=Y(t.examples||[],r.examples||[],([i,s])=>sn(i,s))),o},Pn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return An(o)}catch{}return{allOf:o}},In=(e,{next:t})=>t(e.unwrap()),Cn=(e,{next:t})=>t(e.unwrap()),zn=(e,{next:t})=>{let r=t(e.unwrap());return et(r)&&(r.type=Er(r)),r},Zr=e=>{let t=ln(en(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Ar=e=>({type:Zr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),wn=({value:e})=>({type:Zr(e),const:e}),Zn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&Re(p)?p instanceof b.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=Xe(e,r)),s.length&&(a.required=s),a},En=()=>({type:"null"}),jn=({},e)=>(te(!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:Cr}}),Ln=({},e)=>(te(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:Cr}}),Nn=({},e)=>te.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})),vn=()=>({type:"boolean"}),kn=()=>({type:"integer",format:"bigint"}),Mn=e=>e.every(t=>t instanceof b.ZodLiteral),Un=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.ZodEnum||e instanceof b.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=Xe(b.object(ke(rt(o,[t]))),r),i.required=o),i}if(e instanceof b.ZodLiteral)return{type:"object",properties:Xe(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&Mn(e.options)){let o=ue(s=>`${s.value}`,e.options),i=ke(rt(o,[t]));return{type:"object",properties:Xe(b.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},Hn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let i={type:"array",items:o(r)};return e&&(i.minItems=e.value),t&&(i.maxItems=t.value),i},Dn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Fn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:c,isEmoji:d,isDatetime:l,_def:{checks:f}})=>{let u=f.find(R=>R.kind==="regex"),T=f.find(R=>R.kind==="datetime"),I=u?u.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,x={type:"string"},E={"date-time":l,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:c,emoji:d};for(let R in E)if(E[R]){x.format=R;break}return r!==null&&(x.minLength=r),o!==null&&(x.maxLength=o),I&&(x.pattern=I.source),x},Kn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let i=o.find(f=>f.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=i?i.inclusive:!0,p=o.find(f=>f.kind==="max"),c=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,d=p?p.inclusive:!0,l={type:e?"integer":"number",format:e?"int64":"double"};return a?l.minimum=s:l.exclusiveMinimum=s,d?l.maximum=c:l.exclusiveMaximum=c,l},Xe=({shape:e},t)=>ue(t,e),Bn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return yn?.[t]},Er=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},qn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&et(o)){let s=Be(e,Bn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(b.any())}if(!t&&i.type==="preprocess"&&et(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},$n=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Vn=(e,{next:t})=>t(e.unwrap()),Gn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},_n=(e,{next:t})=>t(e.unwrap().shape.raw),jr=e=>e.length?ke(fn(cn(1,e.length+1).map(t=>`example${t}`),ue(Pr("value"),e))):void 0,Lr=(e,t,r=[])=>Ir(D,ue(un(Jo(v,Wo(Array.isArray)),tt(r))),jr)({schema:e,variant:t?"parsed":"original",validate:!0}),Yn=(e,t)=>Ir(D,tn(rn(t)),pn(t),jr)({schema:e,variant:"original",validate:!0}),ee=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?ee(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>ee(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?ee(e._def.schema):e instanceof b.ZodPipeline?ee(e._def.in):ee(e._def.left).merge(ee(e._def.right)),Nr=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,description:d=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:l}=ee(r),f=gn(e),u=o.includes("query"),T=o.includes("params"),I=o.includes("headers"),x=h=>T&&f.includes(h),E=h=>I&&lt(h);return Object.keys(l).map(h=>({name:h,location:x(h)?"path":E(h)?"header":u?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:ge})=>{let M=X(l[h],{rules:{...c,...At},onEach:Pt,onMissing:It,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),V=p==="components"?a(w(d,h),M):M;return{name:h,in:ge,required:!l[h].isOptional(),description:M.description||d,schema:V,examples:Yn(r,h)}})},At={ZodString:Fn,ZodNumber:Kn,ZodBigInt:kn,ZodBoolean:vn,ZodNull:En,ZodArray:Hn,ZodTuple:Dn,ZodRecord:Un,ZodObject:Zn,ZodLiteral:wn,ZodIntersection:Pn,ZodUnion:On,ZodAny:bn,ZodDefault:hn,ZodEnum:Ar,ZodNativeEnum:Ar,ZodEffects:qn,ZodOptional:In,ZodNullable:zn,ZodDiscriminatedUnion:Rn,ZodBranded:Vn,ZodDate:Nn,ZodCatch:xn,ZodPipeline:$n,ZodLazy:Gn,ZodReadonly:Cn,[F]:Sn,[Ae]:Tn,[ve]:Ln,[Ne]:jn,[Q]:_n},Pt=(e,{isResponse:t,prev:r})=>{if(Rt(r))return{};let{description:o}=e,i=e instanceof b.ZodLazy,s=r.type!==void 0,a=t&&Re(e),p=!i&&s&&!a&&e.isNullable(),c=i?[]:D({schema:e,variant:t?"parsed":"original",validate:!0}),d={};return o&&(d.description=o),p&&(d.type=Er(r)),c.length&&(d.examples=c.slice()),d},It=(e,t)=>te.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Ot=(e,t)=>{if(Rt(e))return e;let r={...e};return r.properties&&(r.properties=tt(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>tt(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Ot(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Ot(o,t))),r},vr=e=>Rt(e)?e:tt(["examples"],e),kr=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:c,hasMultipleStatusCodes:d,statusCode:l,brandHandling:f,description:u=`${e.toUpperCase()} ${t} ${ut(i)} response ${d?l:""}`.trim()})=>{let T=vr(X(r,{rules:{...f,...At},onEach:Pt,onMissing:It,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),I={schema:c==="components"?p(w(u),T):T,examples:Lr(r,!0)};return{description:u,content:ke(rt(o,[I]))}},Qn=()=>({type:"http",scheme:"basic"}),Jn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Wn=({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},Xn=({name:e})=>({type:"apiKey",in:"header",name:e}),ei=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ti=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),ri=({flows:e={}})=>({type:"oauth2",flows:ue(t=>({...t,scopes:t.scopes||{}}),dn(on,e))}),Mr=(e,t)=>{let r={basic:Qn,bearer:Jn,input:Wn,header:Xn,cookie:ei,openid:ti,oauth2:ri};return _e(e,o=>r[o.type](o,t))},ot=e=>"or"in e?e.or.map(t=>"and"in t?nn(ue(({name:r,scopes:o})=>Pr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?ot(gt(e)):ot({or:[e]}),Ur=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,paramNames:d,description:l=`${e.toUpperCase()} ${t} Request body`})=>{let f=vr(Ot(X(r,{rules:{...c,...At},onEach:Pt,onMissing:It,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),d)),u={schema:p==="components"?a(w(l),f):f,examples:Lr(r,!1,d)};return{description:l,content:ke(rt(o,[u]))}},Hr=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}),Ct=e=>e.length<=Rr?e:e.slice(0,Rr-1)+"\u2026";var zt=class extends ni{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let i=o||w(r,t),s=this.lastOperationIdSuffixes.get(i);return s===void 0?(this.lastOperationIdSuffixes.set(i,1),i):(o&&oi.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(i,s),`${i}${s}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let i in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[i]))return i;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:i,serverUrl:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:c=!0,composition:d="inline",serializer:l=Ke}){super(),this.addInfo({title:o,version:i});for(let u of typeof s=="string"?[s]:s)this.addServer({url:u});W({routing:t,onEndpoint:(u,T,I)=>{let x=I,E={path:T,method:x,endpoint:u,composition:d,serializer:l,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[R,h]=["short","long"].map(u.getDescription.bind(u)),ge=R?Ct(R):c&&h?Ct(h):void 0,M=u.getTags(),V=r.inputSources?.[x]||ct[x],oe=this.ensureUniqOperationId(T,x,u.getOperationId(x)),he=Nr({...E,inputSources:V,schema:u.getSchema("input"),description:a?.requestParameter?.call(null,{method:x,path:T,operationId:oe})}),Ue={};for(let L of["positive","negative"]){let G=u.getResponses(L);for(let{mimeTypes:xe,schema:S,statusCodes:O}of G)for(let A of O)Ue[A]=kr({...E,variant:L,schema:S,mimeTypes:xe,statusCode:A,hasMultipleStatusCodes:G.length>1||O.length>1,description:a?.[`${L}Response`]?.call(null,{method:x,path:T,operationId:oe,statusCode:A})})}let pt=V.includes("body")?Ur({...E,paramNames:ii("name",he),schema:u.getSchema("input"),mimeTypes:u.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:x,path:T,operationId:oe})}):void 0,He=ot(_e(Mr(u.getSecurity(),V),L=>{let G=this.ensureUniqSecuritySchemaName(L),xe=["oauth2","openIdConnect"].includes(L.type)?u.getScopes().slice():[];return this.addSecurityScheme(G,L),{name:G,scopes:xe}}));this.addPath(wr(T),{[x]:{operationId:oe,summary:ge,description:h,tags:M.length>0?M:void 0,parameters:he.length>0?he:void 0,requestBody:pt,security:He.length>0?He:void 0,responses:Ue}})}}),this.rootDoc.tags=r.tags?Hr(r.tags):[]}};import{createRequest as si,createResponse as ai}from"node-mocks-http";var pi=e=>si({...e,headers:{"content-type":P.json,...e?.headers}}),ci=e=>ai(e),di=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,i){return o==="_getLogs"?()=>t:o in le?(...s)=>t[o].push(s):Reflect.get(r,o,i)}})},li=async({endpoint:e,requestProps:t,responseOptions:r,configProps:o,loggerProps:i})=>{let s=pi(t),a=ci({req:s,...r}),p=di(i),c={cors:!1,logger:p,...o};return await e.execute({request:s,response:a,config:c,logger:p}),{requestMock:s,responseMock:a,loggerMock:p}};import Z from"typescript";import k from"typescript";import{chain as Dr,toPairs as Fr}from"ramda";var n=k.factory,B=[n.createModifier(k.SyntaxKind.ExportKeyword)],mi=[n.createModifier(k.SyntaxKind.AsyncKeyword)],ui=[n.createModifier(k.SyntaxKind.PublicKeyword),n.createModifier(k.SyntaxKind.ReadonlyKeyword)],Kr=[n.createModifier(k.SyntaxKind.ProtectedKeyword),n.createModifier(k.SyntaxKind.ReadonlyKeyword)],wt=n.createTemplateHead(""),fe=n.createTemplateTail(""),Zt=n.createTemplateMiddle(" "),Et=e=>n.createTemplateLiteralType(wt,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?fe:Zt))),jt=Et(["M","P"]),nt=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),it=(e,t)=>Dr(([r,o])=>[nt(n.createIdentifier(r),o,t)],Fr(e)),Lt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),Br=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),qr=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),q=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],k.NodeFlags.Const),Nt=(e,t)=>n.createTypeAliasDeclaration(B,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),st=(e,t)=>n.createTypeAliasDeclaration(B,e,void 0,t),$r=(e,t,r)=>n.createPropertyDeclaration(ui,e,void 0,t,r),Vr=(e,t,r)=>n.createClassDeclaration(B,e,void 0,void 0,[t,...r]),Gr=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),_r=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(k.SyntaxKind.AnyKeyword)]),Yr=(e,t,r)=>n.createInterfaceDeclaration(B,e,void 0,t,r),Qr=e=>Dr(([t,r])=>[n.createTypeParameterDeclaration([],t,n.createTypeReferenceNode(r))],Fr(e)),vt=(e,t,r)=>n.createArrowFunction(r?mi:void 0,void 0,e.map(o=>nt(o)),void 0,void 0,t),kt=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[n.createArrowFunction(void 0,void 0,it({acc:void 0,key:void 0}),void 0,void 0,t),r]),Jr=(...e)=>`"${e.join(" ")}"`;var Wr=["get","post","put","delete","patch"];import g from"typescript";import{z as Ht}from"zod";import $ from"typescript";var{factory:at}=$,Mt=(e,t)=>{$.addSyntheticLeadingComment(e,$.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ye=(e,t,r)=>{let o=at.createTypeAliasDeclaration(void 0,at.createIdentifier(t),void 0,e);return r&&Mt(o,r),o},Ut=(e,t)=>{let r=$.createSourceFile("print.ts","",$.ScriptTarget.Latest,!1,$.ScriptKind.TS);return $.createPrinter(t).printNode($.EmitHint.Unspecified,e,r)},fi=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Xr=e=>fi.test(e)?at.createIdentifier(e):at.createStringLiteral(e);var{factory:m}=g,yi={[g.SyntaxKind.AnyKeyword]:"",[g.SyntaxKind.BigIntKeyword]:BigInt(0),[g.SyntaxKind.BooleanKeyword]:!1,[g.SyntaxKind.NumberKeyword]:0,[g.SyntaxKind.ObjectKeyword]:{},[g.SyntaxKind.StringKeyword]:"",[g.SyntaxKind.UndefinedKeyword]:void 0},gi=({value:e})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),hi=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&Re(a)?a instanceof Ht.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,Xr(s),p&&o?m.createToken(g.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Mt(c,a.description),c});return m.createTypeLiteralNode(i)},xi=({element:e},{next:t})=>m.createArrayTypeNode(t(e)),bi=({options:e})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),eo=({options:e},{next:t})=>m.createUnionTypeNode(e.map(t)),Ti=e=>yi?.[e.kind],Si=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=Be(e,Ti(o)),s={number:g.SyntaxKind.NumberKeyword,bigint:g.SyntaxKind.BigIntKeyword,boolean:g.SyntaxKind.BooleanKeyword,string:g.SyntaxKind.StringKeyword,undefined:g.SyntaxKind.UndefinedKeyword,object:g.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(i&&s[i]||g.SyntaxKind.AnyKeyword)}return o},Oi=e=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),Ri=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(g.SyntaxKind.UndefinedKeyword)]):o},Ai=(e,{next:t})=>m.createUnionTypeNode([t(e.unwrap()),m.createLiteralTypeNode(m.createNull())]),Pi=({items:e,_def:{rest:t}},{next:r})=>m.createTupleTypeNode(e.map(r).concat(t===null?[]:m.createRestTypeNode(r(t)))),Ii=({keySchema:e,valueSchema:t},{next:r})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e,t].map(r)),Ci=({_def:e},{next:t})=>m.createIntersectionTypeNode([e.left,e.right].map(t)),zi=({_def:e},{next:t})=>t(e.innerType),re=e=>()=>m.createKeywordTypeNode(e),wi=(e,{next:t})=>t(e.unwrap()),Zi=(e,{next:t})=>t(e.unwrap()),Ei=({_def:e},{next:t})=>t(e.innerType),ji=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Li=()=>m.createLiteralTypeNode(m.createNull()),Ni=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:i})=>{let s=`Type${i(e)}`;return t(s)||(r(s,m.createLiteralTypeNode(m.createNull())),r(s,o(e)))},vi=e=>{let t=e.unwrap(),r=m.createKeywordTypeNode(g.SyntaxKind.StringKeyword),o=m.createTypeReferenceNode("Buffer"),i=m.createUnionTypeNode([r,o]);return t instanceof Ht.ZodString?r:t instanceof Ht.ZodUnion?i:o},ki=(e,{next:t})=>t(e.unwrap().shape.raw),Mi={ZodString:re(g.SyntaxKind.StringKeyword),ZodNumber:re(g.SyntaxKind.NumberKeyword),ZodBigInt:re(g.SyntaxKind.BigIntKeyword),ZodBoolean:re(g.SyntaxKind.BooleanKeyword),ZodAny:re(g.SyntaxKind.AnyKeyword),[Ne]:re(g.SyntaxKind.StringKeyword),[ve]:re(g.SyntaxKind.StringKeyword),ZodNull:Li,ZodArray:xi,ZodTuple:Pi,ZodRecord:Ii,ZodObject:hi,ZodLiteral:gi,ZodIntersection:Ci,ZodUnion:eo,ZodDefault:zi,ZodEnum:bi,ZodNativeEnum:Oi,ZodEffects:Si,ZodOptional:Ri,ZodNullable:Ai,ZodDiscriminatedUnion:eo,ZodBranded:wi,ZodCatch:Ei,ZodPipeline:ji,ZodLazy:Ni,ZodReadonly:Zi,[F]:vi,[Q]:ki},Me=(e,{brandHandling:t,ctx:r})=>X(e,{rules:{...t,...Mi},onMissing:()=>m.createKeywordTypeNode(g.SyntaxKind.AnyKeyword),ctx:r});var Dt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:n.createIdentifier("Path"),methodType:n.createIdentifier("Method"),methodPathType:n.createIdentifier("MethodPath"),inputInterface:n.createIdentifier("Input"),posResponseInterface:n.createIdentifier("PositiveResponse"),negResponseInterface:n.createIdentifier("NegativeResponse"),responseInterface:n.createIdentifier("Response"),jsonEndpointsConst:n.createIdentifier("jsonEndpoints"),endpointTagsConst:n.createIdentifier("endpointTags"),providerType:n.createIdentifier("Provider"),implementationType:n.createIdentifier("Implementation"),clientClass:n.createIdentifier("ExpressZodAPIClient"),keyParameter:n.createIdentifier("key"),pathParameter:n.createIdentifier("path"),paramsArgument:n.createIdentifier("params"),methodParameter:n.createIdentifier("method"),accumulator:n.createIdentifier("acc"),provideMethod:n.createIdentifier("provide"),implementationArgument:n.createIdentifier("implementation"),headersProperty:n.createIdentifier("headers"),hasBodyConst:n.createIdentifier("hasBody"),undefinedValue:n.createIdentifier("undefined"),bodyProperty:n.createIdentifier("body"),responseConst:n.createIdentifier("response"),searchParamsConst:n.createIdentifier("searchParams"),exampleImplementationConst:n.createIdentifier("exampleImplementation"),clientConst:n.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?n.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,ye(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=Ke,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){W({routing:t,onEndpoint:(S,O,A)=>{let ne={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},be=w(A,O,"input"),Te=Me(S.getSchema("input"),{brandHandling:r,ctx:{...ne,isResponse:!1}}),C=s?w(A,O,"positive.response"):void 0,Ft=S.getSchema("positive"),Kt=s?Me(Ft,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Se=s?w(A,O,"negative.response"):void 0,Bt=S.getSchema("negative"),qt=s?Me(Bt,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,$t=w(A,O,"response"),to=C&&Se?n.createUnionTypeNode([n.createTypeReferenceNode(C),n.createTypeReferenceNode(Se)]):Me(Ft.or(Bt),{brandHandling:r,ctx:{...ne,isResponse:!0}});this.program.push(ye(Te,be)),Kt&&C&&this.program.push(ye(Kt,C)),qt&&Se&&this.program.push(ye(qt,Se)),this.program.push(ye(to,$t)),A!=="options"&&(this.paths.push(O),this.registry.set({method:A,path:O},{input:be,positive:C,negative:Se,response:$t,isJson:S.getMimeTypes("positive").includes(P.json),tags:S.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(Nt(this.ids.pathType,this.paths)),this.program.push(Nt(this.ids.methodType,Wr)),this.program.push(st(this.ids.methodPathType,Et([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(Z.SyntaxKind.ExtendsKeyword,[Lt(this.ids.methodPathType,Z.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&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 c=[],d=[];for(let[{method:S,path:O},{isJson:A,tags:ne,...be}]of this.registry){let Te=Jr(S,O);for(let C of this.interfaces)C.kind in be&&C.props.push(qr(Te,be[C.kind]));o!=="types"&&(A&&c.push(n.createPropertyAssignment(Te,n.createTrue())),d.push(n.createPropertyAssignment(Te,n.createArrayLiteralExpression(ne.map(C=>n.createStringLiteral(C))))))}for(let{id:S,props:O}of this.interfaces)this.program.push(Yr(S,p,O));if(o==="types")return;let l=n.createVariableStatement(B,q(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(c))),f=n.createVariableStatement(B,q(this.ids.endpointTagsConst,n.createObjectLiteralExpression(d))),u=st(this.ids.providerType,n.createFunctionTypeNode(Qr({M:this.ids.methodType,P:this.ids.pathType}),it({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),jt)}),Gr(this.ids.responseInterface,jt))),T=st(this.ids.implementationType,n.createFunctionTypeNode(void 0,it({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(Z.SyntaxKind.StringKeyword),params:Lt(Z.SyntaxKind.StringKeyword,Z.SyntaxKind.AnyKeyword)}),_r())),I=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,fe)]),x=kt(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[I,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),E=kt(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[I]),Z.SyntaxKind.GreaterThanEqualsToken,n.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,n.createObjectLiteralExpression([n.createSpreadAssignment(this.ids.accumulator),n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),n.createObjectLiteralExpression()),R=Vr(this.ids.clientClass,Br([nt(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),Kr)]),[$r(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),vt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,x,E]),!0))]);this.program.push(l,f,u,T,R);let h=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),ge=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(P.json))]),void 0,this.ids.undefinedValue)),M=n.createPropertyAssignment(this.ids.bodyProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),V=n.createVariableStatement(void 0,q(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier("fetch"),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,fe)]),n.createObjectLiteralExpression([h,ge,M])])))),oe=n.createVariableStatement(void 0,q(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),he=n.createVariableStatement(void 0,q(this.ids.searchParamsConst,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createStringLiteral(""),void 0,n.createTemplateExpression(n.createTemplateHead("?"),[n.createTemplateSpan(n.createNewExpression(n.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),fe)])))),[Ue,pt]=["json","text"].map(S=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,S),void 0,void 0))),He=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(wt,[n.createTemplateSpan(this.ids.methodParameter,Zt),n.createTemplateSpan(this.ids.pathParameter,fe)]),Z.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([Ue])),L=n.createVariableStatement(B,q(this.ids.exampleImplementationConst,vt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([oe,he,V,He,pt]),!0),n.createTypeReferenceNode(this.ids.implementationType))),G=n.createExpressionStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[n.createStringLiteral("get"),n.createStringLiteral("/v1/user/retrieve"),n.createObjectLiteralExpression([n.createPropertyAssignment("id",n.createStringLiteral("10"))])])),xe=n.createVariableStatement(void 0,q(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(L,xe,G)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Ut(r,t)).join(`
21
21
  `):void 0}print(t){let r=this.printUsage(t),o=r&&Z.addSyntheticLeadingComment(Z.addSyntheticLeadingComment(n.createEmptyStatement(),Z.SyntaxKind.SingleLineCommentTrivia," Usage example:"),Z.SyntaxKind.MultiLineCommentTrivia,`
22
22
  ${r}`);return this.program.concat(o||[]).map((i,s)=>Ut(i,s<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
23
23
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "20.1.0-beta.2",
3
+ "version": "20.1.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": {