express-zod-api 19.3.1 → 19.4.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/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  ## Version 19
4
4
 
5
+ ### v19.4.0
6
+
7
+ - Supporting Jest 30.
8
+
9
+ ### v19.3.2
10
+
11
+ - Fixed behavior of error catching handler:
12
+ - Removed conversion of non-`HttpError`s to `BadRequest` before passing them to `errorHandler`;
13
+ - A `ResultHandler` configured as `errorHandler` is responsible to handling all errors and responding accordingly.
14
+ - The default `errorHandler` is `defaultResultHandler`:
15
+ - Using `getStatusCodeFromError()` it treats non-`HttpError`s as internal ones and responds with status code `500`;
16
+
5
17
  ### v19.3.1
6
18
 
7
19
  - Fixed: the output type of the `ez.raw()` schema (without an argument) was missing the `raw` property (since v19.0.0).
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
- "use strict";var Po=Object.create;var Ve=Object.defineProperty;var Co=Object.getOwnPropertyDescriptor;var Io=Object.getOwnPropertyNames;var wo=Object.getPrototypeOf,Eo=Object.prototype.hasOwnProperty;var zo=(e,t)=>{for(var r in t)Ve(e,r,{get:t[r],enumerable:!0})},er=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Io(t))!Eo.call(e,i)&&i!==r&&Ve(e,i,{get:()=>t[i],enumerable:!(o=Co(t,i))||o.enumerable});return e};var R=(e,t,r)=>(r=e!=null?Po(wo(e)):{},er(t||!e||!e.__esModule?Ve(r,"default",{value:e,enumerable:!0}):r,e)),Zo=e=>er(Ve({},"__esModule",{value:!0}),e);var si={};zo(si,{AbstractEndpoint:()=>se,BuiltinLogger:()=>ae,DependsOnMethod:()=>Se,Documentation:()=>mt,DocumentationError:()=>P,EndpointsFactory:()=>Te,InputValidationError:()=>H,Integration:()=>xt,MissingPeerError:()=>re,OutputValidationError:()=>_,RoutingError:()=>ee,ServeStatic:()=>Oe,arrayEndpointsFactory:()=>Ar,arrayResultHandler:()=>st,attachRouting:()=>Hr,createConfig:()=>ar,createLogger:()=>Ir,createMiddleware:()=>nt,createResultHandler:()=>it,createServer:()=>Ur,defaultEndpointsFactory:()=>Or,defaultResultHandler:()=>be,ez:()=>Oo,getExamples:()=>F,getMessageFromError:()=>U,getStatusCodeFromError:()=>Le,testEndpoint:()=>po});module.exports=Zo(si);var sr=require("ramda"),De=require("zod");var tr=require("http-errors"),rr=require("crypto"),fe=require("ramda"),or=require("zod");var ee=class extends Error{name="RoutingError"},P=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:i}){let s=`${t}
2
- Caused by ${i?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},G=class extends Error{name="IOSchemaError"},_=class extends G{name="OutputValidationError";originalError;constructor(t){super(U(t)),this.originalError=t}},H=class extends G{name="InputValidationError";originalError;constructor(t){super(U(t)),this.originalError=t}},te=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},re=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var M={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var No=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(M.upload);return"files"in e&&r},Tt={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Mo=["body","query","params"],St=e=>e.method.toLowerCase(),Rt=e=>e.startsWith("x-"),vo=e=>(0,fe.pickBy)((0,fe.flip)(Rt),e),nr=(e,t={})=>{let r=St(e);return r==="options"?{}:(t[r]||Tt[r]||Mo).filter(o=>o==="files"?No(e):!0).map(o=>o==="headers"?vo(e[o]):e[o]).reduce((o,i)=>({...o,...i}),{})},ye=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),U=e=>e instanceof or.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof _?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Le=e=>(0,tr.isHttpError)(e)?e.statusCode:e instanceof H?400:500,Ot=({logger:e,request:t,input:r,error:o,statusCode:i})=>{i===500&&e.error(`Internal server error
1
+ "use strict";var Po=Object.create;var $e=Object.defineProperty;var Co=Object.getOwnPropertyDescriptor;var Io=Object.getOwnPropertyNames;var wo=Object.getPrototypeOf,Eo=Object.prototype.hasOwnProperty;var zo=(e,t)=>{for(var r in t)$e(e,r,{get:t[r],enumerable:!0})},Xt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Io(t))!Eo.call(e,i)&&i!==r&&$e(e,i,{get:()=>t[i],enumerable:!(o=Co(t,i))||o.enumerable});return e};var R=(e,t,r)=>(r=e!=null?Po(wo(e)):{},Xt(t||!e||!e.__esModule?$e(r,"default",{value:e,enumerable:!0}):r,e)),Zo=e=>Xt($e({},"__esModule",{value:!0}),e);var si={};zo(si,{AbstractEndpoint:()=>se,BuiltinLogger:()=>ae,DependsOnMethod:()=>Se,Documentation:()=>lt,DocumentationError:()=>P,EndpointsFactory:()=>Te,InputValidationError:()=>H,Integration:()=>ht,MissingPeerError:()=>re,OutputValidationError:()=>_,RoutingError:()=>ee,ServeStatic:()=>Oe,arrayEndpointsFactory:()=>Or,arrayResultHandler:()=>it,attachRouting:()=>Hr,createConfig:()=>sr,createLogger:()=>Cr,createMiddleware:()=>ot,createResultHandler:()=>nt,createServer:()=>Ur,defaultEndpointsFactory:()=>Rr,defaultResultHandler:()=>be,ez:()=>Oo,getExamples:()=>F,getMessageFromError:()=>U,getStatusCodeFromError:()=>Le,testEndpoint:()=>po});module.exports=Zo(si);var ir=require("ramda"),De=require("zod");var er=require("http-errors"),tr=require("crypto"),fe=require("ramda"),rr=require("zod");var ee=class extends Error{name="RoutingError"},P=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:i}){let s=`${t}
2
+ Caused by ${i?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},G=class extends Error{name="IOSchemaError"},_=class extends G{name="OutputValidationError";originalError;constructor(t){super(U(t)),this.originalError=t}},H=class extends G{name="InputValidationError";originalError;constructor(t){super(U(t)),this.originalError=t}},te=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},re=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var M={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var No=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(M.upload);return"files"in e&&r},bt={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Mo=["body","query","params"],Tt=e=>e.method.toLowerCase(),St=e=>e.startsWith("x-"),vo=e=>(0,fe.pickBy)((0,fe.flip)(St),e),or=(e,t={})=>{let r=Tt(e);return r==="options"?{}:(t[r]||bt[r]||Mo).filter(o=>o==="files"?No(e):!0).map(o=>o==="headers"?vo(e[o]):e[o]).reduce((o,i)=>({...o,...i}),{})},ye=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),U=e=>e instanceof rr.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof _?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Le=e=>(0,er.isHttpError)(e)?e.statusCode:e instanceof H?400:500,Rt=({logger:e,request:t,input:r,error:o,statusCode:i})=>{i===500&&e.error(`Internal server error
3
3
  ${o.stack}
4
- `,{url:t.url,payload:r})},F=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[g]?.examples||[];if(!r&&t==="original")return o;let i=[];for(let s of o){let a=e.safeParse(s);a.success&&i.push(t==="parsed"?a.data:s)}return i},oe=(e,t,r)=>e.length&&t.length?(0,fe.xprod)(e,t).map(r):e.concat(t),je=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,At=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),v=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(At).join(""),Ge=e=>(0,rr.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),_e=(e,t)=>{try{return typeof e.parse(t)}catch{return}},K=e=>typeof e=="object"&&e!==null;var Ye=require("ramda"),g=Symbol.for("express-zod-api"),Qe=e=>{let t=e.describe(e.description);return t._def[g]=(0,Ye.clone)(t._def[g])||{examples:[]},t},ir=(e,t)=>{if(!(g in e._def))return t;let r=Qe(t);return r._def[g].examples=oe(r._def[g].examples,e._def[g].examples,([o,i])=>typeof o=="object"&&typeof i=="object"?(0,Ye.mergeDeepRight)({...o},{...i}):i),r};var Lo=function(e){let t=Qe(this);return t._def[g].examples.push(e),t},jo=function(e){let t=Qe(this);return t._def[g].defaultLabel=e,t},Do=function(e){return new De.z.ZodBranded({typeName:De.z.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[g]:{examples:[],...(0,sr.clone)(this._def[g]),brand:e}})};g in globalThis||(globalThis[g]=!0,Object.defineProperties(De.z.ZodType.prototype,{example:{get(){return Lo.bind(this)}},brand:{set(){},get(){return Do.bind(this)}}}),Object.defineProperty(De.z.ZodDefault.prototype,"label",{get(){return jo.bind(this)}}));function ar(e){return e}var Et=R(require("assert/strict"),1),rt=require("zod");var pr=require("zod"),ge={positive:200,negative:400},Pt=(e,t)=>e instanceof pr.z.ZodType?[{...t,schema:e}]:(Array.isArray(e)?e:[e]).map(({schema:r,statusCodes:o,statusCode:i,mimeTypes:s,mimeType:a})=>({schema:r,statusCodes:i?[i]:o||t.statusCodes,mimeTypes:a?[a]:s||t.mimeTypes}));var gr=require("zod");var lr=require("zod");var ke=require("zod"),Y=Symbol("File"),dr=ke.z.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),ko={buffer:()=>dr.brand(Y),string:()=>ke.z.string().brand(Y),binary:()=>dr.or(ke.z.string()).brand(Y),base64:()=>ke.z.string().base64().brand(Y)};function Je(e){return ko[e||"string"]()}var ne=Symbol("Raw"),cr=lr.z.object({raw:Je("buffer")});function mr(e){return(e?cr.extend(e):cr).brand(ne)}var ur=require("zod"),He=Symbol("Upload"),fr=()=>ur.z.custom(e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.encoding=="string"&&typeof e.mimetype=="string"&&Buffer.isBuffer(e.data)&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",e=>({message:`Expected file upload, received ${typeof e}`})).brand(He);var Ct=(e,{next:t})=>e.options.some(t),hr=({_def:e},{next:t})=>[e.left,e.right].some(t),yr=(e,{next:t})=>t(e.unwrap()),Ho={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:Ct,ZodDiscriminatedUnion:Ct,ZodIntersection:hr,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:yr,ZodNullable:yr,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},We=(e,{condition:t,rules:r=Ho,depth:o=1,maxDepth:i=Number.POSITIVE_INFINITY})=>{if(t(e))return!0;let s=o<i?r[e._def.typeName]:void 0;return s?s(e,{next:a=>We(a,{condition:t,rules:r,maxDepth:i,depth:o+1})}):!1},Xe=e=>We(e,{maxDepth:3,rules:{ZodUnion:Ct,ZodIntersection:hr},condition:t=>t instanceof gr.z.ZodEffects&&t._def.effect.type!=="refinement"}),xr=e=>We(e,{condition:t=>t._def[g]?.brand===He}),br=e=>We(e,{condition:t=>t._def[g]?.brand===ne,maxDepth:3});var et=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
- Original error: ${e.originalError.message}.`:""))};var Tr=require("ramda");var ie=e=>K(e)&&"or"in e,xe=e=>K(e)&&"and"in e,It=e=>({and:(0,Tr.chain)(t=>xe(t)?t.and:[t],e)}),tt=(e,t)=>xe(e)?{and:e.and.map(r=>ie(r)?{or:r.or.map(t)}:t(r))}:ie(e)?{or:e.or.map(r=>xe(r)?{and:r.and.map(t)}:t(r))}:t(e),wt=e=>e.and.reduce((t,r)=>({or:oe(t.or,ie(r)?r.or:[r],It)}),{or:[]}),he=(e,t)=>xe(e)?ie(t)?he(wt(e),t):It([e,t]):ie(e)?xe(t)?he(t,e):ie(t)?{or:oe(e.or,t.or,It)}:he(e,{and:[t]}):xe(t)||ie(t)?he(t,e):{and:[e,t]};var se=class{},ot=class extends se{#e;#o;#n;#s;#t;#a;#p;#r;#d;#c;#l;#i;constructor({methods:t,inputSchema:r,outputSchema:o,handler:i,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:c=[],tags:l=[],description:m,shortDescription:y}){super(),this.#a=i,this.#p=s,this.#n=c,this.#l=a,this.#o=Object.freeze(t),this.#d=Object.freeze(p),this.#c=Object.freeze(l),this.#e={long:m,short:y},this.#r={input:r,output:o};for(let[u,x]of Object.entries(this.#r))(0,Et.default)(!Xe(x),new G(`Using transformations on the top level of endpoint ${u} schema is not allowed.`));this.#t={positive:Object.freeze(Pt(s.getPositiveResponse(o),{mimeTypes:[M.json],statusCodes:[ge.positive]})),negative:Object.freeze(Pt(s.getNegativeResponse(),{mimeTypes:[M.json],statusCodes:[ge.negative]}))};for(let[u,x]of Object.entries(this.#t))(0,Et.default)(x.length,new te(`ResultHandler must have at least one ${u} response schema specified.`));this.#i=xr(r)?"upload":br(r)?"raw":"json",this.#s={input:Object.freeze([M[this.#i]]),positive:Object.freeze(this.#t.positive.flatMap(({mimeTypes:u})=>u)),negative:Object.freeze(this.#t.negative.flatMap(({mimeTypes:u})=>u))}}getDescription(t){return this.#e[t]}getMethods(){return this.#o}getSchema(t){return t==="input"||t==="output"?this.#r[t]:this.getResponses(t).map(({schema:r})=>r).reduce((r,o)=>r.or(o))}getMimeTypes(t){return this.#s[t]}getRequestType(){return this.#i}getResponses(t){return this.#t[t]}getSecurity(){return this.#n.reduce((t,r)=>r.security?he(t,r.security):t,{and:[]})}getScopes(){return this.#d}getTags(){return this.#c}getOperationId(t){return this.#l(t)}#m(t){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#o.concat(t).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#r.output.parseAsync(t)}catch(r){throw r instanceof rt.z.ZodError?new _(r):r}}async#f({method:t,input:r,request:o,response:i,logger:s,options:a}){for(let p of this.#n){if(t==="options"&&p.type==="proprietary")continue;let c;try{c=await p.input.parseAsync(r)}catch(l){throw l instanceof rt.z.ZodError?new H(l):l}if(Object.assign(a,await p.middleware({input:c,options:a,request:o,response:i,logger:s})),i.writableEnded){s.warn(`The middleware ${p.middleware.name} has closed the stream. Accumulated options:`,a);break}}}async#y({input:t,options:r,logger:o}){let i;try{i=await this.#r.input.parseAsync(t)}catch(s){throw s instanceof rt.z.ZodError?new H(s):s}return this.#a({input:i,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:i,input:s,output:a,options:p}){try{await this.#p.handler({error:t,output:a,request:r,response:o,logger:i,input:s,options:p})}catch(c){et({logger:i,response:o,error:new te(ye(c).message,t)})}}async execute({request:t,response:r,logger:o,config:i,siblingMethods:s=[]}){let a=St(t),p={},c=null,l=null;if(i.cors){let y=this.#m(s);typeof i.cors=="function"&&(y=await i.cors({request:t,logger:o,endpoint:this,defaultHeaders:y}));for(let u in y)r.set(u,y[u])}let m=nr(t,i.inputSources);try{if(await this.#f({method:a,input:m,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}c=await this.#u(await this.#y({input:m,logger:o,options:p}))}catch(y){l=ye(y)}await this.#g({input:m,output:c,request:t,response:r,error:l,logger:o,options:p})}};var zt=require("zod");var Sr=(e,t)=>{let r=e.map(({input:i})=>i).concat(t),o=r.reduce((i,s)=>i.and(s));return r.reduce((i,s)=>ir(s,i),o)};var Rr=R(require("assert/strict"),1),nt=e=>((0,Rr.default)(!Xe(e.input),new G("Using transformations on the top level of middleware input schema is not allowed.")),{...e,type:"proprietary"});var L=require("zod");var it=e=>e,be=it({getPositiveResponse:e=>{let t=F({schema:e}),r=L.z.object({status:L.z.literal("success"),data:e});return t.reduce((o,i)=>o.example({status:"success",data:i}),r)},getNegativeResponse:()=>L.z.object({status:L.z.literal("error"),error:L.z.object({message:L.z.string()})}).example({status:"error",error:{message:U(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:i,logger:s})=>{if(!e){i.status(ge.positive).json({status:"success",data:r});return}let a=Le(e);Ot({logger:s,statusCode:a,request:o,error:e,input:t}),i.status(a).json({status:"error",error:{message:U(e)}})}}),st=it({getPositiveResponse:e=>{let t=F({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof L.z.ZodArray?e.shape.items:L.z.array(L.z.any());return t.reduce((o,i)=>K(i)&&"items"in i&&Array.isArray(i.items)?o.example(i.items):o,r)},getNegativeResponse:()=>L.z.string().example(U(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:i,input:s})=>{if(r){let a=Le(r);Ot({logger:o,statusCode:a,request:i,error:r,input:s}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(ge.positive).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}});var Te=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),i=r?.provider||(()=>({})),s={type:"express",input:zt.z.object({}),middleware:async({request:a,response:p})=>new Promise((c,l)=>{t(a,p,y=>{if(y&&y instanceof Error)return l(o(y));c(i(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(nt({input:zt.z.object({}),middleware:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:i,shortDescription:s,operationId:a,...p}){let{middlewares:c,resultHandler:l}=this,m="methods"in p?p.methods:[p.method],y=typeof a=="function"?a:()=>a,u="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],x="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new ot({handler:r,middlewares:c,outputSchema:o,resultHandler:l,scopes:u,tags:x,methods:m,getOperationId:y,description:i,shortDescription:s,inputSchema:Sr(c,t)})}},Or=new Te(be),Ar=new Te(st);var w=require("ansis"),Cr=require("util");var at={debug:10,info:20,warn:30,error:40},Pr=e=>K(e)&&Object.keys(at).some(t=>t in e);var ae=class e{constructor(t){this.config=t;let{color:r=new w.Ansis().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:w.blue,info:w.green,warn:(0,w.hex)("#FFA500"),error:w.red};prettyPrint(t){let{depth:r=2}=this.config;return(0,Cr.inspect)(t,{depth:r,colors:this.hasColor,breakLength:this.config.level==="debug"?80:1/0,compact:this.config.level==="debug"?3:!0})}print(t,r,o){if(this.config.level==="silent"||at[t]<at[this.config.level])return;let{requestId:i,...s}=this.config.ctx||{},a=[new Date().toISOString()];i&&a.push(this.hasColor?(0,w.cyanBright)(i):i),a.push(this.hasColor?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&a.push(this.prettyPrint(o)),Object.keys(s).length>0&&a.push(this.prettyPrint(s)),console.log(a.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}},Ir=e=>new ae(e);var Re=require("ramda"),Se=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze((0,Re.toPairs)(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=(0,Re.head)(this.pairs)?.[1],this.siblingMethods=Object.freeze((0,Re.tail)(this.pairs).map(([r])=>r))}};var wr=R(require("express"),1),Oe=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,wr.default.static(...this.params))}};var pt=R(require("express"),1),jr=R(require("http"),1),Dr=R(require("https"),1);var pe=async(e,t="default")=>{try{return(await Promise.resolve().then(()=>R(require(e))))[t]}catch{}throw new re(e)},Er=async e=>{for(let{moduleName:t,moduleExport:r}of e)try{return await pe(t,r)}catch{}throw new re(e.map(({moduleName:t})=>t))};var Zt=R(require("assert/strict"),1);var de=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:i})=>{let s=Object.entries(e).map(([a,p])=>[a.trim(),p]);for(let[a,p]of s){Zt.default.doesNotMatch(a,/\//,new ee(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let c=`${o||""}${a?`/${a}`:""}`;if(p instanceof se){let l=p.getMethods().slice();i&&l.push("options");for(let m of l)t(p,c,m)}else if(p instanceof Oe)r&&p.apply(c,r);else if(p instanceof Se){for(let[l,m]of p.pairs)(0,Zt.default)(m.getMethods().includes(l),new ee(`Endpoint assigned to ${l} method of ${c} must support ${l} method.`)),t(m,c,l);i&&p.firstEndpoint&&t(p.firstEndpoint,c,"options",p.siblingMethods)}else de({onEndpoint:t,onStatic:r,hasCors:i,routing:p,parentPath:c})}};var Nt=({app:e,rootLogger:t,config:r,routing:o,parsers:i})=>de({routing:o,hasCors:!!r.cors,onEndpoint:(s,a,p,c)=>{e[p](a,...i?.[s.getRequestType()]||[],async(l,m)=>s.execute({request:l,response:m,logger:m.locals[g]?.logger||t,config:r,siblingMethods:c}))},onStatic:(s,a)=>{e.use(s,a)}});var Ue=R(require("http-errors"),1);var zr=({errorHandler:e,rootLogger:t})=>async(r,o,i,s)=>{if(!r)return s();e.handler({error:(0,Ue.isHttpError)(r)?r:(0,Ue.default)(400,ye(r).message),request:o,response:i,input:null,output:null,options:{},logger:i.locals[g]?.logger||t})},Zr=({errorHandler:e,rootLogger:t})=>async(r,o)=>{let i=(0,Ue.default)(404,`Can not ${r.method} ${r.path}`),s=o.locals[g]?.logger||t;try{e.handler({request:r,response:o,logger:s,error:i,input:null,output:null,options:{}})}catch(a){et({response:o,logger:s,error:new te(ye(a).message,i)})}},Uo=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:i})=>i))return r(e);r()},Fo=e=>({log:e.debug.bind(e)}),Nr=async({rootLogger:e,config:t})=>{let r=await pe("express-fileupload"),{limitError:o,beforeUpload:i,...s}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,c,l)=>{let m=c.locals[g]?.logger||e;try{await i?.({request:p,logger:m})}catch(y){return l(y)}r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Fo(m)})(p,c,l)}),o&&a.push(Uo(o)),a},Mr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},vr=({rootLogger:e,config:t})=>async(r,o,i)=>{let s=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;s.debug(`${r.method}: ${r.path}`),o.locals[g]={logger:s},i()};var E=require("ansis"),Lr=()=>{let e=(0,E.italic)("Proudly supports transgender community.".padStart(109)),t=(0,E.italic)("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=(0,E.italic)("Thank you for choosing Express Zod API for your project.".padStart(132)),o=(0,E.italic)("for Dime".padEnd(20)),i=(0,E.hex)("#F5A9B8"),s=(0,E.hex)("#5BCEFA"),a=new Array(14).fill(s,1,3).fill(i,3,5).fill(E.whiteBright,5,7).fill(i,7,9).fill(s,9,12).fill(E.gray,12,13);return`
4
+ `,{url:t.url,payload:r})},F=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[g]?.examples||[];if(!r&&t==="original")return o;let i=[];for(let s of o){let a=e.safeParse(s);a.success&&i.push(t==="parsed"?a.data:s)}return i},oe=(e,t,r)=>e.length&&t.length?(0,fe.xprod)(e,t).map(r):e.concat(t),je=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,Ot=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),v=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(Ot).join(""),Ve=e=>(0,tr.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ge=(e,t)=>{try{return typeof e.parse(t)}catch{return}},K=e=>typeof e=="object"&&e!==null;var _e=require("ramda"),g=Symbol.for("express-zod-api"),Ye=e=>{let t=e.describe(e.description);return t._def[g]=(0,_e.clone)(t._def[g])||{examples:[]},t},nr=(e,t)=>{if(!(g in e._def))return t;let r=Ye(t);return r._def[g].examples=oe(r._def[g].examples,e._def[g].examples,([o,i])=>typeof o=="object"&&typeof i=="object"?(0,_e.mergeDeepRight)({...o},{...i}):i),r};var Lo=function(e){let t=Ye(this);return t._def[g].examples.push(e),t},jo=function(e){let t=Ye(this);return t._def[g].defaultLabel=e,t},Do=function(e){return new De.z.ZodBranded({typeName:De.z.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[g]:{examples:[],...(0,ir.clone)(this._def[g]),brand:e}})};g in globalThis||(globalThis[g]=!0,Object.defineProperties(De.z.ZodType.prototype,{example:{get(){return Lo.bind(this)}},brand:{set(){},get(){return Do.bind(this)}}}),Object.defineProperty(De.z.ZodDefault.prototype,"label",{get(){return jo.bind(this)}}));function sr(e){return e}var wt=R(require("assert/strict"),1),tt=require("zod");var ar=require("zod"),ge={positive:200,negative:400},At=(e,t)=>e instanceof ar.z.ZodType?[{...t,schema:e}]:(Array.isArray(e)?e:[e]).map(({schema:r,statusCodes:o,statusCode:i,mimeTypes:s,mimeType:a})=>({schema:r,statusCodes:i?[i]:o||t.statusCodes,mimeTypes:a?[a]:s||t.mimeTypes}));var yr=require("zod");var cr=require("zod");var ke=require("zod"),Y=Symbol("File"),pr=ke.z.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),ko={buffer:()=>pr.brand(Y),string:()=>ke.z.string().brand(Y),binary:()=>pr.or(ke.z.string()).brand(Y),base64:()=>ke.z.string().base64().brand(Y)};function Qe(e){return ko[e||"string"]()}var ne=Symbol("Raw"),dr=cr.z.object({raw:Qe("buffer")});function lr(e){return(e?dr.extend(e):dr).brand(ne)}var mr=require("zod"),He=Symbol("Upload"),ur=()=>mr.z.custom(e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.encoding=="string"&&typeof e.mimetype=="string"&&Buffer.isBuffer(e.data)&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",e=>({message:`Expected file upload, received ${typeof e}`})).brand(He);var Pt=(e,{next:t})=>e.options.some(t),gr=({_def:e},{next:t})=>[e.left,e.right].some(t),fr=(e,{next:t})=>t(e.unwrap()),Ho={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:Pt,ZodDiscriminatedUnion:Pt,ZodIntersection:gr,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:fr,ZodNullable:fr,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},Je=(e,{condition:t,rules:r=Ho,depth:o=1,maxDepth:i=Number.POSITIVE_INFINITY})=>{if(t(e))return!0;let s=o<i?r[e._def.typeName]:void 0;return s?s(e,{next:a=>Je(a,{condition:t,rules:r,maxDepth:i,depth:o+1})}):!1},We=e=>Je(e,{maxDepth:3,rules:{ZodUnion:Pt,ZodIntersection:gr},condition:t=>t instanceof yr.z.ZodEffects&&t._def.effect.type!=="refinement"}),hr=e=>Je(e,{condition:t=>t._def[g]?.brand===He}),xr=e=>Je(e,{condition:t=>t._def[g]?.brand===ne,maxDepth:3});var Xe=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
+ Original error: ${e.originalError.message}.`:""))};var br=require("ramda");var ie=e=>K(e)&&"or"in e,xe=e=>K(e)&&"and"in e,Ct=e=>({and:(0,br.chain)(t=>xe(t)?t.and:[t],e)}),et=(e,t)=>xe(e)?{and:e.and.map(r=>ie(r)?{or:r.or.map(t)}:t(r))}:ie(e)?{or:e.or.map(r=>xe(r)?{and:r.and.map(t)}:t(r))}:t(e),It=e=>e.and.reduce((t,r)=>({or:oe(t.or,ie(r)?r.or:[r],Ct)}),{or:[]}),he=(e,t)=>xe(e)?ie(t)?he(It(e),t):Ct([e,t]):ie(e)?xe(t)?he(t,e):ie(t)?{or:oe(e.or,t.or,Ct)}:he(e,{and:[t]}):xe(t)||ie(t)?he(t,e):{and:[e,t]};var se=class{},rt=class extends se{#e;#o;#n;#s;#t;#a;#p;#r;#d;#c;#l;#i;constructor({methods:t,inputSchema:r,outputSchema:o,handler:i,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:c=[],tags:l=[],description:m,shortDescription:y}){super(),this.#a=i,this.#p=s,this.#n=c,this.#l=a,this.#o=Object.freeze(t),this.#d=Object.freeze(p),this.#c=Object.freeze(l),this.#e={long:m,short:y},this.#r={input:r,output:o};for(let[u,x]of Object.entries(this.#r))(0,wt.default)(!We(x),new G(`Using transformations on the top level of endpoint ${u} schema is not allowed.`));this.#t={positive:Object.freeze(At(s.getPositiveResponse(o),{mimeTypes:[M.json],statusCodes:[ge.positive]})),negative:Object.freeze(At(s.getNegativeResponse(),{mimeTypes:[M.json],statusCodes:[ge.negative]}))};for(let[u,x]of Object.entries(this.#t))(0,wt.default)(x.length,new te(`ResultHandler must have at least one ${u} response schema specified.`));this.#i=hr(r)?"upload":xr(r)?"raw":"json",this.#s={input:Object.freeze([M[this.#i]]),positive:Object.freeze(this.#t.positive.flatMap(({mimeTypes:u})=>u)),negative:Object.freeze(this.#t.negative.flatMap(({mimeTypes:u})=>u))}}getDescription(t){return this.#e[t]}getMethods(){return this.#o}getSchema(t){return t==="input"||t==="output"?this.#r[t]:this.getResponses(t).map(({schema:r})=>r).reduce((r,o)=>r.or(o))}getMimeTypes(t){return this.#s[t]}getRequestType(){return this.#i}getResponses(t){return this.#t[t]}getSecurity(){return this.#n.reduce((t,r)=>r.security?he(t,r.security):t,{and:[]})}getScopes(){return this.#d}getTags(){return this.#c}getOperationId(t){return this.#l(t)}#m(t){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#o.concat(t).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#r.output.parseAsync(t)}catch(r){throw r instanceof tt.z.ZodError?new _(r):r}}async#f({method:t,input:r,request:o,response:i,logger:s,options:a}){for(let p of this.#n){if(t==="options"&&p.type==="proprietary")continue;let c;try{c=await p.input.parseAsync(r)}catch(l){throw l instanceof tt.z.ZodError?new H(l):l}if(Object.assign(a,await p.middleware({input:c,options:a,request:o,response:i,logger:s})),i.writableEnded){s.warn(`The middleware ${p.middleware.name} has closed the stream. Accumulated options:`,a);break}}}async#y({input:t,options:r,logger:o}){let i;try{i=await this.#r.input.parseAsync(t)}catch(s){throw s instanceof tt.z.ZodError?new H(s):s}return this.#a({input:i,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:i,input:s,output:a,options:p}){try{await this.#p.handler({error:t,output:a,request:r,response:o,logger:i,input:s,options:p})}catch(c){Xe({logger:i,response:o,error:new te(ye(c).message,t)})}}async execute({request:t,response:r,logger:o,config:i,siblingMethods:s=[]}){let a=Tt(t),p={},c=null,l=null;if(i.cors){let y=this.#m(s);typeof i.cors=="function"&&(y=await i.cors({request:t,logger:o,endpoint:this,defaultHeaders:y}));for(let u in y)r.set(u,y[u])}let m=or(t,i.inputSources);try{if(await this.#f({method:a,input:m,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}c=await this.#u(await this.#y({input:m,logger:o,options:p}))}catch(y){l=ye(y)}await this.#g({input:m,output:c,request:t,response:r,error:l,logger:o,options:p})}};var Et=require("zod");var Tr=(e,t)=>{let r=e.map(({input:i})=>i).concat(t),o=r.reduce((i,s)=>i.and(s));return r.reduce((i,s)=>nr(s,i),o)};var Sr=R(require("assert/strict"),1),ot=e=>((0,Sr.default)(!We(e.input),new G("Using transformations on the top level of middleware input schema is not allowed.")),{...e,type:"proprietary"});var L=require("zod");var nt=e=>e,be=nt({getPositiveResponse:e=>{let t=F({schema:e}),r=L.z.object({status:L.z.literal("success"),data:e});return t.reduce((o,i)=>o.example({status:"success",data:i}),r)},getNegativeResponse:()=>L.z.object({status:L.z.literal("error"),error:L.z.object({message:L.z.string()})}).example({status:"error",error:{message:U(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:i,logger:s})=>{if(!e){i.status(ge.positive).json({status:"success",data:r});return}let a=Le(e);Rt({logger:s,statusCode:a,request:o,error:e,input:t}),i.status(a).json({status:"error",error:{message:U(e)}})}}),it=nt({getPositiveResponse:e=>{let t=F({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof L.z.ZodArray?e.shape.items:L.z.array(L.z.any());return t.reduce((o,i)=>K(i)&&"items"in i&&Array.isArray(i.items)?o.example(i.items):o,r)},getNegativeResponse:()=>L.z.string().example(U(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:i,input:s})=>{if(r){let a=Le(r);Rt({logger:o,statusCode:a,request:i,error:r,input:s}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(ge.positive).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}});var Te=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),i=r?.provider||(()=>({})),s={type:"express",input:Et.z.object({}),middleware:async({request:a,response:p})=>new Promise((c,l)=>{t(a,p,y=>{if(y&&y instanceof Error)return l(o(y));c(i(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(ot({input:Et.z.object({}),middleware:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:i,shortDescription:s,operationId:a,...p}){let{middlewares:c,resultHandler:l}=this,m="methods"in p?p.methods:[p.method],y=typeof a=="function"?a:()=>a,u="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],x="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new rt({handler:r,middlewares:c,outputSchema:o,resultHandler:l,scopes:u,tags:x,methods:m,getOperationId:y,description:i,shortDescription:s,inputSchema:Tr(c,t)})}},Rr=new Te(be),Or=new Te(it);var w=require("ansis"),Pr=require("util");var st={debug:10,info:20,warn:30,error:40},Ar=e=>K(e)&&Object.keys(st).some(t=>t in e);var ae=class e{constructor(t){this.config=t;let{color:r=new w.Ansis().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:w.blue,info:w.green,warn:(0,w.hex)("#FFA500"),error:w.red};prettyPrint(t){let{depth:r=2}=this.config;return(0,Pr.inspect)(t,{depth:r,colors:this.hasColor,breakLength:this.config.level==="debug"?80:1/0,compact:this.config.level==="debug"?3:!0})}print(t,r,o){if(this.config.level==="silent"||st[t]<st[this.config.level])return;let{requestId:i,...s}=this.config.ctx||{},a=[new Date().toISOString()];i&&a.push(this.hasColor?(0,w.cyanBright)(i):i),a.push(this.hasColor?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&a.push(this.prettyPrint(o)),Object.keys(s).length>0&&a.push(this.prettyPrint(s)),console.log(a.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}},Cr=e=>new ae(e);var Re=require("ramda"),Se=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze((0,Re.toPairs)(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=(0,Re.head)(this.pairs)?.[1],this.siblingMethods=Object.freeze((0,Re.tail)(this.pairs).map(([r])=>r))}};var Ir=R(require("express"),1),Oe=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Ir.default.static(...this.params))}};var at=R(require("express"),1),jr=R(require("http"),1),Dr=R(require("https"),1);var pe=async(e,t="default")=>{try{return(await Promise.resolve().then(()=>R(require(e))))[t]}catch{}throw new re(e)},wr=async e=>{for(let{moduleName:t,moduleExport:r}of e)try{return await pe(t,r)}catch{}throw new re(e.map(({moduleName:t})=>t))};var zt=R(require("assert/strict"),1);var de=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:i})=>{let s=Object.entries(e).map(([a,p])=>[a.trim(),p]);for(let[a,p]of s){zt.default.doesNotMatch(a,/\//,new ee(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let c=`${o||""}${a?`/${a}`:""}`;if(p instanceof se){let l=p.getMethods().slice();i&&l.push("options");for(let m of l)t(p,c,m)}else if(p instanceof Oe)r&&p.apply(c,r);else if(p instanceof Se){for(let[l,m]of p.pairs)(0,zt.default)(m.getMethods().includes(l),new ee(`Endpoint assigned to ${l} method of ${c} must support ${l} method.`)),t(m,c,l);i&&p.firstEndpoint&&t(p.firstEndpoint,c,"options",p.siblingMethods)}else de({onEndpoint:t,onStatic:r,hasCors:i,routing:p,parentPath:c})}};var Zt=({app:e,rootLogger:t,config:r,routing:o,parsers:i})=>de({routing:o,hasCors:!!r.cors,onEndpoint:(s,a,p,c)=>{e[p](a,...i?.[s.getRequestType()]||[],async(l,m)=>s.execute({request:l,response:m,logger:m.locals[g]?.logger||t,config:r,siblingMethods:c}))},onStatic:(s,a)=>{e.use(s,a)}});var Er=R(require("http-errors"),1);var zr=({errorHandler:e,rootLogger:t})=>async(r,o,i,s)=>r?e.handler({error:ye(r),request:o,response:i,input:null,output:null,options:{},logger:i.locals[g]?.logger||t}):s(),Zr=({errorHandler:e,rootLogger:t})=>async(r,o)=>{let i=(0,Er.default)(404,`Can not ${r.method} ${r.path}`),s=o.locals[g]?.logger||t;try{e.handler({request:r,response:o,logger:s,error:i,input:null,output:null,options:{}})}catch(a){Xe({response:o,logger:s,error:new te(ye(a).message,i)})}},Uo=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:i})=>i))return r(e);r()},Fo=e=>({log:e.debug.bind(e)}),Nr=async({rootLogger:e,config:t})=>{let r=await pe("express-fileupload"),{limitError:o,beforeUpload:i,...s}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,c,l)=>{let m=c.locals[g]?.logger||e;try{await i?.({request:p,logger:m})}catch(y){return l(y)}r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Fo(m)})(p,c,l)}),o&&a.push(Uo(o)),a},Mr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},vr=({rootLogger:e,config:t})=>async(r,o,i)=>{let s=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;s.debug(`${r.method}: ${r.path}`),o.locals[g]={logger:s},i()};var E=require("ansis"),Lr=()=>{let e=(0,E.italic)("Proudly supports transgender community.".padStart(109)),t=(0,E.italic)("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=(0,E.italic)("Thank you for choosing Express Zod API for your project.".padStart(132)),o=(0,E.italic)("for Dime".padEnd(20)),i=(0,E.hex)("#F5A9B8"),s=(0,E.hex)("#5BCEFA"),a=new Array(14).fill(s,1,3).fill(i,3,5).fill(E.whiteBright,5,7).fill(i,7,9).fill(s,9,12).fill(E.gray,12,13);return`
6
6
  8888888888 8888888888P 888 d8888 8888888b. 8888888
7
7
  888 d88P 888 d88888 888 Y88b 888
8
8
  888 d88P 888 d88P888 888 888 888
@@ -17,8 +17,8 @@ ${o}888${t}
17
17
  ${r}
18
18
  `.split(`
19
19
  `).map((c,l)=>a[l]?a[l](c):c).join(`
20
- `)};var kr=e=>{e.startupLogo!==!1&&console.log(Lr());let t=e.errorHandler||be,r=Pr(e.logger)?e.logger:new ae(e.logger);r.debug("Running","v19.3.1 (CJS)");let o=vr({rootLogger:r,config:e}),i=Zr({rootLogger:r,errorHandler:t}),s=zr({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:i,parserFailureHandler:s,loggingMiddleware:o}},Hr=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:i}=kr(e);return Nt({app:e.app.use(i),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},Ur=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,parserFailureHandler:i,loggingMiddleware:s}=kr(e),a=(0,pt.default)().disable("x-powered-by").use(s);if(e.server.compression){let m=await pe("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(),Mr],upload:e.server.upload?await Nr({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 c=(m,y)=>m.listen(y,()=>{r.info("Listening",y)}),l={httpServer:c(jr.default.createServer(a),e.server.listen),httpsServer:e.https?c(Dr.default.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...l,logger:r}};var io=R(require("assert/strict"),1),so=require("openapi3-ts/oas31"),ao=require("ramda");var B=R(require("assert/strict"),1),q=require("openapi3-ts/oas31"),d=require("ramda"),S=require("zod");var Ae=require("zod");var dt=e=>!isNaN(e.getTime());var Fe=Symbol("DateIn"),Fr=()=>Ae.z.union([Ae.z.string().date(),Ae.z.string().datetime(),Ae.z.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Ae.z.date().refine(dt)).brand(Fe);var Kr=require("zod");var Ke=Symbol("DateOut"),Br=()=>Kr.z.date().refine(dt).transform(e=>e.toISOString()).brand(Ke);var ce=(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=>ce(l,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),c=t&&t(e,{prev:p,...i});return c?{...p,...c}:p};var qr=50,Vr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Ko={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Gr=/:([A-Za-z0-9_]+)/g,Bo=e=>e.match(Gr)?.map(t=>t.slice(1))||[],_r=e=>e.replace(Gr,t=>`{${t.slice(1)}}`),qo=({_def:e},{next:t})=>({...t(e.innerType),default:e[g]?.defaultLabel||e.defaultValue()}),$o=({_def:{innerType:e}},{next:t})=>t(e),Vo=()=>({format:"any"}),Go=({},e)=>((0,B.default)(!e.isResponse,new P({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),_o=e=>{let t=e.unwrap();return{type:"string",format:t instanceof S.z.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Yo=({options:e},{next:t})=>({oneOf:e.map(t)}),Qo=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),Jo=e=>{let[t,r]=e.filter(q.isSchemaObject).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));(0,B.default)(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,d.mergeDeepWith)((i,s)=>Array.isArray(i)&&Array.isArray(s)?(0,d.concat)(i,s):i===s?s:B.default.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,d.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=oe(t.examples||[],r.examples||[],([i,s])=>(0,d.mergeDeepRight)(i,s))),o},Wo=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Jo(o)}catch{}return{allOf:o}},Xo=(e,{next:t})=>t(e.unwrap()),en=(e,{next:t})=>t(e.unwrap()),tn=(e,{next:t})=>{let r=t(e.unwrap());return(0,q.isSchemaObject)(r)&&(r.type=Qr(r)),r},Yr=e=>{let t=(0,d.toLower)((0,d.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},$r=e=>({type:Yr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),rn=({value:e})=>({type:Yr(e),const:e}),on=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&je(p)?p instanceof S.z.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=ct(e,r)),s.length&&(a.required=s),a},nn=()=>({type:"null"}),sn=({},e)=>((0,B.default)(!e.isResponse,new P({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:Vr}}),an=({},e)=>((0,B.default)(e.isResponse,new P({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Vr}}),pn=({},e)=>B.default.fail(new P({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})),dn=()=>({type:"boolean"}),cn=()=>({type:"integer",format:"bigint"}),ln=e=>e.every(t=>t instanceof S.z.ZodLiteral),mn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof S.z.ZodEnum||e instanceof S.z.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=ct(S.z.object((0,d.fromPairs)((0,d.xprod)(o,[t]))),r),i.required=o),i}if(e instanceof S.z.ZodLiteral)return{type:"object",properties:ct(S.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof S.z.ZodUnion&&ln(e.options)){let o=(0,d.map)(s=>`${s.value}`,e.options),i=(0,d.fromPairs)((0,d.xprod)(o,[t]));return{type:"object",properties:ct(S.z.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},un=({_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},fn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),yn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:c,isEmoji:l,isDatetime:m,_def:{checks:y}})=>{let u=y.find(C=>C.kind==="regex"),x=y.find(C=>C.kind==="datetime"),Z=u?u.regex:x?x.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"},j={"date-time":m,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:c,emoji:l};for(let C in j)if(j[C]){T.format=C;break}return r!==null&&(T.minLength=r),o!==null&&(T.maxLength=o),Z&&(T.pattern=Z.source),T},gn=({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"),c=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=c:m.exclusiveMaximum=c,m},ct=({shape:e},t)=>(0,d.map)(t,e),hn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Ko?.[t]},Qr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},xn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&(0,q.isSchemaObject)(o)){let s=_e(e,hn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(S.z.any())}if(!t&&i.type==="preprocess"&&(0,q.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},bn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Tn=(e,{next:t})=>t(e.unwrap()),Sn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},Rn=(e,{next:t})=>t(e.unwrap().shape.raw),Jr=e=>e.length?(0,d.fromPairs)((0,d.zip)((0,d.range)(1,e.length+1).map(t=>`example${t}`),(0,d.map)((0,d.objOf)("value"),e))):void 0,Wr=(e,t,r=[])=>(0,d.pipe)(F,(0,d.map)((0,d.when)((0,d.both)(K,(0,d.complement)(Array.isArray)),(0,d.omit)(r))),Jr)({schema:e,variant:t?"parsed":"original",validate:!0}),On=(e,t)=>(0,d.pipe)(F,(0,d.filter)((0,d.has)(t)),(0,d.pluck)(t),Jr)({schema:e,variant:"original",validate:!0}),Pe=(e,t)=>e instanceof S.z.ZodObject?e:e instanceof S.z.ZodBranded?Pe(e.unwrap(),t):e instanceof S.z.ZodUnion||e instanceof S.z.ZodDiscriminatedUnion?e.options.map(r=>Pe(r,t)).reduce((r,o)=>r.merge(o.partial()),S.z.object({})):e instanceof S.z.ZodEffects?((0,B.default)(e._def.effect.type==="refinement",t),Pe(e._def.schema,t)):Pe(e._def.left,t).merge(Pe(e._def.right,t)),Xr=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,description:l=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:m}=Pe(r,new P({message:"Using transformations on the top level schema is not allowed.",path:e,method:t,isResponse:!1})),y=Bo(e),u=o.includes("query"),x=o.includes("params"),Z=o.includes("headers"),T=b=>x&&y.includes(b),j=b=>Z&&Rt(b);return Object.keys(m).map(b=>({name:b,location:T(b)?"path":j(b)?"header":u?"query":void 0})).filter(b=>b.location!==void 0).map(({name:b,location:Ee})=>{let V=ce(m[b],{rules:{...c,...vt},onEach:Lt,onMissing:jt,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),W=p==="components"?a(v(l,b),V):V;return{name:b,in:Ee,required:!m[b].isOptional(),description:V.description||l,schema:W,examples:On(r,b)}})},vt={ZodString:yn,ZodNumber:gn,ZodBigInt:cn,ZodBoolean:dn,ZodNull:nn,ZodArray:un,ZodTuple:fn,ZodRecord:mn,ZodObject:on,ZodLiteral:rn,ZodIntersection:Wo,ZodUnion:Yo,ZodAny:Vo,ZodDefault:qo,ZodEnum:$r,ZodNativeEnum:$r,ZodEffects:xn,ZodOptional:Xo,ZodNullable:tn,ZodDiscriminatedUnion:Qo,ZodBranded:Tn,ZodDate:pn,ZodCatch:$o,ZodPipeline:bn,ZodLazy:Sn,ZodReadonly:en,[Y]:_o,[He]:Go,[Ke]:an,[Fe]:sn,[ne]:Rn},Lt=(e,{isResponse:t,prev:r})=>{if((0,q.isReferenceObject)(r))return{};let{description:o}=e,i=e instanceof S.z.ZodLazy,s=r.type!==void 0,a=t&&je(e),p=!i&&s&&!a&&e.isNullable(),c=i?[]:F({schema:e,variant:t?"parsed":"original",validate:!0}),l={};return o&&(l.description=o),p&&(l.type=Qr(r)),c.length&&(l.examples=c.slice()),l},jt=(e,t)=>B.default.fail(new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Mt=(e,t)=>{if((0,q.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,d.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,d.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Mt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Mt(o,t))),r},eo=e=>(0,q.isReferenceObject)(e)?e:(0,d.omit)(["examples"],e),to=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:c,hasMultipleStatusCodes:l,statusCode:m,brandHandling:y,description:u=`${e.toUpperCase()} ${t} ${At(i)} response ${l?m:""}`.trim()})=>{let x=eo(ce(r,{rules:{...y,...vt},onEach:Lt,onMissing:jt,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),Z={schema:c==="components"?p(v(u),x):x,examples:Wr(r,!0)};return{description:u,content:(0,d.fromPairs)((0,d.xprod)(o,[Z]))}},An=()=>({type:"http",scheme:"basic"}),Pn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Cn=({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}),wn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),En=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),zn=({flows:e={}})=>({type:"oauth2",flows:(0,d.map)(t=>({...t,scopes:t.scopes||{}}),(0,d.reject)(d.isNil,e))}),ro=(e,t)=>{let r={basic:An,bearer:Pn,input:Cn,header:In,cookie:wn,openid:En,oauth2:zn};return tt(e,o=>r[o.type](o,t))},lt=e=>"or"in e?e.or.map(t=>"and"in t?(0,d.mergeAll)((0,d.map)(({name:r,scopes:o})=>(0,d.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?lt(wt(e)):lt({or:[e]}),oo=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,paramNames:l,description:m=`${e.toUpperCase()} ${t} Request body`})=>{let y=eo(Mt(ce(r,{rules:{...c,...vt},onEach:Lt,onMissing:jt,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),l)),u={schema:p==="components"?a(v(m),y):y,examples:Wr(r,!1,l)};return{description:m,content:(0,d.fromPairs)((0,d.xprod)(o,[u]))}},no=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}),Dt=e=>e.length<=qr?e:e.slice(0,qr-1)+"\u2026";var mt=class extends so.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&&io.default.fail(new P({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:l="inline",serializer:m=Ge}){super(),this.addInfo({title:o,version:i});for(let u of typeof s=="string"?[s]:s)this.addServer({url:u});de({routing:t,onEndpoint:(u,x,Z)=>{let T=Z,j={path:x,method:T,endpoint:u,composition:l,serializer:m,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[C,b]=["short","long"].map(u.getDescription.bind(u)),Ee=C?Dt(C):c&&b?Dt(b):void 0,V=u.getTags(),W=r.inputSources?.[T]||Tt[T],me=this.ensureUniqOperationId(x,T,u.getOperationId(T)),ze=Xr({...j,inputSources:W,schema:u.getSchema("input"),description:a?.requestParameter?.call(null,{method:T,path:x,operationId:me})}),qe={};for(let k of["positive","negative"]){let X=u.getResponses(k);for(let{mimeTypes:Ze,schema:O,statusCodes:A}of X)for(let I of A)qe[I]=to({...j,variant:k,schema:O,mimeTypes:Ze,statusCode:I,hasMultipleStatusCodes:X.length>1||A.length>1,description:a?.[`${k}Response`]?.call(null,{method:T,path:x,operationId:me,statusCode:I})})}let bt=W.includes("body")?oo({...j,paramNames:(0,ao.pluck)("name",ze),schema:u.getSchema("input"),mimeTypes:u.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:T,path:x,operationId:me})}):void 0,$e=lt(tt(ro(u.getSecurity(),W),k=>{let X=this.ensureUniqSecuritySchemaName(k),Ze=["oauth2","openIdConnect"].includes(k.type)?u.getScopes().slice():[];return this.addSecurityScheme(X,k),{name:X,scopes:Ze}}));this.addPath(_r(x),{[T]:{operationId:me,summary:Ee,description:b,tags:V.length>0?V:void 0,parameters:ze.length>0?ze:void 0,requestBody:bt,security:$e.length>0?$e:void 0,responses:qe}})}}),this.rootDoc.tags=r.tags?no(r.tags):[]}};var kt=R(require("http"),1);var Zn=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>M.json),...t}),Nn=({fnMethod:e,responseProps:t})=>{let r={writableEnded:!1,statusCode:200,statusMessage:kt.default.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=kt.default.STATUS_CODES[o],r)),json:e(()=>r),send:e(()=>r),end:e(()=>(r.writableEnded=!0,r)),locals:{},...t};return r},Mn=({fnMethod:e,loggerProps:t})=>({info:e(),warn:e(),error:e(),debug:e(),...t}),po=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:i,fnMethod:s})=>{let a=s||(await Er([{moduleName:"vitest",moduleExport:"vi"},{moduleName:"@jest/globals",moduleExport:"jest"}])).fn,p=Zn({fnMethod:a,requestProps:t}),c=Nn({fnMethod:a,responseProps:r}),l=Mn({fnMethod:a,loggerProps:i}),m={cors:!1,logger:l,...o};return await e.execute({request:p,response:c,config:m,logger:l}),{requestMock:p,responseMock:c,loggerMock:l}};var z=R(require("typescript"),1);var D=R(require("typescript"),1),Ce=require("ramda"),n=D.default.factory,Q=[n.createModifier(D.default.SyntaxKind.ExportKeyword)],vn=[n.createModifier(D.default.SyntaxKind.AsyncKeyword)],Ln=[n.createModifier(D.default.SyntaxKind.PublicKeyword),n.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],co=[n.createModifier(D.default.SyntaxKind.ProtectedKeyword),n.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],Ht=n.createTemplateHead(""),Ie=n.createTemplateTail(""),Ut=n.createTemplateMiddle(" "),Ft=e=>n.createTemplateLiteralType(Ht,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?Ie:Ut))),Kt=Ft(["M","P"]),ut=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),ft=(e,t)=>(0,Ce.chain)(([r,o])=>[ut(n.createIdentifier(r),o,t)],(0,Ce.toPairs)(e)),Bt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),lo=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),mo=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),J=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],D.default.NodeFlags.Const),qt=(e,t)=>n.createTypeAliasDeclaration(Q,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),yt=(e,t)=>n.createTypeAliasDeclaration(Q,e,void 0,t),uo=(e,t,r)=>n.createPropertyDeclaration(Ln,e,void 0,t,r),fo=(e,t,r)=>n.createClassDeclaration(Q,e,void 0,void 0,[t,...r]),yo=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),go=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(D.default.SyntaxKind.AnyKeyword)]),ho=(e,t,r)=>n.createInterfaceDeclaration(Q,e,void 0,t,r),xo=e=>(0,Ce.chain)(([t,r])=>[n.createTypeParameterDeclaration([],t,n.createTypeReferenceNode(r))],(0,Ce.toPairs)(e)),$t=(e,t,r)=>n.createArrowFunction(r?vn:void 0,void 0,e.map(o=>ut(o)),void 0,void 0,t),Vt=(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,ft({acc:void 0,key:void 0}),void 0,void 0,t),r]),bo=(...e)=>`"${e.join(" ")}"`;var To=["get","post","put","delete","patch"];var h=R(require("typescript"),1),ht=require("zod");var $=R(require("typescript"),1),{factory:gt}=$.default,Gt=(e,t)=>{$.default.addSyntheticLeadingComment(e,$.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},we=(e,t,r)=>{let o=gt.createTypeAliasDeclaration(void 0,gt.createIdentifier(t),void 0,e);return r&&Gt(o,r),o},_t=(e,t)=>{let r=$.default.createSourceFile("print.ts","",$.default.ScriptTarget.Latest,!1,$.default.ScriptKind.TS);return $.default.createPrinter(t).printNode($.default.EmitHint.Unspecified,e,r)},jn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,So=e=>jn.test(e)?gt.createIdentifier(e):gt.createStringLiteral(e);var{factory:f}=h.default,Dn={[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},kn=({value:e})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Hn=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&je(a)?a instanceof ht.z.ZodOptional:a.isOptional(),c=f.createPropertySignature(void 0,So(s),p&&o?f.createToken(h.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Gt(c,a.description),c});return f.createTypeLiteralNode(i)},Un=({element:e},{next:t})=>f.createArrayTypeNode(t(e)),Fn=({options:e})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Ro=({options:e},{next:t})=>f.createUnionTypeNode(e.map(t)),Kn=e=>Dn?.[e.kind],Bn=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=_e(e,Kn(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 f.createKeywordTypeNode(i&&s[i]||h.default.SyntaxKind.AnyKeyword)}return o},qn=e=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),$n=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(h.default.SyntaxKind.UndefinedKeyword)]):o},Vn=(e,{next:t})=>f.createUnionTypeNode([t(e.unwrap()),f.createLiteralTypeNode(f.createNull())]),Gn=({items:e,_def:{rest:t}},{next:r})=>f.createTupleTypeNode(e.map(r).concat(t===null?[]:f.createRestTypeNode(r(t)))),_n=({keySchema:e,valueSchema:t},{next:r})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e,t].map(r)),Yn=({_def:e},{next:t})=>f.createIntersectionTypeNode([e.left,e.right].map(t)),Qn=({_def:e},{next:t})=>t(e.innerType),le=e=>()=>f.createKeywordTypeNode(e),Jn=(e,{next:t})=>t(e.unwrap()),Wn=(e,{next:t})=>t(e.unwrap()),Xn=({_def:e},{next:t})=>t(e.innerType),ei=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ti=()=>f.createLiteralTypeNode(f.createNull()),ri=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:i})=>{let s=`Type${i(e)}`;return t(s)||(r(s,f.createLiteralTypeNode(f.createNull())),r(s,o(e)))},oi=e=>{let t=e.unwrap(),r=f.createKeywordTypeNode(h.default.SyntaxKind.StringKeyword),o=f.createTypeReferenceNode("Buffer"),i=f.createUnionTypeNode([r,o]);return t instanceof ht.z.ZodString?r:t instanceof ht.z.ZodUnion?i:o},ni=(e,{next:t})=>t(e.unwrap().shape.raw),ii={ZodString:le(h.default.SyntaxKind.StringKeyword),ZodNumber:le(h.default.SyntaxKind.NumberKeyword),ZodBigInt:le(h.default.SyntaxKind.BigIntKeyword),ZodBoolean:le(h.default.SyntaxKind.BooleanKeyword),ZodAny:le(h.default.SyntaxKind.AnyKeyword),[Fe]:le(h.default.SyntaxKind.StringKeyword),[Ke]:le(h.default.SyntaxKind.StringKeyword),ZodNull:ti,ZodArray:Un,ZodTuple:Gn,ZodRecord:_n,ZodObject:Hn,ZodLiteral:kn,ZodIntersection:Yn,ZodUnion:Ro,ZodDefault:Qn,ZodEnum:Fn,ZodNativeEnum:qn,ZodEffects:Bn,ZodOptional:$n,ZodNullable:Vn,ZodDiscriminatedUnion:Ro,ZodBranded:Jn,ZodCatch:Xn,ZodPipeline:ei,ZodLazy:ri,ZodReadonly:Wn,[Y]:oi,[ne]:ni},Be=(e,{brandHandling:t,ctx:r})=>ce(e,{rules:{...t,...ii},onMissing:()=>f.createKeywordTypeNode(h.default.SyntaxKind.AnyKeyword),ctx:r});var xt=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,we(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=Ge,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){de({routing:t,onEndpoint:(O,A,I)=>{let ue={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},Ne=v(I,A,"input"),Me=Be(O.getSchema("input"),{brandHandling:r,ctx:{...ue,isResponse:!1}}),N=s?v(I,A,"positive.response"):void 0,Yt=O.getSchema("positive"),Qt=s?Be(Yt,{brandHandling:r,ctx:{...ue,isResponse:!0}}):void 0,ve=s?v(I,A,"negative.response"):void 0,Jt=O.getSchema("negative"),Wt=s?Be(Jt,{brandHandling:r,ctx:{...ue,isResponse:!0}}):void 0,Xt=v(I,A,"response"),Ao=N&&ve?n.createUnionTypeNode([n.createTypeReferenceNode(N),n.createTypeReferenceNode(ve)]):Be(Yt.or(Jt),{brandHandling:r,ctx:{...ue,isResponse:!0}});this.program.push(we(Me,Ne)),Qt&&N&&this.program.push(we(Qt,N)),Wt&&ve&&this.program.push(we(Wt,ve)),this.program.push(we(Ao,Xt)),I!=="options"&&(this.paths.push(A),this.registry.set({method:I,path:A},{input:Ne,positive:N,negative:ve,response:Xt,isJson:O.getMimeTypes("positive").includes(M.json),tags:O.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(qt(this.ids.pathType,this.paths)),this.program.push(qt(this.ids.methodType,To)),this.program.push(yt(this.ids.methodPathType,Ft([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(z.default.SyntaxKind.ExtendsKeyword,[Bt(this.ids.methodPathType,z.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 c=[],l=[];for(let[{method:O,path:A},{isJson:I,tags:ue,...Ne}]of this.registry){let Me=bo(O,A);for(let N of this.interfaces)N.kind in Ne&&N.props.push(mo(Me,Ne[N.kind]));o!=="types"&&(I&&c.push(n.createPropertyAssignment(Me,n.createTrue())),l.push(n.createPropertyAssignment(Me,n.createArrayLiteralExpression(ue.map(N=>n.createStringLiteral(N))))))}for(let{id:O,props:A}of this.interfaces)this.program.push(ho(O,p,A));if(o==="types")return;let m=n.createVariableStatement(Q,J(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(c))),y=n.createVariableStatement(Q,J(this.ids.endpointTagsConst,n.createObjectLiteralExpression(l))),u=yt(this.ids.providerType,n.createFunctionTypeNode(xo({M:this.ids.methodType,P:this.ids.pathType}),ft({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),Kt)}),yo(this.ids.responseInterface,Kt))),x=yt(this.ids.implementationType,n.createFunctionTypeNode(void 0,ft({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(z.default.SyntaxKind.StringKeyword),params:Bt(z.default.SyntaxKind.StringKeyword,z.default.SyntaxKind.AnyKeyword)}),go())),Z=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,Ie)]),T=Vt(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[Z,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),j=Vt(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[Z]),z.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()),C=fo(this.ids.clientClass,lo([ut(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),co)]),[uo(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),$t([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,T,j]),!0))]);this.program.push(m,y,u,x,C);let b=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),Ee=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(M.json))]),void 0,this.ids.undefinedValue)),V=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)),W=n.createVariableStatement(void 0,J(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,Ie)]),n.createObjectLiteralExpression([b,Ee,V])])))),me=n.createVariableStatement(void 0,J(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),ze=n.createVariableStatement(void 0,J(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]),Ie)])))),[qe,bt]=["json","text"].map(O=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,O),void 0,void 0))),$e=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(Ht,[n.createTemplateSpan(this.ids.methodParameter,Ut),n.createTemplateSpan(this.ids.pathParameter,Ie)]),z.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([qe])),k=n.createVariableStatement(Q,J(this.ids.exampleImplementationConst,$t([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([me,ze,W,$e,bt]),!0),n.createTypeReferenceNode(this.ids.implementationType))),X=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"))])])),Ze=n.createVariableStatement(void 0,J(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(k,Ze,X)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:_t(r,t)).join(`
20
+ `)};var kr=e=>{e.startupLogo!==!1&&console.log(Lr());let t=e.errorHandler||be,r=Ar(e.logger)?e.logger:new ae(e.logger);r.debug("Running","v19.4.0 (CJS)");let o=vr({rootLogger:r,config:e}),i=Zr({rootLogger:r,errorHandler:t}),s=zr({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:i,catcher:s,loggingMiddleware:o}},Hr=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:i}=kr(e);return Zt({app:e.app.use(i),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},Ur=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,catcher:i,loggingMiddleware:s}=kr(e),a=(0,at.default)().disable("x-powered-by").use(s);if(e.server.compression){let m=await pe("compression");a.use(m(typeof e.server.compression=="object"?e.server.compression:void 0))}let p={json:[e.server.jsonParser||at.default.json()],raw:[e.server.rawParser||at.default.raw(),Mr],upload:e.server.upload?await Nr({config:e,rootLogger:r}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:a,logger:r}),Zt({app:a,routing:t,rootLogger:r,config:e,parsers:p}),a.use(i,o);let c=(m,y)=>m.listen(y,()=>{r.info("Listening",y)}),l={httpServer:c(jr.default.createServer(a),e.server.listen),httpsServer:e.https?c(Dr.default.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...l,logger:r}};var io=R(require("assert/strict"),1),so=require("openapi3-ts/oas31"),ao=require("ramda");var B=R(require("assert/strict"),1),q=require("openapi3-ts/oas31"),d=require("ramda"),S=require("zod");var Ae=require("zod");var pt=e=>!isNaN(e.getTime());var Ue=Symbol("DateIn"),Fr=()=>Ae.z.union([Ae.z.string().date(),Ae.z.string().datetime(),Ae.z.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Ae.z.date().refine(pt)).brand(Ue);var Kr=require("zod");var Fe=Symbol("DateOut"),Br=()=>Kr.z.date().refine(pt).transform(e=>e.toISOString()).brand(Fe);var ce=(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=>ce(l,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),c=t&&t(e,{prev:p,...i});return c?{...p,...c}:p};var qr=50,Vr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Ko={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Gr=/:([A-Za-z0-9_]+)/g,Bo=e=>e.match(Gr)?.map(t=>t.slice(1))||[],_r=e=>e.replace(Gr,t=>`{${t.slice(1)}}`),qo=({_def:e},{next:t})=>({...t(e.innerType),default:e[g]?.defaultLabel||e.defaultValue()}),$o=({_def:{innerType:e}},{next:t})=>t(e),Vo=()=>({format:"any"}),Go=({},e)=>((0,B.default)(!e.isResponse,new P({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),_o=e=>{let t=e.unwrap();return{type:"string",format:t instanceof S.z.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Yo=({options:e},{next:t})=>({oneOf:e.map(t)}),Qo=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),Jo=e=>{let[t,r]=e.filter(q.isSchemaObject).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));(0,B.default)(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,d.mergeDeepWith)((i,s)=>Array.isArray(i)&&Array.isArray(s)?(0,d.concat)(i,s):i===s?s:B.default.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,d.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=oe(t.examples||[],r.examples||[],([i,s])=>(0,d.mergeDeepRight)(i,s))),o},Wo=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Jo(o)}catch{}return{allOf:o}},Xo=(e,{next:t})=>t(e.unwrap()),en=(e,{next:t})=>t(e.unwrap()),tn=(e,{next:t})=>{let r=t(e.unwrap());return(0,q.isSchemaObject)(r)&&(r.type=Qr(r)),r},Yr=e=>{let t=(0,d.toLower)((0,d.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},$r=e=>({type:Yr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),rn=({value:e})=>({type:Yr(e),const:e}),on=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&je(p)?p instanceof S.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},nn=()=>({type:"null"}),sn=({},e)=>((0,B.default)(!e.isResponse,new P({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:Vr}}),an=({},e)=>((0,B.default)(e.isResponse,new P({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Vr}}),pn=({},e)=>B.default.fail(new P({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})),dn=()=>({type:"boolean"}),cn=()=>({type:"integer",format:"bigint"}),ln=e=>e.every(t=>t instanceof S.z.ZodLiteral),mn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof S.z.ZodEnum||e instanceof S.z.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=dt(S.z.object((0,d.fromPairs)((0,d.xprod)(o,[t]))),r),i.required=o),i}if(e instanceof S.z.ZodLiteral)return{type:"object",properties:dt(S.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof S.z.ZodUnion&&ln(e.options)){let o=(0,d.map)(s=>`${s.value}`,e.options),i=(0,d.fromPairs)((0,d.xprod)(o,[t]));return{type:"object",properties:dt(S.z.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},un=({_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},fn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),yn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:c,isEmoji:l,isDatetime:m,_def:{checks:y}})=>{let u=y.find(C=>C.kind==="regex"),x=y.find(C=>C.kind==="datetime"),Z=u?u.regex:x?x.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"},j={"date-time":m,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:c,emoji:l};for(let C in j)if(j[C]){T.format=C;break}return r!==null&&(T.minLength=r),o!==null&&(T.maxLength=o),Z&&(T.pattern=Z.source),T},gn=({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"),c=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=c:m.exclusiveMaximum=c,m},dt=({shape:e},t)=>(0,d.map)(t,e),hn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Ko?.[t]},Qr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},xn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&(0,q.isSchemaObject)(o)){let s=Ge(e,hn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(S.z.any())}if(!t&&i.type==="preprocess"&&(0,q.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},bn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Tn=(e,{next:t})=>t(e.unwrap()),Sn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},Rn=(e,{next:t})=>t(e.unwrap().shape.raw),Jr=e=>e.length?(0,d.fromPairs)((0,d.zip)((0,d.range)(1,e.length+1).map(t=>`example${t}`),(0,d.map)((0,d.objOf)("value"),e))):void 0,Wr=(e,t,r=[])=>(0,d.pipe)(F,(0,d.map)((0,d.when)((0,d.both)(K,(0,d.complement)(Array.isArray)),(0,d.omit)(r))),Jr)({schema:e,variant:t?"parsed":"original",validate:!0}),On=(e,t)=>(0,d.pipe)(F,(0,d.filter)((0,d.has)(t)),(0,d.pluck)(t),Jr)({schema:e,variant:"original",validate:!0}),Pe=(e,t)=>e instanceof S.z.ZodObject?e:e instanceof S.z.ZodBranded?Pe(e.unwrap(),t):e instanceof S.z.ZodUnion||e instanceof S.z.ZodDiscriminatedUnion?e.options.map(r=>Pe(r,t)).reduce((r,o)=>r.merge(o.partial()),S.z.object({})):e instanceof S.z.ZodEffects?((0,B.default)(e._def.effect.type==="refinement",t),Pe(e._def.schema,t)):Pe(e._def.left,t).merge(Pe(e._def.right,t)),Xr=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,description:l=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:m}=Pe(r,new P({message:"Using transformations on the top level schema is not allowed.",path:e,method:t,isResponse:!1})),y=Bo(e),u=o.includes("query"),x=o.includes("params"),Z=o.includes("headers"),T=b=>x&&y.includes(b),j=b=>Z&&St(b);return Object.keys(m).map(b=>({name:b,location:T(b)?"path":j(b)?"header":u?"query":void 0})).filter(b=>b.location!==void 0).map(({name:b,location:Ee})=>{let V=ce(m[b],{rules:{...c,...Mt},onEach:vt,onMissing:Lt,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),W=p==="components"?a(v(l,b),V):V;return{name:b,in:Ee,required:!m[b].isOptional(),description:V.description||l,schema:W,examples:On(r,b)}})},Mt={ZodString:yn,ZodNumber:gn,ZodBigInt:cn,ZodBoolean:dn,ZodNull:nn,ZodArray:un,ZodTuple:fn,ZodRecord:mn,ZodObject:on,ZodLiteral:rn,ZodIntersection:Wo,ZodUnion:Yo,ZodAny:Vo,ZodDefault:qo,ZodEnum:$r,ZodNativeEnum:$r,ZodEffects:xn,ZodOptional:Xo,ZodNullable:tn,ZodDiscriminatedUnion:Qo,ZodBranded:Tn,ZodDate:pn,ZodCatch:$o,ZodPipeline:bn,ZodLazy:Sn,ZodReadonly:en,[Y]:_o,[He]:Go,[Fe]:an,[Ue]:sn,[ne]:Rn},vt=(e,{isResponse:t,prev:r})=>{if((0,q.isReferenceObject)(r))return{};let{description:o}=e,i=e instanceof S.z.ZodLazy,s=r.type!==void 0,a=t&&je(e),p=!i&&s&&!a&&e.isNullable(),c=i?[]:F({schema:e,variant:t?"parsed":"original",validate:!0}),l={};return o&&(l.description=o),p&&(l.type=Qr(r)),c.length&&(l.examples=c.slice()),l},Lt=(e,t)=>B.default.fail(new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Nt=(e,t)=>{if((0,q.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,d.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,d.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Nt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Nt(o,t))),r},eo=e=>(0,q.isReferenceObject)(e)?e:(0,d.omit)(["examples"],e),to=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:c,hasMultipleStatusCodes:l,statusCode:m,brandHandling:y,description:u=`${e.toUpperCase()} ${t} ${Ot(i)} response ${l?m:""}`.trim()})=>{let x=eo(ce(r,{rules:{...y,...Mt},onEach:vt,onMissing:Lt,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),Z={schema:c==="components"?p(v(u),x):x,examples:Wr(r,!0)};return{description:u,content:(0,d.fromPairs)((0,d.xprod)(o,[Z]))}},An=()=>({type:"http",scheme:"basic"}),Pn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Cn=({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}),wn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),En=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),zn=({flows:e={}})=>({type:"oauth2",flows:(0,d.map)(t=>({...t,scopes:t.scopes||{}}),(0,d.reject)(d.isNil,e))}),ro=(e,t)=>{let r={basic:An,bearer:Pn,input:Cn,header:In,cookie:wn,openid:En,oauth2:zn};return et(e,o=>r[o.type](o,t))},ct=e=>"or"in e?e.or.map(t=>"and"in t?(0,d.mergeAll)((0,d.map)(({name:r,scopes:o})=>(0,d.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?ct(It(e)):ct({or:[e]}),oo=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,paramNames:l,description:m=`${e.toUpperCase()} ${t} Request body`})=>{let y=eo(Nt(ce(r,{rules:{...c,...Mt},onEach:vt,onMissing:Lt,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),l)),u={schema:p==="components"?a(v(m),y):y,examples:Wr(r,!1,l)};return{description:m,content:(0,d.fromPairs)((0,d.xprod)(o,[u]))}},no=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}),jt=e=>e.length<=qr?e:e.slice(0,qr-1)+"\u2026";var lt=class extends so.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&&io.default.fail(new P({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:l="inline",serializer:m=Ve}){super(),this.addInfo({title:o,version:i});for(let u of typeof s=="string"?[s]:s)this.addServer({url:u});de({routing:t,onEndpoint:(u,x,Z)=>{let T=Z,j={path:x,method:T,endpoint:u,composition:l,serializer:m,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[C,b]=["short","long"].map(u.getDescription.bind(u)),Ee=C?jt(C):c&&b?jt(b):void 0,V=u.getTags(),W=r.inputSources?.[T]||bt[T],me=this.ensureUniqOperationId(x,T,u.getOperationId(T)),ze=Xr({...j,inputSources:W,schema:u.getSchema("input"),description:a?.requestParameter?.call(null,{method:T,path:x,operationId:me})}),Be={};for(let k of["positive","negative"]){let X=u.getResponses(k);for(let{mimeTypes:Ze,schema:O,statusCodes:A}of X)for(let I of A)Be[I]=to({...j,variant:k,schema:O,mimeTypes:Ze,statusCode:I,hasMultipleStatusCodes:X.length>1||A.length>1,description:a?.[`${k}Response`]?.call(null,{method:T,path:x,operationId:me,statusCode:I})})}let xt=W.includes("body")?oo({...j,paramNames:(0,ao.pluck)("name",ze),schema:u.getSchema("input"),mimeTypes:u.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:T,path:x,operationId:me})}):void 0,qe=ct(et(ro(u.getSecurity(),W),k=>{let X=this.ensureUniqSecuritySchemaName(k),Ze=["oauth2","openIdConnect"].includes(k.type)?u.getScopes().slice():[];return this.addSecurityScheme(X,k),{name:X,scopes:Ze}}));this.addPath(_r(x),{[T]:{operationId:me,summary:Ee,description:b,tags:V.length>0?V:void 0,parameters:ze.length>0?ze:void 0,requestBody:xt,security:qe.length>0?qe:void 0,responses:Be}})}}),this.rootDoc.tags=r.tags?no(r.tags):[]}};var Dt=R(require("http"),1);var Zn=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>M.json),...t}),Nn=({fnMethod:e,responseProps:t})=>{let r={writableEnded:!1,statusCode:200,statusMessage:Dt.default.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=Dt.default.STATUS_CODES[o],r)),json:e(()=>r),send:e(()=>r),end:e(()=>(r.writableEnded=!0,r)),locals:{},...t};return r},Mn=({fnMethod:e,loggerProps:t})=>({info:e(),warn:e(),error:e(),debug:e(),...t}),po=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:i,fnMethod:s})=>{let a=s||(await wr([{moduleName:"vitest",moduleExport:"vi"},{moduleName:"@jest/globals",moduleExport:"jest"}])).fn,p=Zn({fnMethod:a,requestProps:t}),c=Nn({fnMethod:a,responseProps:r}),l=Mn({fnMethod:a,loggerProps:i}),m={cors:!1,logger:l,...o};return await e.execute({request:p,response:c,config:m,logger:l}),{requestMock:p,responseMock:c,loggerMock:l}};var z=R(require("typescript"),1);var D=R(require("typescript"),1),Ce=require("ramda"),n=D.default.factory,Q=[n.createModifier(D.default.SyntaxKind.ExportKeyword)],vn=[n.createModifier(D.default.SyntaxKind.AsyncKeyword)],Ln=[n.createModifier(D.default.SyntaxKind.PublicKeyword),n.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],co=[n.createModifier(D.default.SyntaxKind.ProtectedKeyword),n.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],kt=n.createTemplateHead(""),Ie=n.createTemplateTail(""),Ht=n.createTemplateMiddle(" "),Ut=e=>n.createTemplateLiteralType(kt,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?Ie:Ht))),Ft=Ut(["M","P"]),mt=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),ut=(e,t)=>(0,Ce.chain)(([r,o])=>[mt(n.createIdentifier(r),o,t)],(0,Ce.toPairs)(e)),Kt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),lo=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),mo=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),J=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],D.default.NodeFlags.Const),Bt=(e,t)=>n.createTypeAliasDeclaration(Q,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),ft=(e,t)=>n.createTypeAliasDeclaration(Q,e,void 0,t),uo=(e,t,r)=>n.createPropertyDeclaration(Ln,e,void 0,t,r),fo=(e,t,r)=>n.createClassDeclaration(Q,e,void 0,void 0,[t,...r]),yo=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),go=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(D.default.SyntaxKind.AnyKeyword)]),ho=(e,t,r)=>n.createInterfaceDeclaration(Q,e,void 0,t,r),xo=e=>(0,Ce.chain)(([t,r])=>[n.createTypeParameterDeclaration([],t,n.createTypeReferenceNode(r))],(0,Ce.toPairs)(e)),qt=(e,t,r)=>n.createArrowFunction(r?vn:void 0,void 0,e.map(o=>mt(o)),void 0,void 0,t),$t=(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,ut({acc:void 0,key:void 0}),void 0,void 0,t),r]),bo=(...e)=>`"${e.join(" ")}"`;var To=["get","post","put","delete","patch"];var h=R(require("typescript"),1),gt=require("zod");var $=R(require("typescript"),1),{factory:yt}=$.default,Vt=(e,t)=>{$.default.addSyntheticLeadingComment(e,$.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},we=(e,t,r)=>{let o=yt.createTypeAliasDeclaration(void 0,yt.createIdentifier(t),void 0,e);return r&&Vt(o,r),o},Gt=(e,t)=>{let r=$.default.createSourceFile("print.ts","",$.default.ScriptTarget.Latest,!1,$.default.ScriptKind.TS);return $.default.createPrinter(t).printNode($.default.EmitHint.Unspecified,e,r)},jn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,So=e=>jn.test(e)?yt.createIdentifier(e):yt.createStringLiteral(e);var{factory:f}=h.default,Dn={[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},kn=({value:e})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Hn=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&je(a)?a instanceof gt.z.ZodOptional:a.isOptional(),c=f.createPropertySignature(void 0,So(s),p&&o?f.createToken(h.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Vt(c,a.description),c});return f.createTypeLiteralNode(i)},Un=({element:e},{next:t})=>f.createArrayTypeNode(t(e)),Fn=({options:e})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Ro=({options:e},{next:t})=>f.createUnionTypeNode(e.map(t)),Kn=e=>Dn?.[e.kind],Bn=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=Ge(e,Kn(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 f.createKeywordTypeNode(i&&s[i]||h.default.SyntaxKind.AnyKeyword)}return o},qn=e=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),$n=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(h.default.SyntaxKind.UndefinedKeyword)]):o},Vn=(e,{next:t})=>f.createUnionTypeNode([t(e.unwrap()),f.createLiteralTypeNode(f.createNull())]),Gn=({items:e,_def:{rest:t}},{next:r})=>f.createTupleTypeNode(e.map(r).concat(t===null?[]:f.createRestTypeNode(r(t)))),_n=({keySchema:e,valueSchema:t},{next:r})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e,t].map(r)),Yn=({_def:e},{next:t})=>f.createIntersectionTypeNode([e.left,e.right].map(t)),Qn=({_def:e},{next:t})=>t(e.innerType),le=e=>()=>f.createKeywordTypeNode(e),Jn=(e,{next:t})=>t(e.unwrap()),Wn=(e,{next:t})=>t(e.unwrap()),Xn=({_def:e},{next:t})=>t(e.innerType),ei=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ti=()=>f.createLiteralTypeNode(f.createNull()),ri=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:i})=>{let s=`Type${i(e)}`;return t(s)||(r(s,f.createLiteralTypeNode(f.createNull())),r(s,o(e)))},oi=e=>{let t=e.unwrap(),r=f.createKeywordTypeNode(h.default.SyntaxKind.StringKeyword),o=f.createTypeReferenceNode("Buffer"),i=f.createUnionTypeNode([r,o]);return t instanceof gt.z.ZodString?r:t instanceof gt.z.ZodUnion?i:o},ni=(e,{next:t})=>t(e.unwrap().shape.raw),ii={ZodString:le(h.default.SyntaxKind.StringKeyword),ZodNumber:le(h.default.SyntaxKind.NumberKeyword),ZodBigInt:le(h.default.SyntaxKind.BigIntKeyword),ZodBoolean:le(h.default.SyntaxKind.BooleanKeyword),ZodAny:le(h.default.SyntaxKind.AnyKeyword),[Ue]:le(h.default.SyntaxKind.StringKeyword),[Fe]:le(h.default.SyntaxKind.StringKeyword),ZodNull:ti,ZodArray:Un,ZodTuple:Gn,ZodRecord:_n,ZodObject:Hn,ZodLiteral:kn,ZodIntersection:Yn,ZodUnion:Ro,ZodDefault:Qn,ZodEnum:Fn,ZodNativeEnum:qn,ZodEffects:Bn,ZodOptional:$n,ZodNullable:Vn,ZodDiscriminatedUnion:Ro,ZodBranded:Jn,ZodCatch:Xn,ZodPipeline:ei,ZodLazy:ri,ZodReadonly:Wn,[Y]:oi,[ne]:ni},Ke=(e,{brandHandling:t,ctx:r})=>ce(e,{rules:{...t,...ii},onMissing:()=>f.createKeywordTypeNode(h.default.SyntaxKind.AnyKeyword),ctx:r});var ht=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,we(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=Ve,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){de({routing:t,onEndpoint:(O,A,I)=>{let ue={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},Ne=v(I,A,"input"),Me=Ke(O.getSchema("input"),{brandHandling:r,ctx:{...ue,isResponse:!1}}),N=s?v(I,A,"positive.response"):void 0,_t=O.getSchema("positive"),Yt=s?Ke(_t,{brandHandling:r,ctx:{...ue,isResponse:!0}}):void 0,ve=s?v(I,A,"negative.response"):void 0,Qt=O.getSchema("negative"),Jt=s?Ke(Qt,{brandHandling:r,ctx:{...ue,isResponse:!0}}):void 0,Wt=v(I,A,"response"),Ao=N&&ve?n.createUnionTypeNode([n.createTypeReferenceNode(N),n.createTypeReferenceNode(ve)]):Ke(_t.or(Qt),{brandHandling:r,ctx:{...ue,isResponse:!0}});this.program.push(we(Me,Ne)),Yt&&N&&this.program.push(we(Yt,N)),Jt&&ve&&this.program.push(we(Jt,ve)),this.program.push(we(Ao,Wt)),I!=="options"&&(this.paths.push(A),this.registry.set({method:I,path:A},{input:Ne,positive:N,negative:ve,response:Wt,isJson:O.getMimeTypes("positive").includes(M.json),tags:O.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(Bt(this.ids.pathType,this.paths)),this.program.push(Bt(this.ids.methodType,To)),this.program.push(ft(this.ids.methodPathType,Ut([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(z.default.SyntaxKind.ExtendsKeyword,[Kt(this.ids.methodPathType,z.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 c=[],l=[];for(let[{method:O,path:A},{isJson:I,tags:ue,...Ne}]of this.registry){let Me=bo(O,A);for(let N of this.interfaces)N.kind in Ne&&N.props.push(mo(Me,Ne[N.kind]));o!=="types"&&(I&&c.push(n.createPropertyAssignment(Me,n.createTrue())),l.push(n.createPropertyAssignment(Me,n.createArrayLiteralExpression(ue.map(N=>n.createStringLiteral(N))))))}for(let{id:O,props:A}of this.interfaces)this.program.push(ho(O,p,A));if(o==="types")return;let m=n.createVariableStatement(Q,J(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(c))),y=n.createVariableStatement(Q,J(this.ids.endpointTagsConst,n.createObjectLiteralExpression(l))),u=ft(this.ids.providerType,n.createFunctionTypeNode(xo({M:this.ids.methodType,P:this.ids.pathType}),ut({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),Ft)}),yo(this.ids.responseInterface,Ft))),x=ft(this.ids.implementationType,n.createFunctionTypeNode(void 0,ut({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(z.default.SyntaxKind.StringKeyword),params:Kt(z.default.SyntaxKind.StringKeyword,z.default.SyntaxKind.AnyKeyword)}),go())),Z=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,Ie)]),T=$t(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[Z,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),j=$t(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[Z]),z.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()),C=fo(this.ids.clientClass,lo([mt(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),co)]),[uo(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),qt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,T,j]),!0))]);this.program.push(m,y,u,x,C);let b=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),Ee=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(M.json))]),void 0,this.ids.undefinedValue)),V=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)),W=n.createVariableStatement(void 0,J(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,Ie)]),n.createObjectLiteralExpression([b,Ee,V])])))),me=n.createVariableStatement(void 0,J(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),ze=n.createVariableStatement(void 0,J(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]),Ie)])))),[Be,xt]=["json","text"].map(O=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,O),void 0,void 0))),qe=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(kt,[n.createTemplateSpan(this.ids.methodParameter,Ht),n.createTemplateSpan(this.ids.pathParameter,Ie)]),z.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([Be])),k=n.createVariableStatement(Q,J(this.ids.exampleImplementationConst,qt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([me,ze,W,qe,xt]),!0),n.createTypeReferenceNode(this.ids.implementationType))),X=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"))])])),Ze=n.createVariableStatement(void 0,J(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(k,Ze,X)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Gt(r,t)).join(`
21
21
  `):void 0}print(t){let r=this.printUsage(t),o=r&&z.default.addSyntheticLeadingComment(z.default.addSyntheticLeadingComment(n.createEmptyStatement(),z.default.SyntaxKind.SingleLineCommentTrivia," Usage example:"),z.default.SyntaxKind.MultiLineCommentTrivia,`
22
- ${r}`);return this.program.concat(o||[]).map((i,s)=>_t(i,s<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
22
+ ${r}`);return this.program.concat(o||[]).map((i,s)=>Gt(i,s<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
23
23
 
24
- `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await pe("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let i=this.printUsage(t);this.usage=i&&o?[await o(i)]:this.usage;let s=this.print(t);return o?o(s):s}};var Oo={dateIn:Fr,dateOut:Br,file:Je,upload:fr,raw:mr};0&&(module.exports={AbstractEndpoint,BuiltinLogger,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,MissingPeerError,OutputValidationError,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createLogger,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint});
24
+ `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await pe("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let i=this.printUsage(t);this.usage=i&&o?[await o(i)]:this.usage;let s=this.print(t);return o?o(s):s}};var Oo={dateIn:Fr,dateOut:Br,file:Qe,upload:ur,raw:lr};0&&(module.exports={AbstractEndpoint,BuiltinLogger,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,MissingPeerError,OutputValidationError,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createLogger,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint});
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import{clone as lo}from"ramda";import{z as Ue}from"zod";import{isHttpError as Xr}from"http-errors";import{createHash as eo}from"crypto";import{flip as to,pickBy as ro,xprod as oo}from"ramda";import{z as no}from"zod";var ie=class extends Error{name="RoutingError"},P=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:i}){let s=`${t}
2
- Caused by ${i?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},D=class extends Error{name="IOSchemaError"},_=class extends D{name="OutputValidationError";originalError;constructor(t){super(H(t)),this.originalError=t}},k=class extends D{name="InputValidationError";originalError;constructor(t){super(H(t)),this.originalError=t}},Y=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},se=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var w={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var io=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(w.upload);return"files"in e&&r},at={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},so=["body","query","params"],pt=e=>e.method.toLowerCase(),dt=e=>e.startsWith("x-"),ao=e=>ro(to(dt),e),Vt=(e,t={})=>{let r=pt(e);return r==="options"?{}:(t[r]||at[r]||so).filter(o=>o==="files"?io(e):!0).map(o=>o==="headers"?ao(e[o]):e[o]).reduce((o,i)=>({...o,...i}),{})},ae=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),H=e=>e instanceof no.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof _?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,je=e=>Xr(e)?e.statusCode:e instanceof k?400:500,ct=({logger:e,request:t,input:r,error:o,statusCode:i})=>{i===500&&e.error(`Internal server error
1
+ import{clone as co}from"ramda";import{z as Ue}from"zod";import{isHttpError as Wr}from"http-errors";import{createHash as Xr}from"crypto";import{flip as eo,pickBy as to,xprod as ro}from"ramda";import{z as oo}from"zod";var ie=class extends Error{name="RoutingError"},P=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:i}){let s=`${t}
2
+ Caused by ${i?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},D=class extends Error{name="IOSchemaError"},_=class extends D{name="OutputValidationError";originalError;constructor(t){super(H(t)),this.originalError=t}},k=class extends D{name="InputValidationError";originalError;constructor(t){super(H(t)),this.originalError=t}},Y=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},se=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var w={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var no=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(w.upload);return"files"in e&&r},at={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},io=["body","query","params"],pt=e=>e.method.toLowerCase(),dt=e=>e.startsWith("x-"),so=e=>to(eo(dt),e),Vt=(e,t={})=>{let r=pt(e);return r==="options"?{}:(t[r]||at[r]||io).filter(o=>o==="files"?no(e):!0).map(o=>o==="headers"?so(e[o]):e[o]).reduce((o,i)=>({...o,...i}),{})},ae=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),H=e=>e instanceof oo.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof _?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,je=e=>Wr(e)?e.statusCode:e instanceof k?400:500,ct=({logger:e,request:t,input:r,error:o,statusCode:i})=>{i===500&&e.error(`Internal server error
3
3
  ${o.stack}
4
- `,{url:t.url,payload:r})},U=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[y]?.examples||[];if(!r&&t==="original")return o;let i=[];for(let s of o){let a=e.safeParse(s);a.success&&i.push(t==="parsed"?a.data:s)}return i},Q=(e,t,r)=>e.length&&t.length?oo(e,t).map(r):e.concat(t),Oe=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,lt=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),E=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(lt).join(""),De=e=>eo("sha1").update(JSON.stringify(e),"utf8").digest("hex"),ke=(e,t)=>{try{return typeof e.parse(t)}catch{return}},v=e=>typeof e=="object"&&e!==null;import{clone as po,mergeDeepRight as co}from"ramda";var y=Symbol.for("express-zod-api"),He=e=>{let t=e.describe(e.description);return t._def[y]=po(t._def[y])||{examples:[]},t},Gt=(e,t)=>{if(!(y in e._def))return t;let r=He(t);return r._def[y].examples=Q(r._def[y].examples,e._def[y].examples,([o,i])=>typeof o=="object"&&typeof i=="object"?co({...o},{...i}):i),r};var mo=function(e){let t=He(this);return t._def[y].examples.push(e),t},uo=function(e){let t=He(this);return t._def[y].defaultLabel=e,t},fo=function(e){return new Ue.ZodBranded({typeName:Ue.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[y]:{examples:[],...lo(this._def[y]),brand:e}})};y in globalThis||(globalThis[y]=!0,Object.defineProperties(Ue.ZodType.prototype,{example:{get(){return mo.bind(this)}},brand:{set(){},get(){return fo.bind(this)}}}),Object.defineProperty(Ue.ZodDefault.prototype,"label",{get(){return uo.bind(this)}}));function yo(e){return e}import rr from"assert/strict";import{z as gt}from"zod";import{z as go}from"zod";var pe={positive:200,negative:400},mt=(e,t)=>e instanceof go.ZodType?[{...t,schema:e}]:(Array.isArray(e)?e:[e]).map(({schema:r,statusCodes:o,statusCode:i,mimeTypes:s,mimeType:a})=>({schema:r,statusCodes:i?[i]:o||t.statusCodes,mimeTypes:a?[a]:s||t.mimeTypes}));import{z as To}from"zod";import{z as xo}from"zod";import{z as Fe}from"zod";var F=Symbol("File"),_t=Fe.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),ho={buffer:()=>_t.brand(F),string:()=>Fe.string().brand(F),binary:()=>_t.or(Fe.string()).brand(F),base64:()=>Fe.string().base64().brand(F)};function Ke(e){return ho[e||"string"]()}var J=Symbol("Raw"),Yt=xo.object({raw:Ke("buffer")});function Qt(e){return(e?Yt.extend(e):Yt).brand(J)}import{z as bo}from"zod";var Ae=Symbol("Upload"),Jt=()=>bo.custom(e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.encoding=="string"&&typeof e.mimetype=="string"&&Buffer.isBuffer(e.data)&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",e=>({message:`Expected file upload, received ${typeof e}`})).brand(Ae);var ut=(e,{next:t})=>e.options.some(t),Xt=({_def:e},{next:t})=>[e.left,e.right].some(t),Wt=(e,{next:t})=>t(e.unwrap()),So={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:ut,ZodDiscriminatedUnion:ut,ZodIntersection:Xt,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:Wt,ZodNullable:Wt,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},Be=(e,{condition:t,rules:r=So,depth:o=1,maxDepth:i=Number.POSITIVE_INFINITY})=>{if(t(e))return!0;let s=o<i?r[e._def.typeName]:void 0;return s?s(e,{next:a=>Be(a,{condition:t,rules:r,maxDepth:i,depth:o+1})}):!1},qe=e=>Be(e,{maxDepth:3,rules:{ZodUnion:ut,ZodIntersection:Xt},condition:t=>t instanceof To.ZodEffects&&t._def.effect.type!=="refinement"}),er=e=>Be(e,{condition:t=>t._def[y]?.brand===Ae}),tr=e=>Be(e,{condition:t=>t._def[y]?.brand===J,maxDepth:3});var $e=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
- Original error: ${e.originalError.message}.`:""))};import{chain as Ro}from"ramda";var W=e=>v(e)&&"or"in e,ce=e=>v(e)&&"and"in e,ft=e=>({and:Ro(t=>ce(t)?t.and:[t],e)}),Ve=(e,t)=>ce(e)?{and:e.and.map(r=>W(r)?{or:r.or.map(t)}:t(r))}:W(e)?{or:e.or.map(r=>ce(r)?{and:r.and.map(t)}:t(r))}:t(e),yt=e=>e.and.reduce((t,r)=>({or:Q(t.or,W(r)?r.or:[r],ft)}),{or:[]}),de=(e,t)=>ce(e)?W(t)?de(yt(e),t):ft([e,t]):W(e)?ce(t)?de(t,e):W(t)?{or:Q(e.or,t.or,ft)}:de(e,{and:[t]}):ce(t)||W(t)?de(t,e):{and:[e,t]};var le=class{},Ge=class extends le{#e;#o;#n;#s;#t;#a;#p;#r;#d;#c;#l;#i;constructor({methods:t,inputSchema:r,outputSchema:o,handler:i,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:l,shortDescription:f}){super(),this.#a=i,this.#p=s,this.#n=d,this.#l=a,this.#o=Object.freeze(t),this.#d=Object.freeze(p),this.#c=Object.freeze(c),this.#e={long:l,short:f},this.#r={input:r,output:o};for(let[m,h]of Object.entries(this.#r))rr(!qe(h),new D(`Using transformations on the top level of endpoint ${m} schema is not allowed.`));this.#t={positive:Object.freeze(mt(s.getPositiveResponse(o),{mimeTypes:[w.json],statusCodes:[pe.positive]})),negative:Object.freeze(mt(s.getNegativeResponse(),{mimeTypes:[w.json],statusCodes:[pe.negative]}))};for(let[m,h]of Object.entries(this.#t))rr(h.length,new Y(`ResultHandler must have at least one ${m} response schema specified.`));this.#i=er(r)?"upload":tr(r)?"raw":"json",this.#s={input:Object.freeze([w[this.#i]]),positive:Object.freeze(this.#t.positive.flatMap(({mimeTypes:m})=>m)),negative:Object.freeze(this.#t.negative.flatMap(({mimeTypes:m})=>m))}}getDescription(t){return this.#e[t]}getMethods(){return this.#o}getSchema(t){return t==="input"||t==="output"?this.#r[t]:this.getResponses(t).map(({schema:r})=>r).reduce((r,o)=>r.or(o))}getMimeTypes(t){return this.#s[t]}getRequestType(){return this.#i}getResponses(t){return this.#t[t]}getSecurity(){return this.#n.reduce((t,r)=>r.security?de(t,r.security):t,{and:[]})}getScopes(){return this.#d}getTags(){return this.#c}getOperationId(t){return this.#l(t)}#m(t){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#o.concat(t).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#r.output.parseAsync(t)}catch(r){throw r instanceof gt.ZodError?new _(r):r}}async#f({method:t,input:r,request:o,response:i,logger:s,options:a}){for(let p of this.#n){if(t==="options"&&p.type==="proprietary")continue;let d;try{d=await p.input.parseAsync(r)}catch(c){throw c instanceof gt.ZodError?new k(c):c}if(Object.assign(a,await p.middleware({input:d,options:a,request:o,response:i,logger:s})),i.writableEnded){s.warn(`The middleware ${p.middleware.name} has closed the stream. Accumulated options:`,a);break}}}async#y({input:t,options:r,logger:o}){let i;try{i=await this.#r.input.parseAsync(t)}catch(s){throw s instanceof gt.ZodError?new k(s):s}return this.#a({input:i,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:i,input:s,output:a,options:p}){try{await this.#p.handler({error:t,output:a,request:r,response:o,logger:i,input:s,options:p})}catch(d){$e({logger:i,response:o,error:new Y(ae(d).message,t)})}}async execute({request:t,response:r,logger:o,config:i,siblingMethods:s=[]}){let a=pt(t),p={},d=null,c=null;if(i.cors){let f=this.#m(s);typeof i.cors=="function"&&(f=await i.cors({request:t,logger:o,endpoint:this,defaultHeaders:f}));for(let m in f)r.set(m,f[m])}let l=Vt(t,i.inputSources);try{if(await this.#f({method:a,input:l,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}d=await this.#u(await this.#y({input:l,logger:o,options:p}))}catch(f){c=ae(f)}await this.#g({input:l,output:d,request:t,response:r,error:c,logger:o,options:p})}};import{z as nr}from"zod";var or=(e,t)=>{let r=e.map(({input:i})=>i).concat(t),o=r.reduce((i,s)=>i.and(s));return r.reduce((i,s)=>Gt(s,i),o)};import Oo from"assert/strict";var ht=e=>(Oo(!qe(e.input),new D("Using transformations on the top level of middleware input schema is not allowed.")),{...e,type:"proprietary"});import{z as N}from"zod";var xt=e=>e,Pe=xt({getPositiveResponse:e=>{let t=U({schema:e}),r=N.object({status:N.literal("success"),data:e});return t.reduce((o,i)=>o.example({status:"success",data:i}),r)},getNegativeResponse:()=>N.object({status:N.literal("error"),error:N.object({message:N.string()})}).example({status:"error",error:{message:H(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:i,logger:s})=>{if(!e){i.status(pe.positive).json({status:"success",data:r});return}let a=je(e);ct({logger:s,statusCode:a,request:o,error:e,input:t}),i.status(a).json({status:"error",error:{message:H(e)}})}}),bt=xt({getPositiveResponse:e=>{let t=U({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof N.ZodArray?e.shape.items:N.array(N.any());return t.reduce((o,i)=>v(i)&&"items"in i&&Array.isArray(i.items)?o.example(i.items):o,r)},getNegativeResponse:()=>N.string().example(H(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:i,input:s})=>{if(r){let a=je(r);ct({logger:o,statusCode:a,request:i,error:r,input:s}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(pe.positive).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}});var Ce=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),i=r?.provider||(()=>({})),s={type:"express",input:nr.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,f=>{if(f&&f instanceof Error)return c(o(f));d(i(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(ht({input:nr.object({}),middleware:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:i,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,l="methods"in p?p.methods:[p.method],f=typeof a=="function"?a:()=>a,m="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],h="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Ge({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:m,tags:h,methods:l,getOperationId:f,description:i,shortDescription:s,inputSchema:or(d,t)})}},Ao=new Ce(Pe),Po=new Ce(bt);import{Ansis as Co,blue as Io,cyanBright as wo,green as Eo,hex as zo,red as Zo}from"ansis";import{inspect as No}from"util";var _e={debug:10,info:20,warn:30,error:40},ir=e=>v(e)&&Object.keys(_e).some(t=>t in e);var me=class e{constructor(t){this.config=t;let{color:r=new Co().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:Io,info:Eo,warn:zo("#FFA500"),error:Zo};prettyPrint(t){let{depth:r=2}=this.config;return No(t,{depth:r,colors:this.hasColor,breakLength:this.config.level==="debug"?80:1/0,compact:this.config.level==="debug"?3:!0})}print(t,r,o){if(this.config.level==="silent"||_e[t]<_e[this.config.level])return;let{requestId:i,...s}=this.config.ctx||{},a=[new Date().toISOString()];i&&a.push(this.hasColor?wo(i):i),a.push(this.hasColor?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&a.push(this.prettyPrint(o)),Object.keys(s).length>0&&a.push(this.prettyPrint(s)),console.log(a.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}},Mo=e=>new me(e);import{head as vo,tail as Lo,toPairs as jo}from"ramda";var Ie=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze(jo(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=vo(this.pairs)?.[1],this.siblingMethods=Object.freeze(Lo(this.pairs).map(([r])=>r))}};import Do from"express";var we=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Do.static(...this.params))}};import St from"express";import Bo from"http";import qo from"https";var X=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new se(e)},sr=async e=>{for(let{moduleName:t,moduleExport:r}of e)try{return await X(t,r)}catch{}throw new se(e.map(({moduleName:t})=>t))};import ar from"assert/strict";var ee=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:i})=>{let s=Object.entries(e).map(([a,p])=>[a.trim(),p]);for(let[a,p]of s){ar.doesNotMatch(a,/\//,new ie(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let d=`${o||""}${a?`/${a}`:""}`;if(p instanceof le){let c=p.getMethods().slice();i&&c.push("options");for(let l of c)t(p,d,l)}else if(p instanceof we)r&&p.apply(d,r);else if(p instanceof Ie){for(let[c,l]of p.pairs)ar(l.getMethods().includes(c),new ie(`Endpoint assigned to ${c} method of ${d} must support ${c} method.`)),t(l,d,c);i&&p.firstEndpoint&&t(p.firstEndpoint,d,"options",p.siblingMethods)}else ee({onEndpoint:t,onStatic:r,hasCors:i,routing:p,parentPath:d})}};var Tt=({app:e,rootLogger:t,config:r,routing:o,parsers:i})=>ee({routing:o,hasCors:!!r.cors,onEndpoint:(s,a,p,d)=>{e[p](a,...i?.[s.getRequestType()]||[],async(c,l)=>s.execute({request:c,response:l,logger:l.locals[y]?.logger||t,config:r,siblingMethods:d}))},onStatic:(s,a)=>{e.use(s,a)}});import pr,{isHttpError as ko}from"http-errors";var dr=({errorHandler:e,rootLogger:t})=>async(r,o,i,s)=>{if(!r)return s();e.handler({error:ko(r)?r:pr(400,ae(r).message),request:o,response:i,input:null,output:null,options:{},logger:i.locals[y]?.logger||t})},cr=({errorHandler:e,rootLogger:t})=>async(r,o)=>{let i=pr(404,`Can not ${r.method} ${r.path}`),s=o.locals[y]?.logger||t;try{e.handler({request:r,response:o,logger:s,error:i,input:null,output:null,options:{}})}catch(a){$e({response:o,logger:s,error:new Y(ae(a).message,i)})}},Ho=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:i})=>i))return r(e);r()},Uo=e=>({log:e.debug.bind(e)}),lr=async({rootLogger:e,config:t})=>{let r=await X("express-fileupload"),{limitError:o,beforeUpload:i,...s}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,d,c)=>{let l=d.locals[y]?.logger||e;try{await i?.({request:p,logger:l})}catch(f){return c(f)}r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Uo(l)})(p,d,c)}),o&&a.push(Ho(o)),a},mr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},ur=({rootLogger:e,config:t})=>async(r,o,i)=>{let s=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;s.debug(`${r.method}: ${r.path}`),o.locals[y]={logger:s},i()};import{gray as Fo,hex as fr,italic as Ye,whiteBright as Ko}from"ansis";var yr=()=>{let e=Ye("Proudly supports transgender community.".padStart(109)),t=Ye("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=Ye("Thank you for choosing Express Zod API for your project.".padStart(132)),o=Ye("for Dime".padEnd(20)),i=fr("#F5A9B8"),s=fr("#5BCEFA"),a=new Array(14).fill(s,1,3).fill(i,3,5).fill(Ko,5,7).fill(i,7,9).fill(s,9,12).fill(Fo,12,13);return`
4
+ `,{url:t.url,payload:r})},U=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[y]?.examples||[];if(!r&&t==="original")return o;let i=[];for(let s of o){let a=e.safeParse(s);a.success&&i.push(t==="parsed"?a.data:s)}return i},Q=(e,t,r)=>e.length&&t.length?ro(e,t).map(r):e.concat(t),Oe=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,lt=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),E=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(lt).join(""),De=e=>Xr("sha1").update(JSON.stringify(e),"utf8").digest("hex"),ke=(e,t)=>{try{return typeof e.parse(t)}catch{return}},v=e=>typeof e=="object"&&e!==null;import{clone as ao,mergeDeepRight as po}from"ramda";var y=Symbol.for("express-zod-api"),He=e=>{let t=e.describe(e.description);return t._def[y]=ao(t._def[y])||{examples:[]},t},Gt=(e,t)=>{if(!(y in e._def))return t;let r=He(t);return r._def[y].examples=Q(r._def[y].examples,e._def[y].examples,([o,i])=>typeof o=="object"&&typeof i=="object"?po({...o},{...i}):i),r};var lo=function(e){let t=He(this);return t._def[y].examples.push(e),t},mo=function(e){let t=He(this);return t._def[y].defaultLabel=e,t},uo=function(e){return new Ue.ZodBranded({typeName:Ue.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[y]:{examples:[],...co(this._def[y]),brand:e}})};y in globalThis||(globalThis[y]=!0,Object.defineProperties(Ue.ZodType.prototype,{example:{get(){return lo.bind(this)}},brand:{set(){},get(){return uo.bind(this)}}}),Object.defineProperty(Ue.ZodDefault.prototype,"label",{get(){return mo.bind(this)}}));function fo(e){return e}import rr from"assert/strict";import{z as gt}from"zod";import{z as yo}from"zod";var pe={positive:200,negative:400},mt=(e,t)=>e instanceof yo.ZodType?[{...t,schema:e}]:(Array.isArray(e)?e:[e]).map(({schema:r,statusCodes:o,statusCode:i,mimeTypes:s,mimeType:a})=>({schema:r,statusCodes:i?[i]:o||t.statusCodes,mimeTypes:a?[a]:s||t.mimeTypes}));import{z as bo}from"zod";import{z as ho}from"zod";import{z as Fe}from"zod";var F=Symbol("File"),_t=Fe.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),go={buffer:()=>_t.brand(F),string:()=>Fe.string().brand(F),binary:()=>_t.or(Fe.string()).brand(F),base64:()=>Fe.string().base64().brand(F)};function Ke(e){return go[e||"string"]()}var J=Symbol("Raw"),Yt=ho.object({raw:Ke("buffer")});function Qt(e){return(e?Yt.extend(e):Yt).brand(J)}import{z as xo}from"zod";var Ae=Symbol("Upload"),Jt=()=>xo.custom(e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.encoding=="string"&&typeof e.mimetype=="string"&&Buffer.isBuffer(e.data)&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",e=>({message:`Expected file upload, received ${typeof e}`})).brand(Ae);var ut=(e,{next:t})=>e.options.some(t),Xt=({_def:e},{next:t})=>[e.left,e.right].some(t),Wt=(e,{next:t})=>t(e.unwrap()),To={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:ut,ZodDiscriminatedUnion:ut,ZodIntersection:Xt,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:Wt,ZodNullable:Wt,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},Be=(e,{condition:t,rules:r=To,depth:o=1,maxDepth:i=Number.POSITIVE_INFINITY})=>{if(t(e))return!0;let s=o<i?r[e._def.typeName]:void 0;return s?s(e,{next:a=>Be(a,{condition:t,rules:r,maxDepth:i,depth:o+1})}):!1},qe=e=>Be(e,{maxDepth:3,rules:{ZodUnion:ut,ZodIntersection:Xt},condition:t=>t instanceof bo.ZodEffects&&t._def.effect.type!=="refinement"}),er=e=>Be(e,{condition:t=>t._def[y]?.brand===Ae}),tr=e=>Be(e,{condition:t=>t._def[y]?.brand===J,maxDepth:3});var $e=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
+ Original error: ${e.originalError.message}.`:""))};import{chain as So}from"ramda";var W=e=>v(e)&&"or"in e,ce=e=>v(e)&&"and"in e,ft=e=>({and:So(t=>ce(t)?t.and:[t],e)}),Ve=(e,t)=>ce(e)?{and:e.and.map(r=>W(r)?{or:r.or.map(t)}:t(r))}:W(e)?{or:e.or.map(r=>ce(r)?{and:r.and.map(t)}:t(r))}:t(e),yt=e=>e.and.reduce((t,r)=>({or:Q(t.or,W(r)?r.or:[r],ft)}),{or:[]}),de=(e,t)=>ce(e)?W(t)?de(yt(e),t):ft([e,t]):W(e)?ce(t)?de(t,e):W(t)?{or:Q(e.or,t.or,ft)}:de(e,{and:[t]}):ce(t)||W(t)?de(t,e):{and:[e,t]};var le=class{},Ge=class extends le{#e;#o;#n;#s;#t;#a;#p;#r;#d;#c;#l;#i;constructor({methods:t,inputSchema:r,outputSchema:o,handler:i,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:l,shortDescription:f}){super(),this.#a=i,this.#p=s,this.#n=d,this.#l=a,this.#o=Object.freeze(t),this.#d=Object.freeze(p),this.#c=Object.freeze(c),this.#e={long:l,short:f},this.#r={input:r,output:o};for(let[m,h]of Object.entries(this.#r))rr(!qe(h),new D(`Using transformations on the top level of endpoint ${m} schema is not allowed.`));this.#t={positive:Object.freeze(mt(s.getPositiveResponse(o),{mimeTypes:[w.json],statusCodes:[pe.positive]})),negative:Object.freeze(mt(s.getNegativeResponse(),{mimeTypes:[w.json],statusCodes:[pe.negative]}))};for(let[m,h]of Object.entries(this.#t))rr(h.length,new Y(`ResultHandler must have at least one ${m} response schema specified.`));this.#i=er(r)?"upload":tr(r)?"raw":"json",this.#s={input:Object.freeze([w[this.#i]]),positive:Object.freeze(this.#t.positive.flatMap(({mimeTypes:m})=>m)),negative:Object.freeze(this.#t.negative.flatMap(({mimeTypes:m})=>m))}}getDescription(t){return this.#e[t]}getMethods(){return this.#o}getSchema(t){return t==="input"||t==="output"?this.#r[t]:this.getResponses(t).map(({schema:r})=>r).reduce((r,o)=>r.or(o))}getMimeTypes(t){return this.#s[t]}getRequestType(){return this.#i}getResponses(t){return this.#t[t]}getSecurity(){return this.#n.reduce((t,r)=>r.security?de(t,r.security):t,{and:[]})}getScopes(){return this.#d}getTags(){return this.#c}getOperationId(t){return this.#l(t)}#m(t){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#o.concat(t).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#r.output.parseAsync(t)}catch(r){throw r instanceof gt.ZodError?new _(r):r}}async#f({method:t,input:r,request:o,response:i,logger:s,options:a}){for(let p of this.#n){if(t==="options"&&p.type==="proprietary")continue;let d;try{d=await p.input.parseAsync(r)}catch(c){throw c instanceof gt.ZodError?new k(c):c}if(Object.assign(a,await p.middleware({input:d,options:a,request:o,response:i,logger:s})),i.writableEnded){s.warn(`The middleware ${p.middleware.name} has closed the stream. Accumulated options:`,a);break}}}async#y({input:t,options:r,logger:o}){let i;try{i=await this.#r.input.parseAsync(t)}catch(s){throw s instanceof gt.ZodError?new k(s):s}return this.#a({input:i,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:i,input:s,output:a,options:p}){try{await this.#p.handler({error:t,output:a,request:r,response:o,logger:i,input:s,options:p})}catch(d){$e({logger:i,response:o,error:new Y(ae(d).message,t)})}}async execute({request:t,response:r,logger:o,config:i,siblingMethods:s=[]}){let a=pt(t),p={},d=null,c=null;if(i.cors){let f=this.#m(s);typeof i.cors=="function"&&(f=await i.cors({request:t,logger:o,endpoint:this,defaultHeaders:f}));for(let m in f)r.set(m,f[m])}let l=Vt(t,i.inputSources);try{if(await this.#f({method:a,input:l,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}d=await this.#u(await this.#y({input:l,logger:o,options:p}))}catch(f){c=ae(f)}await this.#g({input:l,output:d,request:t,response:r,error:c,logger:o,options:p})}};import{z as nr}from"zod";var or=(e,t)=>{let r=e.map(({input:i})=>i).concat(t),o=r.reduce((i,s)=>i.and(s));return r.reduce((i,s)=>Gt(s,i),o)};import Ro from"assert/strict";var ht=e=>(Ro(!qe(e.input),new D("Using transformations on the top level of middleware input schema is not allowed.")),{...e,type:"proprietary"});import{z as N}from"zod";var xt=e=>e,Pe=xt({getPositiveResponse:e=>{let t=U({schema:e}),r=N.object({status:N.literal("success"),data:e});return t.reduce((o,i)=>o.example({status:"success",data:i}),r)},getNegativeResponse:()=>N.object({status:N.literal("error"),error:N.object({message:N.string()})}).example({status:"error",error:{message:H(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:i,logger:s})=>{if(!e){i.status(pe.positive).json({status:"success",data:r});return}let a=je(e);ct({logger:s,statusCode:a,request:o,error:e,input:t}),i.status(a).json({status:"error",error:{message:H(e)}})}}),bt=xt({getPositiveResponse:e=>{let t=U({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof N.ZodArray?e.shape.items:N.array(N.any());return t.reduce((o,i)=>v(i)&&"items"in i&&Array.isArray(i.items)?o.example(i.items):o,r)},getNegativeResponse:()=>N.string().example(H(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:i,input:s})=>{if(r){let a=je(r);ct({logger:o,statusCode:a,request:i,error:r,input:s}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(pe.positive).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}});var Ce=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),i=r?.provider||(()=>({})),s={type:"express",input:nr.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,f=>{if(f&&f instanceof Error)return c(o(f));d(i(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(ht({input:nr.object({}),middleware:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:i,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,l="methods"in p?p.methods:[p.method],f=typeof a=="function"?a:()=>a,m="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],h="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Ge({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:m,tags:h,methods:l,getOperationId:f,description:i,shortDescription:s,inputSchema:or(d,t)})}},Oo=new Ce(Pe),Ao=new Ce(bt);import{Ansis as Po,blue as Co,cyanBright as Io,green as wo,hex as Eo,red as zo}from"ansis";import{inspect as Zo}from"util";var _e={debug:10,info:20,warn:30,error:40},ir=e=>v(e)&&Object.keys(_e).some(t=>t in e);var me=class e{constructor(t){this.config=t;let{color:r=new Po().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:Co,info:wo,warn:Eo("#FFA500"),error:zo};prettyPrint(t){let{depth:r=2}=this.config;return Zo(t,{depth:r,colors:this.hasColor,breakLength:this.config.level==="debug"?80:1/0,compact:this.config.level==="debug"?3:!0})}print(t,r,o){if(this.config.level==="silent"||_e[t]<_e[this.config.level])return;let{requestId:i,...s}=this.config.ctx||{},a=[new Date().toISOString()];i&&a.push(this.hasColor?Io(i):i),a.push(this.hasColor?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&a.push(this.prettyPrint(o)),Object.keys(s).length>0&&a.push(this.prettyPrint(s)),console.log(a.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}},No=e=>new me(e);import{head as Mo,tail as vo,toPairs as Lo}from"ramda";var Ie=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze(Lo(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=Mo(this.pairs)?.[1],this.siblingMethods=Object.freeze(vo(this.pairs).map(([r])=>r))}};import jo from"express";var we=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,jo.static(...this.params))}};import St from"express";import Ko from"http";import Bo from"https";var X=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new se(e)},sr=async e=>{for(let{moduleName:t,moduleExport:r}of e)try{return await X(t,r)}catch{}throw new se(e.map(({moduleName:t})=>t))};import ar from"assert/strict";var ee=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:i})=>{let s=Object.entries(e).map(([a,p])=>[a.trim(),p]);for(let[a,p]of s){ar.doesNotMatch(a,/\//,new ie(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let d=`${o||""}${a?`/${a}`:""}`;if(p instanceof le){let c=p.getMethods().slice();i&&c.push("options");for(let l of c)t(p,d,l)}else if(p instanceof we)r&&p.apply(d,r);else if(p instanceof Ie){for(let[c,l]of p.pairs)ar(l.getMethods().includes(c),new ie(`Endpoint assigned to ${c} method of ${d} must support ${c} method.`)),t(l,d,c);i&&p.firstEndpoint&&t(p.firstEndpoint,d,"options",p.siblingMethods)}else ee({onEndpoint:t,onStatic:r,hasCors:i,routing:p,parentPath:d})}};var Tt=({app:e,rootLogger:t,config:r,routing:o,parsers:i})=>ee({routing:o,hasCors:!!r.cors,onEndpoint:(s,a,p,d)=>{e[p](a,...i?.[s.getRequestType()]||[],async(c,l)=>s.execute({request:c,response:l,logger:l.locals[y]?.logger||t,config:r,siblingMethods:d}))},onStatic:(s,a)=>{e.use(s,a)}});import Do from"http-errors";var pr=({errorHandler:e,rootLogger:t})=>async(r,o,i,s)=>r?e.handler({error:ae(r),request:o,response:i,input:null,output:null,options:{},logger:i.locals[y]?.logger||t}):s(),dr=({errorHandler:e,rootLogger:t})=>async(r,o)=>{let i=Do(404,`Can not ${r.method} ${r.path}`),s=o.locals[y]?.logger||t;try{e.handler({request:r,response:o,logger:s,error:i,input:null,output:null,options:{}})}catch(a){$e({response:o,logger:s,error:new Y(ae(a).message,i)})}},ko=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:i})=>i))return r(e);r()},Ho=e=>({log:e.debug.bind(e)}),cr=async({rootLogger:e,config:t})=>{let r=await X("express-fileupload"),{limitError:o,beforeUpload:i,...s}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,d,c)=>{let l=d.locals[y]?.logger||e;try{await i?.({request:p,logger:l})}catch(f){return c(f)}r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Ho(l)})(p,d,c)}),o&&a.push(ko(o)),a},lr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},mr=({rootLogger:e,config:t})=>async(r,o,i)=>{let s=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;s.debug(`${r.method}: ${r.path}`),o.locals[y]={logger:s},i()};import{gray as Uo,hex as ur,italic as Ye,whiteBright as Fo}from"ansis";var fr=()=>{let e=Ye("Proudly supports transgender community.".padStart(109)),t=Ye("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=Ye("Thank you for choosing Express Zod API for your project.".padStart(132)),o=Ye("for Dime".padEnd(20)),i=ur("#F5A9B8"),s=ur("#5BCEFA"),a=new Array(14).fill(s,1,3).fill(i,3,5).fill(Fo,5,7).fill(i,7,9).fill(s,9,12).fill(Uo,12,13);return`
6
6
  8888888888 8888888888P 888 d8888 8888888b. 8888888
7
7
  888 d88P 888 d88888 888 Y88b 888
8
8
  888 d88P 888 d88P888 888 888 888
@@ -17,8 +17,8 @@ ${o}888${t}
17
17
  ${r}
18
18
  `.split(`
19
19
  `).map((d,c)=>a[c]?a[c](d):d).join(`
20
- `)};var gr=e=>{e.startupLogo!==!1&&console.log(yr());let t=e.errorHandler||Pe,r=ir(e.logger)?e.logger:new me(e.logger);r.debug("Running","v19.3.1 (ESM)");let o=ur({rootLogger:r,config:e}),i=cr({rootLogger:r,errorHandler:t}),s=dr({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}=gr(e);return Tt({app:e.app.use(i),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},Vo=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,parserFailureHandler:i,loggingMiddleware:s}=gr(e),a=St().disable("x-powered-by").use(s);if(e.server.compression){let l=await X("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(),mr],upload:e.server.upload?await lr({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 d=(l,f)=>l.listen(f,()=>{r.info("Listening",f)}),c={httpServer:d(Bo.createServer(a),e.server.listen),httpsServer:e.https?d(qo.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...c,logger:r}};import ei from"assert/strict";import{OpenApiBuilder as ti}from"openapi3-ts/oas31";import{pluck as ri}from"ramda";import K from"assert/strict";import{isReferenceObject as Ot,isSchemaObject as We}from"openapi3-ts/oas31";import{both as _o,complement as Yo,concat as Qo,type as Jo,filter as Wo,fromPairs as Ne,has as Xo,isNil as en,map as fe,mergeAll as tn,mergeDeepRight as rn,mergeDeepWith as on,objOf as Sr,omit as Xe,pipe as Rr,pluck as nn,range as sn,reject as an,toLower as pn,union as dn,when as cn,xprod as et,zip as ln}from"ramda";import{z as T}from"zod";import{z as Ee}from"zod";var Qe=e=>!isNaN(e.getTime());var ze=Symbol("DateIn"),hr=()=>Ee.union([Ee.string().date(),Ee.string().datetime(),Ee.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Ee.date().refine(Qe)).brand(ze);import{z as Go}from"zod";var Ze=Symbol("DateOut"),xr=()=>Go.date().refine(Qe).transform(e=>e.toISOString()).brand(Ze);var te=(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:c=>te(c,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),d=t&&t(e,{prev:p,...i});return d?{...p,...d}:p};var br=50,Or="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",mn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Ar=/:([A-Za-z0-9_]+)/g,un=e=>e.match(Ar)?.map(t=>t.slice(1))||[],Pr=e=>e.replace(Ar,t=>`{${t.slice(1)}}`),fn=({_def:e},{next:t})=>({...t(e.innerType),default:e[y]?.defaultLabel||e.defaultValue()}),yn=({_def:{innerType:e}},{next:t})=>t(e),gn=()=>({format:"any"}),hn=({},e)=>(K(!e.isResponse,new P({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),xn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof T.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},bn=({options:e},{next:t})=>({oneOf:e.map(t)}),Tn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),Sn=e=>{let[t,r]=e.filter(We).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));K(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=on((i,s)=>Array.isArray(i)&&Array.isArray(s)?Qo(i,s):i===s?s:K.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=dn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=Q(t.examples||[],r.examples||[],([i,s])=>rn(i,s))),o},Rn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Sn(o)}catch{}return{allOf:o}},On=(e,{next:t})=>t(e.unwrap()),An=(e,{next:t})=>t(e.unwrap()),Pn=(e,{next:t})=>{let r=t(e.unwrap());return We(r)&&(r.type=Ir(r)),r},Cr=e=>{let t=pn(Jo(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Tr=e=>({type:Cr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Cn=({value:e})=>({type:Cr(e),const:e}),In=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&Oe(p)?p instanceof T.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=Je(e,r)),s.length&&(a.required=s),a},wn=()=>({type:"null"}),En=({},e)=>(K(!e.isResponse,new P({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:Or}}),zn=({},e)=>(K(e.isResponse,new P({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Or}}),Zn=({},e)=>K.fail(new P({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})),Nn=()=>({type:"boolean"}),Mn=()=>({type:"integer",format:"bigint"}),vn=e=>e.every(t=>t instanceof T.ZodLiteral),Ln=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof T.ZodEnum||e instanceof T.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=Je(T.object(Ne(et(o,[t]))),r),i.required=o),i}if(e instanceof T.ZodLiteral)return{type:"object",properties:Je(T.object({[e.value]:t}),r),required:[e.value]};if(e instanceof T.ZodUnion&&vn(e.options)){let o=fe(s=>`${s.value}`,e.options),i=Ne(et(o,[t]));return{type:"object",properties:Je(T.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},jn=({_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)}),kn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:f}})=>{let m=f.find(O=>O.kind==="regex"),h=f.find(O=>O.kind==="datetime"),C=m?m.regex:h?h.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,b={type:"string"},Z={"date-time":l,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:d,emoji:c};for(let O in Z)if(Z[O]){b.format=O;break}return r!==null&&(b.minLength=r),o!==null&&(b.maxLength=o),C&&(b.pattern=C.source),b},Hn=({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"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,l={type:e?"integer":"number",format:e?"int64":"double"};return a?l.minimum=s:l.exclusiveMinimum=s,c?l.maximum=d:l.exclusiveMaximum=d,l},Je=({shape:e},t)=>fe(t,e),Un=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return mn?.[t]},Ir=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},Fn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&We(o)){let s=ke(e,Un(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(T.any())}if(!t&&i.type==="preprocess"&&We(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Kn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Bn=(e,{next:t})=>t(e.unwrap()),qn=({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),wr=e=>e.length?Ne(ln(sn(1,e.length+1).map(t=>`example${t}`),fe(Sr("value"),e))):void 0,Er=(e,t,r=[])=>Rr(U,fe(cn(_o(v,Yo(Array.isArray)),Xe(r))),wr)({schema:e,variant:t?"parsed":"original",validate:!0}),Vn=(e,t)=>Rr(U,Wo(Xo(t)),nn(t),wr)({schema:e,variant:"original",validate:!0}),ue=(e,t)=>e instanceof T.ZodObject?e:e instanceof T.ZodBranded?ue(e.unwrap(),t):e instanceof T.ZodUnion||e instanceof T.ZodDiscriminatedUnion?e.options.map(r=>ue(r,t)).reduce((r,o)=>r.merge(o.partial()),T.object({})):e instanceof T.ZodEffects?(K(e._def.effect.type==="refinement",t),ue(e._def.schema,t)):ue(e._def.left,t).merge(ue(e._def.right,t)),zr=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,description:c=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:l}=ue(r,new P({message:"Using transformations on the top level schema is not allowed.",path:e,method:t,isResponse:!1})),f=un(e),m=o.includes("query"),h=o.includes("params"),C=o.includes("headers"),b=x=>h&&f.includes(x),Z=x=>C&&dt(x);return Object.keys(l).map(x=>({name:x,location:b(x)?"path":Z(x)?"header":m?"query":void 0})).filter(x=>x.location!==void 0).map(({name:x,location:he})=>{let j=te(l[x],{rules:{...d,...At},onEach:Pt,onMissing:Ct,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),V=p==="components"?a(E(c,x),j):j;return{name:x,in:he,required:!l[x].isOptional(),description:j.description||c,schema:V,examples:Vn(r,x)}})},At={ZodString:kn,ZodNumber:Hn,ZodBigInt:Mn,ZodBoolean:Nn,ZodNull:wn,ZodArray:jn,ZodTuple:Dn,ZodRecord:Ln,ZodObject:In,ZodLiteral:Cn,ZodIntersection:Rn,ZodUnion:bn,ZodAny:gn,ZodDefault:fn,ZodEnum:Tr,ZodNativeEnum:Tr,ZodEffects:Fn,ZodOptional:On,ZodNullable:Pn,ZodDiscriminatedUnion:Tn,ZodBranded:Bn,ZodDate:Zn,ZodCatch:yn,ZodPipeline:Kn,ZodLazy:qn,ZodReadonly:An,[F]:xn,[Ae]:hn,[Ze]:zn,[ze]:En,[J]:$n},Pt=(e,{isResponse:t,prev:r})=>{if(Ot(r))return{};let{description:o}=e,i=e instanceof T.ZodLazy,s=r.type!==void 0,a=t&&Oe(e),p=!i&&s&&!a&&e.isNullable(),d=i?[]:U({schema:e,variant:t?"parsed":"original",validate:!0}),c={};return o&&(c.description=o),p&&(c.type=Ir(r)),d.length&&(c.examples=d.slice()),c},Ct=(e,t)=>K.fail(new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Rt=(e,t)=>{if(Ot(e))return e;let r={...e};return r.properties&&(r.properties=Xe(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>Xe(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Rt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Rt(o,t))),r},Zr=e=>Ot(e)?e:Xe(["examples"],e),Nr=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:d,hasMultipleStatusCodes:c,statusCode:l,brandHandling:f,description:m=`${e.toUpperCase()} ${t} ${lt(i)} response ${c?l:""}`.trim()})=>{let h=Zr(te(r,{rules:{...f,...At},onEach:Pt,onMissing:Ct,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),C={schema:d==="components"?p(E(m),h):h,examples:Er(r,!0)};return{description:m,content:Ne(et(o,[C]))}},Gn=()=>({type:"http",scheme:"basic"}),_n=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Yn=({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},Qn=({name:e})=>({type:"apiKey",in:"header",name:e}),Jn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Wn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Xn=({flows:e={}})=>({type:"oauth2",flows:fe(t=>({...t,scopes:t.scopes||{}}),an(en,e))}),Mr=(e,t)=>{let r={basic:Gn,bearer:_n,input:Yn,header:Qn,cookie:Jn,openid:Wn,oauth2:Xn};return Ve(e,o=>r[o.type](o,t))},tt=e=>"or"in e?e.or.map(t=>"and"in t?tn(fe(({name:r,scopes:o})=>Sr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?tt(yt(e)):tt({or:[e]}),vr=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,paramNames:c,description:l=`${e.toUpperCase()} ${t} Request body`})=>{let f=Zr(Rt(te(r,{rules:{...d,...At},onEach:Pt,onMissing:Ct,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),c)),m={schema:p==="components"?a(E(l),f):f,examples:Er(r,!1,c)};return{description:l,content:Ne(et(o,[m]))}},Lr=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}),It=e=>e.length<=br?e:e.slice(0,br-1)+"\u2026";var wt=class extends ti{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||E(r,t),s=this.lastOperationIdSuffixes.get(i);return s===void 0?(this.lastOperationIdSuffixes.set(i,1),i):(o&&ei.fail(new P({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:c="inline",serializer:l=De}){super(),this.addInfo({title:o,version:i});for(let m of typeof s=="string"?[s]:s)this.addServer({url:m});ee({routing:t,onEndpoint:(m,h,C)=>{let b=C,Z={path:h,method:b,endpoint:m,composition:c,serializer:l,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[O,x]=["short","long"].map(m.getDescription.bind(m)),he=O?It(O):d&&x?It(x):void 0,j=m.getTags(),V=r.inputSources?.[b]||at[b],oe=this.ensureUniqOperationId(h,b,m.getOperationId(b)),xe=zr({...Z,inputSources:V,schema:m.getSchema("input"),description:a?.requestParameter?.call(null,{method:b,path:h,operationId:oe})}),ve={};for(let M of["positive","negative"]){let G=m.getResponses(M);for(let{mimeTypes:be,schema:S,statusCodes:R}of G)for(let A of R)ve[A]=Nr({...Z,variant:M,schema:S,mimeTypes:be,statusCode:A,hasMultipleStatusCodes:G.length>1||R.length>1,description:a?.[`${M}Response`]?.call(null,{method:b,path:h,operationId:oe,statusCode:A})})}let st=V.includes("body")?vr({...Z,paramNames:ri("name",xe),schema:m.getSchema("input"),mimeTypes:m.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:b,path:h,operationId:oe})}):void 0,Le=tt(Ve(Mr(m.getSecurity(),V),M=>{let G=this.ensureUniqSecuritySchemaName(M),be=["oauth2","openIdConnect"].includes(M.type)?m.getScopes().slice():[];return this.addSecurityScheme(G,M),{name:G,scopes:be}}));this.addPath(Pr(h),{[b]:{operationId:oe,summary:he,description:x,tags:j.length>0?j:void 0,parameters:xe.length>0?xe:void 0,requestBody:st,security:Le.length>0?Le:void 0,responses:ve}})}}),this.rootDoc.tags=r.tags?Lr(r.tags):[]}};import jr from"http";var oi=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>w.json),...t}),ni=({fnMethod:e,responseProps:t})=>{let r={writableEnded:!1,statusCode:200,statusMessage:jr.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=jr.STATUS_CODES[o],r)),json:e(()=>r),send:e(()=>r),end:e(()=>(r.writableEnded=!0,r)),locals:{},...t};return r},ii=({fnMethod:e,loggerProps:t})=>({info:e(),warn:e(),error:e(),debug:e(),...t}),si=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:i,fnMethod:s})=>{let a=s||(await sr([{moduleName:"vitest",moduleExport:"vi"},{moduleName:"@jest/globals",moduleExport:"jest"}])).fn,p=oi({fnMethod:a,requestProps:t}),d=ni({fnMethod:a,responseProps:r}),c=ii({fnMethod:a,loggerProps:i}),l={cors:!1,logger:c,...o};return await e.execute({request:p,response:d,config:l,logger:c}),{requestMock:p,responseMock:d,loggerMock:c}};import z from"typescript";import L from"typescript";import{chain as Dr,toPairs as kr}from"ramda";var n=L.factory,B=[n.createModifier(L.SyntaxKind.ExportKeyword)],ai=[n.createModifier(L.SyntaxKind.AsyncKeyword)],pi=[n.createModifier(L.SyntaxKind.PublicKeyword),n.createModifier(L.SyntaxKind.ReadonlyKeyword)],Hr=[n.createModifier(L.SyntaxKind.ProtectedKeyword),n.createModifier(L.SyntaxKind.ReadonlyKeyword)],Et=n.createTemplateHead(""),ye=n.createTemplateTail(""),zt=n.createTemplateMiddle(" "),Zt=e=>n.createTemplateLiteralType(Et,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?ye:zt))),Nt=Zt(["M","P"]),rt=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),ot=(e,t)=>Dr(([r,o])=>[rt(n.createIdentifier(r),o,t)],kr(e)),Mt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),Ur=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),Fr=(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)],L.NodeFlags.Const),vt=(e,t)=>n.createTypeAliasDeclaration(B,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),nt=(e,t)=>n.createTypeAliasDeclaration(B,e,void 0,t),Kr=(e,t,r)=>n.createPropertyDeclaration(pi,e,void 0,t,r),Br=(e,t,r)=>n.createClassDeclaration(B,e,void 0,void 0,[t,...r]),qr=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),$r=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(L.SyntaxKind.AnyKeyword)]),Vr=(e,t,r)=>n.createInterfaceDeclaration(B,e,void 0,t,r),Gr=e=>Dr(([t,r])=>[n.createTypeParameterDeclaration([],t,n.createTypeReferenceNode(r))],kr(e)),Lt=(e,t,r)=>n.createArrowFunction(r?ai:void 0,void 0,e.map(o=>rt(o)),void 0,void 0,t),jt=(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,ot({acc:void 0,key:void 0}),void 0,void 0,t),r]),_r=(...e)=>`"${e.join(" ")}"`;var Yr=["get","post","put","delete","patch"];import g from"typescript";import{z as Ht}from"zod";import $ from"typescript";var{factory:it}=$,Dt=(e,t)=>{$.addSyntheticLeadingComment(e,$.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ge=(e,t,r)=>{let o=it.createTypeAliasDeclaration(void 0,it.createIdentifier(t),void 0,e);return r&&Dt(o,r),o},kt=(e,t)=>{let r=$.createSourceFile("print.ts","",$.ScriptTarget.Latest,!1,$.ScriptKind.TS);return $.createPrinter(t).printNode($.EmitHint.Unspecified,e,r)},di=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Qr=e=>di.test(e)?it.createIdentifier(e):it.createStringLiteral(e);var{factory:u}=g,ci={[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},li=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),mi=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&Oe(a)?a instanceof Ht.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,Qr(s),p&&o?u.createToken(g.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Dt(d,a.description),d});return u.createTypeLiteralNode(i)},ui=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),fi=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Jr=({options:e},{next:t})=>u.createUnionTypeNode(e.map(t)),yi=e=>ci?.[e.kind],gi=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=ke(e,yi(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 u.createKeywordTypeNode(i&&s[i]||g.SyntaxKind.AnyKeyword)}return o},hi=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),xi=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(g.SyntaxKind.UndefinedKeyword)]):o},bi=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),Ti=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),Si=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),Ri=({_def:e},{next:t})=>u.createIntersectionTypeNode([e.left,e.right].map(t)),Oi=({_def:e},{next:t})=>t(e.innerType),re=e=>()=>u.createKeywordTypeNode(e),Ai=(e,{next:t})=>t(e.unwrap()),Pi=(e,{next:t})=>t(e.unwrap()),Ci=({_def:e},{next:t})=>t(e.innerType),Ii=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),wi=()=>u.createLiteralTypeNode(u.createNull()),Ei=({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)))},zi=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(g.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),i=u.createUnionTypeNode([r,o]);return t instanceof Ht.ZodString?r:t instanceof Ht.ZodUnion?i:o},Zi=(e,{next:t})=>t(e.unwrap().shape.raw),Ni={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),[ze]:re(g.SyntaxKind.StringKeyword),[Ze]:re(g.SyntaxKind.StringKeyword),ZodNull:wi,ZodArray:ui,ZodTuple:Ti,ZodRecord:Si,ZodObject:mi,ZodLiteral:li,ZodIntersection:Ri,ZodUnion:Jr,ZodDefault:Oi,ZodEnum:fi,ZodNativeEnum:hi,ZodEffects:gi,ZodOptional:xi,ZodNullable:bi,ZodDiscriminatedUnion:Jr,ZodBranded:Ai,ZodCatch:Ci,ZodPipeline:Ii,ZodLazy:Ei,ZodReadonly:Pi,[F]:zi,[J]:Zi},Me=(e,{brandHandling:t,ctx:r})=>te(e,{rules:{...t,...Ni},onMissing:()=>u.createKeywordTypeNode(g.SyntaxKind.AnyKeyword),ctx:r});var Ut=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,ge(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=De,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(S,R,A)=>{let ne={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},Te=E(A,R,"input"),Se=Me(S.getSchema("input"),{brandHandling:r,ctx:{...ne,isResponse:!1}}),I=s?E(A,R,"positive.response"):void 0,Ft=S.getSchema("positive"),Kt=s?Me(Ft,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Re=s?E(A,R,"negative.response"):void 0,Bt=S.getSchema("negative"),qt=s?Me(Bt,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,$t=E(A,R,"response"),Wr=I&&Re?n.createUnionTypeNode([n.createTypeReferenceNode(I),n.createTypeReferenceNode(Re)]):Me(Ft.or(Bt),{brandHandling:r,ctx:{...ne,isResponse:!0}});this.program.push(ge(Se,Te)),Kt&&I&&this.program.push(ge(Kt,I)),qt&&Re&&this.program.push(ge(qt,Re)),this.program.push(ge(Wr,$t)),A!=="options"&&(this.paths.push(R),this.registry.set({method:A,path:R},{input:Te,positive:I,negative:Re,response:$t,isJson:S.getMimeTypes("positive").includes(w.json),tags:S.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(vt(this.ids.pathType,this.paths)),this.program.push(vt(this.ids.methodType,Yr)),this.program.push(nt(this.ids.methodPathType,Zt([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(z.SyntaxKind.ExtendsKeyword,[Mt(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 d=[],c=[];for(let[{method:S,path:R},{isJson:A,tags:ne,...Te}]of this.registry){let Se=_r(S,R);for(let I of this.interfaces)I.kind in Te&&I.props.push(Fr(Se,Te[I.kind]));o!=="types"&&(A&&d.push(n.createPropertyAssignment(Se,n.createTrue())),c.push(n.createPropertyAssignment(Se,n.createArrayLiteralExpression(ne.map(I=>n.createStringLiteral(I))))))}for(let{id:S,props:R}of this.interfaces)this.program.push(Vr(S,p,R));if(o==="types")return;let l=n.createVariableStatement(B,q(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(d))),f=n.createVariableStatement(B,q(this.ids.endpointTagsConst,n.createObjectLiteralExpression(c))),m=nt(this.ids.providerType,n.createFunctionTypeNode(Gr({M:this.ids.methodType,P:this.ids.pathType}),ot({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),Nt)}),qr(this.ids.responseInterface,Nt))),h=nt(this.ids.implementationType,n.createFunctionTypeNode(void 0,ot({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(z.SyntaxKind.StringKeyword),params:Mt(z.SyntaxKind.StringKeyword,z.SyntaxKind.AnyKeyword)}),$r())),C=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,ye)]),b=jt(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[C,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),Z=jt(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[C]),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()),O=Br(this.ids.clientClass,Ur([rt(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),Hr)]),[Kr(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),Lt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,b,Z]),!0))]);this.program.push(l,f,m,h,O);let x=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),he=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)),j=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,ye)]),n.createObjectLiteralExpression([x,he,j])])))),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])))),xe=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]),ye)])))),[ve,st]=["json","text"].map(S=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,S),void 0,void 0))),Le=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(Et,[n.createTemplateSpan(this.ids.methodParameter,zt),n.createTemplateSpan(this.ids.pathParameter,ye)]),z.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([ve])),M=n.createVariableStatement(B,q(this.ids.exampleImplementationConst,Lt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([oe,xe,V,Le,st]),!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"))])])),be=n.createVariableStatement(void 0,q(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(M,be,G)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:kt(r,t)).join(`
20
+ `)};var yr=e=>{e.startupLogo!==!1&&console.log(fr());let t=e.errorHandler||Pe,r=ir(e.logger)?e.logger:new me(e.logger);r.debug("Running","v19.4.0 (ESM)");let o=mr({rootLogger:r,config:e}),i=dr({rootLogger:r,errorHandler:t}),s=pr({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:i,catcher:s,loggingMiddleware:o}},qo=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:i}=yr(e);return Tt({app:e.app.use(i),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},$o=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,catcher:i,loggingMiddleware:s}=yr(e),a=St().disable("x-powered-by").use(s);if(e.server.compression){let l=await X("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(),lr],upload:e.server.upload?await cr({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 d=(l,f)=>l.listen(f,()=>{r.info("Listening",f)}),c={httpServer:d(Ko.createServer(a),e.server.listen),httpsServer:e.https?d(Bo.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...c,logger:r}};import Xn from"assert/strict";import{OpenApiBuilder as ei}from"openapi3-ts/oas31";import{pluck as ti}from"ramda";import K from"assert/strict";import{isReferenceObject as Ot,isSchemaObject as We}from"openapi3-ts/oas31";import{both as Go,complement as _o,concat as Yo,type as Qo,filter as Jo,fromPairs as Ne,has as Wo,isNil as Xo,map as fe,mergeAll as en,mergeDeepRight as tn,mergeDeepWith as rn,objOf as Tr,omit as Xe,pipe as Sr,pluck as on,range as nn,reject as sn,toLower as an,union as pn,when as dn,xprod as et,zip as cn}from"ramda";import{z as T}from"zod";import{z as Ee}from"zod";var Qe=e=>!isNaN(e.getTime());var ze=Symbol("DateIn"),gr=()=>Ee.union([Ee.string().date(),Ee.string().datetime(),Ee.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Ee.date().refine(Qe)).brand(ze);import{z as Vo}from"zod";var Ze=Symbol("DateOut"),hr=()=>Vo.date().refine(Qe).transform(e=>e.toISOString()).brand(Ze);var te=(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:c=>te(c,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),d=t&&t(e,{prev:p,...i});return d?{...p,...d}:p};var xr=50,Rr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",ln={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Or=/:([A-Za-z0-9_]+)/g,mn=e=>e.match(Or)?.map(t=>t.slice(1))||[],Ar=e=>e.replace(Or,t=>`{${t.slice(1)}}`),un=({_def:e},{next:t})=>({...t(e.innerType),default:e[y]?.defaultLabel||e.defaultValue()}),fn=({_def:{innerType:e}},{next:t})=>t(e),yn=()=>({format:"any"}),gn=({},e)=>(K(!e.isResponse,new P({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),hn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof T.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},xn=({options:e},{next:t})=>({oneOf:e.map(t)}),bn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),Tn=e=>{let[t,r]=e.filter(We).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));K(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=rn((i,s)=>Array.isArray(i)&&Array.isArray(s)?Yo(i,s):i===s?s:K.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=pn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=Q(t.examples||[],r.examples||[],([i,s])=>tn(i,s))),o},Sn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Tn(o)}catch{}return{allOf:o}},Rn=(e,{next:t})=>t(e.unwrap()),On=(e,{next:t})=>t(e.unwrap()),An=(e,{next:t})=>{let r=t(e.unwrap());return We(r)&&(r.type=Cr(r)),r},Pr=e=>{let t=an(Qo(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},br=e=>({type:Pr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Pn=({value:e})=>({type:Pr(e),const:e}),Cn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&Oe(p)?p instanceof T.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=Je(e,r)),s.length&&(a.required=s),a},In=()=>({type:"null"}),wn=({},e)=>(K(!e.isResponse,new P({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:Rr}}),En=({},e)=>(K(e.isResponse,new P({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Rr}}),zn=({},e)=>K.fail(new P({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})),Zn=()=>({type:"boolean"}),Nn=()=>({type:"integer",format:"bigint"}),Mn=e=>e.every(t=>t instanceof T.ZodLiteral),vn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof T.ZodEnum||e instanceof T.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=Je(T.object(Ne(et(o,[t]))),r),i.required=o),i}if(e instanceof T.ZodLiteral)return{type:"object",properties:Je(T.object({[e.value]:t}),r),required:[e.value]};if(e instanceof T.ZodUnion&&Mn(e.options)){let o=fe(s=>`${s.value}`,e.options),i=Ne(et(o,[t]));return{type:"object",properties:Je(T.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},Ln=({_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},jn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Dn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:f}})=>{let m=f.find(O=>O.kind==="regex"),h=f.find(O=>O.kind==="datetime"),C=m?m.regex:h?h.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,b={type:"string"},Z={"date-time":l,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:d,emoji:c};for(let O in Z)if(Z[O]){b.format=O;break}return r!==null&&(b.minLength=r),o!==null&&(b.maxLength=o),C&&(b.pattern=C.source),b},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"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,l={type:e?"integer":"number",format:e?"int64":"double"};return a?l.minimum=s:l.exclusiveMinimum=s,c?l.maximum=d:l.exclusiveMaximum=d,l},Je=({shape:e},t)=>fe(t,e),Hn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return ln?.[t]},Cr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},Un=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&We(o)){let s=ke(e,Hn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(T.any())}if(!t&&i.type==="preprocess"&&We(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Fn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Kn=(e,{next:t})=>t(e.unwrap()),Bn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},qn=(e,{next:t})=>t(e.unwrap().shape.raw),Ir=e=>e.length?Ne(cn(nn(1,e.length+1).map(t=>`example${t}`),fe(Tr("value"),e))):void 0,wr=(e,t,r=[])=>Sr(U,fe(dn(Go(v,_o(Array.isArray)),Xe(r))),Ir)({schema:e,variant:t?"parsed":"original",validate:!0}),$n=(e,t)=>Sr(U,Jo(Wo(t)),on(t),Ir)({schema:e,variant:"original",validate:!0}),ue=(e,t)=>e instanceof T.ZodObject?e:e instanceof T.ZodBranded?ue(e.unwrap(),t):e instanceof T.ZodUnion||e instanceof T.ZodDiscriminatedUnion?e.options.map(r=>ue(r,t)).reduce((r,o)=>r.merge(o.partial()),T.object({})):e instanceof T.ZodEffects?(K(e._def.effect.type==="refinement",t),ue(e._def.schema,t)):ue(e._def.left,t).merge(ue(e._def.right,t)),Er=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,description:c=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:l}=ue(r,new P({message:"Using transformations on the top level schema is not allowed.",path:e,method:t,isResponse:!1})),f=mn(e),m=o.includes("query"),h=o.includes("params"),C=o.includes("headers"),b=x=>h&&f.includes(x),Z=x=>C&&dt(x);return Object.keys(l).map(x=>({name:x,location:b(x)?"path":Z(x)?"header":m?"query":void 0})).filter(x=>x.location!==void 0).map(({name:x,location:he})=>{let j=te(l[x],{rules:{...d,...At},onEach:Pt,onMissing:Ct,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),V=p==="components"?a(E(c,x),j):j;return{name:x,in:he,required:!l[x].isOptional(),description:j.description||c,schema:V,examples:$n(r,x)}})},At={ZodString:Dn,ZodNumber:kn,ZodBigInt:Nn,ZodBoolean:Zn,ZodNull:In,ZodArray:Ln,ZodTuple:jn,ZodRecord:vn,ZodObject:Cn,ZodLiteral:Pn,ZodIntersection:Sn,ZodUnion:xn,ZodAny:yn,ZodDefault:un,ZodEnum:br,ZodNativeEnum:br,ZodEffects:Un,ZodOptional:Rn,ZodNullable:An,ZodDiscriminatedUnion:bn,ZodBranded:Kn,ZodDate:zn,ZodCatch:fn,ZodPipeline:Fn,ZodLazy:Bn,ZodReadonly:On,[F]:hn,[Ae]:gn,[Ze]:En,[ze]:wn,[J]:qn},Pt=(e,{isResponse:t,prev:r})=>{if(Ot(r))return{};let{description:o}=e,i=e instanceof T.ZodLazy,s=r.type!==void 0,a=t&&Oe(e),p=!i&&s&&!a&&e.isNullable(),d=i?[]:U({schema:e,variant:t?"parsed":"original",validate:!0}),c={};return o&&(c.description=o),p&&(c.type=Cr(r)),d.length&&(c.examples=d.slice()),c},Ct=(e,t)=>K.fail(new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Rt=(e,t)=>{if(Ot(e))return e;let r={...e};return r.properties&&(r.properties=Xe(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>Xe(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Rt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Rt(o,t))),r},zr=e=>Ot(e)?e:Xe(["examples"],e),Zr=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:d,hasMultipleStatusCodes:c,statusCode:l,brandHandling:f,description:m=`${e.toUpperCase()} ${t} ${lt(i)} response ${c?l:""}`.trim()})=>{let h=zr(te(r,{rules:{...f,...At},onEach:Pt,onMissing:Ct,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),C={schema:d==="components"?p(E(m),h):h,examples:wr(r,!0)};return{description:m,content:Ne(et(o,[C]))}},Vn=()=>({type:"http",scheme:"basic"}),Gn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},_n=({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},Yn=({name:e})=>({type:"apiKey",in:"header",name:e}),Qn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Jn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Wn=({flows:e={}})=>({type:"oauth2",flows:fe(t=>({...t,scopes:t.scopes||{}}),sn(Xo,e))}),Nr=(e,t)=>{let r={basic:Vn,bearer:Gn,input:_n,header:Yn,cookie:Qn,openid:Jn,oauth2:Wn};return Ve(e,o=>r[o.type](o,t))},tt=e=>"or"in e?e.or.map(t=>"and"in t?en(fe(({name:r,scopes:o})=>Tr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?tt(yt(e)):tt({or:[e]}),Mr=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,paramNames:c,description:l=`${e.toUpperCase()} ${t} Request body`})=>{let f=zr(Rt(te(r,{rules:{...d,...At},onEach:Pt,onMissing:Ct,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),c)),m={schema:p==="components"?a(E(l),f):f,examples:wr(r,!1,c)};return{description:l,content:Ne(et(o,[m]))}},vr=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}),It=e=>e.length<=xr?e:e.slice(0,xr-1)+"\u2026";var wt=class extends ei{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||E(r,t),s=this.lastOperationIdSuffixes.get(i);return s===void 0?(this.lastOperationIdSuffixes.set(i,1),i):(o&&Xn.fail(new P({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:c="inline",serializer:l=De}){super(),this.addInfo({title:o,version:i});for(let m of typeof s=="string"?[s]:s)this.addServer({url:m});ee({routing:t,onEndpoint:(m,h,C)=>{let b=C,Z={path:h,method:b,endpoint:m,composition:c,serializer:l,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[O,x]=["short","long"].map(m.getDescription.bind(m)),he=O?It(O):d&&x?It(x):void 0,j=m.getTags(),V=r.inputSources?.[b]||at[b],oe=this.ensureUniqOperationId(h,b,m.getOperationId(b)),xe=Er({...Z,inputSources:V,schema:m.getSchema("input"),description:a?.requestParameter?.call(null,{method:b,path:h,operationId:oe})}),ve={};for(let M of["positive","negative"]){let G=m.getResponses(M);for(let{mimeTypes:be,schema:S,statusCodes:R}of G)for(let A of R)ve[A]=Zr({...Z,variant:M,schema:S,mimeTypes:be,statusCode:A,hasMultipleStatusCodes:G.length>1||R.length>1,description:a?.[`${M}Response`]?.call(null,{method:b,path:h,operationId:oe,statusCode:A})})}let st=V.includes("body")?Mr({...Z,paramNames:ti("name",xe),schema:m.getSchema("input"),mimeTypes:m.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:b,path:h,operationId:oe})}):void 0,Le=tt(Ve(Nr(m.getSecurity(),V),M=>{let G=this.ensureUniqSecuritySchemaName(M),be=["oauth2","openIdConnect"].includes(M.type)?m.getScopes().slice():[];return this.addSecurityScheme(G,M),{name:G,scopes:be}}));this.addPath(Ar(h),{[b]:{operationId:oe,summary:he,description:x,tags:j.length>0?j:void 0,parameters:xe.length>0?xe:void 0,requestBody:st,security:Le.length>0?Le:void 0,responses:ve}})}}),this.rootDoc.tags=r.tags?vr(r.tags):[]}};import Lr from"http";var ri=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>w.json),...t}),oi=({fnMethod:e,responseProps:t})=>{let r={writableEnded:!1,statusCode:200,statusMessage:Lr.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=Lr.STATUS_CODES[o],r)),json:e(()=>r),send:e(()=>r),end:e(()=>(r.writableEnded=!0,r)),locals:{},...t};return r},ni=({fnMethod:e,loggerProps:t})=>({info:e(),warn:e(),error:e(),debug:e(),...t}),ii=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:i,fnMethod:s})=>{let a=s||(await sr([{moduleName:"vitest",moduleExport:"vi"},{moduleName:"@jest/globals",moduleExport:"jest"}])).fn,p=ri({fnMethod:a,requestProps:t}),d=oi({fnMethod:a,responseProps:r}),c=ni({fnMethod:a,loggerProps:i}),l={cors:!1,logger:c,...o};return await e.execute({request:p,response:d,config:l,logger:c}),{requestMock:p,responseMock:d,loggerMock:c}};import z from"typescript";import L from"typescript";import{chain as jr,toPairs as Dr}from"ramda";var n=L.factory,B=[n.createModifier(L.SyntaxKind.ExportKeyword)],si=[n.createModifier(L.SyntaxKind.AsyncKeyword)],ai=[n.createModifier(L.SyntaxKind.PublicKeyword),n.createModifier(L.SyntaxKind.ReadonlyKeyword)],kr=[n.createModifier(L.SyntaxKind.ProtectedKeyword),n.createModifier(L.SyntaxKind.ReadonlyKeyword)],Et=n.createTemplateHead(""),ye=n.createTemplateTail(""),zt=n.createTemplateMiddle(" "),Zt=e=>n.createTemplateLiteralType(Et,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?ye:zt))),Nt=Zt(["M","P"]),rt=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),ot=(e,t)=>jr(([r,o])=>[rt(n.createIdentifier(r),o,t)],Dr(e)),Mt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),Hr=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),Ur=(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)],L.NodeFlags.Const),vt=(e,t)=>n.createTypeAliasDeclaration(B,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),nt=(e,t)=>n.createTypeAliasDeclaration(B,e,void 0,t),Fr=(e,t,r)=>n.createPropertyDeclaration(ai,e,void 0,t,r),Kr=(e,t,r)=>n.createClassDeclaration(B,e,void 0,void 0,[t,...r]),Br=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),qr=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(L.SyntaxKind.AnyKeyword)]),$r=(e,t,r)=>n.createInterfaceDeclaration(B,e,void 0,t,r),Vr=e=>jr(([t,r])=>[n.createTypeParameterDeclaration([],t,n.createTypeReferenceNode(r))],Dr(e)),Lt=(e,t,r)=>n.createArrowFunction(r?si:void 0,void 0,e.map(o=>rt(o)),void 0,void 0,t),jt=(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,ot({acc:void 0,key:void 0}),void 0,void 0,t),r]),Gr=(...e)=>`"${e.join(" ")}"`;var _r=["get","post","put","delete","patch"];import g from"typescript";import{z as Ht}from"zod";import $ from"typescript";var{factory:it}=$,Dt=(e,t)=>{$.addSyntheticLeadingComment(e,$.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ge=(e,t,r)=>{let o=it.createTypeAliasDeclaration(void 0,it.createIdentifier(t),void 0,e);return r&&Dt(o,r),o},kt=(e,t)=>{let r=$.createSourceFile("print.ts","",$.ScriptTarget.Latest,!1,$.ScriptKind.TS);return $.createPrinter(t).printNode($.EmitHint.Unspecified,e,r)},pi=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Yr=e=>pi.test(e)?it.createIdentifier(e):it.createStringLiteral(e);var{factory:u}=g,di={[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},ci=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),li=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&Oe(a)?a instanceof Ht.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,Yr(s),p&&o?u.createToken(g.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Dt(d,a.description),d});return u.createTypeLiteralNode(i)},mi=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),ui=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Qr=({options:e},{next:t})=>u.createUnionTypeNode(e.map(t)),fi=e=>di?.[e.kind],yi=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=ke(e,fi(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 u.createKeywordTypeNode(i&&s[i]||g.SyntaxKind.AnyKeyword)}return o},gi=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),hi=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(g.SyntaxKind.UndefinedKeyword)]):o},xi=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),bi=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),Ti=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),Si=({_def:e},{next:t})=>u.createIntersectionTypeNode([e.left,e.right].map(t)),Ri=({_def:e},{next:t})=>t(e.innerType),re=e=>()=>u.createKeywordTypeNode(e),Oi=(e,{next:t})=>t(e.unwrap()),Ai=(e,{next:t})=>t(e.unwrap()),Pi=({_def:e},{next:t})=>t(e.innerType),Ci=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Ii=()=>u.createLiteralTypeNode(u.createNull()),wi=({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)))},Ei=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(g.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),i=u.createUnionTypeNode([r,o]);return t instanceof Ht.ZodString?r:t instanceof Ht.ZodUnion?i:o},zi=(e,{next:t})=>t(e.unwrap().shape.raw),Zi={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),[ze]:re(g.SyntaxKind.StringKeyword),[Ze]:re(g.SyntaxKind.StringKeyword),ZodNull:Ii,ZodArray:mi,ZodTuple:bi,ZodRecord:Ti,ZodObject:li,ZodLiteral:ci,ZodIntersection:Si,ZodUnion:Qr,ZodDefault:Ri,ZodEnum:ui,ZodNativeEnum:gi,ZodEffects:yi,ZodOptional:hi,ZodNullable:xi,ZodDiscriminatedUnion:Qr,ZodBranded:Oi,ZodCatch:Pi,ZodPipeline:Ci,ZodLazy:wi,ZodReadonly:Ai,[F]:Ei,[J]:zi},Me=(e,{brandHandling:t,ctx:r})=>te(e,{rules:{...t,...Zi},onMissing:()=>u.createKeywordTypeNode(g.SyntaxKind.AnyKeyword),ctx:r});var Ut=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,ge(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=De,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(S,R,A)=>{let ne={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},Te=E(A,R,"input"),Se=Me(S.getSchema("input"),{brandHandling:r,ctx:{...ne,isResponse:!1}}),I=s?E(A,R,"positive.response"):void 0,Ft=S.getSchema("positive"),Kt=s?Me(Ft,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Re=s?E(A,R,"negative.response"):void 0,Bt=S.getSchema("negative"),qt=s?Me(Bt,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,$t=E(A,R,"response"),Jr=I&&Re?n.createUnionTypeNode([n.createTypeReferenceNode(I),n.createTypeReferenceNode(Re)]):Me(Ft.or(Bt),{brandHandling:r,ctx:{...ne,isResponse:!0}});this.program.push(ge(Se,Te)),Kt&&I&&this.program.push(ge(Kt,I)),qt&&Re&&this.program.push(ge(qt,Re)),this.program.push(ge(Jr,$t)),A!=="options"&&(this.paths.push(R),this.registry.set({method:A,path:R},{input:Te,positive:I,negative:Re,response:$t,isJson:S.getMimeTypes("positive").includes(w.json),tags:S.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(vt(this.ids.pathType,this.paths)),this.program.push(vt(this.ids.methodType,_r)),this.program.push(nt(this.ids.methodPathType,Zt([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(z.SyntaxKind.ExtendsKeyword,[Mt(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 d=[],c=[];for(let[{method:S,path:R},{isJson:A,tags:ne,...Te}]of this.registry){let Se=Gr(S,R);for(let I of this.interfaces)I.kind in Te&&I.props.push(Ur(Se,Te[I.kind]));o!=="types"&&(A&&d.push(n.createPropertyAssignment(Se,n.createTrue())),c.push(n.createPropertyAssignment(Se,n.createArrayLiteralExpression(ne.map(I=>n.createStringLiteral(I))))))}for(let{id:S,props:R}of this.interfaces)this.program.push($r(S,p,R));if(o==="types")return;let l=n.createVariableStatement(B,q(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(d))),f=n.createVariableStatement(B,q(this.ids.endpointTagsConst,n.createObjectLiteralExpression(c))),m=nt(this.ids.providerType,n.createFunctionTypeNode(Vr({M:this.ids.methodType,P:this.ids.pathType}),ot({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),Nt)}),Br(this.ids.responseInterface,Nt))),h=nt(this.ids.implementationType,n.createFunctionTypeNode(void 0,ot({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(z.SyntaxKind.StringKeyword),params:Mt(z.SyntaxKind.StringKeyword,z.SyntaxKind.AnyKeyword)}),qr())),C=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,ye)]),b=jt(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[C,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),Z=jt(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[C]),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()),O=Kr(this.ids.clientClass,Hr([rt(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),kr)]),[Fr(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),Lt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,b,Z]),!0))]);this.program.push(l,f,m,h,O);let x=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),he=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)),j=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,ye)]),n.createObjectLiteralExpression([x,he,j])])))),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])))),xe=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]),ye)])))),[ve,st]=["json","text"].map(S=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,S),void 0,void 0))),Le=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(Et,[n.createTemplateSpan(this.ids.methodParameter,zt),n.createTemplateSpan(this.ids.pathParameter,ye)]),z.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([ve])),M=n.createVariableStatement(B,q(this.ids.exampleImplementationConst,Lt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([oe,xe,V,Le,st]),!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"))])])),be=n.createVariableStatement(void 0,q(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(M,be,G)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:kt(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)=>kt(i,s<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
23
23
 
24
- `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await X("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let i=this.printUsage(t);this.usage=i&&o?[await o(i)]:this.usage;let s=this.print(t);return o?o(s):s}};var Mi={dateIn:hr,dateOut:xr,file:Ke,upload:Jt,raw:Qt};export{le as AbstractEndpoint,me as BuiltinLogger,Ie as DependsOnMethod,wt as Documentation,P as DocumentationError,Ce as EndpointsFactory,k as InputValidationError,Ut as Integration,se as MissingPeerError,_ as OutputValidationError,ie as RoutingError,we as ServeStatic,Po as arrayEndpointsFactory,bt as arrayResultHandler,$o as attachRouting,yo as createConfig,Mo as createLogger,ht as createMiddleware,xt as createResultHandler,Vo as createServer,Ao as defaultEndpointsFactory,Pe as defaultResultHandler,Mi as ez,U as getExamples,H as getMessageFromError,je as getStatusCodeFromError,si as testEndpoint};
24
+ `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await X("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let i=this.printUsage(t);this.usage=i&&o?[await o(i)]:this.usage;let s=this.print(t);return o?o(s):s}};var Ni={dateIn:gr,dateOut:hr,file:Ke,upload:Jt,raw:Qt};export{le as AbstractEndpoint,me as BuiltinLogger,Ie as DependsOnMethod,wt as Documentation,P as DocumentationError,Ce as EndpointsFactory,k as InputValidationError,Ut as Integration,se as MissingPeerError,_ as OutputValidationError,ie as RoutingError,we as ServeStatic,Ao as arrayEndpointsFactory,bt as arrayResultHandler,qo as attachRouting,fo as createConfig,No as createLogger,ht as createMiddleware,xt as createResultHandler,$o as createServer,Oo as defaultEndpointsFactory,Pe as defaultResultHandler,Ni as ez,U as getExamples,H as getMessageFromError,je as getStatusCodeFromError,ii as testEndpoint};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "19.3.1",
3
+ "version": "19.4.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": {
@@ -81,7 +81,7 @@
81
81
  "express": "^4.19.2",
82
82
  "express-fileupload": "^1.5.0",
83
83
  "http-errors": "^2.0.0",
84
- "jest": ">=28 <30",
84
+ "jest": ">=28 <31",
85
85
  "prettier": "^3.1.0",
86
86
  "typescript": "^5.1.3",
87
87
  "vitest": "^1.0.4 || ^2.0.0",