express-zod-api 21.0.0-beta.5 → 21.0.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
@@ -15,7 +15,7 @@
15
15
  - Plural `methods`, `tags` and `scopes` properties replaced with singular `method`, `tag`, `scope` accordingly;
16
16
  - The `method` property also made optional and can now be derived from `DependsOnMethod` or imply `GET` by default;
17
17
  - When `method` is assigned with an array, it must be non-empty.
18
- - Breaking changes to `positive` and `negative` propeties of `ResultHandler` constructor argument:
18
+ - Breaking changes to `positive` and `negative` properties of `ResultHandler` constructor argument:
19
19
  - Plural `statusCodes` and `mimeTypes` props within the values are replaced with singular `statusCode` and `mimeType`.
20
20
  - Other breaking changes:
21
21
  - The `serializer` property of `Documentation` and `Integration` constructor argument removed;
@@ -56,6 +56,12 @@ const { servers } = await createServer(config, {});
56
56
 
57
57
  ## Version 20
58
58
 
59
+ ### v20.22.1
60
+
61
+ - Avoids startup logo distortion when the terminal is too narrow;
62
+ - Self-diagnosis for potential problems disabled in production mode to ensure faster startup:
63
+ - Warning about potentially unserializable schema for JSON operating endpoints was introduced in v20.15.0.
64
+
59
65
  ### v20.22.0
60
66
 
61
67
  - Featuring a helper to describe nested Routing for already assigned routes:
package/README.md CHANGED
@@ -870,6 +870,7 @@ origins of errors that could happen in runtime and be handled the following way:
870
870
  Consider enabling production mode by setting `NODE_ENV` environment variable to `production` for your deployment:
871
871
 
872
872
  - Express activates some [performance optimizations](https://expressjs.com/en/advanced/best-practice-performance.html);
873
+ - Self-diagnosis for potential problems is disabled to ensure faster startup;
873
874
  - The `defaultResultHandler`, `defaultEndpointsFactory` and `LastResortHandler` generalize server-side error messages
874
875
  in negative responses in order to improve the security of your API by not disclosing the exact causes of errors:
875
876
  - Throwing errors that have or imply `5XX` status codes become just `Internal Server Error` message in response;
package/SECURITY.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  | Version | Release | Supported |
6
6
  | ------: | :------ | :----------------: |
7
- | 21.x.x | 12.2024 | :white_check_mark: |
7
+ | 21.x.x | 11.2024 | :white_check_mark: |
8
8
  | 20.x.x | 06.2024 | :white_check_mark: |
9
9
  | 19.x.x | 05.2024 | :white_check_mark: |
10
10
  | 18.x.x | 04.2024 | :white_check_mark: |
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
- "use strict";var Bo=Object.create;var Qe=Object.defineProperty;var qo=Object.getOwnPropertyDescriptor;var $o=Object.getOwnPropertyNames;var Go=Object.getPrototypeOf,Vo=Object.prototype.hasOwnProperty;var _o=(e,t)=>{for(var r in t)Qe(e,r,{get:t[r],enumerable:!0})},cr=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of $o(t))!Vo.call(e,n)&&n!==r&&Qe(e,n,{get:()=>t[n],enumerable:!(o=qo(t,n))||o.enumerable});return e};var C=(e,t,r)=>(r=e!=null?Bo(Go(e)):{},cr(t||!e||!e.__esModule?Qe(r,"default",{value:e,enumerable:!0}):r,e)),Yo=e=>cr(Qe({},"__esModule",{value:!0}),e);var Es={};_o(Es,{BuiltinLogger:()=>Ie,DependsOnMethod:()=>Ce,Documentation:()=>ht,DocumentationError:()=>v,EndpointsFactory:()=>ze,InputValidationError:()=>F,Integration:()=>Pt,Middleware:()=>_,MissingPeerError:()=>he,OutputValidationError:()=>J,ResultHandler:()=>Pe,RoutingError:()=>ne,ServeStatic:()=>Ee,arrayEndpointsFactory:()=>Cr,arrayResultHandler:()=>lt,attachRouting:()=>no,createConfig:()=>mr,createServer:()=>so,defaultEndpointsFactory:()=>Ir,defaultResultHandler:()=>we,ensureHttpError:()=>Fe,ez:()=>Ko,getExamples:()=>V,getMessageFromError:()=>X,testEndpoint:()=>Ao,testMiddleware:()=>Po});module.exports=Yo(Es);var Z=require("ramda"),ae=require("zod");var xe=require("ramda"),dr=require("zod");var P={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var ne=class extends Error{name="RoutingError"},v=class extends Error{name="DocumentationError";cause;constructor(t,{method:r,path:o,isResponse:n}){super(t),this.cause=`${n?"Response":"Input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`}},Je=class extends Error{name="IOSchemaError"},J=class extends Je{constructor(r){super(X(r),{cause:r});this.cause=r}name="OutputValidationError"},F=class extends Je{constructor(r){super(X(r),{cause:r});this.cause=r}name="InputValidationError"},W=class extends Error{constructor(r,o){super(X(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},he=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var Qo=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(P.upload);return"files"in e&&r},It={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Jo=["body","query","params"],Ct=e=>e.method.toLowerCase(),Zt=e=>e.startsWith("x-"),Wo=e=>(0,xe.pickBy)((t,r)=>Zt(r),e),We=(e,t={})=>{let r=Ct(e);return r==="options"?{}:(t[r]||It[r]||Jo).filter(o=>o==="files"?Qo(e):!0).map(o=>o==="headers"?Wo(e[o]):e[o]).reduce((o,n)=>Object.assign(o,n),{})},ee=e=>e instanceof Error?e:new Error(String(e)),X=e=>e instanceof dr.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof J?`output${e.cause.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,V=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[x]?.examples||[];if(!r&&t==="original")return o;let n=[];for(let i of o){let a=e.safeParse(i);a.success&&n.push(t==="parsed"?a.data:i)}return n},se=(e,t,r)=>e.length&&t.length?(0,xe.xprod)(e,t).map(r):e.concat(t),Ue=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,Et=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),D=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(Et).join(""),Xe=(e,t)=>{try{return typeof e.parse(t)}catch{return}},ie=e=>typeof e=="object"&&e!==null,et=(0,xe.memoizeWith)(()=>"static",()=>process.env.NODE_ENV==="production");var tt=require("ramda"),x=Symbol.for("express-zod-api"),rt=e=>{let t=e.describe(e.description);return t._def[x]=(0,tt.clone)(t._def[x])||{examples:[]},t},lr=(e,t)=>{if(!(x in e._def))return t;let r=rt(t);return r._def[x].examples=se(r._def[x].examples,e._def[x].examples,([o,n])=>typeof o=="object"&&typeof n=="object"?(0,tt.mergeDeepRight)({...o},{...n}):n),r};var Xo=function(e){let t=rt(this);return t._def[x].examples.push(e),t},en=function(e){let t=rt(this);return t._def[x].defaultLabel=e,t},tn=function(e){return new ae.z.ZodBranded({typeName:ae.z.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[x]:{examples:[],...(0,Z.clone)(this._def[x]),brand:e}})},rn=function(e){let t=typeof e=="function"?e:(0,Z.pipe)(Z.toPairs,(0,Z.map)(([n,i])=>(0,Z.pair)(e[String(n)]||n,i)),Z.fromPairs),r=t((0,Z.clone)(this.shape)),o=ae.z.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};x in globalThis||(globalThis[x]=!0,Object.defineProperties(ae.z.ZodType.prototype,{example:{get(){return Xo.bind(this)}},brand:{set(){},get(){return tn.bind(this)}}}),Object.defineProperty(ae.z.ZodDefault.prototype,"label",{get(){return en.bind(this)}}),Object.defineProperty(ae.z.ZodObject.prototype,"remap",{get(){return rn.bind(this)}}));function mr(e){return e}var zr=require("zod");var Dt=require("zod");var w=require("node:assert/strict");var be=require("zod");var ot=e=>!isNaN(e.getTime());var pe=Symbol("DateIn"),ur=()=>be.z.union([be.z.string().date(),be.z.string().datetime(),be.z.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(be.z.date().refine(ot)).brand(pe);var fr=require("zod");var ce=Symbol("DateOut"),yr=()=>fr.z.date().refine(ot).transform(e=>e.toISOString()).brand(ce);var De=require("zod"),B=Symbol("File"),gr=De.z.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),on={buffer:()=>gr.brand(B),string:()=>De.z.string().brand(B),binary:()=>gr.or(De.z.string()).brand(B),base64:()=>De.z.string().base64().brand(B)};function nt(e){return on[e||"string"]()}var hr=require("zod");var te=Symbol("Raw"),xr=(e={})=>hr.z.object({raw:nt("buffer")}).extend(e).brand(te);var br=require("zod"),Se=Symbol("Upload"),Sr=()=>br.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(Se);var Tr=(e,{next:t})=>e.options.some(t),nn=({_def:e},{next:t})=>[e.left,e.right].some(t),st=(e,{next:t})=>t(e.unwrap()),vt={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:Tr,ZodDiscriminatedUnion:Tr,ZodIntersection:nn,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:st,ZodNullable:st,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},it=(e,{condition:t,rules:r=vt,depth:o=1,maxDepth:n=Number.POSITIVE_INFINITY})=>{if(t?.(e))return!0;let i=o<n?r[e._def[x]?.brand]||r[e._def.typeName]:void 0;return i?i(e,{next:a=>it(a,{condition:t,rules:r,maxDepth:n,depth:o+1})}):!1},Or=e=>it(e,{condition:t=>t._def[x]?.brand===Se}),Rr=e=>it(e,{condition:t=>t._def[x]?.brand===te,maxDepth:3}),jt=(e,t)=>{let r=new WeakSet;return it(e,{maxDepth:300,rules:{...vt,ZodBranded:st,ZodReadonly:st,ZodCatch:({_def:{innerType:o}},{next:n})=>n(o),ZodPipeline:({_def:o},{next:n})=>n(o[t]),ZodLazy:(o,{next:n})=>r.has(o)?!1:r.add(o)&&n(o.schema),ZodTuple:({items:o,_def:{rest:n}},{next:i})=>[...o].concat(n??[]).some(i),ZodEffects:{out:void 0,in:vt.ZodEffects}[t],ZodNaN:()=>(0,w.fail)("z.nan()"),ZodSymbol:()=>(0,w.fail)("z.symbol()"),ZodFunction:()=>(0,w.fail)("z.function()"),ZodMap:()=>(0,w.fail)("z.map()"),ZodSet:()=>(0,w.fail)("z.set()"),ZodBigInt:()=>(0,w.fail)("z.bigint()"),ZodVoid:()=>(0,w.fail)("z.void()"),ZodPromise:()=>(0,w.fail)("z.promise()"),ZodNever:()=>(0,w.fail)("z.never()"),ZodDate:()=>t==="in"&&(0,w.fail)("z.date()"),[ce]:()=>t==="in"&&(0,w.fail)("ez.dateOut()"),[pe]:()=>t==="out"&&(0,w.fail)("ez.dateIn()"),[te]:()=>t==="out"&&(0,w.fail)("ez.raw()"),[Se]:()=>t==="out"&&(0,w.fail)("ez.upload()"),[B]:()=>!1}})};var at=C(require("http-errors"),1);var Ke=C(require("http-errors"),1),Ar=require("zod");var Nt=(e,{variant:t,args:r,...o})=>{if(typeof e=="function"&&(e=e(...r)),e instanceof Ar.z.ZodType)return[{schema:e,...o}];if(Array.isArray(e)&&!e.length){let n=new Error(`At least one ${t} response schema required.`);throw new W(n)}return(Array.isArray(e)?e:[e]).map(({schema:n,statusCode:i,mimeType:a})=>({schema:n,statusCodes:typeof i=="number"?[i]:i||o.statusCodes,mimeTypes:typeof a=="string"?[a]:a||o.mimeTypes}))},Lt=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),Fe=e=>(0,Ke.isHttpError)(e)?e:(0,Ke.default)(e instanceof F?400:500,X(e),{cause:e.cause||e}),Be=e=>et()&&!e.expose?(0,Ke.default)(e.statusCode).message:e.message;var pt=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=Be((0,at.default)(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`
2
- Original error: ${e.handled.message}.`:""),{expose:(0,at.isHttpError)(e.cause)?e.cause.expose:!1}));r.status(500).type("text/plain").end(o)};var Pr=require("ramda");var de=e=>ie(e)&&"or"in e,Oe=e=>ie(e)&&"and"in e,kt=e=>({and:(0,Pr.chain)(t=>Oe(t)?t.and:[t],e)}),ct=(e,t)=>Oe(e)?{and:e.and.map(r=>de(r)?{or:r.or.map(t)}:t(r))}:de(e)?{or:e.or.map(r=>Oe(r)?{and:r.and.map(t)}:t(r))}:t(e),Mt=e=>e.and.reduce((t,r)=>({or:se(t.or,de(r)?r.or:[r],kt)}),{or:[]}),Te=(e,t)=>Oe(e)?de(t)?Te(Mt(e),t):kt([e,t]):de(e)?Oe(t)?Te(t,e):de(t)?{or:se(e.or,t.or,kt)}:Te(e,{and:[t]}):Oe(t)||de(t)?Te(t,e):{and:[e,t]};var Ht=require("zod");var Ut=class{},_=class extends Ut{#e;#t;#r;constructor({input:t=Ht.z.object({}),security:r,handler:o}){super(),this.#e=t,this.#t=r,this.#r=o}getSecurity(){return this.#t}getSchema(){return this.#e}async execute({input:t,...r}){try{let o=await this.#e.parseAsync(t);return this.#r({...r,input:o})}catch(o){throw o instanceof Ht.z.ZodError?new F(o):o}}},Re=class extends _{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({handler:async({request:n,response:i})=>new Promise((a,p)=>{let d=c=>{if(c&&c instanceof Error)return p(o(c));a(r(n,i))};t(n,i,d)?.catch(d)})})}};var Ae=class{nest(t){return Object.assign(t,{"":this})}};var qe=class extends Ae{},dt=class extends qe{#e;#t;#r;#n;#s;#i;#o;#a;#p;#c;#d;constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:i,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:f,shortDescription:m}){super(),this.#s=n,this.#i=i,this.#r=d,this.#c=a,this.#t=Object.freeze(t),this.#a=Object.freeze(p),this.#p=Object.freeze(c),this.#e={long:f,short:m},this.#o={input:r,output:o},this.#n={positive:Object.freeze(i.getPositiveResponse(o)),negative:Object.freeze(i.getNegativeResponse())},this.#d=Or(r)?"upload":Rr(r)?"raw":"json"}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return this.#o[t]}getRequestType(){return this.#d}getResponses(t){return this.#n[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?Te(t,o):t},{and:[]})}getScopes(){return this.#a}getTags(){return this.#p}getOperationId(t){return this.#c(t)}async#l(t){try{return await this.#o.output.parseAsync(t)}catch(r){throw r instanceof Dt.z.ZodError?new J(r):r}}async#m({method:t,logger:r,options:o,response:n,...i}){for(let a of this.#r)if(!(t==="options"&&!(a instanceof Re))&&(Object.assign(o,await a.execute({...i,options:o,response:n,logger:r})),n.writableEnded)){r.warn("A middleware has closed the stream. Accumulated options:",o);break}}async#u({input:t,...r}){let o;try{o=await this.#o.input.parseAsync(t)}catch(n){throw n instanceof Dt.z.ZodError?new F(n):n}return this.#s({...r,input:o})}async#f({error:t,...r}){try{await this.#i.execute({...r,error:t})}catch(o){pt({...r,error:new W(ee(o),t||void 0)})}}async execute({request:t,response:r,logger:o,config:n}){let i=Ct(t),a={},p=null,d=null,c=We(t,n.inputSources);try{if(await this.#m({method:i,input:c,request:t,response:r,logger:o,options:a}),r.writableEnded)return;if(i==="options")return void r.status(200).end();p=await this.#l(await this.#u({input:c,logger:o,options:a}))}catch(f){d=ee(f)}await this.#f({input:c,output:p,request:t,response:r,error:d,logger:o,options:a})}};var wr=(e,t)=>{let r=e.map(n=>n.getSchema()).concat(t),o=r.reduce((n,i)=>n.and(i));return r.reduce((n,i)=>lr(i,n),o)};var K=require("zod");var le={positive:200,negative:400};var Kt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},Pe=class extends Kt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return Nt(this.#e,{variant:"positive",args:[t],statusCodes:[le.positive],mimeTypes:[P.json]})}getNegativeResponse(){return Nt(this.#t,{variant:"negative",args:[],statusCodes:[le.negative],mimeTypes:[P.json]})}},we=new Pe({positive:e=>{let t=V({schema:e}),r=K.z.object({status:K.z.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:K.z.object({status:K.z.literal("error"),error:K.z.object({message:K.z.string()})}).example({status:"error",error:{message:"Sample error message"}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:i})=>{if(e){let a=Fe(e);return Lt(a,i,o,t),void n.status(a.statusCode).json({status:"error",error:{message:Be(a)}})}n.status(le.positive).json({status:"success",data:r})}}),lt=new Pe({positive:e=>{let t=V({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof K.z.ZodArray?e.shape.items:K.z.array(K.z.any());return t.reduce((o,n)=>ie(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:K.z.string().example("Sample error message"),handler:({response:e,output:t,error:r,logger:o,request:n,input:i})=>{if(r){let a=Fe(r);return Lt(a,o,n,i),void e.status(a.statusCode).type("text/plain").send(Be(a))}if(t&&"items"in t&&Array.isArray(t.items))return void e.status(le.positive).json(t.items);throw new Error("Property 'items' is missing in the endpoint output")}});var ze=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 instanceof _?t:new _(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new Re(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new _({handler:t})),this.resultHandler)}build({input:t=zr.z.object({}),handler:r,output:o,description:n,shortDescription:i,operationId:a,scope:p,tag:d,method:c}){let{middlewares:f,resultHandler:m}=this,g=typeof c=="string"?[c]:c,b=typeof a=="function"?a:()=>a,A=typeof p=="string"?[p]:p||[],R=typeof d=="string"?[d]:d||[];return new dt({handler:r,middlewares:f,outputSchema:o,resultHandler:m,scopes:A,tags:R,methods:g,getOperationId:b,description:n,shortDescription:i,inputSchema:wr(f,t)})}},Ir=new ze(we),Cr=new ze(lt);var j=require("ansis"),kr=require("node:util"),Ft=require("node:perf_hooks");var ut={debug:10,info:20,warn:30,error:40},Er=e=>ie(e)&&Object.keys(ut).some(t=>t in e),vr=e=>e in ut,jr=(e,t)=>ut[e]<ut[t],Nr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),mt=Nr(),Zr=Nr(2),sn=e=>e<1e-6?["picosecond",e/1e-9,mt]:e<.001?["nanosecond",e/1e-6,mt]:e<1?["microsecond",e/.001,mt]:e<1e3?["millisecond",e,mt]:e<6e4?["second",e/1e3,Zr]:["minute",e/6e4,Zr],Lr=e=>{let[t,r,o]=sn(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var Ie=class e{config;styles={debug:j.blue,info:j.green,warn:(0,j.hex)("#FFA500"),error:j.red};constructor(t={}){let{color:r=new j.Ansis().isSupported(),level:o=et()?"warn":"debug",depth:n=2,ctx:i={}}=t;this.config={color:r,level:o,depth:n,ctx:i}}prettyPrint(t){let{depth:r,color:o,level:n}=this.config;return(0,kr.inspect)(t,{depth:r,colors:o,breakLength:n==="debug"?80:1/0,compact:n==="debug"?3:!0})}print(t,r,o){let{level:n,ctx:{requestId:i,...a},color:p}=this.config;if(n==="silent"||jr(t,n))return;let d=[new Date().toISOString()];i&&d.push(p?(0,j.cyanBright)(i):i),d.push(p?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&d.push(this.prettyPrint(o)),Object.keys(a).length>0&&d.push(this.prettyPrint(a)),console.log(d.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})}profile(t){let r=Ft.performance.now();return()=>{let o=Ft.performance.now()-r,{message:n,severity:i="debug",formatter:a=Lr}=typeof t=="object"?t:{message:t};this.print(typeof i=="function"?i(o):i,n,a(o))}}};var Ze=require("ramda");var Ce=class extends Ae{entries;constructor(t){super();let r=[],o=(0,Ze.keys)(t);for(let n of o){let i=t[n];i&&r.push([n,i,(0,Ze.reject)((0,Ze.equals)(n),o)])}this.entries=Object.freeze(r)}};var Mr=C(require("express"),1),Ee=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Mr.default.static(...this.params))}};var ft=C(require("express"),1),to=C(require("node:http"),1),ro=C(require("node:https"),1);var ve=async(e,t="default")=>{try{return(await Promise.resolve().then(()=>C(require(e))))[t]}catch{}throw new he(e)};var Hr=(e,t)=>Object.entries(e).map(([r,o])=>{if(r.includes("/"))throw new ne(`The entry '${r}' must avoid having slashes \u2014 use nesting instead.`);let n=r.trim();return[`${t||""}${n?`/${n}`:""}`,o]}),je=({routing:e,onEndpoint:t,onStatic:r})=>{let o=Hr(e);for(;o.length;){let[n,i]=o.shift();if(i instanceof qe){let a=i.getMethods()||["get"];for(let p of a)t(i,n,p)}else if(i instanceof Ee)r&&i.apply(n,r);else if(i instanceof Ce)for(let[a,p,d]of i.entries){let c=p.getMethods();if(c&&!c.includes(a))throw new ne(`Endpoint assigned to ${a} method of ${n} must support ${a} method.`);t(p,n,a,d)}else o.unshift(...Hr(i,n))}};var Bt=({app:e,getLogger:t,config:r,routing:o,parsers:n})=>{let i=new WeakSet,a=new Set;je({routing:o,onStatic:(p,d)=>void e.use(p,d),onEndpoint:(p,d,c,f)=>{let m=p.getRequestType();if(!i.has(p)){if(m==="json")try{jt(p.getSchema("input"),"in")}catch(y){t().warn("The final input schema of the endpoint contains an unsupported JSON payload type.",{path:d,method:c,reason:y})}for(let y of["positive","negative"])for(let{mimeTypes:O,schema:z}of p.getResponses(y))if(O.includes(P.json))try{jt(z,"out")}catch(E){t().warn(`The final ${y} response schema of the endpoint contains an unsupported JSON payload type.`,{path:d,method:c,reason:E})}i.add(p)}let b={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":[c,...f||[],"options"].join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"},A=n?.[m]||[],R=async(y,O)=>{let z=t(y);if(r.cors){let E=typeof r.cors=="function"?await r.cors({request:y,endpoint:p,logger:z,defaultHeaders:b}):b;for(let q in E)O.set(q,E[q])}return p.execute({request:y,response:O,logger:z,config:r})};r.cors&&!a.has(d)&&(e.options(d,...A,R),a.add(d)),e[c](d,...A,R)}})};var $e=C(require("http-errors"),1);var qr=require("node:timers/promises");var Ur=e=>"_httpMessage"in e&&typeof e._httpMessage=="object"&&e._httpMessage!==null&&"headersSent"in e._httpMessage&&typeof e._httpMessage.headersSent=="boolean"&&"setHeader"in e._httpMessage&&typeof e._httpMessage.setHeader=="function",Dr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Kr=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Fr=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),Br=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var $r=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,i=c=>void n.delete(c.destroy()),a=c=>void(Ur(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):i(c)),p=c=>void(o?c.destroy():n.add(c.once("close",()=>void n.delete(c))));for(let c of e)for(let f of["connection","secureConnection"])c.on(f,p);let d=async()=>{for(let c of e)c.on("request",Fr);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(Kr(c)||Dr(c))&&a(c);for await(let c of(0,qr.setInterval)(10,Date.now()))if(n.size===0||Date.now()-c>=t)break;for(let c of n)i(c);return Promise.allSettled(e.map(Br))};return{sockets:n,shutdown:()=>o??=d()}};var Gr=({errorHandler:e,getLogger:t})=>async(r,o,n,i)=>r?e.execute({error:(0,$e.isHttpError)(r)?r:(0,$e.default)(400,ee(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):i(),Vr=({errorHandler:e,getLogger:t})=>async(r,o)=>{let n=(0,$e.default)(404,`Can not ${r.method} ${r.path}`),i=t(r);try{e.execute({request:r,response:o,logger:i,error:n,input:null,output:null,options:{}})}catch(a){pt({response:o,logger:i,error:new W(ee(a),n)})}},an=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},pn=e=>({log:e.debug.bind(e)}),_r=async({getLogger:e,config:t})=>{let r=await ve("express-fileupload"),{limitError:o,beforeUpload:n,...i}={...typeof t.upload=="object"&&t.upload},a=[];return a.push(async(p,d,c)=>{let f=e(p);try{await n?.({request:p,logger:f})}catch(m){return c(m)}return r({debug:!0,...i,abortOnLimit:!1,parseNested:!0,logger:pn(f)})(p,d,c)}),o&&a.push(an(o)),a},Yr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},Qr=({logger:e,config:t})=>async(r,o,n)=>{let i=await t.childLoggerProvider?.({request:r,parent:e})||e;i.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[x]={logger:i}),n()},Jr=e=>t=>t?.res?.locals[x]?.logger||e,Wr=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
3
- `).slice(1))),Xr=({servers:e,logger:t,options:{timeout:r,events:o=["SIGINT","SIGTERM"]}})=>{let n=$r(e,{logger:t,timeout:r}),i=()=>n.shutdown().then(()=>process.exit());for(let a of o)process.on(a,i)};var N=require("ansis"),eo=()=>{let e=(0,N.italic)("Proudly supports transgender community.".padStart(109)),t=(0,N.italic)("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=(0,N.italic)("Thank you for choosing Express Zod API for your project.".padStart(132)),o=(0,N.italic)("for Kesaria".padEnd(20)),n=(0,N.hex)("#F5A9B8"),i=(0,N.hex)("#5BCEFA"),a=new Array(14).fill(i,1,3).fill(n,3,5).fill(N.whiteBright,5,7).fill(n,7,9).fill(i,9,12).fill(N.gray,12,13);return`
1
+ "use strict";var qo=Object.create;var Je=Object.defineProperty;var $o=Object.getOwnPropertyDescriptor;var Go=Object.getOwnPropertyNames;var Vo=Object.getPrototypeOf,_o=Object.prototype.hasOwnProperty;var Yo=(e,t)=>{for(var r in t)Je(e,r,{get:t[r],enumerable:!0})},dr=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Go(t))!_o.call(e,n)&&n!==r&&Je(e,n,{get:()=>t[n],enumerable:!(o=$o(t,n))||o.enumerable});return e};var I=(e,t,r)=>(r=e!=null?qo(Vo(e)):{},dr(t||!e||!e.__esModule?Je(r,"default",{value:e,enumerable:!0}):r,e)),Qo=e=>dr(Je({},"__esModule",{value:!0}),e);var vs={};Yo(vs,{BuiltinLogger:()=>Ce,DependsOnMethod:()=>Ze,Documentation:()=>xt,DocumentationError:()=>Z,EndpointsFactory:()=>Ie,InputValidationError:()=>F,Integration:()=>wt,Middleware:()=>_,MissingPeerError:()=>he,OutputValidationError:()=>J,ResultHandler:()=>we,RoutingError:()=>ne,ServeStatic:()=>ve,arrayEndpointsFactory:()=>Zr,arrayResultHandler:()=>lt,attachRouting:()=>so,createConfig:()=>ur,createServer:()=>io,defaultEndpointsFactory:()=>Cr,defaultResultHandler:()=>ze,ensureHttpError:()=>Be,ez:()=>Fo,getExamples:()=>V,getMessageFromError:()=>X,testEndpoint:()=>Po,testMiddleware:()=>wo});module.exports=Qo(vs);var C=require("ramda"),ae=require("zod");var xe=require("ramda"),lr=require("zod");var A={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var ne=class extends Error{name="RoutingError"},Z=class extends Error{name="DocumentationError";cause;constructor(t,{method:r,path:o,isResponse:n}){super(t),this.cause=`${n?"Response":"Input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`}},We=class extends Error{name="IOSchemaError"},J=class extends We{constructor(r){super(X(r),{cause:r});this.cause=r}name="OutputValidationError"},F=class extends We{constructor(r){super(X(r),{cause:r});this.cause=r}name="InputValidationError"},W=class extends Error{constructor(r,o){super(X(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},he=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var Jo=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(A.upload);return"files"in e&&r},Ct={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Wo=["body","query","params"],Zt=e=>e.method.toLowerCase(),Et=e=>e.startsWith("x-"),Xo=e=>(0,xe.pickBy)((t,r)=>Et(r),e),Xe=(e,t={})=>{let r=Zt(e);return r==="options"?{}:(t[r]||Ct[r]||Wo).filter(o=>o==="files"?Jo(e):!0).map(o=>o==="headers"?Xo(e[o]):e[o]).reduce((o,n)=>Object.assign(o,n),{})},ee=e=>e instanceof Error?e:new Error(String(e)),X=e=>e instanceof lr.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof J?`output${e.cause.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,V=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[b]?.examples||[];if(!r&&t==="original")return o;let n=[];for(let i of o){let a=e.safeParse(i);a.success&&n.push(t==="parsed"?a.data:i)}return n},se=(e,t,r)=>e.length&&t.length?(0,xe.xprod)(e,t).map(r):e.concat(t),De=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,vt=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),U=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(vt).join(""),et=(e,t)=>{try{return typeof e.parse(t)}catch{return}},ie=e=>typeof e=="object"&&e!==null,be=(0,xe.memoizeWith)(()=>"static",()=>process.env.NODE_ENV==="production");var tt=require("ramda"),b=Symbol.for("express-zod-api"),rt=e=>{let t=e.describe(e.description);return t._def[b]=(0,tt.clone)(t._def[b])||{examples:[]},t},mr=(e,t)=>{if(!(b in e._def))return t;let r=rt(t);return r._def[b].examples=se(r._def[b].examples,e._def[b].examples,([o,n])=>typeof o=="object"&&typeof n=="object"?(0,tt.mergeDeepRight)({...o},{...n}):n),r};var en=function(e){let t=rt(this);return t._def[b].examples.push(e),t},tn=function(e){let t=rt(this);return t._def[b].defaultLabel=e,t},rn=function(e){return new ae.z.ZodBranded({typeName:ae.z.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[b]:{examples:[],...(0,C.clone)(this._def[b]),brand:e}})},on=function(e){let t=typeof e=="function"?e:(0,C.pipe)(C.toPairs,(0,C.map)(([n,i])=>(0,C.pair)(e[String(n)]||n,i)),C.fromPairs),r=t((0,C.clone)(this.shape)),o=ae.z.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};b in globalThis||(globalThis[b]=!0,Object.defineProperties(ae.z.ZodType.prototype,{example:{get(){return en.bind(this)}},brand:{set(){},get(){return rn.bind(this)}}}),Object.defineProperty(ae.z.ZodDefault.prototype,"label",{get(){return tn.bind(this)}}),Object.defineProperty(ae.z.ZodObject.prototype,"remap",{get(){return on.bind(this)}}));function ur(e){return e}var Ir=require("zod");var Kt=require("zod");var P=require("node:assert/strict");var Se=require("zod");var ot=e=>!isNaN(e.getTime());var pe=Symbol("DateIn"),fr=()=>Se.z.union([Se.z.string().date(),Se.z.string().datetime(),Se.z.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Se.z.date().refine(ot)).brand(pe);var yr=require("zod");var ce=Symbol("DateOut"),gr=()=>yr.z.date().refine(ot).transform(e=>e.toISOString()).brand(ce);var Ke=require("zod"),B=Symbol("File"),hr=Ke.z.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),nn={buffer:()=>hr.brand(B),string:()=>Ke.z.string().brand(B),binary:()=>hr.or(Ke.z.string()).brand(B),base64:()=>Ke.z.string().base64().brand(B)};function nt(e){return nn[e||"string"]()}var xr=require("zod");var te=Symbol("Raw"),br=(e={})=>xr.z.object({raw:nt("buffer")}).extend(e).brand(te);var Sr=require("zod"),Te=Symbol("Upload"),Tr=()=>Sr.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(Te);var Or=(e,{next:t})=>e.options.some(t),sn=({_def:e},{next:t})=>[e.left,e.right].some(t),st=(e,{next:t})=>t(e.unwrap()),jt={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:Or,ZodDiscriminatedUnion:Or,ZodIntersection:sn,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:st,ZodNullable:st,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},it=(e,{condition:t,rules:r=jt,depth:o=1,maxDepth:n=Number.POSITIVE_INFINITY})=>{if(t?.(e))return!0;let i=o<n?r[e._def[b]?.brand]||r[e._def.typeName]:void 0;return i?i(e,{next:a=>it(a,{condition:t,rules:r,maxDepth:n,depth:o+1})}):!1},Rr=e=>it(e,{condition:t=>t._def[b]?.brand===Te}),Ar=e=>it(e,{condition:t=>t._def[b]?.brand===te,maxDepth:3}),Nt=(e,t)=>{let r=new WeakSet;return it(e,{maxDepth:300,rules:{...jt,ZodBranded:st,ZodReadonly:st,ZodCatch:({_def:{innerType:o}},{next:n})=>n(o),ZodPipeline:({_def:o},{next:n})=>n(o[t]),ZodLazy:(o,{next:n})=>r.has(o)?!1:r.add(o)&&n(o.schema),ZodTuple:({items:o,_def:{rest:n}},{next:i})=>[...o].concat(n??[]).some(i),ZodEffects:{out:void 0,in:jt.ZodEffects}[t],ZodNaN:()=>(0,P.fail)("z.nan()"),ZodSymbol:()=>(0,P.fail)("z.symbol()"),ZodFunction:()=>(0,P.fail)("z.function()"),ZodMap:()=>(0,P.fail)("z.map()"),ZodSet:()=>(0,P.fail)("z.set()"),ZodBigInt:()=>(0,P.fail)("z.bigint()"),ZodVoid:()=>(0,P.fail)("z.void()"),ZodPromise:()=>(0,P.fail)("z.promise()"),ZodNever:()=>(0,P.fail)("z.never()"),ZodDate:()=>t==="in"&&(0,P.fail)("z.date()"),[ce]:()=>t==="in"&&(0,P.fail)("ez.dateOut()"),[pe]:()=>t==="out"&&(0,P.fail)("ez.dateIn()"),[te]:()=>t==="out"&&(0,P.fail)("ez.raw()"),[Te]:()=>t==="out"&&(0,P.fail)("ez.upload()"),[B]:()=>!1}})};var at=I(require("http-errors"),1);var Fe=I(require("http-errors"),1),Pr=require("zod");var Lt=(e,{variant:t,args:r,...o})=>{if(typeof e=="function"&&(e=e(...r)),e instanceof Pr.z.ZodType)return[{schema:e,...o}];if(Array.isArray(e)&&!e.length){let n=new Error(`At least one ${t} response schema required.`);throw new W(n)}return(Array.isArray(e)?e:[e]).map(({schema:n,statusCode:i,mimeType:a})=>({schema:n,statusCodes:typeof i=="number"?[i]:i||o.statusCodes,mimeTypes:typeof a=="string"?[a]:a||o.mimeTypes}))},kt=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),Be=e=>(0,Fe.isHttpError)(e)?e:(0,Fe.default)(e instanceof F?400:500,X(e),{cause:e.cause||e}),qe=e=>be()&&!e.expose?(0,Fe.default)(e.statusCode).message:e.message;var pt=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=qe((0,at.default)(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`
2
+ Original error: ${e.handled.message}.`:""),{expose:(0,at.isHttpError)(e.cause)?e.cause.expose:!1}));r.status(500).type("text/plain").end(o)};var wr=require("ramda");var de=e=>ie(e)&&"or"in e,Re=e=>ie(e)&&"and"in e,Mt=e=>({and:(0,wr.chain)(t=>Re(t)?t.and:[t],e)}),ct=(e,t)=>Re(e)?{and:e.and.map(r=>de(r)?{or:r.or.map(t)}:t(r))}:de(e)?{or:e.or.map(r=>Re(r)?{and:r.and.map(t)}:t(r))}:t(e),Ht=e=>e.and.reduce((t,r)=>({or:se(t.or,de(r)?r.or:[r],Mt)}),{or:[]}),Oe=(e,t)=>Re(e)?de(t)?Oe(Ht(e),t):Mt([e,t]):de(e)?Re(t)?Oe(t,e):de(t)?{or:se(e.or,t.or,Mt)}:Oe(e,{and:[t]}):Re(t)||de(t)?Oe(t,e):{and:[e,t]};var Ut=require("zod");var Dt=class{},_=class extends Dt{#e;#t;#r;constructor({input:t=Ut.z.object({}),security:r,handler:o}){super(),this.#e=t,this.#t=r,this.#r=o}getSecurity(){return this.#t}getSchema(){return this.#e}async execute({input:t,...r}){try{let o=await this.#e.parseAsync(t);return this.#r({...r,input:o})}catch(o){throw o instanceof Ut.z.ZodError?new F(o):o}}},Ae=class extends _{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({handler:async({request:n,response:i})=>new Promise((a,p)=>{let d=c=>{if(c&&c instanceof Error)return p(o(c));a(r(n,i))};t(n,i,d)?.catch(d)})})}};var Pe=class{nest(t){return Object.assign(t,{"":this})}};var $e=class extends Pe{},dt=class extends $e{#e;#t;#r;#n;#s;#i;#o;#a;#p;#c;#d;constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:i,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:u,shortDescription:m}){super(),this.#s=n,this.#i=i,this.#r=d,this.#c=a,this.#t=Object.freeze(t),this.#a=Object.freeze(p),this.#p=Object.freeze(c),this.#e={long:u,short:m},this.#o={input:r,output:o},this.#n={positive:Object.freeze(i.getPositiveResponse(o)),negative:Object.freeze(i.getNegativeResponse())},this.#d=Rr(r)?"upload":Ar(r)?"raw":"json"}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return this.#o[t]}getRequestType(){return this.#d}getResponses(t){return this.#n[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?Oe(t,o):t},{and:[]})}getScopes(){return this.#a}getTags(){return this.#p}getOperationId(t){return this.#c(t)}async#l(t){try{return await this.#o.output.parseAsync(t)}catch(r){throw r instanceof Kt.z.ZodError?new J(r):r}}async#m({method:t,logger:r,options:o,response:n,...i}){for(let a of this.#r)if(!(t==="options"&&!(a instanceof Ae))&&(Object.assign(o,await a.execute({...i,options:o,response:n,logger:r})),n.writableEnded)){r.warn("A middleware has closed the stream. Accumulated options:",o);break}}async#u({input:t,...r}){let o;try{o=await this.#o.input.parseAsync(t)}catch(n){throw n instanceof Kt.z.ZodError?new F(n):n}return this.#s({...r,input:o})}async#f({error:t,...r}){try{await this.#i.execute({...r,error:t})}catch(o){pt({...r,error:new W(ee(o),t||void 0)})}}async execute({request:t,response:r,logger:o,config:n}){let i=Zt(t),a={},p=null,d=null,c=Xe(t,n.inputSources);try{if(await this.#m({method:i,input:c,request:t,response:r,logger:o,options:a}),r.writableEnded)return;if(i==="options")return void r.status(200).end();p=await this.#l(await this.#u({input:c,logger:o,options:a}))}catch(u){d=ee(u)}await this.#f({input:c,output:p,request:t,response:r,error:d,logger:o,options:a})}};var zr=(e,t)=>{let r=e.map(n=>n.getSchema()).concat(t),o=r.reduce((n,i)=>n.and(i));return r.reduce((n,i)=>mr(i,n),o)};var D=require("zod");var le={positive:200,negative:400};var Ft=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},we=class extends Ft{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return Lt(this.#e,{variant:"positive",args:[t],statusCodes:[le.positive],mimeTypes:[A.json]})}getNegativeResponse(){return Lt(this.#t,{variant:"negative",args:[],statusCodes:[le.negative],mimeTypes:[A.json]})}},ze=new we({positive:e=>{let t=V({schema:e}),r=D.z.object({status:D.z.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:D.z.object({status:D.z.literal("error"),error:D.z.object({message:D.z.string()})}).example({status:"error",error:{message:"Sample error message"}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:i})=>{if(e){let a=Be(e);return kt(a,i,o,t),void n.status(a.statusCode).json({status:"error",error:{message:qe(a)}})}n.status(le.positive).json({status:"success",data:r})}}),lt=new we({positive:e=>{let t=V({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof D.z.ZodArray?e.shape.items:D.z.array(D.z.any());return t.reduce((o,n)=>ie(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:D.z.string().example("Sample error message"),handler:({response:e,output:t,error:r,logger:o,request:n,input:i})=>{if(r){let a=Be(r);return kt(a,o,n,i),void e.status(a.statusCode).type("text/plain").send(qe(a))}if(t&&"items"in t&&Array.isArray(t.items))return void e.status(le.positive).json(t.items);throw new Error("Property 'items' is missing in the endpoint output")}});var Ie=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 instanceof _?t:new _(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new Ae(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new _({handler:t})),this.resultHandler)}build({input:t=Ir.z.object({}),handler:r,output:o,description:n,shortDescription:i,operationId:a,scope:p,tag:d,method:c}){let{middlewares:u,resultHandler:m}=this,y=typeof c=="string"?[c]:c,h=typeof a=="function"?a:()=>a,R=typeof p=="string"?[p]:p||[],O=typeof d=="string"?[d]:d||[];return new dt({handler:r,middlewares:u,outputSchema:o,resultHandler:m,scopes:R,tags:O,methods:y,getOperationId:h,description:n,shortDescription:i,inputSchema:zr(u,t)})}},Cr=new Ie(ze),Zr=new Ie(lt);var E=require("ansis"),Mr=require("node:util"),Bt=require("node:perf_hooks");var ut={debug:10,info:20,warn:30,error:40},vr=e=>ie(e)&&Object.keys(ut).some(t=>t in e),jr=e=>e in ut,Nr=(e,t)=>ut[e]<ut[t],Lr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),mt=Lr(),Er=Lr(2),an=e=>e<1e-6?["picosecond",e/1e-9,mt]:e<.001?["nanosecond",e/1e-6,mt]:e<1?["microsecond",e/.001,mt]:e<1e3?["millisecond",e,mt]:e<6e4?["second",e/1e3,Er]:["minute",e/6e4,Er],kr=e=>{let[t,r,o]=an(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var Ce=class e{config;styles={debug:E.blue,info:E.green,warn:(0,E.hex)("#FFA500"),error:E.red};constructor(t={}){let{color:r=new E.Ansis().isSupported(),level:o=be()?"warn":"debug",depth:n=2,ctx:i={}}=t;this.config={color:r,level:o,depth:n,ctx:i}}prettyPrint(t){let{depth:r,color:o,level:n}=this.config;return(0,Mr.inspect)(t,{depth:r,colors:o,breakLength:n==="debug"?80:1/0,compact:n==="debug"?3:!0})}print(t,r,o){let{level:n,ctx:{requestId:i,...a},color:p}=this.config;if(n==="silent"||Nr(t,n))return;let d=[new Date().toISOString()];i&&d.push(p?(0,E.cyanBright)(i):i),d.push(p?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&d.push(this.prettyPrint(o)),Object.keys(a).length>0&&d.push(this.prettyPrint(a)),console.log(d.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})}profile(t){let r=Bt.performance.now();return()=>{let o=Bt.performance.now()-r,{message:n,severity:i="debug",formatter:a=kr}=typeof t=="object"?t:{message:t};this.print(typeof i=="function"?i(o):i,n,a(o))}}};var Ee=require("ramda");var Ze=class extends Pe{entries;constructor(t){super();let r=[],o=(0,Ee.keys)(t);for(let n of o){let i=t[n];i&&r.push([n,i,(0,Ee.reject)((0,Ee.equals)(n),o)])}this.entries=Object.freeze(r)}};var Hr=I(require("express"),1),ve=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Hr.default.static(...this.params))}};var yt=I(require("express"),1),ro=I(require("node:http"),1),oo=I(require("node:https"),1);var je=async(e,t="default")=>{try{return(await Promise.resolve().then(()=>I(require(e))))[t]}catch{}throw new he(e)};var ft=class{constructor(t){this.logger=t}#e=new WeakSet;check(t,r){if(!this.#e.has(t)){if(t.getRequestType()==="json")try{Nt(t.getSchema("input"),"in")}catch(o){this.logger.warn("The final input schema of the endpoint contains an unsupported JSON payload type.",Object.assign(r,{reason:o}))}for(let o of["positive","negative"])for(let{mimeTypes:n,schema:i}of t.getResponses(o))if(n.includes(A.json))try{Nt(i,"out")}catch(a){this.logger.warn(`The final ${o} response schema of the endpoint contains an unsupported JSON payload type.`,Object.assign(r,{reason:a}))}this.#e.add(t)}}};var Ur=(e,t)=>Object.entries(e).map(([r,o])=>{if(r.includes("/"))throw new ne(`The entry '${r}' must avoid having slashes \u2014 use nesting instead.`);let n=r.trim();return[`${t||""}${n?`/${n}`:""}`,o]}),Ne=({routing:e,onEndpoint:t,onStatic:r})=>{let o=Ur(e);for(;o.length;){let[n,i]=o.shift();if(i instanceof $e){let a=i.getMethods()||["get"];for(let p of a)t(i,n,p)}else if(i instanceof ve)r&&i.apply(n,r);else if(i instanceof Ze)for(let[a,p,d]of i.entries){let c=p.getMethods();if(c&&!c.includes(a))throw new ne(`Endpoint assigned to ${a} method of ${n} must support ${a} method.`);t(p,n,a,d)}else o.unshift(...Ur(i,n))}};var qt=({app:e,getLogger:t,config:r,routing:o,parsers:n})=>{let i=new ft(t()),a=new Set;Ne({routing:o,onStatic:(p,d)=>void e.use(p,d),onEndpoint:(p,d,c,u)=>{be()||i.check(p,{path:d,method:c});let m=n?.[p.getRequestType()]||[],y=async(h,R)=>{let O=t(h);if(r.cors){let L={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":[c,...u||[],"options"].join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"},K=typeof r.cors=="function"?await r.cors({request:h,endpoint:p,logger:O,defaultHeaders:L}):L;for(let q in K)R.set(q,K[q])}return p.execute({request:h,response:R,logger:O,config:r})};r.cors&&!a.has(d)&&(e.options(d,...m,y),a.add(d)),e[c](d,...m,y)}})};var Ge=I(require("http-errors"),1);var $r=require("node:timers/promises");var Dr=e=>"_httpMessage"in e&&typeof e._httpMessage=="object"&&e._httpMessage!==null&&"headersSent"in e._httpMessage&&typeof e._httpMessage.headersSent=="boolean"&&"setHeader"in e._httpMessage&&typeof e._httpMessage.setHeader=="function",Kr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Fr=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Br=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),qr=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var Gr=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,i=c=>void n.delete(c.destroy()),a=c=>void(Dr(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):i(c)),p=c=>void(o?c.destroy():n.add(c.once("close",()=>void n.delete(c))));for(let c of e)for(let u of["connection","secureConnection"])c.on(u,p);let d=async()=>{for(let c of e)c.on("request",Br);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(Fr(c)||Kr(c))&&a(c);for await(let c of(0,$r.setInterval)(10,Date.now()))if(n.size===0||Date.now()-c>=t)break;for(let c of n)i(c);return Promise.allSettled(e.map(qr))};return{sockets:n,shutdown:()=>o??=d()}};var Vr=({errorHandler:e,getLogger:t})=>async(r,o,n,i)=>r?e.execute({error:(0,Ge.isHttpError)(r)?r:(0,Ge.default)(400,ee(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):i(),_r=({errorHandler:e,getLogger:t})=>async(r,o)=>{let n=(0,Ge.default)(404,`Can not ${r.method} ${r.path}`),i=t(r);try{e.execute({request:r,response:o,logger:i,error:n,input:null,output:null,options:{}})}catch(a){pt({response:o,logger:i,error:new W(ee(a),n)})}},pn=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},cn=e=>({log:e.debug.bind(e)}),Yr=async({getLogger:e,config:t})=>{let r=await je("express-fileupload"),{limitError:o,beforeUpload:n,...i}={...typeof t.upload=="object"&&t.upload},a=[];return a.push(async(p,d,c)=>{let u=e(p);try{await n?.({request:p,logger:u})}catch(m){return c(m)}return r({debug:!0,...i,abortOnLimit:!1,parseNested:!0,logger:cn(u)})(p,d,c)}),o&&a.push(pn(o)),a},Qr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},Jr=({logger:e,config:t})=>async(r,o,n)=>{let i=await t.childLoggerProvider?.({request:r,parent:e})||e;i.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[b]={logger:i}),n()},Wr=e=>t=>t?.res?.locals[b]?.logger||e,Xr=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
3
+ `).slice(1))),eo=({servers:e,logger:t,options:{timeout:r,events:o=["SIGINT","SIGTERM"]}})=>{let n=Gr(e,{logger:t,timeout:r}),i=()=>n.shutdown().then(()=>process.exit());for(let a of o)process.on(a,i)};var v=require("ansis"),to=e=>{if(e.columns<132)return;let t=(0,v.italic)("Proudly supports transgender community.".padStart(109)),r=(0,v.italic)("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),o=(0,v.italic)("Thank you for choosing Express Zod API for your project.".padStart(132)),n=(0,v.italic)("for Kesaria".padEnd(20)),i=(0,v.hex)("#F5A9B8"),a=(0,v.hex)("#5BCEFA"),p=new Array(14).fill(a,1,3).fill(i,3,5).fill(v.whiteBright,5,7).fill(i,7,9).fill(a,9,12).fill(v.gray,12,13),d=`
4
4
  8888888888 8888888888P 888 d8888 8888888b. 8888888
5
5
  888 d88P 888 d88888 888 Y88b 888
6
6
  888 d88P 888 d88P888 888 888 888
@@ -10,13 +10,13 @@ Original error: ${e.handled.message}.`:""),{expose:(0,at.isHttpError)(e.cause)?e
10
10
  888 .d8""8b. 888 d88P 888 Y8b. X88 X88 d88P Y88..88P Y88b 888 d8888888888 888 888
11
11
  8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P' d8888888888 "Y88P" "Y88888 d88P 888 888 8888888
12
12
  888
13
- 888${e}
14
- ${o}888${t}
15
- ${r}
16
- `.split(`
17
- `).map((d,c)=>a[c]?a[c](d):d).join(`
18
- `)};var oo=e=>{e.startupLogo!==!1&&console.log(eo());let t=e.errorHandler||we,r=Er(e.logger)?e.logger:new Ie(e.logger);r.debug("Running",{build:"v21.0.0-beta.5 (CJS)",env:process.env.NODE_ENV||"development"}),Wr(r);let o=Qr({logger:r,config:e}),i={getLogger:Jr(r),errorHandler:t},a=Vr(i),p=Gr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},no=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=oo(e);return Bt({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},so=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=oo(e),p=(0,ft.default)().disable("x-powered-by").use(a);if(e.compression){let g=await ve("compression");p.use(g(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||ft.default.json()],raw:[e.rawParser||ft.default.raw(),Yr],upload:e.upload?await _r({config:e,getLogger:o}):[]};await e.beforeRouting?.({app:p,getLogger:o}),Bt({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(i,n);let c=[],f=(g,b)=>()=>g.listen(b,()=>r.info("Listening",b)),m=[];if(e.http){let g=to.default.createServer(p);c.push(g),m.push(f(g,e.http.listen))}if(e.https){let g=ro.default.createServer(e.https.options,p);c.push(g),m.push(f(g,e.https.listen))}return e.gracefulShutdown&&Xr({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:m.map(g=>g())}};var Oo=require("openapi3-ts/oas31"),xt=require("ramda");var Y=require("openapi3-ts/oas31"),l=require("ramda"),S=require("zod");var me=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[x]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>me(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var io=50,po="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",cn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},co=/:([A-Za-z0-9_]+)/g,dn=e=>e.match(co)?.map(t=>t.slice(1))||[],lo=e=>e.replace(co,t=>`{${t.slice(1)}}`),ln=({_def:e},{next:t})=>({...t(e.innerType),default:e[x]?.defaultLabel||e.defaultValue()}),mn=({_def:{innerType:e}},{next:t})=>t(e),un=()=>({format:"any"}),fn=({},e)=>{if(e.isResponse)throw new v("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},yn=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"}},gn=({options:e},{next:t})=>({oneOf:e.map(t)}),hn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),xn=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return(0,l.concat)(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},bn=e=>{let[t,r]=e.filter(Y.isSchemaObject).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));if(!t||!r)throw new Error("Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,l.mergeDeepWith)(xn,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,l.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=se(t.examples||[],r.examples||[],([n,i])=>(0,l.mergeDeepRight)(n,i))),o},Sn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return bn(o)}catch{}return{allOf:o}},Tn=(e,{next:t})=>t(e.unwrap()),On=(e,{next:t})=>t(e.unwrap()),Rn=(e,{next:t})=>{let r=t(e.unwrap());return(0,Y.isSchemaObject)(r)&&(r.type=uo(r)),r},mo=e=>{let t=(0,l.toLower)((0,l.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},ao=e=>({type:mo(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),An=({value:e})=>({type:mo(e),const:e}),Pn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Ue(p)?p instanceof S.z.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=yt(e,r)),i.length&&(a.required=i),a},wn=()=>({type:"null"}),zn=({},e)=>{if(e.isResponse)throw new v("Please use ez.dateOut() for output.",e);return{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:po}}},In=({},e)=>{if(!e.isResponse)throw new v("Please use ez.dateIn() for input.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:po}}},Cn=({},e)=>{throw new v(`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"}),En=()=>({type:"integer",format:"bigint"}),vn=e=>e.every(t=>t instanceof S.z.ZodLiteral),jn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof S.z.ZodEnum||e instanceof S.z.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=yt(S.z.object((0,l.fromPairs)((0,l.xprod)(o,[t]))),r),n.required=o),n}if(e instanceof S.z.ZodLiteral)return{type:"object",properties:yt(S.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof S.z.ZodUnion&&vn(e.options)){let o=(0,l.map)(i=>`${i.value}`,e.options),n=(0,l.fromPairs)((0,l.xprod)(o,[t]));return{type:"object",properties:yt(S.z.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},Nn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},Ln=({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:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:f,_def:{checks:m}})=>{let g=m.find(O=>O.kind==="regex"),b=m.find(O=>O.kind==="datetime"),A=g?g.regex:b?b.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,R={type:"string"},y={"date-time":f,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let O in y)if(y[O]){R.format=O;break}return r!==null&&(R.minLength=r),o!==null&&(R.maxLength=o),A&&(R.pattern=A.source),R},Mn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(m=>m.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(m=>m.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,f={type:e?"integer":"number",format:e?"int64":"double"};return a?f.minimum=i:f.exclusiveMinimum=i,c?f.maximum=d:f.exclusiveMaximum=d,f},yt=({shape:e},t)=>(0,l.map)(t,e),Hn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return cn?.[t]},uo=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",Un=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,Y.isSchemaObject)(o)){let i=Xe(e,Hn(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(S.z.any())}if(!t&&n.type==="preprocess"&&(0,Y.isSchemaObject)(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},Dn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Kn=(e,{next:t})=>t(e.unwrap()),Fn=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),Bn=(e,{next:t})=>t(e.unwrap().shape.raw),fo=e=>e.length?(0,l.fromPairs)((0,l.zip)((0,l.range)(1,e.length+1).map(t=>`example${t}`),(0,l.map)((0,l.objOf)("value"),e))):void 0,yo=(e,t,r=[])=>(0,l.pipe)(V,(0,l.map)((0,l.when)(o=>(0,l.type)(o)==="Object",(0,l.omit)(r))),fo)({schema:e,variant:t?"parsed":"original",validate:!0}),qn=(e,t)=>(0,l.pipe)(V,(0,l.filter)((0,l.has)(t)),(0,l.pluck)(t),fo)({schema:e,variant:"original",validate:!0}),ue=e=>e instanceof S.z.ZodObject?e:e instanceof S.z.ZodBranded?ue(e.unwrap()):e instanceof S.z.ZodUnion||e instanceof S.z.ZodDiscriminatedUnion?e.options.map(t=>ue(t)).reduce((t,r)=>t.merge(r.partial()),S.z.object({})):e instanceof S.z.ZodEffects?ue(e._def.schema):e instanceof S.z.ZodPipeline?ue(e._def.in):ue(e._def.left).merge(ue(e._def.right)),go=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=ue(r),c=dn(e),f=o.includes("query"),m=o.includes("params"),g=o.includes("headers"),b=y=>m&&c.includes(y),A=y=>g&&Zt(y);return Object.keys(d).map(y=>({name:y,location:b(y)?"path":A(y)?"header":f?"query":void 0})).filter(y=>y.location!==void 0).map(({name:y,location:O})=>{let z=me(d[y],{rules:{...a,...$t},onEach:Gt,onMissing:Vt,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),E=i==="components"?n(d[y],z,D(p,y)):z;return{name:y,in:O,required:!d[y].isOptional(),description:z.description||p,schema:E,examples:qn(r,y)}})},$t={ZodString:kn,ZodNumber:Mn,ZodBigInt:En,ZodBoolean:Zn,ZodNull:wn,ZodArray:Nn,ZodTuple:Ln,ZodRecord:jn,ZodObject:Pn,ZodLiteral:An,ZodIntersection:Sn,ZodUnion:gn,ZodAny:un,ZodDefault:ln,ZodEnum:ao,ZodNativeEnum:ao,ZodEffects:Un,ZodOptional:Tn,ZodNullable:Rn,ZodDiscriminatedUnion:hn,ZodBranded:Kn,ZodDate:Cn,ZodCatch:mn,ZodPipeline:Dn,ZodLazy:Fn,ZodReadonly:On,[B]:yn,[Se]:fn,[ce]:In,[pe]:zn,[te]:Bn},Gt=(e,{isResponse:t,prev:r})=>{if((0,Y.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof S.z.ZodLazy,i=r.type!==void 0,a=t&&Ue(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=uo(r)),!n){let c=V({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},Vt=(e,t)=>{throw new v(`Zod type ${e.constructor.name} is unsupported.`,t)},qt=(e,t)=>{if((0,Y.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,l.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,l.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>qt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>qt(o,t))),r},ho=e=>(0,Y.isReferenceObject)(e)?e:(0,l.omit)(["examples"],e),xo=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:f=`${e.toUpperCase()} ${t} ${Et(n)} response ${p?d:""}`.trim()})=>{let m=ho(me(r,{rules:{...c,...$t},onEach:Gt,onMissing:Vt,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),g={schema:a==="components"?i(r,m,D(f)):m,examples:yo(r,!0)};return{description:f,content:(0,l.fromPairs)((0,l.xprod)(o,[g]))}},$n=()=>({type:"http",scheme:"basic"}),Gn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Vn=({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},_n=({name:e})=>({type:"apiKey",in:"header",name:e}),Yn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Qn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Jn=({flows:e={}})=>({type:"oauth2",flows:(0,l.map)(t=>({...t,scopes:t.scopes||{}}),(0,l.reject)(l.isNil,e))}),bo=(e,t)=>{let r={basic:$n,bearer:Gn,input:Vn,header:_n,cookie:Yn,openid:Qn,oauth2:Jn};return ct(e,o=>r[o.type](o,t))},gt=e=>"or"in e?e.or.map(t=>"and"in t?(0,l.mergeAll)((0,l.map)(({name:r,scopes:o})=>(0,l.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?gt(Mt(e)):gt({or:[e]}),So=({method:e,path:t,schema:r,mimeType:o,makeRef:n,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=ho(qt(me(r,{rules:{...a,...$t},onEach:Gt,onMissing:Vt,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),f={schema:i==="components"?n(r,c,D(d)):c,examples:yo(r,!1,p)};return{description:d,content:{[o]:f}}},To=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),_t=e=>e.length<=io?e:e.slice(0,io-1)+"\u2026";var ht=class extends Oo.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=(0,xt.keys)(le);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||D(r,t),i=this.lastOperationIdSuffixes.get(n);if(i===void 0)return this.lastOperationIdSuffixes.set(n,1),n;if(o)throw new v(`Duplicated operationId: "${o}"`,{method:r,isResponse:!1,path:t});return i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:n});for(let m of typeof i=="string"?[i]:i)this.addServer({url:m});je({routing:t,onEndpoint:(m,g,b)=>{let A={path:g,method:b,endpoint:m,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[R,y]=["short","long"].map(m.getDescription.bind(m)),O=R?_t(R):d&&y?_t(y):void 0,z=m.getTags(),E=r.inputSources?.[b]||It[b],q=this.ensureUniqOperationId(g,b,m.getOperationId(b)),Ne=go({...A,inputSources:E,schema:m.getSchema("input"),description:a?.requestParameter?.call(null,{method:b,path:g,operationId:q})}),_e={};for(let $ of this.responseVariants){let oe=m.getResponses($);for(let{mimeTypes:Le,schema:M,statusCodes:I}of oe)for(let H of I)_e[H]=xo({...A,variant:$,schema:M,mimeTypes:Le,statusCode:H,hasMultipleStatusCodes:oe.length>1||I.length>1,description:a?.[`${$}Response`]?.call(null,{method:b,path:g,operationId:q,statusCode:H})})}let wt=E.includes("body")?So({...A,paramNames:(0,xt.pluck)("name",Ne),schema:m.getSchema("input"),mimeType:P[m.getRequestType()],description:a?.requestBody?.call(null,{method:b,path:g,operationId:q})}):void 0,Ye=gt(ct(bo(m.getSecurity(),E),$=>{let oe=this.ensureUniqSecuritySchemaName($),Le=["oauth2","openIdConnect"].includes($.type)?m.getScopes().slice():[];return this.addSecurityScheme(oe,$),{name:oe,scopes:Le}}));this.addPath(lo(g),{[b]:{operationId:q,summary:O,description:y,tags:z.length>0?z:void 0,parameters:Ne.length>0?Ne:void 0,requestBody:wt,security:Ye.length>0?Ye:void 0,responses:_e}})}}),this.rootDoc.tags=r.tags?To(r.tags):[]}};var bt=require("node-mocks-http"),Wn=e=>(0,bt.createRequest)({...e,headers:{"content-type":P.json,...e?.headers}}),Xn=e=>(0,bt.createResponse)(e),es=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:vr(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},Ro=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=Wn(e),i=Xn({req:n,...t});i.req=t?.req||n,n.res=i;let a=es(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},Ao=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=Ro(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},Po=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:p}=Ro(o),d=We(n,p.inputSources);try{let c=await e.execute({request:n,response:i,logger:a,input:d,options:t});return{requestMock:n,responseMock:i,loggerMock:a,output:c}}catch(c){if(!r)throw c;return r(ee(c),i),{requestMock:n,responseMock:i,loggerMock:a,output:{}}}};var k=C(require("typescript"),1);var L=C(require("typescript"),1),Yt=require("ramda"),s=L.default.factory,re=[s.createModifier(L.default.SyntaxKind.ExportKeyword)],ts=[s.createModifier(L.default.SyntaxKind.AsyncKeyword)],rs=[s.createModifier(L.default.SyntaxKind.PublicKeyword),s.createModifier(L.default.SyntaxKind.ReadonlyKeyword)],wo=[s.createModifier(L.default.SyntaxKind.ProtectedKeyword),s.createModifier(L.default.SyntaxKind.ReadonlyKeyword)],os=s.createTemplateHead(""),ns=s.createTemplateMiddle(" "),Ge=s.createTemplateTail(""),Qt=e=>s.createTemplateLiteralType(os,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?Ge:ns))),Jt=Qt(["M","P"]),St=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Tt=(e,t)=>(0,Yt.chain)(([r,o])=>[St(s.createIdentifier(r),o,t)],Object.entries(e)),Wt=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),zo=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),Io=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),Q=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],L.default.NodeFlags.Const),Xt=(e,t)=>s.createTypeAliasDeclaration(re,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),Ot=(e,t)=>s.createTypeAliasDeclaration(re,e,void 0,t),Co=(e,t,r)=>s.createPropertyDeclaration(rs,e,void 0,t,r),Zo=(e,t,r)=>s.createClassDeclaration(re,e,void 0,void 0,[t,...r]),Eo=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),vo=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(L.default.SyntaxKind.AnyKeyword)]),jo=(e,t,r)=>s.createInterfaceDeclaration(re,e,void 0,t,r),ss=(0,Yt.chain)(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),No=e=>ss(Object.entries(e)),er=(e,t,r)=>s.createArrowFunction(r?ts:void 0,void 0,e.map(o=>St(o)),void 0,void 0,t),tr=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,Tt({acc:void 0,key:void 0}),void 0,void 0,t),r]),Lo=(...e)=>`"${e.join(" ")}"`,ko=(e,t,r)=>s.createConditionalExpression(e,s.createToken(L.default.SyntaxKind.QuestionToken),t,s.createToken(L.default.SyntaxKind.ColonToken),r);var Mo=["get","post","put","delete","patch"];var h=C(require("typescript"),1),At=require("zod");var T=C(require("typescript"),1),{factory:Rt}=T.default,rr=(e,t)=>T.default.addSyntheticLeadingComment(e,T.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),fe=(e,t,r)=>{let o=Rt.createTypeAliasDeclaration(void 0,Rt.createIdentifier(t),void 0,e);return r?rr(o,r):o},or=(e,t)=>{let r=T.default.createSourceFile("print.ts","",T.default.ScriptTarget.Latest,!1,T.default.ScriptKind.TS);return T.default.createPrinter(t).printNode(T.default.EmitHint.Unspecified,e,r)},is=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Ho=e=>is.test(e)?Rt.createIdentifier(e):Rt.createStringLiteral(e),as=[T.default.SyntaxKind.AnyKeyword,T.default.SyntaxKind.BigIntKeyword,T.default.SyntaxKind.BooleanKeyword,T.default.SyntaxKind.NeverKeyword,T.default.SyntaxKind.NumberKeyword,T.default.SyntaxKind.ObjectKeyword,T.default.SyntaxKind.StringKeyword,T.default.SyntaxKind.SymbolKeyword,T.default.SyntaxKind.UndefinedKeyword,T.default.SyntaxKind.UnknownKeyword,T.default.SyntaxKind.VoidKeyword],Uo=e=>as.includes(e.kind);var{factory:u}=h.default,ps={[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},cs=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),ds=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&Ue(a)?a instanceof At.z.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,Ho(i),p&&o?u.createToken(h.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description?rr(d,a.description):d});return u.createTypeLiteralNode(n)},ls=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),ms=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Do=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(Uo(n)?n.kind:n,n)}return u.createUnionTypeNode(Array.from(r.values()))},us=e=>ps?.[e.kind],fs=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Xe(e,us(o)),i={number:h.default.SyntaxKind.NumberKeyword,bigint:h.default.SyntaxKind.BigIntKeyword,boolean:h.default.SyntaxKind.BooleanKeyword,string:h.default.SyntaxKind.StringKeyword,undefined:h.default.SyntaxKind.UndefinedKeyword,object:h.default.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(n&&i[n]||h.default.SyntaxKind.AnyKeyword)}return o},ys=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),gs=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(h.default.SyntaxKind.UndefinedKeyword)]):o},hs=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),xs=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),bs=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),Ss=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(h.default.isTypeLiteralNode)?u.createTypeLiteralNode(o.flatMap(({members:i})=>i)):u.createIntersectionTypeNode(o)},Ts=({_def:e},{next:t})=>t(e.innerType),ye=e=>()=>u.createKeywordTypeNode(e),Os=(e,{next:t})=>t(e.unwrap()),Rs=(e,{next:t})=>t(e.unwrap()),As=({_def:e},{next:t})=>t(e.innerType),Ps=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ws=()=>u.createLiteralTypeNode(u.createNull()),zs=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),Is=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(h.default.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),n=u.createUnionTypeNode([r,o]);return t instanceof At.z.ZodString?r:t instanceof At.z.ZodUnion?n:o},Cs=(e,{next:t})=>t(e.unwrap().shape.raw),Zs={ZodString:ye(h.default.SyntaxKind.StringKeyword),ZodNumber:ye(h.default.SyntaxKind.NumberKeyword),ZodBigInt:ye(h.default.SyntaxKind.BigIntKeyword),ZodBoolean:ye(h.default.SyntaxKind.BooleanKeyword),ZodAny:ye(h.default.SyntaxKind.AnyKeyword),[pe]:ye(h.default.SyntaxKind.StringKeyword),[ce]:ye(h.default.SyntaxKind.StringKeyword),ZodNull:ws,ZodArray:ls,ZodTuple:xs,ZodRecord:bs,ZodObject:ds,ZodLiteral:cs,ZodIntersection:Ss,ZodUnion:Do,ZodDefault:Ts,ZodEnum:ms,ZodNativeEnum:ys,ZodEffects:fs,ZodOptional:gs,ZodNullable:hs,ZodDiscriminatedUnion:Do,ZodBranded:Os,ZodCatch:As,ZodPipeline:Ps,ZodLazy:zs,ZodReadonly:Rs,[B]:Is,[te]:Cs},Ve=(e,{brandHandling:t,ctx:r})=>me(e,{rules:{...t,...Zs},onMissing:()=>u.createKeywordTypeNode(h.default.SyntaxKind.AnyKeyword),ctx:r});var Pt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client"),isJsonConst:s.createIdentifier("isJSON")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let n=s.createLiteralTypeNode(s.createNull());this.aliases.set(t,fe(n,o)),this.aliases.set(t,fe(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0}}){je({routing:t,onEndpoint:(M,I,H)=>{let ge={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},ke=D(H,I,"input"),Me=Ve(M.getSchema("input"),{brandHandling:r,ctx:{...ge,isResponse:!1}}),U=n?D(H,I,"positive.response"):void 0,nr=M.getResponses("positive").map(({schema:G})=>G).reduce((G,zt)=>G.or(zt)),sr=n?Ve(nr,{brandHandling:r,ctx:{...ge,isResponse:!0}}):void 0,He=n?D(H,I,"negative.response"):void 0,ir=M.getResponses("negative").map(({schema:G})=>G).reduce((G,zt)=>G.or(zt)),ar=n?Ve(ir,{brandHandling:r,ctx:{...ge,isResponse:!0}}):void 0,pr=D(H,I,"response"),Fo=U&&He?s.createUnionTypeNode([s.createTypeReferenceNode(U),s.createTypeReferenceNode(He)]):Ve(nr.or(ir),{brandHandling:r,ctx:{...ge,isResponse:!0}});this.program.push(fe(Me,ke)),sr&&U&&this.program.push(fe(sr,U)),ar&&He&&this.program.push(fe(ar,He)),this.program.push(fe(Fo,pr)),this.paths.push(I),this.registry.set({method:H,path:I},{input:ke,positive:U,negative:He,response:pr,isJson:M.getResponses("positive").some(G=>G.mimeTypes.includes(P.json)),tags:M.getTags()})}}),this.program.unshift(...this.aliases.values()),this.program.push(Xt(this.ids.pathType,this.paths)),this.program.push(Xt(this.ids.methodType,Mo)),this.program.push(Ot(this.ids.methodPathType,Qt([this.ids.methodType,this.ids.pathType])));let a=[s.createHeritageClause(k.default.SyntaxKind.ExtendsKeyword,[Wt(this.ids.methodPathType,k.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),n&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let p=[],d=[];for(let[{method:M,path:I},{isJson:H,tags:ge,...ke}]of this.registry){let Me=Lo(M,I);for(let U of this.interfaces)U.kind in ke&&U.props.push(Io(Me,ke[U.kind]));o!=="types"&&(H&&p.push(s.createPropertyAssignment(Me,s.createTrue())),d.push(s.createPropertyAssignment(Me,s.createArrayLiteralExpression(ge.map(U=>s.createStringLiteral(U))))))}for(let{id:M,props:I}of this.interfaces)this.program.push(jo(M,a,I));if(o==="types")return;let c=s.createVariableStatement(re,Q(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(p))),f=s.createVariableStatement(re,Q(this.ids.endpointTagsConst,s.createObjectLiteralExpression(d))),m=Ot(this.ids.providerType,s.createFunctionTypeNode(No({M:this.ids.methodType,P:this.ids.pathType}),Tt({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Jt)}),Eo(this.ids.responseInterface,Jt))),g=Ot(this.ids.implementationType,s.createFunctionTypeNode(void 0,Tt({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(k.default.SyntaxKind.StringKeyword),params:Wt(k.default.SyntaxKind.StringKeyword,k.default.SyntaxKind.AnyKeyword)}),vo())),b=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,Ge)]),A=tr(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[b,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),R=tr(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[b]),k.default.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),y=Zo(this.ids.clientClass,zo([St(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),wo)]),[Co(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),er([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,A,R]),!0))]);this.program.push(c,f,m,g,y);let O=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),z=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(P.json))]),void 0,this.ids.undefinedValue)),E=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),q=s.createVariableStatement(void 0,Q(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,Ge)]),s.createObjectLiteralExpression([O,z,E])])))),Ne=s.createVariableStatement(void 0,Q(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),_e=s.createVariableStatement(void 0,Q(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),Ge)])))),wt=s.createVariableStatement(void 0,Q(this.ids.isJsonConst,s.createCallChain(s.createPropertyAccessChain(s.createCallExpression(s.createPropertyAccessExpression(s.createPropertyAccessExpression(this.ids.responseConst,this.ids.headersProperty),s.createIdentifier("get")),void 0,[s.createStringLiteral("content-type")]),s.createToken(k.default.SyntaxKind.QuestionDotToken),s.createIdentifier("startsWith")),void 0,void 0,[s.createStringLiteral(P.json)]))),Ye=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,ko(this.ids.isJsonConst,s.createStringLiteral("json"),s.createStringLiteral("text"))),void 0,[])),$=s.createVariableStatement(re,Q(this.ids.exampleImplementationConst,er([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([Ne,_e,q,wt,Ye]),!0),s.createTypeReferenceNode(this.ids.implementationType))),oe=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),Le=s.createVariableStatement(void 0,Q(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push($,Le,oe)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:or(r,t)).join(`
19
- `):void 0}print(t){let r=this.printUsage(t),o=r&&k.default.addSyntheticLeadingComment(k.default.addSyntheticLeadingComment(s.createEmptyStatement(),k.default.SyntaxKind.SingleLineCommentTrivia," Usage example:"),k.default.SyntaxKind.MultiLineCommentTrivia,`
20
- ${r}`);return this.program.concat(o||[]).map((n,i)=>or(n,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
13
+ 888${t}
14
+ ${n}888${r}
15
+ ${o}
16
+ `;e.write(d.split(`
17
+ `).map((c,u)=>p[u]?p[u](c):c).join(`
18
+ `))};var no=e=>{e.startupLogo!==!1&&to(process.stdout);let t=e.errorHandler||ze,r=vr(e.logger)?e.logger:new Ce(e.logger);r.debug("Running",{build:"v21.0.0 (CJS)",env:process.env.NODE_ENV||"development"}),Xr(r);let o=Jr({logger:r,config:e}),i={getLogger:Wr(r),errorHandler:t},a=_r(i),p=Vr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},so=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=no(e);return qt({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},io=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=no(e),p=(0,yt.default)().disable("x-powered-by").use(a);if(e.compression){let y=await je("compression");p.use(y(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||yt.default.json()],raw:[e.rawParser||yt.default.raw(),Qr],upload:e.upload?await Yr({config:e,getLogger:o}):[]};await e.beforeRouting?.({app:p,getLogger:o}),qt({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(i,n);let c=[],u=(y,h)=>()=>y.listen(h,()=>r.info("Listening",h)),m=[];if(e.http){let y=ro.default.createServer(p);c.push(y),m.push(u(y,e.http.listen))}if(e.https){let y=oo.default.createServer(e.https.options,p);c.push(y),m.push(u(y,e.https.listen))}return e.gracefulShutdown&&eo({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:m.map(y=>y())}};var Ro=require("openapi3-ts/oas31"),bt=require("ramda");var Y=require("openapi3-ts/oas31"),l=require("ramda"),S=require("zod");var me=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[b]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>me(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var ao=50,co="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",dn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},lo=/:([A-Za-z0-9_]+)/g,ln=e=>e.match(lo)?.map(t=>t.slice(1))||[],mo=e=>e.replace(lo,t=>`{${t.slice(1)}}`),mn=({_def:e},{next:t})=>({...t(e.innerType),default:e[b]?.defaultLabel||e.defaultValue()}),un=({_def:{innerType:e}},{next:t})=>t(e),fn=()=>({format:"any"}),yn=({},e)=>{if(e.isResponse)throw new Z("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},gn=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"}},hn=({options:e},{next:t})=>({oneOf:e.map(t)}),xn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),bn=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return(0,l.concat)(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},Sn=e=>{let[t,r]=e.filter(Y.isSchemaObject).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));if(!t||!r)throw new Error("Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,l.mergeDeepWith)(bn,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,l.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=se(t.examples||[],r.examples||[],([n,i])=>(0,l.mergeDeepRight)(n,i))),o},Tn=({_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()),Rn=(e,{next:t})=>t(e.unwrap()),An=(e,{next:t})=>{let r=t(e.unwrap());return(0,Y.isSchemaObject)(r)&&(r.type=fo(r)),r},uo=e=>{let t=(0,l.toLower)((0,l.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},po=e=>({type:uo(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Pn=({value:e})=>({type:uo(e),const:e}),wn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&De(p)?p instanceof S.z.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=gt(e,r)),i.length&&(a.required=i),a},zn=()=>({type:"null"}),In=({},e)=>{if(e.isResponse)throw new Z("Please use ez.dateOut() for output.",e);return{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:co}}},Cn=({},e)=>{if(!e.isResponse)throw new Z("Please use ez.dateIn() for input.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:co}}},Zn=({},e)=>{throw new Z(`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)},En=()=>({type:"boolean"}),vn=()=>({type:"integer",format:"bigint"}),jn=e=>e.every(t=>t instanceof S.z.ZodLiteral),Nn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof S.z.ZodEnum||e instanceof S.z.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=gt(S.z.object((0,l.fromPairs)((0,l.xprod)(o,[t]))),r),n.required=o),n}if(e instanceof S.z.ZodLiteral)return{type:"object",properties:gt(S.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof S.z.ZodUnion&&jn(e.options)){let o=(0,l.map)(i=>`${i.value}`,e.options),n=(0,l.fromPairs)((0,l.xprod)(o,[t]));return{type:"object",properties:gt(S.z.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},Ln=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},kn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Mn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:m}})=>{let y=m.find(w=>w.kind==="regex"),h=m.find(w=>w.kind==="datetime"),R=y?y.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,O={type:"string"},x={"date-time":u,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let w in x)if(x[w]){O.format=w;break}return r!==null&&(O.minLength=r),o!==null&&(O.maxLength=o),R&&(O.pattern=R.source),O},Hn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(m=>m.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(m=>m.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,u={type:e?"integer":"number",format:e?"int64":"double"};return a?u.minimum=i:u.exclusiveMinimum=i,c?u.maximum=d:u.exclusiveMaximum=d,u},gt=({shape:e},t)=>(0,l.map)(t,e),Un=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return dn?.[t]},fo=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",Dn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,Y.isSchemaObject)(o)){let i=et(e,Un(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(S.z.any())}if(!t&&n.type==="preprocess"&&(0,Y.isSchemaObject)(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},Kn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Fn=(e,{next:t})=>t(e.unwrap()),Bn=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),qn=(e,{next:t})=>t(e.unwrap().shape.raw),yo=e=>e.length?(0,l.fromPairs)((0,l.zip)((0,l.range)(1,e.length+1).map(t=>`example${t}`),(0,l.map)((0,l.objOf)("value"),e))):void 0,go=(e,t,r=[])=>(0,l.pipe)(V,(0,l.map)((0,l.when)(o=>(0,l.type)(o)==="Object",(0,l.omit)(r))),yo)({schema:e,variant:t?"parsed":"original",validate:!0}),$n=(e,t)=>(0,l.pipe)(V,(0,l.filter)((0,l.has)(t)),(0,l.pluck)(t),yo)({schema:e,variant:"original",validate:!0}),ue=e=>e instanceof S.z.ZodObject?e:e instanceof S.z.ZodBranded?ue(e.unwrap()):e instanceof S.z.ZodUnion||e instanceof S.z.ZodDiscriminatedUnion?e.options.map(t=>ue(t)).reduce((t,r)=>t.merge(r.partial()),S.z.object({})):e instanceof S.z.ZodEffects?ue(e._def.schema):e instanceof S.z.ZodPipeline?ue(e._def.in):ue(e._def.left).merge(ue(e._def.right)),ho=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=ue(r),c=ln(e),u=o.includes("query"),m=o.includes("params"),y=o.includes("headers"),h=x=>m&&c.includes(x),R=x=>y&&Et(x);return Object.keys(d).map(x=>({name:x,location:h(x)?"path":R(x)?"header":u?"query":void 0})).filter(x=>x.location!==void 0).map(({name:x,location:w})=>{let L=me(d[x],{rules:{...a,...Gt},onEach:Vt,onMissing:_t,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),K=i==="components"?n(d[x],L,U(p,x)):L;return{name:x,in:w,required:!d[x].isOptional(),description:L.description||p,schema:K,examples:$n(r,x)}})},Gt={ZodString:Mn,ZodNumber:Hn,ZodBigInt:vn,ZodBoolean:En,ZodNull:zn,ZodArray:Ln,ZodTuple:kn,ZodRecord:Nn,ZodObject:wn,ZodLiteral:Pn,ZodIntersection:Tn,ZodUnion:hn,ZodAny:fn,ZodDefault:mn,ZodEnum:po,ZodNativeEnum:po,ZodEffects:Dn,ZodOptional:On,ZodNullable:An,ZodDiscriminatedUnion:xn,ZodBranded:Fn,ZodDate:Zn,ZodCatch:un,ZodPipeline:Kn,ZodLazy:Bn,ZodReadonly:Rn,[B]:gn,[Te]:yn,[ce]:Cn,[pe]:In,[te]:qn},Vt=(e,{isResponse:t,prev:r})=>{if((0,Y.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof S.z.ZodLazy,i=r.type!==void 0,a=t&&De(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=fo(r)),!n){let c=V({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},_t=(e,t)=>{throw new Z(`Zod type ${e.constructor.name} is unsupported.`,t)},$t=(e,t)=>{if((0,Y.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,l.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,l.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>$t(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>$t(o,t))),r},xo=e=>(0,Y.isReferenceObject)(e)?e:(0,l.omit)(["examples"],e),bo=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:u=`${e.toUpperCase()} ${t} ${vt(n)} response ${p?d:""}`.trim()})=>{let m=xo(me(r,{rules:{...c,...Gt},onEach:Vt,onMissing:_t,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),y={schema:a==="components"?i(r,m,U(u)):m,examples:go(r,!0)};return{description:u,content:(0,l.fromPairs)((0,l.xprod)(o,[y]))}},Gn=()=>({type:"http",scheme:"basic"}),Vn=({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:(0,l.map)(t=>({...t,scopes:t.scopes||{}}),(0,l.reject)(l.isNil,e))}),So=(e,t)=>{let r={basic:Gn,bearer:Vn,input:_n,header:Yn,cookie:Qn,openid:Jn,oauth2:Wn};return ct(e,o=>r[o.type](o,t))},ht=e=>"or"in e?e.or.map(t=>"and"in t?(0,l.mergeAll)((0,l.map)(({name:r,scopes:o})=>(0,l.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?ht(Ht(e)):ht({or:[e]}),To=({method:e,path:t,schema:r,mimeType:o,makeRef:n,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=xo($t(me(r,{rules:{...a,...Gt},onEach:Vt,onMissing:_t,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),u={schema:i==="components"?n(r,c,U(d)):c,examples:go(r,!1,p)};return{description:d,content:{[o]:u}}},Oo=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}),Yt=e=>e.length<=ao?e:e.slice(0,ao-1)+"\u2026";var xt=class extends Ro.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=(0,bt.keys)(le);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||U(r,t),i=this.lastOperationIdSuffixes.get(n);if(i===void 0)return this.lastOperationIdSuffixes.set(n,1),n;if(o)throw new Z(`Duplicated operationId: "${o}"`,{method:r,isResponse:!1,path:t});return i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:n});for(let m of typeof i=="string"?[i]:i)this.addServer({url:m});Ne({routing:t,onEndpoint:(m,y,h)=>{let R={path:y,method:h,endpoint:m,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[O,x]=["short","long"].map(m.getDescription.bind(m)),w=O?Yt(O):d&&x?Yt(x):void 0,L=m.getTags(),K=r.inputSources?.[h]||Ct[h],q=this.ensureUniqOperationId(y,h,m.getOperationId(h)),Le=ho({...R,inputSources:K,schema:m.getSchema("input"),description:a?.requestParameter?.call(null,{method:h,path:y,operationId:q})}),Ye={};for(let $ of this.responseVariants){let oe=m.getResponses($);for(let{mimeTypes:ke,schema:k,statusCodes:z}of oe)for(let M of z)Ye[M]=bo({...R,variant:$,schema:k,mimeTypes:ke,statusCode:M,hasMultipleStatusCodes:oe.length>1||z.length>1,description:a?.[`${$}Response`]?.call(null,{method:h,path:y,operationId:q,statusCode:M})})}let zt=K.includes("body")?To({...R,paramNames:(0,bt.pluck)("name",Le),schema:m.getSchema("input"),mimeType:A[m.getRequestType()],description:a?.requestBody?.call(null,{method:h,path:y,operationId:q})}):void 0,Qe=ht(ct(So(m.getSecurity(),K),$=>{let oe=this.ensureUniqSecuritySchemaName($),ke=["oauth2","openIdConnect"].includes($.type)?m.getScopes().slice():[];return this.addSecurityScheme(oe,$),{name:oe,scopes:ke}}));this.addPath(mo(y),{[h]:{operationId:q,summary:w,description:x,tags:L.length>0?L:void 0,parameters:Le.length>0?Le:void 0,requestBody:zt,security:Qe.length>0?Qe:void 0,responses:Ye}})}}),this.rootDoc.tags=r.tags?Oo(r.tags):[]}};var St=require("node-mocks-http"),Xn=e=>(0,St.createRequest)({...e,headers:{"content-type":A.json,...e?.headers}}),es=e=>(0,St.createResponse)(e),ts=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:jr(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},Ao=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=Xn(e),i=es({req:n,...t});i.req=t?.req||n,n.res=i;let a=ts(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},Po=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=Ao(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},wo=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:p}=Ao(o),d=Xe(n,p.inputSources);try{let c=await e.execute({request:n,response:i,logger:a,input:d,options:t});return{requestMock:n,responseMock:i,loggerMock:a,output:c}}catch(c){if(!r)throw c;return r(ee(c),i),{requestMock:n,responseMock:i,loggerMock:a,output:{}}}};var N=I(require("typescript"),1);var j=I(require("typescript"),1),Qt=require("ramda"),s=j.default.factory,re=[s.createModifier(j.default.SyntaxKind.ExportKeyword)],rs=[s.createModifier(j.default.SyntaxKind.AsyncKeyword)],os=[s.createModifier(j.default.SyntaxKind.PublicKeyword),s.createModifier(j.default.SyntaxKind.ReadonlyKeyword)],zo=[s.createModifier(j.default.SyntaxKind.ProtectedKeyword),s.createModifier(j.default.SyntaxKind.ReadonlyKeyword)],ns=s.createTemplateHead(""),ss=s.createTemplateMiddle(" "),Ve=s.createTemplateTail(""),Jt=e=>s.createTemplateLiteralType(ns,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?Ve:ss))),Wt=Jt(["M","P"]),Tt=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Ot=(e,t)=>(0,Qt.chain)(([r,o])=>[Tt(s.createIdentifier(r),o,t)],Object.entries(e)),Xt=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),Io=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),Co=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),Q=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],j.default.NodeFlags.Const),er=(e,t)=>s.createTypeAliasDeclaration(re,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),Rt=(e,t)=>s.createTypeAliasDeclaration(re,e,void 0,t),Zo=(e,t,r)=>s.createPropertyDeclaration(os,e,void 0,t,r),Eo=(e,t,r)=>s.createClassDeclaration(re,e,void 0,void 0,[t,...r]),vo=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),jo=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(j.default.SyntaxKind.AnyKeyword)]),No=(e,t,r)=>s.createInterfaceDeclaration(re,e,void 0,t,r),is=(0,Qt.chain)(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),Lo=e=>is(Object.entries(e)),tr=(e,t,r)=>s.createArrowFunction(r?rs:void 0,void 0,e.map(o=>Tt(o)),void 0,void 0,t),rr=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,Ot({acc:void 0,key:void 0}),void 0,void 0,t),r]),ko=(...e)=>`"${e.join(" ")}"`,Mo=(e,t,r)=>s.createConditionalExpression(e,s.createToken(j.default.SyntaxKind.QuestionToken),t,s.createToken(j.default.SyntaxKind.ColonToken),r);var Ho=["get","post","put","delete","patch"];var g=I(require("typescript"),1),Pt=require("zod");var T=I(require("typescript"),1),{factory:At}=T.default,or=(e,t)=>T.default.addSyntheticLeadingComment(e,T.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),fe=(e,t,r)=>{let o=At.createTypeAliasDeclaration(void 0,At.createIdentifier(t),void 0,e);return r?or(o,r):o},nr=(e,t)=>{let r=T.default.createSourceFile("print.ts","",T.default.ScriptTarget.Latest,!1,T.default.ScriptKind.TS);return T.default.createPrinter(t).printNode(T.default.EmitHint.Unspecified,e,r)},as=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Uo=e=>as.test(e)?At.createIdentifier(e):At.createStringLiteral(e),ps=[T.default.SyntaxKind.AnyKeyword,T.default.SyntaxKind.BigIntKeyword,T.default.SyntaxKind.BooleanKeyword,T.default.SyntaxKind.NeverKeyword,T.default.SyntaxKind.NumberKeyword,T.default.SyntaxKind.ObjectKeyword,T.default.SyntaxKind.StringKeyword,T.default.SyntaxKind.SymbolKeyword,T.default.SyntaxKind.UndefinedKeyword,T.default.SyntaxKind.UnknownKeyword,T.default.SyntaxKind.VoidKeyword],Do=e=>ps.includes(e.kind);var{factory:f}=g.default,cs={[g.default.SyntaxKind.AnyKeyword]:"",[g.default.SyntaxKind.BigIntKeyword]:BigInt(0),[g.default.SyntaxKind.BooleanKeyword]:!1,[g.default.SyntaxKind.NumberKeyword]:0,[g.default.SyntaxKind.ObjectKeyword]:{},[g.default.SyntaxKind.StringKeyword]:"",[g.default.SyntaxKind.UndefinedKeyword]:void 0},ds=({value:e})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),ls=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&De(a)?a instanceof Pt.z.ZodOptional:a.isOptional(),d=f.createPropertySignature(void 0,Uo(i),p&&o?f.createToken(g.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description?or(d,a.description):d});return f.createTypeLiteralNode(n)},ms=({element:e},{next:t})=>f.createArrayTypeNode(t(e)),us=({options:e})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Ko=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(Do(n)?n.kind:n,n)}return f.createUnionTypeNode(Array.from(r.values()))},fs=e=>cs?.[e.kind],ys=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=et(e,fs(o)),i={number:g.default.SyntaxKind.NumberKeyword,bigint:g.default.SyntaxKind.BigIntKeyword,boolean:g.default.SyntaxKind.BooleanKeyword,string:g.default.SyntaxKind.StringKeyword,undefined:g.default.SyntaxKind.UndefinedKeyword,object:g.default.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(n&&i[n]||g.default.SyntaxKind.AnyKeyword)}return o},gs=e=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),hs=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(g.default.SyntaxKind.UndefinedKeyword)]):o},xs=(e,{next:t})=>f.createUnionTypeNode([t(e.unwrap()),f.createLiteralTypeNode(f.createNull())]),bs=({items:e,_def:{rest:t}},{next:r})=>f.createTupleTypeNode(e.map(r).concat(t===null?[]:f.createRestTypeNode(r(t)))),Ss=({keySchema:e,valueSchema:t},{next:r})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e,t].map(r)),Ts=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(g.default.isTypeLiteralNode)?f.createTypeLiteralNode(o.flatMap(({members:i})=>i)):f.createIntersectionTypeNode(o)},Os=({_def:e},{next:t})=>t(e.innerType),ye=e=>()=>f.createKeywordTypeNode(e),Rs=(e,{next:t})=>t(e.unwrap()),As=(e,{next:t})=>t(e.unwrap()),Ps=({_def:e},{next:t})=>t(e.innerType),ws=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),zs=()=>f.createLiteralTypeNode(f.createNull()),Is=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),Cs=e=>{let t=e.unwrap(),r=f.createKeywordTypeNode(g.default.SyntaxKind.StringKeyword),o=f.createTypeReferenceNode("Buffer"),n=f.createUnionTypeNode([r,o]);return t instanceof Pt.z.ZodString?r:t instanceof Pt.z.ZodUnion?n:o},Zs=(e,{next:t})=>t(e.unwrap().shape.raw),Es={ZodString:ye(g.default.SyntaxKind.StringKeyword),ZodNumber:ye(g.default.SyntaxKind.NumberKeyword),ZodBigInt:ye(g.default.SyntaxKind.BigIntKeyword),ZodBoolean:ye(g.default.SyntaxKind.BooleanKeyword),ZodAny:ye(g.default.SyntaxKind.AnyKeyword),[pe]:ye(g.default.SyntaxKind.StringKeyword),[ce]:ye(g.default.SyntaxKind.StringKeyword),ZodNull:zs,ZodArray:ms,ZodTuple:bs,ZodRecord:Ss,ZodObject:ls,ZodLiteral:ds,ZodIntersection:Ts,ZodUnion:Ko,ZodDefault:Os,ZodEnum:us,ZodNativeEnum:gs,ZodEffects:ys,ZodOptional:hs,ZodNullable:xs,ZodDiscriminatedUnion:Ko,ZodBranded:Rs,ZodCatch:Ps,ZodPipeline:ws,ZodLazy:Is,ZodReadonly:As,[B]:Cs,[te]:Zs},_e=(e,{brandHandling:t,ctx:r})=>me(e,{rules:{...t,...Es},onMissing:()=>f.createKeywordTypeNode(g.default.SyntaxKind.AnyKeyword),ctx:r});var wt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client"),isJsonConst:s.createIdentifier("isJSON")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let n=s.createLiteralTypeNode(s.createNull());this.aliases.set(t,fe(n,o)),this.aliases.set(t,fe(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0}}){Ne({routing:t,onEndpoint:(k,z,M)=>{let ge={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},Me=U(M,z,"input"),He=_e(k.getSchema("input"),{brandHandling:r,ctx:{...ge,isResponse:!1}}),H=n?U(M,z,"positive.response"):void 0,sr=k.getResponses("positive").map(({schema:G})=>G).reduce((G,It)=>G.or(It)),ir=n?_e(sr,{brandHandling:r,ctx:{...ge,isResponse:!0}}):void 0,Ue=n?U(M,z,"negative.response"):void 0,ar=k.getResponses("negative").map(({schema:G})=>G).reduce((G,It)=>G.or(It)),pr=n?_e(ar,{brandHandling:r,ctx:{...ge,isResponse:!0}}):void 0,cr=U(M,z,"response"),Bo=H&&Ue?s.createUnionTypeNode([s.createTypeReferenceNode(H),s.createTypeReferenceNode(Ue)]):_e(sr.or(ar),{brandHandling:r,ctx:{...ge,isResponse:!0}});this.program.push(fe(He,Me)),ir&&H&&this.program.push(fe(ir,H)),pr&&Ue&&this.program.push(fe(pr,Ue)),this.program.push(fe(Bo,cr)),this.paths.push(z),this.registry.set({method:M,path:z},{input:Me,positive:H,negative:Ue,response:cr,isJson:k.getResponses("positive").some(G=>G.mimeTypes.includes(A.json)),tags:k.getTags()})}}),this.program.unshift(...this.aliases.values()),this.program.push(er(this.ids.pathType,this.paths)),this.program.push(er(this.ids.methodType,Ho)),this.program.push(Rt(this.ids.methodPathType,Jt([this.ids.methodType,this.ids.pathType])));let a=[s.createHeritageClause(N.default.SyntaxKind.ExtendsKeyword,[Xt(this.ids.methodPathType,N.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),n&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let p=[],d=[];for(let[{method:k,path:z},{isJson:M,tags:ge,...Me}]of this.registry){let He=ko(k,z);for(let H of this.interfaces)H.kind in Me&&H.props.push(Co(He,Me[H.kind]));o!=="types"&&(M&&p.push(s.createPropertyAssignment(He,s.createTrue())),d.push(s.createPropertyAssignment(He,s.createArrayLiteralExpression(ge.map(H=>s.createStringLiteral(H))))))}for(let{id:k,props:z}of this.interfaces)this.program.push(No(k,a,z));if(o==="types")return;let c=s.createVariableStatement(re,Q(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(p))),u=s.createVariableStatement(re,Q(this.ids.endpointTagsConst,s.createObjectLiteralExpression(d))),m=Rt(this.ids.providerType,s.createFunctionTypeNode(Lo({M:this.ids.methodType,P:this.ids.pathType}),Ot({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Wt)}),vo(this.ids.responseInterface,Wt))),y=Rt(this.ids.implementationType,s.createFunctionTypeNode(void 0,Ot({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(N.default.SyntaxKind.StringKeyword),params:Xt(N.default.SyntaxKind.StringKeyword,N.default.SyntaxKind.AnyKeyword)}),jo())),h=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,Ve)]),R=rr(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[h,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),O=rr(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[h]),N.default.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),x=Eo(this.ids.clientClass,Io([Tt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),zo)]),[Zo(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),tr([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,R,O]),!0))]);this.program.push(c,u,m,y,x);let w=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),L=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(A.json))]),void 0,this.ids.undefinedValue)),K=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),q=s.createVariableStatement(void 0,Q(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,Ve)]),s.createObjectLiteralExpression([w,L,K])])))),Le=s.createVariableStatement(void 0,Q(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),Ye=s.createVariableStatement(void 0,Q(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),Ve)])))),zt=s.createVariableStatement(void 0,Q(this.ids.isJsonConst,s.createCallChain(s.createPropertyAccessChain(s.createCallExpression(s.createPropertyAccessExpression(s.createPropertyAccessExpression(this.ids.responseConst,this.ids.headersProperty),s.createIdentifier("get")),void 0,[s.createStringLiteral("content-type")]),s.createToken(N.default.SyntaxKind.QuestionDotToken),s.createIdentifier("startsWith")),void 0,void 0,[s.createStringLiteral(A.json)]))),Qe=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,Mo(this.ids.isJsonConst,s.createStringLiteral("json"),s.createStringLiteral("text"))),void 0,[])),$=s.createVariableStatement(re,Q(this.ids.exampleImplementationConst,tr([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([Le,Ye,q,zt,Qe]),!0),s.createTypeReferenceNode(this.ids.implementationType))),oe=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),ke=s.createVariableStatement(void 0,Q(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push($,ke,oe)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:nr(r,t)).join(`
19
+ `):void 0}print(t){let r=this.printUsage(t),o=r&&N.default.addSyntheticLeadingComment(N.default.addSyntheticLeadingComment(s.createEmptyStatement(),N.default.SyntaxKind.SingleLineCommentTrivia," Usage example:"),N.default.SyntaxKind.MultiLineCommentTrivia,`
20
+ ${r}`);return this.program.concat(o||[]).map((n,i)=>nr(n,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
21
21
 
22
- `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await ve("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let n=this.printUsage(t);this.usage=n&&o?[await o(n)]:this.usage;let i=this.print(t);return o?o(i):i}};var Ko={dateIn:ur,dateOut:yr,file:nt,upload:Sr,raw:xr};0&&(module.exports={BuiltinLogger,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,Middleware,MissingPeerError,OutputValidationError,ResultHandler,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createServer,defaultEndpointsFactory,defaultResultHandler,ensureHttpError,ez,getExamples,getMessageFromError,testEndpoint,testMiddleware});
22
+ `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await je("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let n=this.printUsage(t);this.usage=n&&o?[await o(n)]:this.usage;let i=this.print(t);return o?o(i):i}};var Fo={dateIn:fr,dateOut:gr,file:nt,upload:Tr,raw:br};0&&(module.exports={BuiltinLogger,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,Middleware,MissingPeerError,OutputValidationError,ResultHandler,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createServer,defaultEndpointsFactory,defaultResultHandler,ensureHttpError,ez,getExamples,getMessageFromError,testEndpoint,testMiddleware});
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import{clone as Wt,fromPairs as Co,map as Zo,pipe as Eo,toPairs as vo,pair as jo}from"ramda";import{z as de}from"zod";import{memoizeWith as So,pickBy as To,xprod as Oo}from"ramda";import{z as Ro}from"zod";var A={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var ce=class extends Error{name="RoutingError"},v=class extends Error{name="DocumentationError";cause;constructor(t,{method:r,path:o,isResponse:n}){super(t),this.cause=`${n?"Response":"Input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`}},Ue=class extends Error{name="IOSchemaError"},Q=class extends Ue{constructor(r){super(J(r),{cause:r});this.cause=r}name="OutputValidationError"},K=class extends Ue{constructor(r){super(J(r),{cause:r});this.cause=r}name="InputValidationError"},B=class extends Error{constructor(r,o){super(J(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},Ae=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var Ao=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(A.upload);return"files"in e&&r},ut={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Po=["body","query","params"],ft=e=>e.method.toLowerCase(),yt=e=>e.startsWith("x-"),wo=e=>To((t,r)=>yt(r),e),De=(e,t={})=>{let r=ft(e);return r==="options"?{}:(t[r]||ut[r]||Po).filter(o=>o==="files"?Ao(e):!0).map(o=>o==="headers"?wo(e[o]):e[o]).reduce((o,n)=>Object.assign(o,n),{})},q=e=>e instanceof Error?e:new Error(String(e)),J=e=>e instanceof Ro.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof Q?`output${e.cause.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,$=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[h]?.examples||[];if(!r&&t==="original")return o;let n=[];for(let i of o){let a=e.safeParse(i);a.success&&n.push(t==="parsed"?a.data:i)}return n},W=(e,t,r)=>e.length&&t.length?Oo(e,t).map(r):e.concat(t),Pe=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,gt=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),j=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(gt).join(""),Ke=(e,t)=>{try{return typeof e.parse(t)}catch{return}},X=e=>typeof e=="object"&&e!==null,Fe=So(()=>"static",()=>process.env.NODE_ENV==="production");import{clone as zo,mergeDeepRight as Io}from"ramda";var h=Symbol.for("express-zod-api"),Be=e=>{let t=e.describe(e.description);return t._def[h]=zo(t._def[h])||{examples:[]},t},Jt=(e,t)=>{if(!(h in e._def))return t;let r=Be(t);return r._def[h].examples=W(r._def[h].examples,e._def[h].examples,([o,n])=>typeof o=="object"&&typeof n=="object"?Io({...o},{...n}):n),r};var No=function(e){let t=Be(this);return t._def[h].examples.push(e),t},Lo=function(e){let t=Be(this);return t._def[h].defaultLabel=e,t},ko=function(e){return new de.ZodBranded({typeName:de.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[h]:{examples:[],...Wt(this._def[h]),brand:e}})},Mo=function(e){let t=typeof e=="function"?e:Eo(vo,Zo(([n,i])=>jo(e[String(n)]||n,i)),Co),r=t(Wt(this.shape)),o=de.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};h in globalThis||(globalThis[h]=!0,Object.defineProperties(de.ZodType.prototype,{example:{get(){return No.bind(this)}},brand:{set(){},get(){return ko.bind(this)}}}),Object.defineProperty(de.ZodDefault.prototype,"label",{get(){return Lo.bind(this)}}),Object.defineProperty(de.ZodObject.prototype,"remap",{get(){return Mo.bind(this)}}));function Ho(e){return e}import{z as Yo}from"zod";import{z as cr}from"zod";import{fail as P}from"node:assert/strict";import{z as we}from"zod";var qe=e=>!isNaN(e.getTime());var ee=Symbol("DateIn"),Xt=()=>we.union([we.string().date(),we.string().datetime(),we.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(we.date().refine(qe)).brand(ee);import{z as Uo}from"zod";var te=Symbol("DateOut"),er=()=>Uo.date().refine(qe).transform(e=>e.toISOString()).brand(te);import{z as $e}from"zod";var k=Symbol("File"),tr=$e.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),Do={buffer:()=>tr.brand(k),string:()=>$e.string().brand(k),binary:()=>tr.or($e.string()).brand(k),base64:()=>$e.string().base64().brand(k)};function Ge(e){return Do[e||"string"]()}import{z as Ko}from"zod";var G=Symbol("Raw"),rr=(e={})=>Ko.object({raw:Ge("buffer")}).extend(e).brand(G);import{z as Fo}from"zod";var le=Symbol("Upload"),or=()=>Fo.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(le);var nr=(e,{next:t})=>e.options.some(t),Bo=({_def:e},{next:t})=>[e.left,e.right].some(t),Ve=(e,{next:t})=>t(e.unwrap()),ht={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:nr,ZodDiscriminatedUnion:nr,ZodIntersection:Bo,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:Ve,ZodNullable:Ve,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},_e=(e,{condition:t,rules:r=ht,depth:o=1,maxDepth:n=Number.POSITIVE_INFINITY})=>{if(t?.(e))return!0;let i=o<n?r[e._def[h]?.brand]||r[e._def.typeName]:void 0;return i?i(e,{next:a=>_e(a,{condition:t,rules:r,maxDepth:n,depth:o+1})}):!1},sr=e=>_e(e,{condition:t=>t._def[h]?.brand===le}),ir=e=>_e(e,{condition:t=>t._def[h]?.brand===G,maxDepth:3}),xt=(e,t)=>{let r=new WeakSet;return _e(e,{maxDepth:300,rules:{...ht,ZodBranded:Ve,ZodReadonly:Ve,ZodCatch:({_def:{innerType:o}},{next:n})=>n(o),ZodPipeline:({_def:o},{next:n})=>n(o[t]),ZodLazy:(o,{next:n})=>r.has(o)?!1:r.add(o)&&n(o.schema),ZodTuple:({items:o,_def:{rest:n}},{next:i})=>[...o].concat(n??[]).some(i),ZodEffects:{out:void 0,in:ht.ZodEffects}[t],ZodNaN:()=>P("z.nan()"),ZodSymbol:()=>P("z.symbol()"),ZodFunction:()=>P("z.function()"),ZodMap:()=>P("z.map()"),ZodSet:()=>P("z.set()"),ZodBigInt:()=>P("z.bigint()"),ZodVoid:()=>P("z.void()"),ZodPromise:()=>P("z.promise()"),ZodNever:()=>P("z.never()"),ZodDate:()=>t==="in"&&P("z.date()"),[te]:()=>t==="in"&&P("ez.dateOut()"),[ee]:()=>t==="out"&&P("ez.dateIn()"),[G]:()=>t==="out"&&P("ez.raw()"),[le]:()=>t==="out"&&P("ez.upload()"),[k]:()=>!1}})};import Go,{isHttpError as Vo}from"http-errors";import ar,{isHttpError as qo}from"http-errors";import{z as $o}from"zod";var bt=(e,{variant:t,args:r,...o})=>{if(typeof e=="function"&&(e=e(...r)),e instanceof $o.ZodType)return[{schema:e,...o}];if(Array.isArray(e)&&!e.length){let n=new Error(`At least one ${t} response schema required.`);throw new B(n)}return(Array.isArray(e)?e:[e]).map(({schema:n,statusCode:i,mimeType:a})=>({schema:n,statusCodes:typeof i=="number"?[i]:i||o.statusCodes,mimeTypes:typeof a=="string"?[a]:a||o.mimeTypes}))},St=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),Ye=e=>qo(e)?e:ar(e instanceof K?400:500,J(e),{cause:e.cause||e}),ze=e=>Fe()&&!e.expose?ar(e.statusCode).message:e.message;var Qe=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=ze(Go(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`
2
- Original error: ${e.handled.message}.`:""),{expose:Vo(e.cause)?e.cause.expose:!1}));r.status(500).type("text/plain").end(o)};import{chain as _o}from"ramda";var re=e=>X(e)&&"or"in e,ue=e=>X(e)&&"and"in e,Tt=e=>({and:_o(t=>ue(t)?t.and:[t],e)}),Je=(e,t)=>ue(e)?{and:e.and.map(r=>re(r)?{or:r.or.map(t)}:t(r))}:re(e)?{or:e.or.map(r=>ue(r)?{and:r.and.map(t)}:t(r))}:t(e),Ot=e=>e.and.reduce((t,r)=>({or:W(t.or,re(r)?r.or:[r],Tt)}),{or:[]}),me=(e,t)=>ue(e)?re(t)?me(Ot(e),t):Tt([e,t]):re(e)?ue(t)?me(t,e):re(t)?{or:W(e.or,t.or,Tt)}:me(e,{and:[t]}):ue(t)||re(t)?me(t,e):{and:[e,t]};import{z as pr}from"zod";var Rt=class{},V=class extends Rt{#e;#t;#r;constructor({input:t=pr.object({}),security:r,handler:o}){super(),this.#e=t,this.#t=r,this.#r=o}getSecurity(){return this.#t}getSchema(){return this.#e}async execute({input:t,...r}){try{let o=await this.#e.parseAsync(t);return this.#r({...r,input:o})}catch(o){throw o instanceof pr.ZodError?new K(o):o}}},fe=class extends V{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({handler:async({request:n,response:i})=>new Promise((a,p)=>{let d=c=>{if(c&&c instanceof Error)return p(o(c));a(r(n,i))};t(n,i,d)?.catch(d)})})}};var ye=class{nest(t){return Object.assign(t,{"":this})}};var Ie=class extends ye{},We=class extends Ie{#e;#t;#r;#n;#s;#i;#o;#a;#p;#c;#d;constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:i,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:u,shortDescription:l}){super(),this.#s=n,this.#i=i,this.#r=d,this.#c=a,this.#t=Object.freeze(t),this.#a=Object.freeze(p),this.#p=Object.freeze(c),this.#e={long:u,short:l},this.#o={input:r,output:o},this.#n={positive:Object.freeze(i.getPositiveResponse(o)),negative:Object.freeze(i.getNegativeResponse())},this.#d=sr(r)?"upload":ir(r)?"raw":"json"}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return this.#o[t]}getRequestType(){return this.#d}getResponses(t){return this.#n[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?me(t,o):t},{and:[]})}getScopes(){return this.#a}getTags(){return this.#p}getOperationId(t){return this.#c(t)}async#l(t){try{return await this.#o.output.parseAsync(t)}catch(r){throw r instanceof cr.ZodError?new Q(r):r}}async#m({method:t,logger:r,options:o,response:n,...i}){for(let a of this.#r)if(!(t==="options"&&!(a instanceof fe))&&(Object.assign(o,await a.execute({...i,options:o,response:n,logger:r})),n.writableEnded)){r.warn("A middleware has closed the stream. Accumulated options:",o);break}}async#u({input:t,...r}){let o;try{o=await this.#o.input.parseAsync(t)}catch(n){throw n instanceof cr.ZodError?new K(n):n}return this.#s({...r,input:o})}async#f({error:t,...r}){try{await this.#i.execute({...r,error:t})}catch(o){Qe({...r,error:new B(q(o),t||void 0)})}}async execute({request:t,response:r,logger:o,config:n}){let i=ft(t),a={},p=null,d=null,c=De(t,n.inputSources);try{if(await this.#m({method:i,input:c,request:t,response:r,logger:o,options:a}),r.writableEnded)return;if(i==="options")return void r.status(200).end();p=await this.#l(await this.#u({input:c,logger:o,options:a}))}catch(u){d=q(u)}await this.#f({input:c,output:p,request:t,response:r,error:d,logger:o,options:a})}};var dr=(e,t)=>{let r=e.map(n=>n.getSchema()).concat(t),o=r.reduce((n,i)=>n.and(i));return r.reduce((n,i)=>Jt(i,n),o)};import{z as M}from"zod";var oe={positive:200,negative:400};var At=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},Ce=class extends At{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return bt(this.#e,{variant:"positive",args:[t],statusCodes:[oe.positive],mimeTypes:[A.json]})}getNegativeResponse(){return bt(this.#t,{variant:"negative",args:[],statusCodes:[oe.negative],mimeTypes:[A.json]})}},Ze=new Ce({positive:e=>{let t=$({schema:e}),r=M.object({status:M.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:M.object({status:M.literal("error"),error:M.object({message:M.string()})}).example({status:"error",error:{message:"Sample error message"}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:i})=>{if(e){let a=Ye(e);return St(a,i,o,t),void n.status(a.statusCode).json({status:"error",error:{message:ze(a)}})}n.status(oe.positive).json({status:"success",data:r})}}),Pt=new Ce({positive:e=>{let t=$({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof M.ZodArray?e.shape.items:M.array(M.any());return t.reduce((o,n)=>X(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:M.string().example("Sample error message"),handler:({response:e,output:t,error:r,logger:o,request:n,input:i})=>{if(r){let a=Ye(r);return St(a,o,n,i),void e.status(a.statusCode).type("text/plain").send(ze(a))}if(t&&"items"in t&&Array.isArray(t.items))return void e.status(oe.positive).json(t.items);throw new Error("Property 'items' is missing in the endpoint output")}});var Ee=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 instanceof V?t:new V(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new fe(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new V({handler:t})),this.resultHandler)}build({input:t=Yo.object({}),handler:r,output:o,description:n,shortDescription:i,operationId:a,scope:p,tag:d,method:c}){let{middlewares:u,resultHandler:l}=this,y=typeof c=="string"?[c]:c,x=typeof a=="function"?a:()=>a,R=typeof p=="string"?[p]:p||[],O=typeof d=="string"?[d]:d||[];return new We({handler:r,middlewares:u,outputSchema:o,resultHandler:l,scopes:R,tags:O,methods:y,getOperationId:x,description:n,shortDescription:i,inputSchema:dr(u,t)})}},Qo=new Ee(Ze),Jo=new Ee(Pt);import{Ansis as Xo,blue as en,cyanBright as tn,green as rn,hex as on,red as nn}from"ansis";import{inspect as sn}from"node:util";import{performance as hr}from"node:perf_hooks";var et={debug:10,info:20,warn:30,error:40},mr=e=>X(e)&&Object.keys(et).some(t=>t in e),ur=e=>e in et,fr=(e,t)=>et[e]<et[t],yr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),Xe=yr(),lr=yr(2),Wo=e=>e<1e-6?["picosecond",e/1e-9,Xe]:e<.001?["nanosecond",e/1e-6,Xe]:e<1?["microsecond",e/.001,Xe]:e<1e3?["millisecond",e,Xe]:e<6e4?["second",e/1e3,lr]:["minute",e/6e4,lr],gr=e=>{let[t,r,o]=Wo(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var ve=class e{config;styles={debug:en,info:rn,warn:on("#FFA500"),error:nn};constructor(t={}){let{color:r=new Xo().isSupported(),level:o=Fe()?"warn":"debug",depth:n=2,ctx:i={}}=t;this.config={color:r,level:o,depth:n,ctx:i}}prettyPrint(t){let{depth:r,color:o,level:n}=this.config;return sn(t,{depth:r,colors:o,breakLength:n==="debug"?80:1/0,compact:n==="debug"?3:!0})}print(t,r,o){let{level:n,ctx:{requestId:i,...a},color:p}=this.config;if(n==="silent"||fr(t,n))return;let d=[new Date().toISOString()];i&&d.push(p?tn(i):i),d.push(p?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&d.push(this.prettyPrint(o)),Object.keys(a).length>0&&d.push(this.prettyPrint(a)),console.log(d.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})}profile(t){let r=hr.now();return()=>{let o=hr.now()-r,{message:n,severity:i="debug",formatter:a=gr}=typeof t=="object"?t:{message:t};this.print(typeof i=="function"?i(o):i,n,a(o))}}};import{keys as an,reject as pn,equals as cn}from"ramda";var je=class extends ye{entries;constructor(t){super();let r=[],o=an(t);for(let n of o){let i=t[n];i&&r.push([n,i,pn(cn(n),o)])}this.entries=Object.freeze(r)}};import dn from"express";var Ne=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,dn.static(...this.params))}};import zt from"express";import hn from"node:http";import xn from"node:https";var ge=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new Ae(e)};var xr=(e,t)=>Object.entries(e).map(([r,o])=>{if(r.includes("/"))throw new ce(`The entry '${r}' must avoid having slashes \u2014 use nesting instead.`);let n=r.trim();return[`${t||""}${n?`/${n}`:""}`,o]}),he=({routing:e,onEndpoint:t,onStatic:r})=>{let o=xr(e);for(;o.length;){let[n,i]=o.shift();if(i instanceof Ie){let a=i.getMethods()||["get"];for(let p of a)t(i,n,p)}else if(i instanceof Ne)r&&i.apply(n,r);else if(i instanceof je)for(let[a,p,d]of i.entries){let c=p.getMethods();if(c&&!c.includes(a))throw new ce(`Endpoint assigned to ${a} method of ${n} must support ${a} method.`);t(p,n,a,d)}else o.unshift(...xr(i,n))}};var wt=({app:e,getLogger:t,config:r,routing:o,parsers:n})=>{let i=new WeakSet,a=new Set;he({routing:o,onStatic:(p,d)=>void e.use(p,d),onEndpoint:(p,d,c,u)=>{let l=p.getRequestType();if(!i.has(p)){if(l==="json")try{xt(p.getSchema("input"),"in")}catch(f){t().warn("The final input schema of the endpoint contains an unsupported JSON payload type.",{path:d,method:c,reason:f})}for(let f of["positive","negative"])for(let{mimeTypes:T,schema:w}of p.getResponses(f))if(T.includes(A.json))try{xt(w,"out")}catch(I){t().warn(`The final ${f} response schema of the endpoint contains an unsupported JSON payload type.`,{path:d,method:c,reason:I})}i.add(p)}let x={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":[c,...u||[],"options"].join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"},R=n?.[l]||[],O=async(f,T)=>{let w=t(f);if(r.cors){let I=typeof r.cors=="function"?await r.cors({request:f,endpoint:p,logger:w,defaultHeaders:x}):x;for(let H in I)T.set(H,I[H])}return p.execute({request:f,response:T,logger:w,config:r})};r.cors&&!a.has(d)&&(e.options(d,...R,O),a.add(d)),e[c](d,...R,O)}})};import Pr,{isHttpError as mn}from"http-errors";import{setInterval as ln}from"node:timers/promises";var br=e=>"_httpMessage"in e&&typeof e._httpMessage=="object"&&e._httpMessage!==null&&"headersSent"in e._httpMessage&&typeof e._httpMessage.headersSent=="boolean"&&"setHeader"in e._httpMessage&&typeof e._httpMessage.setHeader=="function",Sr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Tr=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Or=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),Rr=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var Ar=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,i=c=>void n.delete(c.destroy()),a=c=>void(br(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):i(c)),p=c=>void(o?c.destroy():n.add(c.once("close",()=>void n.delete(c))));for(let c of e)for(let u of["connection","secureConnection"])c.on(u,p);let d=async()=>{for(let c of e)c.on("request",Or);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(Tr(c)||Sr(c))&&a(c);for await(let c of ln(10,Date.now()))if(n.size===0||Date.now()-c>=t)break;for(let c of n)i(c);return Promise.allSettled(e.map(Rr))};return{sockets:n,shutdown:()=>o??=d()}};var wr=({errorHandler:e,getLogger:t})=>async(r,o,n,i)=>r?e.execute({error:mn(r)?r:Pr(400,q(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):i(),zr=({errorHandler:e,getLogger:t})=>async(r,o)=>{let n=Pr(404,`Can not ${r.method} ${r.path}`),i=t(r);try{e.execute({request:r,response:o,logger:i,error:n,input:null,output:null,options:{}})}catch(a){Qe({response:o,logger:i,error:new B(q(a),n)})}},un=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},fn=e=>({log:e.debug.bind(e)}),Ir=async({getLogger:e,config:t})=>{let r=await ge("express-fileupload"),{limitError:o,beforeUpload:n,...i}={...typeof t.upload=="object"&&t.upload},a=[];return a.push(async(p,d,c)=>{let u=e(p);try{await n?.({request:p,logger:u})}catch(l){return c(l)}return r({debug:!0,...i,abortOnLimit:!1,parseNested:!0,logger:fn(u)})(p,d,c)}),o&&a.push(un(o)),a},Cr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},Zr=({logger:e,config:t})=>async(r,o,n)=>{let i=await t.childLoggerProvider?.({request:r,parent:e})||e;i.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[h]={logger:i}),n()},Er=e=>t=>t?.res?.locals[h]?.logger||e,vr=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
3
- `).slice(1))),jr=({servers:e,logger:t,options:{timeout:r,events:o=["SIGINT","SIGTERM"]}})=>{let n=Ar(e,{logger:t,timeout:r}),i=()=>n.shutdown().then(()=>process.exit());for(let a of o)process.on(a,i)};import{gray as yn,hex as Nr,italic as tt,whiteBright as gn}from"ansis";var Lr=()=>{let e=tt("Proudly supports transgender community.".padStart(109)),t=tt("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=tt("Thank you for choosing Express Zod API for your project.".padStart(132)),o=tt("for Kesaria".padEnd(20)),n=Nr("#F5A9B8"),i=Nr("#5BCEFA"),a=new Array(14).fill(i,1,3).fill(n,3,5).fill(gn,5,7).fill(n,7,9).fill(i,9,12).fill(yn,12,13);return`
1
+ import{clone as Xt,fromPairs as Zo,map as Eo,pipe as vo,toPairs as jo,pair as No}from"ramda";import{z as le}from"zod";import{memoizeWith as To,pickBy as Oo,xprod as Ro}from"ramda";import{z as Ao}from"zod";var R={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var ce=class extends Error{name="RoutingError"},E=class extends Error{name="DocumentationError";cause;constructor(t,{method:r,path:o,isResponse:n}){super(t),this.cause=`${n?"Response":"Input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`}},De=class extends Error{name="IOSchemaError"},Q=class extends De{constructor(r){super(J(r),{cause:r});this.cause=r}name="OutputValidationError"},K=class extends De{constructor(r){super(J(r),{cause:r});this.cause=r}name="InputValidationError"},B=class extends Error{constructor(r,o){super(J(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},Pe=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var Po=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(R.upload);return"files"in e&&r},ft={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},wo=["body","query","params"],yt=e=>e.method.toLowerCase(),gt=e=>e.startsWith("x-"),zo=e=>Oo((t,r)=>gt(r),e),Ke=(e,t={})=>{let r=yt(e);return r==="options"?{}:(t[r]||ft[r]||wo).filter(o=>o==="files"?Po(e):!0).map(o=>o==="headers"?zo(e[o]):e[o]).reduce((o,n)=>Object.assign(o,n),{})},q=e=>e instanceof Error?e:new Error(String(e)),J=e=>e instanceof Ao.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof Q?`output${e.cause.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,$=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[x]?.examples||[];if(!r&&t==="original")return o;let n=[];for(let i of o){let a=e.safeParse(i);a.success&&n.push(t==="parsed"?a.data:i)}return n},W=(e,t,r)=>e.length&&t.length?Ro(e,t).map(r):e.concat(t),we=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,ht=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(ht).join(""),Fe=(e,t)=>{try{return typeof e.parse(t)}catch{return}},X=e=>typeof e=="object"&&e!==null,de=To(()=>"static",()=>process.env.NODE_ENV==="production");import{clone as Io,mergeDeepRight as Co}from"ramda";var x=Symbol.for("express-zod-api"),Be=e=>{let t=e.describe(e.description);return t._def[x]=Io(t._def[x])||{examples:[]},t},Wt=(e,t)=>{if(!(x in e._def))return t;let r=Be(t);return r._def[x].examples=W(r._def[x].examples,e._def[x].examples,([o,n])=>typeof o=="object"&&typeof n=="object"?Co({...o},{...n}):n),r};var Lo=function(e){let t=Be(this);return t._def[x].examples.push(e),t},ko=function(e){let t=Be(this);return t._def[x].defaultLabel=e,t},Mo=function(e){return new le.ZodBranded({typeName:le.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[x]:{examples:[],...Xt(this._def[x]),brand:e}})},Ho=function(e){let t=typeof e=="function"?e:vo(jo,Eo(([n,i])=>No(e[String(n)]||n,i)),Zo),r=t(Xt(this.shape)),o=le.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};x in globalThis||(globalThis[x]=!0,Object.defineProperties(le.ZodType.prototype,{example:{get(){return Lo.bind(this)}},brand:{set(){},get(){return Mo.bind(this)}}}),Object.defineProperty(le.ZodDefault.prototype,"label",{get(){return ko.bind(this)}}),Object.defineProperty(le.ZodObject.prototype,"remap",{get(){return Ho.bind(this)}}));function Uo(e){return e}import{z as Qo}from"zod";import{z as dr}from"zod";import{fail as A}from"node:assert/strict";import{z as ze}from"zod";var qe=e=>!isNaN(e.getTime());var ee=Symbol("DateIn"),er=()=>ze.union([ze.string().date(),ze.string().datetime(),ze.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(ze.date().refine(qe)).brand(ee);import{z as Do}from"zod";var te=Symbol("DateOut"),tr=()=>Do.date().refine(qe).transform(e=>e.toISOString()).brand(te);import{z as $e}from"zod";var k=Symbol("File"),rr=$e.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),Ko={buffer:()=>rr.brand(k),string:()=>$e.string().brand(k),binary:()=>rr.or($e.string()).brand(k),base64:()=>$e.string().base64().brand(k)};function Ge(e){return Ko[e||"string"]()}import{z as Fo}from"zod";var G=Symbol("Raw"),or=(e={})=>Fo.object({raw:Ge("buffer")}).extend(e).brand(G);import{z as Bo}from"zod";var me=Symbol("Upload"),nr=()=>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(me);var sr=(e,{next:t})=>e.options.some(t),qo=({_def:e},{next:t})=>[e.left,e.right].some(t),Ve=(e,{next:t})=>t(e.unwrap()),xt={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:sr,ZodDiscriminatedUnion:sr,ZodIntersection:qo,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:Ve,ZodNullable:Ve,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},_e=(e,{condition:t,rules:r=xt,depth:o=1,maxDepth:n=Number.POSITIVE_INFINITY})=>{if(t?.(e))return!0;let i=o<n?r[e._def[x]?.brand]||r[e._def.typeName]:void 0;return i?i(e,{next:a=>_e(a,{condition:t,rules:r,maxDepth:n,depth:o+1})}):!1},ir=e=>_e(e,{condition:t=>t._def[x]?.brand===me}),ar=e=>_e(e,{condition:t=>t._def[x]?.brand===G,maxDepth:3}),bt=(e,t)=>{let r=new WeakSet;return _e(e,{maxDepth:300,rules:{...xt,ZodBranded:Ve,ZodReadonly:Ve,ZodCatch:({_def:{innerType:o}},{next:n})=>n(o),ZodPipeline:({_def:o},{next:n})=>n(o[t]),ZodLazy:(o,{next:n})=>r.has(o)?!1:r.add(o)&&n(o.schema),ZodTuple:({items:o,_def:{rest:n}},{next:i})=>[...o].concat(n??[]).some(i),ZodEffects:{out:void 0,in:xt.ZodEffects}[t],ZodNaN:()=>A("z.nan()"),ZodSymbol:()=>A("z.symbol()"),ZodFunction:()=>A("z.function()"),ZodMap:()=>A("z.map()"),ZodSet:()=>A("z.set()"),ZodBigInt:()=>A("z.bigint()"),ZodVoid:()=>A("z.void()"),ZodPromise:()=>A("z.promise()"),ZodNever:()=>A("z.never()"),ZodDate:()=>t==="in"&&A("z.date()"),[te]:()=>t==="in"&&A("ez.dateOut()"),[ee]:()=>t==="out"&&A("ez.dateIn()"),[G]:()=>t==="out"&&A("ez.raw()"),[me]:()=>t==="out"&&A("ez.upload()"),[k]:()=>!1}})};import Vo,{isHttpError as _o}from"http-errors";import pr,{isHttpError as $o}from"http-errors";import{z as Go}from"zod";var St=(e,{variant:t,args:r,...o})=>{if(typeof e=="function"&&(e=e(...r)),e instanceof Go.ZodType)return[{schema:e,...o}];if(Array.isArray(e)&&!e.length){let n=new Error(`At least one ${t} response schema required.`);throw new B(n)}return(Array.isArray(e)?e:[e]).map(({schema:n,statusCode:i,mimeType:a})=>({schema:n,statusCodes:typeof i=="number"?[i]:i||o.statusCodes,mimeTypes:typeof a=="string"?[a]:a||o.mimeTypes}))},Tt=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),Ye=e=>$o(e)?e:pr(e instanceof K?400:500,J(e),{cause:e.cause||e}),Ie=e=>de()&&!e.expose?pr(e.statusCode).message:e.message;var Qe=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=Ie(Vo(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`
2
+ Original error: ${e.handled.message}.`:""),{expose:_o(e.cause)?e.cause.expose:!1}));r.status(500).type("text/plain").end(o)};import{chain as Yo}from"ramda";var re=e=>X(e)&&"or"in e,fe=e=>X(e)&&"and"in e,Ot=e=>({and:Yo(t=>fe(t)?t.and:[t],e)}),Je=(e,t)=>fe(e)?{and:e.and.map(r=>re(r)?{or:r.or.map(t)}:t(r))}:re(e)?{or:e.or.map(r=>fe(r)?{and:r.and.map(t)}:t(r))}:t(e),Rt=e=>e.and.reduce((t,r)=>({or:W(t.or,re(r)?r.or:[r],Ot)}),{or:[]}),ue=(e,t)=>fe(e)?re(t)?ue(Rt(e),t):Ot([e,t]):re(e)?fe(t)?ue(t,e):re(t)?{or:W(e.or,t.or,Ot)}:ue(e,{and:[t]}):fe(t)||re(t)?ue(t,e):{and:[e,t]};import{z as cr}from"zod";var At=class{},V=class extends At{#e;#t;#r;constructor({input:t=cr.object({}),security:r,handler:o}){super(),this.#e=t,this.#t=r,this.#r=o}getSecurity(){return this.#t}getSchema(){return this.#e}async execute({input:t,...r}){try{let o=await this.#e.parseAsync(t);return this.#r({...r,input:o})}catch(o){throw o instanceof cr.ZodError?new K(o):o}}},ye=class extends V{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({handler:async({request:n,response:i})=>new Promise((a,p)=>{let d=c=>{if(c&&c instanceof Error)return p(o(c));a(r(n,i))};t(n,i,d)?.catch(d)})})}};var ge=class{nest(t){return Object.assign(t,{"":this})}};var Ce=class extends ge{},We=class extends Ce{#e;#t;#r;#n;#s;#i;#o;#a;#p;#c;#d;constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:i,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:m,shortDescription:l}){super(),this.#s=n,this.#i=i,this.#r=d,this.#c=a,this.#t=Object.freeze(t),this.#a=Object.freeze(p),this.#p=Object.freeze(c),this.#e={long:m,short:l},this.#o={input:r,output:o},this.#n={positive:Object.freeze(i.getPositiveResponse(o)),negative:Object.freeze(i.getNegativeResponse())},this.#d=ir(r)?"upload":ar(r)?"raw":"json"}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return this.#o[t]}getRequestType(){return this.#d}getResponses(t){return this.#n[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?ue(t,o):t},{and:[]})}getScopes(){return this.#a}getTags(){return this.#p}getOperationId(t){return this.#c(t)}async#l(t){try{return await this.#o.output.parseAsync(t)}catch(r){throw r instanceof dr.ZodError?new Q(r):r}}async#m({method:t,logger:r,options:o,response:n,...i}){for(let a of this.#r)if(!(t==="options"&&!(a instanceof ye))&&(Object.assign(o,await a.execute({...i,options:o,response:n,logger:r})),n.writableEnded)){r.warn("A middleware has closed the stream. Accumulated options:",o);break}}async#u({input:t,...r}){let o;try{o=await this.#o.input.parseAsync(t)}catch(n){throw n instanceof dr.ZodError?new K(n):n}return this.#s({...r,input:o})}async#f({error:t,...r}){try{await this.#i.execute({...r,error:t})}catch(o){Qe({...r,error:new B(q(o),t||void 0)})}}async execute({request:t,response:r,logger:o,config:n}){let i=yt(t),a={},p=null,d=null,c=Ke(t,n.inputSources);try{if(await this.#m({method:i,input:c,request:t,response:r,logger:o,options:a}),r.writableEnded)return;if(i==="options")return void r.status(200).end();p=await this.#l(await this.#u({input:c,logger:o,options:a}))}catch(m){d=q(m)}await this.#f({input:c,output:p,request:t,response:r,error:d,logger:o,options:a})}};var lr=(e,t)=>{let r=e.map(n=>n.getSchema()).concat(t),o=r.reduce((n,i)=>n.and(i));return r.reduce((n,i)=>Wt(i,n),o)};import{z as M}from"zod";var oe={positive:200,negative:400};var Pt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},Ze=class extends Pt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return St(this.#e,{variant:"positive",args:[t],statusCodes:[oe.positive],mimeTypes:[R.json]})}getNegativeResponse(){return St(this.#t,{variant:"negative",args:[],statusCodes:[oe.negative],mimeTypes:[R.json]})}},Ee=new Ze({positive:e=>{let t=$({schema:e}),r=M.object({status:M.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:M.object({status:M.literal("error"),error:M.object({message:M.string()})}).example({status:"error",error:{message:"Sample error message"}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:i})=>{if(e){let a=Ye(e);return Tt(a,i,o,t),void n.status(a.statusCode).json({status:"error",error:{message:Ie(a)}})}n.status(oe.positive).json({status:"success",data:r})}}),wt=new Ze({positive:e=>{let t=$({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof M.ZodArray?e.shape.items:M.array(M.any());return t.reduce((o,n)=>X(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:M.string().example("Sample error message"),handler:({response:e,output:t,error:r,logger:o,request:n,input:i})=>{if(r){let a=Ye(r);return Tt(a,o,n,i),void e.status(a.statusCode).type("text/plain").send(Ie(a))}if(t&&"items"in t&&Array.isArray(t.items))return void e.status(oe.positive).json(t.items);throw new Error("Property 'items' is missing in the endpoint output")}});var ve=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 instanceof V?t:new V(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new ye(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new V({handler:t})),this.resultHandler)}build({input:t=Qo.object({}),handler:r,output:o,description:n,shortDescription:i,operationId:a,scope:p,tag:d,method:c}){let{middlewares:m,resultHandler:l}=this,f=typeof c=="string"?[c]:c,g=typeof a=="function"?a:()=>a,O=typeof p=="string"?[p]:p||[],T=typeof d=="string"?[d]:d||[];return new We({handler:r,middlewares:m,outputSchema:o,resultHandler:l,scopes:O,tags:T,methods:f,getOperationId:g,description:n,shortDescription:i,inputSchema:lr(m,t)})}},Jo=new ve(Ee),Wo=new ve(wt);import{Ansis as en,blue as tn,cyanBright as rn,green as on,hex as nn,red as sn}from"ansis";import{inspect as an}from"node:util";import{performance as xr}from"node:perf_hooks";var et={debug:10,info:20,warn:30,error:40},ur=e=>X(e)&&Object.keys(et).some(t=>t in e),fr=e=>e in et,yr=(e,t)=>et[e]<et[t],gr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),Xe=gr(),mr=gr(2),Xo=e=>e<1e-6?["picosecond",e/1e-9,Xe]:e<.001?["nanosecond",e/1e-6,Xe]:e<1?["microsecond",e/.001,Xe]:e<1e3?["millisecond",e,Xe]:e<6e4?["second",e/1e3,mr]:["minute",e/6e4,mr],hr=e=>{let[t,r,o]=Xo(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var je=class e{config;styles={debug:tn,info:on,warn:nn("#FFA500"),error:sn};constructor(t={}){let{color:r=new en().isSupported(),level:o=de()?"warn":"debug",depth:n=2,ctx:i={}}=t;this.config={color:r,level:o,depth:n,ctx:i}}prettyPrint(t){let{depth:r,color:o,level:n}=this.config;return an(t,{depth:r,colors:o,breakLength:n==="debug"?80:1/0,compact:n==="debug"?3:!0})}print(t,r,o){let{level:n,ctx:{requestId:i,...a},color:p}=this.config;if(n==="silent"||yr(t,n))return;let d=[new Date().toISOString()];i&&d.push(p?rn(i):i),d.push(p?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&d.push(this.prettyPrint(o)),Object.keys(a).length>0&&d.push(this.prettyPrint(a)),console.log(d.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})}profile(t){let r=xr.now();return()=>{let o=xr.now()-r,{message:n,severity:i="debug",formatter:a=hr}=typeof t=="object"?t:{message:t};this.print(typeof i=="function"?i(o):i,n,a(o))}}};import{keys as pn,reject as cn,equals as dn}from"ramda";var Ne=class extends ge{entries;constructor(t){super();let r=[],o=pn(t);for(let n of o){let i=t[n];i&&r.push([n,i,cn(dn(n),o)])}this.entries=Object.freeze(r)}};import ln from"express";var Le=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,ln.static(...this.params))}};import It from"express";import xn from"node:http";import bn from"node:https";var he=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new Pe(e)};var tt=class{constructor(t){this.logger=t}#e=new WeakSet;check(t,r){if(!this.#e.has(t)){if(t.getRequestType()==="json")try{bt(t.getSchema("input"),"in")}catch(o){this.logger.warn("The final input schema of the endpoint contains an unsupported JSON payload type.",Object.assign(r,{reason:o}))}for(let o of["positive","negative"])for(let{mimeTypes:n,schema:i}of t.getResponses(o))if(n.includes(R.json))try{bt(i,"out")}catch(a){this.logger.warn(`The final ${o} response schema of the endpoint contains an unsupported JSON payload type.`,Object.assign(r,{reason:a}))}this.#e.add(t)}}};var br=(e,t)=>Object.entries(e).map(([r,o])=>{if(r.includes("/"))throw new ce(`The entry '${r}' must avoid having slashes \u2014 use nesting instead.`);let n=r.trim();return[`${t||""}${n?`/${n}`:""}`,o]}),xe=({routing:e,onEndpoint:t,onStatic:r})=>{let o=br(e);for(;o.length;){let[n,i]=o.shift();if(i instanceof Ce){let a=i.getMethods()||["get"];for(let p of a)t(i,n,p)}else if(i instanceof Le)r&&i.apply(n,r);else if(i instanceof Ne)for(let[a,p,d]of i.entries){let c=p.getMethods();if(c&&!c.includes(a))throw new ce(`Endpoint assigned to ${a} method of ${n} must support ${a} method.`);t(p,n,a,d)}else o.unshift(...br(i,n))}};var zt=({app:e,getLogger:t,config:r,routing:o,parsers:n})=>{let i=new tt(t()),a=new Set;xe({routing:o,onStatic:(p,d)=>void e.use(p,d),onEndpoint:(p,d,c,m)=>{de()||i.check(p,{path:d,method:c});let l=n?.[p.getRequestType()]||[],f=async(g,O)=>{let T=t(g);if(r.cors){let z={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":[c,...m||[],"options"].join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"},L=typeof r.cors=="function"?await r.cors({request:g,endpoint:p,logger:T,defaultHeaders:z}):z;for(let H in L)O.set(H,L[H])}return p.execute({request:g,response:O,logger:T,config:r})};r.cors&&!a.has(d)&&(e.options(d,...l,f),a.add(d)),e[c](d,...l,f)}})};import wr,{isHttpError as un}from"http-errors";import{setInterval as mn}from"node:timers/promises";var Sr=e=>"_httpMessage"in e&&typeof e._httpMessage=="object"&&e._httpMessage!==null&&"headersSent"in e._httpMessage&&typeof e._httpMessage.headersSent=="boolean"&&"setHeader"in e._httpMessage&&typeof e._httpMessage.setHeader=="function",Tr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Or=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Rr=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),Ar=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var Pr=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,i=c=>void n.delete(c.destroy()),a=c=>void(Sr(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):i(c)),p=c=>void(o?c.destroy():n.add(c.once("close",()=>void n.delete(c))));for(let c of e)for(let m of["connection","secureConnection"])c.on(m,p);let d=async()=>{for(let c of e)c.on("request",Rr);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(Or(c)||Tr(c))&&a(c);for await(let c of mn(10,Date.now()))if(n.size===0||Date.now()-c>=t)break;for(let c of n)i(c);return Promise.allSettled(e.map(Ar))};return{sockets:n,shutdown:()=>o??=d()}};var zr=({errorHandler:e,getLogger:t})=>async(r,o,n,i)=>r?e.execute({error:un(r)?r:wr(400,q(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):i(),Ir=({errorHandler:e,getLogger:t})=>async(r,o)=>{let n=wr(404,`Can not ${r.method} ${r.path}`),i=t(r);try{e.execute({request:r,response:o,logger:i,error:n,input:null,output:null,options:{}})}catch(a){Qe({response:o,logger:i,error:new B(q(a),n)})}},fn=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},yn=e=>({log:e.debug.bind(e)}),Cr=async({getLogger:e,config:t})=>{let r=await he("express-fileupload"),{limitError:o,beforeUpload:n,...i}={...typeof t.upload=="object"&&t.upload},a=[];return a.push(async(p,d,c)=>{let m=e(p);try{await n?.({request:p,logger:m})}catch(l){return c(l)}return r({debug:!0,...i,abortOnLimit:!1,parseNested:!0,logger:yn(m)})(p,d,c)}),o&&a.push(fn(o)),a},Zr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},Er=({logger:e,config:t})=>async(r,o,n)=>{let i=await t.childLoggerProvider?.({request:r,parent:e})||e;i.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[x]={logger:i}),n()},vr=e=>t=>t?.res?.locals[x]?.logger||e,jr=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
3
+ `).slice(1))),Nr=({servers:e,logger:t,options:{timeout:r,events:o=["SIGINT","SIGTERM"]}})=>{let n=Pr(e,{logger:t,timeout:r}),i=()=>n.shutdown().then(()=>process.exit());for(let a of o)process.on(a,i)};import{gray as gn,hex as Lr,italic as rt,whiteBright as hn}from"ansis";var kr=e=>{if(e.columns<132)return;let t=rt("Proudly supports transgender community.".padStart(109)),r=rt("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),o=rt("Thank you for choosing Express Zod API for your project.".padStart(132)),n=rt("for Kesaria".padEnd(20)),i=Lr("#F5A9B8"),a=Lr("#5BCEFA"),p=new Array(14).fill(a,1,3).fill(i,3,5).fill(hn,5,7).fill(i,7,9).fill(a,9,12).fill(gn,12,13),d=`
4
4
  8888888888 8888888888P 888 d8888 8888888b. 8888888
5
5
  888 d88P 888 d88888 888 Y88b 888
6
6
  888 d88P 888 d88P888 888 888 888
@@ -10,13 +10,13 @@ Original error: ${e.handled.message}.`:""),{expose:Vo(e.cause)?e.cause.expose:!1
10
10
  888 .d8""8b. 888 d88P 888 Y8b. X88 X88 d88P Y88..88P Y88b 888 d8888888888 888 888
11
11
  8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P' d8888888888 "Y88P" "Y88888 d88P 888 888 8888888
12
12
  888
13
- 888${e}
14
- ${o}888${t}
15
- ${r}
16
- `.split(`
17
- `).map((d,c)=>a[c]?a[c](d):d).join(`
18
- `)};var kr=e=>{e.startupLogo!==!1&&console.log(Lr());let t=e.errorHandler||Ze,r=mr(e.logger)?e.logger:new ve(e.logger);r.debug("Running",{build:"v21.0.0-beta.5 (ESM)",env:process.env.NODE_ENV||"development"}),vr(r);let o=Zr({logger:r,config:e}),i={getLogger:Er(r),errorHandler:t},a=zr(i),p=wr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},bn=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=kr(e);return wt({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},Sn=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=kr(e),p=zt().disable("x-powered-by").use(a);if(e.compression){let y=await ge("compression");p.use(y(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||zt.json()],raw:[e.rawParser||zt.raw(),Cr],upload:e.upload?await Ir({config:e,getLogger:o}):[]};await e.beforeRouting?.({app:p,getLogger:o}),wt({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(i,n);let c=[],u=(y,x)=>()=>y.listen(x,()=>r.info("Listening",x)),l=[];if(e.http){let y=hn.createServer(p);c.push(y),l.push(u(y,e.http.listen))}if(e.https){let y=xn.createServer(e.https.options,p);c.push(y),l.push(u(y,e.https.listen))}return e.gracefulShutdown&&jr({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:l.map(y=>y())}};import{OpenApiBuilder as As}from"openapi3-ts/oas31";import{keys as Ps,pluck as ws}from"ramda";import{isReferenceObject as Zt,isSchemaObject as ot}from"openapi3-ts/oas31";import{concat as Tn,type as Ur,filter as On,fromPairs as nt,has as Rn,isNil as An,map as xe,mergeAll as Pn,mergeDeepRight as wn,mergeDeepWith as zn,objOf as Dr,omit as st,pipe as Kr,pluck as In,range as Cn,reject as Zn,toLower as En,union as vn,when as jn,xprod as It,zip as Nn}from"ramda";import{z as b}from"zod";var ne=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[h]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>ne(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var Mr=50,Fr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Ln={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Br=/:([A-Za-z0-9_]+)/g,kn=e=>e.match(Br)?.map(t=>t.slice(1))||[],qr=e=>e.replace(Br,t=>`{${t.slice(1)}}`),Mn=({_def:e},{next:t})=>({...t(e.innerType),default:e[h]?.defaultLabel||e.defaultValue()}),Hn=({_def:{innerType:e}},{next:t})=>t(e),Un=()=>({format:"any"}),Dn=({},e)=>{if(e.isResponse)throw new v("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},Kn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Fn=({options:e},{next:t})=>({oneOf:e.map(t)}),Bn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),qn=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return Tn(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},$n=e=>{let[t,r]=e.filter(ot).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));if(!t||!r)throw new Error("Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=zn(qn,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=vn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=W(t.examples||[],r.examples||[],([n,i])=>wn(n,i))),o},Gn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return $n(o)}catch{}return{allOf:o}},Vn=(e,{next:t})=>t(e.unwrap()),_n=(e,{next:t})=>t(e.unwrap()),Yn=(e,{next:t})=>{let r=t(e.unwrap());return ot(r)&&(r.type=Gr(r)),r},$r=e=>{let t=En(Ur(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Hr=e=>({type:$r(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Qn=({value:e})=>({type:$r(e),const:e}),Jn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Pe(p)?p instanceof b.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=rt(e,r)),i.length&&(a.required=i),a},Wn=()=>({type:"null"}),Xn=({},e)=>{if(e.isResponse)throw new v("Please use ez.dateOut() for output.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:Fr}}},es=({},e)=>{if(!e.isResponse)throw new v("Please use ez.dateIn() for input.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Fr}}},ts=({},e)=>{throw new v(`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)},rs=()=>({type:"boolean"}),os=()=>({type:"integer",format:"bigint"}),ns=e=>e.every(t=>t instanceof b.ZodLiteral),ss=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.ZodEnum||e instanceof b.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=rt(b.object(nt(It(o,[t]))),r),n.required=o),n}if(e instanceof b.ZodLiteral)return{type:"object",properties:rt(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&ns(e.options)){let o=xe(i=>`${i.value}`,e.options),n=nt(It(o,[t]));return{type:"object",properties:rt(b.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},is=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},as=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),ps=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:l}})=>{let y=l.find(T=>T.kind==="regex"),x=l.find(T=>T.kind==="datetime"),R=y?y.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,O={type:"string"},f={"date-time":u,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let T in f)if(f[T]){O.format=T;break}return r!==null&&(O.minLength=r),o!==null&&(O.maxLength=o),R&&(O.pattern=R.source),O},cs=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(l=>l.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(l=>l.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,u={type:e?"integer":"number",format:e?"int64":"double"};return a?u.minimum=i:u.exclusiveMinimum=i,c?u.maximum=d:u.exclusiveMaximum=d,u},rt=({shape:e},t)=>xe(t,e),ds=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Ln?.[t]},Gr=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",ls=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&ot(o)){let i=Ke(e,ds(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(b.any())}if(!t&&n.type==="preprocess"&&ot(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},ms=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),us=(e,{next:t})=>t(e.unwrap()),fs=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),ys=(e,{next:t})=>t(e.unwrap().shape.raw),Vr=e=>e.length?nt(Nn(Cn(1,e.length+1).map(t=>`example${t}`),xe(Dr("value"),e))):void 0,_r=(e,t,r=[])=>Kr($,xe(jn(o=>Ur(o)==="Object",st(r))),Vr)({schema:e,variant:t?"parsed":"original",validate:!0}),gs=(e,t)=>Kr($,On(Rn(t)),In(t),Vr)({schema:e,variant:"original",validate:!0}),se=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?se(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>se(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?se(e._def.schema):e instanceof b.ZodPipeline?se(e._def.in):se(e._def.left).merge(se(e._def.right)),Yr=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=se(r),c=kn(e),u=o.includes("query"),l=o.includes("params"),y=o.includes("headers"),x=f=>l&&c.includes(f),R=f=>y&&yt(f);return Object.keys(d).map(f=>({name:f,location:x(f)?"path":R(f)?"header":u?"query":void 0})).filter(f=>f.location!==void 0).map(({name:f,location:T})=>{let w=ne(d[f],{rules:{...a,...Et},onEach:vt,onMissing:jt,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),I=i==="components"?n(d[f],w,j(p,f)):w;return{name:f,in:T,required:!d[f].isOptional(),description:w.description||p,schema:I,examples:gs(r,f)}})},Et={ZodString:ps,ZodNumber:cs,ZodBigInt:os,ZodBoolean:rs,ZodNull:Wn,ZodArray:is,ZodTuple:as,ZodRecord:ss,ZodObject:Jn,ZodLiteral:Qn,ZodIntersection:Gn,ZodUnion:Fn,ZodAny:Un,ZodDefault:Mn,ZodEnum:Hr,ZodNativeEnum:Hr,ZodEffects:ls,ZodOptional:Vn,ZodNullable:Yn,ZodDiscriminatedUnion:Bn,ZodBranded:us,ZodDate:ts,ZodCatch:Hn,ZodPipeline:ms,ZodLazy:fs,ZodReadonly:_n,[k]:Kn,[le]:Dn,[te]:es,[ee]:Xn,[G]:ys},vt=(e,{isResponse:t,prev:r})=>{if(Zt(r))return{};let{description:o}=e,n=e instanceof b.ZodLazy,i=r.type!==void 0,a=t&&Pe(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=Gr(r)),!n){let c=$({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},jt=(e,t)=>{throw new v(`Zod type ${e.constructor.name} is unsupported.`,t)},Ct=(e,t)=>{if(Zt(e))return e;let r={...e};return r.properties&&(r.properties=st(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>st(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Ct(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Ct(o,t))),r},Qr=e=>Zt(e)?e:st(["examples"],e),Jr=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:u=`${e.toUpperCase()} ${t} ${gt(n)} response ${p?d:""}`.trim()})=>{let l=Qr(ne(r,{rules:{...c,...Et},onEach:vt,onMissing:jt,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),y={schema:a==="components"?i(r,l,j(u)):l,examples:_r(r,!0)};return{description:u,content:nt(It(o,[y]))}},hs=()=>({type:"http",scheme:"basic"}),xs=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},bs=({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},Ss=({name:e})=>({type:"apiKey",in:"header",name:e}),Ts=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Os=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Rs=({flows:e={}})=>({type:"oauth2",flows:xe(t=>({...t,scopes:t.scopes||{}}),Zn(An,e))}),Wr=(e,t)=>{let r={basic:hs,bearer:xs,input:bs,header:Ss,cookie:Ts,openid:Os,oauth2:Rs};return Je(e,o=>r[o.type](o,t))},it=e=>"or"in e?e.or.map(t=>"and"in t?Pn(xe(({name:r,scopes:o})=>Dr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?it(Ot(e)):it({or:[e]}),Xr=({method:e,path:t,schema:r,mimeType:o,makeRef:n,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=Qr(Ct(ne(r,{rules:{...a,...Et},onEach:vt,onMissing:jt,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),u={schema:i==="components"?n(r,c,j(d)):c,examples:_r(r,!1,p)};return{description:d,content:{[o]:u}}},eo=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Nt=e=>e.length<=Mr?e:e.slice(0,Mr-1)+"\u2026";var Lt=class extends As{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=Ps(oe);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||j(r,t),i=this.lastOperationIdSuffixes.get(n);if(i===void 0)return this.lastOperationIdSuffixes.set(n,1),n;if(o)throw new v(`Duplicated operationId: "${o}"`,{method:r,isResponse:!1,path:t});return i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:n});for(let l of typeof i=="string"?[i]:i)this.addServer({url:l});he({routing:t,onEndpoint:(l,y,x)=>{let R={path:y,method:x,endpoint:l,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[O,f]=["short","long"].map(l.getDescription.bind(l)),T=O?Nt(O):d&&f?Nt(f):void 0,w=l.getTags(),I=r.inputSources?.[x]||ut[x],H=this.ensureUniqOperationId(y,x,l.getOperationId(x)),be=Yr({...R,inputSources:I,schema:l.getSchema("input"),description:a?.requestParameter?.call(null,{method:x,path:y,operationId:H})}),Me={};for(let U of this.responseVariants){let Y=l.getResponses(U);for(let{mimeTypes:Se,schema:C,statusCodes:z}of Y)for(let Z of z)Me[Z]=Jr({...R,variant:U,schema:C,mimeTypes:Se,statusCode:Z,hasMultipleStatusCodes:Y.length>1||z.length>1,description:a?.[`${U}Response`]?.call(null,{method:x,path:y,operationId:H,statusCode:Z})})}let lt=I.includes("body")?Xr({...R,paramNames:ws("name",be),schema:l.getSchema("input"),mimeType:A[l.getRequestType()],description:a?.requestBody?.call(null,{method:x,path:y,operationId:H})}):void 0,He=it(Je(Wr(l.getSecurity(),I),U=>{let Y=this.ensureUniqSecuritySchemaName(U),Se=["oauth2","openIdConnect"].includes(U.type)?l.getScopes().slice():[];return this.addSecurityScheme(Y,U),{name:Y,scopes:Se}}));this.addPath(qr(y),{[x]:{operationId:H,summary:T,description:f,tags:w.length>0?w:void 0,parameters:be.length>0?be:void 0,requestBody:lt,security:He.length>0?He:void 0,responses:Me}})}}),this.rootDoc.tags=r.tags?eo(r.tags):[]}};import{createRequest as zs,createResponse as Is}from"node-mocks-http";var Cs=e=>zs({...e,headers:{"content-type":A.json,...e?.headers}}),Zs=e=>Is(e),Es=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:ur(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},to=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=Cs(e),i=Zs({req:n,...t});i.req=t?.req||n,n.res=i;let a=Es(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},vs=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=to(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},js=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:p}=to(o),d=De(n,p.inputSources);try{let c=await e.execute({request:n,response:i,logger:a,input:d,options:t});return{requestMock:n,responseMock:i,loggerMock:a,output:c}}catch(c){if(!r)throw c;return r(q(c),i),{requestMock:n,responseMock:i,loggerMock:a,output:{}}}};import L from"typescript";import N from"typescript";import{chain as ro}from"ramda";var s=N.factory,_=[s.createModifier(N.SyntaxKind.ExportKeyword)],Ns=[s.createModifier(N.SyntaxKind.AsyncKeyword)],Ls=[s.createModifier(N.SyntaxKind.PublicKeyword),s.createModifier(N.SyntaxKind.ReadonlyKeyword)],oo=[s.createModifier(N.SyntaxKind.ProtectedKeyword),s.createModifier(N.SyntaxKind.ReadonlyKeyword)],ks=s.createTemplateHead(""),Ms=s.createTemplateMiddle(" "),Le=s.createTemplateTail(""),kt=e=>s.createTemplateLiteralType(ks,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?Le:Ms))),Mt=kt(["M","P"]),at=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),pt=(e,t)=>ro(([r,o])=>[at(s.createIdentifier(r),o,t)],Object.entries(e)),Ht=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),no=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),so=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),F=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],N.NodeFlags.Const),Ut=(e,t)=>s.createTypeAliasDeclaration(_,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),ct=(e,t)=>s.createTypeAliasDeclaration(_,e,void 0,t),io=(e,t,r)=>s.createPropertyDeclaration(Ls,e,void 0,t,r),ao=(e,t,r)=>s.createClassDeclaration(_,e,void 0,void 0,[t,...r]),po=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),co=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(N.SyntaxKind.AnyKeyword)]),lo=(e,t,r)=>s.createInterfaceDeclaration(_,e,void 0,t,r),Hs=ro(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),mo=e=>Hs(Object.entries(e)),Dt=(e,t,r)=>s.createArrowFunction(r?Ns:void 0,void 0,e.map(o=>at(o)),void 0,void 0,t),Kt=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,pt({acc:void 0,key:void 0}),void 0,void 0,t),r]),uo=(...e)=>`"${e.join(" ")}"`,fo=(e,t,r)=>s.createConditionalExpression(e,s.createToken(N.SyntaxKind.QuestionToken),t,s.createToken(N.SyntaxKind.ColonToken),r);var yo=["get","post","put","delete","patch"];import g from"typescript";import{z as qt}from"zod";import S from"typescript";var{factory:dt}=S,Ft=(e,t)=>S.addSyntheticLeadingComment(e,S.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),ie=(e,t,r)=>{let o=dt.createTypeAliasDeclaration(void 0,dt.createIdentifier(t),void 0,e);return r?Ft(o,r):o},Bt=(e,t)=>{let r=S.createSourceFile("print.ts","",S.ScriptTarget.Latest,!1,S.ScriptKind.TS);return S.createPrinter(t).printNode(S.EmitHint.Unspecified,e,r)},Us=/^[A-Za-z_$][A-Za-z0-9_$]*$/,go=e=>Us.test(e)?dt.createIdentifier(e):dt.createStringLiteral(e),Ds=[S.SyntaxKind.AnyKeyword,S.SyntaxKind.BigIntKeyword,S.SyntaxKind.BooleanKeyword,S.SyntaxKind.NeverKeyword,S.SyntaxKind.NumberKeyword,S.SyntaxKind.ObjectKeyword,S.SyntaxKind.StringKeyword,S.SyntaxKind.SymbolKeyword,S.SyntaxKind.UndefinedKeyword,S.SyntaxKind.UnknownKeyword,S.SyntaxKind.VoidKeyword],ho=e=>Ds.includes(e.kind);var{factory:m}=g,Ks={[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},Fs=({value:e})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),Bs=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&Pe(a)?a instanceof qt.ZodOptional:a.isOptional(),d=m.createPropertySignature(void 0,go(i),p&&o?m.createToken(g.SyntaxKind.QuestionToken):void 0,r(a));return a.description?Ft(d,a.description):d});return m.createTypeLiteralNode(n)},qs=({element:e},{next:t})=>m.createArrayTypeNode(t(e)),$s=({options:e})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),xo=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(ho(n)?n.kind:n,n)}return m.createUnionTypeNode(Array.from(r.values()))},Gs=e=>Ks?.[e.kind],Vs=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Ke(e,Gs(o)),i={number:g.SyntaxKind.NumberKeyword,bigint:g.SyntaxKind.BigIntKeyword,boolean:g.SyntaxKind.BooleanKeyword,string:g.SyntaxKind.StringKeyword,undefined:g.SyntaxKind.UndefinedKeyword,object:g.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(n&&i[n]||g.SyntaxKind.AnyKeyword)}return o},_s=e=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),Ys=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(g.SyntaxKind.UndefinedKeyword)]):o},Qs=(e,{next:t})=>m.createUnionTypeNode([t(e.unwrap()),m.createLiteralTypeNode(m.createNull())]),Js=({items:e,_def:{rest:t}},{next:r})=>m.createTupleTypeNode(e.map(r).concat(t===null?[]:m.createRestTypeNode(r(t)))),Ws=({keySchema:e,valueSchema:t},{next:r})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e,t].map(r)),Xs=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(g.isTypeLiteralNode)?m.createTypeLiteralNode(o.flatMap(({members:i})=>i)):m.createIntersectionTypeNode(o)},ei=({_def:e},{next:t})=>t(e.innerType),ae=e=>()=>m.createKeywordTypeNode(e),ti=(e,{next:t})=>t(e.unwrap()),ri=(e,{next:t})=>t(e.unwrap()),oi=({_def:e},{next:t})=>t(e.innerType),ni=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),si=()=>m.createLiteralTypeNode(m.createNull()),ii=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),ai=e=>{let t=e.unwrap(),r=m.createKeywordTypeNode(g.SyntaxKind.StringKeyword),o=m.createTypeReferenceNode("Buffer"),n=m.createUnionTypeNode([r,o]);return t instanceof qt.ZodString?r:t instanceof qt.ZodUnion?n:o},pi=(e,{next:t})=>t(e.unwrap().shape.raw),ci={ZodString:ae(g.SyntaxKind.StringKeyword),ZodNumber:ae(g.SyntaxKind.NumberKeyword),ZodBigInt:ae(g.SyntaxKind.BigIntKeyword),ZodBoolean:ae(g.SyntaxKind.BooleanKeyword),ZodAny:ae(g.SyntaxKind.AnyKeyword),[ee]:ae(g.SyntaxKind.StringKeyword),[te]:ae(g.SyntaxKind.StringKeyword),ZodNull:si,ZodArray:qs,ZodTuple:Js,ZodRecord:Ws,ZodObject:Bs,ZodLiteral:Fs,ZodIntersection:Xs,ZodUnion:xo,ZodDefault:ei,ZodEnum:$s,ZodNativeEnum:_s,ZodEffects:Vs,ZodOptional:Ys,ZodNullable:Qs,ZodDiscriminatedUnion:xo,ZodBranded:ti,ZodCatch:oi,ZodPipeline:ni,ZodLazy:ii,ZodReadonly:ri,[k]:ai,[G]:pi},ke=(e,{brandHandling:t,ctx:r})=>ne(e,{rules:{...t,...ci},onMissing:()=>m.createKeywordTypeNode(g.SyntaxKind.AnyKeyword),ctx:r});var $t=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client"),isJsonConst:s.createIdentifier("isJSON")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let n=s.createLiteralTypeNode(s.createNull());this.aliases.set(t,ie(n,o)),this.aliases.set(t,ie(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0}}){he({routing:t,onEndpoint:(C,z,Z)=>{let pe={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},Te=j(Z,z,"input"),Oe=ke(C.getSchema("input"),{brandHandling:r,ctx:{...pe,isResponse:!1}}),E=n?j(Z,z,"positive.response"):void 0,Gt=C.getResponses("positive").map(({schema:D})=>D).reduce((D,mt)=>D.or(mt)),Vt=n?ke(Gt,{brandHandling:r,ctx:{...pe,isResponse:!0}}):void 0,Re=n?j(Z,z,"negative.response"):void 0,_t=C.getResponses("negative").map(({schema:D})=>D).reduce((D,mt)=>D.or(mt)),Yt=n?ke(_t,{brandHandling:r,ctx:{...pe,isResponse:!0}}):void 0,Qt=j(Z,z,"response"),bo=E&&Re?s.createUnionTypeNode([s.createTypeReferenceNode(E),s.createTypeReferenceNode(Re)]):ke(Gt.or(_t),{brandHandling:r,ctx:{...pe,isResponse:!0}});this.program.push(ie(Oe,Te)),Vt&&E&&this.program.push(ie(Vt,E)),Yt&&Re&&this.program.push(ie(Yt,Re)),this.program.push(ie(bo,Qt)),this.paths.push(z),this.registry.set({method:Z,path:z},{input:Te,positive:E,negative:Re,response:Qt,isJson:C.getResponses("positive").some(D=>D.mimeTypes.includes(A.json)),tags:C.getTags()})}}),this.program.unshift(...this.aliases.values()),this.program.push(Ut(this.ids.pathType,this.paths)),this.program.push(Ut(this.ids.methodType,yo)),this.program.push(ct(this.ids.methodPathType,kt([this.ids.methodType,this.ids.pathType])));let a=[s.createHeritageClause(L.SyntaxKind.ExtendsKeyword,[Ht(this.ids.methodPathType,L.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),n&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let p=[],d=[];for(let[{method:C,path:z},{isJson:Z,tags:pe,...Te}]of this.registry){let Oe=uo(C,z);for(let E of this.interfaces)E.kind in Te&&E.props.push(so(Oe,Te[E.kind]));o!=="types"&&(Z&&p.push(s.createPropertyAssignment(Oe,s.createTrue())),d.push(s.createPropertyAssignment(Oe,s.createArrayLiteralExpression(pe.map(E=>s.createStringLiteral(E))))))}for(let{id:C,props:z}of this.interfaces)this.program.push(lo(C,a,z));if(o==="types")return;let c=s.createVariableStatement(_,F(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(p))),u=s.createVariableStatement(_,F(this.ids.endpointTagsConst,s.createObjectLiteralExpression(d))),l=ct(this.ids.providerType,s.createFunctionTypeNode(mo({M:this.ids.methodType,P:this.ids.pathType}),pt({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Mt)}),po(this.ids.responseInterface,Mt))),y=ct(this.ids.implementationType,s.createFunctionTypeNode(void 0,pt({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(L.SyntaxKind.StringKeyword),params:Ht(L.SyntaxKind.StringKeyword,L.SyntaxKind.AnyKeyword)}),co())),x=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,Le)]),R=Kt(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[x,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),O=Kt(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[x]),L.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),f=ao(this.ids.clientClass,no([at(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),oo)]),[io(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),Dt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,R,O]),!0))]);this.program.push(c,u,l,y,f);let T=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),w=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(A.json))]),void 0,this.ids.undefinedValue)),I=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),H=s.createVariableStatement(void 0,F(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,Le)]),s.createObjectLiteralExpression([T,w,I])])))),be=s.createVariableStatement(void 0,F(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),Me=s.createVariableStatement(void 0,F(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),Le)])))),lt=s.createVariableStatement(void 0,F(this.ids.isJsonConst,s.createCallChain(s.createPropertyAccessChain(s.createCallExpression(s.createPropertyAccessExpression(s.createPropertyAccessExpression(this.ids.responseConst,this.ids.headersProperty),s.createIdentifier("get")),void 0,[s.createStringLiteral("content-type")]),s.createToken(L.SyntaxKind.QuestionDotToken),s.createIdentifier("startsWith")),void 0,void 0,[s.createStringLiteral(A.json)]))),He=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,fo(this.ids.isJsonConst,s.createStringLiteral("json"),s.createStringLiteral("text"))),void 0,[])),U=s.createVariableStatement(_,F(this.ids.exampleImplementationConst,Dt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([be,Me,H,lt,He]),!0),s.createTypeReferenceNode(this.ids.implementationType))),Y=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),Se=s.createVariableStatement(void 0,F(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(U,Se,Y)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Bt(r,t)).join(`
19
- `):void 0}print(t){let r=this.printUsage(t),o=r&&L.addSyntheticLeadingComment(L.addSyntheticLeadingComment(s.createEmptyStatement(),L.SyntaxKind.SingleLineCommentTrivia," Usage example:"),L.SyntaxKind.MultiLineCommentTrivia,`
20
- ${r}`);return this.program.concat(o||[]).map((n,i)=>Bt(n,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
13
+ 888${t}
14
+ ${n}888${r}
15
+ ${o}
16
+ `;e.write(d.split(`
17
+ `).map((c,m)=>p[m]?p[m](c):c).join(`
18
+ `))};var Mr=e=>{e.startupLogo!==!1&&kr(process.stdout);let t=e.errorHandler||Ee,r=ur(e.logger)?e.logger:new je(e.logger);r.debug("Running",{build:"v21.0.0 (ESM)",env:process.env.NODE_ENV||"development"}),jr(r);let o=Er({logger:r,config:e}),i={getLogger:vr(r),errorHandler:t},a=Ir(i),p=zr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},Sn=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=Mr(e);return zt({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},Tn=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=Mr(e),p=It().disable("x-powered-by").use(a);if(e.compression){let f=await he("compression");p.use(f(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||It.json()],raw:[e.rawParser||It.raw(),Zr],upload:e.upload?await Cr({config:e,getLogger:o}):[]};await e.beforeRouting?.({app:p,getLogger:o}),zt({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(i,n);let c=[],m=(f,g)=>()=>f.listen(g,()=>r.info("Listening",g)),l=[];if(e.http){let f=xn.createServer(p);c.push(f),l.push(m(f,e.http.listen))}if(e.https){let f=bn.createServer(e.https.options,p);c.push(f),l.push(m(f,e.https.listen))}return e.gracefulShutdown&&Nr({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:l.map(f=>f())}};import{OpenApiBuilder as Ps}from"openapi3-ts/oas31";import{keys as ws,pluck as zs}from"ramda";import{isReferenceObject as Et,isSchemaObject as nt}from"openapi3-ts/oas31";import{concat as On,type as Dr,filter as Rn,fromPairs as st,has as An,isNil as Pn,map as be,mergeAll as wn,mergeDeepRight as zn,mergeDeepWith as In,objOf as Kr,omit as it,pipe as Fr,pluck as Cn,range as Zn,reject as En,toLower as vn,union as jn,when as Nn,xprod as Ct,zip as Ln}from"ramda";import{z as b}from"zod";var ne=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[x]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>ne(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var Hr=50,Br="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",kn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},qr=/:([A-Za-z0-9_]+)/g,Mn=e=>e.match(qr)?.map(t=>t.slice(1))||[],$r=e=>e.replace(qr,t=>`{${t.slice(1)}}`),Hn=({_def:e},{next:t})=>({...t(e.innerType),default:e[x]?.defaultLabel||e.defaultValue()}),Un=({_def:{innerType:e}},{next:t})=>t(e),Dn=()=>({format:"any"}),Kn=({},e)=>{if(e.isResponse)throw new E("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},Fn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Bn=({options:e},{next:t})=>({oneOf:e.map(t)}),qn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),$n=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return On(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},Gn=e=>{let[t,r]=e.filter(nt).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));if(!t||!r)throw new Error("Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=In($n,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=jn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=W(t.examples||[],r.examples||[],([n,i])=>zn(n,i))),o},Vn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Gn(o)}catch{}return{allOf:o}},_n=(e,{next:t})=>t(e.unwrap()),Yn=(e,{next:t})=>t(e.unwrap()),Qn=(e,{next:t})=>{let r=t(e.unwrap());return nt(r)&&(r.type=Vr(r)),r},Gr=e=>{let t=vn(Dr(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Ur=e=>({type:Gr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Jn=({value:e})=>({type:Gr(e),const:e}),Wn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&we(p)?p instanceof b.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=ot(e,r)),i.length&&(a.required=i),a},Xn=()=>({type:"null"}),es=({},e)=>{if(e.isResponse)throw new E("Please use ez.dateOut() for output.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:Br}}},ts=({},e)=>{if(!e.isResponse)throw new E("Please use ez.dateIn() for input.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Br}}},rs=({},e)=>{throw new E(`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)},os=()=>({type:"boolean"}),ns=()=>({type:"integer",format:"bigint"}),ss=e=>e.every(t=>t instanceof b.ZodLiteral),is=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.ZodEnum||e instanceof b.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=ot(b.object(st(Ct(o,[t]))),r),n.required=o),n}if(e instanceof b.ZodLiteral)return{type:"object",properties:ot(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&ss(e.options)){let o=be(i=>`${i.value}`,e.options),n=st(Ct(o,[t]));return{type:"object",properties:ot(b.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},as=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},ps=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),cs=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:m,_def:{checks:l}})=>{let f=l.find(P=>P.kind==="regex"),g=l.find(P=>P.kind==="datetime"),O=f?f.regex:g?g.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"},h={"date-time":m,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let P in h)if(h[P]){T.format=P;break}return r!==null&&(T.minLength=r),o!==null&&(T.maxLength=o),O&&(T.pattern=O.source),T},ds=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(l=>l.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(l=>l.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=i:m.exclusiveMinimum=i,c?m.maximum=d:m.exclusiveMaximum=d,m},ot=({shape:e},t)=>be(t,e),ls=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return kn?.[t]},Vr=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",ms=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&nt(o)){let i=Fe(e,ls(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(b.any())}if(!t&&n.type==="preprocess"&&nt(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},us=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),fs=(e,{next:t})=>t(e.unwrap()),ys=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),gs=(e,{next:t})=>t(e.unwrap().shape.raw),_r=e=>e.length?st(Ln(Zn(1,e.length+1).map(t=>`example${t}`),be(Kr("value"),e))):void 0,Yr=(e,t,r=[])=>Fr($,be(Nn(o=>Dr(o)==="Object",it(r))),_r)({schema:e,variant:t?"parsed":"original",validate:!0}),hs=(e,t)=>Fr($,Rn(An(t)),Cn(t),_r)({schema:e,variant:"original",validate:!0}),se=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?se(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>se(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?se(e._def.schema):e instanceof b.ZodPipeline?se(e._def.in):se(e._def.left).merge(se(e._def.right)),Qr=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=se(r),c=Mn(e),m=o.includes("query"),l=o.includes("params"),f=o.includes("headers"),g=h=>l&&c.includes(h),O=h=>f&&gt(h);return Object.keys(d).map(h=>({name:h,location:g(h)?"path":O(h)?"header":m?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:P})=>{let z=ne(d[h],{rules:{...a,...vt},onEach:jt,onMissing:Nt,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),L=i==="components"?n(d[h],z,v(p,h)):z;return{name:h,in:P,required:!d[h].isOptional(),description:z.description||p,schema:L,examples:hs(r,h)}})},vt={ZodString:cs,ZodNumber:ds,ZodBigInt:ns,ZodBoolean:os,ZodNull:Xn,ZodArray:as,ZodTuple:ps,ZodRecord:is,ZodObject:Wn,ZodLiteral:Jn,ZodIntersection:Vn,ZodUnion:Bn,ZodAny:Dn,ZodDefault:Hn,ZodEnum:Ur,ZodNativeEnum:Ur,ZodEffects:ms,ZodOptional:_n,ZodNullable:Qn,ZodDiscriminatedUnion:qn,ZodBranded:fs,ZodDate:rs,ZodCatch:Un,ZodPipeline:us,ZodLazy:ys,ZodReadonly:Yn,[k]:Fn,[me]:Kn,[te]:ts,[ee]:es,[G]:gs},jt=(e,{isResponse:t,prev:r})=>{if(Et(r))return{};let{description:o}=e,n=e instanceof b.ZodLazy,i=r.type!==void 0,a=t&&we(e),p=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=Vr(r)),!n){let c=$({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},Nt=(e,t)=>{throw new E(`Zod type ${e.constructor.name} is unsupported.`,t)},Zt=(e,t)=>{if(Et(e))return e;let r={...e};return r.properties&&(r.properties=it(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>it(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Zt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Zt(o,t))),r},Jr=e=>Et(e)?e:it(["examples"],e),Wr=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:m=`${e.toUpperCase()} ${t} ${ht(n)} response ${p?d:""}`.trim()})=>{let l=Jr(ne(r,{rules:{...c,...vt},onEach:jt,onMissing:Nt,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),f={schema:a==="components"?i(r,l,v(m)):l,examples:Yr(r,!0)};return{description:m,content:st(Ct(o,[f]))}},xs=()=>({type:"http",scheme:"basic"}),bs=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Ss=({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},Ts=({name:e})=>({type:"apiKey",in:"header",name:e}),Os=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Rs=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),As=({flows:e={}})=>({type:"oauth2",flows:be(t=>({...t,scopes:t.scopes||{}}),En(Pn,e))}),Xr=(e,t)=>{let r={basic:xs,bearer:bs,input:Ss,header:Ts,cookie:Os,openid:Rs,oauth2:As};return Je(e,o=>r[o.type](o,t))},at=e=>"or"in e?e.or.map(t=>"and"in t?wn(be(({name:r,scopes:o})=>Kr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?at(Rt(e)):at({or:[e]}),eo=({method:e,path:t,schema:r,mimeType:o,makeRef:n,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=Jr(Zt(ne(r,{rules:{...a,...vt},onEach:jt,onMissing:Nt,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),m={schema:i==="components"?n(r,c,v(d)):c,examples:Yr(r,!1,p)};return{description:d,content:{[o]:m}}},to=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Lt=e=>e.length<=Hr?e:e.slice(0,Hr-1)+"\u2026";var kt=class extends Ps{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=ws(oe);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||v(r,t),i=this.lastOperationIdSuffixes.get(n);if(i===void 0)return this.lastOperationIdSuffixes.set(n,1),n;if(o)throw new E(`Duplicated operationId: "${o}"`,{method:r,isResponse:!1,path:t});return i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:n});for(let l of typeof i=="string"?[i]:i)this.addServer({url:l});xe({routing:t,onEndpoint:(l,f,g)=>{let O={path:f,method:g,endpoint:l,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[T,h]=["short","long"].map(l.getDescription.bind(l)),P=T?Lt(T):d&&h?Lt(h):void 0,z=l.getTags(),L=r.inputSources?.[g]||ft[g],H=this.ensureUniqOperationId(f,g,l.getOperationId(g)),Se=Qr({...O,inputSources:L,schema:l.getSchema("input"),description:a?.requestParameter?.call(null,{method:g,path:f,operationId:H})}),He={};for(let U of this.responseVariants){let Y=l.getResponses(U);for(let{mimeTypes:Te,schema:I,statusCodes:w}of Y)for(let C of w)He[C]=Wr({...O,variant:U,schema:I,mimeTypes:Te,statusCode:C,hasMultipleStatusCodes:Y.length>1||w.length>1,description:a?.[`${U}Response`]?.call(null,{method:g,path:f,operationId:H,statusCode:C})})}let mt=L.includes("body")?eo({...O,paramNames:zs("name",Se),schema:l.getSchema("input"),mimeType:R[l.getRequestType()],description:a?.requestBody?.call(null,{method:g,path:f,operationId:H})}):void 0,Ue=at(Je(Xr(l.getSecurity(),L),U=>{let Y=this.ensureUniqSecuritySchemaName(U),Te=["oauth2","openIdConnect"].includes(U.type)?l.getScopes().slice():[];return this.addSecurityScheme(Y,U),{name:Y,scopes:Te}}));this.addPath($r(f),{[g]:{operationId:H,summary:P,description:h,tags:z.length>0?z:void 0,parameters:Se.length>0?Se:void 0,requestBody:mt,security:Ue.length>0?Ue:void 0,responses:He}})}}),this.rootDoc.tags=r.tags?to(r.tags):[]}};import{createRequest as Is,createResponse as Cs}from"node-mocks-http";var Zs=e=>Is({...e,headers:{"content-type":R.json,...e?.headers}}),Es=e=>Cs(e),vs=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:fr(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},ro=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=Zs(e),i=Es({req:n,...t});i.req=t?.req||n,n.res=i;let a=vs(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},js=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=ro(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},Ns=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:p}=ro(o),d=Ke(n,p.inputSources);try{let c=await e.execute({request:n,response:i,logger:a,input:d,options:t});return{requestMock:n,responseMock:i,loggerMock:a,output:c}}catch(c){if(!r)throw c;return r(q(c),i),{requestMock:n,responseMock:i,loggerMock:a,output:{}}}};import N from"typescript";import j from"typescript";import{chain as oo}from"ramda";var s=j.factory,_=[s.createModifier(j.SyntaxKind.ExportKeyword)],Ls=[s.createModifier(j.SyntaxKind.AsyncKeyword)],ks=[s.createModifier(j.SyntaxKind.PublicKeyword),s.createModifier(j.SyntaxKind.ReadonlyKeyword)],no=[s.createModifier(j.SyntaxKind.ProtectedKeyword),s.createModifier(j.SyntaxKind.ReadonlyKeyword)],Ms=s.createTemplateHead(""),Hs=s.createTemplateMiddle(" "),ke=s.createTemplateTail(""),Mt=e=>s.createTemplateLiteralType(Ms,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?ke:Hs))),Ht=Mt(["M","P"]),pt=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),ct=(e,t)=>oo(([r,o])=>[pt(s.createIdentifier(r),o,t)],Object.entries(e)),Ut=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),so=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),io=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),F=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],j.NodeFlags.Const),Dt=(e,t)=>s.createTypeAliasDeclaration(_,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),dt=(e,t)=>s.createTypeAliasDeclaration(_,e,void 0,t),ao=(e,t,r)=>s.createPropertyDeclaration(ks,e,void 0,t,r),po=(e,t,r)=>s.createClassDeclaration(_,e,void 0,void 0,[t,...r]),co=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),lo=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(j.SyntaxKind.AnyKeyword)]),mo=(e,t,r)=>s.createInterfaceDeclaration(_,e,void 0,t,r),Us=oo(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),uo=e=>Us(Object.entries(e)),Kt=(e,t,r)=>s.createArrowFunction(r?Ls:void 0,void 0,e.map(o=>pt(o)),void 0,void 0,t),Ft=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,ct({acc:void 0,key:void 0}),void 0,void 0,t),r]),fo=(...e)=>`"${e.join(" ")}"`,yo=(e,t,r)=>s.createConditionalExpression(e,s.createToken(j.SyntaxKind.QuestionToken),t,s.createToken(j.SyntaxKind.ColonToken),r);var go=["get","post","put","delete","patch"];import y from"typescript";import{z as $t}from"zod";import S from"typescript";var{factory:lt}=S,Bt=(e,t)=>S.addSyntheticLeadingComment(e,S.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),ie=(e,t,r)=>{let o=lt.createTypeAliasDeclaration(void 0,lt.createIdentifier(t),void 0,e);return r?Bt(o,r):o},qt=(e,t)=>{let r=S.createSourceFile("print.ts","",S.ScriptTarget.Latest,!1,S.ScriptKind.TS);return S.createPrinter(t).printNode(S.EmitHint.Unspecified,e,r)},Ds=/^[A-Za-z_$][A-Za-z0-9_$]*$/,ho=e=>Ds.test(e)?lt.createIdentifier(e):lt.createStringLiteral(e),Ks=[S.SyntaxKind.AnyKeyword,S.SyntaxKind.BigIntKeyword,S.SyntaxKind.BooleanKeyword,S.SyntaxKind.NeverKeyword,S.SyntaxKind.NumberKeyword,S.SyntaxKind.ObjectKeyword,S.SyntaxKind.StringKeyword,S.SyntaxKind.SymbolKeyword,S.SyntaxKind.UndefinedKeyword,S.SyntaxKind.UnknownKeyword,S.SyntaxKind.VoidKeyword],xo=e=>Ks.includes(e.kind);var{factory:u}=y,Fs={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},Bs=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),qs=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&we(a)?a instanceof $t.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,ho(i),p&&o?u.createToken(y.SyntaxKind.QuestionToken):void 0,r(a));return a.description?Bt(d,a.description):d});return u.createTypeLiteralNode(n)},$s=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),Gs=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),bo=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(xo(n)?n.kind:n,n)}return u.createUnionTypeNode(Array.from(r.values()))},Vs=e=>Fs?.[e.kind],_s=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Fe(e,Vs(o)),i={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(n&&i[n]||y.SyntaxKind.AnyKeyword)}return o},Ys=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),Qs=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},Js=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),Ws=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),Xs=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),ei=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(y.isTypeLiteralNode)?u.createTypeLiteralNode(o.flatMap(({members:i})=>i)):u.createIntersectionTypeNode(o)},ti=({_def:e},{next:t})=>t(e.innerType),ae=e=>()=>u.createKeywordTypeNode(e),ri=(e,{next:t})=>t(e.unwrap()),oi=(e,{next:t})=>t(e.unwrap()),ni=({_def:e},{next:t})=>t(e.innerType),si=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ii=()=>u.createLiteralTypeNode(u.createNull()),ai=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),pi=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(y.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),n=u.createUnionTypeNode([r,o]);return t instanceof $t.ZodString?r:t instanceof $t.ZodUnion?n:o},ci=(e,{next:t})=>t(e.unwrap().shape.raw),di={ZodString:ae(y.SyntaxKind.StringKeyword),ZodNumber:ae(y.SyntaxKind.NumberKeyword),ZodBigInt:ae(y.SyntaxKind.BigIntKeyword),ZodBoolean:ae(y.SyntaxKind.BooleanKeyword),ZodAny:ae(y.SyntaxKind.AnyKeyword),[ee]:ae(y.SyntaxKind.StringKeyword),[te]:ae(y.SyntaxKind.StringKeyword),ZodNull:ii,ZodArray:$s,ZodTuple:Ws,ZodRecord:Xs,ZodObject:qs,ZodLiteral:Bs,ZodIntersection:ei,ZodUnion:bo,ZodDefault:ti,ZodEnum:Gs,ZodNativeEnum:Ys,ZodEffects:_s,ZodOptional:Qs,ZodNullable:Js,ZodDiscriminatedUnion:bo,ZodBranded:ri,ZodCatch:ni,ZodPipeline:si,ZodLazy:ai,ZodReadonly:oi,[k]:pi,[G]:ci},Me=(e,{brandHandling:t,ctx:r})=>ne(e,{rules:{...t,...di},onMissing:()=>u.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),ctx:r});var Gt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client"),isJsonConst:s.createIdentifier("isJSON")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let n=s.createLiteralTypeNode(s.createNull());this.aliases.set(t,ie(n,o)),this.aliases.set(t,ie(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",splitResponse:n=!1,optionalPropStyle:i={withQuestionMark:!0,withUndefined:!0}}){xe({routing:t,onEndpoint:(I,w,C)=>{let pe={makeAlias:this.makeAlias.bind(this),optionalPropStyle:i},Oe=v(C,w,"input"),Re=Me(I.getSchema("input"),{brandHandling:r,ctx:{...pe,isResponse:!1}}),Z=n?v(C,w,"positive.response"):void 0,Vt=I.getResponses("positive").map(({schema:D})=>D).reduce((D,ut)=>D.or(ut)),_t=n?Me(Vt,{brandHandling:r,ctx:{...pe,isResponse:!0}}):void 0,Ae=n?v(C,w,"negative.response"):void 0,Yt=I.getResponses("negative").map(({schema:D})=>D).reduce((D,ut)=>D.or(ut)),Qt=n?Me(Yt,{brandHandling:r,ctx:{...pe,isResponse:!0}}):void 0,Jt=v(C,w,"response"),So=Z&&Ae?s.createUnionTypeNode([s.createTypeReferenceNode(Z),s.createTypeReferenceNode(Ae)]):Me(Vt.or(Yt),{brandHandling:r,ctx:{...pe,isResponse:!0}});this.program.push(ie(Re,Oe)),_t&&Z&&this.program.push(ie(_t,Z)),Qt&&Ae&&this.program.push(ie(Qt,Ae)),this.program.push(ie(So,Jt)),this.paths.push(w),this.registry.set({method:C,path:w},{input:Oe,positive:Z,negative:Ae,response:Jt,isJson:I.getResponses("positive").some(D=>D.mimeTypes.includes(R.json)),tags:I.getTags()})}}),this.program.unshift(...this.aliases.values()),this.program.push(Dt(this.ids.pathType,this.paths)),this.program.push(Dt(this.ids.methodType,go)),this.program.push(dt(this.ids.methodPathType,Mt([this.ids.methodType,this.ids.pathType])));let a=[s.createHeritageClause(N.SyntaxKind.ExtendsKeyword,[Ut(this.ids.methodPathType,N.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),n&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let p=[],d=[];for(let[{method:I,path:w},{isJson:C,tags:pe,...Oe}]of this.registry){let Re=fo(I,w);for(let Z of this.interfaces)Z.kind in Oe&&Z.props.push(io(Re,Oe[Z.kind]));o!=="types"&&(C&&p.push(s.createPropertyAssignment(Re,s.createTrue())),d.push(s.createPropertyAssignment(Re,s.createArrayLiteralExpression(pe.map(Z=>s.createStringLiteral(Z))))))}for(let{id:I,props:w}of this.interfaces)this.program.push(mo(I,a,w));if(o==="types")return;let c=s.createVariableStatement(_,F(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(p))),m=s.createVariableStatement(_,F(this.ids.endpointTagsConst,s.createObjectLiteralExpression(d))),l=dt(this.ids.providerType,s.createFunctionTypeNode(uo({M:this.ids.methodType,P:this.ids.pathType}),ct({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Ht)}),co(this.ids.responseInterface,Ht))),f=dt(this.ids.implementationType,s.createFunctionTypeNode(void 0,ct({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(N.SyntaxKind.StringKeyword),params:Ut(N.SyntaxKind.StringKeyword,N.SyntaxKind.AnyKeyword)}),lo())),g=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,ke)]),O=Ft(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[g,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),T=Ft(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[g]),N.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),h=po(this.ids.clientClass,so([pt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),no)]),[ao(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),Kt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,O,T]),!0))]);this.program.push(c,m,l,f,h);let P=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),z=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(R.json))]),void 0,this.ids.undefinedValue)),L=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),H=s.createVariableStatement(void 0,F(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,ke)]),s.createObjectLiteralExpression([P,z,L])])))),Se=s.createVariableStatement(void 0,F(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),He=s.createVariableStatement(void 0,F(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),ke)])))),mt=s.createVariableStatement(void 0,F(this.ids.isJsonConst,s.createCallChain(s.createPropertyAccessChain(s.createCallExpression(s.createPropertyAccessExpression(s.createPropertyAccessExpression(this.ids.responseConst,this.ids.headersProperty),s.createIdentifier("get")),void 0,[s.createStringLiteral("content-type")]),s.createToken(N.SyntaxKind.QuestionDotToken),s.createIdentifier("startsWith")),void 0,void 0,[s.createStringLiteral(R.json)]))),Ue=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,yo(this.ids.isJsonConst,s.createStringLiteral("json"),s.createStringLiteral("text"))),void 0,[])),U=s.createVariableStatement(_,F(this.ids.exampleImplementationConst,Kt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([Se,He,H,mt,Ue]),!0),s.createTypeReferenceNode(this.ids.implementationType))),Y=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),Te=s.createVariableStatement(void 0,F(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(U,Te,Y)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:qt(r,t)).join(`
19
+ `):void 0}print(t){let r=this.printUsage(t),o=r&&N.addSyntheticLeadingComment(N.addSyntheticLeadingComment(s.createEmptyStatement(),N.SyntaxKind.SingleLineCommentTrivia," Usage example:"),N.SyntaxKind.MultiLineCommentTrivia,`
20
+ ${r}`);return this.program.concat(o||[]).map((n,i)=>qt(n,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
21
21
 
22
- `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await ge("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let n=this.printUsage(t);this.usage=n&&o?[await o(n)]:this.usage;let i=this.print(t);return o?o(i):i}};var di={dateIn:Xt,dateOut:er,file:Ge,upload:or,raw:rr};export{ve as BuiltinLogger,je as DependsOnMethod,Lt as Documentation,v as DocumentationError,Ee as EndpointsFactory,K as InputValidationError,$t as Integration,V as Middleware,Ae as MissingPeerError,Q as OutputValidationError,Ce as ResultHandler,ce as RoutingError,Ne as ServeStatic,Jo as arrayEndpointsFactory,Pt as arrayResultHandler,bn as attachRouting,Ho as createConfig,Sn as createServer,Qo as defaultEndpointsFactory,Ze as defaultResultHandler,Ye as ensureHttpError,di as ez,$ as getExamples,J as getMessageFromError,vs as testEndpoint,js as testMiddleware};
22
+ `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await he("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let n=this.printUsage(t);this.usage=n&&o?[await o(n)]:this.usage;let i=this.print(t);return o?o(i):i}};var li={dateIn:er,dateOut:tr,file:Ge,upload:nr,raw:or};export{je as BuiltinLogger,Ne as DependsOnMethod,kt as Documentation,E as DocumentationError,ve as EndpointsFactory,K as InputValidationError,Gt as Integration,V as Middleware,Pe as MissingPeerError,Q as OutputValidationError,Ze as ResultHandler,ce as RoutingError,Le as ServeStatic,Wo as arrayEndpointsFactory,wt as arrayResultHandler,Sn as attachRouting,Uo as createConfig,Tn as createServer,Jo as defaultEndpointsFactory,Ee as defaultResultHandler,Ye as ensureHttpError,li as ez,$ as getExamples,J as getMessageFromError,js as testEndpoint,Ns as testMiddleware};
@@ -1 +1 @@
1
- "use strict";var d=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var M=(s,e)=>{for(var t in e)d(s,t,{get:e[t],enumerable:!0})},O=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of L(e))!z.call(s,a)&&a!==t&&d(s,a,{get:()=>e[a],enumerable:!(r=A(e,a))||r.enumerable});return s};var R=s=>O(d({},"__esModule",{value:!0}),s);var Y={};M(Y,{default:()=>U});module.exports=R(Y);var o=require("@typescript-eslint/utils");var h="express-zod-api";var F="createConfig",W="createServer",x="server",b="beforeRouting",v="httpServer",T="httpsServer",k="originalError",P="getStatusCodeFromError",S="logger",E="getChildLogger",I="methods",j="tags",w="scopes",N="statusCodes",$="mimeTypes",H="build",_="ResultHandler",q="handler",i={[x]:"http",[v]:"servers",[T]:"servers",[k]:"cause",[S]:"getLogger",[E]:"getLogger",[I]:"method",[j]:"tag",[w]:"scope",[N]:"statusCode",[$]:"mimeType"},g={[P]:"ensureHttpError"},B=["jsonParser","upload","compression","rawParser","beforeRouting"],u={loggerArgument:`${o.AST_NODE_TYPES.Property}[key.name="${b}"] ${o.AST_NODE_TYPES.ArrowFunctionExpression} ${o.AST_NODE_TYPES.Identifier}[name="${S}"]`,getChildLoggerArgument:`${o.AST_NODE_TYPES.Property}[key.name="${b}"] ${o.AST_NODE_TYPES.ArrowFunctionExpression} ${o.AST_NODE_TYPES.Identifier}[name="${E}"]`,responseFeatures:`${o.AST_NODE_TYPES.NewExpression}[callee.name='${_}'] > ${o.AST_NODE_TYPES.ObjectExpression} > ${o.AST_NODE_TYPES.Property}[key.name!='${q}'] ${o.AST_NODE_TYPES.Property}[key.name=/(${N}|${$})/]`},m=s=>s.type===o.AST_NODE_TYPES.Property&&s.key.type===o.AST_NODE_TYPES.Identifier,V=s=>s.type===o.AST_NODE_TYPES.VariableDeclarator&&s.id.type===o.AST_NODE_TYPES.ObjectPattern,c=s=>e=>m(e)&&(Array.isArray(s)?s.includes(e.key.name):e.key.name===s),Q=o.ESLintUtils.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",move:"Move {{subject}} from {{from}} to {{to}}."}},defaultOptions:[],create:s=>({[o.AST_NODE_TYPES.ImportDeclaration]:e=>{if(e.source.value===h){for(let t of e.specifiers)if(t.type===o.AST_NODE_TYPES.ImportSpecifier&&t.imported.type===o.AST_NODE_TYPES.Identifier&&t.imported.name in g){let r=g[t.imported.name];s.report({node:t.imported,messageId:"change",data:{subject:"import",from:t.imported.name,to:r},fix:a=>a.replaceText(t,r)})}}},[o.AST_NODE_TYPES.MemberExpression]:e=>{if(e.property.type===o.AST_NODE_TYPES.Identifier&&e.property.name===k&&e.object.type===o.AST_NODE_TYPES.Identifier&&e.object.name.match(/err/i)){let t=i[e.property.name];s.report({node:e.property,messageId:"change",data:{subject:"property",from:e.property.name,to:t}})}},[o.AST_NODE_TYPES.CallExpression]:e=>{if(e.callee.type===o.AST_NODE_TYPES.MemberExpression&&e.callee.property.type===o.AST_NODE_TYPES.Identifier&&e.callee.property.name===H&&e.arguments.length===1&&e.arguments[0].type===o.AST_NODE_TYPES.ObjectExpression){let t=e.arguments[0].properties.filter(c([I,j,w]));for(let r of t){let a=i[r.key.name];s.report({node:r,messageId:"change",data:{subject:"property",from:r.key.name,to:a},fix:n=>n.replaceText(r.key,a)})}}if(e.callee.type===o.AST_NODE_TYPES.Identifier){if(e.callee.name===F&&e.arguments.length===1){let t=e.arguments[0];if(t.type===o.AST_NODE_TYPES.ObjectExpression){let r=t.properties.find(c(x));if(r){let n=i[r.key.name];s.report({node:r,messageId:"change",data:{subject:"property",from:r.key.name,to:n},fix:l=>l.replaceText(r.key,n)})}let a=t.properties.find(c(i.server));if(a&&a.value.type===o.AST_NODE_TYPES.ObjectExpression){let l=a.value.properties.filter(c(B));for(let p of l){let C=s.sourceCode.text.slice(...p.range),y=s.sourceCode.getTokenAfter(p);s.report({node:a,messageId:"move",data:{subject:m(p)?p.key.name:"the property",from:a.key.name,to:`the top level of ${e.callee.name} argument`},fix:f=>[f.insertTextAfter(a,`, ${C}`),f.removeRange([p.range[0],y?.value===","?y.range[1]:p.range[1]])]})}}}}if(e.callee.name===W){let t=s.sourceCode.getAncestors(e).findLast(V);if(t){let r=t.id.properties.filter(c([v,T]));for(let a of r)s.report({node:a,messageId:"change",data:{subject:"property",from:a.key.name,to:i[a.key.name]}})}}if(e.callee.name===P){let t=g[e.callee.name];s.report({node:e.callee,messageId:"change",data:{subject:"method",from:e.callee.name,to:`${t}().statusCode`},fix:r=>[r.replaceText(e.callee,t),r.insertTextAfter(e,".statusCode")]})}}},[u.loggerArgument]:e=>{let{parent:t}=e,r=m(t);if(r&&t.value===e)return;let a=`${i[e.name]}${r?"":"()"}`;s.report({node:e,messageId:"change",data:{subject:r?"property":"const",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[u.getChildLoggerArgument]:e=>{let{parent:t}=e,r=m(t);if(r&&t.value===e)return;let a=i[e.name];s.report({node:e,messageId:"change",data:{subject:r?"property":"method",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[u.responseFeatures]:e=>{if(!m(e))return;let t=i[e.key.name];s.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:t},fix:r=>r.replaceText(e.key,t)})}})}),U={rules:{v21:Q}};
1
+ "use strict";var d=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var M=(s,e)=>{for(var t in e)d(s,t,{get:e[t],enumerable:!0})},O=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of L(e))!z.call(s,a)&&a!==t&&d(s,a,{get:()=>e[a],enumerable:!(r=A(e,a))||r.enumerable});return s};var R=s=>O(d({},"__esModule",{value:!0}),s);var Y={};M(Y,{default:()=>U});module.exports=R(Y);var o=require("@typescript-eslint/utils");var h="express-zod-api";var F="createConfig",W="createServer",b="server",x="beforeRouting",v="httpServer",T="httpsServer",k="originalError",P="getStatusCodeFromError",S="logger",E="getChildLogger",I="methods",j="tags",w="scopes",N="statusCodes",$="mimeTypes",H="build",_="ResultHandler",q="handler",i={[b]:"http",[v]:"servers",[T]:"servers",[k]:"cause",[S]:"getLogger",[E]:"getLogger",[I]:"method",[j]:"tag",[w]:"scope",[N]:"statusCode",[$]:"mimeType"},g={[P]:"ensureHttpError"},B=["jsonParser","upload","compression","rawParser","beforeRouting"],u={loggerArgument:`${o.AST_NODE_TYPES.Property}[key.name="${x}"] ${o.AST_NODE_TYPES.ArrowFunctionExpression} ${o.AST_NODE_TYPES.Identifier}[name="${S}"]`,getChildLoggerArgument:`${o.AST_NODE_TYPES.Property}[key.name="${x}"] ${o.AST_NODE_TYPES.ArrowFunctionExpression} ${o.AST_NODE_TYPES.Identifier}[name="${E}"]`,responseFeatures:`${o.AST_NODE_TYPES.NewExpression}[callee.name='${_}'] > ${o.AST_NODE_TYPES.ObjectExpression} > ${o.AST_NODE_TYPES.Property}[key.name!='${q}'] ${o.AST_NODE_TYPES.Property}[key.name=/(${N}|${$})/]`},m=s=>s.type===o.AST_NODE_TYPES.Property&&s.key.type===o.AST_NODE_TYPES.Identifier,V=s=>s.type===o.AST_NODE_TYPES.VariableDeclarator&&s.id.type===o.AST_NODE_TYPES.ObjectPattern,c=s=>e=>m(e)&&(Array.isArray(s)?s.includes(e.key.name):e.key.name===s),Q=o.ESLintUtils.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",move:"Move {{subject}} from {{from}} to {{to}}."}},defaultOptions:[],create:s=>({[o.AST_NODE_TYPES.ImportDeclaration]:e=>{if(e.source.value===h){for(let t of e.specifiers)if(t.type===o.AST_NODE_TYPES.ImportSpecifier&&t.imported.type===o.AST_NODE_TYPES.Identifier&&t.imported.name in g){let r=g[t.imported.name];s.report({node:t.imported,messageId:"change",data:{subject:"import",from:t.imported.name,to:r},fix:a=>a.replaceText(t,r)})}}},[o.AST_NODE_TYPES.MemberExpression]:e=>{if(e.property.type===o.AST_NODE_TYPES.Identifier&&e.property.name===k&&e.object.type===o.AST_NODE_TYPES.Identifier&&e.object.name.match(/err/i)){let t=i[e.property.name];s.report({node:e.property,messageId:"change",data:{subject:"property",from:e.property.name,to:t}})}},[o.AST_NODE_TYPES.CallExpression]:e=>{if(e.callee.type===o.AST_NODE_TYPES.MemberExpression&&e.callee.property.type===o.AST_NODE_TYPES.Identifier&&e.callee.property.name===H&&e.arguments.length===1&&e.arguments[0].type===o.AST_NODE_TYPES.ObjectExpression){let t=e.arguments[0].properties.filter(c([I,j,w]));for(let r of t){let a=i[r.key.name];s.report({node:r,messageId:"change",data:{subject:"property",from:r.key.name,to:a},fix:n=>n.replaceText(r.key,a)})}}if(e.callee.type===o.AST_NODE_TYPES.Identifier){if(e.callee.name===F&&e.arguments.length===1){let t=e.arguments[0];if(t.type===o.AST_NODE_TYPES.ObjectExpression){let r=t.properties.find(c(b));if(r){let n=i[r.key.name];s.report({node:r,messageId:"change",data:{subject:"property",from:r.key.name,to:n},fix:l=>l.replaceText(r.key,n)})}let a=t.properties.find(c(i.server));if(a&&a.value.type===o.AST_NODE_TYPES.ObjectExpression){let l=a.value.properties.filter(c(B));for(let p of l){let C=s.sourceCode.text.slice(...p.range),y=s.sourceCode.getTokenAfter(p);s.report({node:a,messageId:"move",data:{subject:m(p)?p.key.name:"the property",from:a.key.name,to:`the top level of ${e.callee.name} argument`},fix:f=>[f.insertTextAfter(a,`, ${C}`),f.removeRange([p.range[0],y?.value===","?y.range[1]:p.range[1]])]})}}}}if(e.callee.name===W){let t=s.sourceCode.getAncestors(e).findLast(V);if(t){let r=t.id.properties.filter(c([v,T]));for(let a of r)s.report({node:a,messageId:"change",data:{subject:"property",from:a.key.name,to:i[a.key.name]}})}}if(e.callee.name===P){let t=g[e.callee.name];s.report({node:e.callee,messageId:"change",data:{subject:"method",from:e.callee.name,to:`${t}().statusCode`},fix:r=>[r.replaceText(e.callee,t),r.insertTextAfter(e,".statusCode")]})}}},[u.loggerArgument]:e=>{let{parent:t}=e,r=m(t);if(r&&t.value===e)return;let a=`${i[e.name]}${r?"":"()"}`;s.report({node:e,messageId:"change",data:{subject:r?"property":"const",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[u.getChildLoggerArgument]:e=>{let{parent:t}=e,r=m(t);if(r&&t.value===e)return;let a=i[e.name];s.report({node:e,messageId:"change",data:{subject:r?"property":"method",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[u.responseFeatures]:e=>{if(!m(e))return;let t=i[e.key.name];s.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:t},fix:r=>r.replaceText(e.key,t)})}})}),U={rules:{v21:Q}};
@@ -1 +1 @@
1
- import{ESLintUtils as A,AST_NODE_TYPES as r}from"@typescript-eslint/utils";var f="express-zod-api";var L="createConfig",z="createServer",b="server",h="beforeRouting",x="httpServer",v="httpsServer",T="originalError",k="getStatusCodeFromError",P="logger",S="getChildLogger",E="methods",I="tags",j="scopes",w="statusCodes",N="mimeTypes",M="build",O="ResultHandler",R="handler",i={[b]:"http",[x]:"servers",[v]:"servers",[T]:"cause",[P]:"getLogger",[S]:"getLogger",[E]:"method",[I]:"tag",[j]:"scope",[w]:"statusCode",[N]:"mimeType"},d={[k]:"ensureHttpError"},D=["jsonParser","upload","compression","rawParser","beforeRouting"],g={loggerArgument:`${r.Property}[key.name="${h}"] ${r.ArrowFunctionExpression} ${r.Identifier}[name="${P}"]`,getChildLoggerArgument:`${r.Property}[key.name="${h}"] ${r.ArrowFunctionExpression} ${r.Identifier}[name="${S}"]`,responseFeatures:`${r.NewExpression}[callee.name='${O}'] > ${r.ObjectExpression} > ${r.Property}[key.name!='${R}'] ${r.Property}[key.name=/(${w}|${N})/]`},m=o=>o.type===r.Property&&o.key.type===r.Identifier,F=o=>o.type===r.VariableDeclarator&&o.id.type===r.ObjectPattern,c=o=>e=>m(e)&&(Array.isArray(o)?o.includes(e.key.name):e.key.name===o),W=A.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",move:"Move {{subject}} from {{from}} to {{to}}."}},defaultOptions:[],create:o=>({[r.ImportDeclaration]:e=>{if(e.source.value===f){for(let t of e.specifiers)if(t.type===r.ImportSpecifier&&t.imported.type===r.Identifier&&t.imported.name in d){let s=d[t.imported.name];o.report({node:t.imported,messageId:"change",data:{subject:"import",from:t.imported.name,to:s},fix:a=>a.replaceText(t,s)})}}},[r.MemberExpression]:e=>{if(e.property.type===r.Identifier&&e.property.name===T&&e.object.type===r.Identifier&&e.object.name.match(/err/i)){let t=i[e.property.name];o.report({node:e.property,messageId:"change",data:{subject:"property",from:e.property.name,to:t}})}},[r.CallExpression]:e=>{if(e.callee.type===r.MemberExpression&&e.callee.property.type===r.Identifier&&e.callee.property.name===M&&e.arguments.length===1&&e.arguments[0].type===r.ObjectExpression){let t=e.arguments[0].properties.filter(c([E,I,j]));for(let s of t){let a=i[s.key.name];o.report({node:s,messageId:"change",data:{subject:"property",from:s.key.name,to:a},fix:n=>n.replaceText(s.key,a)})}}if(e.callee.type===r.Identifier){if(e.callee.name===L&&e.arguments.length===1){let t=e.arguments[0];if(t.type===r.ObjectExpression){let s=t.properties.find(c(b));if(s){let n=i[s.key.name];o.report({node:s,messageId:"change",data:{subject:"property",from:s.key.name,to:n},fix:l=>l.replaceText(s.key,n)})}let a=t.properties.find(c(i.server));if(a&&a.value.type===r.ObjectExpression){let l=a.value.properties.filter(c(D));for(let p of l){let $=o.sourceCode.text.slice(...p.range),u=o.sourceCode.getTokenAfter(p);o.report({node:a,messageId:"move",data:{subject:m(p)?p.key.name:"the property",from:a.key.name,to:`the top level of ${e.callee.name} argument`},fix:y=>[y.insertTextAfter(a,`, ${$}`),y.removeRange([p.range[0],u?.value===","?u.range[1]:p.range[1]])]})}}}}if(e.callee.name===z){let t=o.sourceCode.getAncestors(e).findLast(F);if(t){let s=t.id.properties.filter(c([x,v]));for(let a of s)o.report({node:a,messageId:"change",data:{subject:"property",from:a.key.name,to:i[a.key.name]}})}}if(e.callee.name===k){let t=d[e.callee.name];o.report({node:e.callee,messageId:"change",data:{subject:"method",from:e.callee.name,to:`${t}().statusCode`},fix:s=>[s.replaceText(e.callee,t),s.insertTextAfter(e,".statusCode")]})}}},[g.loggerArgument]:e=>{let{parent:t}=e,s=m(t);if(s&&t.value===e)return;let a=`${i[e.name]}${s?"":"()"}`;o.report({node:e,messageId:"change",data:{subject:s?"property":"const",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[g.getChildLoggerArgument]:e=>{let{parent:t}=e,s=m(t);if(s&&t.value===e)return;let a=i[e.name];o.report({node:e,messageId:"change",data:{subject:s?"property":"method",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[g.responseFeatures]:e=>{if(!m(e))return;let t=i[e.key.name];o.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:t},fix:s=>s.replaceText(e.key,t)})}})}),B={rules:{v21:W}};export{B as default};
1
+ import{ESLintUtils as A,AST_NODE_TYPES as r}from"@typescript-eslint/utils";var f="express-zod-api";var L="createConfig",z="createServer",x="server",h="beforeRouting",b="httpServer",v="httpsServer",T="originalError",k="getStatusCodeFromError",P="logger",S="getChildLogger",E="methods",I="tags",j="scopes",w="statusCodes",N="mimeTypes",M="build",O="ResultHandler",R="handler",i={[x]:"http",[b]:"servers",[v]:"servers",[T]:"cause",[P]:"getLogger",[S]:"getLogger",[E]:"method",[I]:"tag",[j]:"scope",[w]:"statusCode",[N]:"mimeType"},d={[k]:"ensureHttpError"},D=["jsonParser","upload","compression","rawParser","beforeRouting"],g={loggerArgument:`${r.Property}[key.name="${h}"] ${r.ArrowFunctionExpression} ${r.Identifier}[name="${P}"]`,getChildLoggerArgument:`${r.Property}[key.name="${h}"] ${r.ArrowFunctionExpression} ${r.Identifier}[name="${S}"]`,responseFeatures:`${r.NewExpression}[callee.name='${O}'] > ${r.ObjectExpression} > ${r.Property}[key.name!='${R}'] ${r.Property}[key.name=/(${w}|${N})/]`},m=o=>o.type===r.Property&&o.key.type===r.Identifier,F=o=>o.type===r.VariableDeclarator&&o.id.type===r.ObjectPattern,c=o=>e=>m(e)&&(Array.isArray(o)?o.includes(e.key.name):e.key.name===o),W=A.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",move:"Move {{subject}} from {{from}} to {{to}}."}},defaultOptions:[],create:o=>({[r.ImportDeclaration]:e=>{if(e.source.value===f){for(let t of e.specifiers)if(t.type===r.ImportSpecifier&&t.imported.type===r.Identifier&&t.imported.name in d){let s=d[t.imported.name];o.report({node:t.imported,messageId:"change",data:{subject:"import",from:t.imported.name,to:s},fix:a=>a.replaceText(t,s)})}}},[r.MemberExpression]:e=>{if(e.property.type===r.Identifier&&e.property.name===T&&e.object.type===r.Identifier&&e.object.name.match(/err/i)){let t=i[e.property.name];o.report({node:e.property,messageId:"change",data:{subject:"property",from:e.property.name,to:t}})}},[r.CallExpression]:e=>{if(e.callee.type===r.MemberExpression&&e.callee.property.type===r.Identifier&&e.callee.property.name===M&&e.arguments.length===1&&e.arguments[0].type===r.ObjectExpression){let t=e.arguments[0].properties.filter(c([E,I,j]));for(let s of t){let a=i[s.key.name];o.report({node:s,messageId:"change",data:{subject:"property",from:s.key.name,to:a},fix:n=>n.replaceText(s.key,a)})}}if(e.callee.type===r.Identifier){if(e.callee.name===L&&e.arguments.length===1){let t=e.arguments[0];if(t.type===r.ObjectExpression){let s=t.properties.find(c(x));if(s){let n=i[s.key.name];o.report({node:s,messageId:"change",data:{subject:"property",from:s.key.name,to:n},fix:l=>l.replaceText(s.key,n)})}let a=t.properties.find(c(i.server));if(a&&a.value.type===r.ObjectExpression){let l=a.value.properties.filter(c(D));for(let p of l){let $=o.sourceCode.text.slice(...p.range),u=o.sourceCode.getTokenAfter(p);o.report({node:a,messageId:"move",data:{subject:m(p)?p.key.name:"the property",from:a.key.name,to:`the top level of ${e.callee.name} argument`},fix:y=>[y.insertTextAfter(a,`, ${$}`),y.removeRange([p.range[0],u?.value===","?u.range[1]:p.range[1]])]})}}}}if(e.callee.name===z){let t=o.sourceCode.getAncestors(e).findLast(F);if(t){let s=t.id.properties.filter(c([b,v]));for(let a of s)o.report({node:a,messageId:"change",data:{subject:"property",from:a.key.name,to:i[a.key.name]}})}}if(e.callee.name===k){let t=d[e.callee.name];o.report({node:e.callee,messageId:"change",data:{subject:"method",from:e.callee.name,to:`${t}().statusCode`},fix:s=>[s.replaceText(e.callee,t),s.insertTextAfter(e,".statusCode")]})}}},[g.loggerArgument]:e=>{let{parent:t}=e,s=m(t);if(s&&t.value===e)return;let a=`${i[e.name]}${s?"":"()"}`;o.report({node:e,messageId:"change",data:{subject:s?"property":"const",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[g.getChildLoggerArgument]:e=>{let{parent:t}=e,s=m(t);if(s&&t.value===e)return;let a=i[e.name];o.report({node:e,messageId:"change",data:{subject:s?"property":"method",from:e.name,to:a},fix:n=>n.replaceText(e,a)})},[g.responseFeatures]:e=>{if(!m(e))return;let t=i[e.key.name];o.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:t},fix:s=>s.replaceText(e.key,t)})}})}),B={rules:{v21:W}};export{B as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "21.0.0-beta.5",
3
+ "version": "21.0.0",
4
4
  "description": "A Typescript framework 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": {