express-zod-api 21.3.0 → 21.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,57 @@
2
2
 
3
3
  ## Version 21
4
4
 
5
+ ### v21.5.0
6
+
7
+ - Feat: Introducing [Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events):
8
+ - Basic implementation of the event streams feature is now available using `EventStreamFactory` class;
9
+ - The new factory is similar to `EndpointsFactory` including the middlewares support;
10
+ - Client application can subscribe to the event stream using `EventSource` class instance;
11
+ - `Documentation` and `Integration` do not have yet a special depiction of such endpoints;
12
+ - This feature is a lightweight alternative to [Zod Sockets](https://github.com/RobinTail/zod-sockets).
13
+
14
+ ```ts
15
+ import { z } from "zod";
16
+ import { EventStreamFactory } from "express-zod-api";
17
+ import { setTimeout } from "node:timers/promises";
18
+
19
+ const subscriptionEndpoint = EventStreamFactory({
20
+ events: { time: z.number().int().positive() },
21
+ }).buildVoid({
22
+ input: z.object({}), // optional input schema
23
+ handler: async ({ options: { emit, isClosed } }) => {
24
+ while (!isClosed()) {
25
+ emit("time", Date.now());
26
+ await setTimeout(1000);
27
+ }
28
+ },
29
+ });
30
+ ```
31
+
32
+ ```js
33
+ const source = new EventSource("https://example.com/api/v1/time");
34
+ source.addEventListener("time", (event) => {
35
+ const data = JSON.parse(event.data); // number
36
+ });
37
+ ```
38
+
39
+ ### v21.4.0
40
+
41
+ - Return type of public methods `getTags()` and `getScopes()` of `Endpoint` corrected to `ReadyonlyArray<string>`;
42
+ - Featuring `EndpointsFactory::buildVoid()` method:
43
+ - It's a shorthand for returning `{}` while having `output` schema `z.object({})`;
44
+ - When using this method, `handler` may return `void` while retaining the object-based operation internally.
45
+
46
+ ```diff
47
+ - factory.build({
48
+ + factory.buildVoid({
49
+ - output: z.object({}),
50
+ handler: async () => {
51
+ - return {};
52
+ },
53
+ });
54
+ ```
55
+
5
56
  ### v21.3.0
6
57
 
7
58
  - Fixed `provide()` method usage example in the code of the generated client;
package/README.md CHANGED
@@ -1195,13 +1195,38 @@ createConfig({
1195
1195
 
1196
1196
  ## Subscriptions
1197
1197
 
1198
- If you want the user of a client application to be able to subscribe to subsequent updates initiated by the server, the
1199
- capabilities of this framework and the HTTP protocol itself would not be enough in this case. I have developed an
1200
- additional websocket operating framework, [Zod Sockets](https://github.com/RobinTail/zod-sockets), which has similar
1201
- principles and capabilities. Check out an example of the synergy between two frameworks on handling subscription events
1202
- in order to emit (broadcast) the `time` event every second with a current time in its payload:
1198
+ If you want the user of a client application to be able to subscribe to subsequent updates initiated by the server,
1199
+ consider [Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) (SSE) feature.
1200
+ Client application can subscribe to the event stream using `EventSource` class instance. The following example
1201
+ demonstrates the implementation emitting the `time` event each second.
1203
1202
 
1204
- https://github.com/RobinTail/zod-sockets#subscriptions
1203
+ ```typescript
1204
+ import { z } from "zod";
1205
+ import { EventStreamFactory } from "express-zod-api";
1206
+ import { setTimeout } from "node:timers/promises";
1207
+
1208
+ const subscriptionEndpoint = EventStreamFactory({
1209
+ events: { time: z.number().int().positive() },
1210
+ }).buildVoid({
1211
+ input: z.object({}), // optional input schema
1212
+ handler: async ({ options: { emit, isClosed } }) => {
1213
+ while (!isClosed()) {
1214
+ emit("time", Date.now());
1215
+ await setTimeout(1000);
1216
+ }
1217
+ },
1218
+ });
1219
+ ```
1220
+
1221
+ ```js
1222
+ const source = new EventSource("https://example.com/api/v1/time");
1223
+ source.addEventListener("time", (event) => {
1224
+ const data = JSON.parse(event.data); // number
1225
+ });
1226
+ ```
1227
+
1228
+ If you need more capabilities, such as bidirectional event sending, I have developed an additional websocket operating
1229
+ framework, [Zod Sockets](https://github.com/RobinTail/zod-sockets), which has similar principles and capabilities.
1205
1230
 
1206
1231
  # Integration and Documentation
1207
1232
 
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
- "use strict";var rn=Object.create;var st=Object.defineProperty;var on=Object.getOwnPropertyDescriptor;var nn=Object.getOwnPropertyNames;var sn=Object.getPrototypeOf,an=Object.prototype.hasOwnProperty;var pn=(e,t)=>{for(var r in t)st(e,r,{get:t[r],enumerable:!0})},lr=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of nn(t))!an.call(e,n)&&n!==r&&st(e,n,{get:()=>t[n],enumerable:!(o=on(t,n))||o.enumerable});return e};var Z=(e,t,r)=>(r=e!=null?rn(sn(e)):{},lr(t||!e||!e.__esModule?st(r,"default",{value:e,enumerable:!0}):r,e)),cn=e=>lr(st({},"__esModule",{value:!0}),e);var qs={};pn(qs,{BuiltinLogger:()=>Ne,DependsOnMethod:()=>ve,Documentation:()=>wt,DocumentationError:()=>N,EndpointsFactory:()=>Ee,InputValidationError:()=>D,Integration:()=>Mt,Middleware:()=>_,MissingPeerError:()=>Te,OutputValidationError:()=>W,ResultHandler:()=>Ce,RoutingError:()=>pe,ServeStatic:()=>ke,arrayEndpointsFactory:()=>Er,arrayResultHandler:()=>bt,attachRouting:()=>io,createConfig:()=>yr,createServer:()=>ao,defaultEndpointsFactory:()=>Zr,defaultResultHandler:()=>Ze,ensureHttpError:()=>_e,ez:()=>$o,getExamples:()=>V,getMessageFromError:()=>X,testEndpoint:()=>wo,testMiddleware:()=>Io});module.exports=cn(qs);var E=require("ramda"),le=require("zod");var G=require("ramda"),mr=require("zod");var P={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var pe=class extends Error{name="RoutingError"},N=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.`}},it=class extends Error{name="IOSchemaError"},W=class extends it{constructor(r){super(X(r),{cause:r});this.cause=r}name="OutputValidationError"},D=class extends it{constructor(r){super(X(r),{cause:r});this.cause=r}name="InputValidationError"},Q=class extends Error{constructor(r,o){super(X(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},Te=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var dn=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(P.upload);return"files"in e&&r},Kt={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},ln=["body","query","params"],Dt=e=>e.method.toLowerCase(),Ft=e=>e.startsWith("x-"),mn=e=>(0,G.pickBy)((t,r)=>Ft(r),e),at=(e,t={})=>{let r=Dt(e);return r==="options"?{}:(t[r]||Kt[r]||ln).filter(o=>o==="files"?dn(e):!0).map(o=>o==="headers"?mn(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 mr.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof W?`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},ce=(e,t,r)=>e.length&&t.length?(0,G.xprod)(e,t).map(r):e.concat(t),$e=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,Bt=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),te=(...e)=>{let t=(0,G.chain)(o=>o.split(/[^A-Z0-9]/gi),e);return(0,G.chain)(o=>o.replaceAll(/[A-Z]+/g,n=>`/${n}`).split("/"),t).map(Bt).join("")},pt=(e,t)=>{try{return typeof e.parse(t)}catch{return}},de=e=>typeof e=="object"&&e!==null,Oe=(0,G.memoizeWith)(()=>"static",()=>process.env.NODE_ENV==="production");var ct=require("ramda"),x=Symbol.for("express-zod-api"),dt=e=>{let t=e.describe(e.description);return t._def[x]=(0,ct.clone)(t._def[x])||{examples:[]},t},ur=(e,t)=>{if(!(x in e._def))return t;let r=dt(t);return r._def[x].examples=ce(r._def[x].examples,e._def[x].examples,([o,n])=>typeof o=="object"&&typeof n=="object"?(0,ct.mergeDeepRight)({...o},{...n}):n),r};var un=function(e){let t=dt(this);return t._def[x].examples.push(e),t},yn=function(e){let t=dt(this);return t._def[x].defaultLabel=e,t},fn=function(e){return new le.z.ZodBranded({typeName:le.z.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[x]:{examples:[],...(0,E.clone)(this._def[x]),brand:e}})},gn=function(e){let t=typeof e=="function"?e:(0,E.pipe)(E.toPairs,(0,E.map)(([n,i])=>(0,E.pair)(e[String(n)]||n,i)),E.fromPairs),r=t((0,E.clone)(this.shape)),o=le.z.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};x in globalThis||(globalThis[x]=!0,Object.defineProperties(le.z.ZodType.prototype,{example:{get(){return un.bind(this)}},brand:{set(){},get(){return fn.bind(this)}}}),Object.defineProperty(le.z.ZodDefault.prototype,"label",{get(){return yn.bind(this)}}),Object.defineProperty(le.z.ZodObject.prototype,"remap",{get(){return gn.bind(this)}}));function yr(e){return e}var Cr=require("zod");var Qt=require("zod");var w=require("node:assert/strict");var Re=require("zod");var lt=e=>!isNaN(e.getTime());var me=Symbol("DateIn"),fr=()=>Re.z.union([Re.z.string().date(),Re.z.string().datetime(),Re.z.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Re.z.date().refine(lt)).brand(me);var gr=require("zod");var ue=Symbol("DateOut"),hr=()=>gr.z.date().refine(lt).transform(e=>e.toISOString()).brand(ue);var Ge=require("zod"),F=Symbol("File"),xr=Ge.z.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),hn={buffer:()=>xr.brand(F),string:()=>Ge.z.string().brand(F),binary:()=>xr.or(Ge.z.string()).brand(F),base64:()=>Ge.z.string().base64().brand(F)};function mt(e){return hn[e||"string"]()}var br=require("zod");var re=Symbol("Raw"),Sr=(e={})=>br.z.object({raw:mt("buffer")}).extend(e).brand(re);var Tr=require("zod"),Ae=Symbol("Upload"),Or=()=>Tr.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(Ae);var Rr=(e,{next:t})=>e.options.some(t),xn=({_def:e},{next:t})=>[e.left,e.right].some(t),ut=(e,{next:t})=>t(e.unwrap()),qt={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:Rr,ZodDiscriminatedUnion:Rr,ZodIntersection:xn,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:ut,ZodNullable:ut,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},yt=(e,{condition:t,rules:r=qt,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=>yt(a,{condition:t,rules:r,maxDepth:n,depth:o+1})}):!1},Ar=e=>yt(e,{condition:t=>t._def[x]?.brand===Ae}),Pr=e=>yt(e,{condition:t=>t._def[x]?.brand===re,maxDepth:3}),$t=(e,t)=>{let r=new WeakSet;return yt(e,{maxDepth:300,rules:{...qt,ZodBranded:ut,ZodReadonly:ut,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:qt.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()"),[ue]:()=>t==="in"&&(0,w.fail)("ez.dateOut()"),[me]:()=>t==="out"&&(0,w.fail)("ez.dateIn()"),[re]:()=>t==="out"&&(0,w.fail)("ez.raw()"),[Ae]:()=>t==="out"&&(0,w.fail)("ez.upload()"),[F]:()=>!1}})};var ft=Z(require("http-errors"),1);var Ve=Z(require("http-errors"),1),wr=require("zod");var Gt=(e,{variant:t,args:r,...o})=>{if(typeof e=="function"&&(e=e(...r)),e instanceof wr.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 Q(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===void 0?o.mimeTypes:a}))},Vt=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),_e=e=>(0,Ve.isHttpError)(e)?e:(0,Ve.default)(e instanceof D?400:500,X(e),{cause:e.cause||e}),Ye=e=>Oe()&&!e.expose?(0,Ve.default)(e.statusCode).message:e.message;var gt=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=Ye((0,ft.default)(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`
2
- Original error: ${e.handled.message}.`:""),{expose:(0,ft.isHttpError)(e.cause)?e.cause.expose:!1}));r.status(500).type("text/plain").end(o)};var Ir=require("ramda");var ye=e=>de(e)&&"or"in e,we=e=>de(e)&&"and"in e,_t=e=>({and:(0,Ir.chain)(t=>we(t)?t.and:[t],e)}),ht=(e,t)=>we(e)?{and:e.and.map(r=>ye(r)?{or:r.or.map(t)}:t(r))}:ye(e)?{or:e.or.map(r=>we(r)?{and:r.and.map(t)}:t(r))}:t(e),Yt=e=>e.and.reduce((t,r)=>({or:ce(t.or,ye(r)?r.or:[r],_t)}),{or:[]}),Pe=(e,t)=>we(e)?ye(t)?Pe(Yt(e),t):_t([e,t]):ye(e)?we(t)?Pe(t,e):ye(t)?{or:ce(e.or,t.or,_t)}:Pe(e,{and:[t]}):we(t)||ye(t)?Pe(t,e):{and:[e,t]};var Jt=require("zod");var Wt=class{},_=class extends Wt{#e;#t;#r;constructor({input:t=Jt.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 Jt.z.ZodError?new D(o):o}}},Ie=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 ze=class{nest(t){return Object.assign(t,{"":this})}};var Je=class extends ze{},xt=class extends Je{#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=Ar(r)?"upload":Pr(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?Pe(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 Qt.z.ZodError?new W(r):r}}async#m({method:t,logger:r,options:o,response:n,...i}){for(let a of this.#r)if(!(t==="options"&&!(a instanceof Ie))&&(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 Qt.z.ZodError?new D(n):n}return this.#s({...r,input:o})}async#y({error:t,...r}){try{await this.#i.execute({...r,error:t})}catch(o){gt({...r,error:new Q(ee(o),t||void 0)})}}async execute({request:t,response:r,logger:o,config:n}){let i=Dt(t),a={},p=null,d=null,c=at(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.#y({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)=>ur(i,n),o)};var M=require("zod");var fe={positive:200,negative:400};var Xt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},Ce=class extends Xt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return Gt(this.#e,{variant:"positive",args:[t],statusCodes:[fe.positive],mimeTypes:[P.json]})}getNegativeResponse(){return Gt(this.#t,{variant:"negative",args:[],statusCodes:[fe.negative],mimeTypes:[P.json]})}},Ze=new Ce({positive:e=>{let t=V({schema:e}),r=M.z.object({status:M.z.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:M.z.object({status:M.z.literal("error"),error:M.z.object({message:M.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=_e(e);return Vt(a,i,o,t),void n.status(a.statusCode).json({status:"error",error:{message:Ye(a)}})}n.status(fe.positive).json({status:"success",data:r})}}),bt=new Ce({positive:e=>{let t=V({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof M.z.ZodArray?e.shape.items:M.z.array(M.z.any());return t.reduce((o,n)=>de(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:M.z.string().example("Sample error message"),handler:({response:e,output:t,error:r,logger:o,request:n,input:i})=>{if(r){let a=_e(r);return Vt(a,o,n,i),void e.status(a.statusCode).type("text/plain").send(Ye(a))}if(t&&"items"in t&&Array.isArray(t.items))return void e.status(fe.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 _?t:new _(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new Ie(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new _({handler:t})),this.resultHandler)}build({input:t=Cr.z.object({}),handler:r,output:o,description:n,shortDescription:i,operationId:a,scope:p,tag:d,method:c}){let{middlewares:u,resultHandler:m}=this,f=typeof c=="string"?[c]:c,b=typeof a=="function"?a:()=>a,R=typeof p=="string"?[p]:p||[],A=typeof d=="string"?[d]:d||[];return new xt({handler:r,middlewares:u,outputSchema:o,resultHandler:m,scopes:R,tags:A,methods:f,getOperationId:b,description:n,shortDescription:i,inputSchema:zr(u,t)})}},Zr=new Ee(Ze),Er=new Ee(bt);var v=require("ansis"),Ur=require("node:util"),er=require("node:perf_hooks");var Tt={debug:10,info:20,warn:30,error:40},vr=e=>de(e)&&Object.keys(Tt).some(t=>t in e),jr=e=>e in Tt,kr=(e,t)=>Tt[e]<Tt[t],Lr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),St=Lr(),Nr=Lr(2),bn=e=>e<1e-6?["picosecond",e/1e-9,St]:e<.001?["nanosecond",e/1e-6,St]:e<1?["microsecond",e/.001,St]:e<1e3?["millisecond",e,St]:e<6e4?["second",e/1e3,Nr]:["minute",e/6e4,Nr],Mr=e=>{let[t,r,o]=bn(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var Ne=class e{config;styles={debug:v.blue,info:v.green,warn:(0,v.hex)("#FFA500"),error:v.red};constructor(t={}){let{color:r=new v.Ansis().isSupported(),level:o=Oe()?"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,Ur.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"||kr(t,n))return;let d=[new Date().toISOString()];i&&d.push(p?(0,v.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=er.performance.now();return()=>{let o=er.performance.now()-r,{message:n,severity:i="debug",formatter:a=Mr}=typeof t=="object"?t:{message:t};this.print(typeof i=="function"?i(o):i,n,a(o))}}};var je=require("ramda");var ve=class extends ze{entries;constructor(t){super();let r=[],o=(0,je.keys)(t);for(let n of o){let i=t[n];i&&r.push([n,i,(0,je.reject)((0,je.equals)(n),o)])}this.entries=Object.freeze(r)}};var Hr=Z(require("express"),1),ke=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Hr.default.static(...this.params))}};var Rt=Z(require("express"),1),oo=Z(require("node:http"),1),no=Z(require("node:https"),1);var Le=async(e,t="default")=>{try{return(await Promise.resolve().then(()=>Z(require(e))))[t]}catch{}throw new Te(e)};var Ot=class{constructor(t){this.logger=t}#e=new WeakSet;check(t,r){if(!this.#e.has(t)){if(t.getRequestType()==="json")try{$t(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(P.json))try{$t(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 Kr=(e,t)=>Object.entries(e).map(([r,o])=>{if(r.includes("/"))throw new pe(`The entry '${r}' must avoid having slashes \u2014 use nesting instead.`);let n=r.trim();return[`${t||""}${n?`/${n}`:""}`,o]}),Me=({routing:e,onEndpoint:t,onStatic:r})=>{let o=Kr(e);for(;o.length;){let[n,i]=o.shift();if(i instanceof Je){let a=i.getMethods()||["get"];for(let p of a)t(i,n,p)}else if(i instanceof ke)r&&i.apply(n,r);else if(i instanceof ve)for(let[a,p,d]of i.entries){let c=p.getMethods();if(c&&!c.includes(a))throw new pe(`Endpoint assigned to ${a} method of ${n} must support ${a} method.`);t(p,n,a,d)}else o.unshift(...Kr(i,n))}};var tr=({app:e,getLogger:t,config:r,routing:o,parsers:n})=>{let i=new Ot(t()),a=new Set;Me({routing:o,onStatic:(p,d)=>void e.use(p,d),onEndpoint:(p,d,c,u)=>{Oe()||i.check(p,{path:d,method:c});let m=n?.[p.getRequestType()]||[],f=async(b,R)=>{let A=t(b);if(r.cors){let k={"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:b,endpoint:p,logger:A,defaultHeaders:k}):k;for(let B in K)R.set(B,K[B])}return p.execute({request:b,response:R,logger:A,config:r})};r.cors&&!a.has(d)&&(e.options(d,...m,f),a.add(d)),e[c](d,...m,f)}})};var We=Z(require("http-errors"),1);var Gr=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",Fr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Br=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,qr=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),$r=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var Vr=(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",qr);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(Br(c)||Fr(c))&&a(c);for await(let c of(0,Gr.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($r))};return{sockets:n,shutdown:()=>o??=d()}};var _r=({errorHandler:e,getLogger:t})=>async(r,o,n,i)=>r?e.execute({error:(0,We.isHttpError)(r)?r:(0,We.default)(400,ee(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):i(),Yr=({errorHandler:e,getLogger:t})=>async(r,o)=>{let n=(0,We.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){gt({response:o,logger:i,error:new Q(ee(a),n)})}},Sn=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},Tn=e=>({log:e.debug.bind(e)}),Jr=async({getLogger:e,config:t})=>{let r=await Le("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:Tn(u)})(p,d,c)}),o&&a.push(Sn(o)),a},Wr=(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()},Xr=e=>t=>t?.res?.locals[x]?.logger||e,eo=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
3
- `).slice(1))),to=({servers:e,logger:t,options:{timeout:r,events:o=["SIGINT","SIGTERM"]}})=>{let n=Vr(e,{logger:t,timeout:r}),i=()=>n.shutdown().then(()=>process.exit());for(let a of o)process.on(a,i)};var j=require("ansis"),ro=e=>{if(e.columns<132)return;let t=(0,j.italic)("Proudly supports transgender community.".padStart(109)),r=(0,j.italic)("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),o=(0,j.italic)("Thank you for choosing Express Zod API for your project.".padStart(132)),n=(0,j.italic)("for Kesaria".padEnd(20)),i=(0,j.hex)("#F5A9B8"),a=(0,j.hex)("#5BCEFA"),p=new Array(14).fill(a,1,3).fill(i,3,5).fill(j.whiteBright,5,7).fill(i,7,9).fill(a,9,12).fill(j.gray,12,13),d=`
1
+ "use strict";var sn=Object.create;var nt=Object.defineProperty;var an=Object.getOwnPropertyDescriptor;var pn=Object.getOwnPropertyNames;var cn=Object.getPrototypeOf,dn=Object.prototype.hasOwnProperty;var mn=(e,t)=>{for(var r in t)nt(e,r,{get:t[r],enumerable:!0})},fr=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of pn(t))!dn.call(e,n)&&n!==r&&nt(e,n,{get:()=>t[n],enumerable:!(o=an(t,n))||o.enumerable});return e};var z=(e,t,r)=>(r=e!=null?sn(cn(e)):{},fr(t||!e||!e.__esModule?nt(r,"default",{value:e,enumerable:!0}):r,e)),ln=e=>fr(nt({},"__esModule",{value:!0}),e);var Qs={};mn(Qs,{BuiltinLogger:()=>ke,DependsOnMethod:()=>Le,Documentation:()=>Pt,DocumentationError:()=>Z,EndpointsFactory:()=>se,EventStreamFactory:()=>Mt,InputValidationError:()=>F,Integration:()=>Lt,Middleware:()=>L,MissingPeerError:()=>we,OutputValidationError:()=>W,ResultHandler:()=>ne,RoutingError:()=>me,ServeStatic:()=>He,arrayEndpointsFactory:()=>Nr,arrayResultHandler:()=>xt,attachRouting:()=>po,createConfig:()=>hr,createServer:()=>co,defaultEndpointsFactory:()=>vr,defaultResultHandler:()=>je,ensureHttpError:()=>he,ez:()=>Yo,getExamples:()=>J,getMessageFromError:()=>ee,testEndpoint:()=>Io,testMiddleware:()=>zo});module.exports=ln(Qs);var C=require("ramda"),fe=require("zod");var _=require("ramda"),yr=require("zod");var O={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream",sse:"text/event-stream"};var me=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.`}},st=class extends Error{name="IOSchemaError"},W=class extends st{constructor(r){super(ee(r),{cause:r});this.cause=r}name="OutputValidationError"},F=class extends st{constructor(r){super(ee(r),{cause:r});this.cause=r}name="InputValidationError"},X=class extends Error{constructor(r,o){super(ee(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},we=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var un=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(O.upload);return"files"in e&&r},Ft={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},fn=["body","query","params"],Bt=e=>e.method.toLowerCase(),qt=e=>e.startsWith("x-"),yn=e=>(0,_.pickBy)((t,r)=>qt(r),e),it=(e,t={})=>{let r=Bt(e);return r==="options"?{}:(t[r]||Ft[r]||fn).filter(o=>o==="files"?un(e):!0).map(o=>o==="headers"?yn(e[o]):e[o]).reduce((o,n)=>Object.assign(o,n),{})},te=e=>e instanceof Error?e:new Error(String(e)),ee=e=>e instanceof yr.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof W?`output${e.cause.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,J=({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},le=(e,t,r)=>e.length&&t.length?(0,_.xprod)(e,t).map(r):e.concat(t),Ve=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,$t=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),re=(...e)=>{let t=(0,_.chain)(o=>o.split(/[^A-Z0-9]/gi),e);return(0,_.chain)(o=>o.replaceAll(/[A-Z]+/g,n=>`/${n}`).split("/"),t).map($t).join("")},at=(e,t)=>{try{return typeof e.parse(t)}catch{return}},ue=e=>typeof e=="object"&&e!==null,Ee=(0,_.memoizeWith)(()=>"static",()=>process.env.NODE_ENV==="production");var pt=require("ramda"),x=Symbol.for("express-zod-api"),ct=e=>{let t=e.describe(e.description);return t._def[x]=(0,pt.clone)(t._def[x])||{examples:[]},t},gr=(e,t)=>{if(!(x in e._def))return t;let r=ct(t);return r._def[x].examples=le(r._def[x].examples,e._def[x].examples,([o,n])=>typeof o=="object"&&typeof n=="object"?(0,pt.mergeDeepRight)({...o},{...n}):n),r};var gn=function(e){let t=ct(this);return t._def[x].examples.push(e),t},hn=function(e){let t=ct(this);return t._def[x].defaultLabel=e,t},xn=function(e){return new fe.z.ZodBranded({typeName:fe.z.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[x]:{examples:[],...(0,C.clone)(this._def[x]),brand:e}})},bn=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=fe.z.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};x in globalThis||(globalThis[x]=!0,Object.defineProperties(fe.z.ZodType.prototype,{example:{get(){return gn.bind(this)}},brand:{set(){},get(){return xn.bind(this)}}}),Object.defineProperty(fe.z.ZodDefault.prototype,"label",{get(){return hn.bind(this)}}),Object.defineProperty(fe.z.ZodObject.prototype,"remap",{get(){return bn.bind(this)}}));function hr(e){return e}var tr=require("zod");var Xt=require("zod");var w=require("node:assert/strict");var Ie=require("zod");var dt=e=>!isNaN(e.getTime());var ye=Symbol("DateIn"),xr=()=>Ie.z.union([Ie.z.string().date(),Ie.z.string().datetime(),Ie.z.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Ie.z.date().refine(dt)).brand(ye);var br=require("zod");var ge=Symbol("DateOut"),Sr=()=>br.z.date().refine(dt).transform(e=>e.toISOString()).brand(ge);var _e=require("zod"),B=Symbol("File"),Tr=_e.z.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),Sn={buffer:()=>Tr.brand(B),string:()=>_e.z.string().brand(B),binary:()=>Tr.or(_e.z.string()).brand(B),base64:()=>_e.z.string().base64().brand(B)};function mt(e){return Sn[e||"string"]()}var Or=require("zod");var oe=Symbol("Raw"),Rr=(e={})=>Or.z.object({raw:mt("buffer")}).extend(e).brand(oe);var Ar=require("zod"),ze=Symbol("Upload"),Pr=()=>Ar.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(ze);var wr=(e,{next:t})=>e.options.some(t),Tn=({_def:e},{next:t})=>[e.left,e.right].some(t),lt=(e,{next:t})=>t(e.unwrap()),Gt={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:wr,ZodDiscriminatedUnion:wr,ZodIntersection:Tn,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:lt,ZodNullable:lt,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},ut=(e,{condition:t,rules:r=Gt,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=>ut(a,{condition:t,rules:r,maxDepth:n,depth:o+1})}):!1},Er=e=>ut(e,{condition:t=>t._def[x]?.brand===ze}),Ir=e=>ut(e,{condition:t=>t._def[x]?.brand===oe,maxDepth:3}),Vt=(e,t)=>{let r=new WeakSet;return ut(e,{maxDepth:300,rules:{...Gt,ZodBranded:lt,ZodReadonly:lt,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:Gt.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()"),[ge]:()=>t==="in"&&(0,w.fail)("ez.dateOut()"),[ye]:()=>t==="out"&&(0,w.fail)("ez.dateIn()"),[oe]:()=>t==="out"&&(0,w.fail)("ez.raw()"),[ze]:()=>t==="out"&&(0,w.fail)("ez.upload()"),[B]:()=>!1}})};var ft=z(require("http-errors"),1);var Je=z(require("http-errors"),1),zr=require("zod");var _t=(e,{variant:t,args:r,...o})=>{if(typeof e=="function"&&(e=e(...r)),e instanceof zr.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 X(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===void 0?o.mimeTypes:a}))},Ye=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),he=e=>(0,Je.isHttpError)(e)?e:(0,Je.default)(e instanceof F?400:500,ee(e),{cause:e.cause||e}),xe=e=>Ee()&&!e.expose?(0,Je.default)(e.statusCode).message:e.message;var yt=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=xe((0,ft.default)(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`
2
+ Original error: ${e.handled.message}.`:""),{expose:(0,ft.isHttpError)(e.cause)?e.cause.expose:!1}));r.status(500).type("text/plain").end(o)};var Cr=require("ramda");var be=e=>ue(e)&&"or"in e,Ze=e=>ue(e)&&"and"in e,Jt=e=>({and:(0,Cr.chain)(t=>Ze(t)?t.and:[t],e)}),gt=(e,t)=>Ze(e)?{and:e.and.map(r=>be(r)?{or:r.or.map(t)}:t(r))}:be(e)?{or:e.or.map(r=>Ze(r)?{and:r.and.map(t)}:t(r))}:t(e),Yt=e=>e.and.reduce((t,r)=>({or:le(t.or,be(r)?r.or:[r],Jt)}),{or:[]}),Ce=(e,t)=>Ze(e)?be(t)?Ce(Yt(e),t):Jt([e,t]):be(e)?Ze(t)?Ce(t,e):be(t)?{or:le(e.or,t.or,Jt)}:Ce(e,{and:[t]}):Ze(t)||be(t)?Ce(t,e):{and:[e,t]};var Qt=require("zod");var Wt=class{},L=class extends Wt{#e;#t;#r;constructor({input:t=Qt.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 Qt.z.ZodError?new F(o):o}}},ve=class extends L{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({handler:async({request:n,response:i})=>new Promise((a,c)=>{let d=p=>{if(p&&p instanceof Error)return c(o(p));a(r(n,i))};t(n,i,d)?.catch(d)})})}};var Ne=class{nest(t){return Object.assign(t,{"":this})}};var Qe=class extends Ne{},ht=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:c=[],middlewares:d=[],tags:p=[],description:l,shortDescription:u}){super(),this.#s=n,this.#i=i,this.#r=d,this.#c=a,this.#t=Object.freeze(t),this.#a=Object.freeze(c),this.#p=Object.freeze(p),this.#e={long:l,short:u},this.#o={input:r,output:o},this.#n={positive:Object.freeze(i.getPositiveResponse(o)),negative:Object.freeze(i.getNegativeResponse())},this.#d=Er(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?Ce(t,o):t},{and:[]})}getScopes(){return this.#a}getTags(){return this.#p}getOperationId(t){return this.#c(t)}async#m(t){try{return await this.#o.output.parseAsync(t)}catch(r){throw r instanceof Xt.z.ZodError?new W(r):r}}async#l({method:t,logger:r,options:o,response:n,...i}){for(let a of this.#r)if(!(t==="options"&&!(a instanceof ve))&&(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 Xt.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){yt({...r,error:new X(te(o),t||void 0)})}}async execute({request:t,response:r,logger:o,config:n}){let i=Bt(t),a={},c=null,d=null,p=it(t,n.inputSources);try{if(await this.#l({method:i,input:p,request:t,response:r,logger:o,options:a}),r.writableEnded)return;if(i==="options")return void r.status(200).end();c=await this.#m(await this.#u({input:p,logger:o,options:a}))}catch(l){d=te(l)}await this.#f({input:p,output:c,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)=>gr(i,n),o)};var M=require("zod");var Se={positive:200,negative:400};var er=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},ne=class extends er{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return _t(this.#e,{variant:"positive",args:[t],statusCodes:[Se.positive],mimeTypes:[O.json]})}getNegativeResponse(){return _t(this.#t,{variant:"negative",args:[],statusCodes:[Se.negative],mimeTypes:[O.json]})}},je=new ne({positive:e=>{let t=J({schema:e}),r=M.z.object({status:M.z.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:M.z.object({status:M.z.literal("error"),error:M.z.object({message:M.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=he(e);return Ye(a,i,o,t),void n.status(a.statusCode).json({status:"error",error:{message:xe(a)}})}n.status(Se.positive).json({status:"success",data:r})}}),xt=new ne({positive:e=>{let t=J({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof M.z.ZodArray?e.shape.items:M.z.array(M.z.any());return t.reduce((o,n)=>ue(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:M.z.string().example("Sample error message"),handler:({response:e,output:t,error:r,logger:o,request:n,input:i})=>{if(r){let a=he(r);return Ye(a,o,n,i),void e.status(a.statusCode).type("text/plain").send(xe(a))}if(t&&"items"in t&&Array.isArray(t.items))return void e.status(Se.positive).json(t.items);throw new Error("Property 'items' is missing in the endpoint output")}});var se=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 L?t:new L(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new ve(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new L({handler:t})),this.resultHandler)}build({input:t=tr.z.object({}),handler:r,output:o,description:n,shortDescription:i,operationId:a,scope:c,tag:d,method:p}){let{middlewares:l,resultHandler:u}=this,y=typeof p=="string"?[p]:p,b=typeof a=="function"?a:()=>a,P=typeof c=="string"?[c]:c||[],R=typeof d=="string"?[d]:d||[];return new ht({handler:r,middlewares:l,outputSchema:o,resultHandler:u,scopes:P,tags:R,methods:y,getOperationId:b,description:n,shortDescription:i,inputSchema:Zr(l,t)})}buildVoid({handler:t,...r}){return this.build({...r,output:tr.z.object({}),handler:async o=>(await t(o),{})})}},vr=new se(je),Nr=new se(xt);var v=require("ansis"),Kr=require("node:util"),rr=require("node:perf_hooks");var St={debug:10,info:20,warn:30,error:40},kr=e=>ue(e)&&Object.keys(St).some(t=>t in e),Lr=e=>e in St,Mr=(e,t)=>St[e]<St[t],Hr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),bt=Hr(),jr=Hr(2),On=e=>e<1e-6?["picosecond",e/1e-9,bt]:e<.001?["nanosecond",e/1e-6,bt]:e<1?["microsecond",e/.001,bt]:e<1e3?["millisecond",e,bt]:e<6e4?["second",e/1e3,jr]:["minute",e/6e4,jr],Ur=e=>{let[t,r,o]=On(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var ke=class e{config;styles={debug:v.blue,info:v.green,warn:(0,v.hex)("#FFA500"),error:v.red};constructor(t={}){let{color:r=new v.Ansis().isSupported(),level:o=Ee()?"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:c}=this.config;if(n==="silent"||Mr(t,n))return;let d=[new Date().toISOString()];i&&d.push(c?(0,v.cyanBright)(i):i),d.push(c?`${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=rr.performance.now();return()=>{let o=rr.performance.now()-r,{message:n,severity:i="debug",formatter:a=Ur}=typeof t=="object"?t:{message:t};this.print(typeof i=="function"?i(o):i,n,a(o))}}};var Me=require("ramda");var Le=class extends Ne{entries;constructor(t){super();let r=[],o=(0,Me.keys)(t);for(let n of o){let i=t[n];i&&r.push([n,i,(0,Me.reject)((0,Me.equals)(n),o)])}this.entries=Object.freeze(r)}};var Dr=z(require("express"),1),He=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Dr.default.static(...this.params))}};var Ot=z(require("express"),1),so=z(require("node:http"),1),io=z(require("node:https"),1);var Ue=async(e,t="default")=>{try{return(await Promise.resolve().then(()=>z(require(e))))[t]}catch{}throw new we(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{Vt(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(O.json))try{Vt(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 Fr=(e,t)=>Object.entries(e).map(([r,o])=>{if(r.includes("/"))throw new me(`The entry '${r}' must avoid having slashes \u2014 use nesting instead.`);let n=r.trim();return[`${t||""}${n?`/${n}`:""}`,o]}),Ke=({routing:e,onEndpoint:t,onStatic:r})=>{let o=Fr(e);for(;o.length;){let[n,i]=o.shift();if(i instanceof Qe){let a=i.getMethods()||["get"];for(let c of a)t(i,n,c)}else if(i instanceof He)r&&i.apply(n,r);else if(i instanceof Le)for(let[a,c,d]of i.entries){let p=c.getMethods();if(p&&!p.includes(a))throw new me(`Endpoint assigned to ${a} method of ${n} must support ${a} method.`);t(c,n,a,d)}else o.unshift(...Fr(i,n))}};var or=({app:e,getLogger:t,config:r,routing:o,parsers:n})=>{let i=new Tt(t()),a=new Set;Ke({routing:o,onEndpoint:(d,p,l,u)=>{Ee()||i.check(d,{path:p,method:l});let y=n?.[d.getRequestType()]||[],b=async(P,R)=>{let h=t(P);if(r.cors){let D={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":[l,...u||[],"options"].join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"},$=typeof r.cors=="function"?await r.cors({request:P,endpoint:d,logger:h,defaultHeaders:D}):D;for(let Q in $)R.set(Q,$[Q])}return d.execute({request:P,response:R,logger:h,config:r})};r.cors&&!a.has(p)&&(e.options(p,...y,b),a.add(p)),e[l](p,...y,b)},onStatic:e.use.bind(e)})};var We=z(require("http-errors"),1);var _r=require("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",qr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",$r=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Gr=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),Vr=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var Jr=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,i=p=>void n.delete(p.destroy()),a=p=>void(Br(p)?!p._httpMessage.headersSent&&p._httpMessage.setHeader("connection","close"):i(p)),c=p=>void(o?p.destroy():n.add(p.once("close",()=>void n.delete(p))));for(let p of e)for(let l of["connection","secureConnection"])p.on(l,c);let d=async()=>{for(let p of e)p.on("request",Gr);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let p of n)($r(p)||qr(p))&&a(p);for await(let p of(0,_r.setInterval)(10,Date.now()))if(n.size===0||Date.now()-p>=t)break;for(let p of n)i(p);return Promise.allSettled(e.map(Vr))};return{sockets:n,shutdown:()=>o??=d()}};var Yr=({errorHandler:e,getLogger:t})=>async(r,o,n,i)=>r?e.execute({error:(0,We.isHttpError)(r)?r:(0,We.default)(400,te(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):i(),Qr=({errorHandler:e,getLogger:t})=>async(r,o)=>{let n=(0,We.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){yt({response:o,logger:i,error:new X(te(a),n)})}},Rn=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},An=e=>({log:e.debug.bind(e)}),Wr=async({getLogger:e,config:t})=>{let r=await Ue("express-fileupload"),{limitError:o,beforeUpload:n,...i}={...typeof t.upload=="object"&&t.upload},a=[];return a.push(async(c,d,p)=>{let l=e(c);try{await n?.({request:c,logger:l})}catch(u){return p(u)}return r({debug:!0,...i,abortOnLimit:!1,parseNested:!0,logger:An(l)})(c,d,p)}),o&&a.push(Rn(o)),a},Xr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},eo=({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()},to=e=>t=>t?.res?.locals[x]?.logger||e,ro=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
3
+ `).slice(1))),oo=({servers:e,logger:t,options:{timeout:r,events:o=["SIGINT","SIGTERM"]}})=>{let n=Jr(e,{logger:t,timeout:r}),i=()=>n.shutdown().then(()=>process.exit());for(let a of o)process.on(a,i)};var N=require("ansis"),no=e=>{if(e.columns<132)return;let t=(0,N.italic)("Proudly supports transgender community.".padStart(109)),r=(0,N.italic)("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),o=(0,N.italic)("Thank you for choosing Express Zod API for your project.".padStart(132)),n=(0,N.italic)("for Kesaria".padEnd(20)),i=(0,N.hex)("#F5A9B8"),a=(0,N.hex)("#5BCEFA"),c=new Array(14).fill(a,1,3).fill(i,3,5).fill(N.whiteBright,5,7).fill(i,7,9).fill(a,9,12).fill(N.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
@@ -14,9 +14,10 @@ Original error: ${e.handled.message}.`:""),{expose:(0,ft.isHttpError)(e.cause)?e
14
14
  ${n}888${r}
15
15
  ${o}
16
16
  `;e.write(d.split(`
17
- `).map((c,u)=>p[u]?p[u](c):c).join(`
18
- `))};var so=e=>{e.startupLogo!==!1&&ro(process.stdout);let t=e.errorHandler||Ze,r=vr(e.logger)?e.logger:new Ne(e.logger);r.debug("Running",{build:"v21.3.0 (CJS)",env:process.env.NODE_ENV||"development"}),eo(r);let o=Qr({logger:r,config:e}),i={getLogger:Xr(r),errorHandler:t},a=Yr(i),p=_r(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},io=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=so(e);return tr({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},ao=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=so(e),p=(0,Rt.default)().disable("x-powered-by").use(a);if(e.compression){let f=await Le("compression");p.use(f(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||Rt.default.json()],raw:[e.rawParser||Rt.default.raw(),Wr],upload:e.upload?await Jr({config:e,getLogger:o}):[]};await e.beforeRouting?.({app:p,getLogger:o}),tr({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(i,n);let c=[],u=(f,b)=>()=>f.listen(b,()=>r.info("Listening",b)),m=[];if(e.http){let f=oo.default.createServer(p);c.push(f),m.push(u(f,e.http.listen))}if(e.https){let f=no.default.createServer(e.https.options,p);c.push(f),m.push(u(f,e.https.listen))}return e.gracefulShutdown&&to({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:m.map(f=>f())}};var Ao=require("openapi3-ts/oas31"),It=require("ramda");var Y=require("openapi3-ts/oas31"),l=require("ramda"),S=require("zod");var ge=(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=>ge(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 po=50,lo="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",On={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},mo=/:([A-Za-z0-9_]+)/g,Rn=e=>e.match(mo)?.map(t=>t.slice(1))||[],uo=e=>e.replace(mo,t=>`{${t.slice(1)}}`),An=({_def:e},{next:t})=>({...t(e.innerType),default:e[x]?.defaultLabel||e.defaultValue()}),Pn=({_def:{innerType:e}},{next:t})=>t(e),wn=()=>({format:"any"}),In=({},e)=>{if(e.isResponse)throw new N("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},zn=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"}},Cn=({options:e},{next:t})=>({oneOf:e.map(t)}),Zn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),En=(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")},Nn=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)(En,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,l.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=ce(t.examples||[],r.examples||[],([n,i])=>(0,l.mergeDeepRight)(n,i))),o},vn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Nn(o)}catch{}return{allOf:o}},jn=(e,{next:t})=>t(e.unwrap()),kn=(e,{next:t})=>t(e.unwrap()),Ln=(e,{next:t})=>{let r=t(e.unwrap());return(0,Y.isSchemaObject)(r)&&(r.type=fo(r)),r},yo=e=>{let t=(0,l.toLower)((0,l.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},co=e=>({type:yo(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Mn=({value:e})=>({type:yo(e),const:e}),Un=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&$e(p)?p instanceof S.z.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=At(e,r)),i.length&&(a.required=i),a},Hn=()=>({type:"null"}),Kn=({},e)=>{if(e.isResponse)throw new N("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:lo}}},Dn=({},e)=>{if(!e.isResponse)throw new N("Please use ez.dateIn() for input.",e);return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:lo}}},Fn=({},e)=>{throw new N(`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)},Bn=()=>({type:"boolean"}),qn=()=>({type:"integer",format:"bigint"}),$n=e=>e.every(t=>t instanceof S.z.ZodLiteral),Gn=({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=At(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:At(S.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof S.z.ZodUnion&&$n(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:At(S.z.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},Vn=({_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},_n=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Yn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:m}})=>{let f=m.find(C=>C.kind==="regex"),b=m.find(C=>C.kind==="datetime"),R=f?f.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,A={type:"string"},h={"date-time":u,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let C in h)if(h[C]){A.format=C;break}return r!==null&&(A.minLength=r),o!==null&&(A.maxLength=o),R&&(A.pattern=R.source),A},Jn=({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},At=({shape:e},t)=>(0,l.map)(t,e),Wn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return On?.[t]},fo=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",Qn=(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=pt(e,Wn(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},Xn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),es=(e,{next:t})=>t(e.unwrap()),ts=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),rs=(e,{next:t})=>t(e.unwrap().shape.raw),go=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,ho=(e,t,r=[])=>(0,l.pipe)(V,(0,l.map)((0,l.when)(o=>(0,l.type)(o)==="Object",(0,l.omit)(r))),go)({schema:e,variant:t?"parsed":"original",validate:!0}),os=(e,t)=>(0,l.pipe)(V,(0,l.filter)((0,l.has)(t)),(0,l.pluck)(t),go)({schema:e,variant:"original",validate:!0}),he=e=>e instanceof S.z.ZodObject?e:e instanceof S.z.ZodBranded?he(e.unwrap()):e instanceof S.z.ZodUnion||e instanceof S.z.ZodDiscriminatedUnion?e.options.map(t=>he(t)).reduce((t,r)=>t.merge(r.partial()),S.z.object({})):e instanceof S.z.ZodEffects?he(e._def.schema):e instanceof S.z.ZodPipeline?he(e._def.in):he(e._def.left).merge(he(e._def.right)),xo=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=he(r),c=Rn(e),u=o.includes("query"),m=o.includes("params"),f=o.includes("headers"),b=h=>m&&c.includes(h),R=h=>f&&Ft(h);return Object.keys(d).map(h=>({name:h,location:b(h)?"path":R(h)?"header":u?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:C})=>{let k=ge(d[h],{rules:{...a,...or},onEach:nr,onMissing:sr,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),K=i==="components"?n(d[h],k,te(p,h)):k;return{name:h,in:C,required:!d[h].isOptional(),description:k.description||p,schema:K,examples:os(r,h)}})},or={ZodString:Yn,ZodNumber:Jn,ZodBigInt:qn,ZodBoolean:Bn,ZodNull:Hn,ZodArray:Vn,ZodTuple:_n,ZodRecord:Gn,ZodObject:Un,ZodLiteral:Mn,ZodIntersection:vn,ZodUnion:Cn,ZodAny:wn,ZodDefault:An,ZodEnum:co,ZodNativeEnum:co,ZodEffects:Qn,ZodOptional:jn,ZodNullable:Ln,ZodDiscriminatedUnion:Zn,ZodBranded:es,ZodDate:Fn,ZodCatch:Pn,ZodPipeline:Xn,ZodLazy:ts,ZodReadonly:kn,[F]:zn,[Ae]:In,[ue]:Dn,[me]:Kn,[re]:rs},nr=(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&&$e(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},sr=(e,t)=>{throw new N(`Zod type ${e.constructor.name} is unsupported.`,t)},rr=(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=>rr(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>rr(o,t))),r},bo=e=>(0,Y.isReferenceObject)(e)?e:(0,l.omit)(["examples"],e),So=({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} ${Bt(n)} response ${p?d:""}`.trim()})=>{if(!o)return{description:u};let m=bo(ge(r,{rules:{...c,...or},onEach:nr,onMissing:sr,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),f={schema:a==="components"?i(r,m,te(u)):m,examples:ho(r,!0)};return{description:u,content:(0,l.fromPairs)((0,l.xprod)(o,[f]))}},ns=()=>({type:"http",scheme:"basic"}),ss=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},is=({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},as=({name:e})=>({type:"apiKey",in:"header",name:e}),ps=({name:e})=>({type:"apiKey",in:"cookie",name:e}),cs=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),ds=({flows:e={}})=>({type:"oauth2",flows:(0,l.map)(t=>({...t,scopes:t.scopes||{}}),(0,l.reject)(l.isNil,e))}),To=(e,t)=>{let r={basic:ns,bearer:ss,input:is,header:as,cookie:ps,openid:cs,oauth2:ds};return ht(e,o=>r[o.type](o,t))},Pt=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?Pt(Yt(e)):Pt({or:[e]}),Oo=({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=bo(rr(ge(r,{rules:{...a,...or},onEach:nr,onMissing:sr,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),p)),u={schema:i==="components"?n(r,c,te(d)):c,examples:ho(r,!1,p)};return{description:d,content:{[o]:u}}},Ro=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}),ir=e=>e.length<=po?e:e.slice(0,po-1)+"\u2026";var wt=class extends Ao.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=(0,It.keys)(fe);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||te(r,t),i=this.lastOperationIdSuffixes.get(n);if(i===void 0)return this.lastOperationIdSuffixes.set(n,1),n;if(o)throw new N(`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});Me({routing:t,onEndpoint:(m,f,b)=>{let R={path:f,method:b,endpoint:m,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[A,h]=["short","long"].map(m.getDescription.bind(m)),C=A?ir(A):d&&h?ir(h):void 0,k=m.getTags(),K=r.inputSources?.[b]||Kt[b],B=this.ensureUniqOperationId(f,b,m.getOperationId(b)),Fe=xo({...R,inputSources:K,schema:m.getSchema("input"),description:a?.requestParameter?.call(null,{method:b,path:f,operationId:B})}),et={};for(let q of this.responseVariants){let ne=m.getResponses(q);for(let{mimeTypes:Be,schema:Ht,statusCodes:rt}of ne)for(let qe of rt)et[qe]=So({...R,variant:q,schema:Ht,mimeTypes:Be,statusCode:qe,hasMultipleStatusCodes:ne.length>1||rt.length>1,description:a?.[`${q}Response`]?.call(null,{method:b,path:f,operationId:B,statusCode:qe})})}let Ut=K.includes("body")?Oo({...R,paramNames:(0,It.pluck)("name",Fe),schema:m.getSchema("input"),mimeType:P[m.getRequestType()],description:a?.requestBody?.call(null,{method:b,path:f,operationId:B})}):void 0,tt=Pt(ht(To(m.getSecurity(),K),q=>{let ne=this.ensureUniqSecuritySchemaName(q),Be=["oauth2","openIdConnect"].includes(q.type)?m.getScopes().slice():[];return this.addSecurityScheme(ne,q),{name:ne,scopes:Be}}));this.addPath(uo(f),{[b]:{operationId:B,summary:C,description:h,tags:k.length>0?k:void 0,parameters:Fe.length>0?Fe:void 0,requestBody:Ut,security:tt.length>0?tt:void 0,responses:et}})}}),this.rootDoc.tags=r.tags?Ro(r.tags):[]}};var zt=require("node-mocks-http"),ls=e=>(0,zt.createRequest)({...e,headers:{"content-type":P.json,...e?.headers}}),ms=e=>(0,zt.createResponse)(e),us=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)}})},Po=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=ls(e),i=ms({req:n,...t});i.req=t?.req||n,n.res=i;let a=us(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},wo=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=Po(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},Io=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:p}=Po(o),d=at(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 z=Z(require("typescript"),1),qo=require("zod");var O=Z(require("typescript"),1),s=O.default.factory,xe=[s.createModifier(O.default.SyntaxKind.ExportKeyword)],ys=[s.createModifier(O.default.SyntaxKind.AsyncKeyword)],fs=[s.createModifier(O.default.SyntaxKind.PublicKeyword)],zo=[s.createModifier(O.default.SyntaxKind.ProtectedKeyword),s.createModifier(O.default.SyntaxKind.ReadonlyKeyword)],Co=s.createToken(O.default.SyntaxKind.DotDotDotToken),gs=s.createTemplateHead(""),hs=s.createTemplateMiddle(" "),Qe=s.createTemplateTail(""),Ue=s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[s.createKeywordTypeNode(O.default.SyntaxKind.StringKeyword),s.createKeywordTypeNode(O.default.SyntaxKind.AnyKeyword)]),xs=e=>s.createTemplateLiteralType(gs,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?Qe:hs))),Ct=xs(["M","P"]),Zt=(e,t,r)=>s.createParameterDeclaration(Array.isArray(r)?r:void 0,Array.isArray(r)?void 0:r,e,void 0,t,void 0),He=(e,t)=>Object.entries(e).map(([r,o])=>Zt(s.createIdentifier(r),o,t)),Zo=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),Eo=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),No=(...e)=>s.createArrayBindingPattern(e.map(t=>s.createBindingElement(void 0,void 0,t))),U=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],O.default.NodeFlags.Const),ar=(e,t)=>Xe(e,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),Xe=(e,t)=>s.createTypeAliasDeclaration(xe,e,void 0,t),Et=(e,t,r,o,n)=>s.createMethodDeclaration(fs,void 0,e,void 0,o,t,n,r),vo=(e,t,r)=>s.createClassDeclaration(xe,e,void 0,void 0,[t,...r]),jo=(e,t,r)=>s.createConditionalTypeNode(t,s.createTypeOperatorNode(O.default.SyntaxKind.KeyOfKeyword,s.createTypeReferenceNode(e)),s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t),r),Nt=e=>s.createTypeReferenceNode(Promise.name,[e==="any"?s.createKeywordTypeNode(O.default.SyntaxKind.AnyKeyword):e]),ko=(e,t)=>s.createInterfaceDeclaration(xe,e,void 0,void 0,t),pr=e=>Object.entries(e).map(([t,r])=>s.createTypeParameterDeclaration([],t,s.createTypeReferenceNode(r))),Lo=(e,t,r)=>s.createArrowFunction(r?ys:void 0,void 0,e.map(o=>Zt(o)),void 0,void 0,t),cr=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier(Object.name),I("keys")),void 0,[e]),I("reduce")),void 0,[s.createArrowFunction(void 0,void 0,He({acc:void 0,key:void 0}),void 0,void 0,t),r]),Mo=(...e)=>`"${e.join(" ")}"`,I=e=>e,Ke=(e,t,r)=>s.createConditionalExpression(e,s.createToken(O.default.SyntaxKind.QuestionToken),t,s.createToken(O.default.SyntaxKind.ColonToken),r),H=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(Array.isArray(e)?s.createPropertyAccessExpression(...e):e,t),void 0,r),Uo=(e,t)=>s.createBinaryExpression(e,s.createToken(O.default.SyntaxKind.AmpersandAmpersandToken),t),Ho=(e,t)=>s.createBinaryExpression(e,s.createToken(O.default.SyntaxKind.EqualsEqualsEqualsToken),t);var Ko=["get","post","put","delete","patch"];var kt=require("ramda"),g=Z(require("typescript"),1),jt=require("zod");var T=Z(require("typescript"),1),{factory:vt}=T.default,De=(e,t)=>T.default.addSyntheticLeadingComment(e,T.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),be=(e,t,r)=>{let o=vt.createTypeAliasDeclaration(void 0,vt.createIdentifier(t),void 0,e);return r?De(o,r):o},dr=(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)},bs=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Do=e=>bs.test(e)?vt.createIdentifier(e):vt.createStringLiteral(e),Ss=[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],Fo=e=>Ss.includes(e.kind);var{factory:y}=g.default,Ts={[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},Os=({value:e})=>y.createLiteralTypeNode(typeof e=="number"?y.createNumericLiteral(e):typeof e=="boolean"?e?y.createTrue():y.createFalse():y.createStringLiteral(e)),Rs=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&$e(a)?a instanceof jt.z.ZodOptional:a.isOptional(),d=y.createPropertySignature(void 0,Do(i),p&&o?y.createToken(g.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description?De(d,a.description):d});return y.createTypeLiteralNode(n)},As=({element:e},{next:t})=>y.createArrayTypeNode(t(e)),Ps=({options:e})=>y.createUnionTypeNode(e.map(t=>y.createLiteralTypeNode(y.createStringLiteral(t)))),Bo=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(Fo(n)?n.kind:n,n)}return y.createUnionTypeNode(Array.from(r.values()))},ws=e=>Ts?.[e.kind],Is=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=pt(e,ws(o)),i={number:g.default.SyntaxKind.NumberKeyword,bigint:g.default.SyntaxKind.BigIntKeyword,boolean:g.default.SyntaxKind.BooleanKeyword,string:g.default.SyntaxKind.StringKeyword,undefined:g.default.SyntaxKind.UndefinedKeyword,object:g.default.SyntaxKind.ObjectKeyword};return y.createKeywordTypeNode(n&&i[n]||g.default.SyntaxKind.AnyKeyword)}return o},zs=e=>y.createUnionTypeNode(Object.values(e.enum).map(t=>y.createLiteralTypeNode(typeof t=="number"?y.createNumericLiteral(t):y.createStringLiteral(t)))),Cs=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?y.createUnionTypeNode([o,y.createKeywordTypeNode(g.default.SyntaxKind.UndefinedKeyword)]):o},Zs=(e,{next:t})=>y.createUnionTypeNode([t(e.unwrap()),y.createLiteralTypeNode(y.createNull())]),Es=({items:e,_def:{rest:t}},{next:r})=>y.createTupleTypeNode(e.map(r).concat(t===null?[]:y.createRestTypeNode(r(t)))),Ns=({keySchema:e,valueSchema:t},{next:r})=>y.createExpressionWithTypeArguments(y.createIdentifier("Record"),[e,t].map(r)),vs=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(g.default.isTypeLiteralNode)?y.createTypeLiteralNode((0,kt.chain)((0,kt.prop)("members"),o)):y.createIntersectionTypeNode(o)},js=({_def:e},{next:t})=>t(e.innerType),oe=e=>()=>y.createKeywordTypeNode(e),ks=(e,{next:t})=>t(e.unwrap()),Ls=(e,{next:t})=>t(e.unwrap()),Ms=({_def:e},{next:t})=>t(e.innerType),Us=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Hs=()=>y.createLiteralTypeNode(y.createNull()),Ks=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),Ds=e=>{let t=e.unwrap(),r=y.createKeywordTypeNode(g.default.SyntaxKind.StringKeyword),o=y.createTypeReferenceNode("Buffer"),n=y.createUnionTypeNode([r,o]);return t instanceof jt.z.ZodString?r:t instanceof jt.z.ZodUnion?n:o},Fs=(e,{next:t})=>t(e.unwrap().shape.raw),Bs={ZodString:oe(g.default.SyntaxKind.StringKeyword),ZodNumber:oe(g.default.SyntaxKind.NumberKeyword),ZodBigInt:oe(g.default.SyntaxKind.BigIntKeyword),ZodBoolean:oe(g.default.SyntaxKind.BooleanKeyword),ZodAny:oe(g.default.SyntaxKind.AnyKeyword),ZodUndefined:oe(g.default.SyntaxKind.UndefinedKeyword),[me]:oe(g.default.SyntaxKind.StringKeyword),[ue]:oe(g.default.SyntaxKind.StringKeyword),ZodNull:Hs,ZodArray:As,ZodTuple:Es,ZodRecord:Ns,ZodObject:Rs,ZodLiteral:Os,ZodIntersection:vs,ZodUnion:Bo,ZodDefault:js,ZodEnum:Ps,ZodNativeEnum:zs,ZodEffects:Is,ZodOptional:Cs,ZodNullable:Zs,ZodDiscriminatedUnion:Bo,ZodBranded:ks,ZodCatch:Ms,ZodPipeline:Us,ZodLazy:Ks,ZodReadonly:Ls,[F]:Ds,[re]:Fs},Lt=(e,{brandHandling:t,ctx:r})=>ge(e,{rules:{...t,...Bs},onMissing:()=>y.createKeywordTypeNode(g.default.SyntaxKind.AnyKeyword),ctx:r});var Mt=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"),requestParameter:s.createIdentifier("request"),args:s.createIdentifier("args"),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"),contentTypeConst:s.createIdentifier("contentType"),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,be(n,o)),this.aliases.set(t,be(r(),o))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0},noContent:i=qo.z.undefined()}){let a={makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},p={brandHandling:r,ctx:{...a,isResponse:!1}},d={brandHandling:r,ctx:{...a,isResponse:!0}};Me({routing:t,onEndpoint:($,se,ot)=>{let[nt,Se,ie,J]=["input","positive.response","negative.response","response"].map(L=>te(ot,se,L)),Jo=Lt($.getSchema("input"),p),Wo=$.getResponses("positive").map(({schema:L,mimeTypes:ae})=>ae?L:i).reduce((L,ae)=>L.or(ae)),Qo=Lt(Wo,d),Xo=$.getResponses("negative").map(({schema:L,mimeTypes:ae})=>ae?L:i).reduce((L,ae)=>L.or(ae)),en=Lt(Xo,d),tn=s.createUnionTypeNode([s.createTypeReferenceNode(Se),s.createTypeReferenceNode(ie)]);this.program.push(be(Jo,nt),be(Qo,Se),be(en,ie),be(tn,J)),this.paths.push(se),this.registry.set({method:ot,path:se},{input:nt,positive:Se,negative:ie,response:J,isJson:$.getResponses("positive").some(L=>L.mimeTypes?.includes(P.json)),tags:$.getTags()})}}),this.program.unshift(...this.aliases.values()),this.program.push(ar(this.ids.pathType,this.paths)),this.program.push(ar(this.ids.methodType,Ko)),this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]},{id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]},{id:this.ids.responseInterface,kind:"response",props:[]});let c=[],u=[];for(let[{method:$,path:se},{isJson:ot,tags:nt,...Se}]of this.registry){let ie=Mo($,se);for(let J of this.interfaces)J.kind in Se&&J.props.push(Eo(ie,Se[J.kind]));o!=="types"&&(ot&&c.push(s.createPropertyAssignment(ie,s.createTrue())),u.push(s.createPropertyAssignment(ie,s.createArrayLiteralExpression(nt.map(J=>s.createStringLiteral(J))))))}for(let{id:$,props:se}of this.interfaces)this.program.push(ko($,se));if(this.program.push(Xe(this.ids.methodPathType,s.createTypeOperatorNode(z.default.SyntaxKind.KeyOfKeyword,s.createTypeReferenceNode(this.ids.inputInterface)))),o==="types")return;let m=s.createVariableStatement(xe,U(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(c))),f=s.createVariableStatement(xe,U(this.ids.endpointTagsConst,s.createObjectLiteralExpression(u))),b=Xe(this.ids.implementationType,s.createFunctionTypeNode(void 0,He({[this.ids.methodParameter.text]:s.createTypeReferenceNode(this.ids.methodType),[this.ids.pathParameter.text]:s.createKeywordTypeNode(z.default.SyntaxKind.StringKeyword),[this.ids.paramsArgument.text]:Ue}),Nt("any"))),R=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,Qe)]),A=cr(this.ids.paramsArgument,H(this.ids.accumulator,I("replace"),[R,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),h=cr(this.ids.paramsArgument,H(s.createIdentifier(Object.name),I("assign"),[this.ids.accumulator,Uo(s.createPrefixUnaryExpression(z.default.SyntaxKind.ExclamationToken,H(this.ids.pathParameter,I("includes"),[R])),s.createObjectLiteralExpression([s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))],!1))]),s.createObjectLiteralExpression()),C=De(Et(this.ids.provideMethod,He({[this.ids.methodParameter.text]:s.createTypeReferenceNode("M"),[this.ids.pathParameter.text]:s.createTypeReferenceNode("P"),[this.ids.paramsArgument.text]:s.createConditionalTypeNode(Ct,s.createTypeOperatorNode(z.default.SyntaxKind.KeyOfKeyword,s.createTypeReferenceNode(this.ids.inputInterface)),s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Ct),Ue)}),void 0,pr({M:this.ids.methodType,P:this.ids.pathType}),Nt(jo(this.ids.responseInterface,Ct,s.createKeywordTypeNode(z.default.SyntaxKind.UnknownKeyword)))),"@deprecated use the overload with 2 arguments instead"),k=Et(this.ids.provideMethod,He({[this.ids.requestParameter.text]:s.createTypeReferenceNode("K"),[this.ids.paramsArgument.text]:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),s.createTypeReferenceNode("K"))}),void 0,pr({K:this.ids.methodPathType}),Nt(s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.responseInterface),s.createTypeReferenceNode("K")))),K=Et(this.ids.provideMethod,He({[this.ids.args.text]:s.createUnionTypeNode([s.createTupleTypeNode([s.createKeywordTypeNode(z.default.SyntaxKind.StringKeyword),s.createKeywordTypeNode(z.default.SyntaxKind.StringKeyword),Ue]),s.createTupleTypeNode([s.createKeywordTypeNode(z.default.SyntaxKind.StringKeyword),Ue])])},Co),s.createBlock([s.createVariableStatement(void 0,U(No(this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument),s.createAsExpression(s.createParenthesizedExpression(Ke(Ho(s.createPropertyAccessExpression(this.ids.args,I("length")),s.createNumericLiteral(2)),s.createArrayLiteralExpression([s.createSpreadElement(H(s.createElementAccessExpression(this.ids.args,0),I("split"),[s.createRegularExpressionLiteral("/ (.+)/"),s.createNumericLiteral(2)])),s.createElementAccessExpression(this.ids.args,1)]),this.ids.args)),s.createTupleTypeNode([s.createTypeReferenceNode(this.ids.methodType),s.createTypeReferenceNode(this.ids.pathType),Ue])))),s.createReturnStatement(H(s.createThis(),this.ids.implementationArgument,[this.ids.methodParameter,A,h]))])),B=vo(this.ids.clientClass,Zo([Zt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),zo)]),[C,k,K]),Fe=De(Xe(this.ids.providerType,s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.clientClass),s.createLiteralTypeNode(s.createStringLiteral(this.ids.provideMethod.text)))),"@deprecated will be removed in v22");this.program.push(m,f,b,B,Fe);let et=s.createPropertyAssignment(this.ids.methodParameter,H(this.ids.methodParameter,I("toUpperCase"))),Ut=s.createPropertyAssignment(this.ids.headersProperty,Ke(this.ids.hasBodyConst,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(P.json))]),this.ids.undefinedValue)),tt=s.createPropertyAssignment(this.ids.bodyProperty,Ke(this.ids.hasBodyConst,H(s.createIdentifier("JSON"),I("stringify"),[this.ids.paramsArgument]),this.ids.undefinedValue)),q=s.createVariableStatement(void 0,U(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier(fetch.name),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,Qe)]),s.createObjectLiteralExpression([et,Ut,tt])])))),ne=s.createVariableStatement(void 0,U(this.ids.hasBodyConst,s.createLogicalNot(H(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),I("includes"),[this.ids.methodParameter])))),Be=s.createVariableStatement(void 0,U(this.ids.searchParamsConst,Ke(this.ids.hasBodyConst,s.createStringLiteral(""),s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier(URLSearchParams.name),void 0,[this.ids.paramsArgument]),Qe)])))),Ht=s.createVariableStatement(void 0,U(this.ids.contentTypeConst,H([this.ids.responseConst,this.ids.headersProperty],I("get"),[s.createStringLiteral("content-type")]))),rt=s.createIfStatement(s.createPrefixUnaryExpression(z.default.SyntaxKind.ExclamationToken,this.ids.contentTypeConst),s.createReturnStatement(void 0),void 0),qe=s.createVariableStatement(void 0,U(this.ids.isJsonConst,s.createCallChain(s.createPropertyAccessChain(this.ids.contentTypeConst,void 0,I("startsWith")),void 0,void 0,[s.createStringLiteral(P.json)]))),Go=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,Ke(this.ids.isJsonConst,s.createStringLiteral(I("json")),s.createStringLiteral(I("text")))),void 0,[])),Vo=s.createVariableStatement(xe,U(this.ids.exampleImplementationConst,Lo([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([ne,Be,q,Ht,rt,qe,Go]),!0),s.createTypeReferenceNode(this.ids.implementationType))),_o=s.createExpressionStatement(H(this.ids.clientConst,this.ids.provideMethod,[s.createStringLiteral("get /v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),Yo=s.createVariableStatement(void 0,U(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(Vo,Yo,_o)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:dr(r,t)).join(`
19
- `):void 0}print(t){let r=this.printUsage(t),o=r&&z.default.addSyntheticLeadingComment(z.default.addSyntheticLeadingComment(s.createEmptyStatement(),z.default.SyntaxKind.SingleLineCommentTrivia," Usage example:"),z.default.SyntaxKind.MultiLineCommentTrivia,`
20
- ${r}`);return this.program.concat(o||[]).map((n,i)=>dr(n,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
17
+ `).map((p,l)=>c[l]?c[l](p):p).join(`
18
+ `))};var ao=e=>{e.startupLogo!==!1&&no(process.stdout);let t=e.errorHandler||je,r=kr(e.logger)?e.logger:new ke(e.logger);r.debug("Running",{build:"v21.5.0 (CJS)",env:process.env.NODE_ENV||"development"}),ro(r);let o=eo({logger:r,config:e}),i={getLogger:to(r),errorHandler:t},a=Qr(i),c=Yr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:c,loggingMiddleware:o}},po=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=ao(e);return or({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},co=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=ao(e),c=(0,Ot.default)().disable("x-powered-by").use(a);if(e.compression){let y=await Ue("compression");c.use(y(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||Ot.default.json()],raw:[e.rawParser||Ot.default.raw(),Xr],upload:e.upload?await Wr({config:e,getLogger:o}):[]};await e.beforeRouting?.({app:c,getLogger:o}),or({app:c,routing:t,getLogger:o,config:e,parsers:d}),c.use(i,n);let p=[],l=(y,b)=>()=>y.listen(b,()=>r.info("Listening",b)),u=[];if(e.http){let y=so.default.createServer(c);p.push(y),u.push(l(y,e.http.listen))}if(e.https){let y=io.default.createServer(e.https.options,c);p.push(y),u.push(l(y,e.https.listen))}return e.gracefulShutdown&&oo({logger:r,servers:p,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:c,logger:r,servers:u.map(y=>y())}};var wo=require("openapi3-ts/oas31"),wt=require("ramda");var Y=require("openapi3-ts/oas31"),m=require("ramda"),S=require("zod");var Te=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[x]?.brand]||r[e._def.typeName],c=i?i(e,{...n,next:p=>Te(p,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:c,...n});return d?{...c,...d}:c};var mo=50,uo="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Pn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},fo=/:([A-Za-z0-9_]+)/g,wn=e=>e.match(fo)?.map(t=>t.slice(1))||[],yo=e=>e.replace(fo,t=>`{${t.slice(1)}}`),En=({_def:e},{next:t})=>({...t(e.innerType),default:e[x]?.defaultLabel||e.defaultValue()}),In=({_def:{innerType:e}},{next:t})=>t(e),zn=()=>({format:"any"}),Cn=({},e)=>{if(e.isResponse)throw new Z("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},Zn=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"}},vn=({options:e},{next:t})=>({oneOf:e.map(t)}),Nn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),jn=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return(0,m.concat)(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},kn=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,m.mergeDeepWith)(jn,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,m.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=le(t.examples||[],r.examples||[],([n,i])=>(0,m.mergeDeepRight)(n,i))),o},Ln=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return kn(o)}catch{}return{allOf:o}},Mn=(e,{next:t})=>t(e.unwrap()),Hn=(e,{next:t})=>t(e.unwrap()),Un=(e,{next:t})=>{let r=t(e.unwrap());return(0,Y.isSchemaObject)(r)&&(r.type=ho(r)),r},go=e=>{let t=(0,m.toLower)((0,m.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},lo=e=>({type:go(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Kn=({value:e})=>({type:go(e),const:e}),Dn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=c=>t&&Ve(c)?c instanceof S.z.ZodOptional:c.isOptional(),i=o.filter(c=>!n(e.shape[c])),a={type:"object"};return o.length&&(a.properties=Rt(e,r)),i.length&&(a.required=i),a},Fn=()=>({type:"null"}),Bn=({},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:uo}}},qn=({},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:uo}}},$n=({},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)},Gn=()=>({type:"boolean"}),Vn=()=>({type:"integer",format:"bigint"}),_n=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=Rt(S.z.object((0,m.fromPairs)((0,m.xprod)(o,[t]))),r),n.required=o),n}if(e instanceof S.z.ZodLiteral)return{type:"object",properties:Rt(S.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof S.z.ZodUnion&&_n(e.options)){let o=(0,m.map)(i=>`${i.value}`,e.options),n=(0,m.fromPairs)((0,m.xprod)(o,[t]));return{type:"object",properties:Rt(S.z.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},Yn=({_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},Qn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Wn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:c,isIP:d,isEmoji:p,isDatetime:l,_def:{checks:u}})=>{let y=u.find(I=>I.kind==="regex"),b=u.find(I=>I.kind==="datetime"),P=y?y.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"},h={"date-time":l,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:c,ip:d,emoji:p};for(let I in h)if(h[I]){R.format=I;break}return r!==null&&(R.minLength=r),o!==null&&(R.maxLength=o),P&&(R.pattern=P.source),R},Xn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(u=>u.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,c=o.find(u=>u.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,p=c?c.inclusive:!0,l={type:e?"integer":"number",format:e?"int64":"double"};return a?l.minimum=i:l.exclusiveMinimum=i,p?l.maximum=d:l.exclusiveMaximum=d,l},Rt=({shape:e},t)=>(0,m.map)(t,e),es=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Pn?.[t]},ho=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",ts=(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=at(e,es(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},rs=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),os=(e,{next:t})=>t(e.unwrap()),ns=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),ss=(e,{next:t})=>t(e.unwrap().shape.raw),xo=e=>e.length?(0,m.fromPairs)((0,m.zip)((0,m.range)(1,e.length+1).map(t=>`example${t}`),(0,m.map)((0,m.objOf)("value"),e))):void 0,bo=(e,t,r=[])=>(0,m.pipe)(J,(0,m.map)((0,m.when)(o=>(0,m.type)(o)==="Object",(0,m.omit)(r))),xo)({schema:e,variant:t?"parsed":"original",validate:!0}),is=(e,t)=>(0,m.pipe)(J,(0,m.filter)((0,m.has)(t)),(0,m.pluck)(t),xo)({schema:e,variant:"original",validate:!0}),Oe=e=>e instanceof S.z.ZodObject?e:e instanceof S.z.ZodBranded?Oe(e.unwrap()):e instanceof S.z.ZodUnion||e instanceof S.z.ZodDiscriminatedUnion?e.options.map(t=>Oe(t)).reduce((t,r)=>t.merge(r.partial()),S.z.object({})):e instanceof S.z.ZodEffects?Oe(e._def.schema):e instanceof S.z.ZodPipeline?Oe(e._def.in):Oe(e._def.left).merge(Oe(e._def.right)),So=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:c=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=Oe(r),p=wn(e),l=o.includes("query"),u=o.includes("params"),y=o.includes("headers"),b=h=>u&&p.includes(h),P=h=>y&&qt(h);return Object.keys(d).map(h=>({name:h,location:b(h)?"path":P(h)?"header":l?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:I})=>{let q=Te(d[h],{rules:{...a,...sr},onEach:ir,onMissing:ar,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),D=i==="components"?n(d[h],q,re(c,h)):q;return{name:h,in:I,required:!d[h].isOptional(),description:q.description||c,schema:D,examples:is(r,h)}})},sr={ZodString:Wn,ZodNumber:Xn,ZodBigInt:Vn,ZodBoolean:Gn,ZodNull:Fn,ZodArray:Yn,ZodTuple:Qn,ZodRecord:Jn,ZodObject:Dn,ZodLiteral:Kn,ZodIntersection:Ln,ZodUnion:vn,ZodAny:zn,ZodDefault:En,ZodEnum:lo,ZodNativeEnum:lo,ZodEffects:ts,ZodOptional:Mn,ZodNullable:Un,ZodDiscriminatedUnion:Nn,ZodBranded:os,ZodDate:$n,ZodCatch:In,ZodPipeline:rs,ZodLazy:ns,ZodReadonly:Hn,[B]:Zn,[ze]:Cn,[ge]:qn,[ye]:Bn,[oe]:ss},ir=(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&&Ve(e),c=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),c&&(d.type=ho(r)),!n){let p=J({schema:e,variant:t?"parsed":"original",validate:!0});p.length&&(d.examples=p.slice())}return d},ar=(e,t)=>{throw new Z(`Zod type ${e.constructor.name} is unsupported.`,t)},nr=(e,t)=>{if((0,Y.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,m.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,m.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>nr(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>nr(o,t))),r},To=e=>(0,Y.isReferenceObject)(e)?e:(0,m.omit)(["examples"],e),Oo=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:c,statusCode:d,brandHandling:p,description:l=`${e.toUpperCase()} ${t} ${$t(n)} response ${c?d:""}`.trim()})=>{if(!o)return{description:l};let u=To(Te(r,{rules:{...p,...sr},onEach:ir,onMissing:ar,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),y={schema:a==="components"?i(r,u,re(l)):u,examples:bo(r,!0)};return{description:l,content:(0,m.fromPairs)((0,m.xprod)(o,[y]))}},as=()=>({type:"http",scheme:"basic"}),ps=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},cs=({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},ds=({name:e})=>({type:"apiKey",in:"header",name:e}),ms=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ls=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),us=({flows:e={}})=>({type:"oauth2",flows:(0,m.map)(t=>({...t,scopes:t.scopes||{}}),(0,m.reject)(m.isNil,e))}),Ro=(e,t)=>{let r={basic:as,bearer:ps,input:cs,header:ds,cookie:ms,openid:ls,oauth2:us};return gt(e,o=>r[o.type](o,t))},At=e=>"or"in e?e.or.map(t=>"and"in t?(0,m.mergeAll)((0,m.map)(({name:r,scopes:o})=>(0,m.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?At(Yt(e)):At({or:[e]}),Ao=({method:e,path:t,schema:r,mimeType:o,makeRef:n,composition:i,brandHandling:a,paramNames:c,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let p=To(nr(Te(r,{rules:{...a,...sr},onEach:ir,onMissing:ar,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),c)),l={schema:i==="components"?n(r,p,re(d)):p,examples:bo(r,!1,c)};return{description:d,content:{[o]:l}}},Po=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}),pr=e=>e.length<=mo?e:e.slice(0,mo-1)+"\u2026";var Pt=class extends wo.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=(0,wt.keys)(Se);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||re(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:c,hasSummaryFromDescription:d=!0,composition:p="inline"}){super(),this.addInfo({title:o,version:n});for(let u of typeof i=="string"?[i]:i)this.addServer({url:u});Ke({routing:t,onEndpoint:(u,y,b)=>{let P={path:y,method:b,endpoint:u,composition:p,brandHandling:c,makeRef:this.makeRef.bind(this)},[R,h]=["short","long"].map(u.getDescription.bind(u)),I=R?pr(R):d&&h?pr(h):void 0,q=u.getTags(),D=r.inputSources?.[b]||Ft[b],$=this.ensureUniqOperationId(y,b,u.getOperationId(b)),Q=So({...P,inputSources:D,schema:u.getSchema("input"),description:a?.requestParameter?.call(null,{method:b,path:y,operationId:$})}),et={};for(let G of this.responseVariants){let ae=u.getResponses(G);for(let{mimeTypes:$e,schema:Ut,statusCodes:rt}of ae)for(let Ge of rt)et[Ge]=Oo({...P,variant:G,schema:Ut,mimeTypes:$e,statusCode:Ge,hasMultipleStatusCodes:ae.length>1||rt.length>1,description:a?.[`${G}Response`]?.call(null,{method:b,path:y,operationId:$,statusCode:Ge})})}let Ht=D.includes("body")?Ao({...P,paramNames:(0,wt.pluck)("name",Q),schema:u.getSchema("input"),mimeType:O[u.getRequestType()],description:a?.requestBody?.call(null,{method:b,path:y,operationId:$})}):void 0,tt=At(gt(Ro(u.getSecurity(),D),G=>{let ae=this.ensureUniqSecuritySchemaName(G),$e=["oauth2","openIdConnect"].includes(G.type)?u.getScopes().slice():[];return this.addSecurityScheme(ae,G),{name:ae,scopes:$e}}));this.addPath(yo(y),{[b]:{operationId:$,summary:I,description:h,tags:q.length>0?q:void 0,parameters:Q.length>0?Q:void 0,requestBody:Ht,security:tt.length>0?tt:void 0,responses:et}})}}),this.rootDoc.tags=r.tags?Po(r.tags):[]}};var Et=require("node-mocks-http"),fs=e=>(0,Et.createRequest)({...e,headers:{"content-type":O.json,...e?.headers}}),ys=e=>(0,Et.createResponse)(e),gs=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:Lr(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},Eo=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=fs(e),i=ys({req:n,...t});i.req=t?.req||n,n.res=i;let a=gs(o),c={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:c}},Io=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=Eo(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},zo=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:c}=Eo(o),d=it(n,c.inputSources);try{let p=await e.execute({request:n,response:i,logger:a,input:d,options:t});return{requestMock:n,responseMock:i,loggerMock:a,output:p}}catch(p){if(!r)throw p;return r(te(p),i),{requestMock:n,responseMock:i,loggerMock:a,output:{}}}};var j=z(require("typescript"),1),Vo=require("zod");var A=z(require("typescript"),1);var T=z(require("typescript"),1),{factory:Co}=T.default,De=(e,t)=>T.default.addSyntheticLeadingComment(e,T.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),cr=(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)},hs=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Zo=e=>hs.test(e)?Co.createIdentifier(e):Co.createStringLiteral(e),xs=[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],vo=e=>xs.includes(e.kind);var s=A.default.factory,Re=[s.createModifier(A.default.SyntaxKind.ExportKeyword)],bs=[s.createModifier(A.default.SyntaxKind.AsyncKeyword)],Ss=[s.createModifier(A.default.SyntaxKind.PublicKeyword)],No=[s.createModifier(A.default.SyntaxKind.ProtectedKeyword),s.createModifier(A.default.SyntaxKind.ReadonlyKeyword)],jo=s.createToken(A.default.SyntaxKind.DotDotDotToken),Ts=s.createTemplateHead(""),Os=s.createTemplateMiddle(" "),Xe=s.createTemplateTail(""),Fe=s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[s.createKeywordTypeNode(A.default.SyntaxKind.StringKeyword),s.createKeywordTypeNode(A.default.SyntaxKind.AnyKeyword)]),Rs=e=>s.createTemplateLiteralType(Ts,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?Xe:Os))),It=Rs(["M","P"]),zt=(e,t,r)=>s.createParameterDeclaration(Array.isArray(r)?r:void 0,Array.isArray(r)?void 0:r,e,void 0,t,void 0),Be=(e,t)=>Object.entries(e).map(([r,o])=>zt(s.createIdentifier(r),o,t)),ko=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),Lo=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),Mo=(...e)=>s.createArrayBindingPattern(e.map(t=>s.createBindingElement(void 0,void 0,t))),H=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],A.default.NodeFlags.Const),dr=(e,t)=>U(e,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r)))),{isPublic:!0}),U=(e,t,{isPublic:r,comment:o}={})=>{let n=s.createTypeAliasDeclaration(r?Re:void 0,e,void 0,t);return o?De(n,o):n},Ct=(e,t,r,o,n)=>s.createMethodDeclaration(Ss,void 0,e,void 0,o,t,n,r),Ho=(e,t,r)=>s.createClassDeclaration(Re,e,void 0,void 0,[t,...r]),Zt=e=>s.createTypeOperatorNode(A.default.SyntaxKind.KeyOfKeyword,s.createTypeReferenceNode(e)),Uo=(e,t,r)=>s.createConditionalTypeNode(t,Zt(e),s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t),r),vt=e=>s.createTypeReferenceNode(Promise.name,[e==="any"?s.createKeywordTypeNode(A.default.SyntaxKind.AnyKeyword):e]),Ko=(e,t)=>s.createInterfaceDeclaration(Re,e,void 0,void 0,t),mr=e=>Object.entries(e).map(([t,r])=>s.createTypeParameterDeclaration([],t,s.createTypeReferenceNode(r))),Do=(e,t,r)=>s.createArrowFunction(r?bs:void 0,void 0,e.map(o=>zt(o)),void 0,void 0,t),lr=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier(Object.name),E("keys")),void 0,[e]),E("reduce")),void 0,[s.createArrowFunction(void 0,void 0,Be({acc:void 0,key:void 0}),void 0,void 0,t),r]),Fo=(...e)=>`"${e.join(" ")}"`,E=e=>e,qe=(e,t,r)=>s.createConditionalExpression(e,s.createToken(A.default.SyntaxKind.QuestionToken),t,s.createToken(A.default.SyntaxKind.ColonToken),r),K=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(Array.isArray(e)?s.createPropertyAccessExpression(...e):e,t),void 0,r),Bo=(e,t)=>s.createBinaryExpression(e,s.createToken(A.default.SyntaxKind.AmpersandAmpersandToken),t),qo=(e,t)=>s.createBinaryExpression(e,s.createToken(A.default.SyntaxKind.EqualsEqualsEqualsToken),t);var $o=["get","post","put","delete","patch"];var jt=require("ramda"),g=z(require("typescript"),1),Nt=require("zod");var{factory:f}=g.default,As={[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},Ps=({value:e})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),ws=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let c=t&&Ve(a)?a instanceof Nt.z.ZodOptional:a.isOptional(),d=f.createPropertySignature(void 0,Zo(i),c&&o?f.createToken(g.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description?De(d,a.description):d});return f.createTypeLiteralNode(n)},Es=({element:e},{next:t})=>f.createArrayTypeNode(t(e)),Is=({options:e})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Go=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(vo(n)?n.kind:n,n)}return f.createUnionTypeNode(Array.from(r.values()))},zs=e=>As?.[e.kind],Cs=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=at(e,zs(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},Zs=e=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),vs=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(g.default.SyntaxKind.UndefinedKeyword)]):o},Ns=(e,{next:t})=>f.createUnionTypeNode([t(e.unwrap()),f.createLiteralTypeNode(f.createNull())]),js=({items:e,_def:{rest:t}},{next:r})=>f.createTupleTypeNode(e.map(r).concat(t===null?[]:f.createRestTypeNode(r(t)))),ks=({keySchema:e,valueSchema:t},{next:r})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e,t].map(r)),Ls=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(g.default.isTypeLiteralNode)?f.createTypeLiteralNode((0,jt.chain)((0,jt.prop)("members"),o)):f.createIntersectionTypeNode(o)},Ms=({_def:e},{next:t})=>t(e.innerType),ie=e=>()=>f.createKeywordTypeNode(e),Hs=(e,{next:t})=>t(e.unwrap()),Us=(e,{next:t})=>t(e.unwrap()),Ks=({_def:e},{next:t})=>t(e.innerType),Ds=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Fs=()=>f.createLiteralTypeNode(f.createNull()),Bs=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),qs=e=>{let t=e.unwrap(),r=f.createKeywordTypeNode(g.default.SyntaxKind.StringKeyword),o=f.createTypeReferenceNode("Buffer"),n=f.createUnionTypeNode([r,o]);return t instanceof Nt.z.ZodString?r:t instanceof Nt.z.ZodUnion?n:o},$s=(e,{next:t})=>t(e.unwrap().shape.raw),Gs={ZodString:ie(g.default.SyntaxKind.StringKeyword),ZodNumber:ie(g.default.SyntaxKind.NumberKeyword),ZodBigInt:ie(g.default.SyntaxKind.BigIntKeyword),ZodBoolean:ie(g.default.SyntaxKind.BooleanKeyword),ZodAny:ie(g.default.SyntaxKind.AnyKeyword),ZodUndefined:ie(g.default.SyntaxKind.UndefinedKeyword),[ye]:ie(g.default.SyntaxKind.StringKeyword),[ge]:ie(g.default.SyntaxKind.StringKeyword),ZodNull:Fs,ZodArray:Es,ZodTuple:js,ZodRecord:ks,ZodObject:ws,ZodLiteral:Ps,ZodIntersection:Ls,ZodUnion:Go,ZodDefault:Ms,ZodEnum:Is,ZodNativeEnum:Zs,ZodEffects:Cs,ZodOptional:vs,ZodNullable:Ns,ZodDiscriminatedUnion:Go,ZodBranded:Hs,ZodCatch:Ks,ZodPipeline:Ds,ZodLazy:Bs,ZodReadonly:Us,[B]:qs,[oe]:$s},kt=(e,{brandHandling:t,ctx:r})=>Te(e,{rules:{...t,...Gs},onMissing:()=>f.createKeywordTypeNode(g.default.SyntaxKind.AnyKeyword),ctx:r});var Lt=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"),requestParameter:s.createIdentifier("request"),args:s.createIdentifier("args"),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"),contentTypeConst:s.createIdentifier("contentType"),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,U(o,n)),this.aliases.set(t,U(o,r()))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0},noContent:i=Vo.z.undefined()}){let a={makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},c={brandHandling:r,ctx:{...a,isResponse:!1}},d={brandHandling:r,ctx:{...a,isResponse:!0}};Ke({routing:t,onEndpoint:(k,pe,ot)=>{let Pe=re.bind(null,ot,pe),ce=U(Pe("input"),kt(k.getSchema("input"),c)),rn=k.getResponses("positive").map(({schema:V,mimeTypes:de})=>de?V:i).reduce((V,de)=>V.or(de)),Kt=U(Pe("positive.response"),kt(rn,d)),on=k.getResponses("negative").map(({schema:V,mimeTypes:de})=>de?V:i).reduce((V,de)=>V.or(de)),Dt=U(Pe("negative.response"),kt(on,d)),ur=U(Pe("response"),s.createUnionTypeNode([s.createTypeReferenceNode(Kt.name.text),s.createTypeReferenceNode(Dt.name.text)]));this.program.push(ce,Kt,Dt,ur),this.paths.push(pe);let nn=k.getResponses("positive").some(({mimeTypes:V})=>V?.includes(O.json));this.registry.set(Fo(ot,pe),{input:ce.name.text,positive:Kt.name.text,negative:Dt.name.text,response:ur.name.text,tags:k.getTags(),isJson:nn})}}),this.program.unshift(...this.aliases.values()),this.program.push(dr(this.ids.pathType,this.paths)),this.program.push(dr(this.ids.methodType,$o)),this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]},{id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]},{id:this.ids.responseInterface,kind:"response",props:[]});let l=[],u=[];for(let[k,{isJson:pe,tags:ot,...Pe}]of this.registry){for(let ce of this.interfaces)ce.props.push(Lo(k,Pe[ce.kind]));o!=="types"&&(pe&&l.push(s.createPropertyAssignment(k,s.createTrue())),u.push(s.createPropertyAssignment(k,s.createArrayLiteralExpression(ot.map(ce=>s.createStringLiteral(ce))))))}for(let{id:k,props:pe}of this.interfaces)this.program.push(Ko(k,pe));if(this.program.push(U(this.ids.methodPathType,Zt(this.ids.inputInterface),{isPublic:!0})),o==="types")return;let y=s.createVariableStatement(Re,H(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(l))),b=s.createVariableStatement(Re,H(this.ids.endpointTagsConst,s.createObjectLiteralExpression(u))),P=U(this.ids.implementationType,s.createFunctionTypeNode(void 0,Be({[this.ids.methodParameter.text]:s.createTypeReferenceNode(this.ids.methodType),[this.ids.pathParameter.text]:s.createKeywordTypeNode(j.default.SyntaxKind.StringKeyword),[this.ids.paramsArgument.text]:Fe}),vt("any")),{isPublic:!0}),R=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,Xe)]),h=lr(this.ids.paramsArgument,K(this.ids.accumulator,E("replace"),[R,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),I=lr(this.ids.paramsArgument,K(s.createIdentifier(Object.name),E("assign"),[this.ids.accumulator,Bo(s.createPrefixUnaryExpression(j.default.SyntaxKind.ExclamationToken,K(this.ids.pathParameter,E("includes"),[R])),s.createObjectLiteralExpression([s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))],!1))]),s.createObjectLiteralExpression()),q=De(Ct(this.ids.provideMethod,Be({[this.ids.methodParameter.text]:s.createTypeReferenceNode("M"),[this.ids.pathParameter.text]:s.createTypeReferenceNode("P"),[this.ids.paramsArgument.text]:s.createConditionalTypeNode(It,Zt(this.ids.inputInterface),s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),It),Fe)}),void 0,mr({M:this.ids.methodType,P:this.ids.pathType}),vt(Uo(this.ids.responseInterface,It,s.createKeywordTypeNode(j.default.SyntaxKind.UnknownKeyword)))),"@deprecated use the overload with 2 arguments instead"),D=Ct(this.ids.provideMethod,Be({[this.ids.requestParameter.text]:s.createTypeReferenceNode("K"),[this.ids.paramsArgument.text]:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),s.createTypeReferenceNode("K"))}),void 0,mr({K:this.ids.methodPathType}),vt(s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.responseInterface),s.createTypeReferenceNode("K")))),$=Ct(this.ids.provideMethod,Be({[this.ids.args.text]:s.createUnionTypeNode([s.createTupleTypeNode([s.createKeywordTypeNode(j.default.SyntaxKind.StringKeyword),s.createKeywordTypeNode(j.default.SyntaxKind.StringKeyword),Fe]),s.createTupleTypeNode([s.createKeywordTypeNode(j.default.SyntaxKind.StringKeyword),Fe])])},jo),s.createBlock([s.createVariableStatement(void 0,H(Mo(this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument),s.createAsExpression(s.createParenthesizedExpression(qe(qo(s.createPropertyAccessExpression(this.ids.args,E("length")),s.createNumericLiteral(2)),s.createArrayLiteralExpression([s.createSpreadElement(K(s.createElementAccessExpression(this.ids.args,0),E("split"),[s.createRegularExpressionLiteral("/ (.+)/"),s.createNumericLiteral(2)])),s.createElementAccessExpression(this.ids.args,1)]),this.ids.args)),s.createTupleTypeNode([s.createTypeReferenceNode(this.ids.methodType),s.createTypeReferenceNode(this.ids.pathType),Fe])))),s.createReturnStatement(K(s.createThis(),this.ids.implementationArgument,[this.ids.methodParameter,h,I]))])),Q=Ho(this.ids.clientClass,ko([zt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),No)]),[q,D,$]),et=U(this.ids.providerType,s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.clientClass),s.createLiteralTypeNode(s.createStringLiteral(this.ids.provideMethod.text))),{isPublic:!0,comment:"@deprecated will be removed in v22"});this.program.push(y,b,P,Q,et);let Ht=s.createPropertyAssignment(this.ids.methodParameter,K(this.ids.methodParameter,E("toUpperCase"))),tt=s.createPropertyAssignment(this.ids.headersProperty,qe(this.ids.hasBodyConst,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(O.json))]),this.ids.undefinedValue)),G=s.createPropertyAssignment(this.ids.bodyProperty,qe(this.ids.hasBodyConst,K(s.createIdentifier("JSON"),E("stringify"),[this.ids.paramsArgument]),this.ids.undefinedValue)),ae=s.createVariableStatement(void 0,H(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier(fetch.name),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,Xe)]),s.createObjectLiteralExpression([Ht,tt,G])])))),$e=s.createVariableStatement(void 0,H(this.ids.hasBodyConst,s.createLogicalNot(K(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),E("includes"),[this.ids.methodParameter])))),Ut=s.createVariableStatement(void 0,H(this.ids.searchParamsConst,qe(this.ids.hasBodyConst,s.createStringLiteral(""),s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier(URLSearchParams.name),void 0,[this.ids.paramsArgument]),Xe)])))),rt=s.createVariableStatement(void 0,H(this.ids.contentTypeConst,K([this.ids.responseConst,this.ids.headersProperty],E("get"),[s.createStringLiteral("content-type")]))),Ge=s.createIfStatement(s.createPrefixUnaryExpression(j.default.SyntaxKind.ExclamationToken,this.ids.contentTypeConst),s.createReturnStatement(void 0),void 0),Qo=s.createVariableStatement(void 0,H(this.ids.isJsonConst,s.createCallChain(s.createPropertyAccessChain(this.ids.contentTypeConst,void 0,E("startsWith")),void 0,void 0,[s.createStringLiteral(O.json)]))),Wo=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,qe(this.ids.isJsonConst,s.createStringLiteral(E("json")),s.createStringLiteral(E("text")))),void 0,[])),Xo=s.createVariableStatement(Re,H(this.ids.exampleImplementationConst,Do([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([$e,Ut,ae,rt,Ge,Qo,Wo]),!0),s.createTypeReferenceNode(this.ids.implementationType))),en=s.createExpressionStatement(K(this.ids.clientConst,this.ids.provideMethod,[s.createStringLiteral("get /v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),tn=s.createVariableStatement(void 0,H(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(Xo,tn,en)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:cr(r,t)).join(`
19
+ `):void 0}print(t){let r=this.printUsage(t),o=r&&j.default.addSyntheticLeadingComment(j.default.addSyntheticLeadingComment(s.createEmptyStatement(),j.default.SyntaxKind.SingleLineCommentTrivia," Usage example:"),j.default.SyntaxKind.MultiLineCommentTrivia,`
20
+ ${r}`);return this.program.concat(o||[]).map((n,i)=>cr(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 Le("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 $o={dateIn:fr,dateOut:hr,file:mt,upload:Or,raw:Sr};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 Ue("prettier")).format;o=c=>a(c,{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 Ae=require("zod");var Jo=(e,t)=>Ae.z.object({data:t,event:Ae.z.literal(e),id:Ae.z.string().optional(),retry:Ae.z.number().int().positive().optional()}),Vs=(e,t,r)=>Jo(String(t),e[t]).transform(o=>[`event: ${o.event}`,`data: ${JSON.stringify(o.data)}`,"",""].join(`
23
+ `)).parse({event:t,data:r}),_s=1e4,_o=e=>e.headersSent||e.writeHead(200,{connection:"keep-alive","content-type":O.sse,"cache-control":"no-cache"}),Js=e=>new L({handler:async({response:t})=>setTimeout(()=>_o(t),_s)&&{isClosed:()=>t.writableEnded||t.closed,emit:(r,o)=>{_o(t),t.write(Vs(e,r,o),"utf-8"),t.flush()}}}),Ys=e=>new ne({positive:()=>{let[t,...r]=Object.entries(e).map(([o,n])=>Jo(o,n));return{mimeType:O.sse,schema:r.length?Ae.z.discriminatedUnion("event",[t,...r]):t}},negative:{mimeType:"text/plain",schema:Ae.z.string()},handler:async({response:t,error:r,logger:o,request:n,input:i})=>{if(r){let a=he(r);Ye(a,o,n,i),t.headersSent||t.status(a.statusCode).type("text/plain").write(xe(a),"utf-8")}t.end()}}),Mt=class extends se{constructor({events:t,config:r}){super({config:r,resultHandler:Ys(t)}),this.middlewares=[Js(t)]}};var Yo={dateIn:xr,dateOut:Sr,file:mt,upload:Pr,raw:Rr};0&&(module.exports={BuiltinLogger,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,EventStreamFactory,InputValidationError,Integration,Middleware,MissingPeerError,OutputValidationError,ResultHandler,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createServer,defaultEndpointsFactory,defaultResultHandler,ensureHttpError,ez,getExamples,getMessageFromError,testEndpoint,testMiddleware});
package/dist/index.d.cts CHANGED
@@ -268,6 +268,7 @@ declare const contentTypes: {
268
268
  json: string;
269
269
  upload: string;
270
270
  raw: string;
271
+ sse: string;
271
272
  };
272
273
  type ContentType = keyof typeof contentTypes;
273
274
 
@@ -398,7 +399,7 @@ declare abstract class AbstractEndpoint extends Nesting {
398
399
  abstract getOperationId(method: Method): string | undefined;
399
400
  abstract getRequestType(): ContentType;
400
401
  }
401
- declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends FlatObject, SCO extends string, TAG extends string> extends AbstractEndpoint {
402
+ declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends FlatObject> extends AbstractEndpoint {
402
403
  #private;
403
404
  constructor({ methods, inputSchema, outputSchema, handler, resultHandler, getOperationId, scopes, middlewares, tags, description: long, shortDescription: short, }: {
404
405
  middlewares?: AbstractMiddleware[];
@@ -410,18 +411,18 @@ declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends Fl
410
411
  shortDescription?: string;
411
412
  getOperationId?: (method: Method) => string | undefined;
412
413
  methods?: Method[];
413
- scopes?: SCO[];
414
- tags?: TAG[];
414
+ scopes?: string[];
415
+ tags?: string[];
415
416
  });
416
417
  getDescription(variant: DescriptionVariant): string | undefined;
417
418
  getMethods(): readonly ("get" | "post" | "put" | "delete" | "patch")[] | undefined;
418
419
  getSchema(variant: "input"): IN;
419
420
  getSchema(variant: "output"): OUT;
420
- getRequestType(): "raw" | "json" | "upload";
421
+ getRequestType(): "raw" | "json" | "upload" | "sse";
421
422
  getResponses(variant: ResponseVariant): readonly NormalizedResponse[];
422
423
  getSecurity(): LogicalContainer<Security>;
423
- getScopes(): readonly SCO[];
424
- getTags(): readonly TAG[];
424
+ getScopes(): readonly string[];
425
+ getTags(): readonly string[];
425
426
  getOperationId(method: Method): string | undefined;
426
427
  execute({ request, response, logger, config, }: {
427
428
  request: Request;
@@ -654,7 +655,7 @@ declare module "zod" {
654
655
  }
655
656
  }
656
657
 
657
- type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<"strip">, OPT extends FlatObject, SCO extends string, TAG extends string> = {
658
+ interface BuildProps<IN extends IOSchema, OUT extends IOSchema | z.ZodVoid, MIN extends IOSchema<"strip">, OPT extends FlatObject, SCO extends string, TAG extends string> {
658
659
  input?: IN;
659
660
  output: OUT;
660
661
  handler: Handler<z.output<z.ZodIntersection<MIN, IN>>, z.input<OUT>, OPT>;
@@ -664,13 +665,14 @@ type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<
664
665
  method?: Method | [Method, ...Method[]];
665
666
  scope?: SCO | SCO[];
666
667
  tag?: TAG | TAG[];
667
- };
668
+ }
668
669
  declare class EndpointsFactory<IN extends IOSchema<"strip"> = EmptySchema, OUT extends FlatObject = EmptyObject, SCO extends string = string, TAG extends string = string> {
669
670
  #private;
670
671
  protected resultHandler: AbstractResultHandler;
671
672
  protected middlewares: AbstractMiddleware[];
672
673
  /** @desc Consider using the "config" prop with the "tags" option to enforce constraints on tagging the endpoints */
673
674
  constructor(resultHandler: AbstractResultHandler);
675
+ /** @todo consider migrating tags into augmentation approach in v22 */
674
676
  constructor(params: {
675
677
  resultHandler: AbstractResultHandler;
676
678
  config?: CommonConfig<TAG>;
@@ -682,7 +684,9 @@ declare class EndpointsFactory<IN extends IOSchema<"strip"> = EmptySchema, OUT e
682
684
  } | undefined) => EndpointsFactory<IN, OUT & AOUT, SCO, TAG>;
683
685
  addExpressMiddleware<R extends Request, S extends Response, AOUT extends FlatObject = EmptyObject>(...params: ConstructorParameters<typeof ExpressMiddleware<R, S, AOUT>>): EndpointsFactory<IN, OUT & AOUT, SCO, TAG>;
684
686
  addOptions<AOUT extends FlatObject>(getOptions: () => Promise<AOUT>): EndpointsFactory<IN, OUT & AOUT, SCO, TAG>;
685
- build<BOUT extends IOSchema, BIN extends IOSchema = EmptySchema>({ input, handler, output: outputSchema, description, shortDescription, operationId, scope, tag, method, }: BuildProps<BIN, BOUT, IN, OUT, SCO, TAG>): Endpoint<z.ZodIntersection<IN, BIN>, BOUT, OUT, SCO, TAG>;
687
+ build<BOUT extends IOSchema, BIN extends IOSchema = EmptySchema>({ input, handler, output: outputSchema, description, shortDescription, operationId, scope, tag, method, }: BuildProps<BIN, BOUT, IN, OUT, SCO, TAG>): Endpoint<z.ZodIntersection<IN, BIN>, BOUT, OUT>;
688
+ /** @desc shorthand for returning {} while having output schema z.object({}) */
689
+ buildVoid<BIN extends IOSchema = EmptySchema>({ handler, ...rest }: Omit<BuildProps<BIN, z.ZodVoid, IN, OUT, SCO, TAG>, "output">): Endpoint<z.ZodIntersection<IN, BIN>, z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>, OUT>;
686
690
  }
687
691
  declare const defaultEndpointsFactory: EndpointsFactory<EmptySchema, EmptyObject, string, string>;
688
692
  /**
@@ -962,10 +966,7 @@ interface FormattedPrintingOptions {
962
966
  declare class Integration {
963
967
  protected program: ts.Node[];
964
968
  protected usage: Array<ts.Node | string>;
965
- protected registry: Map<{
966
- method: Method;
967
- path: string;
968
- }, Partial<Record<IOKind, string>> & {
969
+ protected registry: Map<`"get ${string}"` | `"post ${string}"` | `"put ${string}"` | `"delete ${string}"` | `"patch ${string}"`, Record<IOKind, string> & {
969
970
  isJson: boolean;
970
971
  tags: ReadonlyArray<string>;
971
972
  }>;
@@ -1018,4 +1019,19 @@ declare class Integration {
1018
1019
  printFormatted({ printerOptions, format: userDefined, }?: FormattedPrintingOptions): Promise<string>;
1019
1020
  }
1020
1021
 
1021
- export { type ApiResponse, type AppConfig, type BasicSecurity, type BearerSecurity, BuiltinLogger, type CommonConfig, type CookieSecurity, type CustomHeaderSecurity, DependsOnMethod, type Depicter, Documentation, DocumentationError, EndpointsFactory, type FlatObject, type IOSchema, type InputSecurity, InputValidationError, Integration, type LoggerOverrides, type Method, Middleware, MissingPeerError, type NormalizedResponse, type OAuth2Security, type OpenIdSecurity, OutputValidationError, type Producer, ResultHandler, type Routing, RoutingError, ServeStatic, type ServerConfig, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createServer, defaultEndpointsFactory, defaultResultHandler, ensureHttpError, ez, getExamples, getMessageFromError, testEndpoint, testMiddleware };
1022
+ type EventsMap = Record<string, z.ZodTypeAny>;
1023
+ interface Emitter<E extends EventsMap> extends FlatObject {
1024
+ /** @desc Returns true when the connection was closed or terminated */
1025
+ isClosed: () => boolean;
1026
+ /** @desc Sends an event to the stream accordin to the declared schema */
1027
+ emit: <K extends keyof E>(event: K, data: z.input<E[K]>) => void;
1028
+ }
1029
+ /** @desc This feature is in active development and can be changed or removed regardlress of SemVer */
1030
+ declare class EventStreamFactory<E extends EventsMap, TAG extends string> extends EndpointsFactory<EmptySchema, Emitter<E>, string, TAG> {
1031
+ constructor({ events, config }: {
1032
+ events: E;
1033
+ config?: CommonConfig<TAG>;
1034
+ });
1035
+ }
1036
+
1037
+ export { type ApiResponse, type AppConfig, type BasicSecurity, type BearerSecurity, BuiltinLogger, type CommonConfig, type CookieSecurity, type CustomHeaderSecurity, DependsOnMethod, type Depicter, Documentation, DocumentationError, EndpointsFactory, EventStreamFactory, type FlatObject, type IOSchema, type InputSecurity, InputValidationError, Integration, type LoggerOverrides, type Method, Middleware, MissingPeerError, type NormalizedResponse, type OAuth2Security, type OpenIdSecurity, OutputValidationError, type Producer, ResultHandler, type Routing, RoutingError, ServeStatic, type ServerConfig, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createServer, defaultEndpointsFactory, defaultResultHandler, ensureHttpError, ez, getExamples, getMessageFromError, testEndpoint, testMiddleware };
package/dist/index.d.ts CHANGED
@@ -268,6 +268,7 @@ declare const contentTypes: {
268
268
  json: string;
269
269
  upload: string;
270
270
  raw: string;
271
+ sse: string;
271
272
  };
272
273
  type ContentType = keyof typeof contentTypes;
273
274
 
@@ -398,7 +399,7 @@ declare abstract class AbstractEndpoint extends Nesting {
398
399
  abstract getOperationId(method: Method): string | undefined;
399
400
  abstract getRequestType(): ContentType;
400
401
  }
401
- declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends FlatObject, SCO extends string, TAG extends string> extends AbstractEndpoint {
402
+ declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends FlatObject> extends AbstractEndpoint {
402
403
  #private;
403
404
  constructor({ methods, inputSchema, outputSchema, handler, resultHandler, getOperationId, scopes, middlewares, tags, description: long, shortDescription: short, }: {
404
405
  middlewares?: AbstractMiddleware[];
@@ -410,18 +411,18 @@ declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends Fl
410
411
  shortDescription?: string;
411
412
  getOperationId?: (method: Method) => string | undefined;
412
413
  methods?: Method[];
413
- scopes?: SCO[];
414
- tags?: TAG[];
414
+ scopes?: string[];
415
+ tags?: string[];
415
416
  });
416
417
  getDescription(variant: DescriptionVariant): string | undefined;
417
418
  getMethods(): readonly ("get" | "post" | "put" | "delete" | "patch")[] | undefined;
418
419
  getSchema(variant: "input"): IN;
419
420
  getSchema(variant: "output"): OUT;
420
- getRequestType(): "raw" | "json" | "upload";
421
+ getRequestType(): "raw" | "json" | "upload" | "sse";
421
422
  getResponses(variant: ResponseVariant): readonly NormalizedResponse[];
422
423
  getSecurity(): LogicalContainer<Security>;
423
- getScopes(): readonly SCO[];
424
- getTags(): readonly TAG[];
424
+ getScopes(): readonly string[];
425
+ getTags(): readonly string[];
425
426
  getOperationId(method: Method): string | undefined;
426
427
  execute({ request, response, logger, config, }: {
427
428
  request: Request;
@@ -654,7 +655,7 @@ declare module "zod" {
654
655
  }
655
656
  }
656
657
 
657
- type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<"strip">, OPT extends FlatObject, SCO extends string, TAG extends string> = {
658
+ interface BuildProps<IN extends IOSchema, OUT extends IOSchema | z.ZodVoid, MIN extends IOSchema<"strip">, OPT extends FlatObject, SCO extends string, TAG extends string> {
658
659
  input?: IN;
659
660
  output: OUT;
660
661
  handler: Handler<z.output<z.ZodIntersection<MIN, IN>>, z.input<OUT>, OPT>;
@@ -664,13 +665,14 @@ type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<
664
665
  method?: Method | [Method, ...Method[]];
665
666
  scope?: SCO | SCO[];
666
667
  tag?: TAG | TAG[];
667
- };
668
+ }
668
669
  declare class EndpointsFactory<IN extends IOSchema<"strip"> = EmptySchema, OUT extends FlatObject = EmptyObject, SCO extends string = string, TAG extends string = string> {
669
670
  #private;
670
671
  protected resultHandler: AbstractResultHandler;
671
672
  protected middlewares: AbstractMiddleware[];
672
673
  /** @desc Consider using the "config" prop with the "tags" option to enforce constraints on tagging the endpoints */
673
674
  constructor(resultHandler: AbstractResultHandler);
675
+ /** @todo consider migrating tags into augmentation approach in v22 */
674
676
  constructor(params: {
675
677
  resultHandler: AbstractResultHandler;
676
678
  config?: CommonConfig<TAG>;
@@ -682,7 +684,9 @@ declare class EndpointsFactory<IN extends IOSchema<"strip"> = EmptySchema, OUT e
682
684
  } | undefined) => EndpointsFactory<IN, OUT & AOUT, SCO, TAG>;
683
685
  addExpressMiddleware<R extends Request, S extends Response, AOUT extends FlatObject = EmptyObject>(...params: ConstructorParameters<typeof ExpressMiddleware<R, S, AOUT>>): EndpointsFactory<IN, OUT & AOUT, SCO, TAG>;
684
686
  addOptions<AOUT extends FlatObject>(getOptions: () => Promise<AOUT>): EndpointsFactory<IN, OUT & AOUT, SCO, TAG>;
685
- build<BOUT extends IOSchema, BIN extends IOSchema = EmptySchema>({ input, handler, output: outputSchema, description, shortDescription, operationId, scope, tag, method, }: BuildProps<BIN, BOUT, IN, OUT, SCO, TAG>): Endpoint<z.ZodIntersection<IN, BIN>, BOUT, OUT, SCO, TAG>;
687
+ build<BOUT extends IOSchema, BIN extends IOSchema = EmptySchema>({ input, handler, output: outputSchema, description, shortDescription, operationId, scope, tag, method, }: BuildProps<BIN, BOUT, IN, OUT, SCO, TAG>): Endpoint<z.ZodIntersection<IN, BIN>, BOUT, OUT>;
688
+ /** @desc shorthand for returning {} while having output schema z.object({}) */
689
+ buildVoid<BIN extends IOSchema = EmptySchema>({ handler, ...rest }: Omit<BuildProps<BIN, z.ZodVoid, IN, OUT, SCO, TAG>, "output">): Endpoint<z.ZodIntersection<IN, BIN>, z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>, OUT>;
686
690
  }
687
691
  declare const defaultEndpointsFactory: EndpointsFactory<EmptySchema, EmptyObject, string, string>;
688
692
  /**
@@ -962,10 +966,7 @@ interface FormattedPrintingOptions {
962
966
  declare class Integration {
963
967
  protected program: ts.Node[];
964
968
  protected usage: Array<ts.Node | string>;
965
- protected registry: Map<{
966
- method: Method;
967
- path: string;
968
- }, Partial<Record<IOKind, string>> & {
969
+ protected registry: Map<`"get ${string}"` | `"post ${string}"` | `"put ${string}"` | `"delete ${string}"` | `"patch ${string}"`, Record<IOKind, string> & {
969
970
  isJson: boolean;
970
971
  tags: ReadonlyArray<string>;
971
972
  }>;
@@ -1018,4 +1019,19 @@ declare class Integration {
1018
1019
  printFormatted({ printerOptions, format: userDefined, }?: FormattedPrintingOptions): Promise<string>;
1019
1020
  }
1020
1021
 
1021
- export { type ApiResponse, type AppConfig, type BasicSecurity, type BearerSecurity, BuiltinLogger, type CommonConfig, type CookieSecurity, type CustomHeaderSecurity, DependsOnMethod, type Depicter, Documentation, DocumentationError, EndpointsFactory, type FlatObject, type IOSchema, type InputSecurity, InputValidationError, Integration, type LoggerOverrides, type Method, Middleware, MissingPeerError, type NormalizedResponse, type OAuth2Security, type OpenIdSecurity, OutputValidationError, type Producer, ResultHandler, type Routing, RoutingError, ServeStatic, type ServerConfig, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createServer, defaultEndpointsFactory, defaultResultHandler, ensureHttpError, ez, getExamples, getMessageFromError, testEndpoint, testMiddleware };
1022
+ type EventsMap = Record<string, z.ZodTypeAny>;
1023
+ interface Emitter<E extends EventsMap> extends FlatObject {
1024
+ /** @desc Returns true when the connection was closed or terminated */
1025
+ isClosed: () => boolean;
1026
+ /** @desc Sends an event to the stream accordin to the declared schema */
1027
+ emit: <K extends keyof E>(event: K, data: z.input<E[K]>) => void;
1028
+ }
1029
+ /** @desc This feature is in active development and can be changed or removed regardlress of SemVer */
1030
+ declare class EventStreamFactory<E extends EventsMap, TAG extends string> extends EndpointsFactory<EmptySchema, Emitter<E>, string, TAG> {
1031
+ constructor({ events, config }: {
1032
+ events: E;
1033
+ config?: CommonConfig<TAG>;
1034
+ });
1035
+ }
1036
+
1037
+ export { type ApiResponse, type AppConfig, type BasicSecurity, type BearerSecurity, BuiltinLogger, type CommonConfig, type CookieSecurity, type CustomHeaderSecurity, DependsOnMethod, type Depicter, Documentation, DocumentationError, EndpointsFactory, EventStreamFactory, type FlatObject, type IOSchema, type InputSecurity, InputValidationError, Integration, type LoggerOverrides, type Method, Middleware, MissingPeerError, type NormalizedResponse, type OAuth2Security, type OpenIdSecurity, OutputValidationError, type Producer, ResultHandler, type Routing, RoutingError, ServeStatic, type ServerConfig, 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 tr,fromPairs as Do,map as Fo,pipe as Bo,toPairs as qo,pair as $o}from"ramda";import{z as ye}from"zod";import{chain as Xt,memoizeWith as No,pickBy as vo,xprod as jo}from"ramda";import{z as ko}from"zod";var A={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var me=class extends Error{name="RoutingError"},E=class extends Error{name="DocumentationError";cause;constructor(t,{method:r,path:o,isResponse:s}){super(t),this.cause=`${s?"Response":"Input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`}},_e=class extends Error{name="IOSchemaError"},X=class extends _e{constructor(r){super(ee(r),{cause:r});this.cause=r}name="OutputValidationError"},K=class extends _e{constructor(r){super(ee(r),{cause:r});this.cause=r}name="InputValidationError"},F=class extends Error{constructor(r,o){super(ee(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},Ze=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var Lo=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(A.upload);return"files"in e&&r},At={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Mo=["body","query","params"],Pt=e=>e.method.toLowerCase(),wt=e=>e.startsWith("x-"),Uo=e=>vo((t,r)=>wt(r),e),Ye=(e,t={})=>{let r=Pt(e);return r==="options"?{}:(t[r]||At[r]||Mo).filter(o=>o==="files"?Lo(e):!0).map(o=>o==="headers"?Uo(e[o]):e[o]).reduce((o,s)=>Object.assign(o,s),{})},B=e=>e instanceof Error?e:new Error(String(e)),ee=e=>e instanceof ko.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof X?`output${e.cause.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,q=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[h]?.examples||[];if(!r&&t==="original")return o;let s=[];for(let i of o){let a=e.safeParse(i);a.success&&s.push(t==="parsed"?a.data:i)}return s},te=(e,t,r)=>e.length&&t.length?jo(e,t).map(r):e.concat(t),Ee=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,It=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),$=(...e)=>{let t=Xt(o=>o.split(/[^A-Z0-9]/gi),e);return Xt(o=>o.replaceAll(/[A-Z]+/g,s=>`/${s}`).split("/"),t).map(It).join("")},Je=(e,t)=>{try{return typeof e.parse(t)}catch{return}},re=e=>typeof e=="object"&&e!==null,ue=No(()=>"static",()=>process.env.NODE_ENV==="production");import{clone as Ho,mergeDeepRight as Ko}from"ramda";var h=Symbol.for("express-zod-api"),We=e=>{let t=e.describe(e.description);return t._def[h]=Ho(t._def[h])||{examples:[]},t},er=(e,t)=>{if(!(h in e._def))return t;let r=We(t);return r._def[h].examples=te(r._def[h].examples,e._def[h].examples,([o,s])=>typeof o=="object"&&typeof s=="object"?Ko({...o},{...s}):s),r};var Go=function(e){let t=We(this);return t._def[h].examples.push(e),t},Vo=function(e){let t=We(this);return t._def[h].defaultLabel=e,t},_o=function(e){return new ye.ZodBranded({typeName:ye.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[h]:{examples:[],...tr(this._def[h]),brand:e}})},Yo=function(e){let t=typeof e=="function"?e:Bo(qo,Fo(([s,i])=>$o(e[String(s)]||s,i)),Do),r=t(tr(this.shape)),o=ye.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};h in globalThis||(globalThis[h]=!0,Object.defineProperties(ye.ZodType.prototype,{example:{get(){return Go.bind(this)}},brand:{set(){},get(){return _o.bind(this)}}}),Object.defineProperty(ye.ZodDefault.prototype,"label",{get(){return Vo.bind(this)}}),Object.defineProperty(ye.ZodObject.prototype,"remap",{get(){return Yo.bind(this)}}));function Jo(e){return e}import{z as pn}from"zod";import{z as mr}from"zod";import{fail as w}from"node:assert/strict";import{z as Ne}from"zod";var Qe=e=>!isNaN(e.getTime());var oe=Symbol("DateIn"),rr=()=>Ne.union([Ne.string().date(),Ne.string().datetime(),Ne.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Ne.date().refine(Qe)).brand(oe);import{z as Wo}from"zod";var ne=Symbol("DateOut"),or=()=>Wo.date().refine(Qe).transform(e=>e.toISOString()).brand(ne);import{z as Xe}from"zod";var k=Symbol("File"),nr=Xe.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),Qo={buffer:()=>nr.brand(k),string:()=>Xe.string().brand(k),binary:()=>nr.or(Xe.string()).brand(k),base64:()=>Xe.string().base64().brand(k)};function et(e){return Qo[e||"string"]()}import{z as Xo}from"zod";var G=Symbol("Raw"),sr=(e={})=>Xo.object({raw:et("buffer")}).extend(e).brand(G);import{z as en}from"zod";var fe=Symbol("Upload"),ir=()=>en.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(fe);var ar=(e,{next:t})=>e.options.some(t),tn=({_def:e},{next:t})=>[e.left,e.right].some(t),tt=(e,{next:t})=>t(e.unwrap()),zt={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:ar,ZodDiscriminatedUnion:ar,ZodIntersection:tn,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:tt,ZodNullable:tt,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},rt=(e,{condition:t,rules:r=zt,depth:o=1,maxDepth:s=Number.POSITIVE_INFINITY})=>{if(t?.(e))return!0;let i=o<s?r[e._def[h]?.brand]||r[e._def.typeName]:void 0;return i?i(e,{next:a=>rt(a,{condition:t,rules:r,maxDepth:s,depth:o+1})}):!1},pr=e=>rt(e,{condition:t=>t._def[h]?.brand===fe}),cr=e=>rt(e,{condition:t=>t._def[h]?.brand===G,maxDepth:3}),Ct=(e,t)=>{let r=new WeakSet;return rt(e,{maxDepth:300,rules:{...zt,ZodBranded:tt,ZodReadonly:tt,ZodCatch:({_def:{innerType:o}},{next:s})=>s(o),ZodPipeline:({_def:o},{next:s})=>s(o[t]),ZodLazy:(o,{next:s})=>r.has(o)?!1:r.add(o)&&s(o.schema),ZodTuple:({items:o,_def:{rest:s}},{next:i})=>[...o].concat(s??[]).some(i),ZodEffects:{out:void 0,in:zt.ZodEffects}[t],ZodNaN:()=>w("z.nan()"),ZodSymbol:()=>w("z.symbol()"),ZodFunction:()=>w("z.function()"),ZodMap:()=>w("z.map()"),ZodSet:()=>w("z.set()"),ZodBigInt:()=>w("z.bigint()"),ZodVoid:()=>w("z.void()"),ZodPromise:()=>w("z.promise()"),ZodNever:()=>w("z.never()"),ZodDate:()=>t==="in"&&w("z.date()"),[ne]:()=>t==="in"&&w("ez.dateOut()"),[oe]:()=>t==="out"&&w("ez.dateIn()"),[G]:()=>t==="out"&&w("ez.raw()"),[fe]:()=>t==="out"&&w("ez.upload()"),[k]:()=>!1}})};import nn,{isHttpError as sn}from"http-errors";import dr,{isHttpError as rn}from"http-errors";import{z as on}from"zod";var Zt=(e,{variant:t,args:r,...o})=>{if(typeof e=="function"&&(e=e(...r)),e instanceof on.ZodType)return[{schema:e,...o}];if(Array.isArray(e)&&!e.length){let s=new Error(`At least one ${t} response schema required.`);throw new F(s)}return(Array.isArray(e)?e:[e]).map(({schema:s,statusCode:i,mimeType:a})=>({schema:s,statusCodes:typeof i=="number"?[i]:i||o.statusCodes,mimeTypes:typeof a=="string"?[a]:a===void 0?o.mimeTypes:a}))},Et=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),ot=e=>rn(e)?e:dr(e instanceof K?400:500,ee(e),{cause:e.cause||e}),ve=e=>ue()&&!e.expose?dr(e.statusCode).message:e.message;var nt=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=ve(nn(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`
2
- Original error: ${e.handled.message}.`:""),{expose:sn(e.cause)?e.cause.expose:!1}));r.status(500).type("text/plain").end(o)};import{chain as an}from"ramda";var se=e=>re(e)&&"or"in e,he=e=>re(e)&&"and"in e,Nt=e=>({and:an(t=>he(t)?t.and:[t],e)}),st=(e,t)=>he(e)?{and:e.and.map(r=>se(r)?{or:r.or.map(t)}:t(r))}:se(e)?{or:e.or.map(r=>he(r)?{and:r.and.map(t)}:t(r))}:t(e),vt=e=>e.and.reduce((t,r)=>({or:te(t.or,se(r)?r.or:[r],Nt)}),{or:[]}),ge=(e,t)=>he(e)?se(t)?ge(vt(e),t):Nt([e,t]):se(e)?he(t)?ge(t,e):se(t)?{or:te(e.or,t.or,Nt)}:ge(e,{and:[t]}):he(t)||se(t)?ge(t,e):{and:[e,t]};import{z as lr}from"zod";var jt=class{},V=class extends jt{#e;#t;#r;constructor({input:t=lr.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 lr.ZodError?new K(o):o}}},xe=class extends V{constructor(t,{provider:r=()=>({}),transformer:o=s=>s}={}){super({handler:async({request:s,response:i})=>new Promise((a,p)=>{let d=c=>{if(c&&c instanceof Error)return p(o(c));a(r(s,i))};t(s,i,d)?.catch(d)})})}};var be=class{nest(t){return Object.assign(t,{"":this})}};var je=class extends be{},it=class extends je{#e;#t;#r;#n;#s;#i;#o;#a;#p;#c;#d;constructor({methods:t,inputSchema:r,outputSchema:o,handler:s,resultHandler:i,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:m,shortDescription:l}){super(),this.#s=s,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=pr(r)?"upload":cr(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?ge(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 mr.ZodError?new X(r):r}}async#m({method:t,logger:r,options:o,response:s,...i}){for(let a of this.#r)if(!(t==="options"&&!(a instanceof xe))&&(Object.assign(o,await a.execute({...i,options:o,response:s,logger:r})),s.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(s){throw s instanceof mr.ZodError?new K(s):s}return this.#s({...r,input:o})}async#y({error:t,...r}){try{await this.#i.execute({...r,error:t})}catch(o){nt({...r,error:new F(B(o),t||void 0)})}}async execute({request:t,response:r,logger:o,config:s}){let i=Pt(t),a={},p=null,d=null,c=Ye(t,s.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=B(m)}await this.#y({input:c,output:p,request:t,response:r,error:d,logger:o,options:a})}};var ur=(e,t)=>{let r=e.map(s=>s.getSchema()).concat(t),o=r.reduce((s,i)=>s.and(i));return r.reduce((s,i)=>er(i,s),o)};import{z as L}from"zod";var ie={positive:200,negative:400};var kt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},ke=class extends kt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return Zt(this.#e,{variant:"positive",args:[t],statusCodes:[ie.positive],mimeTypes:[A.json]})}getNegativeResponse(){return Zt(this.#t,{variant:"negative",args:[],statusCodes:[ie.negative],mimeTypes:[A.json]})}},Le=new ke({positive:e=>{let t=q({schema:e}),r=L.object({status:L.literal("success"),data:e});return t.reduce((o,s)=>o.example({status:"success",data:s}),r)},negative:L.object({status:L.literal("error"),error:L.object({message:L.string()})}).example({status:"error",error:{message:"Sample error message"}}),handler:({error:e,input:t,output:r,request:o,response:s,logger:i})=>{if(e){let a=ot(e);return Et(a,i,o,t),void s.status(a.statusCode).json({status:"error",error:{message:ve(a)}})}s.status(ie.positive).json({status:"success",data:r})}}),Lt=new ke({positive:e=>{let t=q({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof L.ZodArray?e.shape.items:L.array(L.any());return t.reduce((o,s)=>re(s)&&"items"in s&&Array.isArray(s.items)?o.example(s.items):o,r)},negative:L.string().example("Sample error message"),handler:({response:e,output:t,error:r,logger:o,request:s,input:i})=>{if(r){let a=ot(r);return Et(a,o,s,i),void e.status(a.statusCode).type("text/plain").send(ve(a))}if(t&&"items"in t&&Array.isArray(t.items))return void e.status(ie.positive).json(t.items);throw new Error("Property 'items' is missing in the endpoint output")}});var Me=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 xe(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new V({handler:t})),this.resultHandler)}build({input:t=pn.object({}),handler:r,output:o,description:s,shortDescription:i,operationId:a,scope:p,tag:d,method:c}){let{middlewares:m,resultHandler:l}=this,y=typeof c=="string"?[c]:c,x=typeof a=="function"?a:()=>a,T=typeof p=="string"?[p]:p||[],O=typeof d=="string"?[d]:d||[];return new it({handler:r,middlewares:m,outputSchema:o,resultHandler:l,scopes:T,tags:O,methods:y,getOperationId:x,description:s,shortDescription:i,inputSchema:ur(m,t)})}},cn=new Me(Le),dn=new Me(Lt);import{Ansis as mn,blue as un,cyanBright as yn,green as fn,hex as gn,red as hn}from"ansis";import{inspect as xn}from"node:util";import{performance as Sr}from"node:perf_hooks";var pt={debug:10,info:20,warn:30,error:40},fr=e=>re(e)&&Object.keys(pt).some(t=>t in e),gr=e=>e in pt,hr=(e,t)=>pt[e]<pt[t],xr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),at=xr(),yr=xr(2),ln=e=>e<1e-6?["picosecond",e/1e-9,at]:e<.001?["nanosecond",e/1e-6,at]:e<1?["microsecond",e/.001,at]:e<1e3?["millisecond",e,at]:e<6e4?["second",e/1e3,yr]:["minute",e/6e4,yr],br=e=>{let[t,r,o]=ln(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var Ue=class e{config;styles={debug:un,info:fn,warn:gn("#FFA500"),error:hn};constructor(t={}){let{color:r=new mn().isSupported(),level:o=ue()?"warn":"debug",depth:s=2,ctx:i={}}=t;this.config={color:r,level:o,depth:s,ctx:i}}prettyPrint(t){let{depth:r,color:o,level:s}=this.config;return xn(t,{depth:r,colors:o,breakLength:s==="debug"?80:1/0,compact:s==="debug"?3:!0})}print(t,r,o){let{level:s,ctx:{requestId:i,...a},color:p}=this.config;if(s==="silent"||hr(t,s))return;let d=[new Date().toISOString()];i&&d.push(p?yn(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=Sr.now();return()=>{let o=Sr.now()-r,{message:s,severity:i="debug",formatter:a=br}=typeof t=="object"?t:{message:t};this.print(typeof i=="function"?i(o):i,s,a(o))}}};import{keys as bn,reject as Sn,equals as Tn}from"ramda";var He=class extends be{entries;constructor(t){super();let r=[],o=bn(t);for(let s of o){let i=t[s];i&&r.push([s,i,Sn(Tn(s),o)])}this.entries=Object.freeze(r)}};import On from"express";var Ke=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,On.static(...this.params))}};import Ut from"express";import Cn from"node:http";import Zn from"node:https";var Se=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new Ze(e)};var ct=class{constructor(t){this.logger=t}#e=new WeakSet;check(t,r){if(!this.#e.has(t)){if(t.getRequestType()==="json")try{Ct(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:s,schema:i}of t.getResponses(o))if(s?.includes(A.json))try{Ct(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 Tr=(e,t)=>Object.entries(e).map(([r,o])=>{if(r.includes("/"))throw new me(`The entry '${r}' must avoid having slashes \u2014 use nesting instead.`);let s=r.trim();return[`${t||""}${s?`/${s}`:""}`,o]}),Te=({routing:e,onEndpoint:t,onStatic:r})=>{let o=Tr(e);for(;o.length;){let[s,i]=o.shift();if(i instanceof je){let a=i.getMethods()||["get"];for(let p of a)t(i,s,p)}else if(i instanceof Ke)r&&i.apply(s,r);else if(i instanceof He)for(let[a,p,d]of i.entries){let c=p.getMethods();if(c&&!c.includes(a))throw new me(`Endpoint assigned to ${a} method of ${s} must support ${a} method.`);t(p,s,a,d)}else o.unshift(...Tr(i,s))}};var Mt=({app:e,getLogger:t,config:r,routing:o,parsers:s})=>{let i=new ct(t()),a=new Set;Te({routing:o,onStatic:(p,d)=>void e.use(p,d),onEndpoint:(p,d,c,m)=>{ue()||i.check(p,{path:d,method:c});let l=s?.[p.getRequestType()]||[],y=async(x,T)=>{let O=t(x);if(r.cors){let C={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":[c,...m||[],"options"].join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"},j=typeof r.cors=="function"?await r.cors({request:x,endpoint:p,logger:O,defaultHeaders:C}):C;for(let M in j)T.set(M,j[M])}return p.execute({request:x,response:T,logger:O,config:r})};r.cors&&!a.has(d)&&(e.options(d,...l,y),a.add(d)),e[c](d,...l,y)}})};import zr,{isHttpError as An}from"http-errors";import{setInterval as Rn}from"node:timers/promises";var Or=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",Rr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Ar=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Pr=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),wr=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var Ir=(e,{timeout:t=1e3,logger:r}={})=>{let o,s=new Set,i=c=>void s.delete(c.destroy()),a=c=>void(Or(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):i(c)),p=c=>void(o?c.destroy():s.add(c.once("close",()=>void s.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",Pr);r?.info("Graceful shutdown",{sockets:s.size,timeout:t});for(let c of s)(Ar(c)||Rr(c))&&a(c);for await(let c of Rn(10,Date.now()))if(s.size===0||Date.now()-c>=t)break;for(let c of s)i(c);return Promise.allSettled(e.map(wr))};return{sockets:s,shutdown:()=>o??=d()}};var Cr=({errorHandler:e,getLogger:t})=>async(r,o,s,i)=>r?e.execute({error:An(r)?r:zr(400,B(r).message),request:o,response:s,input:null,output:null,options:{},logger:t(o)}):i(),Zr=({errorHandler:e,getLogger:t})=>async(r,o)=>{let s=zr(404,`Can not ${r.method} ${r.path}`),i=t(r);try{e.execute({request:r,response:o,logger:i,error:s,input:null,output:null,options:{}})}catch(a){nt({response:o,logger:i,error:new F(B(a),s)})}},Pn=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:s})=>s))return r(e);r()},wn=e=>({log:e.debug.bind(e)}),Er=async({getLogger:e,config:t})=>{let r=await Se("express-fileupload"),{limitError:o,beforeUpload:s,...i}={...typeof t.upload=="object"&&t.upload},a=[];return a.push(async(p,d,c)=>{let m=e(p);try{await s?.({request:p,logger:m})}catch(l){return c(l)}return r({debug:!0,...i,abortOnLimit:!1,parseNested:!0,logger:wn(m)})(p,d,c)}),o&&a.push(Pn(o)),a},Nr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},vr=({logger:e,config:t})=>async(r,o,s)=>{let i=await t.childLoggerProvider?.({request:r,parent:e})||e;i.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[h]={logger:i}),s()},jr=e=>t=>t?.res?.locals[h]?.logger||e,kr=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:s})=>e.warn(`${o} (${r}): ${t}`,s.split(`
3
- `).slice(1))),Lr=({servers:e,logger:t,options:{timeout:r,events:o=["SIGINT","SIGTERM"]}})=>{let s=Ir(e,{logger:t,timeout:r}),i=()=>s.shutdown().then(()=>process.exit());for(let a of o)process.on(a,i)};import{gray as In,hex as Mr,italic as dt,whiteBright as zn}from"ansis";var Ur=e=>{if(e.columns<132)return;let t=dt("Proudly supports transgender community.".padStart(109)),r=dt("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),o=dt("Thank you for choosing Express Zod API for your project.".padStart(132)),s=dt("for Kesaria".padEnd(20)),i=Mr("#F5A9B8"),a=Mr("#5BCEFA"),p=new Array(14).fill(a,1,3).fill(i,3,5).fill(zn,5,7).fill(i,7,9).fill(a,9,12).fill(In,12,13),d=`
1
+ import{clone as or,fromPairs as $o,map as Go,pipe as Vo,toPairs as _o,pair as Jo}from"ramda";import{z as he}from"zod";import{chain as tr,memoizeWith as Lo,pickBy as Mo,xprod as Ho}from"ramda";import{z as Uo}from"zod";var T={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream",sse:"text/event-stream"};var ye=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.`}},_e=class extends Error{name="IOSchemaError"},ee=class extends _e{constructor(r){super(te(r),{cause:r});this.cause=r}name="OutputValidationError"},F=class extends _e{constructor(r){super(te(r),{cause:r});this.cause=r}name="InputValidationError"},q=class extends Error{constructor(r,o){super(te(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},je=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var Ko=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(T.upload);return"files"in e&&r},Pt={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Do=["body","query","params"],wt=e=>e.method.toLowerCase(),Et=e=>e.startsWith("x-"),Fo=e=>Mo((t,r)=>Et(r),e),Je=(e,t={})=>{let r=wt(e);return r==="options"?{}:(t[r]||Pt[r]||Do).filter(o=>o==="files"?Ko(e):!0).map(o=>o==="headers"?Fo(e[o]):e[o]).reduce((o,n)=>Object.assign(o,n),{})},$=e=>e instanceof Error?e:new Error(String(e)),te=e=>e instanceof Uo.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof ee?`output${e.cause.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,G=({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},re=(e,t,r)=>e.length&&t.length?Ho(e,t).map(r):e.concat(t),ke=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,It=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),V=(...e)=>{let t=tr(o=>o.split(/[^A-Z0-9]/gi),e);return tr(o=>o.replaceAll(/[A-Z]+/g,n=>`/${n}`).split("/"),t).map(It).join("")},Ye=(e,t)=>{try{return typeof e.parse(t)}catch{return}},oe=e=>typeof e=="object"&&e!==null,ge=Lo(()=>"static",()=>process.env.NODE_ENV==="production");import{clone as Bo,mergeDeepRight as qo}from"ramda";var h=Symbol.for("express-zod-api"),Qe=e=>{let t=e.describe(e.description);return t._def[h]=Bo(t._def[h])||{examples:[]},t},rr=(e,t)=>{if(!(h in e._def))return t;let r=Qe(t);return r._def[h].examples=re(r._def[h].examples,e._def[h].examples,([o,n])=>typeof o=="object"&&typeof n=="object"?qo({...o},{...n}):n),r};var Yo=function(e){let t=Qe(this);return t._def[h].examples.push(e),t},Qo=function(e){let t=Qe(this);return t._def[h].defaultLabel=e,t},Wo=function(e){return new he.ZodBranded({typeName:he.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[h]:{examples:[],...or(this._def[h]),brand:e}})},Xo=function(e){let t=typeof e=="function"?e:Vo(_o,Go(([n,i])=>Jo(e[String(n)]||n,i)),$o),r=t(or(this.shape)),o=he.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};h in globalThis||(globalThis[h]=!0,Object.defineProperties(he.ZodType.prototype,{example:{get(){return Yo.bind(this)}},brand:{set(){},get(){return Wo.bind(this)}}}),Object.defineProperty(he.ZodDefault.prototype,"label",{get(){return Qo.bind(this)}}),Object.defineProperty(he.ZodObject.prototype,"remap",{get(){return Xo.bind(this)}}));function en(e){return e}import{z as gr}from"zod";import{z as fr}from"zod";import{fail as w}from"node:assert/strict";import{z as Le}from"zod";var We=e=>!isNaN(e.getTime());var ne=Symbol("DateIn"),nr=()=>Le.union([Le.string().date(),Le.string().datetime(),Le.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Le.date().refine(We)).brand(ne);import{z as tn}from"zod";var se=Symbol("DateOut"),sr=()=>tn.date().refine(We).transform(e=>e.toISOString()).brand(se);import{z as Xe}from"zod";var k=Symbol("File"),ir=Xe.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),rn={buffer:()=>ir.brand(k),string:()=>Xe.string().brand(k),binary:()=>ir.or(Xe.string()).brand(k),base64:()=>Xe.string().base64().brand(k)};function et(e){return rn[e||"string"]()}import{z as on}from"zod";var _=Symbol("Raw"),ar=(e={})=>on.object({raw:et("buffer")}).extend(e).brand(_);import{z as nn}from"zod";var xe=Symbol("Upload"),pr=()=>nn.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(xe);var cr=(e,{next:t})=>e.options.some(t),sn=({_def:e},{next:t})=>[e.left,e.right].some(t),tt=(e,{next:t})=>t(e.unwrap()),zt={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:cr,ZodDiscriminatedUnion:cr,ZodIntersection:sn,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:tt,ZodNullable:tt,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},rt=(e,{condition:t,rules:r=zt,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=>rt(a,{condition:t,rules:r,maxDepth:n,depth:o+1})}):!1},dr=e=>rt(e,{condition:t=>t._def[h]?.brand===xe}),mr=e=>rt(e,{condition:t=>t._def[h]?.brand===_,maxDepth:3}),Ct=(e,t)=>{let r=new WeakSet;return rt(e,{maxDepth:300,rules:{...zt,ZodBranded:tt,ZodReadonly:tt,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:zt.ZodEffects}[t],ZodNaN:()=>w("z.nan()"),ZodSymbol:()=>w("z.symbol()"),ZodFunction:()=>w("z.function()"),ZodMap:()=>w("z.map()"),ZodSet:()=>w("z.set()"),ZodBigInt:()=>w("z.bigint()"),ZodVoid:()=>w("z.void()"),ZodPromise:()=>w("z.promise()"),ZodNever:()=>w("z.never()"),ZodDate:()=>t==="in"&&w("z.date()"),[se]:()=>t==="in"&&w("ez.dateOut()"),[ne]:()=>t==="out"&&w("ez.dateIn()"),[_]:()=>t==="out"&&w("ez.raw()"),[xe]:()=>t==="out"&&w("ez.upload()"),[k]:()=>!1}})};import cn,{isHttpError as dn}from"http-errors";import lr,{isHttpError as an}from"http-errors";import{z as pn}from"zod";var Zt=(e,{variant:t,args:r,...o})=>{if(typeof e=="function"&&(e=e(...r)),e instanceof pn.ZodType)return[{schema:e,...o}];if(Array.isArray(e)&&!e.length){let n=new Error(`At least one ${t} response schema required.`);throw new q(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===void 0?o.mimeTypes:a}))},Me=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),be=e=>an(e)?e:lr(e instanceof F?400:500,te(e),{cause:e.cause||e}),ie=e=>ge()&&!e.expose?lr(e.statusCode).message:e.message;var ot=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=ie(cn(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`
2
+ Original error: ${e.handled.message}.`:""),{expose:dn(e.cause)?e.cause.expose:!1}));r.status(500).type("text/plain").end(o)};import{chain as mn}from"ramda";var ae=e=>oe(e)&&"or"in e,Te=e=>oe(e)&&"and"in e,vt=e=>({and:mn(t=>Te(t)?t.and:[t],e)}),nt=(e,t)=>Te(e)?{and:e.and.map(r=>ae(r)?{or:r.or.map(t)}:t(r))}:ae(e)?{or:e.or.map(r=>Te(r)?{and:r.and.map(t)}:t(r))}:t(e),Nt=e=>e.and.reduce((t,r)=>({or:re(t.or,ae(r)?r.or:[r],vt)}),{or:[]}),Se=(e,t)=>Te(e)?ae(t)?Se(Nt(e),t):vt([e,t]):ae(e)?Te(t)?Se(t,e):ae(t)?{or:re(e.or,t.or,vt)}:Se(e,{and:[t]}):Te(t)||ae(t)?Se(t,e):{and:[e,t]};import{z as ur}from"zod";var jt=class{},L=class extends jt{#e;#t;#r;constructor({input:t=ur.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 ur.ZodError?new F(o):o}}},Oe=class extends L{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({handler:async({request:n,response:i})=>new Promise((a,c)=>{let d=p=>{if(p&&p instanceof Error)return c(o(p));a(r(n,i))};t(n,i,d)?.catch(d)})})}};var Re=class{nest(t){return Object.assign(t,{"":this})}};var He=class extends Re{},st=class extends He{#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:c=[],middlewares:d=[],tags:p=[],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(c),this.#p=Object.freeze(p),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=dr(r)?"upload":mr(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?Se(t,o):t},{and:[]})}getScopes(){return this.#a}getTags(){return this.#p}getOperationId(t){return this.#c(t)}async#m(t){try{return await this.#o.output.parseAsync(t)}catch(r){throw r instanceof fr.ZodError?new ee(r):r}}async#l({method:t,logger:r,options:o,response:n,...i}){for(let a of this.#r)if(!(t==="options"&&!(a instanceof Oe))&&(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 fr.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){ot({...r,error:new q($(o),t||void 0)})}}async execute({request:t,response:r,logger:o,config:n}){let i=wt(t),a={},c=null,d=null,p=Je(t,n.inputSources);try{if(await this.#l({method:i,input:p,request:t,response:r,logger:o,options:a}),r.writableEnded)return;if(i==="options")return void r.status(200).end();c=await this.#m(await this.#u({input:p,logger:o,options:a}))}catch(m){d=$(m)}await this.#f({input:p,output:c,request:t,response:r,error:d,logger:o,options:a})}};var yr=(e,t)=>{let r=e.map(n=>n.getSchema()).concat(t),o=r.reduce((n,i)=>n.and(i));return r.reduce((n,i)=>rr(i,n),o)};import{z as M}from"zod";var pe={positive:200,negative:400};var kt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},ce=class extends kt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return Zt(this.#e,{variant:"positive",args:[t],statusCodes:[pe.positive],mimeTypes:[T.json]})}getNegativeResponse(){return Zt(this.#t,{variant:"negative",args:[],statusCodes:[pe.negative],mimeTypes:[T.json]})}},Ue=new ce({positive:e=>{let t=G({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=be(e);return Me(a,i,o,t),void n.status(a.statusCode).json({status:"error",error:{message:ie(a)}})}n.status(pe.positive).json({status:"success",data:r})}}),Lt=new ce({positive:e=>{let t=G({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)=>oe(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=be(r);return Me(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(pe.positive).json(t.items);throw new Error("Property 'items' is missing in the endpoint output")}});var de=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 L?t:new L(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new Oe(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new L({handler:t})),this.resultHandler)}build({input:t=gr.object({}),handler:r,output:o,description:n,shortDescription:i,operationId:a,scope:c,tag:d,method:p}){let{middlewares:m,resultHandler:l}=this,f=typeof p=="string"?[p]:p,x=typeof a=="function"?a:()=>a,R=typeof c=="string"?[c]:c||[],O=typeof d=="string"?[d]:d||[];return new st({handler:r,middlewares:m,outputSchema:o,resultHandler:l,scopes:R,tags:O,methods:f,getOperationId:x,description:n,shortDescription:i,inputSchema:yr(m,t)})}buildVoid({handler:t,...r}){return this.build({...r,output:gr.object({}),handler:async o=>(await t(o),{})})}},ln=new de(Ue),un=new de(Lt);import{Ansis as yn,blue as gn,cyanBright as hn,green as xn,hex as bn,red as Sn}from"ansis";import{inspect as Tn}from"node:util";import{performance as Rr}from"node:perf_hooks";var at={debug:10,info:20,warn:30,error:40},xr=e=>oe(e)&&Object.keys(at).some(t=>t in e),br=e=>e in at,Sr=(e,t)=>at[e]<at[t],Tr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),it=Tr(),hr=Tr(2),fn=e=>e<1e-6?["picosecond",e/1e-9,it]:e<.001?["nanosecond",e/1e-6,it]:e<1?["microsecond",e/.001,it]:e<1e3?["millisecond",e,it]:e<6e4?["second",e/1e3,hr]:["minute",e/6e4,hr],Or=e=>{let[t,r,o]=fn(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var Ke=class e{config;styles={debug:gn,info:xn,warn:bn("#FFA500"),error:Sn};constructor(t={}){let{color:r=new yn().isSupported(),level:o=ge()?"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 Tn(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:c}=this.config;if(n==="silent"||Sr(t,n))return;let d=[new Date().toISOString()];i&&d.push(c?hn(i):i),d.push(c?`${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=Rr.now();return()=>{let o=Rr.now()-r,{message:n,severity:i="debug",formatter:a=Or}=typeof t=="object"?t:{message:t};this.print(typeof i=="function"?i(o):i,n,a(o))}}};import{keys as On,reject as Rn,equals as An}from"ramda";var De=class extends Re{entries;constructor(t){super();let r=[],o=On(t);for(let n of o){let i=t[n];i&&r.push([n,i,Rn(An(n),o)])}this.entries=Object.freeze(r)}};import Pn from"express";var Fe=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Pn.static(...this.params))}};import Ht from"express";import vn from"node:http";import Nn from"node:https";var Ae=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new je(e)};var pt=class{constructor(t){this.logger=t}#e=new WeakSet;check(t,r){if(!this.#e.has(t)){if(t.getRequestType()==="json")try{Ct(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(T.json))try{Ct(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 Ar=(e,t)=>Object.entries(e).map(([r,o])=>{if(r.includes("/"))throw new ye(`The entry '${r}' must avoid having slashes \u2014 use nesting instead.`);let n=r.trim();return[`${t||""}${n?`/${n}`:""}`,o]}),Pe=({routing:e,onEndpoint:t,onStatic:r})=>{let o=Ar(e);for(;o.length;){let[n,i]=o.shift();if(i instanceof He){let a=i.getMethods()||["get"];for(let c of a)t(i,n,c)}else if(i instanceof Fe)r&&i.apply(n,r);else if(i instanceof De)for(let[a,c,d]of i.entries){let p=c.getMethods();if(p&&!p.includes(a))throw new ye(`Endpoint assigned to ${a} method of ${n} must support ${a} method.`);t(c,n,a,d)}else o.unshift(...Ar(i,n))}};var Mt=({app:e,getLogger:t,config:r,routing:o,parsers:n})=>{let i=new pt(t()),a=new Set;Pe({routing:o,onEndpoint:(d,p,m,l)=>{ge()||i.check(d,{path:p,method:m});let f=n?.[d.getRequestType()]||[],x=async(R,O)=>{let y=t(R);if(r.cors){let j={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":[m,...l||[],"options"].join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"},U=typeof r.cors=="function"?await r.cors({request:R,endpoint:d,logger:y,defaultHeaders:j}):j;for(let B in U)O.set(B,U[B])}return d.execute({request:R,response:O,logger:y,config:r})};r.cors&&!a.has(p)&&(e.options(p,...f,x),a.add(p)),e[m](p,...f,x)},onStatic:e.use.bind(e)})};import Zr,{isHttpError as En}from"http-errors";import{setInterval as wn}from"node:timers/promises";var Pr=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",wr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Er=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Ir=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),zr=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var Cr=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,i=p=>void n.delete(p.destroy()),a=p=>void(Pr(p)?!p._httpMessage.headersSent&&p._httpMessage.setHeader("connection","close"):i(p)),c=p=>void(o?p.destroy():n.add(p.once("close",()=>void n.delete(p))));for(let p of e)for(let m of["connection","secureConnection"])p.on(m,c);let d=async()=>{for(let p of e)p.on("request",Ir);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let p of n)(Er(p)||wr(p))&&a(p);for await(let p of wn(10,Date.now()))if(n.size===0||Date.now()-p>=t)break;for(let p of n)i(p);return Promise.allSettled(e.map(zr))};return{sockets:n,shutdown:()=>o??=d()}};var vr=({errorHandler:e,getLogger:t})=>async(r,o,n,i)=>r?e.execute({error:En(r)?r:Zr(400,$(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):i(),Nr=({errorHandler:e,getLogger:t})=>async(r,o)=>{let n=Zr(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){ot({response:o,logger:i,error:new q($(a),n)})}},In=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},zn=e=>({log:e.debug.bind(e)}),jr=async({getLogger:e,config:t})=>{let r=await Ae("express-fileupload"),{limitError:o,beforeUpload:n,...i}={...typeof t.upload=="object"&&t.upload},a=[];return a.push(async(c,d,p)=>{let m=e(c);try{await n?.({request:c,logger:m})}catch(l){return p(l)}return r({debug:!0,...i,abortOnLimit:!1,parseNested:!0,logger:zn(m)})(c,d,p)}),o&&a.push(In(o)),a},kr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},Lr=({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()},Mr=e=>t=>t?.res?.locals[h]?.logger||e,Hr=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
3
+ `).slice(1))),Ur=({servers:e,logger:t,options:{timeout:r,events:o=["SIGINT","SIGTERM"]}})=>{let n=Cr(e,{logger:t,timeout:r}),i=()=>n.shutdown().then(()=>process.exit());for(let a of o)process.on(a,i)};import{gray as Cn,hex as Kr,italic as ct,whiteBright as Zn}from"ansis";var Dr=e=>{if(e.columns<132)return;let t=ct("Proudly supports transgender community.".padStart(109)),r=ct("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),o=ct("Thank you for choosing Express Zod API for your project.".padStart(132)),n=ct("for Kesaria".padEnd(20)),i=Kr("#F5A9B8"),a=Kr("#5BCEFA"),c=new Array(14).fill(a,1,3).fill(i,3,5).fill(Zn,5,7).fill(i,7,9).fill(a,9,12).fill(Cn,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
@@ -11,12 +11,13 @@ Original error: ${e.handled.message}.`:""),{expose:sn(e.cause)?e.cause.expose:!1
11
11
  8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P' d8888888888 "Y88P" "Y88888 d88P 888 888 8888888
12
12
  888
13
13
  888${t}
14
- ${s}888${r}
14
+ ${n}888${r}
15
15
  ${o}
16
16
  `;e.write(d.split(`
17
- `).map((c,m)=>p[m]?p[m](c):c).join(`
18
- `))};var Hr=e=>{e.startupLogo!==!1&&Ur(process.stdout);let t=e.errorHandler||Le,r=fr(e.logger)?e.logger:new Ue(e.logger);r.debug("Running",{build:"v21.3.0 (ESM)",env:process.env.NODE_ENV||"development"}),kr(r);let o=vr({logger:r,config:e}),i={getLogger:jr(r),errorHandler:t},a=Zr(i),p=Cr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},En=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:s,loggingMiddleware:i}=Hr(e);return Mt({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:s,logger:r}},Nn=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:s,parserFailureHandler:i,loggingMiddleware:a}=Hr(e),p=Ut().disable("x-powered-by").use(a);if(e.compression){let y=await Se("compression");p.use(y(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||Ut.json()],raw:[e.rawParser||Ut.raw(),Nr],upload:e.upload?await Er({config:e,getLogger:o}):[]};await e.beforeRouting?.({app:p,getLogger:o}),Mt({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(i,s);let c=[],m=(y,x)=>()=>y.listen(x,()=>r.info("Listening",x)),l=[];if(e.http){let y=Cn.createServer(p);c.push(y),l.push(m(y,e.http.listen))}if(e.https){let y=Zn.createServer(e.https.options,p);c.push(y),l.push(m(y,e.https.listen))}return e.gracefulShutdown&&Lr({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:l.map(y=>y())}};import{OpenApiBuilder as Ls}from"openapi3-ts/oas31";import{keys as Ms,pluck as Us}from"ramda";import{isReferenceObject as Dt,isSchemaObject as mt}from"openapi3-ts/oas31";import{concat as vn,type as Fr,filter as jn,fromPairs as ut,has as kn,isNil as Ln,map as Oe,mergeAll as Mn,mergeDeepRight as Un,mergeDeepWith as Hn,objOf as Br,omit as yt,pipe as qr,pluck as Kn,range as Dn,reject as Fn,toLower as Bn,union as qn,when as $n,xprod as Ht,zip as Gn}from"ramda";import{z as b}from"zod";var ae=(e,{onEach:t,rules:r,onMissing:o,ctx:s={}})=>{let i=r[e._def[h]?.brand]||r[e._def.typeName],p=i?i(e,{...s,next:c=>ae(c,{ctx:s,onEach:t,rules:r,onMissing:o})}):o(e,s),d=t&&t(e,{prev:p,...s});return d?{...p,...d}:p};var Kr=50,$r="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Vn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Gr=/:([A-Za-z0-9_]+)/g,_n=e=>e.match(Gr)?.map(t=>t.slice(1))||[],Vr=e=>e.replace(Gr,t=>`{${t.slice(1)}}`),Yn=({_def:e},{next:t})=>({...t(e.innerType),default:e[h]?.defaultLabel||e.defaultValue()}),Jn=({_def:{innerType:e}},{next:t})=>t(e),Wn=()=>({format:"any"}),Qn=({},e)=>{if(e.isResponse)throw new E("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},Xn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},es=({options:e},{next:t})=>({oneOf:e.map(t)}),ts=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),rs=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return vn(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},os=e=>{let[t,r]=e.filter(mt).filter(s=>s.type==="object"&&Object.keys(s).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=Hn(rs,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=qn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=te(t.examples||[],r.examples||[],([s,i])=>Un(s,i))),o},ns=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return os(o)}catch{}return{allOf:o}},ss=(e,{next:t})=>t(e.unwrap()),is=(e,{next:t})=>t(e.unwrap()),as=(e,{next:t})=>{let r=t(e.unwrap());return mt(r)&&(r.type=Yr(r)),r},_r=e=>{let t=Bn(Fr(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Dr=e=>({type:_r(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),ps=({value:e})=>({type:_r(e),const:e}),cs=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),s=p=>t&&Ee(p)?p instanceof b.ZodOptional:p.isOptional(),i=o.filter(p=>!s(e.shape[p])),a={type:"object"};return o.length&&(a.properties=lt(e,r)),i.length&&(a.required=i),a},ds=()=>({type:"null"}),ls=({},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:$r}}},ms=({},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:$r}}},us=({},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)},ys=()=>({type:"boolean"}),fs=()=>({type:"integer",format:"bigint"}),gs=e=>e.every(t=>t instanceof b.ZodLiteral),hs=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.ZodEnum||e instanceof b.ZodNativeEnum){let o=Object.values(e.enum),s={type:"object"};return o.length&&(s.properties=lt(b.object(ut(Ht(o,[t]))),r),s.required=o),s}if(e instanceof b.ZodLiteral)return{type:"object",properties:lt(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&gs(e.options)){let o=Oe(i=>`${i.value}`,e.options),s=ut(Ht(o,[t]));return{type:"object",properties:lt(b.object(s),r),required:o}}return{type:"object",additionalProperties:r(t)}},xs=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let s={type:"array",items:o(r)};return e&&(s.minItems=e.value),t&&(s.maxItems=t.value),s},bs=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Ss=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:s,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:m,_def:{checks:l}})=>{let y=l.find(I=>I.kind==="regex"),x=l.find(I=>I.kind==="datetime"),T=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"},g={"date-time":m,email:e,url:t,uuid:s,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let I in g)if(g[I]){O.format=I;break}return r!==null&&(O.minLength=r),o!==null&&(O.maxLength=o),T&&(O.pattern=T.source),O},Ts=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let s=o.find(l=>l.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=s?s.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},lt=({shape:e},t)=>Oe(t,e),Os=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Vn?.[t]},Yr=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",Rs=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:s}=e._def;if(t&&s.type==="transform"&&mt(o)){let i=Je(e,Os(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(b.any())}if(!t&&s.type==="preprocess"&&mt(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},As=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Ps=(e,{next:t})=>t(e.unwrap()),ws=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),Is=(e,{next:t})=>t(e.unwrap().shape.raw),Jr=e=>e.length?ut(Gn(Dn(1,e.length+1).map(t=>`example${t}`),Oe(Br("value"),e))):void 0,Wr=(e,t,r=[])=>qr(q,Oe($n(o=>Fr(o)==="Object",yt(r))),Jr)({schema:e,variant:t?"parsed":"original",validate:!0}),zs=(e,t)=>qr(q,jn(kn(t)),Kn(t),Jr)({schema:e,variant:"original",validate:!0}),pe=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?pe(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>pe(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?pe(e._def.schema):e instanceof b.ZodPipeline?pe(e._def.in):pe(e._def.left).merge(pe(e._def.right)),Qr=({path:e,method:t,schema:r,inputSources:o,makeRef:s,composition:i,brandHandling:a,description:p=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=pe(r),c=_n(e),m=o.includes("query"),l=o.includes("params"),y=o.includes("headers"),x=g=>l&&c.includes(g),T=g=>y&&wt(g);return Object.keys(d).map(g=>({name:g,location:x(g)?"path":T(g)?"header":m?"query":void 0})).filter(g=>g.location!==void 0).map(({name:g,location:I})=>{let C=ae(d[g],{rules:{...a,...Ft},onEach:Bt,onMissing:qt,ctx:{isResponse:!1,makeRef:s,path:e,method:t}}),j=i==="components"?s(d[g],C,$(p,g)):C;return{name:g,in:I,required:!d[g].isOptional(),description:C.description||p,schema:j,examples:zs(r,g)}})},Ft={ZodString:Ss,ZodNumber:Ts,ZodBigInt:fs,ZodBoolean:ys,ZodNull:ds,ZodArray:xs,ZodTuple:bs,ZodRecord:hs,ZodObject:cs,ZodLiteral:ps,ZodIntersection:ns,ZodUnion:es,ZodAny:Wn,ZodDefault:Yn,ZodEnum:Dr,ZodNativeEnum:Dr,ZodEffects:Rs,ZodOptional:ss,ZodNullable:as,ZodDiscriminatedUnion:ts,ZodBranded:Ps,ZodDate:us,ZodCatch:Jn,ZodPipeline:As,ZodLazy:ws,ZodReadonly:is,[k]:Xn,[fe]:Qn,[ne]:ms,[oe]:ls,[G]:Is},Bt=(e,{isResponse:t,prev:r})=>{if(Dt(r))return{};let{description:o}=e,s=e instanceof b.ZodLazy,i=r.type!==void 0,a=t&&Ee(e),p=!s&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),p&&(d.type=Yr(r)),!s){let c=q({schema:e,variant:t?"parsed":"original",validate:!0});c.length&&(d.examples=c.slice())}return d},qt=(e,t)=>{throw new E(`Zod type ${e.constructor.name} is unsupported.`,t)},Kt=(e,t)=>{if(Dt(e))return e;let r={...e};return r.properties&&(r.properties=yt(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>yt(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Kt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Kt(o,t))),r},Xr=e=>Dt(e)?e:yt(["examples"],e),eo=({method:e,path:t,schema:r,mimeTypes:o,variant:s,makeRef:i,composition:a,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:m=`${e.toUpperCase()} ${t} ${It(s)} response ${p?d:""}`.trim()})=>{if(!o)return{description:m};let l=Xr(ae(r,{rules:{...c,...Ft},onEach:Bt,onMissing:qt,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),y={schema:a==="components"?i(r,l,$(m)):l,examples:Wr(r,!0)};return{description:m,content:ut(Ht(o,[y]))}},Cs=()=>({type:"http",scheme:"basic"}),Zs=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Es=({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},Ns=({name:e})=>({type:"apiKey",in:"header",name:e}),vs=({name:e})=>({type:"apiKey",in:"cookie",name:e}),js=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),ks=({flows:e={}})=>({type:"oauth2",flows:Oe(t=>({...t,scopes:t.scopes||{}}),Fn(Ln,e))}),to=(e,t)=>{let r={basic:Cs,bearer:Zs,input:Es,header:Ns,cookie:vs,openid:js,oauth2:ks};return st(e,o=>r[o.type](o,t))},ft=e=>"or"in e?e.or.map(t=>"and"in t?Mn(Oe(({name:r,scopes:o})=>Br(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?ft(vt(e)):ft({or:[e]}),ro=({method:e,path:t,schema:r,mimeType:o,makeRef:s,composition:i,brandHandling:a,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let c=Xr(Kt(ae(r,{rules:{...a,...Ft},onEach:Bt,onMissing:qt,ctx:{isResponse:!1,makeRef:s,path:t,method:e}}),p)),m={schema:i==="components"?s(r,c,$(d)):c,examples:Wr(r,!1,p)};return{description:d,content:{[o]:m}}},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}),$t=e=>e.length<=Kr?e:e.slice(0,Kr-1)+"\u2026";var Gt=class extends Ls{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=Ms(ie);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 s=o||$(r,t),i=this.lastOperationIdSuffixes.get(s);if(i===void 0)return this.lastOperationIdSuffixes.set(s,1),s;if(o)throw new E(`Duplicated operationId: "${o}"`,{method:r,isResponse:!1,path:t});return i++,this.lastOperationIdSuffixes.set(s,i),`${s}${i}`}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let s in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[s]))return s;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:s,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline"}){super(),this.addInfo({title:o,version:s});for(let l of typeof i=="string"?[i]:i)this.addServer({url:l});Te({routing:t,onEndpoint:(l,y,x)=>{let T={path:y,method:x,endpoint:l,composition:c,brandHandling:p,makeRef:this.makeRef.bind(this)},[O,g]=["short","long"].map(l.getDescription.bind(l)),I=O?$t(O):d&&g?$t(g):void 0,C=l.getTags(),j=r.inputSources?.[x]||At[x],M=this.ensureUniqOperationId(y,x,l.getOperationId(x)),Ie=Qr({...T,inputSources:j,schema:l.getSchema("input"),description:a?.requestParameter?.call(null,{method:x,path:y,operationId:M})}),Be={};for(let U of this.responseVariants){let Y=l.getResponses(U);for(let{mimeTypes:ze,schema:Rt,statusCodes:$e}of Y)for(let Ce of $e)Be[Ce]=eo({...T,variant:U,schema:Rt,mimeTypes:ze,statusCode:Ce,hasMultipleStatusCodes:Y.length>1||$e.length>1,description:a?.[`${U}Response`]?.call(null,{method:x,path:y,operationId:M,statusCode:Ce})})}let Ot=j.includes("body")?ro({...T,paramNames:Us("name",Ie),schema:l.getSchema("input"),mimeType:A[l.getRequestType()],description:a?.requestBody?.call(null,{method:x,path:y,operationId:M})}):void 0,qe=ft(st(to(l.getSecurity(),j),U=>{let Y=this.ensureUniqSecuritySchemaName(U),ze=["oauth2","openIdConnect"].includes(U.type)?l.getScopes().slice():[];return this.addSecurityScheme(Y,U),{name:Y,scopes:ze}}));this.addPath(Vr(y),{[x]:{operationId:M,summary:I,description:g,tags:C.length>0?C:void 0,parameters:Ie.length>0?Ie:void 0,requestBody:Ot,security:qe.length>0?qe:void 0,responses:Be}})}}),this.rootDoc.tags=r.tags?oo(r.tags):[]}};import{createRequest as Hs,createResponse as Ks}from"node-mocks-http";var Ds=e=>Hs({...e,headers:{"content-type":A.json,...e?.headers}}),Fs=e=>Ks(e),Bs=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,s){return o==="_getLogs"?()=>t:gr(o)?(...i)=>t[o].push(i):Reflect.get(r,o,s)}})},no=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let s=Ds(e),i=Fs({req:s,...t});i.req=t?.req||s,s.res=i;let a=Bs(o),p={cors:!1,logger:a,...r};return{requestMock:s,responseMock:i,loggerMock:a,configMock:p}},qs=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:s,configMock:i}=no(t);return await e.execute({request:r,response:o,config:i,logger:s}),{requestMock:r,responseMock:o,loggerMock:s}},$s=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:s,responseMock:i,loggerMock:a,configMock:p}=no(o),d=Ye(s,p.inputSources);try{let c=await e.execute({request:s,response:i,logger:a,input:d,options:t});return{requestMock:s,responseMock:i,loggerMock:a,output:c}}catch(c){if(!r)throw c;return r(B(c),i),{requestMock:s,responseMock:i,loggerMock:a,output:{}}}};import z from"typescript";import{z as Ai}from"zod";import R from"typescript";var n=R.factory,ce=[n.createModifier(R.SyntaxKind.ExportKeyword)],Gs=[n.createModifier(R.SyntaxKind.AsyncKeyword)],Vs=[n.createModifier(R.SyntaxKind.PublicKeyword)],so=[n.createModifier(R.SyntaxKind.ProtectedKeyword),n.createModifier(R.SyntaxKind.ReadonlyKeyword)],io=n.createToken(R.SyntaxKind.DotDotDotToken),_s=n.createTemplateHead(""),Ys=n.createTemplateMiddle(" "),De=n.createTemplateTail(""),Re=n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[n.createKeywordTypeNode(R.SyntaxKind.StringKeyword),n.createKeywordTypeNode(R.SyntaxKind.AnyKeyword)]),Js=e=>n.createTemplateLiteralType(_s,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?De:Ys))),gt=Js(["M","P"]),ht=(e,t,r)=>n.createParameterDeclaration(Array.isArray(r)?r:void 0,Array.isArray(r)?void 0:r,e,void 0,t,void 0),Ae=(e,t)=>Object.entries(e).map(([r,o])=>ht(n.createIdentifier(r),o,t)),ao=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),po=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),co=(...e)=>n.createArrayBindingPattern(e.map(t=>n.createBindingElement(void 0,void 0,t))),N=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],R.NodeFlags.Const),Vt=(e,t)=>Fe(e,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),Fe=(e,t)=>n.createTypeAliasDeclaration(ce,e,void 0,t),xt=(e,t,r,o,s)=>n.createMethodDeclaration(Vs,void 0,e,void 0,o,t,s,r),lo=(e,t,r)=>n.createClassDeclaration(ce,e,void 0,void 0,[t,...r]),mo=(e,t,r)=>n.createConditionalTypeNode(t,n.createTypeOperatorNode(R.SyntaxKind.KeyOfKeyword,n.createTypeReferenceNode(e)),n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t),r),bt=e=>n.createTypeReferenceNode(Promise.name,[e==="any"?n.createKeywordTypeNode(R.SyntaxKind.AnyKeyword):e]),uo=(e,t)=>n.createInterfaceDeclaration(ce,e,void 0,void 0,t),_t=e=>Object.entries(e).map(([t,r])=>n.createTypeParameterDeclaration([],t,n.createTypeReferenceNode(r))),yo=(e,t,r)=>n.createArrowFunction(r?Gs:void 0,void 0,e.map(o=>ht(o)),void 0,void 0,t),Yt=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier(Object.name),P("keys")),void 0,[e]),P("reduce")),void 0,[n.createArrowFunction(void 0,void 0,Ae({acc:void 0,key:void 0}),void 0,void 0,t),r]),fo=(...e)=>`"${e.join(" ")}"`,P=e=>e,Pe=(e,t,r)=>n.createConditionalExpression(e,n.createToken(R.SyntaxKind.QuestionToken),t,n.createToken(R.SyntaxKind.ColonToken),r),v=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(Array.isArray(e)?n.createPropertyAccessExpression(...e):e,t),void 0,r),go=(e,t)=>n.createBinaryExpression(e,n.createToken(R.SyntaxKind.AmpersandAmpersandToken),t),ho=(e,t)=>n.createBinaryExpression(e,n.createToken(R.SyntaxKind.EqualsEqualsEqualsToken),t);var xo=["get","post","put","delete","patch"];import{chain as Xs,prop as ei}from"ramda";import f from"typescript";import{z as Wt}from"zod";import S from"typescript";var{factory:St}=S,we=(e,t)=>S.addSyntheticLeadingComment(e,S.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),de=(e,t,r)=>{let o=St.createTypeAliasDeclaration(void 0,St.createIdentifier(t),void 0,e);return r?we(o,r):o},Jt=(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)},Ws=/^[A-Za-z_$][A-Za-z0-9_$]*$/,bo=e=>Ws.test(e)?St.createIdentifier(e):St.createStringLiteral(e),Qs=[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],So=e=>Qs.includes(e.kind);var{factory:u}=f,ti={[f.SyntaxKind.AnyKeyword]:"",[f.SyntaxKind.BigIntKeyword]:BigInt(0),[f.SyntaxKind.BooleanKeyword]:!1,[f.SyntaxKind.NumberKeyword]:0,[f.SyntaxKind.ObjectKeyword]:{},[f.SyntaxKind.StringKeyword]:"",[f.SyntaxKind.UndefinedKeyword]:void 0},ri=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),oi=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let s=Object.entries(e).map(([i,a])=>{let p=t&&Ee(a)?a instanceof Wt.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,bo(i),p&&o?u.createToken(f.SyntaxKind.QuestionToken):void 0,r(a));return a.description?we(d,a.description):d});return u.createTypeLiteralNode(s)},ni=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),si=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),To=({options:e},{next:t})=>{let r=new Map;for(let o of e){let s=t(o);r.set(So(s)?s.kind:s,s)}return u.createUnionTypeNode(Array.from(r.values()))},ii=e=>ti?.[e.kind],ai=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let s=Je(e,ii(o)),i={number:f.SyntaxKind.NumberKeyword,bigint:f.SyntaxKind.BigIntKeyword,boolean:f.SyntaxKind.BooleanKeyword,string:f.SyntaxKind.StringKeyword,undefined:f.SyntaxKind.UndefinedKeyword,object:f.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(s&&i[s]||f.SyntaxKind.AnyKeyword)}return o},pi=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),ci=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(f.SyntaxKind.UndefinedKeyword)]):o},di=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),li=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),mi=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),ui=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(f.isTypeLiteralNode)?u.createTypeLiteralNode(Xs(ei("members"),o)):u.createIntersectionTypeNode(o)},yi=({_def:e},{next:t})=>t(e.innerType),_=e=>()=>u.createKeywordTypeNode(e),fi=(e,{next:t})=>t(e.unwrap()),gi=(e,{next:t})=>t(e.unwrap()),hi=({_def:e},{next:t})=>t(e.innerType),xi=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),bi=()=>u.createLiteralTypeNode(u.createNull()),Si=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),Ti=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(f.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),s=u.createUnionTypeNode([r,o]);return t instanceof Wt.ZodString?r:t instanceof Wt.ZodUnion?s:o},Oi=(e,{next:t})=>t(e.unwrap().shape.raw),Ri={ZodString:_(f.SyntaxKind.StringKeyword),ZodNumber:_(f.SyntaxKind.NumberKeyword),ZodBigInt:_(f.SyntaxKind.BigIntKeyword),ZodBoolean:_(f.SyntaxKind.BooleanKeyword),ZodAny:_(f.SyntaxKind.AnyKeyword),ZodUndefined:_(f.SyntaxKind.UndefinedKeyword),[oe]:_(f.SyntaxKind.StringKeyword),[ne]:_(f.SyntaxKind.StringKeyword),ZodNull:bi,ZodArray:ni,ZodTuple:li,ZodRecord:mi,ZodObject:oi,ZodLiteral:ri,ZodIntersection:ui,ZodUnion:To,ZodDefault:yi,ZodEnum:si,ZodNativeEnum:pi,ZodEffects:ai,ZodOptional:ci,ZodNullable:di,ZodDiscriminatedUnion:To,ZodBranded:fi,ZodCatch:hi,ZodPipeline:xi,ZodLazy:Si,ZodReadonly:gi,[k]:Ti,[G]:Oi},Tt=(e,{brandHandling:t,ctx:r})=>ae(e,{rules:{...t,...Ri},onMissing:()=>u.createKeywordTypeNode(f.SyntaxKind.AnyKeyword),ctx:r});var Qt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:n.createIdentifier("Path"),methodType:n.createIdentifier("Method"),methodPathType:n.createIdentifier("MethodPath"),inputInterface:n.createIdentifier("Input"),posResponseInterface:n.createIdentifier("PositiveResponse"),negResponseInterface:n.createIdentifier("NegativeResponse"),responseInterface:n.createIdentifier("Response"),jsonEndpointsConst:n.createIdentifier("jsonEndpoints"),endpointTagsConst:n.createIdentifier("endpointTags"),providerType:n.createIdentifier("Provider"),implementationType:n.createIdentifier("Implementation"),clientClass:n.createIdentifier("ExpressZodAPIClient"),keyParameter:n.createIdentifier("key"),pathParameter:n.createIdentifier("path"),paramsArgument:n.createIdentifier("params"),methodParameter:n.createIdentifier("method"),requestParameter:n.createIdentifier("request"),args:n.createIdentifier("args"),accumulator:n.createIdentifier("acc"),provideMethod:n.createIdentifier("provide"),implementationArgument:n.createIdentifier("implementation"),headersProperty:n.createIdentifier("headers"),hasBodyConst:n.createIdentifier("hasBody"),undefinedValue:n.createIdentifier("undefined"),bodyProperty:n.createIdentifier("body"),responseConst:n.createIdentifier("response"),searchParamsConst:n.createIdentifier("searchParams"),exampleImplementationConst:n.createIdentifier("exampleImplementation"),clientConst:n.createIdentifier("client"),contentTypeConst:n.createIdentifier("contentType"),isJsonConst:n.createIdentifier("isJSON")};interfaces=[];makeAlias(t,r){let o=this.aliases.get(t)?.name?.text;if(!o){o=`Type${this.aliases.size+1}`;let s=n.createLiteralTypeNode(n.createNull());this.aliases.set(t,de(s,o)),this.aliases.set(t,de(r(),o))}return n.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",optionalPropStyle:s={withQuestionMark:!0,withUndefined:!0},noContent:i=Ai.undefined()}){let a={makeAlias:this.makeAlias.bind(this),optionalPropStyle:s},p={brandHandling:r,ctx:{...a,isResponse:!1}},d={brandHandling:r,ctx:{...a,isResponse:!0}};Te({routing:t,onEndpoint:(H,J,Ge)=>{let[Ve,le,W,D]=["input","positive.response","negative.response","response"].map(Z=>$(Ge,J,Z)),wo=Tt(H.getSchema("input"),p),Io=H.getResponses("positive").map(({schema:Z,mimeTypes:Q})=>Q?Z:i).reduce((Z,Q)=>Z.or(Q)),zo=Tt(Io,d),Co=H.getResponses("negative").map(({schema:Z,mimeTypes:Q})=>Q?Z:i).reduce((Z,Q)=>Z.or(Q)),Zo=Tt(Co,d),Eo=n.createUnionTypeNode([n.createTypeReferenceNode(le),n.createTypeReferenceNode(W)]);this.program.push(de(wo,Ve),de(zo,le),de(Zo,W),de(Eo,D)),this.paths.push(J),this.registry.set({method:Ge,path:J},{input:Ve,positive:le,negative:W,response:D,isJson:H.getResponses("positive").some(Z=>Z.mimeTypes?.includes(A.json)),tags:H.getTags()})}}),this.program.unshift(...this.aliases.values()),this.program.push(Vt(this.ids.pathType,this.paths)),this.program.push(Vt(this.ids.methodType,xo)),this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]},{id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]},{id:this.ids.responseInterface,kind:"response",props:[]});let c=[],m=[];for(let[{method:H,path:J},{isJson:Ge,tags:Ve,...le}]of this.registry){let W=fo(H,J);for(let D of this.interfaces)D.kind in le&&D.props.push(po(W,le[D.kind]));o!=="types"&&(Ge&&c.push(n.createPropertyAssignment(W,n.createTrue())),m.push(n.createPropertyAssignment(W,n.createArrayLiteralExpression(Ve.map(D=>n.createStringLiteral(D))))))}for(let{id:H,props:J}of this.interfaces)this.program.push(uo(H,J));if(this.program.push(Fe(this.ids.methodPathType,n.createTypeOperatorNode(z.SyntaxKind.KeyOfKeyword,n.createTypeReferenceNode(this.ids.inputInterface)))),o==="types")return;let l=n.createVariableStatement(ce,N(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(c))),y=n.createVariableStatement(ce,N(this.ids.endpointTagsConst,n.createObjectLiteralExpression(m))),x=Fe(this.ids.implementationType,n.createFunctionTypeNode(void 0,Ae({[this.ids.methodParameter.text]:n.createTypeReferenceNode(this.ids.methodType),[this.ids.pathParameter.text]:n.createKeywordTypeNode(z.SyntaxKind.StringKeyword),[this.ids.paramsArgument.text]:Re}),bt("any"))),T=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,De)]),O=Yt(this.ids.paramsArgument,v(this.ids.accumulator,P("replace"),[T,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),g=Yt(this.ids.paramsArgument,v(n.createIdentifier(Object.name),P("assign"),[this.ids.accumulator,go(n.createPrefixUnaryExpression(z.SyntaxKind.ExclamationToken,v(this.ids.pathParameter,P("includes"),[T])),n.createObjectLiteralExpression([n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))],!1))]),n.createObjectLiteralExpression()),I=we(xt(this.ids.provideMethod,Ae({[this.ids.methodParameter.text]:n.createTypeReferenceNode("M"),[this.ids.pathParameter.text]:n.createTypeReferenceNode("P"),[this.ids.paramsArgument.text]:n.createConditionalTypeNode(gt,n.createTypeOperatorNode(z.SyntaxKind.KeyOfKeyword,n.createTypeReferenceNode(this.ids.inputInterface)),n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),gt),Re)}),void 0,_t({M:this.ids.methodType,P:this.ids.pathType}),bt(mo(this.ids.responseInterface,gt,n.createKeywordTypeNode(z.SyntaxKind.UnknownKeyword)))),"@deprecated use the overload with 2 arguments instead"),C=xt(this.ids.provideMethod,Ae({[this.ids.requestParameter.text]:n.createTypeReferenceNode("K"),[this.ids.paramsArgument.text]:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),n.createTypeReferenceNode("K"))}),void 0,_t({K:this.ids.methodPathType}),bt(n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.responseInterface),n.createTypeReferenceNode("K")))),j=xt(this.ids.provideMethod,Ae({[this.ids.args.text]:n.createUnionTypeNode([n.createTupleTypeNode([n.createKeywordTypeNode(z.SyntaxKind.StringKeyword),n.createKeywordTypeNode(z.SyntaxKind.StringKeyword),Re]),n.createTupleTypeNode([n.createKeywordTypeNode(z.SyntaxKind.StringKeyword),Re])])},io),n.createBlock([n.createVariableStatement(void 0,N(co(this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument),n.createAsExpression(n.createParenthesizedExpression(Pe(ho(n.createPropertyAccessExpression(this.ids.args,P("length")),n.createNumericLiteral(2)),n.createArrayLiteralExpression([n.createSpreadElement(v(n.createElementAccessExpression(this.ids.args,0),P("split"),[n.createRegularExpressionLiteral("/ (.+)/"),n.createNumericLiteral(2)])),n.createElementAccessExpression(this.ids.args,1)]),this.ids.args)),n.createTupleTypeNode([n.createTypeReferenceNode(this.ids.methodType),n.createTypeReferenceNode(this.ids.pathType),Re])))),n.createReturnStatement(v(n.createThis(),this.ids.implementationArgument,[this.ids.methodParameter,O,g]))])),M=lo(this.ids.clientClass,ao([ht(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),so)]),[I,C,j]),Ie=we(Fe(this.ids.providerType,n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.clientClass),n.createLiteralTypeNode(n.createStringLiteral(this.ids.provideMethod.text)))),"@deprecated will be removed in v22");this.program.push(l,y,x,M,Ie);let Be=n.createPropertyAssignment(this.ids.methodParameter,v(this.ids.methodParameter,P("toUpperCase"))),Ot=n.createPropertyAssignment(this.ids.headersProperty,Pe(this.ids.hasBodyConst,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(A.json))]),this.ids.undefinedValue)),qe=n.createPropertyAssignment(this.ids.bodyProperty,Pe(this.ids.hasBodyConst,v(n.createIdentifier("JSON"),P("stringify"),[this.ids.paramsArgument]),this.ids.undefinedValue)),U=n.createVariableStatement(void 0,N(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier(fetch.name),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,De)]),n.createObjectLiteralExpression([Be,Ot,qe])])))),Y=n.createVariableStatement(void 0,N(this.ids.hasBodyConst,n.createLogicalNot(v(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),P("includes"),[this.ids.methodParameter])))),ze=n.createVariableStatement(void 0,N(this.ids.searchParamsConst,Pe(this.ids.hasBodyConst,n.createStringLiteral(""),n.createTemplateExpression(n.createTemplateHead("?"),[n.createTemplateSpan(n.createNewExpression(n.createIdentifier(URLSearchParams.name),void 0,[this.ids.paramsArgument]),De)])))),Rt=n.createVariableStatement(void 0,N(this.ids.contentTypeConst,v([this.ids.responseConst,this.ids.headersProperty],P("get"),[n.createStringLiteral("content-type")]))),$e=n.createIfStatement(n.createPrefixUnaryExpression(z.SyntaxKind.ExclamationToken,this.ids.contentTypeConst),n.createReturnStatement(void 0),void 0),Ce=n.createVariableStatement(void 0,N(this.ids.isJsonConst,n.createCallChain(n.createPropertyAccessChain(this.ids.contentTypeConst,void 0,P("startsWith")),void 0,void 0,[n.createStringLiteral(A.json)]))),Oo=n.createReturnStatement(n.createCallExpression(n.createElementAccessExpression(this.ids.responseConst,Pe(this.ids.isJsonConst,n.createStringLiteral(P("json")),n.createStringLiteral(P("text")))),void 0,[])),Ro=n.createVariableStatement(ce,N(this.ids.exampleImplementationConst,yo([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([Y,ze,U,Rt,$e,Ce,Oo]),!0),n.createTypeReferenceNode(this.ids.implementationType))),Ao=n.createExpressionStatement(v(this.ids.clientConst,this.ids.provideMethod,[n.createStringLiteral("get /v1/user/retrieve"),n.createObjectLiteralExpression([n.createPropertyAssignment("id",n.createStringLiteral("10"))])])),Po=n.createVariableStatement(void 0,N(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(Ro,Po,Ao)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Jt(r,t)).join(`
19
- `):void 0}print(t){let r=this.printUsage(t),o=r&&z.addSyntheticLeadingComment(z.addSyntheticLeadingComment(n.createEmptyStatement(),z.SyntaxKind.SingleLineCommentTrivia," Usage example:"),z.SyntaxKind.MultiLineCommentTrivia,`
20
- ${r}`);return this.program.concat(o||[]).map((s,i)=>Jt(s,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
17
+ `).map((p,m)=>c[m]?c[m](p):p).join(`
18
+ `))};var Fr=e=>{e.startupLogo!==!1&&Dr(process.stdout);let t=e.errorHandler||Ue,r=xr(e.logger)?e.logger:new Ke(e.logger);r.debug("Running",{build:"v21.5.0 (ESM)",env:process.env.NODE_ENV||"development"}),Hr(r);let o=Lr({logger:r,config:e}),i={getLogger:Mr(r),errorHandler:t},a=Nr(i),c=vr(i);return{...i,logger:r,notFoundHandler:a,parserFailureHandler:c,loggingMiddleware:o}},jn=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:i}=Fr(e);return Mt({app:e.app.use(i),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},kn=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=Fr(e),c=Ht().disable("x-powered-by").use(a);if(e.compression){let f=await Ae("compression");c.use(f(typeof e.compression=="object"?e.compression:void 0))}let d={json:[e.jsonParser||Ht.json()],raw:[e.rawParser||Ht.raw(),kr],upload:e.upload?await jr({config:e,getLogger:o}):[]};await e.beforeRouting?.({app:c,getLogger:o}),Mt({app:c,routing:t,getLogger:o,config:e,parsers:d}),c.use(i,n);let p=[],m=(f,x)=>()=>f.listen(x,()=>r.info("Listening",x)),l=[];if(e.http){let f=vn.createServer(c);p.push(f),l.push(m(f,e.http.listen))}if(e.https){let f=Nn.createServer(e.https.options,c);p.push(f),l.push(m(f,e.https.listen))}return e.gracefulShutdown&&Ur({logger:r,servers:p,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:c,logger:r,servers:l.map(f=>f())}};import{OpenApiBuilder as Us}from"openapi3-ts/oas31";import{keys as Ks,pluck as Ds}from"ramda";import{isReferenceObject as Dt,isSchemaObject as mt}from"openapi3-ts/oas31";import{concat as Ln,type as $r,filter as Mn,fromPairs as lt,has as Hn,isNil as Un,map as we,mergeAll as Kn,mergeDeepRight as Dn,mergeDeepWith as Fn,objOf as Gr,omit as ut,pipe as Vr,pluck as Bn,range as qn,reject as $n,toLower as Gn,union as Vn,when as _n,xprod as Ut,zip as Jn}from"ramda";import{z as b}from"zod";var me=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[h]?.brand]||r[e._def.typeName],c=i?i(e,{...n,next:p=>me(p,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:c,...n});return d?{...c,...d}:c};var Br=50,_r="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Yn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Jr=/:([A-Za-z0-9_]+)/g,Qn=e=>e.match(Jr)?.map(t=>t.slice(1))||[],Yr=e=>e.replace(Jr,t=>`{${t.slice(1)}}`),Wn=({_def:e},{next:t})=>({...t(e.innerType),default:e[h]?.defaultLabel||e.defaultValue()}),Xn=({_def:{innerType:e}},{next:t})=>t(e),es=()=>({format:"any"}),ts=({},e)=>{if(e.isResponse)throw new z("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},rs=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},os=({options:e},{next:t})=>({oneOf:e.map(t)}),ns=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),ss=(e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return Ln(e,t);if(e===t)return t;throw new Error("Can not flatten properties")},is=e=>{let[t,r]=e.filter(mt).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=Fn(ss,t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=Vn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=re(t.examples||[],r.examples||[],([n,i])=>Dn(n,i))),o},as=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return is(o)}catch{}return{allOf:o}},ps=(e,{next:t})=>t(e.unwrap()),cs=(e,{next:t})=>t(e.unwrap()),ds=(e,{next:t})=>{let r=t(e.unwrap());return mt(r)&&(r.type=Wr(r)),r},Qr=e=>{let t=Gn($r(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},qr=e=>({type:Qr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),ms=({value:e})=>({type:Qr(e),const:e}),ls=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=c=>t&&ke(c)?c instanceof b.ZodOptional:c.isOptional(),i=o.filter(c=>!n(e.shape[c])),a={type:"object"};return o.length&&(a.properties=dt(e,r)),i.length&&(a.required=i),a},us=()=>({type:"null"}),fs=({},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:_r}}},ys=({},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:_r}}},gs=({},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)},hs=()=>({type:"boolean"}),xs=()=>({type:"integer",format:"bigint"}),bs=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=dt(b.object(lt(Ut(o,[t]))),r),n.required=o),n}if(e instanceof b.ZodLiteral)return{type:"object",properties:dt(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&bs(e.options)){let o=we(i=>`${i.value}`,e.options),n=lt(Ut(o,[t]));return{type:"object",properties:dt(b.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},Ts=({_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},Os=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Rs=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:c,isIP:d,isEmoji:p,isDatetime:m,_def:{checks:l}})=>{let f=l.find(E=>E.kind==="regex"),x=l.find(E=>E.kind==="datetime"),R=f?f.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"},y={"date-time":m,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:c,ip:d,emoji:p};for(let E in y)if(y[E]){O.format=E;break}return r!==null&&(O.minLength=r),o!==null&&(O.maxLength=o),R&&(O.pattern=R.source),O},As=({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,c=o.find(l=>l.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,p=c?c.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=i:m.exclusiveMinimum=i,p?m.maximum=d:m.exclusiveMaximum=d,m},dt=({shape:e},t)=>we(t,e),Ps=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Yn?.[t]},Wr=({type:e})=>e==="null"?e:typeof e=="string"?[e,"null"]:e?[...new Set(e).add("null")]:"null",ws=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&mt(o)){let i=Ye(e,Ps(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(b.any())}if(!t&&n.type==="preprocess"&&mt(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},Es=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Is=(e,{next:t})=>t(e.unwrap()),zs=(e,{next:t,makeRef:r})=>r(e,()=>t(e.schema)),Cs=(e,{next:t})=>t(e.unwrap().shape.raw),Xr=e=>e.length?lt(Jn(qn(1,e.length+1).map(t=>`example${t}`),we(Gr("value"),e))):void 0,eo=(e,t,r=[])=>Vr(G,we(_n(o=>$r(o)==="Object",ut(r))),Xr)({schema:e,variant:t?"parsed":"original",validate:!0}),Zs=(e,t)=>Vr(G,Mn(Hn(t)),Bn(t),Xr)({schema:e,variant:"original",validate:!0}),le=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?le(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>le(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?le(e._def.schema):e instanceof b.ZodPipeline?le(e._def.in):le(e._def.left).merge(le(e._def.right)),to=({path:e,method:t,schema:r,inputSources:o,makeRef:n,composition:i,brandHandling:a,description:c=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:d}=le(r),p=Qn(e),m=o.includes("query"),l=o.includes("params"),f=o.includes("headers"),x=y=>l&&p.includes(y),R=y=>f&&Et(y);return Object.keys(d).map(y=>({name:y,location:x(y)?"path":R(y)?"header":m?"query":void 0})).filter(y=>y.location!==void 0).map(({name:y,location:E})=>{let H=me(d[y],{rules:{...a,...Ft},onEach:Bt,onMissing:qt,ctx:{isResponse:!1,makeRef:n,path:e,method:t}}),j=i==="components"?n(d[y],H,V(c,y)):H;return{name:y,in:E,required:!d[y].isOptional(),description:H.description||c,schema:j,examples:Zs(r,y)}})},Ft={ZodString:Rs,ZodNumber:As,ZodBigInt:xs,ZodBoolean:hs,ZodNull:us,ZodArray:Ts,ZodTuple:Os,ZodRecord:Ss,ZodObject:ls,ZodLiteral:ms,ZodIntersection:as,ZodUnion:os,ZodAny:es,ZodDefault:Wn,ZodEnum:qr,ZodNativeEnum:qr,ZodEffects:ws,ZodOptional:ps,ZodNullable:ds,ZodDiscriminatedUnion:ns,ZodBranded:Is,ZodDate:gs,ZodCatch:Xn,ZodPipeline:Es,ZodLazy:zs,ZodReadonly:cs,[k]:rs,[xe]:ts,[se]:ys,[ne]:fs,[_]:Cs},Bt=(e,{isResponse:t,prev:r})=>{if(Dt(r))return{};let{description:o}=e,n=e instanceof b.ZodLazy,i=r.type!==void 0,a=t&&ke(e),c=!n&&i&&!a&&e.isNullable(),d={};if(o&&(d.description=o),c&&(d.type=Wr(r)),!n){let p=G({schema:e,variant:t?"parsed":"original",validate:!0});p.length&&(d.examples=p.slice())}return d},qt=(e,t)=>{throw new z(`Zod type ${e.constructor.name} is unsupported.`,t)},Kt=(e,t)=>{if(Dt(e))return e;let r={...e};return r.properties&&(r.properties=ut(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>ut(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Kt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Kt(o,t))),r},ro=e=>Dt(e)?e:ut(["examples"],e),oo=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:i,composition:a,hasMultipleStatusCodes:c,statusCode:d,brandHandling:p,description:m=`${e.toUpperCase()} ${t} ${It(n)} response ${c?d:""}`.trim()})=>{if(!o)return{description:m};let l=ro(me(r,{rules:{...p,...Ft},onEach:Bt,onMissing:qt,ctx:{isResponse:!0,makeRef:i,path:t,method:e}})),f={schema:a==="components"?i(r,l,V(m)):l,examples:eo(r,!0)};return{description:m,content:lt(Ut(o,[f]))}},vs=()=>({type:"http",scheme:"basic"}),Ns=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},js=({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},ks=({name:e})=>({type:"apiKey",in:"header",name:e}),Ls=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Ms=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Hs=({flows:e={}})=>({type:"oauth2",flows:we(t=>({...t,scopes:t.scopes||{}}),$n(Un,e))}),no=(e,t)=>{let r={basic:vs,bearer:Ns,input:js,header:ks,cookie:Ls,openid:Ms,oauth2:Hs};return nt(e,o=>r[o.type](o,t))},ft=e=>"or"in e?e.or.map(t=>"and"in t?Kn(we(({name:r,scopes:o})=>Gr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?ft(Nt(e)):ft({or:[e]}),so=({method:e,path:t,schema:r,mimeType:o,makeRef:n,composition:i,brandHandling:a,paramNames:c,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let p=ro(Kt(me(r,{rules:{...a,...Ft},onEach:Bt,onMissing:qt,ctx:{isResponse:!1,makeRef:n,path:t,method:e}}),c)),m={schema:i==="components"?n(r,p,V(d)):p,examples:eo(r,!1,c)};return{description:d,content:{[o]:m}}},io=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<=Br?e:e.slice(0,Br-1)+"\u2026";var Gt=class extends Us{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;responseVariants=Ks(pe);references=new Map;makeRef(t,r,o=this.references.get(t)){return o||(o=`Schema${this.references.size+1}`,this.references.set(t,o),typeof r=="function"&&(r=r())),typeof r=="object"&&this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}ensureUniqOperationId(t,r,o){let n=o||V(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:c,hasSummaryFromDescription:d=!0,composition:p="inline"}){super(),this.addInfo({title:o,version:n});for(let l of typeof i=="string"?[i]:i)this.addServer({url:l});Pe({routing:t,onEndpoint:(l,f,x)=>{let R={path:f,method:x,endpoint:l,composition:p,brandHandling:c,makeRef:this.makeRef.bind(this)},[O,y]=["short","long"].map(l.getDescription.bind(l)),E=O?$t(O):d&&y?$t(y):void 0,H=l.getTags(),j=r.inputSources?.[x]||Pt[x],U=this.ensureUniqOperationId(f,x,l.getOperationId(x)),B=to({...R,inputSources:j,schema:l.getSchema("input"),description:a?.requestParameter?.call(null,{method:x,path:f,operationId:U})}),qe={};for(let K of this.responseVariants){let Y=l.getResponses(K);for(let{mimeTypes:ve,schema:Ot,statusCodes:Ge}of Y)for(let Ne of Ge)qe[Ne]=oo({...R,variant:K,schema:Ot,mimeTypes:ve,statusCode:Ne,hasMultipleStatusCodes:Y.length>1||Ge.length>1,description:a?.[`${K}Response`]?.call(null,{method:x,path:f,operationId:U,statusCode:Ne})})}let Tt=j.includes("body")?so({...R,paramNames:Ds("name",B),schema:l.getSchema("input"),mimeType:T[l.getRequestType()],description:a?.requestBody?.call(null,{method:x,path:f,operationId:U})}):void 0,$e=ft(nt(no(l.getSecurity(),j),K=>{let Y=this.ensureUniqSecuritySchemaName(K),ve=["oauth2","openIdConnect"].includes(K.type)?l.getScopes().slice():[];return this.addSecurityScheme(Y,K),{name:Y,scopes:ve}}));this.addPath(Yr(f),{[x]:{operationId:U,summary:E,description:y,tags:H.length>0?H:void 0,parameters:B.length>0?B:void 0,requestBody:Tt,security:$e.length>0?$e:void 0,responses:qe}})}}),this.rootDoc.tags=r.tags?io(r.tags):[]}};import{createRequest as Fs,createResponse as Bs}from"node-mocks-http";var qs=e=>Fs({...e,headers:{"content-type":T.json,...e?.headers}}),$s=e=>Bs(e),Gs=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:br(o)?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},ao=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=qs(e),i=$s({req:n,...t});i.req=t?.req||n,n.res=i;let a=Gs(o),c={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:c}},Vs=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}},_s=async({middleware:e,options:t={},errorHandler:r,...o})=>{let{requestMock:n,responseMock:i,loggerMock:a,configMock:c}=ao(o),d=Je(n,c.inputSources);try{let p=await e.execute({request:n,response:i,logger:a,input:d,options:t});return{requestMock:n,responseMock:i,loggerMock:a,output:p}}catch(p){if(!r)throw p;return r($(p),i),{requestMock:n,responseMock:i,loggerMock:a,output:{}}}};import N from"typescript";import{z as Ei}from"zod";import A from"typescript";import S from"typescript";var{factory:po}=S,Ee=(e,t)=>S.addSyntheticLeadingComment(e,S.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),Vt=(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)},Js=/^[A-Za-z_$][A-Za-z0-9_$]*$/,co=e=>Js.test(e)?po.createIdentifier(e):po.createStringLiteral(e),Ys=[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],mo=e=>Ys.includes(e.kind);var s=A.factory,ue=[s.createModifier(A.SyntaxKind.ExportKeyword)],Qs=[s.createModifier(A.SyntaxKind.AsyncKeyword)],Ws=[s.createModifier(A.SyntaxKind.PublicKeyword)],lo=[s.createModifier(A.SyntaxKind.ProtectedKeyword),s.createModifier(A.SyntaxKind.ReadonlyKeyword)],uo=s.createToken(A.SyntaxKind.DotDotDotToken),Xs=s.createTemplateHead(""),ei=s.createTemplateMiddle(" "),Be=s.createTemplateTail(""),Ie=s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[s.createKeywordTypeNode(A.SyntaxKind.StringKeyword),s.createKeywordTypeNode(A.SyntaxKind.AnyKeyword)]),ti=e=>s.createTemplateLiteralType(Xs,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?Be:ei))),yt=ti(["M","P"]),gt=(e,t,r)=>s.createParameterDeclaration(Array.isArray(r)?r:void 0,Array.isArray(r)?void 0:r,e,void 0,t,void 0),ze=(e,t)=>Object.entries(e).map(([r,o])=>gt(s.createIdentifier(r),o,t)),fo=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),yo=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),go=(...e)=>s.createArrayBindingPattern(e.map(t=>s.createBindingElement(void 0,void 0,t))),C=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],A.NodeFlags.Const),_t=(e,t)=>Z(e,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r)))),{isPublic:!0}),Z=(e,t,{isPublic:r,comment:o}={})=>{let n=s.createTypeAliasDeclaration(r?ue:void 0,e,void 0,t);return o?Ee(n,o):n},ht=(e,t,r,o,n)=>s.createMethodDeclaration(Ws,void 0,e,void 0,o,t,n,r),ho=(e,t,r)=>s.createClassDeclaration(ue,e,void 0,void 0,[t,...r]),xt=e=>s.createTypeOperatorNode(A.SyntaxKind.KeyOfKeyword,s.createTypeReferenceNode(e)),xo=(e,t,r)=>s.createConditionalTypeNode(t,xt(e),s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t),r),bt=e=>s.createTypeReferenceNode(Promise.name,[e==="any"?s.createKeywordTypeNode(A.SyntaxKind.AnyKeyword):e]),bo=(e,t)=>s.createInterfaceDeclaration(ue,e,void 0,void 0,t),Jt=e=>Object.entries(e).map(([t,r])=>s.createTypeParameterDeclaration([],t,s.createTypeReferenceNode(r))),So=(e,t,r)=>s.createArrowFunction(r?Qs:void 0,void 0,e.map(o=>gt(o)),void 0,void 0,t),Yt=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier(Object.name),P("keys")),void 0,[e]),P("reduce")),void 0,[s.createArrowFunction(void 0,void 0,ze({acc:void 0,key:void 0}),void 0,void 0,t),r]),To=(...e)=>`"${e.join(" ")}"`,P=e=>e,Ce=(e,t,r)=>s.createConditionalExpression(e,s.createToken(A.SyntaxKind.QuestionToken),t,s.createToken(A.SyntaxKind.ColonToken),r),v=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(Array.isArray(e)?s.createPropertyAccessExpression(...e):e,t),void 0,r),Oo=(e,t)=>s.createBinaryExpression(e,s.createToken(A.SyntaxKind.AmpersandAmpersandToken),t),Ro=(e,t)=>s.createBinaryExpression(e,s.createToken(A.SyntaxKind.EqualsEqualsEqualsToken),t);var Ao=["get","post","put","delete","patch"];import{chain as ri,prop as oi}from"ramda";import g from"typescript";import{z as Qt}from"zod";var{factory:u}=g,ni={[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},si=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),ii=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let c=t&&ke(a)?a instanceof Qt.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,co(i),c&&o?u.createToken(g.SyntaxKind.QuestionToken):void 0,r(a));return a.description?Ee(d,a.description):d});return u.createTypeLiteralNode(n)},ai=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),pi=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Po=({options:e},{next:t})=>{let r=new Map;for(let o of e){let n=t(o);r.set(mo(n)?n.kind:n,n)}return u.createUnionTypeNode(Array.from(r.values()))},ci=e=>ni?.[e.kind],di=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Ye(e,ci(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 u.createKeywordTypeNode(n&&i[n]||g.SyntaxKind.AnyKeyword)}return o},mi=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),li=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(g.SyntaxKind.UndefinedKeyword)]):o},ui=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),fi=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),yi=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),gi=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);return o.every(g.isTypeLiteralNode)?u.createTypeLiteralNode(ri(oi("members"),o)):u.createIntersectionTypeNode(o)},hi=({_def:e},{next:t})=>t(e.innerType),J=e=>()=>u.createKeywordTypeNode(e),xi=(e,{next:t})=>t(e.unwrap()),bi=(e,{next:t})=>t(e.unwrap()),Si=({_def:e},{next:t})=>t(e.innerType),Ti=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Oi=()=>u.createLiteralTypeNode(u.createNull()),Ri=(e,{makeAlias:t,next:r})=>t(e,()=>r(e.schema)),Ai=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(g.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),n=u.createUnionTypeNode([r,o]);return t instanceof Qt.ZodString?r:t instanceof Qt.ZodUnion?n:o},Pi=(e,{next:t})=>t(e.unwrap().shape.raw),wi={ZodString:J(g.SyntaxKind.StringKeyword),ZodNumber:J(g.SyntaxKind.NumberKeyword),ZodBigInt:J(g.SyntaxKind.BigIntKeyword),ZodBoolean:J(g.SyntaxKind.BooleanKeyword),ZodAny:J(g.SyntaxKind.AnyKeyword),ZodUndefined:J(g.SyntaxKind.UndefinedKeyword),[ne]:J(g.SyntaxKind.StringKeyword),[se]:J(g.SyntaxKind.StringKeyword),ZodNull:Oi,ZodArray:ai,ZodTuple:fi,ZodRecord:yi,ZodObject:ii,ZodLiteral:si,ZodIntersection:gi,ZodUnion:Po,ZodDefault:hi,ZodEnum:pi,ZodNativeEnum:mi,ZodEffects:di,ZodOptional:li,ZodNullable:ui,ZodDiscriminatedUnion:Po,ZodBranded:xi,ZodCatch:Si,ZodPipeline:Ti,ZodLazy:Ri,ZodReadonly:bi,[k]:Ai,[_]:Pi},St=(e,{brandHandling:t,ctx:r})=>me(e,{rules:{...t,...wi},onMissing:()=>u.createKeywordTypeNode(g.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"),requestParameter:s.createIdentifier("request"),args:s.createIdentifier("args"),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"),contentTypeConst:s.createIdentifier("contentType"),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,Z(o,n)),this.aliases.set(t,Z(o,r()))}return s.createTypeReferenceNode(o)}constructor({routing:t,brandHandling:r,variant:o="client",optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0},noContent:i=Ei.undefined()}){let a={makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},c={brandHandling:r,ctx:{...a,isResponse:!1}},d={brandHandling:r,ctx:{...a,isResponse:!0}};Pe({routing:t,onEndpoint:(I,Q,Ve)=>{let fe=V.bind(null,Ve,Q),W=Z(fe("input"),St(I.getSchema("input"),c)),No=I.getResponses("positive").map(({schema:D,mimeTypes:X})=>X?D:i).reduce((D,X)=>D.or(X)),Rt=Z(fe("positive.response"),St(No,d)),jo=I.getResponses("negative").map(({schema:D,mimeTypes:X})=>X?D:i).reduce((D,X)=>D.or(X)),At=Z(fe("negative.response"),St(jo,d)),er=Z(fe("response"),s.createUnionTypeNode([s.createTypeReferenceNode(Rt.name.text),s.createTypeReferenceNode(At.name.text)]));this.program.push(W,Rt,At,er),this.paths.push(Q);let ko=I.getResponses("positive").some(({mimeTypes:D})=>D?.includes(T.json));this.registry.set(To(Ve,Q),{input:W.name.text,positive:Rt.name.text,negative:At.name.text,response:er.name.text,tags:I.getTags(),isJson:ko})}}),this.program.unshift(...this.aliases.values()),this.program.push(_t(this.ids.pathType,this.paths)),this.program.push(_t(this.ids.methodType,Ao)),this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]},{id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]},{id:this.ids.responseInterface,kind:"response",props:[]});let m=[],l=[];for(let[I,{isJson:Q,tags:Ve,...fe}]of this.registry){for(let W of this.interfaces)W.props.push(yo(I,fe[W.kind]));o!=="types"&&(Q&&m.push(s.createPropertyAssignment(I,s.createTrue())),l.push(s.createPropertyAssignment(I,s.createArrayLiteralExpression(Ve.map(W=>s.createStringLiteral(W))))))}for(let{id:I,props:Q}of this.interfaces)this.program.push(bo(I,Q));if(this.program.push(Z(this.ids.methodPathType,xt(this.ids.inputInterface),{isPublic:!0})),o==="types")return;let f=s.createVariableStatement(ue,C(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(m))),x=s.createVariableStatement(ue,C(this.ids.endpointTagsConst,s.createObjectLiteralExpression(l))),R=Z(this.ids.implementationType,s.createFunctionTypeNode(void 0,ze({[this.ids.methodParameter.text]:s.createTypeReferenceNode(this.ids.methodType),[this.ids.pathParameter.text]:s.createKeywordTypeNode(N.SyntaxKind.StringKeyword),[this.ids.paramsArgument.text]:Ie}),bt("any")),{isPublic:!0}),O=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,Be)]),y=Yt(this.ids.paramsArgument,v(this.ids.accumulator,P("replace"),[O,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),E=Yt(this.ids.paramsArgument,v(s.createIdentifier(Object.name),P("assign"),[this.ids.accumulator,Oo(s.createPrefixUnaryExpression(N.SyntaxKind.ExclamationToken,v(this.ids.pathParameter,P("includes"),[O])),s.createObjectLiteralExpression([s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))],!1))]),s.createObjectLiteralExpression()),H=Ee(ht(this.ids.provideMethod,ze({[this.ids.methodParameter.text]:s.createTypeReferenceNode("M"),[this.ids.pathParameter.text]:s.createTypeReferenceNode("P"),[this.ids.paramsArgument.text]:s.createConditionalTypeNode(yt,xt(this.ids.inputInterface),s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),yt),Ie)}),void 0,Jt({M:this.ids.methodType,P:this.ids.pathType}),bt(xo(this.ids.responseInterface,yt,s.createKeywordTypeNode(N.SyntaxKind.UnknownKeyword)))),"@deprecated use the overload with 2 arguments instead"),j=ht(this.ids.provideMethod,ze({[this.ids.requestParameter.text]:s.createTypeReferenceNode("K"),[this.ids.paramsArgument.text]:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),s.createTypeReferenceNode("K"))}),void 0,Jt({K:this.ids.methodPathType}),bt(s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.responseInterface),s.createTypeReferenceNode("K")))),U=ht(this.ids.provideMethod,ze({[this.ids.args.text]:s.createUnionTypeNode([s.createTupleTypeNode([s.createKeywordTypeNode(N.SyntaxKind.StringKeyword),s.createKeywordTypeNode(N.SyntaxKind.StringKeyword),Ie]),s.createTupleTypeNode([s.createKeywordTypeNode(N.SyntaxKind.StringKeyword),Ie])])},uo),s.createBlock([s.createVariableStatement(void 0,C(go(this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument),s.createAsExpression(s.createParenthesizedExpression(Ce(Ro(s.createPropertyAccessExpression(this.ids.args,P("length")),s.createNumericLiteral(2)),s.createArrayLiteralExpression([s.createSpreadElement(v(s.createElementAccessExpression(this.ids.args,0),P("split"),[s.createRegularExpressionLiteral("/ (.+)/"),s.createNumericLiteral(2)])),s.createElementAccessExpression(this.ids.args,1)]),this.ids.args)),s.createTupleTypeNode([s.createTypeReferenceNode(this.ids.methodType),s.createTypeReferenceNode(this.ids.pathType),Ie])))),s.createReturnStatement(v(s.createThis(),this.ids.implementationArgument,[this.ids.methodParameter,y,E]))])),B=ho(this.ids.clientClass,fo([gt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),lo)]),[H,j,U]),qe=Z(this.ids.providerType,s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.clientClass),s.createLiteralTypeNode(s.createStringLiteral(this.ids.provideMethod.text))),{isPublic:!0,comment:"@deprecated will be removed in v22"});this.program.push(f,x,R,B,qe);let Tt=s.createPropertyAssignment(this.ids.methodParameter,v(this.ids.methodParameter,P("toUpperCase"))),$e=s.createPropertyAssignment(this.ids.headersProperty,Ce(this.ids.hasBodyConst,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(T.json))]),this.ids.undefinedValue)),K=s.createPropertyAssignment(this.ids.bodyProperty,Ce(this.ids.hasBodyConst,v(s.createIdentifier("JSON"),P("stringify"),[this.ids.paramsArgument]),this.ids.undefinedValue)),Y=s.createVariableStatement(void 0,C(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier(fetch.name),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,Be)]),s.createObjectLiteralExpression([Tt,$e,K])])))),ve=s.createVariableStatement(void 0,C(this.ids.hasBodyConst,s.createLogicalNot(v(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),P("includes"),[this.ids.methodParameter])))),Ot=s.createVariableStatement(void 0,C(this.ids.searchParamsConst,Ce(this.ids.hasBodyConst,s.createStringLiteral(""),s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier(URLSearchParams.name),void 0,[this.ids.paramsArgument]),Be)])))),Ge=s.createVariableStatement(void 0,C(this.ids.contentTypeConst,v([this.ids.responseConst,this.ids.headersProperty],P("get"),[s.createStringLiteral("content-type")]))),Ne=s.createIfStatement(s.createPrefixUnaryExpression(N.SyntaxKind.ExclamationToken,this.ids.contentTypeConst),s.createReturnStatement(void 0),void 0),Io=s.createVariableStatement(void 0,C(this.ids.isJsonConst,s.createCallChain(s.createPropertyAccessChain(this.ids.contentTypeConst,void 0,P("startsWith")),void 0,void 0,[s.createStringLiteral(T.json)]))),zo=s.createReturnStatement(s.createCallExpression(s.createElementAccessExpression(this.ids.responseConst,Ce(this.ids.isJsonConst,s.createStringLiteral(P("json")),s.createStringLiteral(P("text")))),void 0,[])),Co=s.createVariableStatement(ue,C(this.ids.exampleImplementationConst,So([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([ve,Ot,Y,Ge,Ne,Io,zo]),!0),s.createTypeReferenceNode(this.ids.implementationType))),Zo=s.createExpressionStatement(v(this.ids.clientConst,this.ids.provideMethod,[s.createStringLiteral("get /v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),vo=s.createVariableStatement(void 0,C(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(Co,vo,Zo)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Vt(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)=>Vt(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 Se("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let s=this.printUsage(t);this.usage=s&&o?[await o(s)]:this.usage;let i=this.print(t);return o?o(i):i}};var Pi={dateIn:rr,dateOut:or,file:et,upload:ir,raw:sr};export{Ue as BuiltinLogger,He as DependsOnMethod,Gt as Documentation,E as DocumentationError,Me as EndpointsFactory,K as InputValidationError,Qt as Integration,V as Middleware,Ze as MissingPeerError,X as OutputValidationError,ke as ResultHandler,me as RoutingError,Ke as ServeStatic,dn as arrayEndpointsFactory,Lt as arrayResultHandler,En as attachRouting,Jo as createConfig,Nn as createServer,cn as defaultEndpointsFactory,Le as defaultResultHandler,ot as ensureHttpError,Pi as ez,q as getExamples,ee as getMessageFromError,qs as testEndpoint,$s as testMiddleware};
22
+ `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await Ae("prettier")).format;o=c=>a(c,{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}};import{z as Ze}from"zod";var Eo=(e,t)=>Ze.object({data:t,event:Ze.literal(e),id:Ze.string().optional(),retry:Ze.number().int().positive().optional()}),Ii=(e,t,r)=>Eo(String(t),e[t]).transform(o=>[`event: ${o.event}`,`data: ${JSON.stringify(o.data)}`,"",""].join(`
23
+ `)).parse({event:t,data:r}),zi=1e4,wo=e=>e.headersSent||e.writeHead(200,{connection:"keep-alive","content-type":T.sse,"cache-control":"no-cache"}),Ci=e=>new L({handler:async({response:t})=>setTimeout(()=>wo(t),zi)&&{isClosed:()=>t.writableEnded||t.closed,emit:(r,o)=>{wo(t),t.write(Ii(e,r,o),"utf-8"),t.flush()}}}),Zi=e=>new ce({positive:()=>{let[t,...r]=Object.entries(e).map(([o,n])=>Eo(o,n));return{mimeType:T.sse,schema:r.length?Ze.discriminatedUnion("event",[t,...r]):t}},negative:{mimeType:"text/plain",schema:Ze.string()},handler:async({response:t,error:r,logger:o,request:n,input:i})=>{if(r){let a=be(r);Me(a,o,n,i),t.headersSent||t.status(a.statusCode).type("text/plain").write(ie(a),"utf-8")}t.end()}}),Xt=class extends de{constructor({events:t,config:r}){super({config:r,resultHandler:Zi(t)}),this.middlewares=[Ci(t)]}};var vi={dateIn:nr,dateOut:sr,file:et,upload:pr,raw:ar};export{Ke as BuiltinLogger,De as DependsOnMethod,Gt as Documentation,z as DocumentationError,de as EndpointsFactory,Xt as EventStreamFactory,F as InputValidationError,Wt as Integration,L as Middleware,je as MissingPeerError,ee as OutputValidationError,ce as ResultHandler,ye as RoutingError,Fe as ServeStatic,un as arrayEndpointsFactory,Lt as arrayResultHandler,jn as attachRouting,en as createConfig,kn as createServer,ln as defaultEndpointsFactory,Ue as defaultResultHandler,be as ensureHttpError,vi as ez,G as getExamples,te as getMessageFromError,Vs as testEndpoint,_s as testMiddleware};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "21.3.0",
3
+ "version": "21.5.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": {
@@ -145,7 +145,7 @@
145
145
  "husky": "^9.0.5",
146
146
  "make-coverage-badge": "^1.2.0",
147
147
  "node-forge": "^1.3.1",
148
- "prettier": "3.4.1",
148
+ "prettier": "3.4.2",
149
149
  "semver": "^7.6.3",
150
150
  "snakify-ts": "^2.3.0",
151
151
  "swagger-ui-express": "^5.0.0",