express-zod-api 20.9.2 → 20.10.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,16 @@
2
2
 
3
3
  ## Version 20
4
4
 
5
+ ### v20.10.0
6
+
7
+ - Feat: Supporting Express 5
8
+ - Epic news: after 10 years of struggles and anticipations
9
+ [Express 5.0.0 is finally released](https://github.com/expressjs/express/releases/tag/v5.0.0);
10
+ - The primary a mostly awaited feature is the proper support of asynchronous handlers;
11
+ - This version introduces the initial support of Express 5 without breaking changes;
12
+ - Notice: the corresponding `@types/express` for the version 5 is not yet released;
13
+ - [Instructions on migrating to Express 5](https://expressjs.com/en/guide/migrating-5.html).
14
+
5
15
  ### v20.9.2
6
16
 
7
17
  - Minor syntax adjustments and cleanup;
package/README.md CHANGED
@@ -92,7 +92,7 @@ Therefore, many basic tasks can be accomplished faster and easier, in particular
92
92
  ## Technologies
93
93
 
94
94
  - [Typescript](https://www.typescriptlang.org/) first.
95
- - Web server — [Express.js](https://expressjs.com/).
95
+ - Web server — [Express.js](https://expressjs.com/) v4 or v5.
96
96
  - Schema validation — [Zod 3.x](https://github.com/colinhacks/zod) including [Zod Plugin](#zod-plugin).
97
97
  - Supports any logger having `info()`, `debug()`, `error()` and `warn()` methods;
98
98
  - Built-in console logger with colorful and pretty inspections by default.
package/dist/index.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
  Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},Qe=class extends Error{name="IOSchemaError"},G=class extends Qe{constructor(r){super(F(r));this.originalError=r}name="OutputValidationError"},U=class extends Qe{constructor(r){super(F(r));this.originalError=r}name="InputValidationError"},_=class extends Error{constructor(r,o){super(r);this.originalError=o}name="ResultHandlerError"},ue=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var w={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var vo=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(w.upload);return"files"in e&&r},Ot={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},ko=["body","query","params"],Rt=e=>e.method.toLowerCase(),At=e=>e.startsWith("x-"),Mo=e=>(0,Je.pickBy)((t,r)=>At(r),e),Pt=(e,t={})=>{let r=Rt(e);return r==="options"?{}:(t[r]||Ot[r]||ko).filter(o=>o==="files"?vo(e):!0).map(o=>o==="headers"?Mo(e[o]):e[o]).reduce((o,n)=>({...o,...n}),{})},fe=e=>e instanceof Error?e:new Error(String(e)),F=e=>e instanceof ar.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof G?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Me=e=>(0,ir.isHttpError)(e)?e.statusCode:e instanceof U?400:500,Ct=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
3
3
  ${o.stack}
4
4
  `,{url:t.url,payload:r})},K=({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 s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},re=(e,t,r)=>e.length&&t.length?(0,Je.xprod)(e,t).map(r):e.concat(t),Ue=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)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(It).join(""),We=e=>(0,sr.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Xe=(e,t)=>{try{return typeof e.parse(t)}catch{return}},oe=e=>typeof e=="object"&&e!==null;var et=require("ramda"),h=Symbol.for("express-zod-api"),tt=e=>{let t=e.describe(e.description);return t._def[h]=(0,et.clone)(t._def[h])||{examples:[]},t},pr=(e,t)=>{if(!(h in e._def))return t;let r=tt(t);return r._def[h].examples=re(r._def[h].examples,e._def[h].examples,([o,n])=>typeof o=="object"&&typeof n=="object"?(0,et.mergeDeepRight)({...o},{...n}):n),r};var Uo=function(e){let t=tt(this);return t._def[h].examples.push(e),t},Ho=function(e){let t=tt(this);return t._def[h].defaultLabel=e,t},Do=function(e){return new ne.z.ZodBranded({typeName:ne.z.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[h]:{examples:[],...(0,P.clone)(this._def[h]),brand:e}})},Fo=function(e){let t=typeof e=="function"?e:(0,P.pipe)(P.toPairs,(0,P.map)(([n,s])=>(0,P.pair)(e[String(n)]||n,s)),P.fromPairs),r=t((0,P.clone)(this.shape)),o=ne.z.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};h in globalThis||(globalThis[h]=!0,Object.defineProperties(ne.z.ZodType.prototype,{example:{get(){return Uo.bind(this)}},brand:{set(){},get(){return Do.bind(this)}}}),Object.defineProperty(ne.z.ZodDefault.prototype,"label",{get(){return Ho.bind(this)}}),Object.defineProperty(ne.z.ZodObject.prototype,"remap",{get(){return Fo.bind(this)}}));function cr(e){return e}var Rr=require("zod");var Lt=require("zod");var lr=require("zod");var He=require("zod"),Y=Symbol("File"),dr=He.z.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),Ko={buffer:()=>dr.brand(Y),string:()=>He.z.string().brand(Y),binary:()=>dr.or(He.z.string()).brand(Y),base64:()=>He.z.string().base64().brand(Y)};function rt(e){return Ko[e||"string"]()}var ie=Symbol("Raw"),mr=(e={})=>lr.z.object({raw:rt("buffer")}).extend(e).brand(ie);var ur=require("zod"),De=Symbol("Upload"),fr=()=>ur.z.custom(e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.encoding=="string"&&typeof e.mimetype=="string"&&Buffer.isBuffer(e.data)&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",e=>({message:`Expected file upload, received ${typeof e}`})).brand(De);var yr=(e,{next:t})=>e.options.some(t),Bo=({_def:e},{next:t})=>[e.left,e.right].some(t),gr=(e,{next:t})=>t(e.unwrap()),qo={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:yr,ZodDiscriminatedUnion:yr,ZodIntersection:Bo,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:gr,ZodNullable:gr,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},zt=(e,{condition:t,rules:r=qo,depth:o=1,maxDepth:n=Number.POSITIVE_INFINITY})=>{if(t(e))return!0;let s=o<n?r[e._def.typeName]:void 0;return s?s(e,{next:a=>zt(a,{condition:t,rules:r,maxDepth:n,depth:o+1})}):!1},hr=e=>zt(e,{condition:t=>t._def[h]?.brand===De}),xr=e=>zt(e,{condition:t=>t._def[h]?.brand===ie,maxDepth:3});var ot=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).type("text/plain").end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
- Original error: ${e.originalError.message}.`:""))};var br=require("ramda");var se=e=>oe(e)&&"or"in e,ge=e=>oe(e)&&"and"in e,wt=e=>({and:(0,br.chain)(t=>ge(t)?t.and:[t],e)}),nt=(e,t)=>ge(e)?{and:e.and.map(r=>se(r)?{or:r.or.map(t)}:t(r))}:se(e)?{or:e.or.map(r=>ge(r)?{and:r.and.map(t)}:t(r))}:t(e),Et=e=>e.and.reduce((t,r)=>({or:re(t.or,se(r)?r.or:[r],wt)}),{or:[]}),ye=(e,t)=>ge(e)?se(t)?ye(Et(e),t):wt([e,t]):se(e)?ge(t)?ye(t,e):se(t)?{or:re(e.or,t.or,wt)}:ye(e,{and:[t]}):ge(t)||se(t)?ye(t,e):{and:[e,t]};var jt=require("zod");var Zt=class{},B=class extends Zt{#e;#t;#r;constructor({input:t,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 U(o):o}}},he=class extends B{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({input:jt.z.object({}),handler:async({request:n,response:s})=>new Promise((a,p)=>{t(n,s,d=>{if(d&&d instanceof Error)return p(o(d));a(r(n,s))})})})}};var Fe=class{},it=class extends Fe{#e;#t;#r;#s;#o;#a;#p;#n;#c;#d;#l;#i;constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:l=[],tags:d=[],description:m,shortDescription:y}){super(),this.#a=n,this.#p=s,this.#r=l,this.#l=a,this.#t=Object.freeze(t),this.#c=Object.freeze(p),this.#d=Object.freeze(d),this.#e={long:m,short:y},this.#n={input:r,output:o},this.#o={positive:Object.freeze(s.getPositiveResponse(o)),negative:Object.freeze(s.getNegativeResponse())},this.#i=hr(r)?"upload":xr(r)?"raw":"json",this.#s={input:Object.freeze([w[this.#i]]),positive:Object.freeze(this.#o.positive.flatMap(({mimeTypes:u})=>u)),negative:Object.freeze(this.#o.negative.flatMap(({mimeTypes:u})=>u))}}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return t==="input"||t==="output"?this.#n[t]:this.getResponses(t).map(({schema:r})=>r).reduce((r,o)=>r.or(o))}getMimeTypes(t){return this.#s[t]}getRequestType(){return this.#i}getResponses(t){return this.#o[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?ye(t,o):t},{and:[]})}getScopes(){return this.#c}getTags(){return this.#d}getOperationId(t){return this.#l(t)}#m(t){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#t.concat(t).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#n.output.parseAsync(t)}catch(r){throw r instanceof Lt.z.ZodError?new G(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s,options:a}){for(let p of this.#r)if(!(t==="options"&&!(p instanceof he))&&(Object.assign(a,await p.execute({input:r,options:a,request:o,response:n,logger:s})),n.writableEnded)){s.warn("A middleware has closed the stream. Accumulated options:",a);break}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#n.input.parseAsync(t)}catch(s){throw s instanceof Lt.z.ZodError?new U(s):s}return this.#a({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:s,output:a,options:p}){try{await this.#p.execute({error:t,output:a,request:r,response:o,logger:n,input:s,options:p})}catch(l){ot({logger:n,response:o,error:new _(fe(l).message,t||void 0)})}}async execute({request:t,response:r,logger:o,config:n,siblingMethods:s=[]}){let a=Rt(t),p={},l=null,d=null;if(n.cors){let y=this.#m(s);typeof n.cors=="function"&&(y=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:y}));for(let u in y)r.set(u,y[u])}let m=Pt(t,n.inputSources);try{if(await this.#f({method:a,input:m,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}l=await this.#u(await this.#y({input:m,logger:o,options:p}))}catch(y){d=fe(y)}await this.#g({input:m,output:l,request:t,response:r,error:d,logger:o,options:p})}};var Tr=(e,t)=>{let r=e.map(n=>n.getSchema()).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>pr(s,n),o)};var k=require("zod");var Ke={positive:200,negative:400};var Sr=O(require("node:assert/strict"),1),Or=require("zod");var st=(e,t)=>typeof e=="function"?st(e(...t.arguments),t):e instanceof Or.z.ZodType?[{...t,schema:e}]:(Array.isArray(e)&&(0,Sr.default)(e.length,new _(`At least one ${t.variant} response schema required.`)),(Array.isArray(e)?e:[e]).map(({schema:r,statusCodes:o,statusCode:n,mimeTypes:s,mimeType:a})=>({schema:r,statusCodes:n?[n]:o||t.statusCodes,mimeTypes:a?[a]:s||t.mimeTypes})));var Nt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},xe=class extends Nt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return st(this.#e,{variant:"positive",arguments:[t],statusCodes:[Ke.positive],mimeTypes:[w.json]})}getNegativeResponse(){return st(this.#t,{variant:"negative",arguments:[],statusCodes:[Ke.negative],mimeTypes:[w.json]})}},be=new xe({positive:e=>{let t=K({schema:e}),r=k.z.object({status:k.z.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:k.z.object({status:k.z.literal("error"),error:k.z.object({message:k.z.string()})}).example({status:"error",error:{message:F(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(Ke.positive).json({status:"success",data:r});return}let a=Me(e);Ct({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:F(e)}})}}),at=new xe({positive:e=>{let t=K({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof k.z.ZodArray?e.shape.items:k.z.array(k.z.any());return t.reduce((o,n)=>oe(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:k.z.string().example(F(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Me(r);Ct({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).type("text/plain").send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(Ke.positive).json(t.items):e.status(500).type("text/plain").send("Property 'items' is missing in the endpoint output")}});var Te=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t instanceof B?t:new B(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new he(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new B({input:Rr.z.object({}),handler:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:s,operationId:a,...p}){let{middlewares:l,resultHandler:d}=this,m="methods"in p?p.methods:[p.method],y=typeof a=="function"?a:()=>a,u="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],S="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new it({handler:r,middlewares:l,outputSchema:o,resultHandler:d,scopes:u,tags:S,methods:m,getOperationId:y,description:n,shortDescription:s,inputSchema:Tr(l,t)})}},Ar=new Te(be),Pr=new Te(at);var E=require("ansis"),Er=require("node:util"),vt=require("node:perf_hooks");var Se={debug:10,info:20,warn:30,error:40},Ir=e=>oe(e)&&Object.keys(Se).some(t=>t in e),zr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),pt=zr(),Cr=zr(2),$o=e=>e<1e-6?["picosecond",e/1e-9,pt]:e<.001?["nanosecond",e/1e-6,pt]:e<1?["microsecond",e/.001,pt]:e<1e3?["millisecond",e,pt]:e<6e4?["second",e/1e3,Cr]:["minute",e/6e4,Cr],wr=e=>{let[t,r,o]=$o(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var Oe=class e{constructor(t){this.config=t;let{color:r=new E.Ansis().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:E.blue,info:E.green,warn:(0,E.hex)("#FFA500"),error:E.red};prettyPrint(t){let{depth:r=2}=this.config;return(0,Er.inspect)(t,{depth:r,colors:this.hasColor,breakLength:this.config.level==="debug"?80:1/0,compact:this.config.level==="debug"?3:!0})}print(t,r,o){if(this.config.level==="silent"||Se[t]<Se[this.config.level])return;let{requestId:n,...s}=this.config.ctx||{},a=[new Date().toISOString()];n&&a.push(this.hasColor?(0,E.cyanBright)(n):n),a.push(this.hasColor?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&a.push(this.prettyPrint(o)),Object.keys(s).length>0&&a.push(this.prettyPrint(s)),console.log(a.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}profile(t){let r=vt.performance.now();return()=>{let o=vt.performance.now()-r,{message:n,severity:s="debug",formatter:a=wr}=typeof t=="object"?t:{message:t};this.print(typeof s=="function"?s(o):s,n,a(o))}}};var Ae=require("ramda"),Re=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze((0,Ae.toPairs)(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=(0,Ae.head)(this.pairs)?.[1],this.siblingMethods=Object.freeze((0,Ae.tail)(this.pairs).map(([r])=>r))}};var Zr=O(require("express"),1),Pe=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Zr.default.static(...this.params))}};var ct=O(require("express"),1),Hr=O(require("node:http"),1),Dr=O(require("node:https"),1);var Ce=async(e,t="default")=>{try{return(await Promise.resolve().then(()=>O(require(e))))[t]}catch{}throw new ue(e)};var kt=O(require("node:assert/strict"),1);var ae=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{let s=Object.entries(e).map(([a,p])=>[a.trim(),p]);for(let[a,p]of s){kt.default.doesNotMatch(a,/\//,new te(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let l=`${o||""}${a?`/${a}`:""}`;if(p instanceof Fe){let d=p.getMethods().slice();n&&d.push("options");for(let m of d)t(p,l,m)}else if(p instanceof Pe)r&&p.apply(l,r);else if(p instanceof Re){for(let[d,m]of p.pairs)(0,kt.default)(m.getMethods().includes(d),new te(`Endpoint assigned to ${d} method of ${l} must support ${d} method.`)),t(m,l,d);n&&p.firstEndpoint&&t(p.firstEndpoint,l,"options",p.siblingMethods)}else ae({onEndpoint:t,onStatic:r,hasCors:n,routing:p,parentPath:l})}};var Mt=({app:e,getChildLogger:t,config:r,routing:o,parsers:n})=>ae({routing:o,hasCors:!!r.cors,onEndpoint:(s,a,p,l)=>{e[p](a,...n?.[s.getRequestType()]||[],async(d,m)=>s.execute({request:d,response:m,logger:t(d),config:r,siblingMethods:l}))},onStatic:(s,a)=>{e.use(s,a)}});var Be=O(require("http-errors"),1);var jr=({errorHandler:e,getChildLogger:t})=>async(r,o,n,s)=>{if(!r)return s();e.execute({error:(0,Be.isHttpError)(r)?r:(0,Be.default)(400,fe(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)})},Lr=({errorHandler:e,getChildLogger:t})=>async(r,o)=>{let n=(0,Be.default)(404,`Can not ${r.method} ${r.path}`),s=t(r);try{e.execute({request:r,response:o,logger:s,error:n,input:null,output:null,options:{}})}catch(a){ot({response:o,logger:s,error:new _(fe(a).message,n)})}},Vo=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},Go=e=>({log:e.debug.bind(e)}),Nr=async({getChildLogger:e,config:t})=>{let r=await Ce("express-fileupload"),{limitError:o,beforeUpload:n,...s}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,l,d)=>{let m=e(p);try{await n?.({request:p,logger:m})}catch(y){return d(y)}r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Go(m)})(p,l,d)}),o&&a.push(Vo(o)),a},vr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},kr=({rootLogger:e,config:t})=>async(r,o,n)=>{let s=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;s.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[h]={logger:s}),n()},Mr=e=>t=>t.res?.locals[h]?.logger||e;var Z=require("ansis"),Ur=()=>{let e=(0,Z.italic)("Proudly supports transgender community.".padStart(109)),t=(0,Z.italic)("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=(0,Z.italic)("Thank you for choosing Express Zod API for your project.".padStart(132)),o=(0,Z.italic)("for Zoey".padEnd(20)),n=(0,Z.hex)("#F5A9B8"),s=(0,Z.hex)("#5BCEFA"),a=new Array(14).fill(s,1,3).fill(n,3,5).fill(Z.whiteBright,5,7).fill(n,7,9).fill(s,9,12).fill(Z.gray,12,13);return`
5
+ Original error: ${e.originalError.message}.`:""))};var br=require("ramda");var se=e=>oe(e)&&"or"in e,ge=e=>oe(e)&&"and"in e,wt=e=>({and:(0,br.chain)(t=>ge(t)?t.and:[t],e)}),nt=(e,t)=>ge(e)?{and:e.and.map(r=>se(r)?{or:r.or.map(t)}:t(r))}:se(e)?{or:e.or.map(r=>ge(r)?{and:r.and.map(t)}:t(r))}:t(e),Et=e=>e.and.reduce((t,r)=>({or:re(t.or,se(r)?r.or:[r],wt)}),{or:[]}),ye=(e,t)=>ge(e)?se(t)?ye(Et(e),t):wt([e,t]):se(e)?ge(t)?ye(t,e):se(t)?{or:re(e.or,t.or,wt)}:ye(e,{and:[t]}):ge(t)||se(t)?ye(t,e):{and:[e,t]};var jt=require("zod");var Zt=class{},B=class extends Zt{#e;#t;#r;constructor({input:t,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 U(o):o}}},he=class extends B{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({input:jt.z.object({}),handler:async({request:n,response:s})=>new Promise((a,p)=>{let l=d=>{if(d&&d instanceof Error)return p(o(d));a(r(n,s))};t(n,s,l)?.catch(l)})})}};var Fe=class{},it=class extends Fe{#e;#t;#r;#s;#o;#a;#p;#n;#c;#d;#l;#i;constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:l=[],tags:d=[],description:m,shortDescription:y}){super(),this.#a=n,this.#p=s,this.#r=l,this.#l=a,this.#t=Object.freeze(t),this.#c=Object.freeze(p),this.#d=Object.freeze(d),this.#e={long:m,short:y},this.#n={input:r,output:o},this.#o={positive:Object.freeze(s.getPositiveResponse(o)),negative:Object.freeze(s.getNegativeResponse())},this.#i=hr(r)?"upload":xr(r)?"raw":"json",this.#s={input:Object.freeze([w[this.#i]]),positive:Object.freeze(this.#o.positive.flatMap(({mimeTypes:u})=>u)),negative:Object.freeze(this.#o.negative.flatMap(({mimeTypes:u})=>u))}}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return t==="input"||t==="output"?this.#n[t]:this.getResponses(t).map(({schema:r})=>r).reduce((r,o)=>r.or(o))}getMimeTypes(t){return this.#s[t]}getRequestType(){return this.#i}getResponses(t){return this.#o[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?ye(t,o):t},{and:[]})}getScopes(){return this.#c}getTags(){return this.#d}getOperationId(t){return this.#l(t)}#m(t){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#t.concat(t).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#n.output.parseAsync(t)}catch(r){throw r instanceof Lt.z.ZodError?new G(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s,options:a}){for(let p of this.#r)if(!(t==="options"&&!(p instanceof he))&&(Object.assign(a,await p.execute({input:r,options:a,request:o,response:n,logger:s})),n.writableEnded)){s.warn("A middleware has closed the stream. Accumulated options:",a);break}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#n.input.parseAsync(t)}catch(s){throw s instanceof Lt.z.ZodError?new U(s):s}return this.#a({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:s,output:a,options:p}){try{await this.#p.execute({error:t,output:a,request:r,response:o,logger:n,input:s,options:p})}catch(l){ot({logger:n,response:o,error:new _(fe(l).message,t||void 0)})}}async execute({request:t,response:r,logger:o,config:n,siblingMethods:s=[]}){let a=Rt(t),p={},l=null,d=null;if(n.cors){let y=this.#m(s);typeof n.cors=="function"&&(y=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:y}));for(let u in y)r.set(u,y[u])}let m=Pt(t,n.inputSources);try{if(await this.#f({method:a,input:m,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}l=await this.#u(await this.#y({input:m,logger:o,options:p}))}catch(y){d=fe(y)}await this.#g({input:m,output:l,request:t,response:r,error:d,logger:o,options:p})}};var Tr=(e,t)=>{let r=e.map(n=>n.getSchema()).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>pr(s,n),o)};var k=require("zod");var Ke={positive:200,negative:400};var Sr=O(require("node:assert/strict"),1),Or=require("zod");var st=(e,t)=>typeof e=="function"?st(e(...t.arguments),t):e instanceof Or.z.ZodType?[{...t,schema:e}]:(Array.isArray(e)&&(0,Sr.default)(e.length,new _(`At least one ${t.variant} response schema required.`)),(Array.isArray(e)?e:[e]).map(({schema:r,statusCodes:o,statusCode:n,mimeTypes:s,mimeType:a})=>({schema:r,statusCodes:n?[n]:o||t.statusCodes,mimeTypes:a?[a]:s||t.mimeTypes})));var Nt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},xe=class extends Nt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return st(this.#e,{variant:"positive",arguments:[t],statusCodes:[Ke.positive],mimeTypes:[w.json]})}getNegativeResponse(){return st(this.#t,{variant:"negative",arguments:[],statusCodes:[Ke.negative],mimeTypes:[w.json]})}},be=new xe({positive:e=>{let t=K({schema:e}),r=k.z.object({status:k.z.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:k.z.object({status:k.z.literal("error"),error:k.z.object({message:k.z.string()})}).example({status:"error",error:{message:F(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(Ke.positive).json({status:"success",data:r});return}let a=Me(e);Ct({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:F(e)}})}}),at=new xe({positive:e=>{let t=K({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof k.z.ZodArray?e.shape.items:k.z.array(k.z.any());return t.reduce((o,n)=>oe(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:k.z.string().example(F(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Me(r);Ct({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).type("text/plain").send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(Ke.positive).json(t.items):e.status(500).type("text/plain").send("Property 'items' is missing in the endpoint output")}});var Te=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t instanceof B?t:new B(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new he(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new B({input:Rr.z.object({}),handler:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:s,operationId:a,...p}){let{middlewares:l,resultHandler:d}=this,m="methods"in p?p.methods:[p.method],y=typeof a=="function"?a:()=>a,u="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],S="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new it({handler:r,middlewares:l,outputSchema:o,resultHandler:d,scopes:u,tags:S,methods:m,getOperationId:y,description:n,shortDescription:s,inputSchema:Tr(l,t)})}},Ar=new Te(be),Pr=new Te(at);var E=require("ansis"),Er=require("node:util"),vt=require("node:perf_hooks");var Se={debug:10,info:20,warn:30,error:40},Ir=e=>oe(e)&&Object.keys(Se).some(t=>t in e),zr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),pt=zr(),Cr=zr(2),$o=e=>e<1e-6?["picosecond",e/1e-9,pt]:e<.001?["nanosecond",e/1e-6,pt]:e<1?["microsecond",e/.001,pt]:e<1e3?["millisecond",e,pt]:e<6e4?["second",e/1e3,Cr]:["minute",e/6e4,Cr],wr=e=>{let[t,r,o]=$o(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var Oe=class e{constructor(t){this.config=t;let{color:r=new E.Ansis().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:E.blue,info:E.green,warn:(0,E.hex)("#FFA500"),error:E.red};prettyPrint(t){let{depth:r=2}=this.config;return(0,Er.inspect)(t,{depth:r,colors:this.hasColor,breakLength:this.config.level==="debug"?80:1/0,compact:this.config.level==="debug"?3:!0})}print(t,r,o){if(this.config.level==="silent"||Se[t]<Se[this.config.level])return;let{requestId:n,...s}=this.config.ctx||{},a=[new Date().toISOString()];n&&a.push(this.hasColor?(0,E.cyanBright)(n):n),a.push(this.hasColor?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&a.push(this.prettyPrint(o)),Object.keys(s).length>0&&a.push(this.prettyPrint(s)),console.log(a.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}profile(t){let r=vt.performance.now();return()=>{let o=vt.performance.now()-r,{message:n,severity:s="debug",formatter:a=wr}=typeof t=="object"?t:{message:t};this.print(typeof s=="function"?s(o):s,n,a(o))}}};var Ae=require("ramda"),Re=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze((0,Ae.toPairs)(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=(0,Ae.head)(this.pairs)?.[1],this.siblingMethods=Object.freeze((0,Ae.tail)(this.pairs).map(([r])=>r))}};var Zr=O(require("express"),1),Pe=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Zr.default.static(...this.params))}};var ct=O(require("express"),1),Hr=O(require("node:http"),1),Dr=O(require("node:https"),1);var Ce=async(e,t="default")=>{try{return(await Promise.resolve().then(()=>O(require(e))))[t]}catch{}throw new ue(e)};var kt=O(require("node:assert/strict"),1);var ae=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{let s=Object.entries(e).map(([a,p])=>[a.trim(),p]);for(let[a,p]of s){kt.default.doesNotMatch(a,/\//,new te(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let l=`${o||""}${a?`/${a}`:""}`;if(p instanceof Fe){let d=p.getMethods().slice();n&&d.push("options");for(let m of d)t(p,l,m)}else if(p instanceof Pe)r&&p.apply(l,r);else if(p instanceof Re){for(let[d,m]of p.pairs)(0,kt.default)(m.getMethods().includes(d),new te(`Endpoint assigned to ${d} method of ${l} must support ${d} method.`)),t(m,l,d);n&&p.firstEndpoint&&t(p.firstEndpoint,l,"options",p.siblingMethods)}else ae({onEndpoint:t,onStatic:r,hasCors:n,routing:p,parentPath:l})}};var Mt=({app:e,getChildLogger:t,config:r,routing:o,parsers:n})=>ae({routing:o,hasCors:!!r.cors,onEndpoint:(s,a,p,l)=>{e[p](a,...n?.[s.getRequestType()]||[],async(d,m)=>s.execute({request:d,response:m,logger:t(d),config:r,siblingMethods:l}))},onStatic:(s,a)=>{e.use(s,a)}});var Be=O(require("http-errors"),1);var jr=({errorHandler:e,getChildLogger:t})=>async(r,o,n,s)=>r?e.execute({error:(0,Be.isHttpError)(r)?r:(0,Be.default)(400,fe(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):s(),Lr=({errorHandler:e,getChildLogger:t})=>async(r,o)=>{let n=(0,Be.default)(404,`Can not ${r.method} ${r.path}`),s=t(r);try{e.execute({request:r,response:o,logger:s,error:n,input:null,output:null,options:{}})}catch(a){ot({response:o,logger:s,error:new _(fe(a).message,n)})}},Vo=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},Go=e=>({log:e.debug.bind(e)}),Nr=async({getChildLogger:e,config:t})=>{let r=await Ce("express-fileupload"),{limitError:o,beforeUpload:n,...s}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,l,d)=>{let m=e(p);try{await n?.({request:p,logger:m})}catch(y){return d(y)}return r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Go(m)})(p,l,d)}),o&&a.push(Vo(o)),a},vr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},kr=({rootLogger:e,config:t})=>async(r,o,n)=>{let s=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;s.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[h]={logger:s}),n()},Mr=e=>t=>t.res?.locals[h]?.logger||e;var Z=require("ansis"),Ur=()=>{let e=(0,Z.italic)("Proudly supports transgender community.".padStart(109)),t=(0,Z.italic)("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=(0,Z.italic)("Thank you for choosing Express Zod API for your project.".padStart(132)),o=(0,Z.italic)("for Zoey".padEnd(20)),n=(0,Z.hex)("#F5A9B8"),s=(0,Z.hex)("#5BCEFA"),a=new Array(14).fill(s,1,3).fill(n,3,5).fill(Z.whiteBright,5,7).fill(n,7,9).fill(s,9,12).fill(Z.gray,12,13);return`
6
6
  8888888888 8888888888P 888 d8888 8888888b. 8888888
7
7
  888 d88P 888 d88888 888 Y88b 888
8
8
  888 d88P 888 d88P888 888 888 888
@@ -17,7 +17,7 @@ ${o}888${t}
17
17
  ${r}
18
18
  `.split(`
19
19
  `).map((l,d)=>a[d]?a[d](l):l).join(`
20
- `)};var Fr=e=>{e.startupLogo!==!1&&console.log(Ur());let t=e.errorHandler||be,r=Ir(e.logger)?e.logger:new Oe(e.logger);r.debug("Running","v20.9.2 (CJS)");let o=kr({rootLogger:r,config:e}),s={getChildLogger:Mr(r),errorHandler:t},a=Lr(s),p=jr(s);return{...s,rootLogger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},Kr=(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,loggingMiddleware:s}=Fr(e);return Mt({app:e.app.use(s),routing:t,getChildLogger:o,config:e}),{notFoundHandler:n,logger:r}},Br=async(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,parserFailureHandler:s,loggingMiddleware:a}=Fr(e),p=(0,ct.default)().disable("x-powered-by").use(a);if(e.server.compression){let y=await Ce("compression");p.use(y(typeof e.server.compression=="object"?e.server.compression:void 0))}let l={json:[e.server.jsonParser||ct.default.json()],raw:[e.server.rawParser||ct.default.raw(),vr],upload:e.server.upload?await Nr({config:e,getChildLogger:o}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:p,logger:r,getChildLogger:o}),Mt({app:p,routing:t,getChildLogger:o,config:e,parsers:l}),p.use(s,n);let d=(y,u)=>y.listen(u,()=>{r.info("Listening",u)}),m={httpServer:d(Hr.default.createServer(p),e.server.listen),httpsServer:e.https?d(Dr.default.createServer(e.https.options,p),e.https.listen):void 0};return{app:p,...m,logger:r}};var po=O(require("node:assert/strict"),1),co=require("openapi3-ts/oas31"),lo=require("ramda");var Q=O(require("node:assert/strict"),1),q=require("openapi3-ts/oas31"),c=require("ramda"),b=require("zod");var Ie=require("zod");var dt=e=>!isNaN(e.getTime());var qe=Symbol("DateIn"),qr=()=>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(qe);var $r=require("zod");var $e=Symbol("DateOut"),Vr=()=>$r.z.date().refine(dt).transform(e=>e.toISOString()).brand($e);var pe=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let s=r[e._def[h]?.brand]||r[e._def.typeName],p=s?s(e,{...n,next:d=>pe(d,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),l=t&&t(e,{prev:p,...n});return l?{...p,...l}:p};var Gr=50,Yr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",_o={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Qr=/:([A-Za-z0-9_]+)/g,Yo=e=>e.match(Qr)?.map(t=>t.slice(1))||[],Jr=e=>e.replace(Qr,t=>`{${t.slice(1)}}`),Qo=({_def:e},{next:t})=>({...t(e.innerType),default:e[h]?.defaultLabel||e.defaultValue()}),Jo=({_def:{innerType:e}},{next:t})=>t(e),Wo=()=>({format:"any"}),Xo=({},e)=>((0,Q.default)(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),en=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.z.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},tn=({options:e},{next:t})=>({oneOf:e.map(t)}),rn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),on=e=>{let[t,r]=e.filter(q.isSchemaObject).filter(n=>n.type==="object"&&Object.keys(n).every(s=>["type","properties","required","examples"].includes(s)));(0,Q.default)(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,c.mergeDeepWith)((n,s)=>Array.isArray(n)&&Array.isArray(s)?(0,c.concat)(n,s):n===s?s:Q.default.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,c.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=re(t.examples||[],r.examples||[],([n,s])=>(0,c.mergeDeepRight)(n,s))),o},nn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return on(o)}catch{}return{allOf:o}},sn=(e,{next:t})=>t(e.unwrap()),an=(e,{next:t})=>t(e.unwrap()),pn=(e,{next:t})=>{let r=t(e.unwrap());return(0,q.isSchemaObject)(r)&&(r.type=Xr(r)),r},Wr=e=>{let t=(0,c.toLower)((0,c.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},_r=e=>({type:Wr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),cn=({value:e})=>({type:Wr(e),const:e}),dn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Ue(p)?p instanceof b.z.ZodOptional:p.isOptional(),s=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=lt(e,r)),s.length&&(a.required=s),a},ln=()=>({type:"null"}),mn=({},e)=>((0,Q.default)(!e.isResponse,new z({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:Yr}}),un=({},e)=>((0,Q.default)(e.isResponse,new z({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Yr}}),fn=({},e)=>Q.default.fail(new z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),yn=()=>({type:"boolean"}),gn=()=>({type:"integer",format:"bigint"}),hn=e=>e.every(t=>t instanceof b.z.ZodLiteral),xn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.z.ZodEnum||e instanceof b.z.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=lt(b.z.object((0,c.fromPairs)((0,c.xprod)(o,[t]))),r),n.required=o),n}if(e instanceof b.z.ZodLiteral)return{type:"object",properties:lt(b.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.z.ZodUnion&&hn(e.options)){let o=(0,c.map)(s=>`${s.value}`,e.options),n=(0,c.fromPairs)((0,c.xprod)(o,[t]));return{type:"object",properties:lt(b.z.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},bn=({_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},Tn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Sn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:l,isEmoji:d,isDatetime:m,_def:{checks:y}})=>{let u=y.find(C=>C.kind==="regex"),S=y.find(C=>C.kind==="datetime"),L=u?u.regex:S?S.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,T={type:"string"},M={"date-time":m,email:e,url:t,uuid:n,cuid:s,cuid2:a,ulid:p,ip:l,emoji:d};for(let C in M)if(M[C]){T.format=C;break}return r!==null&&(T.minLength=r),o!==null&&(T.maxLength=o),L&&(T.pattern=L.source),T},On=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(y=>y.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(y=>y.kind==="max"),l=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,d=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=s:m.exclusiveMinimum=s,d?m.maximum=l:m.exclusiveMaximum=l,m},lt=({shape:e},t)=>(0,c.map)(t,e),Rn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return _o?.[t]},Xr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},An=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,q.isSchemaObject)(o)){let s=Xe(e,Rn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(b.z.any())}if(!t&&n.type==="preprocess"&&(0,q.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Pn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Cn=(e,{next:t})=>t(e.unwrap()),In=({schema:e},{next:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(e);return o(s)||(n(s,{}),n(s,t(e)))},zn=(e,{next:t})=>t(e.unwrap().shape.raw),eo=e=>e.length?(0,c.fromPairs)((0,c.zip)((0,c.range)(1,e.length+1).map(t=>`example${t}`),(0,c.map)((0,c.objOf)("value"),e))):void 0,to=(e,t,r=[])=>(0,c.pipe)(K,(0,c.map)((0,c.when)(o=>(0,c.type)(o)==="Object",(0,c.omit)(r))),eo)({schema:e,variant:t?"parsed":"original",validate:!0}),wn=(e,t)=>(0,c.pipe)(K,(0,c.filter)((0,c.has)(t)),(0,c.pluck)(t),eo)({schema:e,variant:"original",validate:!0}),ce=e=>e instanceof b.z.ZodObject?e:e instanceof b.z.ZodBranded?ce(e.unwrap()):e instanceof b.z.ZodUnion||e instanceof b.z.ZodDiscriminatedUnion?e.options.map(t=>ce(t)).reduce((t,r)=>t.merge(r.partial()),b.z.object({})):e instanceof b.z.ZodEffects?ce(e._def.schema):e instanceof b.z.ZodPipeline?ce(e._def.in):ce(e._def.left).merge(ce(e._def.right)),ro=({path:e,method:t,schema:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,brandHandling:l,description:d=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:m}=ce(r),y=Yo(e),u=o.includes("query"),S=o.includes("params"),L=o.includes("headers"),T=x=>S&&y.includes(x),M=x=>L&&At(x);return Object.keys(m).map(x=>({name:x,location:T(x)?"path":M(x)?"header":u?"query":void 0})).filter(x=>x.location!==void 0).map(({name:x,location:Ze})=>{let V=pe(m[x],{rules:{...l,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!1,serializer:n,getRef:s,makeRef:a,path:e,method:t}}),X=p==="components"?a(v(d,x),V):V;return{name:x,in:Ze,required:!m[x].isOptional(),description:V.description||d,schema:X,examples:wn(r,x)}})},Ht={ZodString:Sn,ZodNumber:On,ZodBigInt:gn,ZodBoolean:yn,ZodNull:ln,ZodArray:bn,ZodTuple:Tn,ZodRecord:xn,ZodObject:dn,ZodLiteral:cn,ZodIntersection:nn,ZodUnion:tn,ZodAny:Wo,ZodDefault:Qo,ZodEnum:_r,ZodNativeEnum:_r,ZodEffects:An,ZodOptional:sn,ZodNullable:pn,ZodDiscriminatedUnion:rn,ZodBranded:Cn,ZodDate:fn,ZodCatch:Jo,ZodPipeline:Pn,ZodLazy:In,ZodReadonly:an,[Y]:en,[De]:Xo,[$e]:un,[qe]:mn,[ie]:zn},Dt=(e,{isResponse:t,prev:r})=>{if((0,q.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof b.z.ZodLazy,s=r.type!==void 0,a=t&&Ue(e),p=!n&&s&&!a&&e.isNullable(),l=n?[]:K({schema:e,variant:t?"parsed":"original",validate:!0}),d={};return o&&(d.description=o),p&&(d.type=Xr(r)),l.length&&(d.examples=l.slice()),d},Ft=(e,t)=>Q.default.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Ut=(e,t)=>{if((0,q.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,c.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,c.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Ut(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Ut(o,t))),r},oo=e=>(0,q.isReferenceObject)(e)?e:(0,c.omit)(["examples"],e),no=({method:e,path:t,schema:r,mimeTypes:o,variant:n,serializer:s,getRef:a,makeRef:p,composition:l,hasMultipleStatusCodes:d,statusCode:m,brandHandling:y,description:u=`${e.toUpperCase()} ${t} ${It(n)} response ${d?m:""}`.trim()})=>{let S=oo(pe(r,{rules:{...y,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),L={schema:l==="components"?p(v(u),S):S,examples:to(r,!0)};return{description:u,content:(0,c.fromPairs)((0,c.xprod)(o,[L]))}},En=()=>({type:"http",scheme:"basic"}),Zn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},jn=({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},Ln=({name:e})=>({type:"apiKey",in:"header",name:e}),Nn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),vn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),kn=({flows:e={}})=>({type:"oauth2",flows:(0,c.map)(t=>({...t,scopes:t.scopes||{}}),(0,c.reject)(c.isNil,e))}),io=(e,t)=>{let r={basic:En,bearer:Zn,input:jn,header:Ln,cookie:Nn,openid:vn,oauth2:kn};return nt(e,o=>r[o.type](o,t))},mt=e=>"or"in e?e.or.map(t=>"and"in t?(0,c.mergeAll)((0,c.map)(({name:r,scopes:o})=>(0,c.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?mt(Et(e)):mt({or:[e]}),so=({method:e,path:t,schema:r,mimeTypes:o,serializer:n,getRef:s,makeRef:a,composition:p,brandHandling:l,paramNames:d,description:m=`${e.toUpperCase()} ${t} Request body`})=>{let y=oo(Ut(pe(r,{rules:{...l,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!1,serializer:n,getRef:s,makeRef:a,path:t,method:e}}),d)),u={schema:p==="components"?a(v(m),y):y,examples:to(r,!1,d)};return{description:m,content:(0,c.fromPairs)((0,c.xprod)(o,[u]))}},ao=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Kt=e=>e.length<=Gr?e:e.slice(0,Gr-1)+"\u2026";var ut=class extends co.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let n=o||v(r,t),s=this.lastOperationIdSuffixes.get(n);return s===void 0?(this.lastOperationIdSuffixes.set(n,1),n):(o&&po.default.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(n,s),`${n}${s}`)}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:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:l=!0,composition:d="inline",serializer:m=We}){super(),this.addInfo({title:o,version:n});for(let u of typeof s=="string"?[s]:s)this.addServer({url:u});ae({routing:t,onEndpoint:(u,S,L)=>{let T=L,M={path:S,method:T,endpoint:u,composition:d,serializer:m,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[C,x]=["short","long"].map(u.getDescription.bind(u)),Ze=C?Kt(C):l&&x?Kt(x):void 0,V=u.getTags(),X=r.inputSources?.[T]||Ot[T],le=this.ensureUniqOperationId(S,T,u.getOperationId(T)),je=ro({...M,inputSources:X,schema:u.getSchema("input"),description:a?.requestParameter?.call(null,{method:T,path:S,operationId:le})}),Ge={};for(let D of["positive","negative"]){let ee=u.getResponses(D);for(let{mimeTypes:Le,schema:R,statusCodes:A}of ee)for(let I of A)Ge[I]=no({...M,variant:D,schema:R,mimeTypes:Le,statusCode:I,hasMultipleStatusCodes:ee.length>1||A.length>1,description:a?.[`${D}Response`]?.call(null,{method:T,path:S,operationId:le,statusCode:I})})}let St=X.includes("body")?so({...M,paramNames:(0,lo.pluck)("name",je),schema:u.getSchema("input"),mimeTypes:u.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:T,path:S,operationId:le})}):void 0,_e=mt(nt(io(u.getSecurity(),X),D=>{let ee=this.ensureUniqSecuritySchemaName(D),Le=["oauth2","openIdConnect"].includes(D.type)?u.getScopes().slice():[];return this.addSecurityScheme(ee,D),{name:ee,scopes:Le}}));this.addPath(Jr(S),{[T]:{operationId:le,summary:Ze,description:x,tags:V.length>0?V:void 0,parameters:je.length>0?je:void 0,requestBody:St,security:_e.length>0?_e:void 0,responses:Ge}})}}),this.rootDoc.tags=r.tags?ao(r.tags):[]}};var ft=require("node-mocks-http"),Mn=e=>(0,ft.createRequest)({...e,headers:{"content-type":w.json,...e?.headers}}),Un=e=>(0,ft.createResponse)(e),Hn=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:o in Se?(...s)=>t[o].push(s):Reflect.get(r,o,n)}})},Dn=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=Mn(e),s=Un({req:n,...t});s.req=t?.req||n,n.res=s;let a=Hn(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:s,loggerMock:a,configMock:p}},mo=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:s}=Dn(t);return await e.execute({request:r,response:o,config:s,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}};var j=O(require("typescript"),1);var H=O(require("typescript"),1),ze=require("ramda"),i=H.default.factory,J=[i.createModifier(H.default.SyntaxKind.ExportKeyword)],Fn=[i.createModifier(H.default.SyntaxKind.AsyncKeyword)],Kn=[i.createModifier(H.default.SyntaxKind.PublicKeyword),i.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],uo=[i.createModifier(H.default.SyntaxKind.ProtectedKeyword),i.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],Bt=i.createTemplateHead(""),we=i.createTemplateTail(""),qt=i.createTemplateMiddle(" "),$t=e=>i.createTemplateLiteralType(Bt,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?we:qt))),Vt=$t(["M","P"]),yt=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),gt=(e,t)=>(0,ze.chain)(([r,o])=>[yt(i.createIdentifier(r),o,t)],(0,ze.toPairs)(e)),Gt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),fo=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),yo=(e,t)=>i.createPropertySignature(void 0,e,void 0,i.createTypeReferenceNode(t)),W=(e,t,r)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,r,t)],H.default.NodeFlags.Const),_t=(e,t)=>i.createTypeAliasDeclaration(J,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),ht=(e,t)=>i.createTypeAliasDeclaration(J,e,void 0,t),go=(e,t,r)=>i.createPropertyDeclaration(Kn,e,void 0,t,r),ho=(e,t,r)=>i.createClassDeclaration(J,e,void 0,void 0,[t,...r]),xo=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),bo=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(H.default.SyntaxKind.AnyKeyword)]),To=(e,t,r)=>i.createInterfaceDeclaration(J,e,void 0,t,r),Bn=(0,ze.chain)(([e,t])=>[i.createTypeParameterDeclaration([],e,i.createTypeReferenceNode(t))]),So=e=>Bn((0,ze.toPairs)(e)),Yt=(e,t,r)=>i.createArrowFunction(r?Fn:void 0,void 0,e.map(o=>yt(o)),void 0,void 0,t),Qt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,gt({acc:void 0,key:void 0}),void 0,void 0,t),r]),Oo=(...e)=>`"${e.join(" ")}"`;var Ro=["get","post","put","delete","patch"];var g=O(require("typescript"),1),bt=require("zod");var $=O(require("typescript"),1),{factory:xt}=$.default,Jt=(e,t)=>{$.default.addSyntheticLeadingComment(e,$.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ee=(e,t,r)=>{let o=xt.createTypeAliasDeclaration(void 0,xt.createIdentifier(t),void 0,e);return r&&Jt(o,r),o},Wt=(e,t)=>{let r=$.default.createSourceFile("print.ts","",$.default.ScriptTarget.Latest,!1,$.default.ScriptKind.TS);return $.default.createPrinter(t).printNode($.default.EmitHint.Unspecified,e,r)},qn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Ao=e=>qn.test(e)?xt.createIdentifier(e):xt.createStringLiteral(e);var{factory:f}=g.default,$n={[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},Vn=({value:e})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Gn=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Ue(a)?a instanceof bt.z.ZodOptional:a.isOptional(),l=f.createPropertySignature(void 0,Ao(s),p&&o?f.createToken(g.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Jt(l,a.description),l});return f.createTypeLiteralNode(n)},_n=({element:e},{next:t})=>f.createArrayTypeNode(t(e)),Yn=({options:e})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Po=({options:e},{next:t})=>f.createUnionTypeNode(e.map(t)),Qn=e=>$n?.[e.kind],Jn=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Xe(e,Qn(o)),s={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&&s[n]||g.default.SyntaxKind.AnyKeyword)}return o},Wn=e=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),Xn=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(g.default.SyntaxKind.UndefinedKeyword)]):o},ei=(e,{next:t})=>f.createUnionTypeNode([t(e.unwrap()),f.createLiteralTypeNode(f.createNull())]),ti=({items:e,_def:{rest:t}},{next:r})=>f.createTupleTypeNode(e.map(r).concat(t===null?[]:f.createRestTypeNode(r(t)))),ri=({keySchema:e,valueSchema:t},{next:r})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e,t].map(r)),oi=({_def:e},{next:t})=>f.createIntersectionTypeNode([e.left,e.right].map(t)),ni=({_def:e},{next:t})=>t(e.innerType),de=e=>()=>f.createKeywordTypeNode(e),ii=(e,{next:t})=>t(e.unwrap()),si=(e,{next:t})=>t(e.unwrap()),ai=({_def:e},{next:t})=>t(e.innerType),pi=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ci=()=>f.createLiteralTypeNode(f.createNull()),di=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:n})=>{let s=`Type${n(e)}`;return t(s)||(r(s,f.createLiteralTypeNode(f.createNull())),r(s,o(e)))},li=e=>{let t=e.unwrap(),r=f.createKeywordTypeNode(g.default.SyntaxKind.StringKeyword),o=f.createTypeReferenceNode("Buffer"),n=f.createUnionTypeNode([r,o]);return t instanceof bt.z.ZodString?r:t instanceof bt.z.ZodUnion?n:o},mi=(e,{next:t})=>t(e.unwrap().shape.raw),ui={ZodString:de(g.default.SyntaxKind.StringKeyword),ZodNumber:de(g.default.SyntaxKind.NumberKeyword),ZodBigInt:de(g.default.SyntaxKind.BigIntKeyword),ZodBoolean:de(g.default.SyntaxKind.BooleanKeyword),ZodAny:de(g.default.SyntaxKind.AnyKeyword),[qe]:de(g.default.SyntaxKind.StringKeyword),[$e]:de(g.default.SyntaxKind.StringKeyword),ZodNull:ci,ZodArray:_n,ZodTuple:ti,ZodRecord:ri,ZodObject:Gn,ZodLiteral:Vn,ZodIntersection:oi,ZodUnion:Po,ZodDefault:ni,ZodEnum:Yn,ZodNativeEnum:Wn,ZodEffects:Jn,ZodOptional:Xn,ZodNullable:ei,ZodDiscriminatedUnion:Po,ZodBranded:ii,ZodCatch:ai,ZodPipeline:pi,ZodLazy:di,ZodReadonly:si,[Y]:li,[ie]:mi},Ve=(e,{brandHandling:t,ctx:r})=>pe(e,{rules:{...t,...ui},onMissing:()=>f.createKeywordTypeNode(g.default.SyntaxKind.AnyKeyword),ctx:r});var Tt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:i.createIdentifier("Path"),methodType:i.createIdentifier("Method"),methodPathType:i.createIdentifier("MethodPath"),inputInterface:i.createIdentifier("Input"),posResponseInterface:i.createIdentifier("PositiveResponse"),negResponseInterface:i.createIdentifier("NegativeResponse"),responseInterface:i.createIdentifier("Response"),jsonEndpointsConst:i.createIdentifier("jsonEndpoints"),endpointTagsConst:i.createIdentifier("endpointTags"),providerType:i.createIdentifier("Provider"),implementationType:i.createIdentifier("Implementation"),clientClass:i.createIdentifier("ExpressZodAPIClient"),keyParameter:i.createIdentifier("key"),pathParameter:i.createIdentifier("path"),paramsArgument:i.createIdentifier("params"),methodParameter:i.createIdentifier("method"),accumulator:i.createIdentifier("acc"),provideMethod:i.createIdentifier("provide"),implementationArgument:i.createIdentifier("implementation"),headersProperty:i.createIdentifier("headers"),hasBodyConst:i.createIdentifier("hasBody"),undefinedValue:i.createIdentifier("undefined"),bodyProperty:i.createIdentifier("body"),responseConst:i.createIdentifier("response"),searchParamsConst:i.createIdentifier("searchParams"),exampleImplementationConst:i.createIdentifier("exampleImplementation"),clientConst:i.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,Ee(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:n=We,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){ae({routing:t,onEndpoint:(R,A,I)=>{let me={serializer:n,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},Ne=v(I,A,"input"),ve=Ve(R.getSchema("input"),{brandHandling:r,ctx:{...me,isResponse:!1}}),N=s?v(I,A,"positive.response"):void 0,Xt=R.getSchema("positive"),er=s?Ve(Xt,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,ke=s?v(I,A,"negative.response"):void 0,tr=R.getSchema("negative"),rr=s?Ve(tr,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,or=v(I,A,"response"),Io=N&&ke?i.createUnionTypeNode([i.createTypeReferenceNode(N),i.createTypeReferenceNode(ke)]):Ve(Xt.or(tr),{brandHandling:r,ctx:{...me,isResponse:!0}});this.program.push(Ee(ve,Ne)),er&&N&&this.program.push(Ee(er,N)),rr&&ke&&this.program.push(Ee(rr,ke)),this.program.push(Ee(Io,or)),I!=="options"&&(this.paths.push(A),this.registry.set({method:I,path:A},{input:Ne,positive:N,negative:ke,response:or,isJson:R.getMimeTypes("positive").includes(w.json),tags:R.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(_t(this.ids.pathType,this.paths)),this.program.push(_t(this.ids.methodType,Ro)),this.program.push(ht(this.ids.methodPathType,$t([this.ids.methodType,this.ids.pathType])));let p=[i.createHeritageClause(j.default.SyntaxKind.ExtendsKeyword,[Gt(this.ids.methodPathType,j.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let l=[],d=[];for(let[{method:R,path:A},{isJson:I,tags:me,...Ne}]of this.registry){let ve=Oo(R,A);for(let N of this.interfaces)N.kind in Ne&&N.props.push(yo(ve,Ne[N.kind]));o!=="types"&&(I&&l.push(i.createPropertyAssignment(ve,i.createTrue())),d.push(i.createPropertyAssignment(ve,i.createArrayLiteralExpression(me.map(N=>i.createStringLiteral(N))))))}for(let{id:R,props:A}of this.interfaces)this.program.push(To(R,p,A));if(o==="types")return;let m=i.createVariableStatement(J,W(this.ids.jsonEndpointsConst,i.createObjectLiteralExpression(l))),y=i.createVariableStatement(J,W(this.ids.endpointTagsConst,i.createObjectLiteralExpression(d))),u=ht(this.ids.providerType,i.createFunctionTypeNode(So({M:this.ids.methodType,P:this.ids.pathType}),gt({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(this.ids.inputInterface),Vt)}),xo(this.ids.responseInterface,Vt))),S=ht(this.ids.implementationType,i.createFunctionTypeNode(void 0,gt({method:i.createTypeReferenceNode(this.ids.methodType),path:i.createKeywordTypeNode(j.default.SyntaxKind.StringKeyword),params:Gt(j.default.SyntaxKind.StringKeyword,j.default.SyntaxKind.AnyKeyword)}),bo())),L=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(this.ids.keyParameter,we)]),T=Qt(this.ids.paramsArgument,i.createCallExpression(i.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[L,i.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),M=Qt(this.ids.paramsArgument,i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[L]),j.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(this.ids.accumulator),i.createPropertyAssignment(i.createComputedPropertyName(this.ids.keyParameter),i.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),i.createObjectLiteralExpression()),C=ho(this.ids.clientClass,fo([yt(this.ids.implementationArgument,i.createTypeReferenceNode(this.ids.implementationType),uo)]),[go(this.ids.provideMethod,i.createTypeReferenceNode(this.ids.providerType),Yt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,T,M]),!0))]);this.program.push(m,y,u,S,C);let x=i.createPropertyAssignment(this.ids.methodParameter,i.createCallExpression(i.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),Ze=i.createPropertyAssignment(this.ids.headersProperty,i.createConditionalExpression(this.ids.hasBodyConst,void 0,i.createObjectLiteralExpression([i.createPropertyAssignment(i.createStringLiteral("Content-Type"),i.createStringLiteral(w.json))]),void 0,this.ids.undefinedValue)),V=i.createPropertyAssignment(this.ids.bodyProperty,i.createConditionalExpression(this.ids.hasBodyConst,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),X=i.createVariableStatement(void 0,W(this.ids.responseConst,i.createAwaitExpression(i.createCallExpression(i.createIdentifier("fetch"),void 0,[i.createTemplateExpression(i.createTemplateHead("https://example.com"),[i.createTemplateSpan(this.ids.pathParameter,i.createTemplateMiddle("")),i.createTemplateSpan(this.ids.searchParamsConst,we)]),i.createObjectLiteralExpression([x,Ze,V])])))),le=i.createVariableStatement(void 0,W(this.ids.hasBodyConst,i.createLogicalNot(i.createCallExpression(i.createPropertyAccessExpression(i.createArrayLiteralExpression([i.createStringLiteral("get"),i.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),je=i.createVariableStatement(void 0,W(this.ids.searchParamsConst,i.createConditionalExpression(this.ids.hasBodyConst,void 0,i.createStringLiteral(""),void 0,i.createTemplateExpression(i.createTemplateHead("?"),[i.createTemplateSpan(i.createNewExpression(i.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),we)])))),[Ge,St]=["json","text"].map(R=>i.createReturnStatement(i.createCallExpression(i.createPropertyAccessExpression(this.ids.responseConst,R),void 0,void 0))),_e=i.createIfStatement(i.createBinaryExpression(i.createTemplateExpression(Bt,[i.createTemplateSpan(this.ids.methodParameter,qt),i.createTemplateSpan(this.ids.pathParameter,we)]),j.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),i.createBlock([Ge])),D=i.createVariableStatement(J,W(this.ids.exampleImplementationConst,Yt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],i.createBlock([le,je,X,_e,St]),!0),i.createTypeReferenceNode(this.ids.implementationType))),ee=i.createExpressionStatement(i.createCallExpression(i.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[i.createStringLiteral("get"),i.createStringLiteral("/v1/user/retrieve"),i.createObjectLiteralExpression([i.createPropertyAssignment("id",i.createStringLiteral("10"))])])),Le=i.createVariableStatement(void 0,W(this.ids.clientConst,i.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(D,Le,ee)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Wt(r,t)).join(`
20
+ `)};var Fr=e=>{e.startupLogo!==!1&&console.log(Ur());let t=e.errorHandler||be,r=Ir(e.logger)?e.logger:new Oe(e.logger);r.debug("Running","v20.10.0 (CJS)");let o=kr({rootLogger:r,config:e}),s={getChildLogger:Mr(r),errorHandler:t},a=Lr(s),p=jr(s);return{...s,rootLogger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},Kr=(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,loggingMiddleware:s}=Fr(e);return Mt({app:e.app.use(s),routing:t,getChildLogger:o,config:e}),{notFoundHandler:n,logger:r}},Br=async(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,parserFailureHandler:s,loggingMiddleware:a}=Fr(e),p=(0,ct.default)().disable("x-powered-by").use(a);if(e.server.compression){let y=await Ce("compression");p.use(y(typeof e.server.compression=="object"?e.server.compression:void 0))}let l={json:[e.server.jsonParser||ct.default.json()],raw:[e.server.rawParser||ct.default.raw(),vr],upload:e.server.upload?await Nr({config:e,getChildLogger:o}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:p,logger:r,getChildLogger:o}),Mt({app:p,routing:t,getChildLogger:o,config:e,parsers:l}),p.use(s,n);let d=(y,u)=>y.listen(u,()=>{r.info("Listening",u)}),m={httpServer:d(Hr.default.createServer(p),e.server.listen),httpsServer:e.https?d(Dr.default.createServer(e.https.options,p),e.https.listen):void 0};return{app:p,...m,logger:r}};var po=O(require("node:assert/strict"),1),co=require("openapi3-ts/oas31"),lo=require("ramda");var Q=O(require("node:assert/strict"),1),q=require("openapi3-ts/oas31"),c=require("ramda"),b=require("zod");var Ie=require("zod");var dt=e=>!isNaN(e.getTime());var qe=Symbol("DateIn"),qr=()=>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(qe);var $r=require("zod");var $e=Symbol("DateOut"),Vr=()=>$r.z.date().refine(dt).transform(e=>e.toISOString()).brand($e);var pe=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let s=r[e._def[h]?.brand]||r[e._def.typeName],p=s?s(e,{...n,next:d=>pe(d,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),l=t&&t(e,{prev:p,...n});return l?{...p,...l}:p};var Gr=50,Yr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",_o={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Qr=/:([A-Za-z0-9_]+)/g,Yo=e=>e.match(Qr)?.map(t=>t.slice(1))||[],Jr=e=>e.replace(Qr,t=>`{${t.slice(1)}}`),Qo=({_def:e},{next:t})=>({...t(e.innerType),default:e[h]?.defaultLabel||e.defaultValue()}),Jo=({_def:{innerType:e}},{next:t})=>t(e),Wo=()=>({format:"any"}),Xo=({},e)=>((0,Q.default)(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),en=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.z.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},tn=({options:e},{next:t})=>({oneOf:e.map(t)}),rn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),on=e=>{let[t,r]=e.filter(q.isSchemaObject).filter(n=>n.type==="object"&&Object.keys(n).every(s=>["type","properties","required","examples"].includes(s)));(0,Q.default)(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,c.mergeDeepWith)((n,s)=>Array.isArray(n)&&Array.isArray(s)?(0,c.concat)(n,s):n===s?s:Q.default.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,c.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=re(t.examples||[],r.examples||[],([n,s])=>(0,c.mergeDeepRight)(n,s))),o},nn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return on(o)}catch{}return{allOf:o}},sn=(e,{next:t})=>t(e.unwrap()),an=(e,{next:t})=>t(e.unwrap()),pn=(e,{next:t})=>{let r=t(e.unwrap());return(0,q.isSchemaObject)(r)&&(r.type=Xr(r)),r},Wr=e=>{let t=(0,c.toLower)((0,c.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},_r=e=>({type:Wr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),cn=({value:e})=>({type:Wr(e),const:e}),dn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Ue(p)?p instanceof b.z.ZodOptional:p.isOptional(),s=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=lt(e,r)),s.length&&(a.required=s),a},ln=()=>({type:"null"}),mn=({},e)=>((0,Q.default)(!e.isResponse,new z({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:Yr}}),un=({},e)=>((0,Q.default)(e.isResponse,new z({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Yr}}),fn=({},e)=>Q.default.fail(new z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),yn=()=>({type:"boolean"}),gn=()=>({type:"integer",format:"bigint"}),hn=e=>e.every(t=>t instanceof b.z.ZodLiteral),xn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.z.ZodEnum||e instanceof b.z.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=lt(b.z.object((0,c.fromPairs)((0,c.xprod)(o,[t]))),r),n.required=o),n}if(e instanceof b.z.ZodLiteral)return{type:"object",properties:lt(b.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.z.ZodUnion&&hn(e.options)){let o=(0,c.map)(s=>`${s.value}`,e.options),n=(0,c.fromPairs)((0,c.xprod)(o,[t]));return{type:"object",properties:lt(b.z.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},bn=({_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},Tn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Sn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:l,isEmoji:d,isDatetime:m,_def:{checks:y}})=>{let u=y.find(C=>C.kind==="regex"),S=y.find(C=>C.kind==="datetime"),L=u?u.regex:S?S.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,T={type:"string"},M={"date-time":m,email:e,url:t,uuid:n,cuid:s,cuid2:a,ulid:p,ip:l,emoji:d};for(let C in M)if(M[C]){T.format=C;break}return r!==null&&(T.minLength=r),o!==null&&(T.maxLength=o),L&&(T.pattern=L.source),T},On=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(y=>y.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(y=>y.kind==="max"),l=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,d=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=s:m.exclusiveMinimum=s,d?m.maximum=l:m.exclusiveMaximum=l,m},lt=({shape:e},t)=>(0,c.map)(t,e),Rn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return _o?.[t]},Xr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},An=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,q.isSchemaObject)(o)){let s=Xe(e,Rn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(b.z.any())}if(!t&&n.type==="preprocess"&&(0,q.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Pn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Cn=(e,{next:t})=>t(e.unwrap()),In=({schema:e},{next:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(e);return o(s)||(n(s,{}),n(s,t(e)))},zn=(e,{next:t})=>t(e.unwrap().shape.raw),eo=e=>e.length?(0,c.fromPairs)((0,c.zip)((0,c.range)(1,e.length+1).map(t=>`example${t}`),(0,c.map)((0,c.objOf)("value"),e))):void 0,to=(e,t,r=[])=>(0,c.pipe)(K,(0,c.map)((0,c.when)(o=>(0,c.type)(o)==="Object",(0,c.omit)(r))),eo)({schema:e,variant:t?"parsed":"original",validate:!0}),wn=(e,t)=>(0,c.pipe)(K,(0,c.filter)((0,c.has)(t)),(0,c.pluck)(t),eo)({schema:e,variant:"original",validate:!0}),ce=e=>e instanceof b.z.ZodObject?e:e instanceof b.z.ZodBranded?ce(e.unwrap()):e instanceof b.z.ZodUnion||e instanceof b.z.ZodDiscriminatedUnion?e.options.map(t=>ce(t)).reduce((t,r)=>t.merge(r.partial()),b.z.object({})):e instanceof b.z.ZodEffects?ce(e._def.schema):e instanceof b.z.ZodPipeline?ce(e._def.in):ce(e._def.left).merge(ce(e._def.right)),ro=({path:e,method:t,schema:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,brandHandling:l,description:d=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:m}=ce(r),y=Yo(e),u=o.includes("query"),S=o.includes("params"),L=o.includes("headers"),T=x=>S&&y.includes(x),M=x=>L&&At(x);return Object.keys(m).map(x=>({name:x,location:T(x)?"path":M(x)?"header":u?"query":void 0})).filter(x=>x.location!==void 0).map(({name:x,location:Ze})=>{let V=pe(m[x],{rules:{...l,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!1,serializer:n,getRef:s,makeRef:a,path:e,method:t}}),X=p==="components"?a(v(d,x),V):V;return{name:x,in:Ze,required:!m[x].isOptional(),description:V.description||d,schema:X,examples:wn(r,x)}})},Ht={ZodString:Sn,ZodNumber:On,ZodBigInt:gn,ZodBoolean:yn,ZodNull:ln,ZodArray:bn,ZodTuple:Tn,ZodRecord:xn,ZodObject:dn,ZodLiteral:cn,ZodIntersection:nn,ZodUnion:tn,ZodAny:Wo,ZodDefault:Qo,ZodEnum:_r,ZodNativeEnum:_r,ZodEffects:An,ZodOptional:sn,ZodNullable:pn,ZodDiscriminatedUnion:rn,ZodBranded:Cn,ZodDate:fn,ZodCatch:Jo,ZodPipeline:Pn,ZodLazy:In,ZodReadonly:an,[Y]:en,[De]:Xo,[$e]:un,[qe]:mn,[ie]:zn},Dt=(e,{isResponse:t,prev:r})=>{if((0,q.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof b.z.ZodLazy,s=r.type!==void 0,a=t&&Ue(e),p=!n&&s&&!a&&e.isNullable(),l=n?[]:K({schema:e,variant:t?"parsed":"original",validate:!0}),d={};return o&&(d.description=o),p&&(d.type=Xr(r)),l.length&&(d.examples=l.slice()),d},Ft=(e,t)=>Q.default.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Ut=(e,t)=>{if((0,q.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,c.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,c.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Ut(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Ut(o,t))),r},oo=e=>(0,q.isReferenceObject)(e)?e:(0,c.omit)(["examples"],e),no=({method:e,path:t,schema:r,mimeTypes:o,variant:n,serializer:s,getRef:a,makeRef:p,composition:l,hasMultipleStatusCodes:d,statusCode:m,brandHandling:y,description:u=`${e.toUpperCase()} ${t} ${It(n)} response ${d?m:""}`.trim()})=>{let S=oo(pe(r,{rules:{...y,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),L={schema:l==="components"?p(v(u),S):S,examples:to(r,!0)};return{description:u,content:(0,c.fromPairs)((0,c.xprod)(o,[L]))}},En=()=>({type:"http",scheme:"basic"}),Zn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},jn=({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},Ln=({name:e})=>({type:"apiKey",in:"header",name:e}),Nn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),vn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),kn=({flows:e={}})=>({type:"oauth2",flows:(0,c.map)(t=>({...t,scopes:t.scopes||{}}),(0,c.reject)(c.isNil,e))}),io=(e,t)=>{let r={basic:En,bearer:Zn,input:jn,header:Ln,cookie:Nn,openid:vn,oauth2:kn};return nt(e,o=>r[o.type](o,t))},mt=e=>"or"in e?e.or.map(t=>"and"in t?(0,c.mergeAll)((0,c.map)(({name:r,scopes:o})=>(0,c.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?mt(Et(e)):mt({or:[e]}),so=({method:e,path:t,schema:r,mimeTypes:o,serializer:n,getRef:s,makeRef:a,composition:p,brandHandling:l,paramNames:d,description:m=`${e.toUpperCase()} ${t} Request body`})=>{let y=oo(Ut(pe(r,{rules:{...l,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!1,serializer:n,getRef:s,makeRef:a,path:t,method:e}}),d)),u={schema:p==="components"?a(v(m),y):y,examples:to(r,!1,d)};return{description:m,content:(0,c.fromPairs)((0,c.xprod)(o,[u]))}},ao=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Kt=e=>e.length<=Gr?e:e.slice(0,Gr-1)+"\u2026";var ut=class extends co.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let n=o||v(r,t),s=this.lastOperationIdSuffixes.get(n);return s===void 0?(this.lastOperationIdSuffixes.set(n,1),n):(o&&po.default.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(n,s),`${n}${s}`)}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:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:l=!0,composition:d="inline",serializer:m=We}){super(),this.addInfo({title:o,version:n});for(let u of typeof s=="string"?[s]:s)this.addServer({url:u});ae({routing:t,onEndpoint:(u,S,L)=>{let T=L,M={path:S,method:T,endpoint:u,composition:d,serializer:m,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[C,x]=["short","long"].map(u.getDescription.bind(u)),Ze=C?Kt(C):l&&x?Kt(x):void 0,V=u.getTags(),X=r.inputSources?.[T]||Ot[T],le=this.ensureUniqOperationId(S,T,u.getOperationId(T)),je=ro({...M,inputSources:X,schema:u.getSchema("input"),description:a?.requestParameter?.call(null,{method:T,path:S,operationId:le})}),Ge={};for(let D of["positive","negative"]){let ee=u.getResponses(D);for(let{mimeTypes:Le,schema:R,statusCodes:A}of ee)for(let I of A)Ge[I]=no({...M,variant:D,schema:R,mimeTypes:Le,statusCode:I,hasMultipleStatusCodes:ee.length>1||A.length>1,description:a?.[`${D}Response`]?.call(null,{method:T,path:S,operationId:le,statusCode:I})})}let St=X.includes("body")?so({...M,paramNames:(0,lo.pluck)("name",je),schema:u.getSchema("input"),mimeTypes:u.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:T,path:S,operationId:le})}):void 0,_e=mt(nt(io(u.getSecurity(),X),D=>{let ee=this.ensureUniqSecuritySchemaName(D),Le=["oauth2","openIdConnect"].includes(D.type)?u.getScopes().slice():[];return this.addSecurityScheme(ee,D),{name:ee,scopes:Le}}));this.addPath(Jr(S),{[T]:{operationId:le,summary:Ze,description:x,tags:V.length>0?V:void 0,parameters:je.length>0?je:void 0,requestBody:St,security:_e.length>0?_e:void 0,responses:Ge}})}}),this.rootDoc.tags=r.tags?ao(r.tags):[]}};var ft=require("node-mocks-http"),Mn=e=>(0,ft.createRequest)({...e,headers:{"content-type":w.json,...e?.headers}}),Un=e=>(0,ft.createResponse)(e),Hn=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:o in Se?(...s)=>t[o].push(s):Reflect.get(r,o,n)}})},Dn=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=Mn(e),s=Un({req:n,...t});s.req=t?.req||n,n.res=s;let a=Hn(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:s,loggerMock:a,configMock:p}},mo=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:s}=Dn(t);return await e.execute({request:r,response:o,config:s,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}};var j=O(require("typescript"),1);var H=O(require("typescript"),1),ze=require("ramda"),i=H.default.factory,J=[i.createModifier(H.default.SyntaxKind.ExportKeyword)],Fn=[i.createModifier(H.default.SyntaxKind.AsyncKeyword)],Kn=[i.createModifier(H.default.SyntaxKind.PublicKeyword),i.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],uo=[i.createModifier(H.default.SyntaxKind.ProtectedKeyword),i.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],Bt=i.createTemplateHead(""),we=i.createTemplateTail(""),qt=i.createTemplateMiddle(" "),$t=e=>i.createTemplateLiteralType(Bt,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?we:qt))),Vt=$t(["M","P"]),yt=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),gt=(e,t)=>(0,ze.chain)(([r,o])=>[yt(i.createIdentifier(r),o,t)],(0,ze.toPairs)(e)),Gt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),fo=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),yo=(e,t)=>i.createPropertySignature(void 0,e,void 0,i.createTypeReferenceNode(t)),W=(e,t,r)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,r,t)],H.default.NodeFlags.Const),_t=(e,t)=>i.createTypeAliasDeclaration(J,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),ht=(e,t)=>i.createTypeAliasDeclaration(J,e,void 0,t),go=(e,t,r)=>i.createPropertyDeclaration(Kn,e,void 0,t,r),ho=(e,t,r)=>i.createClassDeclaration(J,e,void 0,void 0,[t,...r]),xo=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),bo=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(H.default.SyntaxKind.AnyKeyword)]),To=(e,t,r)=>i.createInterfaceDeclaration(J,e,void 0,t,r),Bn=(0,ze.chain)(([e,t])=>[i.createTypeParameterDeclaration([],e,i.createTypeReferenceNode(t))]),So=e=>Bn((0,ze.toPairs)(e)),Yt=(e,t,r)=>i.createArrowFunction(r?Fn:void 0,void 0,e.map(o=>yt(o)),void 0,void 0,t),Qt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,gt({acc:void 0,key:void 0}),void 0,void 0,t),r]),Oo=(...e)=>`"${e.join(" ")}"`;var Ro=["get","post","put","delete","patch"];var g=O(require("typescript"),1),bt=require("zod");var $=O(require("typescript"),1),{factory:xt}=$.default,Jt=(e,t)=>{$.default.addSyntheticLeadingComment(e,$.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ee=(e,t,r)=>{let o=xt.createTypeAliasDeclaration(void 0,xt.createIdentifier(t),void 0,e);return r&&Jt(o,r),o},Wt=(e,t)=>{let r=$.default.createSourceFile("print.ts","",$.default.ScriptTarget.Latest,!1,$.default.ScriptKind.TS);return $.default.createPrinter(t).printNode($.default.EmitHint.Unspecified,e,r)},qn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Ao=e=>qn.test(e)?xt.createIdentifier(e):xt.createStringLiteral(e);var{factory:f}=g.default,$n={[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},Vn=({value:e})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Gn=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Ue(a)?a instanceof bt.z.ZodOptional:a.isOptional(),l=f.createPropertySignature(void 0,Ao(s),p&&o?f.createToken(g.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Jt(l,a.description),l});return f.createTypeLiteralNode(n)},_n=({element:e},{next:t})=>f.createArrayTypeNode(t(e)),Yn=({options:e})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Po=({options:e},{next:t})=>f.createUnionTypeNode(e.map(t)),Qn=e=>$n?.[e.kind],Jn=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Xe(e,Qn(o)),s={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&&s[n]||g.default.SyntaxKind.AnyKeyword)}return o},Wn=e=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),Xn=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(g.default.SyntaxKind.UndefinedKeyword)]):o},ei=(e,{next:t})=>f.createUnionTypeNode([t(e.unwrap()),f.createLiteralTypeNode(f.createNull())]),ti=({items:e,_def:{rest:t}},{next:r})=>f.createTupleTypeNode(e.map(r).concat(t===null?[]:f.createRestTypeNode(r(t)))),ri=({keySchema:e,valueSchema:t},{next:r})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e,t].map(r)),oi=({_def:e},{next:t})=>f.createIntersectionTypeNode([e.left,e.right].map(t)),ni=({_def:e},{next:t})=>t(e.innerType),de=e=>()=>f.createKeywordTypeNode(e),ii=(e,{next:t})=>t(e.unwrap()),si=(e,{next:t})=>t(e.unwrap()),ai=({_def:e},{next:t})=>t(e.innerType),pi=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ci=()=>f.createLiteralTypeNode(f.createNull()),di=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:n})=>{let s=`Type${n(e)}`;return t(s)||(r(s,f.createLiteralTypeNode(f.createNull())),r(s,o(e)))},li=e=>{let t=e.unwrap(),r=f.createKeywordTypeNode(g.default.SyntaxKind.StringKeyword),o=f.createTypeReferenceNode("Buffer"),n=f.createUnionTypeNode([r,o]);return t instanceof bt.z.ZodString?r:t instanceof bt.z.ZodUnion?n:o},mi=(e,{next:t})=>t(e.unwrap().shape.raw),ui={ZodString:de(g.default.SyntaxKind.StringKeyword),ZodNumber:de(g.default.SyntaxKind.NumberKeyword),ZodBigInt:de(g.default.SyntaxKind.BigIntKeyword),ZodBoolean:de(g.default.SyntaxKind.BooleanKeyword),ZodAny:de(g.default.SyntaxKind.AnyKeyword),[qe]:de(g.default.SyntaxKind.StringKeyword),[$e]:de(g.default.SyntaxKind.StringKeyword),ZodNull:ci,ZodArray:_n,ZodTuple:ti,ZodRecord:ri,ZodObject:Gn,ZodLiteral:Vn,ZodIntersection:oi,ZodUnion:Po,ZodDefault:ni,ZodEnum:Yn,ZodNativeEnum:Wn,ZodEffects:Jn,ZodOptional:Xn,ZodNullable:ei,ZodDiscriminatedUnion:Po,ZodBranded:ii,ZodCatch:ai,ZodPipeline:pi,ZodLazy:di,ZodReadonly:si,[Y]:li,[ie]:mi},Ve=(e,{brandHandling:t,ctx:r})=>pe(e,{rules:{...t,...ui},onMissing:()=>f.createKeywordTypeNode(g.default.SyntaxKind.AnyKeyword),ctx:r});var Tt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:i.createIdentifier("Path"),methodType:i.createIdentifier("Method"),methodPathType:i.createIdentifier("MethodPath"),inputInterface:i.createIdentifier("Input"),posResponseInterface:i.createIdentifier("PositiveResponse"),negResponseInterface:i.createIdentifier("NegativeResponse"),responseInterface:i.createIdentifier("Response"),jsonEndpointsConst:i.createIdentifier("jsonEndpoints"),endpointTagsConst:i.createIdentifier("endpointTags"),providerType:i.createIdentifier("Provider"),implementationType:i.createIdentifier("Implementation"),clientClass:i.createIdentifier("ExpressZodAPIClient"),keyParameter:i.createIdentifier("key"),pathParameter:i.createIdentifier("path"),paramsArgument:i.createIdentifier("params"),methodParameter:i.createIdentifier("method"),accumulator:i.createIdentifier("acc"),provideMethod:i.createIdentifier("provide"),implementationArgument:i.createIdentifier("implementation"),headersProperty:i.createIdentifier("headers"),hasBodyConst:i.createIdentifier("hasBody"),undefinedValue:i.createIdentifier("undefined"),bodyProperty:i.createIdentifier("body"),responseConst:i.createIdentifier("response"),searchParamsConst:i.createIdentifier("searchParams"),exampleImplementationConst:i.createIdentifier("exampleImplementation"),clientConst:i.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,Ee(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:n=We,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){ae({routing:t,onEndpoint:(R,A,I)=>{let me={serializer:n,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},Ne=v(I,A,"input"),ve=Ve(R.getSchema("input"),{brandHandling:r,ctx:{...me,isResponse:!1}}),N=s?v(I,A,"positive.response"):void 0,Xt=R.getSchema("positive"),er=s?Ve(Xt,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,ke=s?v(I,A,"negative.response"):void 0,tr=R.getSchema("negative"),rr=s?Ve(tr,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,or=v(I,A,"response"),Io=N&&ke?i.createUnionTypeNode([i.createTypeReferenceNode(N),i.createTypeReferenceNode(ke)]):Ve(Xt.or(tr),{brandHandling:r,ctx:{...me,isResponse:!0}});this.program.push(Ee(ve,Ne)),er&&N&&this.program.push(Ee(er,N)),rr&&ke&&this.program.push(Ee(rr,ke)),this.program.push(Ee(Io,or)),I!=="options"&&(this.paths.push(A),this.registry.set({method:I,path:A},{input:Ne,positive:N,negative:ke,response:or,isJson:R.getMimeTypes("positive").includes(w.json),tags:R.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(_t(this.ids.pathType,this.paths)),this.program.push(_t(this.ids.methodType,Ro)),this.program.push(ht(this.ids.methodPathType,$t([this.ids.methodType,this.ids.pathType])));let p=[i.createHeritageClause(j.default.SyntaxKind.ExtendsKeyword,[Gt(this.ids.methodPathType,j.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let l=[],d=[];for(let[{method:R,path:A},{isJson:I,tags:me,...Ne}]of this.registry){let ve=Oo(R,A);for(let N of this.interfaces)N.kind in Ne&&N.props.push(yo(ve,Ne[N.kind]));o!=="types"&&(I&&l.push(i.createPropertyAssignment(ve,i.createTrue())),d.push(i.createPropertyAssignment(ve,i.createArrayLiteralExpression(me.map(N=>i.createStringLiteral(N))))))}for(let{id:R,props:A}of this.interfaces)this.program.push(To(R,p,A));if(o==="types")return;let m=i.createVariableStatement(J,W(this.ids.jsonEndpointsConst,i.createObjectLiteralExpression(l))),y=i.createVariableStatement(J,W(this.ids.endpointTagsConst,i.createObjectLiteralExpression(d))),u=ht(this.ids.providerType,i.createFunctionTypeNode(So({M:this.ids.methodType,P:this.ids.pathType}),gt({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(this.ids.inputInterface),Vt)}),xo(this.ids.responseInterface,Vt))),S=ht(this.ids.implementationType,i.createFunctionTypeNode(void 0,gt({method:i.createTypeReferenceNode(this.ids.methodType),path:i.createKeywordTypeNode(j.default.SyntaxKind.StringKeyword),params:Gt(j.default.SyntaxKind.StringKeyword,j.default.SyntaxKind.AnyKeyword)}),bo())),L=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(this.ids.keyParameter,we)]),T=Qt(this.ids.paramsArgument,i.createCallExpression(i.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[L,i.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),M=Qt(this.ids.paramsArgument,i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[L]),j.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(this.ids.accumulator),i.createPropertyAssignment(i.createComputedPropertyName(this.ids.keyParameter),i.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),i.createObjectLiteralExpression()),C=ho(this.ids.clientClass,fo([yt(this.ids.implementationArgument,i.createTypeReferenceNode(this.ids.implementationType),uo)]),[go(this.ids.provideMethod,i.createTypeReferenceNode(this.ids.providerType),Yt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,T,M]),!0))]);this.program.push(m,y,u,S,C);let x=i.createPropertyAssignment(this.ids.methodParameter,i.createCallExpression(i.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),Ze=i.createPropertyAssignment(this.ids.headersProperty,i.createConditionalExpression(this.ids.hasBodyConst,void 0,i.createObjectLiteralExpression([i.createPropertyAssignment(i.createStringLiteral("Content-Type"),i.createStringLiteral(w.json))]),void 0,this.ids.undefinedValue)),V=i.createPropertyAssignment(this.ids.bodyProperty,i.createConditionalExpression(this.ids.hasBodyConst,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),X=i.createVariableStatement(void 0,W(this.ids.responseConst,i.createAwaitExpression(i.createCallExpression(i.createIdentifier("fetch"),void 0,[i.createTemplateExpression(i.createTemplateHead("https://example.com"),[i.createTemplateSpan(this.ids.pathParameter,i.createTemplateMiddle("")),i.createTemplateSpan(this.ids.searchParamsConst,we)]),i.createObjectLiteralExpression([x,Ze,V])])))),le=i.createVariableStatement(void 0,W(this.ids.hasBodyConst,i.createLogicalNot(i.createCallExpression(i.createPropertyAccessExpression(i.createArrayLiteralExpression([i.createStringLiteral("get"),i.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),je=i.createVariableStatement(void 0,W(this.ids.searchParamsConst,i.createConditionalExpression(this.ids.hasBodyConst,void 0,i.createStringLiteral(""),void 0,i.createTemplateExpression(i.createTemplateHead("?"),[i.createTemplateSpan(i.createNewExpression(i.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),we)])))),[Ge,St]=["json","text"].map(R=>i.createReturnStatement(i.createCallExpression(i.createPropertyAccessExpression(this.ids.responseConst,R),void 0,void 0))),_e=i.createIfStatement(i.createBinaryExpression(i.createTemplateExpression(Bt,[i.createTemplateSpan(this.ids.methodParameter,qt),i.createTemplateSpan(this.ids.pathParameter,we)]),j.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),i.createBlock([Ge])),D=i.createVariableStatement(J,W(this.ids.exampleImplementationConst,Yt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],i.createBlock([le,je,X,_e,St]),!0),i.createTypeReferenceNode(this.ids.implementationType))),ee=i.createExpressionStatement(i.createCallExpression(i.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[i.createStringLiteral("get"),i.createStringLiteral("/v1/user/retrieve"),i.createObjectLiteralExpression([i.createPropertyAssignment("id",i.createStringLiteral("10"))])])),Le=i.createVariableStatement(void 0,W(this.ids.clientConst,i.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(D,Le,ee)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Wt(r,t)).join(`
21
21
  `):void 0}print(t){let r=this.printUsage(t),o=r&&j.default.addSyntheticLeadingComment(j.default.addSyntheticLeadingComment(i.createEmptyStatement(),j.default.SyntaxKind.SingleLineCommentTrivia," Usage example:"),j.default.SyntaxKind.MultiLineCommentTrivia,`
22
22
  ${r}`);return this.program.concat(o||[]).map((n,s)=>Wt(n,s<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
23
23
 
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import{clone as Yt,fromPairs as yo,map as go,pipe as ho,toPairs as xo,pair as bo
2
2
  Caused by ${i?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},De=class extends Error{name="IOSchemaError"},G=class extends De{constructor(r){super(U(r));this.originalError=r}name="OutputValidationError"},N=class extends De{constructor(r){super(U(r));this.originalError=r}name="InputValidationError"},M=class extends Error{constructor(r,o){super(r);this.originalError=o}name="ResultHandlerError"},Oe=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var P={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var co=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(P.upload);return"files"in e&&r},dt={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},lo=["body","query","params"],lt=e=>e.method.toLowerCase(),mt=e=>e.startsWith("x-"),mo=e=>so((t,r)=>mt(r),e),ut=(e,t={})=>{let r=lt(e);return r==="options"?{}:(t[r]||dt[r]||lo).filter(o=>o==="files"?co(e):!0).map(o=>o==="headers"?mo(e[o]):e[o]).reduce((o,i)=>({...o,...i}),{})},se=e=>e instanceof Error?e:new Error(String(e)),U=e=>e instanceof po.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof G?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Fe=e=>no(e)?e.statusCode:e instanceof N?400:500,ft=({logger:e,request:t,input:r,error:o,statusCode:i})=>{i===500&&e.error(`Internal server error
3
3
  ${o.stack}
4
4
  `,{url:t.url,payload:r})},H=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[g]?.examples||[];if(!r&&t==="original")return o;let i=[];for(let s of o){let a=e.safeParse(s);a.success&&i.push(t==="parsed"?a.data:s)}return i},_=(e,t,r)=>e.length&&t.length?ao(e,t).map(r):e.concat(t),Re=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,yt=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),w=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(yt).join(""),Ke=e=>io("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Be=(e,t)=>{try{return typeof e.parse(t)}catch{return}},Y=e=>typeof e=="object"&&e!==null;import{clone as uo,mergeDeepRight as fo}from"ramda";var g=Symbol.for("express-zod-api"),qe=e=>{let t=e.describe(e.description);return t._def[g]=uo(t._def[g])||{examples:[]},t},_t=(e,t)=>{if(!(g in e._def))return t;let r=qe(t);return r._def[g].examples=_(r._def[g].examples,e._def[g].examples,([o,i])=>typeof o=="object"&&typeof i=="object"?fo({...o},{...i}):i),r};var To=function(e){let t=qe(this);return t._def[g].examples.push(e),t},So=function(e){let t=qe(this);return t._def[g].defaultLabel=e,t},Oo=function(e){return new ae.ZodBranded({typeName:ae.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[g]:{examples:[],...Yt(this._def[g]),brand:e}})},Ro=function(e){let t=typeof e=="function"?e:ho(xo,go(([i,s])=>bo(e[String(i)]||i,s)),yo),r=t(Yt(this.shape)),o=ae.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};g in globalThis||(globalThis[g]=!0,Object.defineProperties(ae.ZodType.prototype,{example:{get(){return To.bind(this)}},brand:{set(){},get(){return Oo.bind(this)}}}),Object.defineProperty(ae.ZodDefault.prototype,"label",{get(){return So.bind(this)}}),Object.defineProperty(ae.ZodObject.prototype,"remap",{get(){return Ro.bind(this)}}));function Ao(e){return e}import{z as Lo}from"zod";import{z as nr}from"zod";import{z as Co}from"zod";import{z as $e}from"zod";var D=Symbol("File"),Qt=$e.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),Po={buffer:()=>Qt.brand(D),string:()=>$e.string().brand(D),binary:()=>Qt.or($e.string()).brand(D),base64:()=>$e.string().base64().brand(D)};function Ve(e){return Po[e||"string"]()}var Q=Symbol("Raw"),Jt=(e={})=>Co.object({raw:Ve("buffer")}).extend(e).brand(Q);import{z as Io}from"zod";var Ae=Symbol("Upload"),Wt=()=>Io.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 Xt=(e,{next:t})=>e.options.some(t),zo=({_def:e},{next:t})=>[e.left,e.right].some(t),er=(e,{next:t})=>t(e.unwrap()),wo={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:Xt,ZodDiscriminatedUnion:Xt,ZodIntersection:zo,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:er,ZodNullable:er,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},gt=(e,{condition:t,rules:r=wo,depth:o=1,maxDepth:i=Number.POSITIVE_INFINITY})=>{if(t(e))return!0;let s=o<i?r[e._def.typeName]:void 0;return s?s(e,{next:a=>gt(a,{condition:t,rules:r,maxDepth:i,depth:o+1})}):!1},tr=e=>gt(e,{condition:t=>t._def[g]?.brand===Ae}),rr=e=>gt(e,{condition:t=>t._def[g]?.brand===Q,maxDepth:3});var Ge=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).type("text/plain").end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
- Original error: ${e.originalError.message}.`:""))};import{chain as Eo}from"ramda";var J=e=>Y(e)&&"or"in e,ce=e=>Y(e)&&"and"in e,ht=e=>({and:Eo(t=>ce(t)?t.and:[t],e)}),_e=(e,t)=>ce(e)?{and:e.and.map(r=>J(r)?{or:r.or.map(t)}:t(r))}:J(e)?{or:e.or.map(r=>ce(r)?{and:r.and.map(t)}:t(r))}:t(e),xt=e=>e.and.reduce((t,r)=>({or:_(t.or,J(r)?r.or:[r],ht)}),{or:[]}),pe=(e,t)=>ce(e)?J(t)?pe(xt(e),t):ht([e,t]):J(e)?ce(t)?pe(t,e):J(t)?{or:_(e.or,t.or,ht)}:pe(e,{and:[t]}):ce(t)||J(t)?pe(t,e):{and:[e,t]};import{z as or}from"zod";var bt=class{},F=class extends bt{#e;#t;#r;constructor({input:t,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 or.ZodError?new N(o):o}}},de=class extends F{constructor(t,{provider:r=()=>({}),transformer:o=i=>i}={}){super({input:or.object({}),handler:async({request:i,response:s})=>new Promise((a,p)=>{t(i,s,c=>{if(c&&c instanceof Error)return p(o(c));a(r(i,s))})})})}};var Pe=class{},Ye=class extends Pe{#e;#t;#r;#s;#o;#a;#p;#n;#c;#d;#l;#i;constructor({methods:t,inputSchema:r,outputSchema:o,handler:i,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:l,shortDescription:f}){super(),this.#a=i,this.#p=s,this.#r=d,this.#l=a,this.#t=Object.freeze(t),this.#c=Object.freeze(p),this.#d=Object.freeze(c),this.#e={long:l,short:f},this.#n={input:r,output:o},this.#o={positive:Object.freeze(s.getPositiveResponse(o)),negative:Object.freeze(s.getNegativeResponse())},this.#i=tr(r)?"upload":rr(r)?"raw":"json",this.#s={input:Object.freeze([P[this.#i]]),positive:Object.freeze(this.#o.positive.flatMap(({mimeTypes:m})=>m)),negative:Object.freeze(this.#o.negative.flatMap(({mimeTypes:m})=>m))}}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return t==="input"||t==="output"?this.#n[t]:this.getResponses(t).map(({schema:r})=>r).reduce((r,o)=>r.or(o))}getMimeTypes(t){return this.#s[t]}getRequestType(){return this.#i}getResponses(t){return this.#o[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?pe(t,o):t},{and:[]})}getScopes(){return this.#c}getTags(){return this.#d}getOperationId(t){return this.#l(t)}#m(t){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#t.concat(t).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#n.output.parseAsync(t)}catch(r){throw r instanceof nr.ZodError?new G(r):r}}async#f({method:t,input:r,request:o,response:i,logger:s,options:a}){for(let p of this.#r)if(!(t==="options"&&!(p instanceof de))&&(Object.assign(a,await p.execute({input:r,options:a,request:o,response:i,logger:s})),i.writableEnded)){s.warn("A middleware has closed the stream. Accumulated options:",a);break}}async#y({input:t,options:r,logger:o}){let i;try{i=await this.#n.input.parseAsync(t)}catch(s){throw s instanceof nr.ZodError?new N(s):s}return this.#a({input:i,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:i,input:s,output:a,options:p}){try{await this.#p.execute({error:t,output:a,request:r,response:o,logger:i,input:s,options:p})}catch(d){Ge({logger:i,response:o,error:new M(se(d).message,t||void 0)})}}async execute({request:t,response:r,logger:o,config:i,siblingMethods:s=[]}){let a=lt(t),p={},d=null,c=null;if(i.cors){let f=this.#m(s);typeof i.cors=="function"&&(f=await i.cors({request:t,logger:o,endpoint:this,defaultHeaders:f}));for(let m in f)r.set(m,f[m])}let l=ut(t,i.inputSources);try{if(await this.#f({method:a,input:l,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}d=await this.#u(await this.#y({input:l,logger:o,options:p}))}catch(f){c=se(f)}await this.#g({input:l,output:d,request:t,response:r,error:c,logger:o,options:p})}};var ir=(e,t)=>{let r=e.map(i=>i.getSchema()).concat(t),o=r.reduce((i,s)=>i.and(s));return r.reduce((i,s)=>_t(s,i),o)};import{z as j}from"zod";var Ce={positive:200,negative:400};import Zo from"node:assert/strict";import{z as jo}from"zod";var Qe=(e,t)=>typeof e=="function"?Qe(e(...t.arguments),t):e instanceof jo.ZodType?[{...t,schema:e}]:(Array.isArray(e)&&Zo(e.length,new M(`At least one ${t.variant} response schema required.`)),(Array.isArray(e)?e:[e]).map(({schema:r,statusCodes:o,statusCode:i,mimeTypes:s,mimeType:a})=>({schema:r,statusCodes:i?[i]:o||t.statusCodes,mimeTypes:a?[a]:s||t.mimeTypes})));var Tt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},Ie=class extends Tt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return Qe(this.#e,{variant:"positive",arguments:[t],statusCodes:[Ce.positive],mimeTypes:[P.json]})}getNegativeResponse(){return Qe(this.#t,{variant:"negative",arguments:[],statusCodes:[Ce.negative],mimeTypes:[P.json]})}},ze=new Ie({positive:e=>{let t=H({schema:e}),r=j.object({status:j.literal("success"),data:e});return t.reduce((o,i)=>o.example({status:"success",data:i}),r)},negative:j.object({status:j.literal("error"),error:j.object({message:j.string()})}).example({status:"error",error:{message:U(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:i,logger:s})=>{if(!e){i.status(Ce.positive).json({status:"success",data:r});return}let a=Fe(e);ft({logger:s,statusCode:a,request:o,error:e,input:t}),i.status(a).json({status:"error",error:{message:U(e)}})}}),St=new Ie({positive:e=>{let t=H({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof j.ZodArray?e.shape.items:j.array(j.any());return t.reduce((o,i)=>Y(i)&&"items"in i&&Array.isArray(i.items)?o.example(i.items):o,r)},negative:j.string().example(U(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:i,input:s})=>{if(r){let a=Fe(r);ft({logger:o,statusCode:a,request:i,error:r,input:s}),e.status(a).type("text/plain").send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(Ce.positive).json(t.items):e.status(500).type("text/plain").send("Property 'items' is missing in the endpoint output")}});var we=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 F?t:new F(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new de(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new F({input:Lo.object({}),handler:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:i,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,l="methods"in p?p.methods:[p.method],f=typeof a=="function"?a:()=>a,m="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],T="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Ye({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:m,tags:T,methods:l,getOperationId:f,description:i,shortDescription:s,inputSchema:ir(d,t)})}},No=new we(ze),vo=new we(St);import{Ansis as Mo,blue as Uo,cyanBright as Ho,green as Do,hex as Fo,red as Ko}from"ansis";import{inspect as Bo}from"node:util";import{performance as dr}from"node:perf_hooks";var le={debug:10,info:20,warn:30,error:40},ar=e=>Y(e)&&Object.keys(le).some(t=>t in e),pr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),Je=pr(),sr=pr(2),ko=e=>e<1e-6?["picosecond",e/1e-9,Je]:e<.001?["nanosecond",e/1e-6,Je]:e<1?["microsecond",e/.001,Je]:e<1e3?["millisecond",e,Je]:e<6e4?["second",e/1e3,sr]:["minute",e/6e4,sr],cr=e=>{let[t,r,o]=ko(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var Ee=class e{constructor(t){this.config=t;let{color:r=new Mo().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:Uo,info:Do,warn:Fo("#FFA500"),error:Ko};prettyPrint(t){let{depth:r=2}=this.config;return Bo(t,{depth:r,colors:this.hasColor,breakLength:this.config.level==="debug"?80:1/0,compact:this.config.level==="debug"?3:!0})}print(t,r,o){if(this.config.level==="silent"||le[t]<le[this.config.level])return;let{requestId:i,...s}=this.config.ctx||{},a=[new Date().toISOString()];i&&a.push(this.hasColor?Ho(i):i),a.push(this.hasColor?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&a.push(this.prettyPrint(o)),Object.keys(s).length>0&&a.push(this.prettyPrint(s)),console.log(a.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}profile(t){let r=dr.now();return()=>{let o=dr.now()-r,{message:i,severity:s="debug",formatter:a=cr}=typeof t=="object"?t:{message:t};this.print(typeof s=="function"?s(o):s,i,a(o))}}};import{head as qo,tail as $o,toPairs as Vo}from"ramda";var Ze=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze(Vo(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=qo(this.pairs)?.[1],this.siblingMethods=Object.freeze($o(this.pairs).map(([r])=>r))}};import Go from"express";var je=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Go.static(...this.params))}};import Rt from"express";import Xo from"node:http";import en from"node:https";var me=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new Oe(e)};import lr from"node:assert/strict";var W=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:i})=>{let s=Object.entries(e).map(([a,p])=>[a.trim(),p]);for(let[a,p]of s){lr.doesNotMatch(a,/\//,new ie(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let d=`${o||""}${a?`/${a}`:""}`;if(p instanceof Pe){let c=p.getMethods().slice();i&&c.push("options");for(let l of c)t(p,d,l)}else if(p instanceof je)r&&p.apply(d,r);else if(p instanceof Ze){for(let[c,l]of p.pairs)lr(l.getMethods().includes(c),new ie(`Endpoint assigned to ${c} method of ${d} must support ${c} method.`)),t(l,d,c);i&&p.firstEndpoint&&t(p.firstEndpoint,d,"options",p.siblingMethods)}else W({onEndpoint:t,onStatic:r,hasCors:i,routing:p,parentPath:d})}};var Ot=({app:e,getChildLogger:t,config:r,routing:o,parsers:i})=>W({routing:o,hasCors:!!r.cors,onEndpoint:(s,a,p,d)=>{e[p](a,...i?.[s.getRequestType()]||[],async(c,l)=>s.execute({request:c,response:l,logger:t(c),config:r,siblingMethods:d}))},onStatic:(s,a)=>{e.use(s,a)}});import mr,{isHttpError as _o}from"http-errors";var ur=({errorHandler:e,getChildLogger:t})=>async(r,o,i,s)=>{if(!r)return s();e.execute({error:_o(r)?r:mr(400,se(r).message),request:o,response:i,input:null,output:null,options:{},logger:t(o)})},fr=({errorHandler:e,getChildLogger:t})=>async(r,o)=>{let i=mr(404,`Can not ${r.method} ${r.path}`),s=t(r);try{e.execute({request:r,response:o,logger:s,error:i,input:null,output:null,options:{}})}catch(a){Ge({response:o,logger:s,error:new M(se(a).message,i)})}},Yo=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:i})=>i))return r(e);r()},Qo=e=>({log:e.debug.bind(e)}),yr=async({getChildLogger:e,config:t})=>{let r=await me("express-fileupload"),{limitError:o,beforeUpload:i,...s}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,d,c)=>{let l=e(p);try{await i?.({request:p,logger:l})}catch(f){return c(f)}r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Qo(l)})(p,d,c)}),o&&a.push(Yo(o)),a},gr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},hr=({rootLogger:e,config:t})=>async(r,o,i)=>{let s=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;s.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[g]={logger:s}),i()},xr=e=>t=>t.res?.locals[g]?.logger||e;import{gray as Jo,hex as br,italic as We,whiteBright as Wo}from"ansis";var Tr=()=>{let e=We("Proudly supports transgender community.".padStart(109)),t=We("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=We("Thank you for choosing Express Zod API for your project.".padStart(132)),o=We("for Zoey".padEnd(20)),i=br("#F5A9B8"),s=br("#5BCEFA"),a=new Array(14).fill(s,1,3).fill(i,3,5).fill(Wo,5,7).fill(i,7,9).fill(s,9,12).fill(Jo,12,13);return`
5
+ Original error: ${e.originalError.message}.`:""))};import{chain as Eo}from"ramda";var J=e=>Y(e)&&"or"in e,ce=e=>Y(e)&&"and"in e,ht=e=>({and:Eo(t=>ce(t)?t.and:[t],e)}),_e=(e,t)=>ce(e)?{and:e.and.map(r=>J(r)?{or:r.or.map(t)}:t(r))}:J(e)?{or:e.or.map(r=>ce(r)?{and:r.and.map(t)}:t(r))}:t(e),xt=e=>e.and.reduce((t,r)=>({or:_(t.or,J(r)?r.or:[r],ht)}),{or:[]}),pe=(e,t)=>ce(e)?J(t)?pe(xt(e),t):ht([e,t]):J(e)?ce(t)?pe(t,e):J(t)?{or:_(e.or,t.or,ht)}:pe(e,{and:[t]}):ce(t)||J(t)?pe(t,e):{and:[e,t]};import{z as or}from"zod";var bt=class{},F=class extends bt{#e;#t;#r;constructor({input:t,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 or.ZodError?new N(o):o}}},de=class extends F{constructor(t,{provider:r=()=>({}),transformer:o=i=>i}={}){super({input:or.object({}),handler:async({request:i,response:s})=>new Promise((a,p)=>{let d=c=>{if(c&&c instanceof Error)return p(o(c));a(r(i,s))};t(i,s,d)?.catch(d)})})}};var Pe=class{},Ye=class extends Pe{#e;#t;#r;#s;#o;#a;#p;#n;#c;#d;#l;#i;constructor({methods:t,inputSchema:r,outputSchema:o,handler:i,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:l,shortDescription:f}){super(),this.#a=i,this.#p=s,this.#r=d,this.#l=a,this.#t=Object.freeze(t),this.#c=Object.freeze(p),this.#d=Object.freeze(c),this.#e={long:l,short:f},this.#n={input:r,output:o},this.#o={positive:Object.freeze(s.getPositiveResponse(o)),negative:Object.freeze(s.getNegativeResponse())},this.#i=tr(r)?"upload":rr(r)?"raw":"json",this.#s={input:Object.freeze([P[this.#i]]),positive:Object.freeze(this.#o.positive.flatMap(({mimeTypes:m})=>m)),negative:Object.freeze(this.#o.negative.flatMap(({mimeTypes:m})=>m))}}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return t==="input"||t==="output"?this.#n[t]:this.getResponses(t).map(({schema:r})=>r).reduce((r,o)=>r.or(o))}getMimeTypes(t){return this.#s[t]}getRequestType(){return this.#i}getResponses(t){return this.#o[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?pe(t,o):t},{and:[]})}getScopes(){return this.#c}getTags(){return this.#d}getOperationId(t){return this.#l(t)}#m(t){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#t.concat(t).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#n.output.parseAsync(t)}catch(r){throw r instanceof nr.ZodError?new G(r):r}}async#f({method:t,input:r,request:o,response:i,logger:s,options:a}){for(let p of this.#r)if(!(t==="options"&&!(p instanceof de))&&(Object.assign(a,await p.execute({input:r,options:a,request:o,response:i,logger:s})),i.writableEnded)){s.warn("A middleware has closed the stream. Accumulated options:",a);break}}async#y({input:t,options:r,logger:o}){let i;try{i=await this.#n.input.parseAsync(t)}catch(s){throw s instanceof nr.ZodError?new N(s):s}return this.#a({input:i,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:i,input:s,output:a,options:p}){try{await this.#p.execute({error:t,output:a,request:r,response:o,logger:i,input:s,options:p})}catch(d){Ge({logger:i,response:o,error:new M(se(d).message,t||void 0)})}}async execute({request:t,response:r,logger:o,config:i,siblingMethods:s=[]}){let a=lt(t),p={},d=null,c=null;if(i.cors){let f=this.#m(s);typeof i.cors=="function"&&(f=await i.cors({request:t,logger:o,endpoint:this,defaultHeaders:f}));for(let m in f)r.set(m,f[m])}let l=ut(t,i.inputSources);try{if(await this.#f({method:a,input:l,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}d=await this.#u(await this.#y({input:l,logger:o,options:p}))}catch(f){c=se(f)}await this.#g({input:l,output:d,request:t,response:r,error:c,logger:o,options:p})}};var ir=(e,t)=>{let r=e.map(i=>i.getSchema()).concat(t),o=r.reduce((i,s)=>i.and(s));return r.reduce((i,s)=>_t(s,i),o)};import{z as j}from"zod";var Ce={positive:200,negative:400};import Zo from"node:assert/strict";import{z as jo}from"zod";var Qe=(e,t)=>typeof e=="function"?Qe(e(...t.arguments),t):e instanceof jo.ZodType?[{...t,schema:e}]:(Array.isArray(e)&&Zo(e.length,new M(`At least one ${t.variant} response schema required.`)),(Array.isArray(e)?e:[e]).map(({schema:r,statusCodes:o,statusCode:i,mimeTypes:s,mimeType:a})=>({schema:r,statusCodes:i?[i]:o||t.statusCodes,mimeTypes:a?[a]:s||t.mimeTypes})));var Tt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},Ie=class extends Tt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return Qe(this.#e,{variant:"positive",arguments:[t],statusCodes:[Ce.positive],mimeTypes:[P.json]})}getNegativeResponse(){return Qe(this.#t,{variant:"negative",arguments:[],statusCodes:[Ce.negative],mimeTypes:[P.json]})}},ze=new Ie({positive:e=>{let t=H({schema:e}),r=j.object({status:j.literal("success"),data:e});return t.reduce((o,i)=>o.example({status:"success",data:i}),r)},negative:j.object({status:j.literal("error"),error:j.object({message:j.string()})}).example({status:"error",error:{message:U(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:i,logger:s})=>{if(!e){i.status(Ce.positive).json({status:"success",data:r});return}let a=Fe(e);ft({logger:s,statusCode:a,request:o,error:e,input:t}),i.status(a).json({status:"error",error:{message:U(e)}})}}),St=new Ie({positive:e=>{let t=H({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof j.ZodArray?e.shape.items:j.array(j.any());return t.reduce((o,i)=>Y(i)&&"items"in i&&Array.isArray(i.items)?o.example(i.items):o,r)},negative:j.string().example(U(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:i,input:s})=>{if(r){let a=Fe(r);ft({logger:o,statusCode:a,request:i,error:r,input:s}),e.status(a).type("text/plain").send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(Ce.positive).json(t.items):e.status(500).type("text/plain").send("Property 'items' is missing in the endpoint output")}});var we=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 F?t:new F(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new de(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new F({input:Lo.object({}),handler:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:i,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,l="methods"in p?p.methods:[p.method],f=typeof a=="function"?a:()=>a,m="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],T="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Ye({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:m,tags:T,methods:l,getOperationId:f,description:i,shortDescription:s,inputSchema:ir(d,t)})}},No=new we(ze),vo=new we(St);import{Ansis as Mo,blue as Uo,cyanBright as Ho,green as Do,hex as Fo,red as Ko}from"ansis";import{inspect as Bo}from"node:util";import{performance as dr}from"node:perf_hooks";var le={debug:10,info:20,warn:30,error:40},ar=e=>Y(e)&&Object.keys(le).some(t=>t in e),pr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),Je=pr(),sr=pr(2),ko=e=>e<1e-6?["picosecond",e/1e-9,Je]:e<.001?["nanosecond",e/1e-6,Je]:e<1?["microsecond",e/.001,Je]:e<1e3?["millisecond",e,Je]:e<6e4?["second",e/1e3,sr]:["minute",e/6e4,sr],cr=e=>{let[t,r,o]=ko(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var Ee=class e{constructor(t){this.config=t;let{color:r=new Mo().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:Uo,info:Do,warn:Fo("#FFA500"),error:Ko};prettyPrint(t){let{depth:r=2}=this.config;return Bo(t,{depth:r,colors:this.hasColor,breakLength:this.config.level==="debug"?80:1/0,compact:this.config.level==="debug"?3:!0})}print(t,r,o){if(this.config.level==="silent"||le[t]<le[this.config.level])return;let{requestId:i,...s}=this.config.ctx||{},a=[new Date().toISOString()];i&&a.push(this.hasColor?Ho(i):i),a.push(this.hasColor?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&a.push(this.prettyPrint(o)),Object.keys(s).length>0&&a.push(this.prettyPrint(s)),console.log(a.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}profile(t){let r=dr.now();return()=>{let o=dr.now()-r,{message:i,severity:s="debug",formatter:a=cr}=typeof t=="object"?t:{message:t};this.print(typeof s=="function"?s(o):s,i,a(o))}}};import{head as qo,tail as $o,toPairs as Vo}from"ramda";var Ze=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze(Vo(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=qo(this.pairs)?.[1],this.siblingMethods=Object.freeze($o(this.pairs).map(([r])=>r))}};import Go from"express";var je=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Go.static(...this.params))}};import Rt from"express";import Xo from"node:http";import en from"node:https";var me=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new Oe(e)};import lr from"node:assert/strict";var W=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:i})=>{let s=Object.entries(e).map(([a,p])=>[a.trim(),p]);for(let[a,p]of s){lr.doesNotMatch(a,/\//,new ie(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let d=`${o||""}${a?`/${a}`:""}`;if(p instanceof Pe){let c=p.getMethods().slice();i&&c.push("options");for(let l of c)t(p,d,l)}else if(p instanceof je)r&&p.apply(d,r);else if(p instanceof Ze){for(let[c,l]of p.pairs)lr(l.getMethods().includes(c),new ie(`Endpoint assigned to ${c} method of ${d} must support ${c} method.`)),t(l,d,c);i&&p.firstEndpoint&&t(p.firstEndpoint,d,"options",p.siblingMethods)}else W({onEndpoint:t,onStatic:r,hasCors:i,routing:p,parentPath:d})}};var Ot=({app:e,getChildLogger:t,config:r,routing:o,parsers:i})=>W({routing:o,hasCors:!!r.cors,onEndpoint:(s,a,p,d)=>{e[p](a,...i?.[s.getRequestType()]||[],async(c,l)=>s.execute({request:c,response:l,logger:t(c),config:r,siblingMethods:d}))},onStatic:(s,a)=>{e.use(s,a)}});import mr,{isHttpError as _o}from"http-errors";var ur=({errorHandler:e,getChildLogger:t})=>async(r,o,i,s)=>r?e.execute({error:_o(r)?r:mr(400,se(r).message),request:o,response:i,input:null,output:null,options:{},logger:t(o)}):s(),fr=({errorHandler:e,getChildLogger:t})=>async(r,o)=>{let i=mr(404,`Can not ${r.method} ${r.path}`),s=t(r);try{e.execute({request:r,response:o,logger:s,error:i,input:null,output:null,options:{}})}catch(a){Ge({response:o,logger:s,error:new M(se(a).message,i)})}},Yo=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:i})=>i))return r(e);r()},Qo=e=>({log:e.debug.bind(e)}),yr=async({getChildLogger:e,config:t})=>{let r=await me("express-fileupload"),{limitError:o,beforeUpload:i,...s}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,d,c)=>{let l=e(p);try{await i?.({request:p,logger:l})}catch(f){return c(f)}return r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Qo(l)})(p,d,c)}),o&&a.push(Yo(o)),a},gr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},hr=({rootLogger:e,config:t})=>async(r,o,i)=>{let s=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;s.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[g]={logger:s}),i()},xr=e=>t=>t.res?.locals[g]?.logger||e;import{gray as Jo,hex as br,italic as We,whiteBright as Wo}from"ansis";var Tr=()=>{let e=We("Proudly supports transgender community.".padStart(109)),t=We("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=We("Thank you for choosing Express Zod API for your project.".padStart(132)),o=We("for Zoey".padEnd(20)),i=br("#F5A9B8"),s=br("#5BCEFA"),a=new Array(14).fill(s,1,3).fill(i,3,5).fill(Wo,5,7).fill(i,7,9).fill(s,9,12).fill(Jo,12,13);return`
6
6
  8888888888 8888888888P 888 d8888 8888888b. 8888888
7
7
  888 d88P 888 d88888 888 Y88b 888
8
8
  888 d88P 888 d88P888 888 888 888
@@ -17,7 +17,7 @@ ${o}888${t}
17
17
  ${r}
18
18
  `.split(`
19
19
  `).map((d,c)=>a[c]?a[c](d):d).join(`
20
- `)};var Sr=e=>{e.startupLogo!==!1&&console.log(Tr());let t=e.errorHandler||ze,r=ar(e.logger)?e.logger:new Ee(e.logger);r.debug("Running","v20.9.2 (ESM)");let o=hr({rootLogger:r,config:e}),s={getChildLogger:xr(r),errorHandler:t},a=fr(s),p=ur(s);return{...s,rootLogger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},tn=(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:i,loggingMiddleware:s}=Sr(e);return Ot({app:e.app.use(s),routing:t,getChildLogger:o,config:e}),{notFoundHandler:i,logger:r}},rn=async(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:i,parserFailureHandler:s,loggingMiddleware:a}=Sr(e),p=Rt().disable("x-powered-by").use(a);if(e.server.compression){let f=await me("compression");p.use(f(typeof e.server.compression=="object"?e.server.compression:void 0))}let d={json:[e.server.jsonParser||Rt.json()],raw:[e.server.rawParser||Rt.raw(),gr],upload:e.server.upload?await yr({config:e,getChildLogger:o}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:p,logger:r,getChildLogger:o}),Ot({app:p,routing:t,getChildLogger:o,config:e,parsers:d}),p.use(s,i);let c=(f,m)=>f.listen(m,()=>{r.info("Listening",m)}),l={httpServer:c(Xo.createServer(p),e.server.listen),httpsServer:e.https?c(en.createServer(e.https.options,p),e.https.listen):void 0};return{app:p,...l,logger:r}};import ai from"node:assert/strict";import{OpenApiBuilder as pi}from"openapi3-ts/oas31";import{pluck as ci}from"ramda";import te from"node:assert/strict";import{isReferenceObject as Pt,isSchemaObject as tt}from"openapi3-ts/oas31";import{concat as nn,type as Cr,filter as sn,fromPairs as ke,has as an,isNil as pn,map as ue,mergeAll as cn,mergeDeepRight as dn,mergeDeepWith as ln,objOf as Ir,omit as rt,pipe as zr,pluck as mn,range as un,reject as fn,toLower as yn,union as gn,when as hn,xprod as ot,zip as xn}from"ramda";import{z as b}from"zod";import{z as Le}from"zod";var Xe=e=>!isNaN(e.getTime());var Ne=Symbol("DateIn"),Or=()=>Le.union([Le.string().date(),Le.string().datetime(),Le.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Le.date().refine(Xe)).brand(Ne);import{z as on}from"zod";var ve=Symbol("DateOut"),Rr=()=>on.date().refine(Xe).transform(e=>e.toISOString()).brand(ve);var X=(e,{onEach:t,rules:r,onMissing:o,ctx:i={}})=>{let s=r[e._def[g]?.brand]||r[e._def.typeName],p=s?s(e,{...i,next:c=>X(c,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),d=t&&t(e,{prev:p,...i});return d?{...p,...d}:p};var Ar=50,wr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",bn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Er=/:([A-Za-z0-9_]+)/g,Tn=e=>e.match(Er)?.map(t=>t.slice(1))||[],Zr=e=>e.replace(Er,t=>`{${t.slice(1)}}`),Sn=({_def:e},{next:t})=>({...t(e.innerType),default:e[g]?.defaultLabel||e.defaultValue()}),On=({_def:{innerType:e}},{next:t})=>t(e),Rn=()=>({format:"any"}),An=({},e)=>(te(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),Pn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Cn=({options:e},{next:t})=>({oneOf:e.map(t)}),In=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),zn=e=>{let[t,r]=e.filter(tt).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));te(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=ln((i,s)=>Array.isArray(i)&&Array.isArray(s)?nn(i,s):i===s?s:te.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=gn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=_(t.examples||[],r.examples||[],([i,s])=>dn(i,s))),o},wn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return zn(o)}catch{}return{allOf:o}},En=(e,{next:t})=>t(e.unwrap()),Zn=(e,{next:t})=>t(e.unwrap()),jn=(e,{next:t})=>{let r=t(e.unwrap());return tt(r)&&(r.type=Lr(r)),r},jr=e=>{let t=yn(Cr(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Pr=e=>({type:jr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Ln=({value:e})=>({type:jr(e),const:e}),Nn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&Re(p)?p instanceof b.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=et(e,r)),s.length&&(a.required=s),a},vn=()=>({type:"null"}),kn=({},e)=>(te(!e.isResponse,new z({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:wr}}),Mn=({},e)=>(te(e.isResponse,new z({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:wr}}),Un=({},e)=>te.fail(new z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),Hn=()=>({type:"boolean"}),Dn=()=>({type:"integer",format:"bigint"}),Fn=e=>e.every(t=>t instanceof b.ZodLiteral),Kn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.ZodEnum||e instanceof b.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=et(b.object(ke(ot(o,[t]))),r),i.required=o),i}if(e instanceof b.ZodLiteral)return{type:"object",properties:et(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&Fn(e.options)){let o=ue(s=>`${s.value}`,e.options),i=ke(ot(o,[t]));return{type:"object",properties:et(b.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},Bn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let i={type:"array",items:o(r)};return e&&(i.minItems=e.value),t&&(i.maxItems=t.value),i},qn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),$n=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:f}})=>{let m=f.find(R=>R.kind==="regex"),T=f.find(R=>R.kind==="datetime"),C=m?m.regex:T?T.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,x={type:"string"},Z={"date-time":l,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:d,emoji:c};for(let R in Z)if(Z[R]){x.format=R;break}return r!==null&&(x.minLength=r),o!==null&&(x.maxLength=o),C&&(x.pattern=C.source),x},Vn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let i=o.find(f=>f.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=i?i.inclusive:!0,p=o.find(f=>f.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,l={type:e?"integer":"number",format:e?"int64":"double"};return a?l.minimum=s:l.exclusiveMinimum=s,c?l.maximum=d:l.exclusiveMaximum=d,l},et=({shape:e},t)=>ue(t,e),Gn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return bn?.[t]},Lr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},_n=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&tt(o)){let s=Be(e,Gn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(b.any())}if(!t&&i.type==="preprocess"&&tt(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Yn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Qn=(e,{next:t})=>t(e.unwrap()),Jn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},Wn=(e,{next:t})=>t(e.unwrap().shape.raw),Nr=e=>e.length?ke(xn(un(1,e.length+1).map(t=>`example${t}`),ue(Ir("value"),e))):void 0,vr=(e,t,r=[])=>zr(H,ue(hn(o=>Cr(o)==="Object",rt(r))),Nr)({schema:e,variant:t?"parsed":"original",validate:!0}),Xn=(e,t)=>zr(H,sn(an(t)),mn(t),Nr)({schema:e,variant:"original",validate:!0}),ee=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?ee(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>ee(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?ee(e._def.schema):e instanceof b.ZodPipeline?ee(e._def.in):ee(e._def.left).merge(ee(e._def.right)),kr=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,description:c=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:l}=ee(r),f=Tn(e),m=o.includes("query"),T=o.includes("params"),C=o.includes("headers"),x=h=>T&&f.includes(h),Z=h=>C&&mt(h);return Object.keys(l).map(h=>({name:h,location:x(h)?"path":Z(h)?"header":m?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:ge})=>{let k=X(l[h],{rules:{...d,...Ct},onEach:It,onMissing:zt,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),$=p==="components"?a(w(c,h),k):k;return{name:h,in:ge,required:!l[h].isOptional(),description:k.description||c,schema:$,examples:Xn(r,h)}})},Ct={ZodString:$n,ZodNumber:Vn,ZodBigInt:Dn,ZodBoolean:Hn,ZodNull:vn,ZodArray:Bn,ZodTuple:qn,ZodRecord:Kn,ZodObject:Nn,ZodLiteral:Ln,ZodIntersection:wn,ZodUnion:Cn,ZodAny:Rn,ZodDefault:Sn,ZodEnum:Pr,ZodNativeEnum:Pr,ZodEffects:_n,ZodOptional:En,ZodNullable:jn,ZodDiscriminatedUnion:In,ZodBranded:Qn,ZodDate:Un,ZodCatch:On,ZodPipeline:Yn,ZodLazy:Jn,ZodReadonly:Zn,[D]:Pn,[Ae]:An,[ve]:Mn,[Ne]:kn,[Q]:Wn},It=(e,{isResponse:t,prev:r})=>{if(Pt(r))return{};let{description:o}=e,i=e instanceof b.ZodLazy,s=r.type!==void 0,a=t&&Re(e),p=!i&&s&&!a&&e.isNullable(),d=i?[]:H({schema:e,variant:t?"parsed":"original",validate:!0}),c={};return o&&(c.description=o),p&&(c.type=Lr(r)),d.length&&(c.examples=d.slice()),c},zt=(e,t)=>te.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),At=(e,t)=>{if(Pt(e))return e;let r={...e};return r.properties&&(r.properties=rt(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>rt(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>At(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>At(o,t))),r},Mr=e=>Pt(e)?e:rt(["examples"],e),Ur=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:d,hasMultipleStatusCodes:c,statusCode:l,brandHandling:f,description:m=`${e.toUpperCase()} ${t} ${yt(i)} response ${c?l:""}`.trim()})=>{let T=Mr(X(r,{rules:{...f,...Ct},onEach:It,onMissing:zt,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),C={schema:d==="components"?p(w(m),T):T,examples:vr(r,!0)};return{description:m,content:ke(ot(o,[C]))}},ei=()=>({type:"http",scheme:"basic"}),ti=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},ri=({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},oi=({name:e})=>({type:"apiKey",in:"header",name:e}),ni=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ii=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),si=({flows:e={}})=>({type:"oauth2",flows:ue(t=>({...t,scopes:t.scopes||{}}),fn(pn,e))}),Hr=(e,t)=>{let r={basic:ei,bearer:ti,input:ri,header:oi,cookie:ni,openid:ii,oauth2:si};return _e(e,o=>r[o.type](o,t))},nt=e=>"or"in e?e.or.map(t=>"and"in t?cn(ue(({name:r,scopes:o})=>Ir(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?nt(xt(e)):nt({or:[e]}),Dr=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,paramNames:c,description:l=`${e.toUpperCase()} ${t} Request body`})=>{let f=Mr(At(X(r,{rules:{...d,...Ct},onEach:It,onMissing:zt,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),c)),m={schema:p==="components"?a(w(l),f):f,examples:vr(r,!1,c)};return{description:l,content:ke(ot(o,[m]))}},Fr=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}),wt=e=>e.length<=Ar?e:e.slice(0,Ar-1)+"\u2026";var Et=class extends pi{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let i=o||w(r,t),s=this.lastOperationIdSuffixes.get(i);return s===void 0?(this.lastOperationIdSuffixes.set(i,1),i):(o&&ai.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(i,s),`${i}${s}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let i in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[i]))return i;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:i,serverUrl:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Ke}){super(),this.addInfo({title:o,version:i});for(let m of typeof s=="string"?[s]:s)this.addServer({url:m});W({routing:t,onEndpoint:(m,T,C)=>{let x=C,Z={path:T,method:x,endpoint:m,composition:c,serializer:l,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[R,h]=["short","long"].map(m.getDescription.bind(m)),ge=R?wt(R):d&&h?wt(h):void 0,k=m.getTags(),$=r.inputSources?.[x]||dt[x],oe=this.ensureUniqOperationId(T,x,m.getOperationId(x)),he=kr({...Z,inputSources:$,schema:m.getSchema("input"),description:a?.requestParameter?.call(null,{method:x,path:T,operationId:oe})}),Ue={};for(let L of["positive","negative"]){let V=m.getResponses(L);for(let{mimeTypes:xe,schema:S,statusCodes:O}of V)for(let A of O)Ue[A]=Ur({...Z,variant:L,schema:S,mimeTypes:xe,statusCode:A,hasMultipleStatusCodes:V.length>1||O.length>1,description:a?.[`${L}Response`]?.call(null,{method:x,path:T,operationId:oe,statusCode:A})})}let ct=$.includes("body")?Dr({...Z,paramNames:ci("name",he),schema:m.getSchema("input"),mimeTypes:m.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:x,path:T,operationId:oe})}):void 0,He=nt(_e(Hr(m.getSecurity(),$),L=>{let V=this.ensureUniqSecuritySchemaName(L),xe=["oauth2","openIdConnect"].includes(L.type)?m.getScopes().slice():[];return this.addSecurityScheme(V,L),{name:V,scopes:xe}}));this.addPath(Zr(T),{[x]:{operationId:oe,summary:ge,description:h,tags:k.length>0?k:void 0,parameters:he.length>0?he:void 0,requestBody:ct,security:He.length>0?He:void 0,responses:Ue}})}}),this.rootDoc.tags=r.tags?Fr(r.tags):[]}};import{createRequest as di,createResponse as li}from"node-mocks-http";var mi=e=>di({...e,headers:{"content-type":P.json,...e?.headers}}),ui=e=>li(e),fi=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,i){return o==="_getLogs"?()=>t:o in le?(...s)=>t[o].push(s):Reflect.get(r,o,i)}})},yi=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let i=mi(e),s=ui({req:i,...t});s.req=t?.req||i,i.res=s;let a=fi(o),p={cors:!1,logger:a,...r};return{requestMock:i,responseMock:s,loggerMock:a,configMock:p}},gi=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:i,configMock:s}=yi(t);return await e.execute({request:r,response:o,config:s,logger:i}),{requestMock:r,responseMock:o,loggerMock:i}};import E from"typescript";import v from"typescript";import{chain as Kr,toPairs as Br}from"ramda";var n=v.factory,K=[n.createModifier(v.SyntaxKind.ExportKeyword)],hi=[n.createModifier(v.SyntaxKind.AsyncKeyword)],xi=[n.createModifier(v.SyntaxKind.PublicKeyword),n.createModifier(v.SyntaxKind.ReadonlyKeyword)],qr=[n.createModifier(v.SyntaxKind.ProtectedKeyword),n.createModifier(v.SyntaxKind.ReadonlyKeyword)],Zt=n.createTemplateHead(""),fe=n.createTemplateTail(""),jt=n.createTemplateMiddle(" "),Lt=e=>n.createTemplateLiteralType(Zt,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?fe:jt))),Nt=Lt(["M","P"]),it=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),st=(e,t)=>Kr(([r,o])=>[it(n.createIdentifier(r),o,t)],Br(e)),vt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),$r=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),Vr=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),B=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],v.NodeFlags.Const),kt=(e,t)=>n.createTypeAliasDeclaration(K,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),at=(e,t)=>n.createTypeAliasDeclaration(K,e,void 0,t),Gr=(e,t,r)=>n.createPropertyDeclaration(xi,e,void 0,t,r),_r=(e,t,r)=>n.createClassDeclaration(K,e,void 0,void 0,[t,...r]),Yr=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),Qr=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(v.SyntaxKind.AnyKeyword)]),Jr=(e,t,r)=>n.createInterfaceDeclaration(K,e,void 0,t,r),bi=Kr(([e,t])=>[n.createTypeParameterDeclaration([],e,n.createTypeReferenceNode(t))]),Wr=e=>bi(Br(e)),Mt=(e,t,r)=>n.createArrowFunction(r?hi:void 0,void 0,e.map(o=>it(o)),void 0,void 0,t),Ut=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[n.createArrowFunction(void 0,void 0,st({acc:void 0,key:void 0}),void 0,void 0,t),r]),Xr=(...e)=>`"${e.join(" ")}"`;var eo=["get","post","put","delete","patch"];import y from"typescript";import{z as Ft}from"zod";import q from"typescript";var{factory:pt}=q,Ht=(e,t)=>{q.addSyntheticLeadingComment(e,q.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ye=(e,t,r)=>{let o=pt.createTypeAliasDeclaration(void 0,pt.createIdentifier(t),void 0,e);return r&&Ht(o,r),o},Dt=(e,t)=>{let r=q.createSourceFile("print.ts","",q.ScriptTarget.Latest,!1,q.ScriptKind.TS);return q.createPrinter(t).printNode(q.EmitHint.Unspecified,e,r)},Ti=/^[A-Za-z_$][A-Za-z0-9_$]*$/,to=e=>Ti.test(e)?pt.createIdentifier(e):pt.createStringLiteral(e);var{factory:u}=y,Si={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},Oi=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Ri=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&Re(a)?a instanceof Ft.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,to(s),p&&o?u.createToken(y.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Ht(d,a.description),d});return u.createTypeLiteralNode(i)},Ai=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),Pi=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),ro=({options:e},{next:t})=>u.createUnionTypeNode(e.map(t)),Ci=e=>Si?.[e.kind],Ii=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=Be(e,Ci(o)),s={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(i&&s[i]||y.SyntaxKind.AnyKeyword)}return o},zi=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),wi=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},Ei=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),Zi=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),ji=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),Li=({_def:e},{next:t})=>u.createIntersectionTypeNode([e.left,e.right].map(t)),Ni=({_def:e},{next:t})=>t(e.innerType),re=e=>()=>u.createKeywordTypeNode(e),vi=(e,{next:t})=>t(e.unwrap()),ki=(e,{next:t})=>t(e.unwrap()),Mi=({_def:e},{next:t})=>t(e.innerType),Ui=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Hi=()=>u.createLiteralTypeNode(u.createNull()),Di=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:i})=>{let s=`Type${i(e)}`;return t(s)||(r(s,u.createLiteralTypeNode(u.createNull())),r(s,o(e)))},Fi=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(y.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),i=u.createUnionTypeNode([r,o]);return t instanceof Ft.ZodString?r:t instanceof Ft.ZodUnion?i:o},Ki=(e,{next:t})=>t(e.unwrap().shape.raw),Bi={ZodString:re(y.SyntaxKind.StringKeyword),ZodNumber:re(y.SyntaxKind.NumberKeyword),ZodBigInt:re(y.SyntaxKind.BigIntKeyword),ZodBoolean:re(y.SyntaxKind.BooleanKeyword),ZodAny:re(y.SyntaxKind.AnyKeyword),[Ne]:re(y.SyntaxKind.StringKeyword),[ve]:re(y.SyntaxKind.StringKeyword),ZodNull:Hi,ZodArray:Ai,ZodTuple:Zi,ZodRecord:ji,ZodObject:Ri,ZodLiteral:Oi,ZodIntersection:Li,ZodUnion:ro,ZodDefault:Ni,ZodEnum:Pi,ZodNativeEnum:zi,ZodEffects:Ii,ZodOptional:wi,ZodNullable:Ei,ZodDiscriminatedUnion:ro,ZodBranded:vi,ZodCatch:Mi,ZodPipeline:Ui,ZodLazy:Di,ZodReadonly:ki,[D]:Fi,[Q]:Ki},Me=(e,{brandHandling:t,ctx:r})=>X(e,{rules:{...t,...Bi},onMissing:()=>u.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),ctx:r});var Kt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:n.createIdentifier("Path"),methodType:n.createIdentifier("Method"),methodPathType:n.createIdentifier("MethodPath"),inputInterface:n.createIdentifier("Input"),posResponseInterface:n.createIdentifier("PositiveResponse"),negResponseInterface:n.createIdentifier("NegativeResponse"),responseInterface:n.createIdentifier("Response"),jsonEndpointsConst:n.createIdentifier("jsonEndpoints"),endpointTagsConst:n.createIdentifier("endpointTags"),providerType:n.createIdentifier("Provider"),implementationType:n.createIdentifier("Implementation"),clientClass:n.createIdentifier("ExpressZodAPIClient"),keyParameter:n.createIdentifier("key"),pathParameter:n.createIdentifier("path"),paramsArgument:n.createIdentifier("params"),methodParameter:n.createIdentifier("method"),accumulator:n.createIdentifier("acc"),provideMethod:n.createIdentifier("provide"),implementationArgument:n.createIdentifier("implementation"),headersProperty:n.createIdentifier("headers"),hasBodyConst:n.createIdentifier("hasBody"),undefinedValue:n.createIdentifier("undefined"),bodyProperty:n.createIdentifier("body"),responseConst:n.createIdentifier("response"),searchParamsConst:n.createIdentifier("searchParams"),exampleImplementationConst:n.createIdentifier("exampleImplementation"),clientConst:n.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?n.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,ye(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=Ke,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){W({routing:t,onEndpoint:(S,O,A)=>{let ne={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},be=w(A,O,"input"),Te=Me(S.getSchema("input"),{brandHandling:r,ctx:{...ne,isResponse:!1}}),I=s?w(A,O,"positive.response"):void 0,Bt=S.getSchema("positive"),qt=s?Me(Bt,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Se=s?w(A,O,"negative.response"):void 0,$t=S.getSchema("negative"),Vt=s?Me($t,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Gt=w(A,O,"response"),oo=I&&Se?n.createUnionTypeNode([n.createTypeReferenceNode(I),n.createTypeReferenceNode(Se)]):Me(Bt.or($t),{brandHandling:r,ctx:{...ne,isResponse:!0}});this.program.push(ye(Te,be)),qt&&I&&this.program.push(ye(qt,I)),Vt&&Se&&this.program.push(ye(Vt,Se)),this.program.push(ye(oo,Gt)),A!=="options"&&(this.paths.push(O),this.registry.set({method:A,path:O},{input:be,positive:I,negative:Se,response:Gt,isJson:S.getMimeTypes("positive").includes(P.json),tags:S.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(kt(this.ids.pathType,this.paths)),this.program.push(kt(this.ids.methodType,eo)),this.program.push(at(this.ids.methodPathType,Lt([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(E.SyntaxKind.ExtendsKeyword,[vt(this.ids.methodPathType,E.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let d=[],c=[];for(let[{method:S,path:O},{isJson:A,tags:ne,...be}]of this.registry){let Te=Xr(S,O);for(let I of this.interfaces)I.kind in be&&I.props.push(Vr(Te,be[I.kind]));o!=="types"&&(A&&d.push(n.createPropertyAssignment(Te,n.createTrue())),c.push(n.createPropertyAssignment(Te,n.createArrayLiteralExpression(ne.map(I=>n.createStringLiteral(I))))))}for(let{id:S,props:O}of this.interfaces)this.program.push(Jr(S,p,O));if(o==="types")return;let l=n.createVariableStatement(K,B(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(d))),f=n.createVariableStatement(K,B(this.ids.endpointTagsConst,n.createObjectLiteralExpression(c))),m=at(this.ids.providerType,n.createFunctionTypeNode(Wr({M:this.ids.methodType,P:this.ids.pathType}),st({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),Nt)}),Yr(this.ids.responseInterface,Nt))),T=at(this.ids.implementationType,n.createFunctionTypeNode(void 0,st({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(E.SyntaxKind.StringKeyword),params:vt(E.SyntaxKind.StringKeyword,E.SyntaxKind.AnyKeyword)}),Qr())),C=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,fe)]),x=Ut(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[C,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),Z=Ut(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[C]),E.SyntaxKind.GreaterThanEqualsToken,n.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,n.createObjectLiteralExpression([n.createSpreadAssignment(this.ids.accumulator),n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),n.createObjectLiteralExpression()),R=_r(this.ids.clientClass,$r([it(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),qr)]),[Gr(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),Mt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,x,Z]),!0))]);this.program.push(l,f,m,T,R);let h=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),ge=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(P.json))]),void 0,this.ids.undefinedValue)),k=n.createPropertyAssignment(this.ids.bodyProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),$=n.createVariableStatement(void 0,B(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier("fetch"),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,fe)]),n.createObjectLiteralExpression([h,ge,k])])))),oe=n.createVariableStatement(void 0,B(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),he=n.createVariableStatement(void 0,B(this.ids.searchParamsConst,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createStringLiteral(""),void 0,n.createTemplateExpression(n.createTemplateHead("?"),[n.createTemplateSpan(n.createNewExpression(n.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),fe)])))),[Ue,ct]=["json","text"].map(S=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,S),void 0,void 0))),He=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(Zt,[n.createTemplateSpan(this.ids.methodParameter,jt),n.createTemplateSpan(this.ids.pathParameter,fe)]),E.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([Ue])),L=n.createVariableStatement(K,B(this.ids.exampleImplementationConst,Mt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([oe,he,$,He,ct]),!0),n.createTypeReferenceNode(this.ids.implementationType))),V=n.createExpressionStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[n.createStringLiteral("get"),n.createStringLiteral("/v1/user/retrieve"),n.createObjectLiteralExpression([n.createPropertyAssignment("id",n.createStringLiteral("10"))])])),xe=n.createVariableStatement(void 0,B(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(L,xe,V)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Dt(r,t)).join(`
20
+ `)};var Sr=e=>{e.startupLogo!==!1&&console.log(Tr());let t=e.errorHandler||ze,r=ar(e.logger)?e.logger:new Ee(e.logger);r.debug("Running","v20.10.0 (ESM)");let o=hr({rootLogger:r,config:e}),s={getChildLogger:xr(r),errorHandler:t},a=fr(s),p=ur(s);return{...s,rootLogger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},tn=(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:i,loggingMiddleware:s}=Sr(e);return Ot({app:e.app.use(s),routing:t,getChildLogger:o,config:e}),{notFoundHandler:i,logger:r}},rn=async(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:i,parserFailureHandler:s,loggingMiddleware:a}=Sr(e),p=Rt().disable("x-powered-by").use(a);if(e.server.compression){let f=await me("compression");p.use(f(typeof e.server.compression=="object"?e.server.compression:void 0))}let d={json:[e.server.jsonParser||Rt.json()],raw:[e.server.rawParser||Rt.raw(),gr],upload:e.server.upload?await yr({config:e,getChildLogger:o}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:p,logger:r,getChildLogger:o}),Ot({app:p,routing:t,getChildLogger:o,config:e,parsers:d}),p.use(s,i);let c=(f,m)=>f.listen(m,()=>{r.info("Listening",m)}),l={httpServer:c(Xo.createServer(p),e.server.listen),httpsServer:e.https?c(en.createServer(e.https.options,p),e.https.listen):void 0};return{app:p,...l,logger:r}};import ai from"node:assert/strict";import{OpenApiBuilder as pi}from"openapi3-ts/oas31";import{pluck as ci}from"ramda";import te from"node:assert/strict";import{isReferenceObject as Pt,isSchemaObject as tt}from"openapi3-ts/oas31";import{concat as nn,type as Cr,filter as sn,fromPairs as ke,has as an,isNil as pn,map as ue,mergeAll as cn,mergeDeepRight as dn,mergeDeepWith as ln,objOf as Ir,omit as rt,pipe as zr,pluck as mn,range as un,reject as fn,toLower as yn,union as gn,when as hn,xprod as ot,zip as xn}from"ramda";import{z as b}from"zod";import{z as Le}from"zod";var Xe=e=>!isNaN(e.getTime());var Ne=Symbol("DateIn"),Or=()=>Le.union([Le.string().date(),Le.string().datetime(),Le.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Le.date().refine(Xe)).brand(Ne);import{z as on}from"zod";var ve=Symbol("DateOut"),Rr=()=>on.date().refine(Xe).transform(e=>e.toISOString()).brand(ve);var X=(e,{onEach:t,rules:r,onMissing:o,ctx:i={}})=>{let s=r[e._def[g]?.brand]||r[e._def.typeName],p=s?s(e,{...i,next:c=>X(c,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),d=t&&t(e,{prev:p,...i});return d?{...p,...d}:p};var Ar=50,wr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",bn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Er=/:([A-Za-z0-9_]+)/g,Tn=e=>e.match(Er)?.map(t=>t.slice(1))||[],Zr=e=>e.replace(Er,t=>`{${t.slice(1)}}`),Sn=({_def:e},{next:t})=>({...t(e.innerType),default:e[g]?.defaultLabel||e.defaultValue()}),On=({_def:{innerType:e}},{next:t})=>t(e),Rn=()=>({format:"any"}),An=({},e)=>(te(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),Pn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Cn=({options:e},{next:t})=>({oneOf:e.map(t)}),In=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),zn=e=>{let[t,r]=e.filter(tt).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));te(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=ln((i,s)=>Array.isArray(i)&&Array.isArray(s)?nn(i,s):i===s?s:te.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=gn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=_(t.examples||[],r.examples||[],([i,s])=>dn(i,s))),o},wn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return zn(o)}catch{}return{allOf:o}},En=(e,{next:t})=>t(e.unwrap()),Zn=(e,{next:t})=>t(e.unwrap()),jn=(e,{next:t})=>{let r=t(e.unwrap());return tt(r)&&(r.type=Lr(r)),r},jr=e=>{let t=yn(Cr(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Pr=e=>({type:jr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Ln=({value:e})=>({type:jr(e),const:e}),Nn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&Re(p)?p instanceof b.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=et(e,r)),s.length&&(a.required=s),a},vn=()=>({type:"null"}),kn=({},e)=>(te(!e.isResponse,new z({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:wr}}),Mn=({},e)=>(te(e.isResponse,new z({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:wr}}),Un=({},e)=>te.fail(new z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),Hn=()=>({type:"boolean"}),Dn=()=>({type:"integer",format:"bigint"}),Fn=e=>e.every(t=>t instanceof b.ZodLiteral),Kn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.ZodEnum||e instanceof b.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=et(b.object(ke(ot(o,[t]))),r),i.required=o),i}if(e instanceof b.ZodLiteral)return{type:"object",properties:et(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&Fn(e.options)){let o=ue(s=>`${s.value}`,e.options),i=ke(ot(o,[t]));return{type:"object",properties:et(b.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},Bn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let i={type:"array",items:o(r)};return e&&(i.minItems=e.value),t&&(i.maxItems=t.value),i},qn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),$n=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:f}})=>{let m=f.find(R=>R.kind==="regex"),T=f.find(R=>R.kind==="datetime"),C=m?m.regex:T?T.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,x={type:"string"},Z={"date-time":l,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:d,emoji:c};for(let R in Z)if(Z[R]){x.format=R;break}return r!==null&&(x.minLength=r),o!==null&&(x.maxLength=o),C&&(x.pattern=C.source),x},Vn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let i=o.find(f=>f.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=i?i.inclusive:!0,p=o.find(f=>f.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,l={type:e?"integer":"number",format:e?"int64":"double"};return a?l.minimum=s:l.exclusiveMinimum=s,c?l.maximum=d:l.exclusiveMaximum=d,l},et=({shape:e},t)=>ue(t,e),Gn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return bn?.[t]},Lr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},_n=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&tt(o)){let s=Be(e,Gn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(b.any())}if(!t&&i.type==="preprocess"&&tt(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Yn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Qn=(e,{next:t})=>t(e.unwrap()),Jn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},Wn=(e,{next:t})=>t(e.unwrap().shape.raw),Nr=e=>e.length?ke(xn(un(1,e.length+1).map(t=>`example${t}`),ue(Ir("value"),e))):void 0,vr=(e,t,r=[])=>zr(H,ue(hn(o=>Cr(o)==="Object",rt(r))),Nr)({schema:e,variant:t?"parsed":"original",validate:!0}),Xn=(e,t)=>zr(H,sn(an(t)),mn(t),Nr)({schema:e,variant:"original",validate:!0}),ee=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?ee(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>ee(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?ee(e._def.schema):e instanceof b.ZodPipeline?ee(e._def.in):ee(e._def.left).merge(ee(e._def.right)),kr=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,description:c=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:l}=ee(r),f=Tn(e),m=o.includes("query"),T=o.includes("params"),C=o.includes("headers"),x=h=>T&&f.includes(h),Z=h=>C&&mt(h);return Object.keys(l).map(h=>({name:h,location:x(h)?"path":Z(h)?"header":m?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:ge})=>{let k=X(l[h],{rules:{...d,...Ct},onEach:It,onMissing:zt,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),$=p==="components"?a(w(c,h),k):k;return{name:h,in:ge,required:!l[h].isOptional(),description:k.description||c,schema:$,examples:Xn(r,h)}})},Ct={ZodString:$n,ZodNumber:Vn,ZodBigInt:Dn,ZodBoolean:Hn,ZodNull:vn,ZodArray:Bn,ZodTuple:qn,ZodRecord:Kn,ZodObject:Nn,ZodLiteral:Ln,ZodIntersection:wn,ZodUnion:Cn,ZodAny:Rn,ZodDefault:Sn,ZodEnum:Pr,ZodNativeEnum:Pr,ZodEffects:_n,ZodOptional:En,ZodNullable:jn,ZodDiscriminatedUnion:In,ZodBranded:Qn,ZodDate:Un,ZodCatch:On,ZodPipeline:Yn,ZodLazy:Jn,ZodReadonly:Zn,[D]:Pn,[Ae]:An,[ve]:Mn,[Ne]:kn,[Q]:Wn},It=(e,{isResponse:t,prev:r})=>{if(Pt(r))return{};let{description:o}=e,i=e instanceof b.ZodLazy,s=r.type!==void 0,a=t&&Re(e),p=!i&&s&&!a&&e.isNullable(),d=i?[]:H({schema:e,variant:t?"parsed":"original",validate:!0}),c={};return o&&(c.description=o),p&&(c.type=Lr(r)),d.length&&(c.examples=d.slice()),c},zt=(e,t)=>te.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),At=(e,t)=>{if(Pt(e))return e;let r={...e};return r.properties&&(r.properties=rt(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>rt(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>At(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>At(o,t))),r},Mr=e=>Pt(e)?e:rt(["examples"],e),Ur=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:d,hasMultipleStatusCodes:c,statusCode:l,brandHandling:f,description:m=`${e.toUpperCase()} ${t} ${yt(i)} response ${c?l:""}`.trim()})=>{let T=Mr(X(r,{rules:{...f,...Ct},onEach:It,onMissing:zt,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),C={schema:d==="components"?p(w(m),T):T,examples:vr(r,!0)};return{description:m,content:ke(ot(o,[C]))}},ei=()=>({type:"http",scheme:"basic"}),ti=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},ri=({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},oi=({name:e})=>({type:"apiKey",in:"header",name:e}),ni=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ii=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),si=({flows:e={}})=>({type:"oauth2",flows:ue(t=>({...t,scopes:t.scopes||{}}),fn(pn,e))}),Hr=(e,t)=>{let r={basic:ei,bearer:ti,input:ri,header:oi,cookie:ni,openid:ii,oauth2:si};return _e(e,o=>r[o.type](o,t))},nt=e=>"or"in e?e.or.map(t=>"and"in t?cn(ue(({name:r,scopes:o})=>Ir(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?nt(xt(e)):nt({or:[e]}),Dr=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,paramNames:c,description:l=`${e.toUpperCase()} ${t} Request body`})=>{let f=Mr(At(X(r,{rules:{...d,...Ct},onEach:It,onMissing:zt,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),c)),m={schema:p==="components"?a(w(l),f):f,examples:vr(r,!1,c)};return{description:l,content:ke(ot(o,[m]))}},Fr=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}),wt=e=>e.length<=Ar?e:e.slice(0,Ar-1)+"\u2026";var Et=class extends pi{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let i=o||w(r,t),s=this.lastOperationIdSuffixes.get(i);return s===void 0?(this.lastOperationIdSuffixes.set(i,1),i):(o&&ai.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(i,s),`${i}${s}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let i in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[i]))return i;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:i,serverUrl:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Ke}){super(),this.addInfo({title:o,version:i});for(let m of typeof s=="string"?[s]:s)this.addServer({url:m});W({routing:t,onEndpoint:(m,T,C)=>{let x=C,Z={path:T,method:x,endpoint:m,composition:c,serializer:l,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[R,h]=["short","long"].map(m.getDescription.bind(m)),ge=R?wt(R):d&&h?wt(h):void 0,k=m.getTags(),$=r.inputSources?.[x]||dt[x],oe=this.ensureUniqOperationId(T,x,m.getOperationId(x)),he=kr({...Z,inputSources:$,schema:m.getSchema("input"),description:a?.requestParameter?.call(null,{method:x,path:T,operationId:oe})}),Ue={};for(let L of["positive","negative"]){let V=m.getResponses(L);for(let{mimeTypes:xe,schema:S,statusCodes:O}of V)for(let A of O)Ue[A]=Ur({...Z,variant:L,schema:S,mimeTypes:xe,statusCode:A,hasMultipleStatusCodes:V.length>1||O.length>1,description:a?.[`${L}Response`]?.call(null,{method:x,path:T,operationId:oe,statusCode:A})})}let ct=$.includes("body")?Dr({...Z,paramNames:ci("name",he),schema:m.getSchema("input"),mimeTypes:m.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:x,path:T,operationId:oe})}):void 0,He=nt(_e(Hr(m.getSecurity(),$),L=>{let V=this.ensureUniqSecuritySchemaName(L),xe=["oauth2","openIdConnect"].includes(L.type)?m.getScopes().slice():[];return this.addSecurityScheme(V,L),{name:V,scopes:xe}}));this.addPath(Zr(T),{[x]:{operationId:oe,summary:ge,description:h,tags:k.length>0?k:void 0,parameters:he.length>0?he:void 0,requestBody:ct,security:He.length>0?He:void 0,responses:Ue}})}}),this.rootDoc.tags=r.tags?Fr(r.tags):[]}};import{createRequest as di,createResponse as li}from"node-mocks-http";var mi=e=>di({...e,headers:{"content-type":P.json,...e?.headers}}),ui=e=>li(e),fi=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,i){return o==="_getLogs"?()=>t:o in le?(...s)=>t[o].push(s):Reflect.get(r,o,i)}})},yi=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let i=mi(e),s=ui({req:i,...t});s.req=t?.req||i,i.res=s;let a=fi(o),p={cors:!1,logger:a,...r};return{requestMock:i,responseMock:s,loggerMock:a,configMock:p}},gi=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:i,configMock:s}=yi(t);return await e.execute({request:r,response:o,config:s,logger:i}),{requestMock:r,responseMock:o,loggerMock:i}};import E from"typescript";import v from"typescript";import{chain as Kr,toPairs as Br}from"ramda";var n=v.factory,K=[n.createModifier(v.SyntaxKind.ExportKeyword)],hi=[n.createModifier(v.SyntaxKind.AsyncKeyword)],xi=[n.createModifier(v.SyntaxKind.PublicKeyword),n.createModifier(v.SyntaxKind.ReadonlyKeyword)],qr=[n.createModifier(v.SyntaxKind.ProtectedKeyword),n.createModifier(v.SyntaxKind.ReadonlyKeyword)],Zt=n.createTemplateHead(""),fe=n.createTemplateTail(""),jt=n.createTemplateMiddle(" "),Lt=e=>n.createTemplateLiteralType(Zt,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?fe:jt))),Nt=Lt(["M","P"]),it=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),st=(e,t)=>Kr(([r,o])=>[it(n.createIdentifier(r),o,t)],Br(e)),vt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),$r=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),Vr=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),B=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],v.NodeFlags.Const),kt=(e,t)=>n.createTypeAliasDeclaration(K,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),at=(e,t)=>n.createTypeAliasDeclaration(K,e,void 0,t),Gr=(e,t,r)=>n.createPropertyDeclaration(xi,e,void 0,t,r),_r=(e,t,r)=>n.createClassDeclaration(K,e,void 0,void 0,[t,...r]),Yr=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),Qr=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(v.SyntaxKind.AnyKeyword)]),Jr=(e,t,r)=>n.createInterfaceDeclaration(K,e,void 0,t,r),bi=Kr(([e,t])=>[n.createTypeParameterDeclaration([],e,n.createTypeReferenceNode(t))]),Wr=e=>bi(Br(e)),Mt=(e,t,r)=>n.createArrowFunction(r?hi:void 0,void 0,e.map(o=>it(o)),void 0,void 0,t),Ut=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[n.createArrowFunction(void 0,void 0,st({acc:void 0,key:void 0}),void 0,void 0,t),r]),Xr=(...e)=>`"${e.join(" ")}"`;var eo=["get","post","put","delete","patch"];import y from"typescript";import{z as Ft}from"zod";import q from"typescript";var{factory:pt}=q,Ht=(e,t)=>{q.addSyntheticLeadingComment(e,q.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ye=(e,t,r)=>{let o=pt.createTypeAliasDeclaration(void 0,pt.createIdentifier(t),void 0,e);return r&&Ht(o,r),o},Dt=(e,t)=>{let r=q.createSourceFile("print.ts","",q.ScriptTarget.Latest,!1,q.ScriptKind.TS);return q.createPrinter(t).printNode(q.EmitHint.Unspecified,e,r)},Ti=/^[A-Za-z_$][A-Za-z0-9_$]*$/,to=e=>Ti.test(e)?pt.createIdentifier(e):pt.createStringLiteral(e);var{factory:u}=y,Si={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},Oi=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Ri=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&Re(a)?a instanceof Ft.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,to(s),p&&o?u.createToken(y.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Ht(d,a.description),d});return u.createTypeLiteralNode(i)},Ai=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),Pi=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),ro=({options:e},{next:t})=>u.createUnionTypeNode(e.map(t)),Ci=e=>Si?.[e.kind],Ii=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=Be(e,Ci(o)),s={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(i&&s[i]||y.SyntaxKind.AnyKeyword)}return o},zi=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),wi=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},Ei=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),Zi=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),ji=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),Li=({_def:e},{next:t})=>u.createIntersectionTypeNode([e.left,e.right].map(t)),Ni=({_def:e},{next:t})=>t(e.innerType),re=e=>()=>u.createKeywordTypeNode(e),vi=(e,{next:t})=>t(e.unwrap()),ki=(e,{next:t})=>t(e.unwrap()),Mi=({_def:e},{next:t})=>t(e.innerType),Ui=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Hi=()=>u.createLiteralTypeNode(u.createNull()),Di=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:i})=>{let s=`Type${i(e)}`;return t(s)||(r(s,u.createLiteralTypeNode(u.createNull())),r(s,o(e)))},Fi=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(y.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),i=u.createUnionTypeNode([r,o]);return t instanceof Ft.ZodString?r:t instanceof Ft.ZodUnion?i:o},Ki=(e,{next:t})=>t(e.unwrap().shape.raw),Bi={ZodString:re(y.SyntaxKind.StringKeyword),ZodNumber:re(y.SyntaxKind.NumberKeyword),ZodBigInt:re(y.SyntaxKind.BigIntKeyword),ZodBoolean:re(y.SyntaxKind.BooleanKeyword),ZodAny:re(y.SyntaxKind.AnyKeyword),[Ne]:re(y.SyntaxKind.StringKeyword),[ve]:re(y.SyntaxKind.StringKeyword),ZodNull:Hi,ZodArray:Ai,ZodTuple:Zi,ZodRecord:ji,ZodObject:Ri,ZodLiteral:Oi,ZodIntersection:Li,ZodUnion:ro,ZodDefault:Ni,ZodEnum:Pi,ZodNativeEnum:zi,ZodEffects:Ii,ZodOptional:wi,ZodNullable:Ei,ZodDiscriminatedUnion:ro,ZodBranded:vi,ZodCatch:Mi,ZodPipeline:Ui,ZodLazy:Di,ZodReadonly:ki,[D]:Fi,[Q]:Ki},Me=(e,{brandHandling:t,ctx:r})=>X(e,{rules:{...t,...Bi},onMissing:()=>u.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),ctx:r});var Kt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:n.createIdentifier("Path"),methodType:n.createIdentifier("Method"),methodPathType:n.createIdentifier("MethodPath"),inputInterface:n.createIdentifier("Input"),posResponseInterface:n.createIdentifier("PositiveResponse"),negResponseInterface:n.createIdentifier("NegativeResponse"),responseInterface:n.createIdentifier("Response"),jsonEndpointsConst:n.createIdentifier("jsonEndpoints"),endpointTagsConst:n.createIdentifier("endpointTags"),providerType:n.createIdentifier("Provider"),implementationType:n.createIdentifier("Implementation"),clientClass:n.createIdentifier("ExpressZodAPIClient"),keyParameter:n.createIdentifier("key"),pathParameter:n.createIdentifier("path"),paramsArgument:n.createIdentifier("params"),methodParameter:n.createIdentifier("method"),accumulator:n.createIdentifier("acc"),provideMethod:n.createIdentifier("provide"),implementationArgument:n.createIdentifier("implementation"),headersProperty:n.createIdentifier("headers"),hasBodyConst:n.createIdentifier("hasBody"),undefinedValue:n.createIdentifier("undefined"),bodyProperty:n.createIdentifier("body"),responseConst:n.createIdentifier("response"),searchParamsConst:n.createIdentifier("searchParams"),exampleImplementationConst:n.createIdentifier("exampleImplementation"),clientConst:n.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?n.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,ye(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=Ke,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){W({routing:t,onEndpoint:(S,O,A)=>{let ne={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},be=w(A,O,"input"),Te=Me(S.getSchema("input"),{brandHandling:r,ctx:{...ne,isResponse:!1}}),I=s?w(A,O,"positive.response"):void 0,Bt=S.getSchema("positive"),qt=s?Me(Bt,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Se=s?w(A,O,"negative.response"):void 0,$t=S.getSchema("negative"),Vt=s?Me($t,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Gt=w(A,O,"response"),oo=I&&Se?n.createUnionTypeNode([n.createTypeReferenceNode(I),n.createTypeReferenceNode(Se)]):Me(Bt.or($t),{brandHandling:r,ctx:{...ne,isResponse:!0}});this.program.push(ye(Te,be)),qt&&I&&this.program.push(ye(qt,I)),Vt&&Se&&this.program.push(ye(Vt,Se)),this.program.push(ye(oo,Gt)),A!=="options"&&(this.paths.push(O),this.registry.set({method:A,path:O},{input:be,positive:I,negative:Se,response:Gt,isJson:S.getMimeTypes("positive").includes(P.json),tags:S.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(kt(this.ids.pathType,this.paths)),this.program.push(kt(this.ids.methodType,eo)),this.program.push(at(this.ids.methodPathType,Lt([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(E.SyntaxKind.ExtendsKeyword,[vt(this.ids.methodPathType,E.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let d=[],c=[];for(let[{method:S,path:O},{isJson:A,tags:ne,...be}]of this.registry){let Te=Xr(S,O);for(let I of this.interfaces)I.kind in be&&I.props.push(Vr(Te,be[I.kind]));o!=="types"&&(A&&d.push(n.createPropertyAssignment(Te,n.createTrue())),c.push(n.createPropertyAssignment(Te,n.createArrayLiteralExpression(ne.map(I=>n.createStringLiteral(I))))))}for(let{id:S,props:O}of this.interfaces)this.program.push(Jr(S,p,O));if(o==="types")return;let l=n.createVariableStatement(K,B(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(d))),f=n.createVariableStatement(K,B(this.ids.endpointTagsConst,n.createObjectLiteralExpression(c))),m=at(this.ids.providerType,n.createFunctionTypeNode(Wr({M:this.ids.methodType,P:this.ids.pathType}),st({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),Nt)}),Yr(this.ids.responseInterface,Nt))),T=at(this.ids.implementationType,n.createFunctionTypeNode(void 0,st({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(E.SyntaxKind.StringKeyword),params:vt(E.SyntaxKind.StringKeyword,E.SyntaxKind.AnyKeyword)}),Qr())),C=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,fe)]),x=Ut(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[C,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),Z=Ut(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[C]),E.SyntaxKind.GreaterThanEqualsToken,n.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,n.createObjectLiteralExpression([n.createSpreadAssignment(this.ids.accumulator),n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),n.createObjectLiteralExpression()),R=_r(this.ids.clientClass,$r([it(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),qr)]),[Gr(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),Mt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,x,Z]),!0))]);this.program.push(l,f,m,T,R);let h=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),ge=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(P.json))]),void 0,this.ids.undefinedValue)),k=n.createPropertyAssignment(this.ids.bodyProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),$=n.createVariableStatement(void 0,B(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier("fetch"),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,fe)]),n.createObjectLiteralExpression([h,ge,k])])))),oe=n.createVariableStatement(void 0,B(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),he=n.createVariableStatement(void 0,B(this.ids.searchParamsConst,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createStringLiteral(""),void 0,n.createTemplateExpression(n.createTemplateHead("?"),[n.createTemplateSpan(n.createNewExpression(n.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),fe)])))),[Ue,ct]=["json","text"].map(S=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,S),void 0,void 0))),He=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(Zt,[n.createTemplateSpan(this.ids.methodParameter,jt),n.createTemplateSpan(this.ids.pathParameter,fe)]),E.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([Ue])),L=n.createVariableStatement(K,B(this.ids.exampleImplementationConst,Mt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([oe,he,$,He,ct]),!0),n.createTypeReferenceNode(this.ids.implementationType))),V=n.createExpressionStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[n.createStringLiteral("get"),n.createStringLiteral("/v1/user/retrieve"),n.createObjectLiteralExpression([n.createPropertyAssignment("id",n.createStringLiteral("10"))])])),xe=n.createVariableStatement(void 0,B(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(L,xe,V)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Dt(r,t)).join(`
21
21
  `):void 0}print(t){let r=this.printUsage(t),o=r&&E.addSyntheticLeadingComment(E.addSyntheticLeadingComment(n.createEmptyStatement(),E.SyntaxKind.SingleLineCommentTrivia," Usage example:"),E.SyntaxKind.MultiLineCommentTrivia,`
22
22
  ${r}`);return this.program.concat(o||[]).map((i,s)=>Dt(i,s<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
23
23
 
@@ -1 +1 @@
1
- "use strict";var p=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var y=(s,t)=>{for(var e in t)p(s,e,{get:t[e],enumerable:!0})},g=(s,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of m(t))!u.call(s,i)&&i!==e&&p(s,i,{get:()=>t[i],enumerable:!(r=d(t,i))||r.enumerable});return s};var f=s=>g(p({},"__esModule",{value:!0}),s);var w={};y(w,{default:()=>k});module.exports=f(w);var c=require("@typescript-eslint/utils");var l="express-zod-api";var h="testEndpoint",n={createLogger:"BuiltinLogger",createResultHandler:"ResultHandler",createMiddleware:"Middleware"},o={getPositiveResponse:"positive",getNegativeResponse:"negative",responseProps:"responseOptions",middleware:"handler"},b={fnMethod:null},a=(s,t)=>typeof s=="string"&&s in t,v=c.ESLintUtils.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",remove:"Remove {{subject}} {{name}}."}},defaultOptions:[],create:s=>({ImportDeclaration:t=>{if(t.source.value===l){for(let e of t.specifiers)if(e.type==="ImportSpecifier"&&a(e.imported.name,n)){let r=n[e.imported.name];s.report({node:e.imported,messageId:"change",data:{subject:"import",from:e.imported.name,to:r},fix:i=>i.replaceText(e,r)})}}},CallExpression:t=>{if(t.callee.type==="Identifier"&&a(t.callee.name,n)){let e=`new ${n[t.callee.name]}`;s.report({node:t.callee,messageId:"change",data:{subject:"call",from:t.callee.name,to:e},fix:r=>r.replaceText(t.callee,e)})}if(t.callee.type==="Identifier"&&t.callee.name===h&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"){if(a(e.key.name,o)){let r=o[e.key.name];s.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:r},fix:i=>i.replaceText(e.key,r)})}a(e.key.name,b)&&s.report({node:e,messageId:"remove",data:{subject:"property",name:e.key.name},fix:r=>s.sourceCode.getTokenAfter(e)?.value===","&&e.range?r.removeRange([e.range[0],e.range[1]+1]):r.remove(e)})}}},NewExpression:t=>{if(t.callee.type==="Identifier"&&[n.createResultHandler,n.createMiddleware].includes(t.callee.name)&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"&&a(e.key.name,o)){let r=o[e.key.name];s.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:r},fix:i=>i.replaceText(e.key,r)})}}},Identifier:t=>{t.name==="MockOverrides"&&t.parent.type==="TSInterfaceDeclaration"&&s.report({node:t,messageId:"remove",data:{subject:"augmentation",name:t.name},fix:e=>e.remove(t.parent)})}})}),k={rules:{v20:v}};
1
+ "use strict";var o=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var y=(s,t)=>{for(var e in t)o(s,e,{get:t[e],enumerable:!0})},g=(s,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of m(t))!u.call(s,i)&&i!==e&&o(s,i,{get:()=>t[i],enumerable:!(r=d(t,i))||r.enumerable});return s};var f=s=>g(o({},"__esModule",{value:!0}),s);var w={};y(w,{default:()=>k});module.exports=f(w);var c=require("@typescript-eslint/utils");var l="express-zod-api";var h="testEndpoint",a={createLogger:"BuiltinLogger",createResultHandler:"ResultHandler",createMiddleware:"Middleware"},p={getPositiveResponse:"positive",getNegativeResponse:"negative",responseProps:"responseOptions",middleware:"handler"},b={fnMethod:null},n=(s,t)=>typeof s=="string"&&s in t,v=c.ESLintUtils.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",remove:"Remove {{subject}} {{name}}."}},defaultOptions:[],create:s=>({ImportDeclaration:t=>{if(t.source.value===l){for(let e of t.specifiers)if(e.type==="ImportSpecifier"&&n(e.imported.name,a)){let r=a[e.imported.name];s.report({node:e.imported,messageId:"change",data:{subject:"import",from:e.imported.name,to:r},fix:i=>i.replaceText(e,r)})}}},CallExpression:t=>{if(t.callee.type==="Identifier"&&n(t.callee.name,a)){let e=`new ${a[t.callee.name]}`;s.report({node:t.callee,messageId:"change",data:{subject:"call",from:t.callee.name,to:e},fix:r=>r.replaceText(t.callee,e)})}if(t.callee.type==="Identifier"&&t.callee.name===h&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"){if(n(e.key.name,p)){let r=p[e.key.name];s.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:r},fix:i=>i.replaceText(e.key,r)})}n(e.key.name,b)&&s.report({node:e,messageId:"remove",data:{subject:"property",name:e.key.name},fix:r=>s.sourceCode.getTokenAfter(e)?.value===","&&e.range?r.removeRange([e.range[0],e.range[1]+1]):r.remove(e)})}}},NewExpression:t=>{if(t.callee.type==="Identifier"&&[a.createResultHandler,a.createMiddleware].includes(t.callee.name)&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"&&n(e.key.name,p)){let r=p[e.key.name];s.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:r},fix:i=>i.replaceText(e.key,r)})}}},Identifier:t=>{t.name==="MockOverrides"&&t.parent.type==="TSInterfaceDeclaration"&&s.report({node:t,messageId:"remove",data:{subject:"augmentation",name:t.name},fix:e=>e.remove(t.parent)})}})}),k={rules:{v20:v}};
@@ -1 +1 @@
1
- import{ESLintUtils as c}from"@typescript-eslint/utils";var p="express-zod-api";var d="testEndpoint",i={createLogger:"BuiltinLogger",createResultHandler:"ResultHandler",createMiddleware:"Middleware"},o={getPositiveResponse:"positive",getNegativeResponse:"negative",responseProps:"responseOptions",middleware:"handler"},m={fnMethod:null},a=(r,t)=>typeof r=="string"&&r in t,u=c.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",remove:"Remove {{subject}} {{name}}."}},defaultOptions:[],create:r=>({ImportDeclaration:t=>{if(t.source.value===p){for(let e of t.specifiers)if(e.type==="ImportSpecifier"&&a(e.imported.name,i)){let s=i[e.imported.name];r.report({node:e.imported,messageId:"change",data:{subject:"import",from:e.imported.name,to:s},fix:n=>n.replaceText(e,s)})}}},CallExpression:t=>{if(t.callee.type==="Identifier"&&a(t.callee.name,i)){let e=`new ${i[t.callee.name]}`;r.report({node:t.callee,messageId:"change",data:{subject:"call",from:t.callee.name,to:e},fix:s=>s.replaceText(t.callee,e)})}if(t.callee.type==="Identifier"&&t.callee.name===d&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"){if(a(e.key.name,o)){let s=o[e.key.name];r.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:s},fix:n=>n.replaceText(e.key,s)})}a(e.key.name,m)&&r.report({node:e,messageId:"remove",data:{subject:"property",name:e.key.name},fix:s=>r.sourceCode.getTokenAfter(e)?.value===","&&e.range?s.removeRange([e.range[0],e.range[1]+1]):s.remove(e)})}}},NewExpression:t=>{if(t.callee.type==="Identifier"&&[i.createResultHandler,i.createMiddleware].includes(t.callee.name)&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"&&a(e.key.name,o)){let s=o[e.key.name];r.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:s},fix:n=>n.replaceText(e.key,s)})}}},Identifier:t=>{t.name==="MockOverrides"&&t.parent.type==="TSInterfaceDeclaration"&&r.report({node:t,messageId:"remove",data:{subject:"augmentation",name:t.name},fix:e=>e.remove(t.parent)})}})}),x={rules:{v20:u}};export{x as default};
1
+ import{ESLintUtils as c}from"@typescript-eslint/utils";var o="express-zod-api";var d="testEndpoint",i={createLogger:"BuiltinLogger",createResultHandler:"ResultHandler",createMiddleware:"Middleware"},p={getPositiveResponse:"positive",getNegativeResponse:"negative",responseProps:"responseOptions",middleware:"handler"},m={fnMethod:null},n=(r,t)=>typeof r=="string"&&r in t,u=c.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",remove:"Remove {{subject}} {{name}}."}},defaultOptions:[],create:r=>({ImportDeclaration:t=>{if(t.source.value===o){for(let e of t.specifiers)if(e.type==="ImportSpecifier"&&n(e.imported.name,i)){let s=i[e.imported.name];r.report({node:e.imported,messageId:"change",data:{subject:"import",from:e.imported.name,to:s},fix:a=>a.replaceText(e,s)})}}},CallExpression:t=>{if(t.callee.type==="Identifier"&&n(t.callee.name,i)){let e=`new ${i[t.callee.name]}`;r.report({node:t.callee,messageId:"change",data:{subject:"call",from:t.callee.name,to:e},fix:s=>s.replaceText(t.callee,e)})}if(t.callee.type==="Identifier"&&t.callee.name===d&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"){if(n(e.key.name,p)){let s=p[e.key.name];r.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:s},fix:a=>a.replaceText(e.key,s)})}n(e.key.name,m)&&r.report({node:e,messageId:"remove",data:{subject:"property",name:e.key.name},fix:s=>r.sourceCode.getTokenAfter(e)?.value===","&&e.range?s.removeRange([e.range[0],e.range[1]+1]):s.remove(e)})}}},NewExpression:t=>{if(t.callee.type==="Identifier"&&[i.createResultHandler,i.createMiddleware].includes(t.callee.name)&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"&&n(e.key.name,p)){let s=p[e.key.name];r.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:s},fix:a=>a.replaceText(e.key,s)})}}},Identifier:t=>{t.name==="MockOverrides"&&t.parent.type==="TSInterfaceDeclaration"&&r.report({node:t,messageId:"remove",data:{subject:"augmentation",name:t.name},fix:e=>e.remove(t.parent)})}})}),x={rules:{v20:u}};export{x as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "20.9.2",
3
+ "version": "20.10.0",
4
4
  "description": "A Typescript library to help you get an API server up and running with I/O schema validation and custom middlewares in minutes.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -17,6 +17,7 @@
17
17
  "url": "https://github.com/RobinTail/express-zod-api/issues"
18
18
  },
19
19
  "scripts": {
20
+ "postinstall": "npx patch-package",
20
21
  "start": "tsx example/index.ts",
21
22
  "build": "yarn build:compile && yarn build:tests && yarn build:assets",
22
23
  "build:compile": "tsup && attw --pack",
@@ -88,7 +89,7 @@
88
89
  "@types/express-fileupload": "^1.5.0",
89
90
  "@types/http-errors": "^2.0.2",
90
91
  "compression": "^1.7.4",
91
- "express": "^4.19.2",
92
+ "express": "^4.18.2 || ^5.0.0",
92
93
  "express-fileupload": "^1.5.0",
93
94
  "http-errors": "^2.0.0",
94
95
  "typescript": "^5.1.3",
@@ -139,7 +140,7 @@
139
140
  "eslint-plugin-allowed-dependencies": "^1.0.0",
140
141
  "eslint-plugin-prettier": "^5.1.3",
141
142
  "eslint-plugin-unicorn": "^55.0.0",
142
- "express": "^4.19.2",
143
+ "express": "^5.0.0",
143
144
  "express-fileupload": "^1.5.0",
144
145
  "globals": "^15.3.0",
145
146
  "http-errors": "^2.0.0",