express-zod-api 20.0.1 → 20.1.0-beta.2

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,34 @@
2
2
 
3
3
  ## Version 20
4
4
 
5
+ ### v20.1.0
6
+
7
+ - Feature: Top level transformations support and object schema remapping:
8
+ - This can enable having `snake_case` API parameters while keeping `camelCase` naming in your implementation;
9
+ - You can `.transform()` the entire `input` schema into another object, using a well-typed mapping library;
10
+ - You can do the same with the `output` schema, but that would not be enough for generating a valid documentation;
11
+ - The library offers a new `.remap()` method on the `z.object()` schema that applies a `.pipe()` to transformation;
12
+ - Currently `.remap()` requires an assignment of all the object props explicitly, but it may be improved later;
13
+ - Find more details [in the documentation](README.md#top-level-transformations-and-mapping);
14
+ - The feature suggested by [Peter Rottmann](https://github.com/rottmann).
15
+
16
+ ```ts
17
+ import camelize from "camelize-ts";
18
+ import { z } from "zod";
19
+
20
+ const endpoint = endpointsFactory.build({
21
+ method: "get",
22
+ input: z
23
+ .object({ user_id: z.string() })
24
+ .transform((inputs) => camelize(inputs)),
25
+ output: z.object({ userName: z.string() }).remap({ userName: "user_name" }),
26
+ handler: async ({ input: { userId }, logger }) => {
27
+ logger.debug("user_id became userId", userId);
28
+ return { userName: "Agneta" }; // becomes "user_name" in response
29
+ },
30
+ });
31
+ ```
32
+
5
33
  ### v20.0.1
6
34
 
7
35
  - Found a better method for asserting the expected response: `responseMock._getJSONData()`.
package/README.md CHANGED
@@ -31,12 +31,13 @@ Start your API server with I/O schema validation and custom middlewares in minut
31
31
  3. [Using native express middlewares](#using-native-express-middlewares)
32
32
  4. [Refinements](#refinements)
33
33
  5. [Transformations](#transformations)
34
- 6. [Dealing with dates](#dealing-with-dates)
35
- 7. [Cross-Origin Resource Sharing](#cross-origin-resource-sharing) (CORS)
36
- 8. [Enabling HTTPS](#enabling-https)
37
- 9. [Customizing logger](#customizing-logger)
38
- 10. [Child logger](#child-logger)
39
- 11. [Enabling compression](#enabling-compression)
34
+ 6. [Top level transformations and mapping](#top-level-transformations-and-mapping)
35
+ 7. [Dealing with dates](#dealing-with-dates)
36
+ 8. [Cross-Origin Resource Sharing](#cross-origin-resource-sharing) (CORS)
37
+ 9. [Enabling HTTPS](#enabling-https)
38
+ 10. [Customizing logger](#customizing-logger)
39
+ 11. [Child logger](#child-logger)
40
+ 12. [Enabling compression](#enabling-compression)
40
41
  5. [Advanced features](#advanced-features)
41
42
  1. [Customizing input sources](#customizing-input-sources)
42
43
  2. [Route path params](#route-path-params)
@@ -421,9 +422,6 @@ const getUserEndpoint = endpointsFactory.build({
421
422
  .string()
422
423
  .transform((ids) => ids.split(",").map((id) => parseInt(id, 10))),
423
424
  }),
424
- output: z.object({
425
- /* ... */
426
- }),
427
425
  handler: async ({ input: { id, ids }, logger }) => {
428
426
  logger.debug("id", id); // type: number
429
427
  logger.debug("ids", ids); // type: number[]
@@ -431,6 +429,44 @@ const getUserEndpoint = endpointsFactory.build({
431
429
  });
432
430
  ```
433
431
 
432
+ ## Top level transformations and mapping
433
+
434
+ For some APIs it may be important that public interfaces such as query parameters use snake case, while the
435
+ implementation itself requires camel case for constants and their properties. Since version 20.1.0 the library offers
436
+ several ways to facilitate interoperability between the different naming standards. The first thing to note is that you
437
+ can transform the entire `input` schema into another object using a well-typed mapping library.
438
+
439
+ ```ts
440
+ import camelize from "camelize-ts";
441
+ import { z } from "zod";
442
+
443
+ const endpoint = endpointsFactory.build({
444
+ method: "get",
445
+ input: z
446
+ .object({ user_id: z.string() })
447
+ .transform((inputs) => camelize(inputs)),
448
+ handler: async ({ input: { userId }, logger }) => {
449
+ logger.debug("user_id became userId", userId);
450
+ },
451
+ });
452
+ ```
453
+
454
+ Of course, you can do the same with the `output` schema, but that would not be enough to
455
+ [generate a valid documentation](#creating-a-documentation), because the transformations themselves do not contain the
456
+ schemas on which the documentation is based. In this case, the library offers the `remap()` method of the object schema,
457
+ a part of the [Zod plugin](#zod-plugin), which under the hood, in addition to the transformation, also pipes the result
458
+ into a new transformed object schema.
459
+
460
+ ```ts
461
+ import { z } from "zod";
462
+
463
+ const endpoint = endpointsFactory.build({
464
+ method: "get",
465
+ output: z.object({ userName: z.string() }).remap({ userName: "user_name" }),
466
+ handler: async () => ({ userName: "Agneta" }), // becomes "user_name" in response
467
+ });
468
+ ```
469
+
434
470
  ## Dealing with dates
435
471
 
436
472
  Dates in Javascript are one of the most troublesome entities. In addition, `Date` cannot be passed directly in JSON
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
- "use strict";var Co=Object.create;var Qe=Object.defineProperty;var zo=Object.getOwnPropertyDescriptor;var wo=Object.getOwnPropertyNames;var Zo=Object.getPrototypeOf,Eo=Object.prototype.hasOwnProperty;var vo=(e,t)=>{for(var r in t)Qe(e,r,{get:t[r],enumerable:!0})},rr=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of wo(t))!Eo.call(e,i)&&i!==r&&Qe(e,i,{get:()=>t[i],enumerable:!(o=zo(t,i))||o.enumerable});return e};var O=(e,t,r)=>(r=e!=null?Co(Zo(e)):{},rr(t||!e||!e.__esModule?Qe(r,"default",{value:e,enumerable:!0}):r,e)),Lo=e=>rr(Qe({},"__esModule",{value:!0}),e);var pi={};vo(pi,{BuiltinLogger:()=>Se,DependsOnMethod:()=>Oe,Documentation:()=>ut,DocumentationError:()=>P,EndpointsFactory:()=>be,InputValidationError:()=>M,Integration:()=>Tt,Middleware:()=>B,MissingPeerError:()=>le,OutputValidationError:()=>Y,ResultHandler:()=>he,RoutingError:()=>re,ServeStatic:()=>Ae,arrayEndpointsFactory:()=>zr,arrayResultHandler:()=>pt,attachRouting:()=>Fr,createConfig:()=>cr,createServer:()=>Kr,defaultEndpointsFactory:()=>Cr,defaultResultHandler:()=>xe,ez:()=>Po,getExamples:()=>F,getMessageFromError:()=>D,getStatusCodeFromError:()=>Me,testEndpoint:()=>lo});module.exports=Lo(pi);var pr=require("ramda"),He=require("zod");var or=require("http-errors"),nr=require("crypto"),me=require("ramda"),ir=require("zod");var re=class extends Error{name="RoutingError"},P=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:i}){let s=`${t}
2
- Caused by ${i?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},_=class extends Error{name="IOSchemaError"},Y=class extends _{name="OutputValidationError";originalError;constructor(t){super(D(t)),this.originalError=t}},M=class extends _{name="InputValidationError";originalError;constructor(t){super(D(t)),this.originalError=t}},Q=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},le=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var z={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var No=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(z.upload);return"files"in e&&r},Ot={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},jo=["body","query","params"],Rt=e=>e.method.toLowerCase(),At=e=>e.startsWith("x-"),ko=e=>(0,me.pickBy)((0,me.flip)(At),e),sr=(e,t={})=>{let r=Rt(e);return r==="options"?{}:(t[r]||Ot[r]||jo).filter(o=>o==="files"?No(e):!0).map(o=>o==="headers"?ko(e[o]):e[o]).reduce((o,i)=>({...o,...i}),{})},ue=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),D=e=>e instanceof ir.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof Y?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Me=e=>(0,or.isHttpError)(e)?e.statusCode:e instanceof M?400:500,Pt=({logger:e,request:t,input:r,error:o,statusCode:i})=>{i===500&&e.error(`Internal server error
1
+ "use strict";var Oo=Object.create;var Qe=Object.defineProperty;var Ro=Object.getOwnPropertyDescriptor;var Ao=Object.getOwnPropertyNames;var Po=Object.getPrototypeOf,Io=Object.prototype.hasOwnProperty;var Co=(e,t)=>{for(var r in t)Qe(e,r,{get:t[r],enumerable:!0})},tr=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ao(t))!Io.call(e,i)&&i!==r&&Qe(e,i,{get:()=>t[i],enumerable:!(o=Ro(t,i))||o.enumerable});return e};var R=(e,t,r)=>(r=e!=null?Oo(Po(e)):{},tr(t||!e||!e.__esModule?Qe(r,"default",{value:e,enumerable:!0}):r,e)),zo=e=>tr(Qe({},"__esModule",{value:!0}),e);var ii={};Co(ii,{BuiltinLogger:()=>Re,DependsOnMethod:()=>Ae,Documentation:()=>mt,DocumentationError:()=>z,EndpointsFactory:()=>Se,InputValidationError:()=>U,Integration:()=>bt,Middleware:()=>q,MissingPeerError:()=>ue,OutputValidationError:()=>_,ResultHandler:()=>be,RoutingError:()=>re,ServeStatic:()=>Ie,arrayEndpointsFactory:()=>Rr,arrayResultHandler:()=>at,attachRouting:()=>kr,createConfig:()=>ar,createServer:()=>Mr,defaultEndpointsFactory:()=>Or,defaultResultHandler:()=>Te,ez:()=>To,getExamples:()=>K,getMessageFromError:()=>F,getStatusCodeFromError:()=>Ue,testEndpoint:()=>io});module.exports=zo(ii);var O=require("ramda"),ne=require("zod");var rr=require("http-errors"),or=require("crypto"),fe=require("ramda"),nr=require("zod");var re=class extends Error{name="RoutingError"},z=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:i}){let s=`${t}
2
+ Caused by ${i?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},Je=class extends Error{name="IOSchemaError"},_=class extends Je{name="OutputValidationError";originalError;constructor(t){super(F(t)),this.originalError=t}},U=class extends Je{name="InputValidationError";originalError;constructor(t){super(F(t)),this.originalError=t}},Y=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},ue=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var w={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var wo=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(w.upload);return"files"in e&&r},St={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Zo=["body","query","params"],Ot=e=>e.method.toLowerCase(),Rt=e=>e.startsWith("x-"),Eo=e=>(0,fe.pickBy)((0,fe.flip)(Rt),e),ir=(e,t={})=>{let r=Ot(e);return r==="options"?{}:(t[r]||St[r]||Zo).filter(o=>o==="files"?wo(e):!0).map(o=>o==="headers"?Eo(e[o]):e[o]).reduce((o,i)=>({...o,...i}),{})},ye=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),F=e=>e instanceof nr.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof _?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Ue=e=>(0,rr.isHttpError)(e)?e.statusCode:e instanceof U?400:500,At=({logger:e,request:t,input:r,error:o,statusCode:i})=>{i===500&&e.error(`Internal server error
3
3
  ${o.stack}
4
- `,{url:t.url,payload:r})},F=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[g]?.examples||[];if(!r&&t==="original")return o;let i=[];for(let s of o){let a=e.safeParse(s);a.success&&i.push(t==="parsed"?a.data:s)}return i},oe=(e,t,r)=>e.length&&t.length?(0,me.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(),N=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(It).join(""),Je=e=>(0,nr.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),We=(e,t)=>{try{return typeof e.parse(t)}catch{return}},K=e=>typeof e=="object"&&e!==null;var Xe=require("ramda"),g=Symbol.for("express-zod-api"),et=e=>{let t=e.describe(e.description);return t._def[g]=(0,Xe.clone)(t._def[g])||{examples:[]},t},ar=(e,t)=>{if(!(g in e._def))return t;let r=et(t);return r._def[g].examples=oe(r._def[g].examples,e._def[g].examples,([o,i])=>typeof o=="object"&&typeof i=="object"?(0,Xe.mergeDeepRight)({...o},{...i}):i),r};var Mo=function(e){let t=et(this);return t._def[g].examples.push(e),t},Uo=function(e){let t=et(this);return t._def[g].defaultLabel=e,t},Ho=function(e){return new He.z.ZodBranded({typeName:He.z.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[g]:{examples:[],...(0,pr.clone)(this._def[g]),brand:e}})};g in globalThis||(globalThis[g]=!0,Object.defineProperties(He.z.ZodType.prototype,{example:{get(){return Mo.bind(this)}},brand:{set(){},get(){return Ho.bind(this)}}}),Object.defineProperty(He.z.ZodDefault.prototype,"label",{get(){return Uo.bind(this)}}));function cr(e){return e}var Ir=require("zod");var Or=O(require("assert/strict"),1),vt=require("zod");var gr=require("zod");var lr=require("zod");var De=require("zod"),J=Symbol("File"),dr=De.z.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),Do={buffer:()=>dr.brand(J),string:()=>De.z.string().brand(J),binary:()=>dr.or(De.z.string()).brand(J),base64:()=>De.z.string().base64().brand(J)};function tt(e){return Do[e||"string"]()}var ne=Symbol("Raw"),mr=(e={})=>lr.z.object({raw:tt("buffer")}).extend(e).brand(ne);var ur=require("zod"),Fe=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(Fe);var Ct=(e,{next:t})=>e.options.some(t),hr=({_def:e},{next:t})=>[e.left,e.right].some(t),yr=(e,{next:t})=>t(e.unwrap()),Fo={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:Ct,ZodDiscriminatedUnion:Ct,ZodIntersection:hr,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:yr,ZodNullable:yr,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},rt=(e,{condition:t,rules:r=Fo,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=>rt(a,{condition:t,rules:r,maxDepth:i,depth:o+1})}):!1},ot=e=>rt(e,{maxDepth:3,rules:{ZodUnion:Ct,ZodIntersection:hr},condition:t=>t instanceof gr.z.ZodEffects&&t._def.effect.type!=="refinement"}),xr=e=>rt(e,{condition:t=>t._def[g]?.brand===Fe}),br=e=>rt(e,{condition:t=>t._def[g]?.brand===ne,maxDepth:3});var nt=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
- Original error: ${e.originalError.message}.`:""))};var Tr=require("ramda");var ie=e=>K(e)&&"or"in e,ye=e=>K(e)&&"and"in e,zt=e=>({and:(0,Tr.chain)(t=>ye(t)?t.and:[t],e)}),it=(e,t)=>ye(e)?{and:e.and.map(r=>ie(r)?{or:r.or.map(t)}:t(r))}:ie(e)?{or:e.or.map(r=>ye(r)?{and:r.and.map(t)}:t(r))}:t(e),wt=e=>e.and.reduce((t,r)=>({or:oe(t.or,ie(r)?r.or:[r],zt)}),{or:[]}),fe=(e,t)=>ye(e)?ie(t)?fe(wt(e),t):zt([e,t]):ie(e)?ye(t)?fe(t,e):ie(t)?{or:oe(e.or,t.or,zt)}:fe(e,{and:[t]}):ye(t)||ie(t)?fe(t,e):{and:[e,t]};var Et=require("zod");var Sr=O(require("assert/strict"),1),Zt=class{},B=class extends Zt{#e;#t;#r;constructor({input:t,security:r,handler:o}){super(),(0,Sr.default)(!ot(t),new _("Using transformations on the top level of middleware input schema is not allowed.")),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 Et.z.ZodError?new M(o):o}}},ge=class extends B{constructor(t,{provider:r=()=>({}),transformer:o=i=>i}={}){super({input:Et.z.object({}),handler:async({request:i,response:s})=>new Promise((a,p)=>{t(i,s,l=>{if(l&&l instanceof Error)return p(o(l));a(r(i,s))})})})}};var Ke=class{},st=class extends Ke{#e;#t;#r;#s;#n;#a;#p;#o;#c;#d;#l;#i;constructor({methods:t,inputSchema:r,outputSchema:o,handler:i,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:l=[],description:m,shortDescription:y}){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(l),this.#e={long:m,short:y},this.#o={input:r,output:o};for(let[f,b]of Object.entries(this.#o))(0,Or.default)(!ot(b),new _(`Using transformations on the top level of endpoint ${f} schema is not allowed.`));this.#n={positive:Object.freeze(s.getPositiveResponse(o)),negative:Object.freeze(s.getNegativeResponse())},this.#i=xr(r)?"upload":br(r)?"raw":"json",this.#s={input:Object.freeze([z[this.#i]]),positive:Object.freeze(this.#n.positive.flatMap(({mimeTypes:f})=>f)),negative:Object.freeze(this.#n.negative.flatMap(({mimeTypes:f})=>f))}}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return t==="input"||t==="output"?this.#o[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.#n[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?fe(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.#o.output.parseAsync(t)}catch(r){throw r instanceof vt.z.ZodError?new Y(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 ge))&&(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.#o.input.parseAsync(t)}catch(s){throw s instanceof vt.z.ZodError?new M(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){nt({logger:i,response:o,error:new Q(ue(d).message,t)})}}async execute({request:t,response:r,logger:o,config:i,siblingMethods:s=[]}){let a=Rt(t),p={},d=null,l=null;if(i.cors){let y=this.#m(s);typeof i.cors=="function"&&(y=await i.cors({request:t,logger:o,endpoint:this,defaultHeaders:y}));for(let f in y)r.set(f,y[f])}let m=sr(t,i.inputSources);try{if(await this.#f({method:a,input:m,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}d=await this.#u(await this.#y({input:m,logger:o,options:p}))}catch(y){l=ue(y)}await this.#g({input:m,output:d,request:t,response:r,error:l,logger:o,options:p})}};var Rr=(e,t)=>{let r=e.map(i=>i.getSchema()).concat(t),o=r.reduce((i,s)=>i.and(s));return r.reduce((i,s)=>ar(s,i),o)};var j=require("zod");var Be={positive:200,negative:400};var Ar=O(require("assert/strict"),1),Pr=require("zod");var at=(e,t)=>typeof e=="function"?at(e(...t.arguments),t):e instanceof Pr.z.ZodType?[{...t,schema:e}]:(Array.isArray(e)&&(0,Ar.default)(e.length,new Q(`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 Lt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},he=class extends Lt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return at(this.#e,{variant:"positive",arguments:[t],statusCodes:[Be.positive],mimeTypes:[z.json]})}getNegativeResponse(){return at(this.#t,{variant:"negative",arguments:[],statusCodes:[Be.negative],mimeTypes:[z.json]})}},xe=new he({positive:e=>{let t=F({schema:e}),r=j.z.object({status:j.z.literal("success"),data:e});return t.reduce((o,i)=>o.example({status:"success",data:i}),r)},negative:j.z.object({status:j.z.literal("error"),error:j.z.object({message:j.z.string()})}).example({status:"error",error:{message:D(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:i,logger:s})=>{if(!e){i.status(Be.positive).json({status:"success",data:r});return}let a=Me(e);Pt({logger:s,statusCode:a,request:o,error:e,input:t}),i.status(a).json({status:"error",error:{message:D(e)}})}}),pt=new he({positive:e=>{let t=F({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof j.z.ZodArray?e.shape.items:j.z.array(j.z.any());return t.reduce((o,i)=>K(i)&&"items"in i&&Array.isArray(i.items)?o.example(i.items):o,r)},negative:j.z.string().example(D(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:i,input:s})=>{if(r){let a=Me(r);Pt({logger:o,statusCode:a,request:i,error:r,input:s}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(Be.positive).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}});var be=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 ge(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new B({input:Ir.z.object({}),handler:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:i,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:l}=this,m="methods"in p?p.methods:[p.method],y=typeof a=="function"?a:()=>a,f="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],b="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new st({handler:r,middlewares:d,outputSchema:o,resultHandler:l,scopes:f,tags:b,methods:m,getOperationId:y,description:i,shortDescription:s,inputSchema:Rr(d,t)})}},Cr=new be(xe),zr=new be(pt);var w=require("ansis"),Zr=require("util");var Te={debug:10,info:20,warn:30,error:40},wr=e=>K(e)&&Object.keys(Te).some(t=>t in e);var Se=class e{constructor(t){this.config=t;let{color:r=new w.Ansis().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:w.blue,info:w.green,warn:(0,w.hex)("#FFA500"),error:w.red};prettyPrint(t){let{depth:r=2}=this.config;return(0,Zr.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"||Te[t]<Te[this.config.level])return;let{requestId:i,...s}=this.config.ctx||{},a=[new Date().toISOString()];i&&a.push(this.hasColor?(0,w.cyanBright)(i):i),a.push(this.hasColor?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&a.push(this.prettyPrint(o)),Object.keys(s).length>0&&a.push(this.prettyPrint(s)),console.log(a.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}};var Re=require("ramda"),Oe=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze((0,Re.toPairs)(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=(0,Re.head)(this.pairs)?.[1],this.siblingMethods=Object.freeze((0,Re.tail)(this.pairs).map(([r])=>r))}};var Er=O(require("express"),1),Ae=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Er.default.static(...this.params))}};var ct=O(require("express"),1),Ur=O(require("http"),1),Hr=O(require("https"),1);var Pe=async(e,t="default")=>{try{return(await Promise.resolve().then(()=>O(require(e))))[t]}catch{}throw new le(e)};var Nt=O(require("assert/strict"),1);var se=({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){Nt.default.doesNotMatch(a,/\//,new re(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let d=`${o||""}${a?`/${a}`:""}`;if(p instanceof Ke){let l=p.getMethods().slice();i&&l.push("options");for(let m of l)t(p,d,m)}else if(p instanceof Ae)r&&p.apply(d,r);else if(p instanceof Oe){for(let[l,m]of p.pairs)(0,Nt.default)(m.getMethods().includes(l),new re(`Endpoint assigned to ${l} method of ${d} must support ${l} method.`)),t(m,d,l);i&&p.firstEndpoint&&t(p.firstEndpoint,d,"options",p.siblingMethods)}else se({onEndpoint:t,onStatic:r,hasCors:i,routing:p,parentPath:d})}};var jt=({app:e,rootLogger:t,config:r,routing:o,parsers:i})=>se({routing:o,hasCors:!!r.cors,onEndpoint:(s,a,p,d)=>{e[p](a,...i?.[s.getRequestType()]||[],async(l,m)=>s.execute({request:l,response:m,logger:m.locals[g]?.logger||t,config:r,siblingMethods:d}))},onStatic:(s,a)=>{e.use(s,a)}});var qe=O(require("http-errors"),1);var vr=({errorHandler:e,rootLogger:t})=>async(r,o,i,s)=>{if(!r)return s();e.execute({error:(0,qe.isHttpError)(r)?r:(0,qe.default)(400,ue(r).message),request:o,response:i,input:null,output:null,options:{},logger:i.locals[g]?.logger||t})},Lr=({errorHandler:e,rootLogger:t})=>async(r,o)=>{let i=(0,qe.default)(404,`Can not ${r.method} ${r.path}`),s=o.locals[g]?.logger||t;try{e.execute({request:r,response:o,logger:s,error:i,input:null,output:null,options:{}})}catch(a){nt({response:o,logger:s,error:new Q(ue(a).message,i)})}},Ko=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:i})=>i))return r(e);r()},Bo=e=>({log:e.debug.bind(e)}),Nr=async({rootLogger:e,config:t})=>{let r=await Pe("express-fileupload"),{limitError:o,beforeUpload:i,...s}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,d,l)=>{let m=d.locals[g]?.logger||e;try{await i?.({request:p,logger:m})}catch(y){return l(y)}r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Bo(m)})(p,d,l)}),o&&a.push(Ko(o)),a},jr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},kr=({rootLogger:e,config:t})=>async(r,o,i)=>{let s=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;s.debug(`${r.method}: ${r.path}`),o.locals[g]={logger:s},i()};var Z=require("ansis"),Mr=()=>{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)),i=(0,Z.hex)("#F5A9B8"),s=(0,Z.hex)("#5BCEFA"),a=new Array(14).fill(s,1,3).fill(i,3,5).fill(Z.whiteBright,5,7).fill(i,7,9).fill(s,9,12).fill(Z.gray,12,13);return`
4
+ `,{url:t.url,payload:r})},K=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[g]?.examples||[];if(!r&&t==="original")return o;let i=[];for(let s of o){let a=e.safeParse(s);a.success&&i.push(t==="parsed"?a.data:s)}return i},oe=(e,t,r)=>e.length&&t.length?(0,fe.xprod)(e,t).map(r):e.concat(t),He=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,Pt=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(Pt).join(""),We=e=>(0,or.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Xe=(e,t)=>{try{return typeof e.parse(t)}catch{return}},B=e=>typeof e=="object"&&e!==null;var et=require("ramda"),g=Symbol.for("express-zod-api"),tt=e=>{let t=e.describe(e.description);return t._def[g]=(0,et.clone)(t._def[g])||{examples:[]},t},sr=(e,t)=>{if(!(g in e._def))return t;let r=tt(t);return r._def[g].examples=oe(r._def[g].examples,e._def[g].examples,([o,i])=>typeof o=="object"&&typeof i=="object"?(0,et.mergeDeepRight)({...o},{...i}):i),r};var jo=function(e){let t=tt(this);return t._def[g].examples.push(e),t},Lo=function(e){let t=tt(this);return t._def[g].defaultLabel=e,t},No=function(e){return new ne.z.ZodBranded({typeName:ne.z.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[g]:{examples:[],...(0,O.clone)(this._def[g]),brand:e}})},vo=function(e){return this.transform((0,O.pipe)(O.toPairs,(0,O.map)(([t,r])=>(0,O.pair)(e[t],r)),O.fromPairs)).pipe(ne.z.object((0,O.pipe)(O.toPairs,(0,O.map)(([t,r])=>(0,O.pair)(e[String(t)],r)),O.fromPairs)((0,O.clone)(this.shape))))};g in globalThis||(globalThis[g]=!0,Object.defineProperties(ne.z.ZodType.prototype,{example:{get(){return jo.bind(this)}},brand:{set(){},get(){return No.bind(this)}}}),Object.defineProperty(ne.z.ZodDefault.prototype,"label",{get(){return Lo.bind(this)}}),Object.defineProperty(ne.z.ZodObject.prototype,"remap",{get(){return vo.bind(this)}}));function ar(e){return e}var Sr=require("zod");var Et=require("zod");var cr=require("zod");var De=require("zod"),Q=Symbol("File"),pr=De.z.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),ko={buffer:()=>pr.brand(Q),string:()=>De.z.string().brand(Q),binary:()=>pr.or(De.z.string()).brand(Q),base64:()=>De.z.string().base64().brand(Q)};function rt(e){return ko[e||"string"]()}var ie=Symbol("Raw"),dr=(e={})=>cr.z.object({raw:rt("buffer")}).extend(e).brand(ie);var lr=require("zod"),Fe=Symbol("Upload"),mr=()=>lr.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(Fe);var ur=(e,{next:t})=>e.options.some(t),Mo=({_def:e},{next:t})=>[e.left,e.right].some(t),fr=(e,{next:t})=>t(e.unwrap()),Uo={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:ur,ZodDiscriminatedUnion:ur,ZodIntersection:Mo,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:fr,ZodNullable:fr,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},It=(e,{condition:t,rules:r=Uo,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=>It(a,{condition:t,rules:r,maxDepth:i,depth:o+1})}):!1},yr=e=>It(e,{condition:t=>t._def[g]?.brand===Fe}),gr=e=>It(e,{condition:t=>t._def[g]?.brand===ie,maxDepth:3});var ot=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
+ Original error: ${e.originalError.message}.`:""))};var hr=require("ramda");var se=e=>B(e)&&"or"in e,he=e=>B(e)&&"and"in e,Ct=e=>({and:(0,hr.chain)(t=>he(t)?t.and:[t],e)}),nt=(e,t)=>he(e)?{and:e.and.map(r=>se(r)?{or:r.or.map(t)}:t(r))}:se(e)?{or:e.or.map(r=>he(r)?{and:r.and.map(t)}:t(r))}:t(e),zt=e=>e.and.reduce((t,r)=>({or:oe(t.or,se(r)?r.or:[r],Ct)}),{or:[]}),ge=(e,t)=>he(e)?se(t)?ge(zt(e),t):Ct([e,t]):se(e)?he(t)?ge(t,e):se(t)?{or:oe(e.or,t.or,Ct)}:ge(e,{and:[t]}):he(t)||se(t)?ge(t,e):{and:[e,t]};var Zt=require("zod");var wt=class{},q=class extends wt{#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 Zt.z.ZodError?new U(o):o}}},xe=class extends q{constructor(t,{provider:r=()=>({}),transformer:o=i=>i}={}){super({input:Zt.z.object({}),handler:async({request:i,response:s})=>new Promise((a,p)=>{t(i,s,l=>{if(l&&l instanceof Error)return p(o(l));a(r(i,s))})})})}};var Ke=class{},it=class extends Ke{#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:l=[],description:m,shortDescription:y}){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(l),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=yr(r)?"upload":gr(r)?"raw":"json",this.#s={input:Object.freeze([w[this.#i]]),positive:Object.freeze(this.#o.positive.flatMap(({mimeTypes:f})=>f)),negative:Object.freeze(this.#o.negative.flatMap(({mimeTypes:f})=>f))}}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?ge(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 Et.z.ZodError?new _(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 xe))&&(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 Et.z.ZodError?new U(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){ot({logger:i,response:o,error:new Y(ye(d).message,t)})}}async execute({request:t,response:r,logger:o,config:i,siblingMethods:s=[]}){let a=Ot(t),p={},d=null,l=null;if(i.cors){let y=this.#m(s);typeof i.cors=="function"&&(y=await i.cors({request:t,logger:o,endpoint:this,defaultHeaders:y}));for(let f in y)r.set(f,y[f])}let m=ir(t,i.inputSources);try{if(await this.#f({method:a,input:m,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}d=await this.#u(await this.#y({input:m,logger:o,options:p}))}catch(y){l=ye(y)}await this.#g({input:m,output:d,request:t,response:r,error:l,logger:o,options:p})}};var xr=(e,t)=>{let r=e.map(i=>i.getSchema()).concat(t),o=r.reduce((i,s)=>i.and(s));return r.reduce((i,s)=>sr(s,i),o)};var k=require("zod");var Be={positive:200,negative:400};var br=R(require("assert/strict"),1),Tr=require("zod");var st=(e,t)=>typeof e=="function"?st(e(...t.arguments),t):e instanceof Tr.z.ZodType?[{...t,schema:e}]:(Array.isArray(e)&&(0,br.default)(e.length,new Y(`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 jt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},be=class extends jt{#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:[Be.positive],mimeTypes:[w.json]})}getNegativeResponse(){return st(this.#t,{variant:"negative",arguments:[],statusCodes:[Be.negative],mimeTypes:[w.json]})}},Te=new be({positive:e=>{let t=K({schema:e}),r=k.z.object({status:k.z.literal("success"),data:e});return t.reduce((o,i)=>o.example({status:"success",data:i}),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:i,logger:s})=>{if(!e){i.status(Be.positive).json({status:"success",data:r});return}let a=Ue(e);At({logger:s,statusCode:a,request:o,error:e,input:t}),i.status(a).json({status:"error",error:{message:F(e)}})}}),at=new be({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,i)=>B(i)&&"items"in i&&Array.isArray(i.items)?o.example(i.items):o,r)},negative:k.z.string().example(F(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:i,input:s})=>{if(r){let a=Ue(r);At({logger:o,statusCode:a,request:i,error:r,input:s}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(Be.positive).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}});var Se=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t instanceof q?t:new q(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new xe(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new q({input:Sr.z.object({}),handler:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:i,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:l}=this,m="methods"in p?p.methods:[p.method],y=typeof a=="function"?a:()=>a,f="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:d,outputSchema:o,resultHandler:l,scopes:f,tags:S,methods:m,getOperationId:y,description:i,shortDescription:s,inputSchema:xr(d,t)})}},Or=new Se(Te),Rr=new Se(at);var Z=require("ansis"),Pr=require("util");var Oe={debug:10,info:20,warn:30,error:40},Ar=e=>B(e)&&Object.keys(Oe).some(t=>t in e);var Re=class e{constructor(t){this.config=t;let{color:r=new Z.Ansis().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:Z.blue,info:Z.green,warn:(0,Z.hex)("#FFA500"),error:Z.red};prettyPrint(t){let{depth:r=2}=this.config;return(0,Pr.inspect)(t,{depth:r,colors:this.hasColor,breakLength:this.config.level==="debug"?80:1/0,compact:this.config.level==="debug"?3:!0})}print(t,r,o){if(this.config.level==="silent"||Oe[t]<Oe[this.config.level])return;let{requestId:i,...s}=this.config.ctx||{},a=[new Date().toISOString()];i&&a.push(this.hasColor?(0,Z.cyanBright)(i):i),a.push(this.hasColor?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&a.push(this.prettyPrint(o)),Object.keys(s).length>0&&a.push(this.prettyPrint(s)),console.log(a.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}};var Pe=require("ramda"),Ae=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze((0,Pe.toPairs)(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=(0,Pe.head)(this.pairs)?.[1],this.siblingMethods=Object.freeze((0,Pe.tail)(this.pairs).map(([r])=>r))}};var Ir=R(require("express"),1),Ie=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Ir.default.static(...this.params))}};var pt=R(require("express"),1),Lr=R(require("http"),1),Nr=R(require("https"),1);var Ce=async(e,t="default")=>{try{return(await Promise.resolve().then(()=>R(require(e))))[t]}catch{}throw new ue(e)};var Lt=R(require("assert/strict"),1);var ae=({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){Lt.default.doesNotMatch(a,/\//,new re(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let d=`${o||""}${a?`/${a}`:""}`;if(p instanceof Ke){let l=p.getMethods().slice();i&&l.push("options");for(let m of l)t(p,d,m)}else if(p instanceof Ie)r&&p.apply(d,r);else if(p instanceof Ae){for(let[l,m]of p.pairs)(0,Lt.default)(m.getMethods().includes(l),new re(`Endpoint assigned to ${l} method of ${d} must support ${l} method.`)),t(m,d,l);i&&p.firstEndpoint&&t(p.firstEndpoint,d,"options",p.siblingMethods)}else ae({onEndpoint:t,onStatic:r,hasCors:i,routing:p,parentPath:d})}};var Nt=({app:e,rootLogger:t,config:r,routing:o,parsers:i})=>ae({routing:o,hasCors:!!r.cors,onEndpoint:(s,a,p,d)=>{e[p](a,...i?.[s.getRequestType()]||[],async(l,m)=>s.execute({request:l,response:m,logger:m.locals[g]?.logger||t,config:r,siblingMethods:d}))},onStatic:(s,a)=>{e.use(s,a)}});var qe=R(require("http-errors"),1);var Cr=({errorHandler:e,rootLogger:t})=>async(r,o,i,s)=>{if(!r)return s();e.execute({error:(0,qe.isHttpError)(r)?r:(0,qe.default)(400,ye(r).message),request:o,response:i,input:null,output:null,options:{},logger:i.locals[g]?.logger||t})},zr=({errorHandler:e,rootLogger:t})=>async(r,o)=>{let i=(0,qe.default)(404,`Can not ${r.method} ${r.path}`),s=o.locals[g]?.logger||t;try{e.execute({request:r,response:o,logger:s,error:i,input:null,output:null,options:{}})}catch(a){ot({response:o,logger:s,error:new Y(ye(a).message,i)})}},Ho=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:i})=>i))return r(e);r()},Do=e=>({log:e.debug.bind(e)}),wr=async({rootLogger:e,config:t})=>{let r=await Ce("express-fileupload"),{limitError:o,beforeUpload:i,...s}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,d,l)=>{let m=d.locals[g]?.logger||e;try{await i?.({request:p,logger:m})}catch(y){return l(y)}r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Do(m)})(p,d,l)}),o&&a.push(Ho(o)),a},Zr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},Er=({rootLogger:e,config:t})=>async(r,o,i)=>{let s=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;s.debug(`${r.method}: ${r.path}`),o.locals[g]={logger:s},i()};var E=require("ansis"),jr=()=>{let e=(0,E.italic)("Proudly supports transgender community.".padStart(109)),t=(0,E.italic)("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=(0,E.italic)("Thank you for choosing Express Zod API for your project.".padStart(132)),o=(0,E.italic)("for Zoey".padEnd(20)),i=(0,E.hex)("#F5A9B8"),s=(0,E.hex)("#5BCEFA"),a=new Array(14).fill(s,1,3).fill(i,3,5).fill(E.whiteBright,5,7).fill(i,7,9).fill(s,9,12).fill(E.gray,12,13);return`
6
6
  8888888888 8888888888P 888 d8888 8888888b. 8888888
7
7
  888 d88P 888 d88888 888 Y88b 888
8
8
  888 d88P 888 d88P888 888 888 888
@@ -17,8 +17,8 @@ ${o}888${t}
17
17
  ${r}
18
18
  `.split(`
19
19
  `).map((d,l)=>a[l]?a[l](d):d).join(`
20
- `)};var Dr=e=>{e.startupLogo!==!1&&console.log(Mr());let t=e.errorHandler||xe,r=wr(e.logger)?e.logger:new Se(e.logger);r.debug("Running","v20.0.1 (CJS)");let o=kr({rootLogger:r,config:e}),i=Lr({rootLogger:r,errorHandler:t}),s=vr({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:i,parserFailureHandler:s,loggingMiddleware:o}},Fr=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:i}=Dr(e);return jt({app:e.app.use(i),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},Kr=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,parserFailureHandler:i,loggingMiddleware:s}=Dr(e),a=(0,ct.default)().disable("x-powered-by").use(s);if(e.server.compression){let m=await Pe("compression");a.use(m(typeof e.server.compression=="object"?e.server.compression:void 0))}let p={json:[e.server.jsonParser||ct.default.json()],raw:[e.server.rawParser||ct.default.raw(),jr],upload:e.server.upload?await Nr({config:e,rootLogger:r}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:a,logger:r}),jt({app:a,routing:t,rootLogger:r,config:e,parsers:p}),a.use(i,o);let d=(m,y)=>m.listen(y,()=>{r.info("Listening",y)}),l={httpServer:d(Ur.default.createServer(a),e.server.listen),httpsServer:e.https?d(Hr.default.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...l,logger:r}};var ao=O(require("assert/strict"),1),po=require("openapi3-ts/oas31"),co=require("ramda");var q=O(require("assert/strict"),1),$=require("openapi3-ts/oas31"),c=require("ramda"),S=require("zod");var Ie=require("zod");var dt=e=>!isNaN(e.getTime());var $e=Symbol("DateIn"),Br=()=>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($e);var qr=require("zod");var Ve=Symbol("DateOut"),$r=()=>qr.z.date().refine(dt).transform(e=>e.toISOString()).brand(Ve);var ae=(e,{onEach:t,rules:r,onMissing:o,ctx:i={}})=>{let s=r[e._def[g]?.brand]||r[e._def.typeName],p=s?s(e,{...i,next:l=>ae(l,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),d=t&&t(e,{prev:p,...i});return d?{...p,...d}:p};var Vr=50,_r="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",qo={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Yr=/:([A-Za-z0-9_]+)/g,$o=e=>e.match(Yr)?.map(t=>t.slice(1))||[],Qr=e=>e.replace(Yr,t=>`{${t.slice(1)}}`),Vo=({_def:e},{next:t})=>({...t(e.innerType),default:e[g]?.defaultLabel||e.defaultValue()}),Go=({_def:{innerType:e}},{next:t})=>t(e),_o=()=>({format:"any"}),Yo=({},e)=>((0,q.default)(!e.isResponse,new P({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),Qo=e=>{let t=e.unwrap();return{type:"string",format:t instanceof S.z.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Jo=({options:e},{next:t})=>({oneOf:e.map(t)}),Wo=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),Xo=e=>{let[t,r]=e.filter($.isSchemaObject).filter(i=>i.type==="object"&&Object.keys(i).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)((i,s)=>Array.isArray(i)&&Array.isArray(s)?(0,c.concat)(i,s):i===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=oe(t.examples||[],r.examples||[],([i,s])=>(0,c.mergeDeepRight)(i,s))),o},en=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Xo(o)}catch{}return{allOf:o}},tn=(e,{next:t})=>t(e.unwrap()),rn=(e,{next:t})=>t(e.unwrap()),on=(e,{next:t})=>{let r=t(e.unwrap());return(0,$.isSchemaObject)(r)&&(r.type=Wr(r)),r},Jr=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},Gr=e=>({type:Jr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),nn=({value:e})=>({type:Jr(e),const:e}),sn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&Ue(p)?p instanceof S.z.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=lt(e,r)),s.length&&(a.required=s),a},an=()=>({type:"null"}),pn=({},e)=>((0,q.default)(!e.isResponse,new P({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:_r}}),cn=({},e)=>((0,q.default)(e.isResponse,new P({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:_r}}),dn=({},e)=>q.default.fail(new P({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),ln=()=>({type:"boolean"}),mn=()=>({type:"integer",format:"bigint"}),un=e=>e.every(t=>t instanceof S.z.ZodLiteral),fn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof S.z.ZodEnum||e instanceof S.z.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=lt(S.z.object((0,c.fromPairs)((0,c.xprod)(o,[t]))),r),i.required=o),i}if(e instanceof S.z.ZodLiteral)return{type:"object",properties:lt(S.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof S.z.ZodUnion&&un(e.options)){let o=(0,c.map)(s=>`${s.value}`,e.options),i=(0,c.fromPairs)((0,c.xprod)(o,[t]));return{type:"object",properties:lt(S.z.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},yn=({_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},gn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),hn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:l,isDatetime:m,_def:{checks:y}})=>{let f=y.find(I=>I.kind==="regex"),b=y.find(I=>I.kind==="datetime"),v=f?f.regex:b?b.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,T={type:"string"},k={"date-time":m,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:d,emoji:l};for(let I in k)if(k[I]){T.format=I;break}return r!==null&&(T.minLength=r),o!==null&&(T.maxLength=o),v&&(T.pattern=v.source),T},xn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let i=o.find(y=>y.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=i?i.inclusive:!0,p=o.find(y=>y.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,l=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=s:m.exclusiveMinimum=s,l?m.maximum=d:m.exclusiveMaximum=d,m},lt=({shape:e},t)=>(0,c.map)(t,e),bn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return qo?.[t]},Wr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},Tn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&(0,$.isSchemaObject)(o)){let s=We(e,bn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(S.z.any())}if(!t&&i.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Sn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),On=(e,{next:t})=>t(e.unwrap()),Rn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},An=(e,{next:t})=>t(e.unwrap().shape.raw),Xr=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,eo=(e,t,r=[])=>(0,c.pipe)(F,(0,c.map)((0,c.when)((0,c.both)(K,(0,c.complement)(Array.isArray)),(0,c.omit)(r))),Xr)({schema:e,variant:t?"parsed":"original",validate:!0}),Pn=(e,t)=>(0,c.pipe)(F,(0,c.filter)((0,c.has)(t)),(0,c.pluck)(t),Xr)({schema:e,variant:"original",validate:!0}),Ce=(e,t)=>e instanceof S.z.ZodObject?e:e instanceof S.z.ZodBranded?Ce(e.unwrap(),t):e instanceof S.z.ZodUnion||e instanceof S.z.ZodDiscriminatedUnion?e.options.map(r=>Ce(r,t)).reduce((r,o)=>r.merge(o.partial()),S.z.object({})):e instanceof S.z.ZodEffects?((0,q.default)(e._def.effect.type==="refinement",t),Ce(e._def.schema,t)):Ce(e._def.left,t).merge(Ce(e._def.right,t)),to=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,description:l=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:m}=Ce(r,new P({message:"Using transformations on the top level schema is not allowed.",path:e,method:t,isResponse:!1})),y=$o(e),f=o.includes("query"),b=o.includes("params"),v=o.includes("headers"),T=x=>b&&y.includes(x),k=x=>v&&At(x);return Object.keys(m).map(x=>({name:x,location:T(x)?"path":k(x)?"header":f?"query":void 0})).filter(x=>x.location!==void 0).map(({name:x,location:Ee})=>{let G=ae(m[x],{rules:{...d,...Mt},onEach:Ut,onMissing:Ht,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),ee=p==="components"?a(N(l,x),G):G;return{name:x,in:Ee,required:!m[x].isOptional(),description:G.description||l,schema:ee,examples:Pn(r,x)}})},Mt={ZodString:hn,ZodNumber:xn,ZodBigInt:mn,ZodBoolean:ln,ZodNull:an,ZodArray:yn,ZodTuple:gn,ZodRecord:fn,ZodObject:sn,ZodLiteral:nn,ZodIntersection:en,ZodUnion:Jo,ZodAny:_o,ZodDefault:Vo,ZodEnum:Gr,ZodNativeEnum:Gr,ZodEffects:Tn,ZodOptional:tn,ZodNullable:on,ZodDiscriminatedUnion:Wo,ZodBranded:On,ZodDate:dn,ZodCatch:Go,ZodPipeline:Sn,ZodLazy:Rn,ZodReadonly:rn,[J]:Qo,[Fe]:Yo,[Ve]:cn,[$e]:pn,[ne]:An},Ut=(e,{isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,i=e instanceof S.z.ZodLazy,s=r.type!==void 0,a=t&&Ue(e),p=!i&&s&&!a&&e.isNullable(),d=i?[]:F({schema:e,variant:t?"parsed":"original",validate:!0}),l={};return o&&(l.description=o),p&&(l.type=Wr(r)),d.length&&(l.examples=d.slice()),l},Ht=(e,t)=>q.default.fail(new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),kt=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,c.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,c.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>kt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>kt(o,t))),r},ro=e=>(0,$.isReferenceObject)(e)?e:(0,c.omit)(["examples"],e),oo=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:d,hasMultipleStatusCodes:l,statusCode:m,brandHandling:y,description:f=`${e.toUpperCase()} ${t} ${It(i)} response ${l?m:""}`.trim()})=>{let b=ro(ae(r,{rules:{...y,...Mt},onEach:Ut,onMissing:Ht,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),v={schema:d==="components"?p(N(f),b):b,examples:eo(r,!0)};return{description:f,content:(0,c.fromPairs)((0,c.xprod)(o,[v]))}},In=()=>({type:"http",scheme:"basic"}),Cn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},zn=({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},wn=({name:e})=>({type:"apiKey",in:"header",name:e}),Zn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),En=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),vn=({flows:e={}})=>({type:"oauth2",flows:(0,c.map)(t=>({...t,scopes:t.scopes||{}}),(0,c.reject)(c.isNil,e))}),no=(e,t)=>{let r={basic:In,bearer:Cn,input:zn,header:wn,cookie:Zn,openid:En,oauth2:vn};return it(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(wt(e)):mt({or:[e]}),io=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,paramNames:l,description:m=`${e.toUpperCase()} ${t} Request body`})=>{let y=ro(kt(ae(r,{rules:{...d,...Mt},onEach:Ut,onMissing:Ht,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),l)),f={schema:p==="components"?a(N(m),y):y,examples:eo(r,!1,l)};return{description:m,content:(0,c.fromPairs)((0,c.xprod)(o,[f]))}},so=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Dt=e=>e.length<=Vr?e:e.slice(0,Vr-1)+"\u2026";var ut=class extends po.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let i=o||N(r,t),s=this.lastOperationIdSuffixes.get(i);return s===void 0?(this.lastOperationIdSuffixes.set(i,1),i):(o&&ao.default.fail(new P({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(i,s),`${i}${s}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let i in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[i]))return i;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:i,serverUrl:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:l="inline",serializer:m=Je}){super(),this.addInfo({title:o,version:i});for(let f of typeof s=="string"?[s]:s)this.addServer({url:f});se({routing:t,onEndpoint:(f,b,v)=>{let T=v,k={path:b,method:T,endpoint:f,composition:l,serializer:m,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[I,x]=["short","long"].map(f.getDescription.bind(f)),Ee=I?Dt(I):d&&x?Dt(x):void 0,G=f.getTags(),ee=r.inputSources?.[T]||Ot[T],ce=this.ensureUniqOperationId(b,T,f.getOperationId(T)),ve=to({...k,inputSources:ee,schema:f.getSchema("input"),description:a?.requestParameter?.call(null,{method:T,path:b,operationId:ce})}),_e={};for(let H of["positive","negative"]){let te=f.getResponses(H);for(let{mimeTypes:Le,schema:R,statusCodes:A}of te)for(let C of A)_e[C]=oo({...k,variant:H,schema:R,mimeTypes:Le,statusCode:C,hasMultipleStatusCodes:te.length>1||A.length>1,description:a?.[`${H}Response`]?.call(null,{method:T,path:b,operationId:ce,statusCode:C})})}let St=ee.includes("body")?io({...k,paramNames:(0,co.pluck)("name",ve),schema:f.getSchema("input"),mimeTypes:f.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:T,path:b,operationId:ce})}):void 0,Ye=mt(it(no(f.getSecurity(),ee),H=>{let te=this.ensureUniqSecuritySchemaName(H),Le=["oauth2","openIdConnect"].includes(H.type)?f.getScopes().slice():[];return this.addSecurityScheme(te,H),{name:te,scopes:Le}}));this.addPath(Qr(b),{[T]:{operationId:ce,summary:Ee,description:x,tags:G.length>0?G:void 0,parameters:ve.length>0?ve:void 0,requestBody:St,security:Ye.length>0?Ye:void 0,responses:_e}})}}),this.rootDoc.tags=r.tags?so(r.tags):[]}};var ft=require("node-mocks-http"),Ln=e=>(0,ft.createRequest)({...e,headers:{"content-type":z.json,...e?.headers}}),Nn=e=>(0,ft.createResponse)(e),jn=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,i){return o==="_getLogs"?()=>t:o in Te?(...s)=>t[o].push(s):Reflect.get(r,o,i)}})},lo=async({endpoint:e,requestProps:t,responseOptions:r,configProps:o,loggerProps:i})=>{let s=Ln(t),a=Nn({req:s,...r}),p=jn(i),d={cors:!1,logger:p,...o};return await e.execute({request:s,response:a,config:d,logger:p}),{requestMock:s,responseMock:a,loggerMock:p}};var E=O(require("typescript"),1);var U=O(require("typescript"),1),ze=require("ramda"),n=U.default.factory,W=[n.createModifier(U.default.SyntaxKind.ExportKeyword)],kn=[n.createModifier(U.default.SyntaxKind.AsyncKeyword)],Mn=[n.createModifier(U.default.SyntaxKind.PublicKeyword),n.createModifier(U.default.SyntaxKind.ReadonlyKeyword)],mo=[n.createModifier(U.default.SyntaxKind.ProtectedKeyword),n.createModifier(U.default.SyntaxKind.ReadonlyKeyword)],Ft=n.createTemplateHead(""),we=n.createTemplateTail(""),Kt=n.createTemplateMiddle(" "),Bt=e=>n.createTemplateLiteralType(Ft,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?we:Kt))),qt=Bt(["M","P"]),yt=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),gt=(e,t)=>(0,ze.chain)(([r,o])=>[yt(n.createIdentifier(r),o,t)],(0,ze.toPairs)(e)),$t=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),uo=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),fo=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),X=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],U.default.NodeFlags.Const),Vt=(e,t)=>n.createTypeAliasDeclaration(W,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),ht=(e,t)=>n.createTypeAliasDeclaration(W,e,void 0,t),yo=(e,t,r)=>n.createPropertyDeclaration(Mn,e,void 0,t,r),go=(e,t,r)=>n.createClassDeclaration(W,e,void 0,void 0,[t,...r]),ho=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),xo=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(U.default.SyntaxKind.AnyKeyword)]),bo=(e,t,r)=>n.createInterfaceDeclaration(W,e,void 0,t,r),To=e=>(0,ze.chain)(([t,r])=>[n.createTypeParameterDeclaration([],t,n.createTypeReferenceNode(r))],(0,ze.toPairs)(e)),Gt=(e,t,r)=>n.createArrowFunction(r?kn:void 0,void 0,e.map(o=>yt(o)),void 0,void 0,t),_t=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[n.createArrowFunction(void 0,void 0,gt({acc:void 0,key:void 0}),void 0,void 0,t),r]),So=(...e)=>`"${e.join(" ")}"`;var Oo=["get","post","put","delete","patch"];var h=O(require("typescript"),1),bt=require("zod");var V=O(require("typescript"),1),{factory:xt}=V.default,Yt=(e,t)=>{V.default.addSyntheticLeadingComment(e,V.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ze=(e,t,r)=>{let o=xt.createTypeAliasDeclaration(void 0,xt.createIdentifier(t),void 0,e);return r&&Yt(o,r),o},Qt=(e,t)=>{let r=V.default.createSourceFile("print.ts","",V.default.ScriptTarget.Latest,!1,V.default.ScriptKind.TS);return V.default.createPrinter(t).printNode(V.default.EmitHint.Unspecified,e,r)},Un=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Ro=e=>Un.test(e)?xt.createIdentifier(e):xt.createStringLiteral(e);var{factory:u}=h.default,Hn={[h.default.SyntaxKind.AnyKeyword]:"",[h.default.SyntaxKind.BigIntKeyword]:BigInt(0),[h.default.SyntaxKind.BooleanKeyword]:!1,[h.default.SyntaxKind.NumberKeyword]:0,[h.default.SyntaxKind.ObjectKeyword]:{},[h.default.SyntaxKind.StringKeyword]:"",[h.default.SyntaxKind.UndefinedKeyword]:void 0},Dn=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Fn=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&Ue(a)?a instanceof bt.z.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,Ro(s),p&&o?u.createToken(h.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Yt(d,a.description),d});return u.createTypeLiteralNode(i)},Kn=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),Bn=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Ao=({options:e},{next:t})=>u.createUnionTypeNode(e.map(t)),qn=e=>Hn?.[e.kind],$n=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=We(e,qn(o)),s={number:h.default.SyntaxKind.NumberKeyword,bigint:h.default.SyntaxKind.BigIntKeyword,boolean:h.default.SyntaxKind.BooleanKeyword,string:h.default.SyntaxKind.StringKeyword,undefined:h.default.SyntaxKind.UndefinedKeyword,object:h.default.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(i&&s[i]||h.default.SyntaxKind.AnyKeyword)}return o},Vn=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),Gn=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(h.default.SyntaxKind.UndefinedKeyword)]):o},_n=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),Yn=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),Qn=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),Jn=({_def:e},{next:t})=>u.createIntersectionTypeNode([e.left,e.right].map(t)),Wn=({_def:e},{next:t})=>t(e.innerType),pe=e=>()=>u.createKeywordTypeNode(e),Xn=(e,{next:t})=>t(e.unwrap()),ei=(e,{next:t})=>t(e.unwrap()),ti=({_def:e},{next:t})=>t(e.innerType),ri=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),oi=()=>u.createLiteralTypeNode(u.createNull()),ni=({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)))},ii=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(h.default.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),i=u.createUnionTypeNode([r,o]);return t instanceof bt.z.ZodString?r:t instanceof bt.z.ZodUnion?i:o},si=(e,{next:t})=>t(e.unwrap().shape.raw),ai={ZodString:pe(h.default.SyntaxKind.StringKeyword),ZodNumber:pe(h.default.SyntaxKind.NumberKeyword),ZodBigInt:pe(h.default.SyntaxKind.BigIntKeyword),ZodBoolean:pe(h.default.SyntaxKind.BooleanKeyword),ZodAny:pe(h.default.SyntaxKind.AnyKeyword),[$e]:pe(h.default.SyntaxKind.StringKeyword),[Ve]:pe(h.default.SyntaxKind.StringKeyword),ZodNull:oi,ZodArray:Kn,ZodTuple:Yn,ZodRecord:Qn,ZodObject:Fn,ZodLiteral:Dn,ZodIntersection:Jn,ZodUnion:Ao,ZodDefault:Wn,ZodEnum:Bn,ZodNativeEnum:Vn,ZodEffects:$n,ZodOptional:Gn,ZodNullable:_n,ZodDiscriminatedUnion:Ao,ZodBranded:Xn,ZodCatch:ti,ZodPipeline:ri,ZodLazy:ni,ZodReadonly:ei,[J]:ii,[ne]:si},Ge=(e,{brandHandling:t,ctx:r})=>ae(e,{rules:{...t,...ai},onMissing:()=>u.createKeywordTypeNode(h.default.SyntaxKind.AnyKeyword),ctx:r});var Tt=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,Ze(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=Je,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){se({routing:t,onEndpoint:(R,A,C)=>{let de={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},Ne=N(C,A,"input"),je=Ge(R.getSchema("input"),{brandHandling:r,ctx:{...de,isResponse:!1}}),L=s?N(C,A,"positive.response"):void 0,Jt=R.getSchema("positive"),Wt=s?Ge(Jt,{brandHandling:r,ctx:{...de,isResponse:!0}}):void 0,ke=s?N(C,A,"negative.response"):void 0,Xt=R.getSchema("negative"),er=s?Ge(Xt,{brandHandling:r,ctx:{...de,isResponse:!0}}):void 0,tr=N(C,A,"response"),Io=L&&ke?n.createUnionTypeNode([n.createTypeReferenceNode(L),n.createTypeReferenceNode(ke)]):Ge(Jt.or(Xt),{brandHandling:r,ctx:{...de,isResponse:!0}});this.program.push(Ze(je,Ne)),Wt&&L&&this.program.push(Ze(Wt,L)),er&&ke&&this.program.push(Ze(er,ke)),this.program.push(Ze(Io,tr)),C!=="options"&&(this.paths.push(A),this.registry.set({method:C,path:A},{input:Ne,positive:L,negative:ke,response:tr,isJson:R.getMimeTypes("positive").includes(z.json),tags:R.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(Vt(this.ids.pathType,this.paths)),this.program.push(Vt(this.ids.methodType,Oo)),this.program.push(ht(this.ids.methodPathType,Bt([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(E.default.SyntaxKind.ExtendsKeyword,[$t(this.ids.methodPathType,E.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let d=[],l=[];for(let[{method:R,path:A},{isJson:C,tags:de,...Ne}]of this.registry){let je=So(R,A);for(let L of this.interfaces)L.kind in Ne&&L.props.push(fo(je,Ne[L.kind]));o!=="types"&&(C&&d.push(n.createPropertyAssignment(je,n.createTrue())),l.push(n.createPropertyAssignment(je,n.createArrayLiteralExpression(de.map(L=>n.createStringLiteral(L))))))}for(let{id:R,props:A}of this.interfaces)this.program.push(bo(R,p,A));if(o==="types")return;let m=n.createVariableStatement(W,X(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(d))),y=n.createVariableStatement(W,X(this.ids.endpointTagsConst,n.createObjectLiteralExpression(l))),f=ht(this.ids.providerType,n.createFunctionTypeNode(To({M:this.ids.methodType,P:this.ids.pathType}),gt({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),qt)}),ho(this.ids.responseInterface,qt))),b=ht(this.ids.implementationType,n.createFunctionTypeNode(void 0,gt({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(E.default.SyntaxKind.StringKeyword),params:$t(E.default.SyntaxKind.StringKeyword,E.default.SyntaxKind.AnyKeyword)}),xo())),v=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,we)]),T=_t(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[v,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),k=_t(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[v]),E.default.SyntaxKind.GreaterThanEqualsToken,n.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,n.createObjectLiteralExpression([n.createSpreadAssignment(this.ids.accumulator),n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),n.createObjectLiteralExpression()),I=go(this.ids.clientClass,uo([yt(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),mo)]),[yo(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),Gt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,T,k]),!0))]);this.program.push(m,y,f,b,I);let x=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),Ee=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(z.json))]),void 0,this.ids.undefinedValue)),G=n.createPropertyAssignment(this.ids.bodyProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),ee=n.createVariableStatement(void 0,X(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier("fetch"),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,we)]),n.createObjectLiteralExpression([x,Ee,G])])))),ce=n.createVariableStatement(void 0,X(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),ve=n.createVariableStatement(void 0,X(this.ids.searchParamsConst,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createStringLiteral(""),void 0,n.createTemplateExpression(n.createTemplateHead("?"),[n.createTemplateSpan(n.createNewExpression(n.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),we)])))),[_e,St]=["json","text"].map(R=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,R),void 0,void 0))),Ye=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(Ft,[n.createTemplateSpan(this.ids.methodParameter,Kt),n.createTemplateSpan(this.ids.pathParameter,we)]),E.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([_e])),H=n.createVariableStatement(W,X(this.ids.exampleImplementationConst,Gt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([ce,ve,ee,Ye,St]),!0),n.createTypeReferenceNode(this.ids.implementationType))),te=n.createExpressionStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[n.createStringLiteral("get"),n.createStringLiteral("/v1/user/retrieve"),n.createObjectLiteralExpression([n.createPropertyAssignment("id",n.createStringLiteral("10"))])])),Le=n.createVariableStatement(void 0,X(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(H,Le,te)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Qt(r,t)).join(`
21
- `):void 0}print(t){let r=this.printUsage(t),o=r&&E.default.addSyntheticLeadingComment(E.default.addSyntheticLeadingComment(n.createEmptyStatement(),E.default.SyntaxKind.SingleLineCommentTrivia," Usage example:"),E.default.SyntaxKind.MultiLineCommentTrivia,`
22
- ${r}`);return this.program.concat(o||[]).map((i,s)=>Qt(i,s<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
20
+ `)};var vr=e=>{e.startupLogo!==!1&&console.log(jr());let t=e.errorHandler||Te,r=Ar(e.logger)?e.logger:new Re(e.logger);r.debug("Running","v20.1.0-beta.2 (CJS)");let o=Er({rootLogger:r,config:e}),i=zr({rootLogger:r,errorHandler:t}),s=Cr({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:i,parserFailureHandler:s,loggingMiddleware:o}},kr=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:i}=vr(e);return Nt({app:e.app.use(i),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},Mr=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,parserFailureHandler:i,loggingMiddleware:s}=vr(e),a=(0,pt.default)().disable("x-powered-by").use(s);if(e.server.compression){let m=await Ce("compression");a.use(m(typeof e.server.compression=="object"?e.server.compression:void 0))}let p={json:[e.server.jsonParser||pt.default.json()],raw:[e.server.rawParser||pt.default.raw(),Zr],upload:e.server.upload?await wr({config:e,rootLogger:r}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:a,logger:r}),Nt({app:a,routing:t,rootLogger:r,config:e,parsers:p}),a.use(i,o);let d=(m,y)=>m.listen(y,()=>{r.info("Listening",y)}),l={httpServer:d(Lr.default.createServer(a),e.server.listen),httpsServer:e.https?d(Nr.default.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...l,logger:r}};var ro=R(require("assert/strict"),1),oo=require("openapi3-ts/oas31"),no=require("ramda");var J=R(require("assert/strict"),1),$=require("openapi3-ts/oas31"),c=require("ramda"),b=require("zod");var ze=require("zod");var ct=e=>!isNaN(e.getTime());var $e=Symbol("DateIn"),Ur=()=>ze.z.union([ze.z.string().date(),ze.z.string().datetime(),ze.z.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(ze.z.date().refine(ct)).brand($e);var Hr=require("zod");var Ve=Symbol("DateOut"),Dr=()=>Hr.z.date().refine(ct).transform(e=>e.toISOString()).brand(Ve);var pe=(e,{onEach:t,rules:r,onMissing:o,ctx:i={}})=>{let s=r[e._def[g]?.brand]||r[e._def.typeName],p=s?s(e,{...i,next:l=>pe(l,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),d=t&&t(e,{prev:p,...i});return d?{...p,...d}:p};var Fr=50,Br="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Fo={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},qr=/:([A-Za-z0-9_]+)/g,Ko=e=>e.match(qr)?.map(t=>t.slice(1))||[],$r=e=>e.replace(qr,t=>`{${t.slice(1)}}`),Bo=({_def:e},{next:t})=>({...t(e.innerType),default:e[g]?.defaultLabel||e.defaultValue()}),qo=({_def:{innerType:e}},{next:t})=>t(e),$o=()=>({format:"any"}),Vo=({},e)=>((0,J.default)(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),Go=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.z.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},_o=({options:e},{next:t})=>({oneOf:e.map(t)}),Yo=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),Qo=e=>{let[t,r]=e.filter($.isSchemaObject).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));(0,J.default)(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,c.mergeDeepWith)((i,s)=>Array.isArray(i)&&Array.isArray(s)?(0,c.concat)(i,s):i===s?s:J.default.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,c.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=oe(t.examples||[],r.examples||[],([i,s])=>(0,c.mergeDeepRight)(i,s))),o},Jo=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Qo(o)}catch{}return{allOf:o}},Wo=(e,{next:t})=>t(e.unwrap()),Xo=(e,{next:t})=>t(e.unwrap()),en=(e,{next:t})=>{let r=t(e.unwrap());return(0,$.isSchemaObject)(r)&&(r.type=Gr(r)),r},Vr=e=>{let t=(0,c.toLower)((0,c.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Kr=e=>({type:Vr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),tn=({value:e})=>({type:Vr(e),const:e}),rn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&He(p)?p instanceof b.z.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=dt(e,r)),s.length&&(a.required=s),a},on=()=>({type:"null"}),nn=({},e)=>((0,J.default)(!e.isResponse,new z({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:Br}}),sn=({},e)=>((0,J.default)(e.isResponse,new z({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Br}}),an=({},e)=>J.default.fail(new z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),pn=()=>({type:"boolean"}),cn=()=>({type:"integer",format:"bigint"}),dn=e=>e.every(t=>t instanceof b.z.ZodLiteral),ln=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.z.ZodEnum||e instanceof b.z.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=dt(b.z.object((0,c.fromPairs)((0,c.xprod)(o,[t]))),r),i.required=o),i}if(e instanceof b.z.ZodLiteral)return{type:"object",properties:dt(b.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.z.ZodUnion&&dn(e.options)){let o=(0,c.map)(s=>`${s.value}`,e.options),i=(0,c.fromPairs)((0,c.xprod)(o,[t]));return{type:"object",properties:dt(b.z.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},mn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let i={type:"array",items:o(r)};return e&&(i.minItems=e.value),t&&(i.maxItems=t.value),i},un=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),fn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:l,isDatetime:m,_def:{checks:y}})=>{let f=y.find(I=>I.kind==="regex"),S=y.find(I=>I.kind==="datetime"),L=f?f.regex:S?S.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,T={type:"string"},M={"date-time":m,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:d,emoji:l};for(let I in M)if(M[I]){T.format=I;break}return r!==null&&(T.minLength=r),o!==null&&(T.maxLength=o),L&&(T.pattern=L.source),T},yn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let i=o.find(y=>y.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=i?i.inclusive:!0,p=o.find(y=>y.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,l=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=s:m.exclusiveMinimum=s,l?m.maximum=d:m.exclusiveMaximum=d,m},dt=({shape:e},t)=>(0,c.map)(t,e),gn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Fo?.[t]},Gr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},hn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&(0,$.isSchemaObject)(o)){let s=Xe(e,gn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(b.z.any())}if(!t&&i.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},xn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),bn=(e,{next:t})=>t(e.unwrap()),Tn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},Sn=(e,{next:t})=>t(e.unwrap().shape.raw),_r=e=>e.length?(0,c.fromPairs)((0,c.zip)((0,c.range)(1,e.length+1).map(t=>`example${t}`),(0,c.map)((0,c.objOf)("value"),e))):void 0,Yr=(e,t,r=[])=>(0,c.pipe)(K,(0,c.map)((0,c.when)((0,c.both)(B,(0,c.complement)(Array.isArray)),(0,c.omit)(r))),_r)({schema:e,variant:t?"parsed":"original",validate:!0}),On=(e,t)=>(0,c.pipe)(K,(0,c.filter)((0,c.has)(t)),(0,c.pluck)(t),_r)({schema:e,variant:"original",validate:!0}),ce=e=>e instanceof b.z.ZodObject?e:e instanceof b.z.ZodBranded?ce(e.unwrap()):e instanceof b.z.ZodUnion||e instanceof b.z.ZodDiscriminatedUnion?e.options.map(t=>ce(t)).reduce((t,r)=>t.merge(r.partial()),b.z.object({})):e instanceof b.z.ZodEffects?ce(e._def.schema):e instanceof b.z.ZodPipeline?ce(e._def.in):ce(e._def.left).merge(ce(e._def.right)),Qr=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,description:l=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:m}=ce(r),y=Ko(e),f=o.includes("query"),S=o.includes("params"),L=o.includes("headers"),T=x=>S&&y.includes(x),M=x=>L&&Rt(x);return Object.keys(m).map(x=>({name:x,location:T(x)?"path":M(x)?"header":f?"query":void 0})).filter(x=>x.location!==void 0).map(({name:x,location:je})=>{let G=pe(m[x],{rules:{...d,...kt},onEach:Mt,onMissing:Ut,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),ee=p==="components"?a(v(l,x),G):G;return{name:x,in:je,required:!m[x].isOptional(),description:G.description||l,schema:ee,examples:On(r,x)}})},kt={ZodString:fn,ZodNumber:yn,ZodBigInt:cn,ZodBoolean:pn,ZodNull:on,ZodArray:mn,ZodTuple:un,ZodRecord:ln,ZodObject:rn,ZodLiteral:tn,ZodIntersection:Jo,ZodUnion:_o,ZodAny:$o,ZodDefault:Bo,ZodEnum:Kr,ZodNativeEnum:Kr,ZodEffects:hn,ZodOptional:Wo,ZodNullable:en,ZodDiscriminatedUnion:Yo,ZodBranded:bn,ZodDate:an,ZodCatch:qo,ZodPipeline:xn,ZodLazy:Tn,ZodReadonly:Xo,[Q]:Go,[Fe]:Vo,[Ve]:sn,[$e]:nn,[ie]:Sn},Mt=(e,{isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,i=e instanceof b.z.ZodLazy,s=r.type!==void 0,a=t&&He(e),p=!i&&s&&!a&&e.isNullable(),d=i?[]:K({schema:e,variant:t?"parsed":"original",validate:!0}),l={};return o&&(l.description=o),p&&(l.type=Gr(r)),d.length&&(l.examples=d.slice()),l},Ut=(e,t)=>J.default.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),vt=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,c.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,c.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>vt(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>vt(o,t))),r},Jr=e=>(0,$.isReferenceObject)(e)?e:(0,c.omit)(["examples"],e),Wr=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:d,hasMultipleStatusCodes:l,statusCode:m,brandHandling:y,description:f=`${e.toUpperCase()} ${t} ${Pt(i)} response ${l?m:""}`.trim()})=>{let S=Jr(pe(r,{rules:{...y,...kt},onEach:Mt,onMissing:Ut,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),L={schema:d==="components"?p(v(f),S):S,examples:Yr(r,!0)};return{description:f,content:(0,c.fromPairs)((0,c.xprod)(o,[L]))}},Rn=()=>({type:"http",scheme:"basic"}),An=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Pn=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},In=({name:e})=>({type:"apiKey",in:"header",name:e}),Cn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),zn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),wn=({flows:e={}})=>({type:"oauth2",flows:(0,c.map)(t=>({...t,scopes:t.scopes||{}}),(0,c.reject)(c.isNil,e))}),Xr=(e,t)=>{let r={basic:Rn,bearer:An,input:Pn,header:In,cookie:Cn,openid:zn,oauth2:wn};return nt(e,o=>r[o.type](o,t))},lt=e=>"or"in e?e.or.map(t=>"and"in t?(0,c.mergeAll)((0,c.map)(({name:r,scopes:o})=>(0,c.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?lt(zt(e)):lt({or:[e]}),eo=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:d,paramNames:l,description:m=`${e.toUpperCase()} ${t} Request body`})=>{let y=Jr(vt(pe(r,{rules:{...d,...kt},onEach:Mt,onMissing:Ut,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),l)),f={schema:p==="components"?a(v(m),y):y,examples:Yr(r,!1,l)};return{description:m,content:(0,c.fromPairs)((0,c.xprod)(o,[f]))}},to=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Ht=e=>e.length<=Fr?e:e.slice(0,Fr-1)+"\u2026";var mt=class extends oo.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let i=o||v(r,t),s=this.lastOperationIdSuffixes.get(i);return s===void 0?(this.lastOperationIdSuffixes.set(i,1),i):(o&&ro.default.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(i,s),`${i}${s}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let i in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[i]))return i;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:i,serverUrl:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:l="inline",serializer:m=We}){super(),this.addInfo({title:o,version:i});for(let f of typeof s=="string"?[s]:s)this.addServer({url:f});ae({routing:t,onEndpoint:(f,S,L)=>{let T=L,M={path:S,method:T,endpoint:f,composition:l,serializer:m,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[I,x]=["short","long"].map(f.getDescription.bind(f)),je=I?Ht(I):d&&x?Ht(x):void 0,G=f.getTags(),ee=r.inputSources?.[T]||St[T],le=this.ensureUniqOperationId(S,T,f.getOperationId(T)),Le=Qr({...M,inputSources:ee,schema:f.getSchema("input"),description:a?.requestParameter?.call(null,{method:T,path:S,operationId:le})}),_e={};for(let D of["positive","negative"]){let te=f.getResponses(D);for(let{mimeTypes:Ne,schema:A,statusCodes:P}of te)for(let C of P)_e[C]=Wr({...M,variant:D,schema:A,mimeTypes:Ne,statusCode:C,hasMultipleStatusCodes:te.length>1||P.length>1,description:a?.[`${D}Response`]?.call(null,{method:T,path:S,operationId:le,statusCode:C})})}let Tt=ee.includes("body")?eo({...M,paramNames:(0,no.pluck)("name",Le),schema:f.getSchema("input"),mimeTypes:f.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:T,path:S,operationId:le})}):void 0,Ye=lt(nt(Xr(f.getSecurity(),ee),D=>{let te=this.ensureUniqSecuritySchemaName(D),Ne=["oauth2","openIdConnect"].includes(D.type)?f.getScopes().slice():[];return this.addSecurityScheme(te,D),{name:te,scopes:Ne}}));this.addPath($r(S),{[T]:{operationId:le,summary:je,description:x,tags:G.length>0?G:void 0,parameters:Le.length>0?Le:void 0,requestBody:Tt,security:Ye.length>0?Ye:void 0,responses:_e}})}}),this.rootDoc.tags=r.tags?to(r.tags):[]}};var ut=require("node-mocks-http"),Zn=e=>(0,ut.createRequest)({...e,headers:{"content-type":w.json,...e?.headers}}),En=e=>(0,ut.createResponse)(e),jn=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,i){return o==="_getLogs"?()=>t:o in Oe?(...s)=>t[o].push(s):Reflect.get(r,o,i)}})},io=async({endpoint:e,requestProps:t,responseOptions:r,configProps:o,loggerProps:i})=>{let s=Zn(t),a=En({req:s,...r}),p=jn(i),d={cors:!1,logger:p,...o};return await e.execute({request:s,response:a,config:d,logger:p}),{requestMock:s,responseMock:a,loggerMock:p}};var j=R(require("typescript"),1);var H=R(require("typescript"),1),we=require("ramda"),n=H.default.factory,W=[n.createModifier(H.default.SyntaxKind.ExportKeyword)],Ln=[n.createModifier(H.default.SyntaxKind.AsyncKeyword)],Nn=[n.createModifier(H.default.SyntaxKind.PublicKeyword),n.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],so=[n.createModifier(H.default.SyntaxKind.ProtectedKeyword),n.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],Dt=n.createTemplateHead(""),Ze=n.createTemplateTail(""),Ft=n.createTemplateMiddle(" "),Kt=e=>n.createTemplateLiteralType(Dt,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?Ze:Ft))),Bt=Kt(["M","P"]),ft=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),yt=(e,t)=>(0,we.chain)(([r,o])=>[ft(n.createIdentifier(r),o,t)],(0,we.toPairs)(e)),qt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),ao=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),po=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),X=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],H.default.NodeFlags.Const),$t=(e,t)=>n.createTypeAliasDeclaration(W,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),gt=(e,t)=>n.createTypeAliasDeclaration(W,e,void 0,t),co=(e,t,r)=>n.createPropertyDeclaration(Nn,e,void 0,t,r),lo=(e,t,r)=>n.createClassDeclaration(W,e,void 0,void 0,[t,...r]),mo=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),uo=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(H.default.SyntaxKind.AnyKeyword)]),fo=(e,t,r)=>n.createInterfaceDeclaration(W,e,void 0,t,r),yo=e=>(0,we.chain)(([t,r])=>[n.createTypeParameterDeclaration([],t,n.createTypeReferenceNode(r))],(0,we.toPairs)(e)),Vt=(e,t,r)=>n.createArrowFunction(r?Ln:void 0,void 0,e.map(o=>ft(o)),void 0,void 0,t),Gt=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[n.createArrowFunction(void 0,void 0,yt({acc:void 0,key:void 0}),void 0,void 0,t),r]),go=(...e)=>`"${e.join(" ")}"`;var ho=["get","post","put","delete","patch"];var h=R(require("typescript"),1),xt=require("zod");var V=R(require("typescript"),1),{factory:ht}=V.default,_t=(e,t)=>{V.default.addSyntheticLeadingComment(e,V.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ee=(e,t,r)=>{let o=ht.createTypeAliasDeclaration(void 0,ht.createIdentifier(t),void 0,e);return r&&_t(o,r),o},Yt=(e,t)=>{let r=V.default.createSourceFile("print.ts","",V.default.ScriptTarget.Latest,!1,V.default.ScriptKind.TS);return V.default.createPrinter(t).printNode(V.default.EmitHint.Unspecified,e,r)},vn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,xo=e=>vn.test(e)?ht.createIdentifier(e):ht.createStringLiteral(e);var{factory:u}=h.default,kn={[h.default.SyntaxKind.AnyKeyword]:"",[h.default.SyntaxKind.BigIntKeyword]:BigInt(0),[h.default.SyntaxKind.BooleanKeyword]:!1,[h.default.SyntaxKind.NumberKeyword]:0,[h.default.SyntaxKind.ObjectKeyword]:{},[h.default.SyntaxKind.StringKeyword]:"",[h.default.SyntaxKind.UndefinedKeyword]:void 0},Mn=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Un=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&He(a)?a instanceof xt.z.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,xo(s),p&&o?u.createToken(h.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&_t(d,a.description),d});return u.createTypeLiteralNode(i)},Hn=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),Dn=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),bo=({options:e},{next:t})=>u.createUnionTypeNode(e.map(t)),Fn=e=>kn?.[e.kind],Kn=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=Xe(e,Fn(o)),s={number:h.default.SyntaxKind.NumberKeyword,bigint:h.default.SyntaxKind.BigIntKeyword,boolean:h.default.SyntaxKind.BooleanKeyword,string:h.default.SyntaxKind.StringKeyword,undefined:h.default.SyntaxKind.UndefinedKeyword,object:h.default.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(i&&s[i]||h.default.SyntaxKind.AnyKeyword)}return o},Bn=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),qn=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(h.default.SyntaxKind.UndefinedKeyword)]):o},$n=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),Vn=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),Gn=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),_n=({_def:e},{next:t})=>u.createIntersectionTypeNode([e.left,e.right].map(t)),Yn=({_def:e},{next:t})=>t(e.innerType),de=e=>()=>u.createKeywordTypeNode(e),Qn=(e,{next:t})=>t(e.unwrap()),Jn=(e,{next:t})=>t(e.unwrap()),Wn=({_def:e},{next:t})=>t(e.innerType),Xn=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),ei=()=>u.createLiteralTypeNode(u.createNull()),ti=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:i})=>{let s=`Type${i(e)}`;return t(s)||(r(s,u.createLiteralTypeNode(u.createNull())),r(s,o(e)))},ri=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(h.default.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),i=u.createUnionTypeNode([r,o]);return t instanceof xt.z.ZodString?r:t instanceof xt.z.ZodUnion?i:o},oi=(e,{next:t})=>t(e.unwrap().shape.raw),ni={ZodString:de(h.default.SyntaxKind.StringKeyword),ZodNumber:de(h.default.SyntaxKind.NumberKeyword),ZodBigInt:de(h.default.SyntaxKind.BigIntKeyword),ZodBoolean:de(h.default.SyntaxKind.BooleanKeyword),ZodAny:de(h.default.SyntaxKind.AnyKeyword),[$e]:de(h.default.SyntaxKind.StringKeyword),[Ve]:de(h.default.SyntaxKind.StringKeyword),ZodNull:ei,ZodArray:Hn,ZodTuple:Vn,ZodRecord:Gn,ZodObject:Un,ZodLiteral:Mn,ZodIntersection:_n,ZodUnion:bo,ZodDefault:Yn,ZodEnum:Dn,ZodNativeEnum:Bn,ZodEffects:Kn,ZodOptional:qn,ZodNullable:$n,ZodDiscriminatedUnion:bo,ZodBranded:Qn,ZodCatch:Wn,ZodPipeline:Xn,ZodLazy:ti,ZodReadonly:Jn,[Q]:ri,[ie]:oi},Ge=(e,{brandHandling:t,ctx:r})=>pe(e,{rules:{...t,...ni},onMissing:()=>u.createKeywordTypeNode(h.default.SyntaxKind.AnyKeyword),ctx:r});var bt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:n.createIdentifier("Path"),methodType:n.createIdentifier("Method"),methodPathType:n.createIdentifier("MethodPath"),inputInterface:n.createIdentifier("Input"),posResponseInterface:n.createIdentifier("PositiveResponse"),negResponseInterface:n.createIdentifier("NegativeResponse"),responseInterface:n.createIdentifier("Response"),jsonEndpointsConst:n.createIdentifier("jsonEndpoints"),endpointTagsConst:n.createIdentifier("endpointTags"),providerType:n.createIdentifier("Provider"),implementationType:n.createIdentifier("Implementation"),clientClass:n.createIdentifier("ExpressZodAPIClient"),keyParameter:n.createIdentifier("key"),pathParameter:n.createIdentifier("path"),paramsArgument:n.createIdentifier("params"),methodParameter:n.createIdentifier("method"),accumulator:n.createIdentifier("acc"),provideMethod:n.createIdentifier("provide"),implementationArgument:n.createIdentifier("implementation"),headersProperty:n.createIdentifier("headers"),hasBodyConst:n.createIdentifier("hasBody"),undefinedValue:n.createIdentifier("undefined"),bodyProperty:n.createIdentifier("body"),responseConst:n.createIdentifier("response"),searchParamsConst:n.createIdentifier("searchParams"),exampleImplementationConst:n.createIdentifier("exampleImplementation"),clientConst:n.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?n.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,Ee(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=We,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){ae({routing:t,onEndpoint:(A,P,C)=>{let me={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},ve=v(C,P,"input"),ke=Ge(A.getSchema("input"),{brandHandling:r,ctx:{...me,isResponse:!1}}),N=s?v(C,P,"positive.response"):void 0,Qt=A.getSchema("positive"),Jt=s?Ge(Qt,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,Me=s?v(C,P,"negative.response"):void 0,Wt=A.getSchema("negative"),Xt=s?Ge(Wt,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,er=v(C,P,"response"),So=N&&Me?n.createUnionTypeNode([n.createTypeReferenceNode(N),n.createTypeReferenceNode(Me)]):Ge(Qt.or(Wt),{brandHandling:r,ctx:{...me,isResponse:!0}});this.program.push(Ee(ke,ve)),Jt&&N&&this.program.push(Ee(Jt,N)),Xt&&Me&&this.program.push(Ee(Xt,Me)),this.program.push(Ee(So,er)),C!=="options"&&(this.paths.push(P),this.registry.set({method:C,path:P},{input:ve,positive:N,negative:Me,response:er,isJson:A.getMimeTypes("positive").includes(w.json),tags:A.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push($t(this.ids.pathType,this.paths)),this.program.push($t(this.ids.methodType,ho)),this.program.push(gt(this.ids.methodPathType,Kt([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(j.default.SyntaxKind.ExtendsKeyword,[qt(this.ids.methodPathType,j.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let d=[],l=[];for(let[{method:A,path:P},{isJson:C,tags:me,...ve}]of this.registry){let ke=go(A,P);for(let N of this.interfaces)N.kind in ve&&N.props.push(po(ke,ve[N.kind]));o!=="types"&&(C&&d.push(n.createPropertyAssignment(ke,n.createTrue())),l.push(n.createPropertyAssignment(ke,n.createArrayLiteralExpression(me.map(N=>n.createStringLiteral(N))))))}for(let{id:A,props:P}of this.interfaces)this.program.push(fo(A,p,P));if(o==="types")return;let m=n.createVariableStatement(W,X(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(d))),y=n.createVariableStatement(W,X(this.ids.endpointTagsConst,n.createObjectLiteralExpression(l))),f=gt(this.ids.providerType,n.createFunctionTypeNode(yo({M:this.ids.methodType,P:this.ids.pathType}),yt({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),Bt)}),mo(this.ids.responseInterface,Bt))),S=gt(this.ids.implementationType,n.createFunctionTypeNode(void 0,yt({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(j.default.SyntaxKind.StringKeyword),params:qt(j.default.SyntaxKind.StringKeyword,j.default.SyntaxKind.AnyKeyword)}),uo())),L=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,Ze)]),T=Gt(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[L,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),M=Gt(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[L]),j.default.SyntaxKind.GreaterThanEqualsToken,n.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,n.createObjectLiteralExpression([n.createSpreadAssignment(this.ids.accumulator),n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),n.createObjectLiteralExpression()),I=lo(this.ids.clientClass,ao([ft(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),so)]),[co(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),Vt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,T,M]),!0))]);this.program.push(m,y,f,S,I);let x=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),je=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(w.json))]),void 0,this.ids.undefinedValue)),G=n.createPropertyAssignment(this.ids.bodyProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),ee=n.createVariableStatement(void 0,X(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier("fetch"),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,Ze)]),n.createObjectLiteralExpression([x,je,G])])))),le=n.createVariableStatement(void 0,X(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),Le=n.createVariableStatement(void 0,X(this.ids.searchParamsConst,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createStringLiteral(""),void 0,n.createTemplateExpression(n.createTemplateHead("?"),[n.createTemplateSpan(n.createNewExpression(n.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),Ze)])))),[_e,Tt]=["json","text"].map(A=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,A),void 0,void 0))),Ye=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(Dt,[n.createTemplateSpan(this.ids.methodParameter,Ft),n.createTemplateSpan(this.ids.pathParameter,Ze)]),j.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([_e])),D=n.createVariableStatement(W,X(this.ids.exampleImplementationConst,Vt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([le,Le,ee,Ye,Tt]),!0),n.createTypeReferenceNode(this.ids.implementationType))),te=n.createExpressionStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[n.createStringLiteral("get"),n.createStringLiteral("/v1/user/retrieve"),n.createObjectLiteralExpression([n.createPropertyAssignment("id",n.createStringLiteral("10"))])])),Ne=n.createVariableStatement(void 0,X(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(D,Ne,te)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Yt(r,t)).join(`
21
+ `):void 0}print(t){let r=this.printUsage(t),o=r&&j.default.addSyntheticLeadingComment(j.default.addSyntheticLeadingComment(n.createEmptyStatement(),j.default.SyntaxKind.SingleLineCommentTrivia," Usage example:"),j.default.SyntaxKind.MultiLineCommentTrivia,`
22
+ ${r}`);return this.program.concat(o||[]).map((i,s)=>Yt(i,s<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
23
23
 
24
- `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await Pe("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let i=this.printUsage(t);this.usage=i&&o?[await o(i)]:this.usage;let s=this.print(t);return o?o(s):s}};var Po={dateIn:Br,dateOut:$r,file:tt,upload:fr,raw:mr};0&&(module.exports={BuiltinLogger,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,Middleware,MissingPeerError,OutputValidationError,ResultHandler,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint});
24
+ `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await Ce("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let i=this.printUsage(t);this.usage=i&&o?[await o(i)]:this.usage;let s=this.print(t);return o?o(s):s}};var To={dateIn:Ur,dateOut:Dr,file:rt,upload:mr,raw:dr};0&&(module.exports={BuiltinLogger,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,Middleware,MissingPeerError,OutputValidationError,ResultHandler,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint});
package/dist/index.d.cts CHANGED
@@ -11,33 +11,11 @@ import { ListenOptions } from 'node:net';
11
11
  import * as qs from 'qs';
12
12
  import * as express_serve_static_core from 'express-serve-static-core';
13
13
  import http from 'node:http';
14
- import { ReferenceObject, SchemaObject, OpenApiBuilder, SecuritySchemeType, SecuritySchemeObject } from 'openapi3-ts/oas31';
14
+ import { SchemaObject, ReferenceObject, OpenApiBuilder, SecuritySchemeType, SecuritySchemeObject } from 'openapi3-ts/oas31';
15
15
  import * as node_mocks_http from 'node-mocks-http';
16
16
  import { RequestOptions, ResponseOptions } from 'node-mocks-http';
17
17
  import ts from 'typescript';
18
18
 
19
- declare const metaSymbol: unique symbol;
20
- interface Metadata {
21
- examples: unknown[];
22
- /** @override ZodDefault::_def.defaultValue() in depictDefault */
23
- defaultLabel?: string;
24
- brand?: string | number | symbol;
25
- }
26
-
27
- declare module "zod" {
28
- interface ZodTypeDef {
29
- [metaSymbol]?: Metadata;
30
- }
31
- interface ZodType {
32
- /** @desc Add an example value (before any transformations, can be called multiple times) */
33
- example(example: this["_input"]): this;
34
- }
35
- interface ZodDefault<T extends z.ZodTypeAny> {
36
- /** @desc Change the default value in the generated Documentation to a label */
37
- label(label: string): this;
38
- }
39
- }
40
-
41
19
  /** @desc You can use any logger compatible with this type. */
42
20
  type AbstractLogger = Record<"info" | "debug" | "warn" | "error", (message: string, meta?: any) => any>;
43
21
  /**
@@ -49,30 +27,6 @@ interface LoggerOverrides {
49
27
  }
50
28
  type ActualLogger = AbstractLogger & LoggerOverrides;
51
29
 
52
- declare const methods: ("get" | "post" | "put" | "delete" | "patch")[];
53
- type Method = (typeof methods)[number];
54
-
55
- /** @desc this type does not allow props assignment, but it works for reading them when merged with another interface */
56
- type EmptyObject = Record<string, never>;
57
- type FlatObject = Record<string, unknown>;
58
- declare const getMessageFromError: (error: Error) => string;
59
- declare const getStatusCodeFromError: (error: Error) => number;
60
- declare const getExamples: <T extends z.ZodTypeAny, V extends "original" | "parsed" | undefined>({ schema, variant, validate, }: {
61
- schema: T;
62
- /**
63
- * @desc examples variant: original or parsed
64
- * @example "parsed" — for the case when possible schema transformations should be applied
65
- * @default "original"
66
- * @override validate: variant "parsed" activates validation as well
67
- * */
68
- variant?: V;
69
- /**
70
- * @desc filters out the examples that do not match the schema
71
- * @default variant === "parsed"
72
- * */
73
- validate?: boolean;
74
- }) => ReadonlyArray<V extends "parsed" ? z.output<T> : z.input<T>>;
75
-
76
30
  interface Context extends FlatObject {
77
31
  requestId?: string;
78
32
  }
@@ -277,12 +231,18 @@ declare const raw: <S extends z.ZodRawShape>(extra?: S) => z.ZodBranded<z.ZodObj
277
231
  }, S>>[k_1]; } : never>, symbol>;
278
232
  type RawSchema = ReturnType<typeof raw>;
279
233
 
280
- type Refined<T extends z.ZodTypeAny> = T extends z.ZodType<infer O> ? z.ZodEffects<T | Refined<T>, O, O> : never;
234
+ type BaseObject<U extends z.UnknownKeysParam> = z.ZodObject<z.ZodRawShape, U>;
235
+ interface ObjectBasedEffect<T extends z.ZodTypeAny> extends z.ZodEffects<T, FlatObject> {
236
+ }
237
+ type EffectsChain<U extends z.UnknownKeysParam> = ObjectBasedEffect<BaseObject<U> | EffectsChain<U>>;
281
238
  /**
282
239
  * @desc The type allowed on the top level of Middlewares and Endpoints
283
240
  * @param U — only "strip" is allowed for Middlewares due to intersection issue (Zod) #600
284
241
  * */
285
- type IOSchema<U extends z.UnknownKeysParam = z.UnknownKeysParam> = z.ZodObject<z.ZodRawShape, U> | z.ZodUnion<[IOSchema<U>, ...IOSchema<U>[]]> | z.ZodIntersection<IOSchema<U>, IOSchema<U>> | z.ZodDiscriminatedUnion<string, z.ZodObject<z.ZodRawShape, U>[]> | Refined<z.ZodObject<z.ZodRawShape, U>> | RawSchema;
242
+ type IOSchema<U extends z.UnknownKeysParam = z.UnknownKeysParam> = BaseObject<U> | EffectsChain<U> | RawSchema | z.ZodUnion<[IOSchema<U>, ...IOSchema<U>[]]> | z.ZodIntersection<IOSchema<U>, IOSchema<U>> | z.ZodDiscriminatedUnion<string, BaseObject<U>[]> | z.ZodPipeline<ObjectBasedEffect<BaseObject<U>>, BaseObject<U>>;
243
+
244
+ declare const methods: ("get" | "post" | "put" | "delete" | "patch")[];
245
+ type Method = (typeof methods)[number];
286
246
 
287
247
  declare const contentTypes: {
288
248
  json: string;
@@ -564,6 +524,69 @@ interface AppConfig<TAG extends string = string> extends CommonConfig<TAG> {
564
524
  declare function createConfig<TAG extends string>(config: ServerConfig<TAG>): ServerConfig<TAG>;
565
525
  declare function createConfig<TAG extends string>(config: AppConfig<TAG>): AppConfig<TAG>;
566
526
 
527
+ /** @desc this type does not allow props assignment, but it works for reading them when merged with another interface */
528
+ type EmptyObject = Record<string, never>;
529
+ type FlatObject = Record<string, unknown>;
530
+ declare const getMessageFromError: (error: Error) => string;
531
+ declare const getStatusCodeFromError: (error: Error) => number;
532
+ declare const getExamples: <T extends z.ZodTypeAny, V extends "original" | "parsed" | undefined>({ schema, variant, validate, }: {
533
+ schema: T;
534
+ /**
535
+ * @desc examples variant: original or parsed
536
+ * @example "parsed" — for the case when possible schema transformations should be applied
537
+ * @default "original"
538
+ * @override validate: variant "parsed" activates validation as well
539
+ * */
540
+ variant?: V;
541
+ /**
542
+ * @desc filters out the examples that do not match the schema
543
+ * @default variant === "parsed"
544
+ * */
545
+ validate?: boolean;
546
+ }) => ReadonlyArray<V extends "parsed" ? z.output<T> : z.input<T>>;
547
+
548
+ declare const metaSymbol: unique symbol;
549
+ interface Metadata {
550
+ examples: unknown[];
551
+ /** @override ZodDefault::_def.defaultValue() in depictDefault */
552
+ defaultLabel?: string;
553
+ brand?: string | number | symbol;
554
+ }
555
+
556
+ /**
557
+ * @fileoverview Mapping utils for Zod Runtime Plugin (remap)
558
+ * @link https://stackoverflow.com/questions/55454125/typescript-remapping-object-properties-in-typesafe
559
+ */
560
+ type TuplesFromObject<T> = {
561
+ [P in keyof T]: [P, T[P]];
562
+ }[keyof T];
563
+ type GetKeyByValue<T, V> = TuplesFromObject<T> extends infer TT ? TT extends [infer P, V] ? P : never : never;
564
+ type Remap<T, U extends {
565
+ [P in keyof T]: V;
566
+ }, V extends string> = {
567
+ [P in U[keyof U]]: T[GetKeyByValue<U, P>];
568
+ };
569
+
570
+ declare module "zod" {
571
+ interface ZodTypeDef {
572
+ [metaSymbol]?: Metadata;
573
+ }
574
+ interface ZodType {
575
+ /** @desc Add an example value (before any transformations, can be called multiple times) */
576
+ example(example: this["_input"]): this;
577
+ }
578
+ interface ZodDefault<T extends z.ZodTypeAny> {
579
+ /** @desc Change the default value in the generated Documentation to a label */
580
+ label(label: string): this;
581
+ }
582
+ interface ZodObject<T extends z.ZodRawShape, UnknownKeys extends z.UnknownKeysParam = z.UnknownKeysParam, Catchall extends z.ZodTypeAny = z.ZodTypeAny, Output = z.objectOutputType<T, Catchall, UnknownKeys>, Input = z.objectInputType<T, Catchall, UnknownKeys>> {
583
+ remap<V extends string, U extends {
584
+ [P in keyof T]: V;
585
+ }>(mapping: U): z.ZodPipeline<z.ZodEffects<this, FlatObject>, // internal type simplified
586
+ z.ZodObject<Remap<T, U, V>>>;
587
+ }
588
+ }
589
+
567
590
  type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<"strip">, OPT extends FlatObject, SCO extends string, TAG extends string> = {
568
591
  input: IN;
569
592
  output: OUT;
@@ -649,40 +672,6 @@ declare const createServer: (config: ServerConfig, routing: Routing) => Promise<
649
672
  app: express_serve_static_core.Express;
650
673
  }>;
651
674
 
652
- /** @desc An error related to the wrong Routing declaration */
653
- declare class RoutingError extends Error {
654
- name: string;
655
- }
656
- /**
657
- * @desc An error related to the generating of the documentation
658
- * */
659
- declare class DocumentationError extends Error {
660
- name: string;
661
- constructor({ message, method, path, isResponse, }: {
662
- message: string;
663
- } & Pick<OpenAPIContext, "path" | "method" | "isResponse">);
664
- }
665
- /** @desc An error related to the input and output schemas declaration */
666
- declare class IOSchemaError extends Error {
667
- name: string;
668
- }
669
- /** @desc An error of validating the Endpoint handler's returns against the Endpoint output schema */
670
- declare class OutputValidationError extends IOSchemaError {
671
- name: string;
672
- readonly originalError: ZodError;
673
- constructor(originalError: ZodError);
674
- }
675
- /** @desc An error of validating the input sources against the Middleware or Endpoint input schema */
676
- declare class InputValidationError extends IOSchemaError {
677
- name: string;
678
- readonly originalError: ZodError;
679
- constructor(originalError: ZodError);
680
- }
681
- declare class MissingPeerError extends Error {
682
- name: string;
683
- constructor(module: string | string[]);
684
- }
685
-
686
675
  declare const variants: {
687
676
  buffer: () => z.ZodBranded<z.ZodType<Buffer, z.ZodTypeDef, Buffer>, symbol>;
688
677
  string: () => z.ZodBranded<z.ZodString, symbol>;
@@ -776,6 +765,40 @@ declare class Documentation extends OpenApiBuilder {
776
765
  constructor({ routing, config, title, version, serverUrl, descriptions, brandHandling, hasSummaryFromDescription, composition, serializer, }: DocumentationParams);
777
766
  }
778
767
 
768
+ /** @desc An error related to the wrong Routing declaration */
769
+ declare class RoutingError extends Error {
770
+ name: string;
771
+ }
772
+ /**
773
+ * @desc An error related to the generating of the documentation
774
+ * */
775
+ declare class DocumentationError extends Error {
776
+ name: string;
777
+ constructor({ message, method, path, isResponse, }: {
778
+ message: string;
779
+ } & Pick<OpenAPIContext, "path" | "method" | "isResponse">);
780
+ }
781
+ /** @desc An error related to the input and output schemas declaration */
782
+ declare class IOSchemaError extends Error {
783
+ name: string;
784
+ }
785
+ /** @desc An error of validating the Endpoint handler's returns against the Endpoint output schema */
786
+ declare class OutputValidationError extends IOSchemaError {
787
+ name: string;
788
+ readonly originalError: ZodError;
789
+ constructor(originalError: ZodError);
790
+ }
791
+ /** @desc An error of validating the input sources against the Middleware or Endpoint input schema */
792
+ declare class InputValidationError extends IOSchemaError {
793
+ name: string;
794
+ readonly originalError: ZodError;
795
+ constructor(originalError: ZodError);
796
+ }
797
+ declare class MissingPeerError extends Error {
798
+ name: string;
799
+ constructor(module: string | string[]);
800
+ }
801
+
779
802
  type LocalResponse = Response<unknown, {
780
803
  [metaSymbol]?: {
781
804
  logger: ActualLogger;
package/dist/index.d.ts CHANGED
@@ -11,33 +11,11 @@ import { ListenOptions } from 'node:net';
11
11
  import * as qs from 'qs';
12
12
  import * as express_serve_static_core from 'express-serve-static-core';
13
13
  import http from 'node:http';
14
- import { ReferenceObject, SchemaObject, OpenApiBuilder, SecuritySchemeType, SecuritySchemeObject } from 'openapi3-ts/oas31';
14
+ import { SchemaObject, ReferenceObject, OpenApiBuilder, SecuritySchemeType, SecuritySchemeObject } from 'openapi3-ts/oas31';
15
15
  import * as node_mocks_http from 'node-mocks-http';
16
16
  import { RequestOptions, ResponseOptions } from 'node-mocks-http';
17
17
  import ts from 'typescript';
18
18
 
19
- declare const metaSymbol: unique symbol;
20
- interface Metadata {
21
- examples: unknown[];
22
- /** @override ZodDefault::_def.defaultValue() in depictDefault */
23
- defaultLabel?: string;
24
- brand?: string | number | symbol;
25
- }
26
-
27
- declare module "zod" {
28
- interface ZodTypeDef {
29
- [metaSymbol]?: Metadata;
30
- }
31
- interface ZodType {
32
- /** @desc Add an example value (before any transformations, can be called multiple times) */
33
- example(example: this["_input"]): this;
34
- }
35
- interface ZodDefault<T extends z.ZodTypeAny> {
36
- /** @desc Change the default value in the generated Documentation to a label */
37
- label(label: string): this;
38
- }
39
- }
40
-
41
19
  /** @desc You can use any logger compatible with this type. */
42
20
  type AbstractLogger = Record<"info" | "debug" | "warn" | "error", (message: string, meta?: any) => any>;
43
21
  /**
@@ -49,30 +27,6 @@ interface LoggerOverrides {
49
27
  }
50
28
  type ActualLogger = AbstractLogger & LoggerOverrides;
51
29
 
52
- declare const methods: ("get" | "post" | "put" | "delete" | "patch")[];
53
- type Method = (typeof methods)[number];
54
-
55
- /** @desc this type does not allow props assignment, but it works for reading them when merged with another interface */
56
- type EmptyObject = Record<string, never>;
57
- type FlatObject = Record<string, unknown>;
58
- declare const getMessageFromError: (error: Error) => string;
59
- declare const getStatusCodeFromError: (error: Error) => number;
60
- declare const getExamples: <T extends z.ZodTypeAny, V extends "original" | "parsed" | undefined>({ schema, variant, validate, }: {
61
- schema: T;
62
- /**
63
- * @desc examples variant: original or parsed
64
- * @example "parsed" — for the case when possible schema transformations should be applied
65
- * @default "original"
66
- * @override validate: variant "parsed" activates validation as well
67
- * */
68
- variant?: V;
69
- /**
70
- * @desc filters out the examples that do not match the schema
71
- * @default variant === "parsed"
72
- * */
73
- validate?: boolean;
74
- }) => ReadonlyArray<V extends "parsed" ? z.output<T> : z.input<T>>;
75
-
76
30
  interface Context extends FlatObject {
77
31
  requestId?: string;
78
32
  }
@@ -277,12 +231,18 @@ declare const raw: <S extends z.ZodRawShape>(extra?: S) => z.ZodBranded<z.ZodObj
277
231
  }, S>>[k_1]; } : never>, symbol>;
278
232
  type RawSchema = ReturnType<typeof raw>;
279
233
 
280
- type Refined<T extends z.ZodTypeAny> = T extends z.ZodType<infer O> ? z.ZodEffects<T | Refined<T>, O, O> : never;
234
+ type BaseObject<U extends z.UnknownKeysParam> = z.ZodObject<z.ZodRawShape, U>;
235
+ interface ObjectBasedEffect<T extends z.ZodTypeAny> extends z.ZodEffects<T, FlatObject> {
236
+ }
237
+ type EffectsChain<U extends z.UnknownKeysParam> = ObjectBasedEffect<BaseObject<U> | EffectsChain<U>>;
281
238
  /**
282
239
  * @desc The type allowed on the top level of Middlewares and Endpoints
283
240
  * @param U — only "strip" is allowed for Middlewares due to intersection issue (Zod) #600
284
241
  * */
285
- type IOSchema<U extends z.UnknownKeysParam = z.UnknownKeysParam> = z.ZodObject<z.ZodRawShape, U> | z.ZodUnion<[IOSchema<U>, ...IOSchema<U>[]]> | z.ZodIntersection<IOSchema<U>, IOSchema<U>> | z.ZodDiscriminatedUnion<string, z.ZodObject<z.ZodRawShape, U>[]> | Refined<z.ZodObject<z.ZodRawShape, U>> | RawSchema;
242
+ type IOSchema<U extends z.UnknownKeysParam = z.UnknownKeysParam> = BaseObject<U> | EffectsChain<U> | RawSchema | z.ZodUnion<[IOSchema<U>, ...IOSchema<U>[]]> | z.ZodIntersection<IOSchema<U>, IOSchema<U>> | z.ZodDiscriminatedUnion<string, BaseObject<U>[]> | z.ZodPipeline<ObjectBasedEffect<BaseObject<U>>, BaseObject<U>>;
243
+
244
+ declare const methods: ("get" | "post" | "put" | "delete" | "patch")[];
245
+ type Method = (typeof methods)[number];
286
246
 
287
247
  declare const contentTypes: {
288
248
  json: string;
@@ -564,6 +524,69 @@ interface AppConfig<TAG extends string = string> extends CommonConfig<TAG> {
564
524
  declare function createConfig<TAG extends string>(config: ServerConfig<TAG>): ServerConfig<TAG>;
565
525
  declare function createConfig<TAG extends string>(config: AppConfig<TAG>): AppConfig<TAG>;
566
526
 
527
+ /** @desc this type does not allow props assignment, but it works for reading them when merged with another interface */
528
+ type EmptyObject = Record<string, never>;
529
+ type FlatObject = Record<string, unknown>;
530
+ declare const getMessageFromError: (error: Error) => string;
531
+ declare const getStatusCodeFromError: (error: Error) => number;
532
+ declare const getExamples: <T extends z.ZodTypeAny, V extends "original" | "parsed" | undefined>({ schema, variant, validate, }: {
533
+ schema: T;
534
+ /**
535
+ * @desc examples variant: original or parsed
536
+ * @example "parsed" — for the case when possible schema transformations should be applied
537
+ * @default "original"
538
+ * @override validate: variant "parsed" activates validation as well
539
+ * */
540
+ variant?: V;
541
+ /**
542
+ * @desc filters out the examples that do not match the schema
543
+ * @default variant === "parsed"
544
+ * */
545
+ validate?: boolean;
546
+ }) => ReadonlyArray<V extends "parsed" ? z.output<T> : z.input<T>>;
547
+
548
+ declare const metaSymbol: unique symbol;
549
+ interface Metadata {
550
+ examples: unknown[];
551
+ /** @override ZodDefault::_def.defaultValue() in depictDefault */
552
+ defaultLabel?: string;
553
+ brand?: string | number | symbol;
554
+ }
555
+
556
+ /**
557
+ * @fileoverview Mapping utils for Zod Runtime Plugin (remap)
558
+ * @link https://stackoverflow.com/questions/55454125/typescript-remapping-object-properties-in-typesafe
559
+ */
560
+ type TuplesFromObject<T> = {
561
+ [P in keyof T]: [P, T[P]];
562
+ }[keyof T];
563
+ type GetKeyByValue<T, V> = TuplesFromObject<T> extends infer TT ? TT extends [infer P, V] ? P : never : never;
564
+ type Remap<T, U extends {
565
+ [P in keyof T]: V;
566
+ }, V extends string> = {
567
+ [P in U[keyof U]]: T[GetKeyByValue<U, P>];
568
+ };
569
+
570
+ declare module "zod" {
571
+ interface ZodTypeDef {
572
+ [metaSymbol]?: Metadata;
573
+ }
574
+ interface ZodType {
575
+ /** @desc Add an example value (before any transformations, can be called multiple times) */
576
+ example(example: this["_input"]): this;
577
+ }
578
+ interface ZodDefault<T extends z.ZodTypeAny> {
579
+ /** @desc Change the default value in the generated Documentation to a label */
580
+ label(label: string): this;
581
+ }
582
+ interface ZodObject<T extends z.ZodRawShape, UnknownKeys extends z.UnknownKeysParam = z.UnknownKeysParam, Catchall extends z.ZodTypeAny = z.ZodTypeAny, Output = z.objectOutputType<T, Catchall, UnknownKeys>, Input = z.objectInputType<T, Catchall, UnknownKeys>> {
583
+ remap<V extends string, U extends {
584
+ [P in keyof T]: V;
585
+ }>(mapping: U): z.ZodPipeline<z.ZodEffects<this, FlatObject>, // internal type simplified
586
+ z.ZodObject<Remap<T, U, V>>>;
587
+ }
588
+ }
589
+
567
590
  type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<"strip">, OPT extends FlatObject, SCO extends string, TAG extends string> = {
568
591
  input: IN;
569
592
  output: OUT;
@@ -649,40 +672,6 @@ declare const createServer: (config: ServerConfig, routing: Routing) => Promise<
649
672
  app: express_serve_static_core.Express;
650
673
  }>;
651
674
 
652
- /** @desc An error related to the wrong Routing declaration */
653
- declare class RoutingError extends Error {
654
- name: string;
655
- }
656
- /**
657
- * @desc An error related to the generating of the documentation
658
- * */
659
- declare class DocumentationError extends Error {
660
- name: string;
661
- constructor({ message, method, path, isResponse, }: {
662
- message: string;
663
- } & Pick<OpenAPIContext, "path" | "method" | "isResponse">);
664
- }
665
- /** @desc An error related to the input and output schemas declaration */
666
- declare class IOSchemaError extends Error {
667
- name: string;
668
- }
669
- /** @desc An error of validating the Endpoint handler's returns against the Endpoint output schema */
670
- declare class OutputValidationError extends IOSchemaError {
671
- name: string;
672
- readonly originalError: ZodError;
673
- constructor(originalError: ZodError);
674
- }
675
- /** @desc An error of validating the input sources against the Middleware or Endpoint input schema */
676
- declare class InputValidationError extends IOSchemaError {
677
- name: string;
678
- readonly originalError: ZodError;
679
- constructor(originalError: ZodError);
680
- }
681
- declare class MissingPeerError extends Error {
682
- name: string;
683
- constructor(module: string | string[]);
684
- }
685
-
686
675
  declare const variants: {
687
676
  buffer: () => z.ZodBranded<z.ZodType<Buffer, z.ZodTypeDef, Buffer>, symbol>;
688
677
  string: () => z.ZodBranded<z.ZodString, symbol>;
@@ -776,6 +765,40 @@ declare class Documentation extends OpenApiBuilder {
776
765
  constructor({ routing, config, title, version, serverUrl, descriptions, brandHandling, hasSummaryFromDescription, composition, serializer, }: DocumentationParams);
777
766
  }
778
767
 
768
+ /** @desc An error related to the wrong Routing declaration */
769
+ declare class RoutingError extends Error {
770
+ name: string;
771
+ }
772
+ /**
773
+ * @desc An error related to the generating of the documentation
774
+ * */
775
+ declare class DocumentationError extends Error {
776
+ name: string;
777
+ constructor({ message, method, path, isResponse, }: {
778
+ message: string;
779
+ } & Pick<OpenAPIContext, "path" | "method" | "isResponse">);
780
+ }
781
+ /** @desc An error related to the input and output schemas declaration */
782
+ declare class IOSchemaError extends Error {
783
+ name: string;
784
+ }
785
+ /** @desc An error of validating the Endpoint handler's returns against the Endpoint output schema */
786
+ declare class OutputValidationError extends IOSchemaError {
787
+ name: string;
788
+ readonly originalError: ZodError;
789
+ constructor(originalError: ZodError);
790
+ }
791
+ /** @desc An error of validating the input sources against the Middleware or Endpoint input schema */
792
+ declare class InputValidationError extends IOSchemaError {
793
+ name: string;
794
+ readonly originalError: ZodError;
795
+ constructor(originalError: ZodError);
796
+ }
797
+ declare class MissingPeerError extends Error {
798
+ name: string;
799
+ constructor(module: string | string[]);
800
+ }
801
+
779
802
  type LocalResponse = Response<unknown, {
780
803
  [metaSymbol]?: {
781
804
  logger: ActualLogger;
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import{clone as co}from"ramda";import{z as qe}from"zod";import{isHttpError as Wr}from"http-errors";import{createHash as Xr}from"crypto";import{flip as eo,pickBy as to,xprod as ro}from"ramda";import{z as oo}from"zod";var ie=class extends Error{name="RoutingError"},P=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:i}){let s=`${t}
2
- Caused by ${i?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},U=class extends Error{name="IOSchemaError"},Q=class extends U{name="OutputValidationError";originalError;constructor(t){super(D(t)),this.originalError=t}},N=class extends U{name="InputValidationError";originalError;constructor(t){super(D(t)),this.originalError=t}},H=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},Oe=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var I={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var no=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(I.upload);return"files"in e&&r},lt={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},io=["body","query","params"],mt=e=>e.method.toLowerCase(),ut=e=>e.startsWith("x-"),so=e=>to(eo(ut),e),_t=(e,t={})=>{let r=mt(e);return r==="options"?{}:(t[r]||lt[r]||io).filter(o=>o==="files"?no(e):!0).map(o=>o==="headers"?so(e[o]):e[o]).reduce((o,i)=>({...o,...i}),{})},se=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),D=e=>e instanceof oo.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof Q?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,De=e=>Wr(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
1
+ import{clone as Xt,fromPairs as _t,map as Yt,pipe as Qt,toPairs as Jt,pair as Wt}from"ramda";import{z as ae}from"zod";import{isHttpError as ro}from"http-errors";import{createHash as oo}from"crypto";import{flip as no,pickBy as io,xprod as so}from"ramda";import{z as ao}from"zod";var ie=class extends Error{name="RoutingError"},z=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:i}){let s=`${t}
2
+ Caused by ${i?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},De=class extends Error{name="IOSchemaError"},_=class extends De{name="OutputValidationError";originalError;constructor(t){super(H(t)),this.originalError=t}},N=class extends De{name="InputValidationError";originalError;constructor(t){super(H(t)),this.originalError=t}},U=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},Oe=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var P={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var po=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(P.upload);return"files"in e&&r},ct={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},co=["body","query","params"],dt=e=>e.method.toLowerCase(),lt=e=>e.startsWith("x-"),lo=e=>io(no(lt),e),Vt=(e,t={})=>{let r=dt(e);return r==="options"?{}:(t[r]||ct[r]||co).filter(o=>o==="files"?po(e):!0).map(o=>o==="headers"?lo(e[o]):e[o]).reduce((o,i)=>({...o,...i}),{})},se=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),H=e=>e instanceof ao.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof _?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Fe=e=>ro(e)?e.statusCode:e instanceof N?400:500,mt=({logger:e,request:t,input:r,error:o,statusCode:i})=>{i===500&&e.error(`Internal server error
3
3
  ${o.stack}
4
- `,{url:t.url,payload:r})},F=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[y]?.examples||[];if(!r&&t==="original")return o;let i=[];for(let s of o){let a=e.safeParse(s);a.success&&i.push(t==="parsed"?a.data:s)}return i},J=(e,t,r)=>e.length&&t.length?ro(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(""),Fe=e=>Xr("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ke=(e,t)=>{try{return typeof e.parse(t)}catch{return}},j=e=>typeof e=="object"&&e!==null;import{clone as ao,mergeDeepRight as po}from"ramda";var y=Symbol.for("express-zod-api"),Be=e=>{let t=e.describe(e.description);return t._def[y]=ao(t._def[y])||{examples:[]},t},Yt=(e,t)=>{if(!(y in e._def))return t;let r=Be(t);return r._def[y].examples=J(r._def[y].examples,e._def[y].examples,([o,i])=>typeof o=="object"&&typeof i=="object"?po({...o},{...i}):i),r};var lo=function(e){let t=Be(this);return t._def[y].examples.push(e),t},mo=function(e){let t=Be(this);return t._def[y].defaultLabel=e,t},uo=function(e){return new qe.ZodBranded({typeName:qe.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[y]:{examples:[],...co(this._def[y]),brand:e}})};y in globalThis||(globalThis[y]=!0,Object.defineProperties(qe.ZodType.prototype,{example:{get(){return lo.bind(this)}},brand:{set(){},get(){return uo.bind(this)}}}),Object.defineProperty(qe.ZodDefault.prototype,"label",{get(){return mo.bind(this)}}));function fo(e){return e}import{z as Po}from"zod";import Oo from"assert/strict";import{z as nr}from"zod";import{z as xo}from"zod";import{z as go}from"zod";import{z as $e}from"zod";var K=Symbol("File"),Qt=$e.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),yo={buffer:()=>Qt.brand(K),string:()=>$e.string().brand(K),binary:()=>Qt.or($e.string()).brand(K),base64:()=>$e.string().base64().brand(K)};function Ve(e){return yo[e||"string"]()}var W=Symbol("Raw"),Jt=(e={})=>go.object({raw:Ve("buffer")}).extend(e).brand(W);import{z as ho}from"zod";var Ae=Symbol("Upload"),Wt=()=>ho.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 gt=(e,{next:t})=>e.options.some(t),er=({_def:e},{next:t})=>[e.left,e.right].some(t),Xt=(e,{next:t})=>t(e.unwrap()),bo={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:gt,ZodDiscriminatedUnion:gt,ZodIntersection:er,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:Xt,ZodNullable:Xt,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},Ge=(e,{condition:t,rules:r=bo,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=>Ge(a,{condition:t,rules:r,maxDepth:i,depth:o+1})}):!1},_e=e=>Ge(e,{maxDepth:3,rules:{ZodUnion:gt,ZodIntersection:er},condition:t=>t instanceof xo.ZodEffects&&t._def.effect.type!=="refinement"}),tr=e=>Ge(e,{condition:t=>t._def[y]?.brand===Ae}),rr=e=>Ge(e,{condition:t=>t._def[y]?.brand===W,maxDepth:3});var Ye=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
- Original error: ${e.originalError.message}.`:""))};import{chain as To}from"ramda";var X=e=>j(e)&&"or"in e,pe=e=>j(e)&&"and"in e,ht=e=>({and:To(t=>pe(t)?t.and:[t],e)}),Qe=(e,t)=>pe(e)?{and:e.and.map(r=>X(r)?{or:r.or.map(t)}:t(r))}:X(e)?{or:e.or.map(r=>pe(r)?{and:r.and.map(t)}:t(r))}:t(e),xt=e=>e.and.reduce((t,r)=>({or:J(t.or,X(r)?r.or:[r],ht)}),{or:[]}),ae=(e,t)=>pe(e)?X(t)?ae(xt(e),t):ht([e,t]):X(e)?pe(t)?ae(t,e):X(t)?{or:J(e.or,t.or,ht)}:ae(e,{and:[t]}):pe(t)||X(t)?ae(t,e):{and:[e,t]};import{z as or}from"zod";import So from"assert/strict";var bt=class{},B=class extends bt{#e;#t;#r;constructor({input:t,security:r,handler:o}){super(),So(!_e(t),new U("Using transformations on the top level of middleware input schema is not allowed.")),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}}},ce=class extends B{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,d=>{if(d&&d instanceof Error)return p(o(d));a(r(i,s))})})})}};var Pe=class{},Je=class extends Pe{#e;#t;#r;#s;#n;#a;#p;#o;#c;#d;#l;#i;constructor({methods:t,inputSchema:r,outputSchema:o,handler:i,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:c=[],tags:d=[],description:l,shortDescription:f}){super(),this.#a=i,this.#p=s,this.#r=c,this.#l=a,this.#t=Object.freeze(t),this.#c=Object.freeze(p),this.#d=Object.freeze(d),this.#e={long:l,short:f},this.#o={input:r,output:o};for(let[u,x]of Object.entries(this.#o))Oo(!_e(x),new U(`Using transformations on the top level of endpoint ${u} schema is not allowed.`));this.#n={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([I[this.#i]]),positive:Object.freeze(this.#n.positive.flatMap(({mimeTypes:u})=>u)),negative:Object.freeze(this.#n.negative.flatMap(({mimeTypes:u})=>u))}}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return t==="input"||t==="output"?this.#o[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.#n[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?ae(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.#o.output.parseAsync(t)}catch(r){throw r instanceof nr.ZodError?new Q(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 ce))&&(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.#o.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(c){Ye({logger:i,response:o,error:new H(se(c).message,t)})}}async execute({request:t,response:r,logger:o,config:i,siblingMethods:s=[]}){let a=mt(t),p={},c=null,d=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 u in f)r.set(u,f[u])}let l=_t(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}c=await this.#u(await this.#y({input:l,logger:o,options:p}))}catch(f){d=se(f)}await this.#g({input:l,output:c,request:t,response:r,error:d,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)=>Yt(s,i),o)};import{z as v}from"zod";var Ie={positive:200,negative:400};import Ro from"assert/strict";import{z as Ao}from"zod";var We=(e,t)=>typeof e=="function"?We(e(...t.arguments),t):e instanceof Ao.ZodType?[{...t,schema:e}]:(Array.isArray(e)&&Ro(e.length,new H(`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)}},Ce=class extends Tt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return We(this.#e,{variant:"positive",arguments:[t],statusCodes:[Ie.positive],mimeTypes:[I.json]})}getNegativeResponse(){return We(this.#t,{variant:"negative",arguments:[],statusCodes:[Ie.negative],mimeTypes:[I.json]})}},ze=new Ce({positive:e=>{let t=F({schema:e}),r=v.object({status:v.literal("success"),data:e});return t.reduce((o,i)=>o.example({status:"success",data:i}),r)},negative:v.object({status:v.literal("error"),error:v.object({message:v.string()})}).example({status:"error",error:{message:D(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:i,logger:s})=>{if(!e){i.status(Ie.positive).json({status:"success",data:r});return}let a=De(e);ft({logger:s,statusCode:a,request:o,error:e,input:t}),i.status(a).json({status:"error",error:{message:D(e)}})}}),St=new Ce({positive:e=>{let t=F({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof v.ZodArray?e.shape.items:v.array(v.any());return t.reduce((o,i)=>j(i)&&"items"in i&&Array.isArray(i.items)?o.example(i.items):o,r)},negative:v.string().example(D(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:i,input:s})=>{if(r){let a=De(r);ft({logger:o,statusCode:a,request:i,error:r,input:s}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(Ie.positive).json(t.items):e.status(500).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 B?t:new B(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new ce(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new B({input:Po.object({}),handler:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:i,shortDescription:s,operationId:a,...p}){let{middlewares:c,resultHandler:d}=this,l="methods"in p?p.methods:[p.method],f=typeof a=="function"?a:()=>a,u="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],x="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Je({handler:r,middlewares:c,outputSchema:o,resultHandler:d,scopes:u,tags:x,methods:l,getOperationId:f,description:i,shortDescription:s,inputSchema:ir(c,t)})}},Io=new we(ze),Co=new we(St);import{Ansis as zo,blue as wo,cyanBright as Zo,green as Eo,hex as vo,red as Lo}from"ansis";import{inspect as No}from"util";var de={debug:10,info:20,warn:30,error:40},sr=e=>j(e)&&Object.keys(de).some(t=>t in e);var Ze=class e{constructor(t){this.config=t;let{color:r=new zo().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:wo,info:Eo,warn:vo("#FFA500"),error:Lo};prettyPrint(t){let{depth:r=2}=this.config;return No(t,{depth:r,colors:this.hasColor,breakLength:this.config.level==="debug"?80:1/0,compact:this.config.level==="debug"?3:!0})}print(t,r,o){if(this.config.level==="silent"||de[t]<de[this.config.level])return;let{requestId:i,...s}=this.config.ctx||{},a=[new Date().toISOString()];i&&a.push(this.hasColor?Zo(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})}};import{head as jo,tail as ko,toPairs as Mo}from"ramda";var Ee=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze(Mo(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=jo(this.pairs)?.[1],this.siblingMethods=Object.freeze(ko(this.pairs).map(([r])=>r))}};import Uo from"express";var ve=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Uo.static(...this.params))}};import Rt from"express";import qo from"http";import $o from"https";var le=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new Oe(e)};import ar from"assert/strict";var ee=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:i})=>{let s=Object.entries(e).map(([a,p])=>[a.trim(),p]);for(let[a,p]of s){ar.doesNotMatch(a,/\//,new ie(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let c=`${o||""}${a?`/${a}`:""}`;if(p instanceof Pe){let d=p.getMethods().slice();i&&d.push("options");for(let l of d)t(p,c,l)}else if(p instanceof ve)r&&p.apply(c,r);else if(p instanceof Ee){for(let[d,l]of p.pairs)ar(l.getMethods().includes(d),new ie(`Endpoint assigned to ${d} method of ${c} must support ${d} method.`)),t(l,c,d);i&&p.firstEndpoint&&t(p.firstEndpoint,c,"options",p.siblingMethods)}else ee({onEndpoint:t,onStatic:r,hasCors:i,routing:p,parentPath:c})}};var Ot=({app:e,rootLogger:t,config:r,routing:o,parsers:i})=>ee({routing:o,hasCors:!!r.cors,onEndpoint:(s,a,p,c)=>{e[p](a,...i?.[s.getRequestType()]||[],async(d,l)=>s.execute({request:d,response:l,logger:l.locals[y]?.logger||t,config:r,siblingMethods:c}))},onStatic:(s,a)=>{e.use(s,a)}});import pr,{isHttpError as Ho}from"http-errors";var cr=({errorHandler:e,rootLogger:t})=>async(r,o,i,s)=>{if(!r)return s();e.execute({error:Ho(r)?r:pr(400,se(r).message),request:o,response:i,input:null,output:null,options:{},logger:i.locals[y]?.logger||t})},dr=({errorHandler:e,rootLogger:t})=>async(r,o)=>{let i=pr(404,`Can not ${r.method} ${r.path}`),s=o.locals[y]?.logger||t;try{e.execute({request:r,response:o,logger:s,error:i,input:null,output:null,options:{}})}catch(a){Ye({response:o,logger:s,error:new H(se(a).message,i)})}},Do=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:i})=>i))return r(e);r()},Fo=e=>({log:e.debug.bind(e)}),lr=async({rootLogger:e,config:t})=>{let r=await le("express-fileupload"),{limitError:o,beforeUpload:i,...s}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,c,d)=>{let l=c.locals[y]?.logger||e;try{await i?.({request:p,logger:l})}catch(f){return d(f)}r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Fo(l)})(p,c,d)}),o&&a.push(Do(o)),a},mr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},ur=({rootLogger:e,config:t})=>async(r,o,i)=>{let s=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;s.debug(`${r.method}: ${r.path}`),o.locals[y]={logger:s},i()};import{gray as Ko,hex as fr,italic as Xe,whiteBright as Bo}from"ansis";var yr=()=>{let e=Xe("Proudly supports transgender community.".padStart(109)),t=Xe("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=Xe("Thank you for choosing Express Zod API for your project.".padStart(132)),o=Xe("for Zoey".padEnd(20)),i=fr("#F5A9B8"),s=fr("#5BCEFA"),a=new Array(14).fill(s,1,3).fill(i,3,5).fill(Bo,5,7).fill(i,7,9).fill(s,9,12).fill(Ko,12,13);return`
4
+ `,{url:t.url,payload:r})},D=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[y]?.examples||[];if(!r&&t==="original")return o;let i=[];for(let s of o){let a=e.safeParse(s);a.success&&i.push(t==="parsed"?a.data:s)}return i},Y=(e,t,r)=>e.length&&t.length?so(e,t).map(r):e.concat(t),Re=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,ut=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(ut).join(""),Ke=e=>oo("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Be=(e,t)=>{try{return typeof e.parse(t)}catch{return}},v=e=>typeof e=="object"&&e!==null;import{clone as mo,mergeDeepRight as uo}from"ramda";var y=Symbol.for("express-zod-api"),qe=e=>{let t=e.describe(e.description);return t._def[y]=mo(t._def[y])||{examples:[]},t},Gt=(e,t)=>{if(!(y in e._def))return t;let r=qe(t);return r._def[y].examples=Y(r._def[y].examples,e._def[y].examples,([o,i])=>typeof o=="object"&&typeof i=="object"?uo({...o},{...i}):i),r};var fo=function(e){let t=qe(this);return t._def[y].examples.push(e),t},yo=function(e){let t=qe(this);return t._def[y].defaultLabel=e,t},go=function(e){return new ae.ZodBranded({typeName:ae.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[y]:{examples:[],...Xt(this._def[y]),brand:e}})},ho=function(e){return this.transform(Qt(Jt,Yt(([t,r])=>Wt(e[t],r)),_t)).pipe(ae.object(Qt(Jt,Yt(([t,r])=>Wt(e[String(t)],r)),_t)(Xt(this.shape))))};y in globalThis||(globalThis[y]=!0,Object.defineProperties(ae.ZodType.prototype,{example:{get(){return fo.bind(this)}},brand:{set(){},get(){return go.bind(this)}}}),Object.defineProperty(ae.ZodDefault.prototype,"label",{get(){return yo.bind(this)}}),Object.defineProperty(ae.ZodObject.prototype,"remap",{get(){return ho.bind(this)}}));function xo(e){return e}import{z as Co}from"zod";import{z as pr}from"zod";import{z as To}from"zod";import{z as $e}from"zod";var F=Symbol("File"),er=$e.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),bo={buffer:()=>er.brand(F),string:()=>$e.string().brand(F),binary:()=>er.or($e.string()).brand(F),base64:()=>$e.string().base64().brand(F)};function Ve(e){return bo[e||"string"]()}var Q=Symbol("Raw"),tr=(e={})=>To.object({raw:Ve("buffer")}).extend(e).brand(Q);import{z as So}from"zod";var Ae=Symbol("Upload"),rr=()=>So.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 or=(e,{next:t})=>e.options.some(t),Oo=({_def:e},{next:t})=>[e.left,e.right].some(t),nr=(e,{next:t})=>t(e.unwrap()),Ro={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:or,ZodDiscriminatedUnion:or,ZodIntersection:Oo,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:nr,ZodNullable:nr,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},ft=(e,{condition:t,rules:r=Ro,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=>ft(a,{condition:t,rules:r,maxDepth:i,depth:o+1})}):!1},ir=e=>ft(e,{condition:t=>t._def[y]?.brand===Ae}),sr=e=>ft(e,{condition:t=>t._def[y]?.brand===Q,maxDepth:3});var Ge=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
+ Original error: ${e.originalError.message}.`:""))};import{chain as Ao}from"ramda";var J=e=>v(e)&&"or"in e,ce=e=>v(e)&&"and"in e,yt=e=>({and:Ao(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),gt=e=>e.and.reduce((t,r)=>({or:Y(t.or,J(r)?r.or:[r],yt)}),{or:[]}),pe=(e,t)=>ce(e)?J(t)?pe(gt(e),t):yt([e,t]):J(e)?ce(t)?pe(t,e):J(t)?{or:Y(e.or,t.or,yt)}:pe(e,{and:[t]}):ce(t)||J(t)?pe(t,e):{and:[e,t]};import{z as ar}from"zod";var ht=class{},K=class extends ht{#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 ar.ZodError?new N(o):o}}},de=class extends K{constructor(t,{provider:r=()=>({}),transformer:o=i=>i}={}){super({input:ar.object({}),handler:async({request:i,response:s})=>new Promise((a,p)=>{t(i,s,d=>{if(d&&d instanceof Error)return p(o(d));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:c=[],tags:d=[],description:l,shortDescription:f}){super(),this.#a=i,this.#p=s,this.#r=c,this.#l=a,this.#t=Object.freeze(t),this.#c=Object.freeze(p),this.#d=Object.freeze(d),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=ir(r)?"upload":sr(r)?"raw":"json",this.#s={input:Object.freeze([P[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?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 pr.ZodError?new _(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 pr.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(c){Ge({logger:i,response:o,error:new U(se(c).message,t)})}}async execute({request:t,response:r,logger:o,config:i,siblingMethods:s=[]}){let a=dt(t),p={},c=null,d=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 u in f)r.set(u,f[u])}let l=Vt(t,i.inputSources);try{if(await this.#f({method:a,input:l,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}c=await this.#u(await this.#y({input:l,logger:o,options:p}))}catch(f){d=se(f)}await this.#g({input:l,output:c,request:t,response:r,error:d,logger:o,options:p})}};var cr=(e,t)=>{let r=e.map(i=>i.getSchema()).concat(t),o=r.reduce((i,s)=>i.and(s));return r.reduce((i,s)=>Gt(s,i),o)};import{z as j}from"zod";var Ie={positive:200,negative:400};import Po from"assert/strict";import{z as Io}from"zod";var Qe=(e,t)=>typeof e=="function"?Qe(e(...t.arguments),t):e instanceof Io.ZodType?[{...t,schema:e}]:(Array.isArray(e)&&Po(e.length,new U(`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 xt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},Ce=class extends xt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return Qe(this.#e,{variant:"positive",arguments:[t],statusCodes:[Ie.positive],mimeTypes:[P.json]})}getNegativeResponse(){return Qe(this.#t,{variant:"negative",arguments:[],statusCodes:[Ie.negative],mimeTypes:[P.json]})}},ze=new Ce({positive:e=>{let t=D({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:H(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:i,logger:s})=>{if(!e){i.status(Ie.positive).json({status:"success",data:r});return}let a=Fe(e);mt({logger:s,statusCode:a,request:o,error:e,input:t}),i.status(a).json({status:"error",error:{message:H(e)}})}}),bt=new Ce({positive:e=>{let t=D({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)=>v(i)&&"items"in i&&Array.isArray(i.items)?o.example(i.items):o,r)},negative:j.string().example(H(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:i,input:s})=>{if(r){let a=Fe(r);mt({logger:o,statusCode:a,request:i,error:r,input:s}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(Ie.positive).json(t.items):e.status(500).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 K?t:new K(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 K({input:Co.object({}),handler:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:i,shortDescription:s,operationId:a,...p}){let{middlewares:c,resultHandler:d}=this,l="methods"in p?p.methods:[p.method],f=typeof a=="function"?a:()=>a,u="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:c,outputSchema:o,resultHandler:d,scopes:u,tags:T,methods:l,getOperationId:f,description:i,shortDescription:s,inputSchema:cr(c,t)})}},zo=new we(ze),wo=new we(bt);import{Ansis as Zo,blue as Eo,cyanBright as jo,green as Lo,hex as No,red as vo}from"ansis";import{inspect as ko}from"util";var le={debug:10,info:20,warn:30,error:40},dr=e=>v(e)&&Object.keys(le).some(t=>t in e);var Ze=class e{constructor(t){this.config=t;let{color:r=new Zo().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:Eo,info:Lo,warn:No("#FFA500"),error:vo};prettyPrint(t){let{depth:r=2}=this.config;return ko(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?jo(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})}};import{head as Mo,tail as Uo,toPairs as Ho}from"ramda";var Ee=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze(Ho(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=Mo(this.pairs)?.[1],this.siblingMethods=Object.freeze(Uo(this.pairs).map(([r])=>r))}};import Do from"express";var je=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Do.static(...this.params))}};import St from"express";import Vo from"http";import Go from"https";var me=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new Oe(e)};import lr from"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 c=`${o||""}${a?`/${a}`:""}`;if(p instanceof Pe){let d=p.getMethods().slice();i&&d.push("options");for(let l of d)t(p,c,l)}else if(p instanceof je)r&&p.apply(c,r);else if(p instanceof Ee){for(let[d,l]of p.pairs)lr(l.getMethods().includes(d),new ie(`Endpoint assigned to ${d} method of ${c} must support ${d} method.`)),t(l,c,d);i&&p.firstEndpoint&&t(p.firstEndpoint,c,"options",p.siblingMethods)}else W({onEndpoint:t,onStatic:r,hasCors:i,routing:p,parentPath:c})}};var Tt=({app:e,rootLogger:t,config:r,routing:o,parsers:i})=>W({routing:o,hasCors:!!r.cors,onEndpoint:(s,a,p,c)=>{e[p](a,...i?.[s.getRequestType()]||[],async(d,l)=>s.execute({request:d,response:l,logger:l.locals[y]?.logger||t,config:r,siblingMethods:c}))},onStatic:(s,a)=>{e.use(s,a)}});import mr,{isHttpError as Fo}from"http-errors";var ur=({errorHandler:e,rootLogger:t})=>async(r,o,i,s)=>{if(!r)return s();e.execute({error:Fo(r)?r:mr(400,se(r).message),request:o,response:i,input:null,output:null,options:{},logger:i.locals[y]?.logger||t})},fr=({errorHandler:e,rootLogger:t})=>async(r,o)=>{let i=mr(404,`Can not ${r.method} ${r.path}`),s=o.locals[y]?.logger||t;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 U(se(a).message,i)})}},Ko=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:i})=>i))return r(e);r()},Bo=e=>({log:e.debug.bind(e)}),yr=async({rootLogger: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,c,d)=>{let l=c.locals[y]?.logger||e;try{await i?.({request:p,logger:l})}catch(f){return d(f)}r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Bo(l)})(p,c,d)}),o&&a.push(Ko(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}`),o.locals[y]={logger:s},i()};import{gray as qo,hex as xr,italic as Je,whiteBright as $o}from"ansis";var br=()=>{let e=Je("Proudly supports transgender community.".padStart(109)),t=Je("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=Je("Thank you for choosing Express Zod API for your project.".padStart(132)),o=Je("for Zoey".padEnd(20)),i=xr("#F5A9B8"),s=xr("#5BCEFA"),a=new Array(14).fill(s,1,3).fill(i,3,5).fill($o,5,7).fill(i,7,9).fill(s,9,12).fill(qo,12,13);return`
6
6
  8888888888 8888888888P 888 d8888 8888888b. 8888888
7
7
  888 d88P 888 d88888 888 Y88b 888
8
8
  888 d88P 888 d88P888 888 888 888
@@ -17,8 +17,8 @@ ${o}888${t}
17
17
  ${r}
18
18
  `.split(`
19
19
  `).map((c,d)=>a[d]?a[d](c):c).join(`
20
- `)};var gr=e=>{e.startupLogo!==!1&&console.log(yr());let t=e.errorHandler||ze,r=sr(e.logger)?e.logger:new Ze(e.logger);r.debug("Running","v20.0.1 (ESM)");let o=ur({rootLogger:r,config:e}),i=dr({rootLogger:r,errorHandler:t}),s=cr({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:i,parserFailureHandler:s,loggingMiddleware:o}},Vo=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:i}=gr(e);return Ot({app:e.app.use(i),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},Go=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,parserFailureHandler:i,loggingMiddleware:s}=gr(e),a=Rt().disable("x-powered-by").use(s);if(e.server.compression){let l=await le("compression");a.use(l(typeof e.server.compression=="object"?e.server.compression:void 0))}let p={json:[e.server.jsonParser||Rt.json()],raw:[e.server.rawParser||Rt.raw(),mr],upload:e.server.upload?await lr({config:e,rootLogger:r}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:a,logger:r}),Ot({app:a,routing:t,rootLogger:r,config:e,parsers:p}),a.use(i,o);let c=(l,f)=>l.listen(f,()=>{r.info("Listening",f)}),d={httpServer:c(qo.createServer(a),e.server.listen),httpsServer:e.https?c($o.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...d,logger:r}};import ti from"assert/strict";import{OpenApiBuilder as ri}from"openapi3-ts/oas31";import{pluck as oi}from"ramda";import q from"assert/strict";import{isReferenceObject as Pt,isSchemaObject as rt}from"openapi3-ts/oas31";import{both as Yo,complement as Qo,concat as Jo,type as Wo,filter as Xo,fromPairs as ke,has as en,isNil as tn,map as ue,mergeAll as rn,mergeDeepRight as on,mergeDeepWith as nn,objOf as Sr,omit as ot,pipe as Or,pluck as sn,range as an,reject as pn,toLower as cn,union as dn,when as ln,xprod as nt,zip as mn}from"ramda";import{z as T}from"zod";import{z as Le}from"zod";var et=e=>!isNaN(e.getTime());var Ne=Symbol("DateIn"),hr=()=>Le.union([Le.string().date(),Le.string().datetime(),Le.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Le.date().refine(et)).brand(Ne);import{z as _o}from"zod";var je=Symbol("DateOut"),xr=()=>_o.date().refine(et).transform(e=>e.toISOString()).brand(je);var te=(e,{onEach:t,rules:r,onMissing:o,ctx:i={}})=>{let s=r[e._def[y]?.brand]||r[e._def.typeName],p=s?s(e,{...i,next:d=>te(d,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),c=t&&t(e,{prev:p,...i});return c?{...p,...c}:p};var br=50,Rr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",un={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Ar=/:([A-Za-z0-9_]+)/g,fn=e=>e.match(Ar)?.map(t=>t.slice(1))||[],Pr=e=>e.replace(Ar,t=>`{${t.slice(1)}}`),yn=({_def:e},{next:t})=>({...t(e.innerType),default:e[y]?.defaultLabel||e.defaultValue()}),gn=({_def:{innerType:e}},{next:t})=>t(e),hn=()=>({format:"any"}),xn=({},e)=>(q(!e.isResponse,new P({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),bn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof T.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Tn=({options:e},{next:t})=>({oneOf:e.map(t)}),Sn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),On=e=>{let[t,r]=e.filter(rt).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));q(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=nn((i,s)=>Array.isArray(i)&&Array.isArray(s)?Jo(i,s):i===s?s:q.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=dn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=J(t.examples||[],r.examples||[],([i,s])=>on(i,s))),o},Rn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return On(o)}catch{}return{allOf:o}},An=(e,{next:t})=>t(e.unwrap()),Pn=(e,{next:t})=>t(e.unwrap()),In=(e,{next:t})=>{let r=t(e.unwrap());return rt(r)&&(r.type=Cr(r)),r},Ir=e=>{let t=cn(Wo(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Tr=e=>({type:Ir(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Cn=({value:e})=>({type:Ir(e),const:e}),zn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&Re(p)?p instanceof T.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=tt(e,r)),s.length&&(a.required=s),a},wn=()=>({type:"null"}),Zn=({},e)=>(q(!e.isResponse,new P({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:Rr}}),En=({},e)=>(q(e.isResponse,new P({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Rr}}),vn=({},e)=>q.fail(new P({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),Ln=()=>({type:"boolean"}),Nn=()=>({type:"integer",format:"bigint"}),jn=e=>e.every(t=>t instanceof T.ZodLiteral),kn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof T.ZodEnum||e instanceof T.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=tt(T.object(ke(nt(o,[t]))),r),i.required=o),i}if(e instanceof T.ZodLiteral)return{type:"object",properties:tt(T.object({[e.value]:t}),r),required:[e.value]};if(e instanceof T.ZodUnion&&jn(e.options)){let o=ue(s=>`${s.value}`,e.options),i=ke(nt(o,[t]));return{type:"object",properties:tt(T.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},Mn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let i={type:"array",items:o(r)};return e&&(i.minItems=e.value),t&&(i.maxItems=t.value),i},Un=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Hn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:c,isEmoji:d,isDatetime:l,_def:{checks:f}})=>{let u=f.find(R=>R.kind==="regex"),x=f.find(R=>R.kind==="datetime"),C=u?u.regex:x?x.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,b={type:"string"},E={"date-time":l,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:c,emoji:d};for(let R in E)if(E[R]){b.format=R;break}return r!==null&&(b.minLength=r),o!==null&&(b.maxLength=o),C&&(b.pattern=C.source),b},Dn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let i=o.find(f=>f.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=i?i.inclusive:!0,p=o.find(f=>f.kind==="max"),c=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,d=p?p.inclusive:!0,l={type:e?"integer":"number",format:e?"int64":"double"};return a?l.minimum=s:l.exclusiveMinimum=s,d?l.maximum=c:l.exclusiveMaximum=c,l},tt=({shape:e},t)=>ue(t,e),Fn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return un?.[t]},Cr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},Kn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&rt(o)){let s=Ke(e,Fn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(T.any())}if(!t&&i.type==="preprocess"&&rt(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Bn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),qn=(e,{next:t})=>t(e.unwrap()),$n=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},Vn=(e,{next:t})=>t(e.unwrap().shape.raw),zr=e=>e.length?ke(mn(an(1,e.length+1).map(t=>`example${t}`),ue(Sr("value"),e))):void 0,wr=(e,t,r=[])=>Or(F,ue(ln(Yo(j,Qo(Array.isArray)),ot(r))),zr)({schema:e,variant:t?"parsed":"original",validate:!0}),Gn=(e,t)=>Or(F,Xo(en(t)),sn(t),zr)({schema:e,variant:"original",validate:!0}),me=(e,t)=>e instanceof T.ZodObject?e:e instanceof T.ZodBranded?me(e.unwrap(),t):e instanceof T.ZodUnion||e instanceof T.ZodDiscriminatedUnion?e.options.map(r=>me(r,t)).reduce((r,o)=>r.merge(o.partial()),T.object({})):e instanceof T.ZodEffects?(q(e._def.effect.type==="refinement",t),me(e._def.schema,t)):me(e._def.left,t).merge(me(e._def.right,t)),Zr=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,description:d=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:l}=me(r,new P({message:"Using transformations on the top level schema is not allowed.",path:e,method:t,isResponse:!1})),f=fn(e),u=o.includes("query"),x=o.includes("params"),C=o.includes("headers"),b=h=>x&&f.includes(h),E=h=>C&&ut(h);return Object.keys(l).map(h=>({name:h,location:b(h)?"path":E(h)?"header":u?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:ge})=>{let M=te(l[h],{rules:{...c,...It},onEach:Ct,onMissing:zt,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),_=p==="components"?a(w(d,h),M):M;return{name:h,in:ge,required:!l[h].isOptional(),description:M.description||d,schema:_,examples:Gn(r,h)}})},It={ZodString:Hn,ZodNumber:Dn,ZodBigInt:Nn,ZodBoolean:Ln,ZodNull:wn,ZodArray:Mn,ZodTuple:Un,ZodRecord:kn,ZodObject:zn,ZodLiteral:Cn,ZodIntersection:Rn,ZodUnion:Tn,ZodAny:hn,ZodDefault:yn,ZodEnum:Tr,ZodNativeEnum:Tr,ZodEffects:Kn,ZodOptional:An,ZodNullable:In,ZodDiscriminatedUnion:Sn,ZodBranded:qn,ZodDate:vn,ZodCatch:gn,ZodPipeline:Bn,ZodLazy:$n,ZodReadonly:Pn,[K]:bn,[Ae]:xn,[je]:En,[Ne]:Zn,[W]:Vn},Ct=(e,{isResponse:t,prev:r})=>{if(Pt(r))return{};let{description:o}=e,i=e instanceof T.ZodLazy,s=r.type!==void 0,a=t&&Re(e),p=!i&&s&&!a&&e.isNullable(),c=i?[]:F({schema:e,variant:t?"parsed":"original",validate:!0}),d={};return o&&(d.description=o),p&&(d.type=Cr(r)),c.length&&(d.examples=c.slice()),d},zt=(e,t)=>q.fail(new P({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=ot(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>ot(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},Er=e=>Pt(e)?e:ot(["examples"],e),vr=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:c,hasMultipleStatusCodes:d,statusCode:l,brandHandling:f,description:u=`${e.toUpperCase()} ${t} ${yt(i)} response ${d?l:""}`.trim()})=>{let x=Er(te(r,{rules:{...f,...It},onEach:Ct,onMissing:zt,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),C={schema:c==="components"?p(w(u),x):x,examples:wr(r,!0)};return{description:u,content:ke(nt(o,[C]))}},_n=()=>({type:"http",scheme:"basic"}),Yn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Qn=({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},Jn=({name:e})=>({type:"apiKey",in:"header",name:e}),Wn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Xn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),ei=({flows:e={}})=>({type:"oauth2",flows:ue(t=>({...t,scopes:t.scopes||{}}),pn(tn,e))}),Lr=(e,t)=>{let r={basic:_n,bearer:Yn,input:Qn,header:Jn,cookie:Wn,openid:Xn,oauth2:ei};return Qe(e,o=>r[o.type](o,t))},it=e=>"or"in e?e.or.map(t=>"and"in t?rn(ue(({name:r,scopes:o})=>Sr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?it(xt(e)):it({or:[e]}),Nr=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,paramNames:d,description:l=`${e.toUpperCase()} ${t} Request body`})=>{let f=Er(At(te(r,{rules:{...c,...It},onEach:Ct,onMissing:zt,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),d)),u={schema:p==="components"?a(w(l),f):f,examples:wr(r,!1,d)};return{description:l,content:ke(nt(o,[u]))}},jr=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<=br?e:e.slice(0,br-1)+"\u2026";var Zt=class extends ri{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&&ti.fail(new P({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(i,s),`${i}${s}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let i in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[i]))return i;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:i,serverUrl:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:c=!0,composition:d="inline",serializer:l=Fe}){super(),this.addInfo({title:o,version:i});for(let u of typeof s=="string"?[s]:s)this.addServer({url:u});ee({routing:t,onEndpoint:(u,x,C)=>{let b=C,E={path:x,method:b,endpoint:u,composition:d,serializer:l,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[R,h]=["short","long"].map(u.getDescription.bind(u)),ge=R?wt(R):c&&h?wt(h):void 0,M=u.getTags(),_=r.inputSources?.[b]||lt[b],oe=this.ensureUniqOperationId(x,b,u.getOperationId(b)),he=Zr({...E,inputSources:_,schema:u.getSchema("input"),description:a?.requestParameter?.call(null,{method:b,path:x,operationId:oe})}),Ue={};for(let L of["positive","negative"]){let Y=u.getResponses(L);for(let{mimeTypes:xe,schema:S,statusCodes:O}of Y)for(let A of O)Ue[A]=vr({...E,variant:L,schema:S,mimeTypes:xe,statusCode:A,hasMultipleStatusCodes:Y.length>1||O.length>1,description:a?.[`${L}Response`]?.call(null,{method:b,path:x,operationId:oe,statusCode:A})})}let dt=_.includes("body")?Nr({...E,paramNames:oi("name",he),schema:u.getSchema("input"),mimeTypes:u.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:b,path:x,operationId:oe})}):void 0,He=it(Qe(Lr(u.getSecurity(),_),L=>{let Y=this.ensureUniqSecuritySchemaName(L),xe=["oauth2","openIdConnect"].includes(L.type)?u.getScopes().slice():[];return this.addSecurityScheme(Y,L),{name:Y,scopes:xe}}));this.addPath(Pr(x),{[b]:{operationId:oe,summary:ge,description:h,tags:M.length>0?M:void 0,parameters:he.length>0?he:void 0,requestBody:dt,security:He.length>0?He:void 0,responses:Ue}})}}),this.rootDoc.tags=r.tags?jr(r.tags):[]}};import{createRequest as ni,createResponse as ii}from"node-mocks-http";var si=e=>ni({...e,headers:{"content-type":I.json,...e?.headers}}),ai=e=>ii(e),pi=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,i){return o==="_getLogs"?()=>t:o in de?(...s)=>t[o].push(s):Reflect.get(r,o,i)}})},ci=async({endpoint:e,requestProps:t,responseOptions:r,configProps:o,loggerProps:i})=>{let s=si(t),a=ai({req:s,...r}),p=pi(i),c={cors:!1,logger:p,...o};return await e.execute({request:s,response:a,config:c,logger:p}),{requestMock:s,responseMock:a,loggerMock:p}};import Z from"typescript";import k from"typescript";import{chain as kr,toPairs as Mr}from"ramda";var n=k.factory,$=[n.createModifier(k.SyntaxKind.ExportKeyword)],di=[n.createModifier(k.SyntaxKind.AsyncKeyword)],li=[n.createModifier(k.SyntaxKind.PublicKeyword),n.createModifier(k.SyntaxKind.ReadonlyKeyword)],Ur=[n.createModifier(k.SyntaxKind.ProtectedKeyword),n.createModifier(k.SyntaxKind.ReadonlyKeyword)],Et=n.createTemplateHead(""),fe=n.createTemplateTail(""),vt=n.createTemplateMiddle(" "),Lt=e=>n.createTemplateLiteralType(Et,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?fe:vt))),Nt=Lt(["M","P"]),st=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),at=(e,t)=>kr(([r,o])=>[st(n.createIdentifier(r),o,t)],Mr(e)),jt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),Hr=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),Dr=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),V=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],k.NodeFlags.Const),kt=(e,t)=>n.createTypeAliasDeclaration($,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),pt=(e,t)=>n.createTypeAliasDeclaration($,e,void 0,t),Fr=(e,t,r)=>n.createPropertyDeclaration(li,e,void 0,t,r),Kr=(e,t,r)=>n.createClassDeclaration($,e,void 0,void 0,[t,...r]),Br=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),qr=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(k.SyntaxKind.AnyKeyword)]),$r=(e,t,r)=>n.createInterfaceDeclaration($,e,void 0,t,r),Vr=e=>kr(([t,r])=>[n.createTypeParameterDeclaration([],t,n.createTypeReferenceNode(r))],Mr(e)),Mt=(e,t,r)=>n.createArrowFunction(r?di:void 0,void 0,e.map(o=>st(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,at({acc:void 0,key:void 0}),void 0,void 0,t),r]),Gr=(...e)=>`"${e.join(" ")}"`;var _r=["get","post","put","delete","patch"];import g from"typescript";import{z as Ft}from"zod";import G from"typescript";var{factory:ct}=G,Ht=(e,t)=>{G.addSyntheticLeadingComment(e,G.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ye=(e,t,r)=>{let o=ct.createTypeAliasDeclaration(void 0,ct.createIdentifier(t),void 0,e);return r&&Ht(o,r),o},Dt=(e,t)=>{let r=G.createSourceFile("print.ts","",G.ScriptTarget.Latest,!1,G.ScriptKind.TS);return G.createPrinter(t).printNode(G.EmitHint.Unspecified,e,r)},mi=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Yr=e=>mi.test(e)?ct.createIdentifier(e):ct.createStringLiteral(e);var{factory:m}=g,ui={[g.SyntaxKind.AnyKeyword]:"",[g.SyntaxKind.BigIntKeyword]:BigInt(0),[g.SyntaxKind.BooleanKeyword]:!1,[g.SyntaxKind.NumberKeyword]:0,[g.SyntaxKind.ObjectKeyword]:{},[g.SyntaxKind.StringKeyword]:"",[g.SyntaxKind.UndefinedKeyword]:void 0},fi=({value:e})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),yi=({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(),c=m.createPropertySignature(void 0,Yr(s),p&&o?m.createToken(g.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Ht(c,a.description),c});return m.createTypeLiteralNode(i)},gi=({element:e},{next:t})=>m.createArrayTypeNode(t(e)),hi=({options:e})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),Qr=({options:e},{next:t})=>m.createUnionTypeNode(e.map(t)),xi=e=>ui?.[e.kind],bi=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=Ke(e,xi(o)),s={number:g.SyntaxKind.NumberKeyword,bigint:g.SyntaxKind.BigIntKeyword,boolean:g.SyntaxKind.BooleanKeyword,string:g.SyntaxKind.StringKeyword,undefined:g.SyntaxKind.UndefinedKeyword,object:g.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(i&&s[i]||g.SyntaxKind.AnyKeyword)}return o},Ti=e=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),Si=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(g.SyntaxKind.UndefinedKeyword)]):o},Oi=(e,{next:t})=>m.createUnionTypeNode([t(e.unwrap()),m.createLiteralTypeNode(m.createNull())]),Ri=({items:e,_def:{rest:t}},{next:r})=>m.createTupleTypeNode(e.map(r).concat(t===null?[]:m.createRestTypeNode(r(t)))),Ai=({keySchema:e,valueSchema:t},{next:r})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e,t].map(r)),Pi=({_def:e},{next:t})=>m.createIntersectionTypeNode([e.left,e.right].map(t)),Ii=({_def:e},{next:t})=>t(e.innerType),re=e=>()=>m.createKeywordTypeNode(e),Ci=(e,{next:t})=>t(e.unwrap()),zi=(e,{next:t})=>t(e.unwrap()),wi=({_def:e},{next:t})=>t(e.innerType),Zi=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Ei=()=>m.createLiteralTypeNode(m.createNull()),vi=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:i})=>{let s=`Type${i(e)}`;return t(s)||(r(s,m.createLiteralTypeNode(m.createNull())),r(s,o(e)))},Li=e=>{let t=e.unwrap(),r=m.createKeywordTypeNode(g.SyntaxKind.StringKeyword),o=m.createTypeReferenceNode("Buffer"),i=m.createUnionTypeNode([r,o]);return t instanceof Ft.ZodString?r:t instanceof Ft.ZodUnion?i:o},Ni=(e,{next:t})=>t(e.unwrap().shape.raw),ji={ZodString:re(g.SyntaxKind.StringKeyword),ZodNumber:re(g.SyntaxKind.NumberKeyword),ZodBigInt:re(g.SyntaxKind.BigIntKeyword),ZodBoolean:re(g.SyntaxKind.BooleanKeyword),ZodAny:re(g.SyntaxKind.AnyKeyword),[Ne]:re(g.SyntaxKind.StringKeyword),[je]:re(g.SyntaxKind.StringKeyword),ZodNull:Ei,ZodArray:gi,ZodTuple:Ri,ZodRecord:Ai,ZodObject:yi,ZodLiteral:fi,ZodIntersection:Pi,ZodUnion:Qr,ZodDefault:Ii,ZodEnum:hi,ZodNativeEnum:Ti,ZodEffects:bi,ZodOptional:Si,ZodNullable:Oi,ZodDiscriminatedUnion:Qr,ZodBranded:Ci,ZodCatch:wi,ZodPipeline:Zi,ZodLazy:vi,ZodReadonly:zi,[K]:Li,[W]:Ni},Me=(e,{brandHandling:t,ctx:r})=>te(e,{rules:{...t,...ji},onMissing:()=>m.createKeywordTypeNode(g.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=Fe,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){ee({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}}),z=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"),Jr=z&&Se?n.createUnionTypeNode([n.createTypeReferenceNode(z),n.createTypeReferenceNode(Se)]):Me(Bt.or($t),{brandHandling:r,ctx:{...ne,isResponse:!0}});this.program.push(ye(Te,be)),qt&&z&&this.program.push(ye(qt,z)),Vt&&Se&&this.program.push(ye(Vt,Se)),this.program.push(ye(Jr,Gt)),A!=="options"&&(this.paths.push(O),this.registry.set({method:A,path:O},{input:be,positive:z,negative:Se,response:Gt,isJson:S.getMimeTypes("positive").includes(I.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,_r)),this.program.push(pt(this.ids.methodPathType,Lt([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(Z.SyntaxKind.ExtendsKeyword,[jt(this.ids.methodPathType,Z.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let c=[],d=[];for(let[{method:S,path:O},{isJson:A,tags:ne,...be}]of this.registry){let Te=Gr(S,O);for(let z of this.interfaces)z.kind in be&&z.props.push(Dr(Te,be[z.kind]));o!=="types"&&(A&&c.push(n.createPropertyAssignment(Te,n.createTrue())),d.push(n.createPropertyAssignment(Te,n.createArrayLiteralExpression(ne.map(z=>n.createStringLiteral(z))))))}for(let{id:S,props:O}of this.interfaces)this.program.push($r(S,p,O));if(o==="types")return;let l=n.createVariableStatement($,V(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(c))),f=n.createVariableStatement($,V(this.ids.endpointTagsConst,n.createObjectLiteralExpression(d))),u=pt(this.ids.providerType,n.createFunctionTypeNode(Vr({M:this.ids.methodType,P:this.ids.pathType}),at({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),Nt)}),Br(this.ids.responseInterface,Nt))),x=pt(this.ids.implementationType,n.createFunctionTypeNode(void 0,at({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(Z.SyntaxKind.StringKeyword),params:jt(Z.SyntaxKind.StringKeyword,Z.SyntaxKind.AnyKeyword)}),qr())),C=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,fe)]),b=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),E=Ut(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[C]),Z.SyntaxKind.GreaterThanEqualsToken,n.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,n.createObjectLiteralExpression([n.createSpreadAssignment(this.ids.accumulator),n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),n.createObjectLiteralExpression()),R=Kr(this.ids.clientClass,Hr([st(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),Ur)]),[Fr(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,b,E]),!0))]);this.program.push(l,f,u,x,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(I.json))]),void 0,this.ids.undefinedValue)),M=n.createPropertyAssignment(this.ids.bodyProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),_=n.createVariableStatement(void 0,V(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier("fetch"),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,fe)]),n.createObjectLiteralExpression([h,ge,M])])))),oe=n.createVariableStatement(void 0,V(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,V(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,dt]=["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(Et,[n.createTemplateSpan(this.ids.methodParameter,vt),n.createTemplateSpan(this.ids.pathParameter,fe)]),Z.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([Ue])),L=n.createVariableStatement($,V(this.ids.exampleImplementationConst,Mt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([oe,he,_,He,dt]),!0),n.createTypeReferenceNode(this.ids.implementationType))),Y=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,V(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(L,xe,Y)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Dt(r,t)).join(`
20
+ `)};var Tr=e=>{e.startupLogo!==!1&&console.log(br());let t=e.errorHandler||ze,r=dr(e.logger)?e.logger:new Ze(e.logger);r.debug("Running","v20.1.0-beta.2 (ESM)");let o=hr({rootLogger:r,config:e}),i=fr({rootLogger:r,errorHandler:t}),s=ur({rootLogger:r,errorHandler:t});return{rootLogger:r,errorHandler:t,notFoundHandler:i,parserFailureHandler:s,loggingMiddleware:o}},_o=(e,t)=>{let{rootLogger:r,notFoundHandler:o,loggingMiddleware:i}=Tr(e);return Tt({app:e.app.use(i),routing:t,rootLogger:r,config:e}),{notFoundHandler:o,logger:r}},Yo=async(e,t)=>{let{rootLogger:r,notFoundHandler:o,parserFailureHandler:i,loggingMiddleware:s}=Tr(e),a=St().disable("x-powered-by").use(s);if(e.server.compression){let l=await me("compression");a.use(l(typeof e.server.compression=="object"?e.server.compression:void 0))}let p={json:[e.server.jsonParser||St.json()],raw:[e.server.rawParser||St.raw(),gr],upload:e.server.upload?await yr({config:e,rootLogger:r}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:a,logger:r}),Tt({app:a,routing:t,rootLogger:r,config:e,parsers:p}),a.use(i,o);let c=(l,f)=>l.listen(f,()=>{r.info("Listening",f)}),d={httpServer:c(Vo.createServer(a),e.server.listen),httpsServer:e.https?c(Go.createServer(e.https.options,a),e.https.listen):void 0};return{app:a,...d,logger:r}};import oi from"assert/strict";import{OpenApiBuilder as ni}from"openapi3-ts/oas31";import{pluck as ii}from"ramda";import te from"assert/strict";import{isReferenceObject as Rt,isSchemaObject as et}from"openapi3-ts/oas31";import{both as Jo,complement as Wo,concat as Xo,type as en,filter as tn,fromPairs as ke,has as rn,isNil as on,map as ue,mergeAll as nn,mergeDeepRight as sn,mergeDeepWith as an,objOf as Pr,omit as tt,pipe as Ir,pluck as pn,range as cn,reject as dn,toLower as ln,union as mn,when as un,xprod as rt,zip as fn}from"ramda";import{z as b}from"zod";import{z as Le}from"zod";var We=e=>!isNaN(e.getTime());var Ne=Symbol("DateIn"),Sr=()=>Le.union([Le.string().date(),Le.string().datetime(),Le.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Le.date().refine(We)).brand(Ne);import{z as Qo}from"zod";var ve=Symbol("DateOut"),Or=()=>Qo.date().refine(We).transform(e=>e.toISOString()).brand(ve);var X=(e,{onEach:t,rules:r,onMissing:o,ctx:i={}})=>{let s=r[e._def[y]?.brand]||r[e._def.typeName],p=s?s(e,{...i,next:d=>X(d,{ctx:i,onEach:t,rules:r,onMissing:o})}):o(e,i),c=t&&t(e,{prev:p,...i});return c?{...p,...c}:p};var Rr=50,Cr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",yn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},zr=/:([A-Za-z0-9_]+)/g,gn=e=>e.match(zr)?.map(t=>t.slice(1))||[],wr=e=>e.replace(zr,t=>`{${t.slice(1)}}`),hn=({_def:e},{next:t})=>({...t(e.innerType),default:e[y]?.defaultLabel||e.defaultValue()}),xn=({_def:{innerType:e}},{next:t})=>t(e),bn=()=>({format:"any"}),Tn=({},e)=>(te(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),Sn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof b.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},On=({options:e},{next:t})=>({oneOf:e.map(t)}),Rn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),An=e=>{let[t,r]=e.filter(et).filter(i=>i.type==="object"&&Object.keys(i).every(s=>["type","properties","required","examples"].includes(s)));te(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=an((i,s)=>Array.isArray(i)&&Array.isArray(s)?Xo(i,s):i===s?s:te.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=mn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=Y(t.examples||[],r.examples||[],([i,s])=>sn(i,s))),o},Pn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return An(o)}catch{}return{allOf:o}},In=(e,{next:t})=>t(e.unwrap()),Cn=(e,{next:t})=>t(e.unwrap()),zn=(e,{next:t})=>{let r=t(e.unwrap());return et(r)&&(r.type=Er(r)),r},Zr=e=>{let t=ln(en(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},Ar=e=>({type:Zr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),wn=({value:e})=>({type:Zr(e),const:e}),Zn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),i=p=>t&&Re(p)?p instanceof b.ZodOptional:p.isOptional(),s=o.filter(p=>!i(e.shape[p])),a={type:"object"};return o.length&&(a.properties=Xe(e,r)),s.length&&(a.required=s),a},En=()=>({type:"null"}),jn=({},e)=>(te(!e.isResponse,new z({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:Cr}}),Ln=({},e)=>(te(e.isResponse,new z({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Cr}}),Nn=({},e)=>te.fail(new z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),vn=()=>({type:"boolean"}),kn=()=>({type:"integer",format:"bigint"}),Mn=e=>e.every(t=>t instanceof b.ZodLiteral),Un=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof b.ZodEnum||e instanceof b.ZodNativeEnum){let o=Object.values(e.enum),i={type:"object"};return o.length&&(i.properties=Xe(b.object(ke(rt(o,[t]))),r),i.required=o),i}if(e instanceof b.ZodLiteral)return{type:"object",properties:Xe(b.object({[e.value]:t}),r),required:[e.value]};if(e instanceof b.ZodUnion&&Mn(e.options)){let o=ue(s=>`${s.value}`,e.options),i=ke(rt(o,[t]));return{type:"object",properties:Xe(b.object(i),r),required:o}}return{type:"object",additionalProperties:r(t)}},Hn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let i={type:"array",items:o(r)};return e&&(i.minItems=e.value),t&&(i.maxItems=t.value),i},Dn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Fn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:i,isCUID:s,isCUID2:a,isULID:p,isIP:c,isEmoji:d,isDatetime:l,_def:{checks:f}})=>{let u=f.find(R=>R.kind==="regex"),T=f.find(R=>R.kind==="datetime"),I=u?u.regex:T?T.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,x={type:"string"},E={"date-time":l,email:e,url:t,uuid:i,cuid:s,cuid2:a,ulid:p,ip:c,emoji:d};for(let R in E)if(E[R]){x.format=R;break}return r!==null&&(x.minLength=r),o!==null&&(x.maxLength=o),I&&(x.pattern=I.source),x},Kn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let i=o.find(f=>f.kind==="min"),s=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=i?i.inclusive:!0,p=o.find(f=>f.kind==="max"),c=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,d=p?p.inclusive:!0,l={type:e?"integer":"number",format:e?"int64":"double"};return a?l.minimum=s:l.exclusiveMinimum=s,d?l.maximum=c:l.exclusiveMaximum=c,l},Xe=({shape:e},t)=>ue(t,e),Bn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return yn?.[t]},Er=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},qn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:i}=e._def;if(t&&i.type==="transform"&&et(o)){let s=Be(e,Bn(o));return s&&["number","string","boolean"].includes(s)?{type:s}:r(b.any())}if(!t&&i.type==="preprocess"&&et(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},$n=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Vn=(e,{next:t})=>t(e.unwrap()),Gn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:i})=>{let s=r(e);return o(s)||(i(s,{}),i(s,t(e)))},_n=(e,{next:t})=>t(e.unwrap().shape.raw),jr=e=>e.length?ke(fn(cn(1,e.length+1).map(t=>`example${t}`),ue(Pr("value"),e))):void 0,Lr=(e,t,r=[])=>Ir(D,ue(un(Jo(v,Wo(Array.isArray)),tt(r))),jr)({schema:e,variant:t?"parsed":"original",validate:!0}),Yn=(e,t)=>Ir(D,tn(rn(t)),pn(t),jr)({schema:e,variant:"original",validate:!0}),ee=e=>e instanceof b.ZodObject?e:e instanceof b.ZodBranded?ee(e.unwrap()):e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion?e.options.map(t=>ee(t)).reduce((t,r)=>t.merge(r.partial()),b.object({})):e instanceof b.ZodEffects?ee(e._def.schema):e instanceof b.ZodPipeline?ee(e._def.in):ee(e._def.left).merge(ee(e._def.right)),Nr=({path:e,method:t,schema:r,inputSources:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,description:d=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:l}=ee(r),f=gn(e),u=o.includes("query"),T=o.includes("params"),I=o.includes("headers"),x=h=>T&&f.includes(h),E=h=>I&&lt(h);return Object.keys(l).map(h=>({name:h,location:x(h)?"path":E(h)?"header":u?"query":void 0})).filter(h=>h.location!==void 0).map(({name:h,location:ge})=>{let M=X(l[h],{rules:{...c,...At},onEach:Pt,onMissing:It,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:e,method:t}}),V=p==="components"?a(w(d,h),M):M;return{name:h,in:ge,required:!l[h].isOptional(),description:M.description||d,schema:V,examples:Yn(r,h)}})},At={ZodString:Fn,ZodNumber:Kn,ZodBigInt:kn,ZodBoolean:vn,ZodNull:En,ZodArray:Hn,ZodTuple:Dn,ZodRecord:Un,ZodObject:Zn,ZodLiteral:wn,ZodIntersection:Pn,ZodUnion:On,ZodAny:bn,ZodDefault:hn,ZodEnum:Ar,ZodNativeEnum:Ar,ZodEffects:qn,ZodOptional:In,ZodNullable:zn,ZodDiscriminatedUnion:Rn,ZodBranded:Vn,ZodDate:Nn,ZodCatch:xn,ZodPipeline:$n,ZodLazy:Gn,ZodReadonly:Cn,[F]:Sn,[Ae]:Tn,[ve]:Ln,[Ne]:jn,[Q]:_n},Pt=(e,{isResponse:t,prev:r})=>{if(Rt(r))return{};let{description:o}=e,i=e instanceof b.ZodLazy,s=r.type!==void 0,a=t&&Re(e),p=!i&&s&&!a&&e.isNullable(),c=i?[]:D({schema:e,variant:t?"parsed":"original",validate:!0}),d={};return o&&(d.description=o),p&&(d.type=Er(r)),c.length&&(d.examples=c.slice()),d},It=(e,t)=>te.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Ot=(e,t)=>{if(Rt(e))return e;let r={...e};return r.properties&&(r.properties=tt(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>tt(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Ot(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Ot(o,t))),r},vr=e=>Rt(e)?e:tt(["examples"],e),kr=({method:e,path:t,schema:r,mimeTypes:o,variant:i,serializer:s,getRef:a,makeRef:p,composition:c,hasMultipleStatusCodes:d,statusCode:l,brandHandling:f,description:u=`${e.toUpperCase()} ${t} ${ut(i)} response ${d?l:""}`.trim()})=>{let T=vr(X(r,{rules:{...f,...At},onEach:Pt,onMissing:It,ctx:{isResponse:!0,serializer:s,getRef:a,makeRef:p,path:t,method:e}})),I={schema:c==="components"?p(w(u),T):T,examples:Lr(r,!0)};return{description:u,content:ke(rt(o,[I]))}},Qn=()=>({type:"http",scheme:"basic"}),Jn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Wn=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},Xn=({name:e})=>({type:"apiKey",in:"header",name:e}),ei=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ti=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),ri=({flows:e={}})=>({type:"oauth2",flows:ue(t=>({...t,scopes:t.scopes||{}}),dn(on,e))}),Mr=(e,t)=>{let r={basic:Qn,bearer:Jn,input:Wn,header:Xn,cookie:ei,openid:ti,oauth2:ri};return _e(e,o=>r[o.type](o,t))},ot=e=>"or"in e?e.or.map(t=>"and"in t?nn(ue(({name:r,scopes:o})=>Pr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?ot(gt(e)):ot({or:[e]}),Ur=({method:e,path:t,schema:r,mimeTypes:o,serializer:i,getRef:s,makeRef:a,composition:p,brandHandling:c,paramNames:d,description:l=`${e.toUpperCase()} ${t} Request body`})=>{let f=vr(Ot(X(r,{rules:{...c,...At},onEach:Pt,onMissing:It,ctx:{isResponse:!1,serializer:i,getRef:s,makeRef:a,path:t,method:e}}),d)),u={schema:p==="components"?a(w(l),f):f,examples:Lr(r,!1,d)};return{description:l,content:ke(rt(o,[u]))}},Hr=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Ct=e=>e.length<=Rr?e:e.slice(0,Rr-1)+"\u2026";var zt=class extends ni{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){let i=o||w(r,t),s=this.lastOperationIdSuffixes.get(i);return s===void 0?(this.lastOperationIdSuffixes.set(i,1),i):(o&&oi.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),s++,this.lastOperationIdSuffixes.set(i,s),`${i}${s}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let i in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[i]))return i;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:i,serverUrl:s,descriptions:a,brandHandling:p,hasSummaryFromDescription:c=!0,composition:d="inline",serializer:l=Ke}){super(),this.addInfo({title:o,version:i});for(let u of typeof s=="string"?[s]:s)this.addServer({url:u});W({routing:t,onEndpoint:(u,T,I)=>{let x=I,E={path:T,method:x,endpoint:u,composition:d,serializer:l,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[R,h]=["short","long"].map(u.getDescription.bind(u)),ge=R?Ct(R):c&&h?Ct(h):void 0,M=u.getTags(),V=r.inputSources?.[x]||ct[x],oe=this.ensureUniqOperationId(T,x,u.getOperationId(x)),he=Nr({...E,inputSources:V,schema:u.getSchema("input"),description:a?.requestParameter?.call(null,{method:x,path:T,operationId:oe})}),Ue={};for(let L of["positive","negative"]){let G=u.getResponses(L);for(let{mimeTypes:xe,schema:S,statusCodes:O}of G)for(let A of O)Ue[A]=kr({...E,variant:L,schema:S,mimeTypes:xe,statusCode:A,hasMultipleStatusCodes:G.length>1||O.length>1,description:a?.[`${L}Response`]?.call(null,{method:x,path:T,operationId:oe,statusCode:A})})}let pt=V.includes("body")?Ur({...E,paramNames:ii("name",he),schema:u.getSchema("input"),mimeTypes:u.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:x,path:T,operationId:oe})}):void 0,He=ot(_e(Mr(u.getSecurity(),V),L=>{let G=this.ensureUniqSecuritySchemaName(L),xe=["oauth2","openIdConnect"].includes(L.type)?u.getScopes().slice():[];return this.addSecurityScheme(G,L),{name:G,scopes:xe}}));this.addPath(wr(T),{[x]:{operationId:oe,summary:ge,description:h,tags:M.length>0?M:void 0,parameters:he.length>0?he:void 0,requestBody:pt,security:He.length>0?He:void 0,responses:Ue}})}}),this.rootDoc.tags=r.tags?Hr(r.tags):[]}};import{createRequest as si,createResponse as ai}from"node-mocks-http";var pi=e=>si({...e,headers:{"content-type":P.json,...e?.headers}}),ci=e=>ai(e),di=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,i){return o==="_getLogs"?()=>t:o in le?(...s)=>t[o].push(s):Reflect.get(r,o,i)}})},li=async({endpoint:e,requestProps:t,responseOptions:r,configProps:o,loggerProps:i})=>{let s=pi(t),a=ci({req:s,...r}),p=di(i),c={cors:!1,logger:p,...o};return await e.execute({request:s,response:a,config:c,logger:p}),{requestMock:s,responseMock:a,loggerMock:p}};import Z from"typescript";import k from"typescript";import{chain as Dr,toPairs as Fr}from"ramda";var n=k.factory,B=[n.createModifier(k.SyntaxKind.ExportKeyword)],mi=[n.createModifier(k.SyntaxKind.AsyncKeyword)],ui=[n.createModifier(k.SyntaxKind.PublicKeyword),n.createModifier(k.SyntaxKind.ReadonlyKeyword)],Kr=[n.createModifier(k.SyntaxKind.ProtectedKeyword),n.createModifier(k.SyntaxKind.ReadonlyKeyword)],wt=n.createTemplateHead(""),fe=n.createTemplateTail(""),Zt=n.createTemplateMiddle(" "),Et=e=>n.createTemplateLiteralType(wt,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?fe:Zt))),jt=Et(["M","P"]),nt=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),it=(e,t)=>Dr(([r,o])=>[nt(n.createIdentifier(r),o,t)],Fr(e)),Lt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),Br=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),qr=(e,t)=>n.createPropertySignature(void 0,e,void 0,n.createTypeReferenceNode(t)),q=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],k.NodeFlags.Const),Nt=(e,t)=>n.createTypeAliasDeclaration(B,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),st=(e,t)=>n.createTypeAliasDeclaration(B,e,void 0,t),$r=(e,t,r)=>n.createPropertyDeclaration(ui,e,void 0,t,r),Vr=(e,t,r)=>n.createClassDeclaration(B,e,void 0,void 0,[t,...r]),Gr=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),_r=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(k.SyntaxKind.AnyKeyword)]),Yr=(e,t,r)=>n.createInterfaceDeclaration(B,e,void 0,t,r),Qr=e=>Dr(([t,r])=>[n.createTypeParameterDeclaration([],t,n.createTypeReferenceNode(r))],Fr(e)),vt=(e,t,r)=>n.createArrowFunction(r?mi:void 0,void 0,e.map(o=>nt(o)),void 0,void 0,t),kt=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[n.createArrowFunction(void 0,void 0,it({acc:void 0,key:void 0}),void 0,void 0,t),r]),Jr=(...e)=>`"${e.join(" ")}"`;var Wr=["get","post","put","delete","patch"];import g from"typescript";import{z as Ht}from"zod";import $ from"typescript";var{factory:at}=$,Mt=(e,t)=>{$.addSyntheticLeadingComment(e,$.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ye=(e,t,r)=>{let o=at.createTypeAliasDeclaration(void 0,at.createIdentifier(t),void 0,e);return r&&Mt(o,r),o},Ut=(e,t)=>{let r=$.createSourceFile("print.ts","",$.ScriptTarget.Latest,!1,$.ScriptKind.TS);return $.createPrinter(t).printNode($.EmitHint.Unspecified,e,r)},fi=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Xr=e=>fi.test(e)?at.createIdentifier(e):at.createStringLiteral(e);var{factory:m}=g,yi={[g.SyntaxKind.AnyKeyword]:"",[g.SyntaxKind.BigIntKeyword]:BigInt(0),[g.SyntaxKind.BooleanKeyword]:!1,[g.SyntaxKind.NumberKeyword]:0,[g.SyntaxKind.ObjectKeyword]:{},[g.SyntaxKind.StringKeyword]:"",[g.SyntaxKind.UndefinedKeyword]:void 0},gi=({value:e})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),hi=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let i=Object.entries(e).map(([s,a])=>{let p=t&&Re(a)?a instanceof Ht.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,Xr(s),p&&o?m.createToken(g.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Mt(c,a.description),c});return m.createTypeLiteralNode(i)},xi=({element:e},{next:t})=>m.createArrayTypeNode(t(e)),bi=({options:e})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),eo=({options:e},{next:t})=>m.createUnionTypeNode(e.map(t)),Ti=e=>yi?.[e.kind],Si=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let i=Be(e,Ti(o)),s={number:g.SyntaxKind.NumberKeyword,bigint:g.SyntaxKind.BigIntKeyword,boolean:g.SyntaxKind.BooleanKeyword,string:g.SyntaxKind.StringKeyword,undefined:g.SyntaxKind.UndefinedKeyword,object:g.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(i&&s[i]||g.SyntaxKind.AnyKeyword)}return o},Oi=e=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),Ri=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(g.SyntaxKind.UndefinedKeyword)]):o},Ai=(e,{next:t})=>m.createUnionTypeNode([t(e.unwrap()),m.createLiteralTypeNode(m.createNull())]),Pi=({items:e,_def:{rest:t}},{next:r})=>m.createTupleTypeNode(e.map(r).concat(t===null?[]:m.createRestTypeNode(r(t)))),Ii=({keySchema:e,valueSchema:t},{next:r})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e,t].map(r)),Ci=({_def:e},{next:t})=>m.createIntersectionTypeNode([e.left,e.right].map(t)),zi=({_def:e},{next:t})=>t(e.innerType),re=e=>()=>m.createKeywordTypeNode(e),wi=(e,{next:t})=>t(e.unwrap()),Zi=(e,{next:t})=>t(e.unwrap()),Ei=({_def:e},{next:t})=>t(e.innerType),ji=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Li=()=>m.createLiteralTypeNode(m.createNull()),Ni=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:i})=>{let s=`Type${i(e)}`;return t(s)||(r(s,m.createLiteralTypeNode(m.createNull())),r(s,o(e)))},vi=e=>{let t=e.unwrap(),r=m.createKeywordTypeNode(g.SyntaxKind.StringKeyword),o=m.createTypeReferenceNode("Buffer"),i=m.createUnionTypeNode([r,o]);return t instanceof Ht.ZodString?r:t instanceof Ht.ZodUnion?i:o},ki=(e,{next:t})=>t(e.unwrap().shape.raw),Mi={ZodString:re(g.SyntaxKind.StringKeyword),ZodNumber:re(g.SyntaxKind.NumberKeyword),ZodBigInt:re(g.SyntaxKind.BigIntKeyword),ZodBoolean:re(g.SyntaxKind.BooleanKeyword),ZodAny:re(g.SyntaxKind.AnyKeyword),[Ne]:re(g.SyntaxKind.StringKeyword),[ve]:re(g.SyntaxKind.StringKeyword),ZodNull:Li,ZodArray:xi,ZodTuple:Pi,ZodRecord:Ii,ZodObject:hi,ZodLiteral:gi,ZodIntersection:Ci,ZodUnion:eo,ZodDefault:zi,ZodEnum:bi,ZodNativeEnum:Oi,ZodEffects:Si,ZodOptional:Ri,ZodNullable:Ai,ZodDiscriminatedUnion:eo,ZodBranded:wi,ZodCatch:Ei,ZodPipeline:ji,ZodLazy:Ni,ZodReadonly:Zi,[F]:vi,[Q]:ki},Me=(e,{brandHandling:t,ctx:r})=>X(e,{rules:{...t,...Mi},onMissing:()=>m.createKeywordTypeNode(g.SyntaxKind.AnyKeyword),ctx:r});var Dt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:n.createIdentifier("Path"),methodType:n.createIdentifier("Method"),methodPathType:n.createIdentifier("MethodPath"),inputInterface:n.createIdentifier("Input"),posResponseInterface:n.createIdentifier("PositiveResponse"),negResponseInterface:n.createIdentifier("NegativeResponse"),responseInterface:n.createIdentifier("Response"),jsonEndpointsConst:n.createIdentifier("jsonEndpoints"),endpointTagsConst:n.createIdentifier("endpointTags"),providerType:n.createIdentifier("Provider"),implementationType:n.createIdentifier("Implementation"),clientClass:n.createIdentifier("ExpressZodAPIClient"),keyParameter:n.createIdentifier("key"),pathParameter:n.createIdentifier("path"),paramsArgument:n.createIdentifier("params"),methodParameter:n.createIdentifier("method"),accumulator:n.createIdentifier("acc"),provideMethod:n.createIdentifier("provide"),implementationArgument:n.createIdentifier("implementation"),headersProperty:n.createIdentifier("headers"),hasBodyConst:n.createIdentifier("hasBody"),undefinedValue:n.createIdentifier("undefined"),bodyProperty:n.createIdentifier("body"),responseConst:n.createIdentifier("response"),searchParamsConst:n.createIdentifier("searchParams"),exampleImplementationConst:n.createIdentifier("exampleImplementation"),clientConst:n.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?n.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,ye(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:i=Ke,splitResponse:s=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){W({routing:t,onEndpoint:(S,O,A)=>{let ne={serializer:i,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},be=w(A,O,"input"),Te=Me(S.getSchema("input"),{brandHandling:r,ctx:{...ne,isResponse:!1}}),C=s?w(A,O,"positive.response"):void 0,Ft=S.getSchema("positive"),Kt=s?Me(Ft,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Se=s?w(A,O,"negative.response"):void 0,Bt=S.getSchema("negative"),qt=s?Me(Bt,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,$t=w(A,O,"response"),to=C&&Se?n.createUnionTypeNode([n.createTypeReferenceNode(C),n.createTypeReferenceNode(Se)]):Me(Ft.or(Bt),{brandHandling:r,ctx:{...ne,isResponse:!0}});this.program.push(ye(Te,be)),Kt&&C&&this.program.push(ye(Kt,C)),qt&&Se&&this.program.push(ye(qt,Se)),this.program.push(ye(to,$t)),A!=="options"&&(this.paths.push(O),this.registry.set({method:A,path:O},{input:be,positive:C,negative:Se,response:$t,isJson:S.getMimeTypes("positive").includes(P.json),tags:S.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(Nt(this.ids.pathType,this.paths)),this.program.push(Nt(this.ids.methodType,Wr)),this.program.push(st(this.ids.methodPathType,Et([this.ids.methodType,this.ids.pathType])));let p=[n.createHeritageClause(Z.SyntaxKind.ExtendsKeyword,[Lt(this.ids.methodPathType,Z.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),s&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let c=[],d=[];for(let[{method:S,path:O},{isJson:A,tags:ne,...be}]of this.registry){let Te=Jr(S,O);for(let C of this.interfaces)C.kind in be&&C.props.push(qr(Te,be[C.kind]));o!=="types"&&(A&&c.push(n.createPropertyAssignment(Te,n.createTrue())),d.push(n.createPropertyAssignment(Te,n.createArrayLiteralExpression(ne.map(C=>n.createStringLiteral(C))))))}for(let{id:S,props:O}of this.interfaces)this.program.push(Yr(S,p,O));if(o==="types")return;let l=n.createVariableStatement(B,q(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(c))),f=n.createVariableStatement(B,q(this.ids.endpointTagsConst,n.createObjectLiteralExpression(d))),u=st(this.ids.providerType,n.createFunctionTypeNode(Qr({M:this.ids.methodType,P:this.ids.pathType}),it({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),jt)}),Gr(this.ids.responseInterface,jt))),T=st(this.ids.implementationType,n.createFunctionTypeNode(void 0,it({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(Z.SyntaxKind.StringKeyword),params:Lt(Z.SyntaxKind.StringKeyword,Z.SyntaxKind.AnyKeyword)}),_r())),I=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,fe)]),x=kt(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[I,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),E=kt(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[I]),Z.SyntaxKind.GreaterThanEqualsToken,n.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,n.createObjectLiteralExpression([n.createSpreadAssignment(this.ids.accumulator),n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),n.createObjectLiteralExpression()),R=Vr(this.ids.clientClass,Br([nt(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),Kr)]),[$r(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),vt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,x,E]),!0))]);this.program.push(l,f,u,T,R);let h=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),ge=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(P.json))]),void 0,this.ids.undefinedValue)),M=n.createPropertyAssignment(this.ids.bodyProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),V=n.createVariableStatement(void 0,q(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier("fetch"),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,fe)]),n.createObjectLiteralExpression([h,ge,M])])))),oe=n.createVariableStatement(void 0,q(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),he=n.createVariableStatement(void 0,q(this.ids.searchParamsConst,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createStringLiteral(""),void 0,n.createTemplateExpression(n.createTemplateHead("?"),[n.createTemplateSpan(n.createNewExpression(n.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),fe)])))),[Ue,pt]=["json","text"].map(S=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,S),void 0,void 0))),He=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(wt,[n.createTemplateSpan(this.ids.methodParameter,Zt),n.createTemplateSpan(this.ids.pathParameter,fe)]),Z.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([Ue])),L=n.createVariableStatement(B,q(this.ids.exampleImplementationConst,vt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([oe,he,V,He,pt]),!0),n.createTypeReferenceNode(this.ids.implementationType))),G=n.createExpressionStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[n.createStringLiteral("get"),n.createStringLiteral("/v1/user/retrieve"),n.createObjectLiteralExpression([n.createPropertyAssignment("id",n.createStringLiteral("10"))])])),xe=n.createVariableStatement(void 0,q(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(L,xe,G)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Ut(r,t)).join(`
21
21
  `):void 0}print(t){let r=this.printUsage(t),o=r&&Z.addSyntheticLeadingComment(Z.addSyntheticLeadingComment(n.createEmptyStatement(),Z.SyntaxKind.SingleLineCommentTrivia," Usage example:"),Z.SyntaxKind.MultiLineCommentTrivia,`
22
- ${r}`);return this.program.concat(o||[]).map((i,s)=>Dt(i,s<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
22
+ ${r}`);return this.program.concat(o||[]).map((i,s)=>Ut(i,s<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
23
23
 
24
- `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await le("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let i=this.printUsage(t);this.usage=i&&o?[await o(i)]:this.usage;let s=this.print(t);return o?o(s):s}};var ki={dateIn:hr,dateOut:xr,file:Ve,upload:Wt,raw:Jt};export{Ze as BuiltinLogger,Ee as DependsOnMethod,Zt as Documentation,P as DocumentationError,we as EndpointsFactory,N as InputValidationError,Kt as Integration,B as Middleware,Oe as MissingPeerError,Q as OutputValidationError,Ce as ResultHandler,ie as RoutingError,ve as ServeStatic,Co as arrayEndpointsFactory,St as arrayResultHandler,Vo as attachRouting,fo as createConfig,Go as createServer,Io as defaultEndpointsFactory,ze as defaultResultHandler,ki as ez,F as getExamples,D as getMessageFromError,De as getStatusCodeFromError,ci as testEndpoint};
24
+ `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await me("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let i=this.printUsage(t);this.usage=i&&o?[await o(i)]:this.usage;let s=this.print(t);return o?o(s):s}};var Ui={dateIn:Sr,dateOut:Or,file:Ve,upload:rr,raw:tr};export{Ze as BuiltinLogger,Ee as DependsOnMethod,zt as Documentation,z as DocumentationError,we as EndpointsFactory,N as InputValidationError,Dt as Integration,K as Middleware,Oe as MissingPeerError,_ as OutputValidationError,Ce as ResultHandler,ie as RoutingError,je as ServeStatic,wo as arrayEndpointsFactory,bt as arrayResultHandler,_o as attachRouting,xo as createConfig,Yo as createServer,zo as defaultEndpointsFactory,ze as defaultResultHandler,Ui as ez,D as getExamples,H as getMessageFromError,Fe as getStatusCodeFromError,li as testEndpoint};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "20.0.1",
3
+ "version": "20.1.0-beta.2",
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": {
@@ -128,7 +128,6 @@
128
128
  },
129
129
  "devDependencies": {
130
130
  "@arethetypeswrong/cli": "^0.15.0",
131
- "@eslint/js": "^9.3.0",
132
131
  "@tsconfig/node18": "^18.2.1",
133
132
  "@types/compression": "^1.7.5",
134
133
  "@types/cors": "^2.8.14",
@@ -141,12 +140,13 @@
141
140
  "@types/swagger-ui-express": "^4.1.6",
142
141
  "@types/triple-beam": "^1.3.2",
143
142
  "@vitest/coverage-istanbul": "^1.5.0",
143
+ "camelize-ts": "^3.0.0",
144
144
  "compression": "^1.7.4",
145
145
  "cors": "^2.8.5",
146
146
  "eslint": "^9.3.0",
147
147
  "eslint-config-prettier": "^9.1.0",
148
148
  "eslint-import-resolver-typescript": "^3.6.1",
149
- "eslint-plugin-import": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-0.5.2.tgz",
149
+ "eslint-plugin-import": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-0.5.3.tgz",
150
150
  "eslint-plugin-prettier": "^5.1.3",
151
151
  "eslint-plugin-unicorn": "^54.0.0",
152
152
  "express": "^4.19.2",
@@ -162,12 +162,12 @@
162
162
  "tsup": "^8.0.0",
163
163
  "tsx": "^4.6.2",
164
164
  "typescript": "^5.5.2",
165
- "typescript-eslint": "^8.0.0-alpha.34",
165
+ "typescript-eslint": "^8.0.0-alpha.38",
166
166
  "vitest": "^1.5.0",
167
167
  "zod": "^3.23.0"
168
168
  },
169
169
  "resolutions": {
170
- "**/@typescript-eslint/utils": "^8.0.0-alpha.34"
170
+ "**/@typescript-eslint/utils": "^8.0.0-alpha.38"
171
171
  },
172
172
  "keywords": [
173
173
  "nodejs",