express-zod-api 25.0.0-beta.3 → 25.0.0-beta.4

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
@@ -8,11 +8,46 @@
8
8
  - The framework distribution is now ESM-only (finally);
9
9
  - All the Node.js versions listed above support `require(ESM)` syntax;
10
10
  - Supported `zod` version: `^4.0.0`;
11
+ - Compatibility with `zod@^3` is dropped;
12
+ - You SHOULD now `import { z } from "zod"` without the `/v4` suffix;
11
13
  - Changes to the `Middleware` class:
12
14
  - When the `input` schema is not defined, the `input` argument of the `handler` method is now `unknown`;
13
15
 
14
16
  ## Version 24
15
17
 
18
+ ### v24.7.0
19
+
20
+ - Supporting `HEAD` method:
21
+ - The purpose of the `HEAD` method is to retrieve the headers without performing `GET` request;
22
+ - It is the built-in feature of Express to handle `HEAD` requests by the handlers for `GET` requests;
23
+ - Therefore, each `Endpoint` supporting `get` method also handles `head` requests (no work needed);
24
+ - Added `HEAD` method to CORS response headers, along with `OPTIONS`, for `GET` method supporting endpoints;
25
+ - Positive response to `HEAD` request should contain same headers as `GET` would, but without the body:
26
+ - Added `head` request depiction to the generated `Documentation`;
27
+ - Added `head` request types to the generated `Integration` client;
28
+ - Positive response to `HEAD` request should contain the `Content-Length` header:
29
+ - `ResultHandler`s using `response.send()` (as well as its shorthands such as `.json()`) automatically do that
30
+ instead of sending the response body (no work needed);
31
+ - Other approaches, such as stream piping, might require to implement `Content-Length` header for `HEAD` requests;
32
+ - This feature was suggested by [@pepegc](https://github.com/pepegc);
33
+ - Caveats:
34
+ - The following properties, when assigned with functions, can now receive `head` as an argument:
35
+ - `operationId` supplied to `EndpointsFactory::build()`;
36
+ - `isHeader` supplied to `Documentation::constructor()`;
37
+ - If the `operationId` is assigned with a `string` then it may be appended with `__HEAD` for `head` method;
38
+
39
+ ### v24.6.2
40
+
41
+ - Correcting recommendations given in [v24.6.0](#v2460) regarding using with `zod@^4.0.0`:
42
+ - Make sure the `moduleResolution` in your `tsconfig.json` is either `node16`, `nodenext` or `bundler`;
43
+ - Consider the [recommended tsconfig base, Node 20+](https://github.com/tsconfig/bases/blob/main/bases/node20.json);
44
+ - Then you MAY `import { z } from "zod"`;
45
+ - Otherwise, you MUST keep `import { z } from "zod/v4"`;
46
+ - In some cases module augmentation (Zod plugin) did not work and caused schema assignment errors for some users;
47
+ - The issue was reported by [@MichaelHindley](https://github.com/MichaelHindley);
48
+ - This potential inconvenience will be resolved by dropping `zod@^3` in the next version of Express Zod API:
49
+ - If you're having troubles using the framework with `zod@^4.0.0`, consider upgrading to v25 (currently beta).
50
+
16
51
  ### v24.6.1
17
52
 
18
53
  - Compatibility fix for recently changed type of Express native middleware:
@@ -25,7 +60,8 @@
25
60
  ### v24.6.0
26
61
 
27
62
  - Supporting `zod` versions `^3.25.35 || ^4.0.0`:
28
- - If you use `zod@^4.0.0` then `import { z } from "zod"`;
63
+ - If you use `zod@^4.0.0` then you MAY `import { z } from "zod"`:
64
+ - If facing error, ensure `moduleResolution` in your `tsconfig.json` is either `node16`, `nodenext` or `bundler`;
29
65
  - If you use `zod@^3.25.35` then keep `import { z } from "zod/v4"`;
30
66
  - For more details, see the [Explanation of the versioning strategy](https://github.com/colinhacks/zod/issues/4371).
31
67
 
package/README.md CHANGED
@@ -84,6 +84,8 @@ Therefore, many basic tasks can be accomplished faster and easier, in particular
84
84
 
85
85
  These people contributed to the improvement of the framework by reporting bugs, making changes and suggesting ideas:
86
86
 
87
+ [<img src="https://github.com/pepegc.png" alt="@pepegc" width="50px" />](https://github.com/pepegc)
88
+ [<img src="https://github.com/MichaelHindley.png" alt="@MichaelHindley" width="50px" />](https://github.com/MichaelHindley)
87
89
  [<img src="https://github.com/zoton2.png" alt="@zoton2" width="50px" />](https://github.com/zoton2)
88
90
  [<img src="https://github.com/ThomasKientz.png" alt="@ThomasKientz" width="50px" />](https://github.com/ThomasKientz)
89
91
  [<img src="https://github.com/james10424.png" alt="@james10424" width="50px" />](https://github.com/james10424)
@@ -175,7 +177,11 @@ pnpm add express-zod-api express zod typescript http-errors
175
177
  pnpm add -D @types/express @types/node @types/http-errors
176
178
  ```
177
179
 
178
- Ensure having the following options in your `tsconfig.json` file in order to make it work as expected:
180
+ ## Environment preparation
181
+
182
+ Consider using the recommended `tsconfig.json` base for your project according to your Node.js version,
183
+ for example [the base for Node.js 20+](https://github.com/tsconfig/bases/blob/main/bases/node20.json).
184
+ Ensure having the following options in order to make it work as expected:
179
185
 
180
186
  ```json
181
187
  {
package/dist/index.d.ts CHANGED
@@ -66,7 +66,31 @@ declare module "zod" {
66
66
  }
67
67
 
68
68
  declare const methods: ("delete" | "get" | "post" | "put" | "patch")[];
69
+ declare const clientMethods: ("delete" | "get" | "post" | "put" | "patch" | "head")[];
70
+ /**
71
+ * @desc Methods supported by the framework API to produce Endpoints on EndpointsFactory.
72
+ * @see BuildProps
73
+ * @example "get" | "post" | "put" | "delete" | "patch"
74
+ * */
69
75
  type Method = (typeof methods)[number];
76
+ /**
77
+ * @desc Methods usable on the client side, available via generated Integration and Documentation
78
+ * @see withHead
79
+ * @example Method | "head"
80
+ * */
81
+ type ClientMethod = (typeof clientMethods)[number];
82
+
83
+ /** @public this is the user facing configuration */
84
+ interface ApiResponse<S extends z.ZodType> {
85
+ schema: S;
86
+ /** @default 200 for a positive and 400 for a negative response */
87
+ statusCode?: number | [number, ...number[]];
88
+ /**
89
+ * @example null is for no content, such as 204 and 302
90
+ * @default "application/json"
91
+ * */
92
+ mimeType?: string | [string, ...string[]] | null;
93
+ }
70
94
 
71
95
  /** @since zod 3.25.61 output type fixed */
72
96
  declare const emptySchema: z.ZodObject<{}, z.core.$strip>;
@@ -313,18 +337,6 @@ declare class ServeStatic {
313
337
  constructor(...params: Parameters<OriginalStatic>);
314
338
  }
315
339
 
316
- /** @public this is the user facing configuration */
317
- interface ApiResponse<S extends z.ZodType> {
318
- schema: S;
319
- /** @default 200 for a positive and 400 for a negative response */
320
- statusCode?: number | [number, ...number[]];
321
- /**
322
- * @example null is for no content, such as 204 and 302
323
- * @default "application/json"
324
- * */
325
- mimeType?: string | [string, ...string[]] | null;
326
- }
327
-
328
340
  type ResultSchema<R extends Result> = R extends Result<infer S> ? S : never;
329
341
  type DiscriminatedResult = {
330
342
  output: FlatObject;
@@ -429,7 +441,7 @@ declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends Fl
429
441
  resultHandler: AbstractResultHandler;
430
442
  description?: string;
431
443
  shortDescription?: string;
432
- getOperationId?: (method: Method) => string | undefined;
444
+ getOperationId?: (method: ClientMethod) => string | undefined;
433
445
  methods?: Method[];
434
446
  scopes?: string[];
435
447
  tags?: string[];
@@ -623,7 +635,7 @@ interface BuildProps<IN extends IOSchema, OUT extends IOSchema | z.ZodVoid, MIN
623
635
  /** @desc The operation summary for the generated Documentation (50 symbols max) */
624
636
  shortDescription?: string;
625
637
  /** @desc The operation ID for the generated Documentation (must be unique) */
626
- operationId?: string | ((method: Method) => string);
638
+ operationId?: string | ((method: ClientMethod) => string);
627
639
  /**
628
640
  * @desc HTTP method(s) this endpoint can handle
629
641
  * @default "get" unless the Endpoint is assigned within DependsOnMethod
@@ -681,7 +693,7 @@ declare const createServer: (config: ServerConfig, routing: Routing) => Promise<
681
693
  interface ReqResCommons {
682
694
  makeRef: (key: object | string, subject: SchemaObject | ReferenceObject, name?: string) => ReferenceObject;
683
695
  path: string;
684
- method: Method;
696
+ method: ClientMethod;
685
697
  }
686
698
  interface OpenAPIContext extends ReqResCommons {
687
699
  isResponse: boolean;
@@ -691,7 +703,7 @@ type Depicter = (zodCtx: {
691
703
  jsonSchema: JSONSchema.BaseSchema;
692
704
  }, oasCtx: OpenAPIContext) => JSONSchema.BaseSchema | SchemaObject;
693
705
  /** @desc Using defaultIsHeader when returns null or undefined */
694
- type IsHeader = (name: string, method: Method, path: string) => boolean | null | undefined;
706
+ type IsHeader = (name: string, method: ClientMethod, path: string) => boolean | null | undefined;
695
707
  type BrandHandling = Record<string | symbol, Depicter>;
696
708
  declare const depictTags: (tags: Partial<Record<Tag, string | {
697
709
  description: string;
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import*as D from"ramda";import{z as Y}from"zod";import{globalRegistry as Mo}from"zod";var we=Symbol.for("express-zod-api"),W=e=>{let{brand:t}=e._zod.bag||{};if(typeof t=="symbol"||typeof t=="string"||typeof t=="number")return t},Z=e=>{let{examples:t,example:r}=Mo.get(e)||{};return t?Array.isArray(t)?t:Object.values(t).map(({value:o})=>o):r===void 0?[]:[r]};var Zo=Y.core.$constructor("$EZBrandCheck",(e,t)=>{Y.core.$ZodCheck.init(e,t),e._zod.onattach.push(r=>r._zod.bag.brand=t.brand),e._zod.check=()=>{}}),Bo=function(e){let t=Z(this).slice();return t.push(e),this.meta({examples:t})},Ko=function(){return this.meta({deprecated:!0})},Ho=function(e){return this.meta({default:e})},qo=function(e){return this.check(new Zo({brand:e,check:"$EZBrandCheck"}))},Fo=function(e){let t=typeof e=="function"?e:D.renameKeys(D.reject(D.isNil,e)),r=t(D.map(D.invoker(0,"clone"),this._zod.def.shape)),n=(this._zod.def.catchall instanceof Y.ZodUnknown?Y.looseObject:Y.object)(r);return this.transform(t).pipe(n)};if(!(we in globalThis)){globalThis[we]=!0;for(let e of Object.keys(Y)){if(!e.startsWith("Zod")||/(Success|Error|Function)$/.test(e))continue;let t=Y[e];typeof t=="function"&&Object.defineProperties(t.prototype,{example:{value:Bo,writable:!1},deprecated:{value:Ko,writable:!1},brand:{set(){},get(){return qo.bind(this)}}})}Object.defineProperty(Y.ZodDefault.prototype,"label",{value:Ho,writable:!1}),Object.defineProperty(Y.ZodObject.prototype,"remap",{value:Fo,writable:!1})}function Do(e){return e}import*as L from"ramda";import{z as Ee}from"zod";var w={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream",sse:"text/event-stream",form:"application/x-www-form-urlencoded"};var Be=Ee.object({}),At=/:([A-Za-z0-9_]+)/g,st=e=>e.match(At)?.map(t=>t.slice(1))||[],Uo=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(w.upload);return"files"in e&&r},Ct={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},_o=["body","query","params"],Nt=e=>e.method.toLowerCase(),it=(e,t={})=>{let r=Nt(e);return r==="options"?{}:(t[r]||Ct[r]||_o).filter(o=>o==="files"?Uo(e):!0).reduce((o,n)=>Object.assign(o,e[n]),{})},re=e=>e instanceof Error?e:e instanceof Ee.ZodError?new Ee.ZodRealError(e.issues):new Error(String(e)),me=e=>e instanceof Ee.ZodError?e.issues.map(({path:t,message:r})=>`${t.length?`${Ee.core.toDotPath(t)}: `:""}${r}`).join("; "):e.message,oe=(e,t)=>E(e)&&"_zod"in e&&(t?L.path(["_zod","def","type"],e)===t:!0),le=(e,t,r)=>e.length&&t.length?L.xprod(e,t).map(r):e.concat(t),jt=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),ne=(...e)=>{let t=L.chain(o=>o.split(/[^A-Z0-9]/gi),e);return L.chain(o=>o.replaceAll(/[A-Z]+/g,n=>`/${n}`).split("/"),t).map(jt).join("")},at=L.tryCatch((e,t)=>typeof Ee.parse(e,t),L.always(void 0)),E=e=>typeof e=="object"&&e!==null,ue=L.memoizeWith(()=>"static",()=>process.env.NODE_ENV==="production");import*as pe from"ramda";import{z as vr,globalRegistry as sn}from"zod";import*as ae from"ramda";import{z as Or}from"zod";import{z as Jo}from"zod";var fe=Symbol("Buffer"),pt=()=>Jo.custom(e=>Buffer.isBuffer(e),{error:"Expected Buffer"}).brand(fe);import{z as Ke}from"zod";var ye=Symbol("DateIn"),yr=({examples:e,...t}={})=>Ke.union([Ke.iso.date(),Ke.iso.datetime(),Ke.iso.datetime({local:!0})]).meta({examples:e}).transform(o=>new Date(o)).pipe(Ke.date()).brand(ye).meta(t);import{z as Vo}from"zod";var ge=Symbol("DateOut"),gr=(e={})=>Vo.date().transform(t=>t.toISOString()).brand(ge).meta(e);import{z as Go}from"zod";var he=class extends Error{name="RoutingError";cause;constructor(t,r,o){super(t),this.cause={method:r,path:o}}},Q=class extends Error{name="DocumentationError";cause;constructor(t,{method:r,path:o,isResponse:n}){super(t),this.cause=`${n?"Response":"Input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`}},He=class extends Error{name="IOSchemaError"},ct=class extends He{constructor(r){super("Found",{cause:r});this.cause=r}name="DeepCheckError"},qe=class extends He{constructor(r){let o=new Go.ZodError(r.issues.map(({path:n,...s})=>({...s,path:["output",...n]})));super(me(o),{cause:r});this.cause=r}name="OutputValidationError"},X=class extends He{constructor(r){super(me(r),{cause:r});this.cause=r}name="InputValidationError"},se=class extends Error{constructor(r,o){super(me(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},Fe=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};import{z as hr}from"zod";var De=Symbol("Form"),xr=e=>(e instanceof hr.ZodObject?e:hr.object(e)).brand(De);import{z as Wo}from"zod";var ie=Symbol("Upload"),br=()=>Wo.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",{error:({input:e})=>({message:`Expected file upload, received ${typeof e}`})}).brand(ie);import{z as Yo}from"zod";var B=Symbol("Raw"),Sr=Yo.object({raw:pt()}),Qo=e=>Sr.extend(e).brand(B);function Rr(e){return e?Qo(e):Sr.brand(B)}var Tr=(e,{io:t,condition:r})=>ae.tryCatch(()=>{Or.toJSONSchema(e,{io:t,unrepresentable:"any",override:({zodSchema:o})=>{if(r(o))throw new ct(o)}})},o=>o.cause)(),Pr=(e,{io:t})=>{let o=[Or.toJSONSchema(e,{io:t,unrepresentable:"any"})];for(;o.length;){let n=o.shift();if(ae.is(Object,n)){if(n.$ref==="#")return!0;o.push(...ae.values(n))}ae.is(Array,n)&&o.push(...ae.values(n))}return!1},wr=e=>Tr(e,{condition:t=>{let r=W(t);return typeof r=="symbol"&&[ie,B,De].includes(r)},io:"input"}),Xo=["nan","symbol","map","set","bigint","void","promise","never"],zt=(e,t)=>Tr(e,{io:t,condition:r=>{let o=W(r),{type:n}=r._zod.def;return!!(Xo.includes(n)||o===fe||t==="input"&&(n==="date"||o===ge)||t==="output"&&(o===ye||o===B||o===ie))}});import rn,{isHttpError as on}from"http-errors";import Er,{isHttpError as en}from"http-errors";import*as kr from"ramda";import{z as tn}from"zod";var Lt=(e,{variant:t,args:r,...o})=>{if(typeof e=="function"&&(e=e(...r)),e instanceof tn.ZodType)return[{schema:e,...o}];if(Array.isArray(e)&&!e.length){let n=new Error(`At least one ${t} response schema required.`);throw new se(n)}return(Array.isArray(e)?e:[e]).map(({schema:n,statusCode:s,mimeType:i})=>({schema:n,statusCodes:typeof s=="number"?[s]:s||o.statusCodes,mimeTypes:typeof i=="string"?[i]:i===void 0?o.mimeTypes:i}))},Ue=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),ke=e=>en(e)?e:Er(e instanceof X?400:500,me(e),{cause:e.cause||e}),xe=e=>ue()&&!e.expose?Er(e.statusCode).message:e.message,Ir=e=>Object.entries(e._zod.def.shape).reduce((t,[r,o])=>le(t,Z(o).map(kr.objOf(r)),([n,s])=>({...n,...s})),[]);var dt=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=xe(rn(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`
2
- Original error: ${e.handled.message}.`:""),{expose:on(e.cause)?e.cause.expose:!1}));r.status(500).type("text/plain").end(o)};import{z as nn}from"zod";var $t=class{},U=class extends $t{#e;#t;#r;constructor({input:t,security:r,handler:o}){super(),this.#e=t,this.#t=r,this.#r=o}get security(){return this.#t}get schema(){return this.#e}async execute({input:t,...r}){try{let o=await(this.#e||Be).parseAsync(t);return this.#r({...r,input:o})}catch(o){throw o instanceof nn.ZodError?new X(o):o}}},Ie=class extends U{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({handler:async({request:n,response:s})=>new Promise((i,p)=>{let d=c=>{if(c&&c instanceof Error)return p(o(c));i(r(n,s))};t(n,s,d)?.catch(d)})})}};var ve=class{nest(t){return Object.assign(t,{"":this})}};var _e=class extends ve{},mt=class e extends _e{#e;#t=pe.once(()=>{if(Z(this.#e.outputSchema).length||!oe(this.#e.outputSchema,"object"))return;let t=Ir(this.#e.outputSchema);if(!t.length)return;let r=this.#e.outputSchema.meta();sn.remove(this.#e.outputSchema).add(this.#e.outputSchema,{...r,examples:t})});constructor(t){super(),this.#e=t}#r(t){return new e({...this.#e,...t})}deprecated(){return this.#r({deprecated:!0})}get isDeprecated(){return this.#e.deprecated||!1}get description(){return this.#e.description}get shortDescription(){return this.#e.shortDescription}get methods(){return Object.freeze(this.#e.methods)}get inputSchema(){return this.#e.inputSchema}get outputSchema(){return this.#t(),this.#e.outputSchema}get requestType(){let t=wr(this.#e.inputSchema);if(t){let r=W(t);if(r===ie)return"upload";if(r===B)return"raw";if(r===De)return"form"}return"json"}getResponses(t){return t==="positive"&&this.#t(),Object.freeze(t==="negative"?this.#e.resultHandler.getNegativeResponse():this.#e.resultHandler.getPositiveResponse(this.#e.outputSchema))}get security(){let t=pe.pluck("security",this.#e.middlewares||[]);return pe.reject(pe.isNil,t)}get scopes(){return Object.freeze(this.#e.scopes||[])}get tags(){return Object.freeze(this.#e.tags||[])}getOperationId(t){return this.#e.getOperationId?.(t)}async#o(t){try{return await this.#e.outputSchema.parseAsync(t)}catch(r){throw r instanceof vr.ZodError?new qe(r):r}}async#n({method:t,logger:r,options:o,response:n,...s}){for(let i of this.#e.middlewares||[])if(!(t==="options"&&!(i instanceof Ie))&&(Object.assign(o,await i.execute({...s,options:o,response:n,logger:r})),n.writableEnded)){r.warn("A middleware has closed the stream. Accumulated options:",o);break}}async#s({input:t,...r}){let o;try{o=await this.#e.inputSchema.parseAsync(t)}catch(n){throw n instanceof vr.ZodError?new X(n):n}return this.#e.handler({...r,input:o})}async#i(t){try{await this.#e.resultHandler.execute(t)}catch(r){dt({...t,error:new se(re(r),t.error||void 0)})}}async execute({request:t,response:r,logger:o,config:n}){let s=Nt(t),i={},p={output:{},error:null},d=it(t,n.inputSources);try{if(await this.#n({method:s,input:d,request:t,response:r,logger:o,options:i}),r.writableEnded)return;if(s==="options")return void r.status(200).end();p={output:await this.#o(await this.#s({input:d,logger:o,options:i})),error:null}}catch(c){p={output:null,error:re(c)}}await this.#i({...p,input:d,request:t,response:r,logger:o,options:i})}};var Ar=(e,t)=>e&&t?e.and(t):e||t,Cr=(e,t)=>e?e.and(t):t;import{globalRegistry as Nr,z as K}from"zod";var Ae={positive:200,negative:400},Ce=Object.keys(Ae);var Mt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},be=class extends Mt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return Lt(this.#e,{variant:"positive",args:[t],statusCodes:[Ae.positive],mimeTypes:[w.json]})}getNegativeResponse(){return Lt(this.#t,{variant:"negative",args:[],statusCodes:[Ae.negative],mimeTypes:[w.json]})}},Se=new be({positive:e=>{let t=K.object({status:K.literal("success"),data:e}),r=Z(e);return r.length&&Nr.add(t,{examples:r.map(o=>({status:"success",data:o}))}),t},negative:K.object({status:K.literal("error"),error:K.object({message:K.string()})}).example({status:"error",error:{message:"Sample error message"}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(e){let i=ke(e);return Ue(i,s,o,t),void n.status(i.statusCode).set(i.headers).json({status:"error",error:{message:xe(i)}})}n.status(Ae.positive).json({status:"success",data:r})}}),Zt=new be({positive:e=>{let t=e instanceof K.ZodObject&&"items"in e.shape&&e.shape.items instanceof K.ZodArray?e.shape.items:K.array(K.any());if(Z(t).length)return t;let r=Z(e).filter(o=>E(o)&&"items"in o&&Array.isArray(o.items)).map(o=>o.items);if(r.length){let o=t.meta();Nr.remove(t).add(t,{...o,examples:r})}return t},negative:K.string().example("Sample error message"),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let i=ke(r);return Ue(i,o,n,s),void e.status(i.statusCode).type("text/plain").send(xe(i))}if("items"in t&&Array.isArray(t.items))return void e.status(Ae.positive).json(t.items);throw new Error("Property 'items' is missing in the endpoint output")}});var Re=class e{constructor(t){this.resultHandler=t}schema=void 0;middlewares=[];#e(t){let r=new e(this.resultHandler);return r.middlewares=this.middlewares.concat(t),r.schema=Ar(this.schema,t.schema),r}addMiddleware(t){return this.#e(t instanceof U?t:new U(t))}use=this.addExpressMiddleware;addExpressMiddleware(...t){return this.#e(new Ie(...t))}addOptions(t){return this.#e(new U({handler:t}))}build({input:t=Be,output:r,operationId:o,scope:n,tag:s,method:i,...p}){let{middlewares:d,resultHandler:c}=this,m=typeof i=="string"?[i]:i,g=typeof o=="function"?o:()=>o,x=typeof n=="string"?[n]:n||[],y=typeof s=="string"?[s]:s||[];return new mt({...p,middlewares:d,outputSchema:r,resultHandler:c,scopes:x,tags:y,methods:m,getOperationId:g,inputSchema:Cr(this.schema,t)})}buildVoid({handler:t,...r}){return this.build({...r,output:Be,handler:async o=>(await t(o),{})})}},an=new Re(Se),pn=new Re(Zt);import yn from"ansis";import{inspect as gn}from"node:util";import{performance as Zr}from"node:perf_hooks";import{blue as cn,green as dn,hex as mn,red as ln,cyanBright as un}from"ansis";import*as jr from"ramda";var Bt={debug:cn,info:dn,warn:mn("#FFA500"),error:ln,ctx:un},lt={debug:10,info:20,warn:30,error:40},zr=e=>E(e)&&Object.keys(lt).some(t=>t in e),Lr=e=>e in lt,$r=(e,t)=>lt[e]<lt[t],fn=(e,t=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:t,style:"unit",unitDisplay:"long",unit:e}),Ne=jr.memoizeWith((e,t)=>`${e}${t}`,fn),Mr=e=>e<1e-6?Ne("nanosecond",3).format(e/1e-6):e<.001?Ne("nanosecond").format(e/1e-6):e<1?Ne("microsecond").format(e/.001):e<1e3?Ne("millisecond").format(e):e<6e4?Ne("second",2).format(e/1e3):Ne("minute",2).format(e/6e4);var Je=class e{config;constructor({color:t=yn.isSupported(),level:r=ue()?"warn":"debug",depth:o=2,ctx:n={}}={}){this.config={color:t,level:r,depth:o,ctx:n}}format(t){let{depth:r,color:o,level:n}=this.config;return gn(t,{depth:r,colors:o,breakLength:n==="debug"?80:1/0,compact:n==="debug"?3:!0})}print(t,r,o){let{level:n,ctx:{requestId:s,...i},color:p}=this.config;if(n==="silent"||$r(t,n))return;let d=[new Date().toISOString()];s&&d.push(p?Bt.ctx(s):s),d.push(p?`${Bt[t](t)}:`:`${t}:`,r),o!==void 0&&d.push(this.format(o)),Object.keys(i).length>0&&d.push(this.format(i)),console.log(d.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}get ctx(){return this.config.ctx}profile(t){let r=Zr.now();return()=>{let o=Zr.now()-r,{message:n,severity:s="debug",formatter:i=Mr}=typeof t=="object"?t:{message:t};this.print(typeof s=="function"?s(o):s,n,i(o))}}};import*as Br from"ramda";var Ve=class e extends ve{#e;constructor(t){super(),this.#e=t}get entries(){let t=Br.filter(r=>!!r[1],Object.entries(this.#e));return Object.freeze(t)}deprecated(){let t=Object.entries(this.#e).reduce((r,[o,n])=>Object.assign(r,{[o]:n.deprecated()}),{});return new e(t)}};import hn from"express";var Ge=class{#e;constructor(...t){this.#e=t}apply(t,r){return r(t,hn.static(...this.#e))}};import yt from"express";import zn from"node:http";import Ln from"node:https";var je=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new Fe(e)};import wn from"http-errors";import{z as Hr}from"zod";import*as b from"ramda";var xn=e=>e.type==="object",bn=b.mergeDeepWith((e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return b.concat(e,t);if(e===t)return t;throw new Error("Can not flatten properties",{cause:{a:e,b:t}})}),Sn=b.pipe(Object.keys,b.without(["type","properties","required","examples","description","additionalProperties"]),b.isEmpty),Kr=b.pair(!0),ze=(e,t="coerce")=>{let r=[b.pair(!1,e)],o={type:"object",properties:{}},n=[];for(;r.length;){let[s,i]=r.shift();if(i.description&&(o.description??=i.description),i.allOf&&r.push(...i.allOf.map(p=>{if(t==="throw"&&!(p.type==="object"&&Sn(p)))throw new Error("Can not merge");return b.pair(s,p)})),i.anyOf&&r.push(...b.map(Kr,i.anyOf)),i.oneOf&&r.push(...b.map(Kr,i.oneOf)),i.examples?.length&&(s?o.examples=b.concat(o.examples||[],i.examples):o.examples=le(o.examples?.filter(E)||[],i.examples.filter(E),([p,d])=>b.mergeDeepRight(p,d))),!!xn(i)&&(r.push([s,{examples:Rn(i)}]),i.properties&&(o.properties=(t==="throw"?bn:b.mergeDeepRight)(o.properties,i.properties),!s&&i.required&&n.push(...i.required)),E(i.propertyNames))){let p=[];typeof i.propertyNames.const=="string"&&p.push(i.propertyNames.const),i.propertyNames.enum&&p.push(...i.propertyNames.enum.filter(c=>typeof c=="string"));let d={...Object(i.additionalProperties)};for(let c of p)o.properties[c]??=d;s||n.push(...p)}}return n.length&&(o.required=[...new Set(n)]),o},Rn=e=>Object.entries(e.properties||{}).reduce((t,[r,o])=>{let{examples:n=[]}=E(o)?o:{};return le(t,n.map(b.objOf(r)),([s,i])=>({...s,...i}))},[]);var ut=class{constructor(t){this.logger=t}#e=new WeakSet;#t=new WeakMap;checkSchema(t,r){if(!this.#e.has(t)){for(let o of["input","output"]){let n=[Hr.toJSONSchema(t[`${o}Schema`],{unrepresentable:"any"})];for(;n.length>0;){let s=n.shift();s.type&&s.type!=="object"&&this.logger.warn(`Endpoint ${o} schema is not object-based`,r);for(let i of["allOf","oneOf","anyOf"])s[i]&&n.push(...s[i])}}if(t.requestType==="json"){let o=zt(t.inputSchema,"input");o&&this.logger.warn("The final input schema of the endpoint contains an unsupported JSON payload type.",Object.assign(r,{reason:o}))}for(let o of Ce)for(let{mimeTypes:n,schema:s}of t.getResponses(o)){if(!n?.includes(w.json))continue;let i=zt(s,"output");i&&this.logger.warn(`The final ${o} response schema of the endpoint contains an unsupported JSON payload type.`,Object.assign(r,{reason:i}))}this.#e.add(t)}}checkPathParams(t,r,o){let n=this.#t.get(r);if(n?.paths.includes(t))return;let s=st(t);if(s.length===0)return;let i=n?.flat||ze(Hr.toJSONSchema(r.inputSchema,{unrepresentable:"any",io:"input"}));for(let p of s)p in i.properties||this.logger.warn("The input schema of the endpoint is most likely missing the parameter of the path it's assigned to.",Object.assign(o,{path:t,param:p}));n?n.paths.push(t):this.#t.set(r,{flat:i,paths:[t]})}};var Kt=["get","post","put","delete","patch"],qr=e=>Kt.includes(e);var On=e=>{let[t,r]=e.trim().split(/ (.+)/,2);return r&&qr(t)?[r,t]:[e]},Tn=e=>e.trim().split("/").filter(Boolean).join("/"),Fr=(e,t)=>Object.entries(e).map(([r,o])=>{let[n,s]=On(r);return[[t||""].concat(Tn(n)||[]).join("/"),o,s]}),Pn=(e,t)=>{throw new he("Route with explicit method can only be assigned with Endpoint",e,t)},Dr=(e,t,r)=>{if(!(!r||r.includes(e)))throw new he(`Method ${e} is not supported by the assigned Endpoint.`,e,t)},Ht=(e,t,r)=>{let o=`${e} ${t}`;if(r.has(o))throw new he("Route has a duplicate",e,t);r.add(o)},Le=({routing:e,onEndpoint:t,onStatic:r})=>{let o=Fr(e),n=new Set;for(;o.length;){let[s,i,p]=o.shift();if(i instanceof _e)if(p)Ht(p,s,n),Dr(p,s,i.methods),t(i,s,p);else{let{methods:d=["get"]}=i;for(let c of d)Ht(c,s,n),t(i,s,c)}else if(p&&Pn(p,s),i instanceof Ge)r&&i.apply(s,r);else if(i instanceof Ve)for(let[d,c]of i.entries){let{methods:m}=c;Ht(d,s,n),Dr(d,s,m),t(c,s,d)}else o.unshift(...Fr(i,s))}};import*as Ur from"ramda";var _r=e=>e.sort((t,r)=>+(t==="options")-+(r==="options")).join(", ").toUpperCase(),En=e=>({method:t},r,o)=>{let n=_r(e);r.set({Allow:n});let s=wn(405,`${t} is not allowed`,{headers:{Allow:n}});o(s)},kn=e=>({"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":_r(e),"Access-Control-Allow-Headers":"content-type"}),qt=({app:e,getLogger:t,config:r,routing:o,parsers:n})=>{let s=ue()?void 0:new ut(t()),i=new Map;Le({routing:o,onEndpoint:(c,m,g)=>{ue()||(s?.checkSchema(c,{path:m,method:g}),s?.checkPathParams(m,c,{method:g}));let x=n?.[c.requestType]||[],y=Ur.pair(x,c);i.has(m)||i.set(m,new Map(r.cors?[["options",y]]:[])),i.get(m)?.set(g,y)},onStatic:e.use.bind(e)}),s=void 0;let d=new Map;for(let[c,m]of i){let g=Array.from(m.keys());for(let[x,[y,v]]of m){let k=y.slice().concat(async(z,S)=>{let A=t(z);return v.execute({request:z,response:S,logger:A,config:r})});r.cors&&k.unshift(async(z,S,A)=>{let C=t(z),M=kn(g),N=typeof r.cors=="function"?await r.cors({request:z,endpoint:v,logger:C,defaultHeaders:M}):M;S.set(N),A()}),e[x](c,...k)}r.wrongMethodBehavior!==404&&d.set(c,En(g))}for(let[c,m]of d)e.all(c,m)};import vn from"http-errors";import{setInterval as In}from"node:timers/promises";var Jr=e=>"_httpMessage"in e&&typeof e._httpMessage=="object"&&e._httpMessage!==null&&"headersSent"in e._httpMessage&&typeof e._httpMessage.headersSent=="boolean"&&"setHeader"in e._httpMessage&&typeof e._httpMessage.setHeader=="function",Vr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Gr=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Wr=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),Yr=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var Qr=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,s=c=>void n.delete(c.destroy()),i=c=>void(Jr(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):s(c)),p=c=>void(o?c.destroy():n.add(c.once("close",()=>void n.delete(c))));for(let c of e)for(let m of["connection","secureConnection"])c.on(m,p);let d=async()=>{for(let c of e)c.on("request",Wr);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(Gr(c)||Vr(c))&&i(c);for await(let c of In(10,Date.now()))if(n.size===0||Date.now()-c>=t)break;for(let c of n)s(c);return Promise.allSettled(e.map(Yr))};return{sockets:n,shutdown:()=>o??=d()}};var Xr=({errorHandler:e,getLogger:t})=>async(r,o,n,s)=>r?e.execute({error:re(r),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):s(),eo=({errorHandler:e,getLogger:t})=>async(r,o)=>{let n=vn(404,`Can not ${r.method} ${r.path}`),s=t(r);try{await e.execute({request:r,response:o,logger:s,error:n,input:null,output:null,options:{}})}catch(i){dt({response:o,logger:s,error:new se(re(i),n)})}},An=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},Cn=e=>({log:e.debug.bind(e)}),to=async({getLogger:e,config:t})=>{let r=await je("express-fileupload"),{limitError:o,beforeUpload:n,...s}={...typeof t.upload=="object"&&t.upload},i=[];return i.push(async(p,d,c)=>{let m=e(p);return await n?.({request:p,logger:m}),r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:Cn(m)})(p,d,c)}),o&&i.push(An(o)),i},ro=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},oo=({logger:e,config:{childLoggerProvider:t,accessLogger:r=({method:o,path:n},s)=>s.debug(`${o}: ${n}`)}})=>async(o,n,s)=>{let i=await t?.({request:o,parent:e})||e;r?.(o,i),o.res&&(o.res.locals[we]={logger:i}),s()},no=e=>t=>t?.res?.locals[we]?.logger||e,so=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
3
- `).slice(1))),io=({servers:e,logger:t,options:{timeout:r,beforeExit:o,events:n=["SIGINT","SIGTERM"]}})=>{let s=Qr(e,{logger:t,timeout:r}),i=async()=>{await s.shutdown(),await o?.(),process.exit()};for(let p of n)process.on(p,i)};import{gray as Nn,hex as ao,italic as ft,whiteBright as jn}from"ansis";var po=e=>{if(e.columns<132)return;let t=ft("Proudly supports transgender community.".padStart(109)),r=ft("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),o=ft("Thank you for choosing Express Zod API for your project.".padStart(132)),n=ft("for Sara".padEnd(20)),s=ao("#F5A9B8"),i=ao("#5BCEFA"),p=new Array(14).fill(i,1,3).fill(s,3,5).fill(jn,5,7).fill(s,7,9).fill(i,9,12).fill(Nn,12,13),d=`
1
+ import*as D from"ramda";import{z as Y}from"zod";import{globalRegistry as Ho}from"zod";var Ce=Symbol.for("express-zod-api"),W=e=>{let{brand:t}=e._zod.bag||{};if(typeof t=="symbol"||typeof t=="string"||typeof t=="number")return t},Z=e=>{let{examples:t,example:r}=Ho.get(e)||{};return t?Array.isArray(t)?t:Object.values(t).map(({value:o})=>o):r===void 0?[]:[r]};var Ko=Y.core.$constructor("$EZBrandCheck",(e,t)=>{Y.core.$ZodCheck.init(e,t),e._zod.onattach.push(r=>r._zod.bag.brand=t.brand),e._zod.check=()=>{}}),qo=function(e){let t=Z(this).slice();return t.push(e),this.meta({examples:t})},Fo=function(){return this.meta({deprecated:!0})},Do=function(e){return this.meta({default:e})},Uo=function(e){return this.check(new Ko({brand:e,check:"$EZBrandCheck"}))},_o=function(e){let t=typeof e=="function"?e:D.renameKeys(D.reject(D.isNil,e)),r=t(D.map(D.invoker(0,"clone"),this._zod.def.shape)),n=(this._zod.def.catchall instanceof Y.ZodUnknown?Y.looseObject:Y.object)(r);return this.transform(t).pipe(n)};if(!(Ce in globalThis)){globalThis[Ce]=!0;for(let e of Object.keys(Y)){if(!e.startsWith("Zod")||/(Success|Error|Function)$/.test(e))continue;let t=Y[e];typeof t=="function"&&Object.defineProperties(t.prototype,{example:{value:qo,writable:!1},deprecated:{value:Fo,writable:!1},brand:{set(){},get(){return Uo.bind(this)}}})}Object.defineProperty(Y.ZodDefault.prototype,"label",{value:Do,writable:!1}),Object.defineProperty(Y.ZodObject.prototype,"remap",{value:_o,writable:!1})}function Jo(e){return e}import*as z from"ramda";import{z as Ee}from"zod";var C={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream",sse:"text/event-stream",form:"application/x-www-form-urlencoded"};var gr=["get","post","put","delete","patch"],xr=[...gr,"head"],me=e=>gr.includes(e);var He=Ee.object({}),jt=/:([A-Za-z0-9_]+)/g,at=e=>e.match(jt)?.map(t=>t.slice(1))||[],Vo=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(C.upload);return"files"in e&&r},Go={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Wo=["body","query","params"],zt=e=>e.method.toLowerCase(),Lt=(e,t={})=>{if(e==="options")return[];let r=e==="head"?"get":me(e)?e:void 0;return(r?t[r]||Go[r]:void 0)||Wo},pt=(e,t={})=>{let r=zt(e);return Lt(r,t).filter(o=>o==="files"?Vo(e):!0).reduce((o,n)=>Object.assign(o,e[n]),{})},oe=e=>e instanceof Error?e:e instanceof Ee.ZodError?new Ee.ZodRealError(e.issues):new Error(String(e)),le=e=>e instanceof Ee.ZodError?e.issues.map(({path:t,message:r})=>`${t.length?`${Ee.core.toDotPath(t)}: `:""}${r}`).join("; "):e.message,ne=(e,t)=>E(e)&&"_zod"in e&&(t?z.path(["_zod","def","type"],e)===t:!0),ue=(e,t,r)=>e.length&&t.length?z.xprod(e,t).map(r):e.concat(t),$t=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),se=(...e)=>{let t=z.chain(o=>o.split(/[^A-Z0-9]/gi),e);return z.chain(o=>o.replaceAll(/[A-Z]+/g,n=>`/${n}`).split("/"),t).map($t).join("")},ct=z.tryCatch((e,t)=>typeof Ee.parse(e,t),z.always(void 0)),E=e=>typeof e=="object"&&e!==null,fe=z.memoizeWith(()=>"static",()=>process.env.NODE_ENV==="production"),dt=(e,t)=>!(e==="head"&&t==="positive");import*as ce from"ramda";import{z as Mr,globalRegistry as dn}from"zod";import*as pe from"ramda";import{z as Cr}from"zod";import{z as Yo}from"zod";var ye=Symbol("Buffer"),mt=()=>Yo.custom(e=>Buffer.isBuffer(e),{error:"Expected Buffer"}).brand(ye);import{z as Ke}from"zod";var he=Symbol("DateIn"),Sr=({examples:e,...t}={})=>Ke.union([Ke.iso.date(),Ke.iso.datetime(),Ke.iso.datetime({local:!0})]).meta({examples:e}).transform(o=>new Date(o)).pipe(Ke.date()).brand(he).meta(t);import{z as Qo}from"zod";var ge=Symbol("DateOut"),br=(e={})=>Qo.date().transform(t=>t.toISOString()).brand(ge).meta(e);import{z as Xo}from"zod";var xe=class extends Error{name="RoutingError";cause;constructor(t,r,o){super(t),this.cause={method:r,path:o}}},Q=class extends Error{name="DocumentationError";cause;constructor(t,{method:r,path:o,isResponse:n}){super(t),this.cause=`${n?"Response":"Input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`}},qe=class extends Error{name="IOSchemaError"},lt=class extends qe{constructor(r){super("Found",{cause:r});this.cause=r}name="DeepCheckError"},Fe=class extends qe{constructor(r){let o=new Xo.ZodError(r.issues.map(({path:n,...s})=>({...s,path:["output",...n]})));super(le(o),{cause:r});this.cause=r}name="OutputValidationError"},X=class extends qe{constructor(r){super(le(r),{cause:r});this.cause=r}name="InputValidationError"},ie=class extends Error{constructor(r,o){super(le(r),{cause:r});this.cause=r;this.handled=o}name="ResultHandlerError"},De=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};import{z as Rr}from"zod";var Ue=Symbol("Form"),Or=e=>(e instanceof Rr.ZodObject?e:Rr.object(e)).brand(Ue);import{z as en}from"zod";var ae=Symbol("Upload"),Tr=()=>en.custom(e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.encoding=="string"&&typeof e.mimetype=="string"&&Buffer.isBuffer(e.data)&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",{error:({input:e})=>({message:`Expected file upload, received ${typeof e}`})}).brand(ae);import{z as tn}from"zod";var B=Symbol("Raw"),Pr=tn.object({raw:mt()}),rn=e=>Pr.extend(e).brand(B);function wr(e){return e?rn(e):Pr.brand(B)}var Er=(e,{io:t,condition:r})=>pe.tryCatch(()=>{Cr.toJSONSchema(e,{io:t,unrepresentable:"any",override:({zodSchema:o})=>{if(r(o))throw new lt(o)}})},o=>o.cause)(),kr=(e,{io:t})=>{let o=[Cr.toJSONSchema(e,{io:t,unrepresentable:"any"})];for(;o.length;){let n=o.shift();if(pe.is(Object,n)){if(n.$ref==="#")return!0;o.push(...pe.values(n))}pe.is(Array,n)&&o.push(...pe.values(n))}return!1},Ir=e=>Er(e,{condition:t=>{let r=W(t);return typeof r=="symbol"&&[ae,B,Ue].includes(r)},io:"input"}),on=["nan","symbol","map","set","bigint","void","promise","never"],Zt=(e,t)=>Er(e,{io:t,condition:r=>{let o=W(r),{type:n}=r._zod.def;return!!(on.includes(n)||o===ye||t==="input"&&(n==="date"||o===ge)||t==="output"&&(o===he||o===B||o===ae))}});import an,{isHttpError as pn}from"http-errors";import vr,{isHttpError as nn}from"http-errors";import*as Ar from"ramda";import{z as sn}from"zod";var Bt=(e,{variant:t,args:r,...o})=>{if(typeof e=="function"&&(e=e(...r)),e instanceof sn.ZodType)return[{schema:e,...o}];if(Array.isArray(e)&&!e.length){let n=new Error(`At least one ${t} response schema required.`);throw new ie(n)}return(Array.isArray(e)?e:[e]).map(({schema:n,statusCode:s,mimeType:i})=>({schema:n,statusCodes:typeof s=="number"?[s]:s||o.statusCodes,mimeTypes:typeof i=="string"?[i]:i===void 0?o.mimeTypes:i}))},_e=(e,t,{url:r},o)=>!e.expose&&t.error("Server side error",{error:e,url:r,payload:o}),ke=e=>nn(e)?e:vr(e instanceof X?400:500,le(e),{cause:e.cause||e}),Se=e=>fe()&&!e.expose?vr(e.statusCode).message:e.message,Nr=e=>Object.entries(e._zod.def.shape).reduce((t,[r,o])=>ue(t,Z(o).map(Ar.objOf(r)),([n,s])=>({...n,...s})),[]);var ut=({error:e,logger:t,response:r})=>{t.error("Result handler failure",e);let o=Se(an(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`
2
+ Original error: ${e.handled.message}.`:""),{expose:pn(e.cause)?e.cause.expose:!1}));r.status(500).type("text/plain").end(o)};import{z as cn}from"zod";var Ht=class{},U=class extends Ht{#e;#t;#r;constructor({input:t,security:r,handler:o}){super(),this.#e=t,this.#t=r,this.#r=o}get security(){return this.#t}get schema(){return this.#e}async execute({input:t,...r}){try{let o=await(this.#e||He).parseAsync(t);return this.#r({...r,input:o})}catch(o){throw o instanceof cn.ZodError?new X(o):o}}},Ie=class extends U{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({handler:async({request:n,response:s})=>new Promise((i,p)=>{let d=c=>{if(c&&c instanceof Error)return p(o(c));i(r(n,s))};t(n,s,d)?.catch(d)})})}};var ve=class{nest(t){return Object.assign(t,{"":this})}};var Je=class extends ve{},ft=class e extends Je{#e;#t=ce.once(()=>{if(Z(this.#e.outputSchema).length||!ne(this.#e.outputSchema,"object"))return;let t=Nr(this.#e.outputSchema);if(!t.length)return;let r=this.#e.outputSchema.meta();dn.remove(this.#e.outputSchema).add(this.#e.outputSchema,{...r,examples:t})});constructor(t){super(),this.#e=t}#r(t){return new e({...this.#e,...t})}deprecated(){return this.#r({deprecated:!0})}get isDeprecated(){return this.#e.deprecated||!1}get description(){return this.#e.description}get shortDescription(){return this.#e.shortDescription}get methods(){return Object.freeze(this.#e.methods)}get inputSchema(){return this.#e.inputSchema}get outputSchema(){return this.#t(),this.#e.outputSchema}get requestType(){let t=Ir(this.#e.inputSchema);if(t){let r=W(t);if(r===ae)return"upload";if(r===B)return"raw";if(r===Ue)return"form"}return"json"}getResponses(t){return t==="positive"&&this.#t(),Object.freeze(t==="negative"?this.#e.resultHandler.getNegativeResponse():this.#e.resultHandler.getPositiveResponse(this.#e.outputSchema))}get security(){let t=ce.pluck("security",this.#e.middlewares||[]);return ce.reject(ce.isNil,t)}get scopes(){return Object.freeze(this.#e.scopes||[])}get tags(){return Object.freeze(this.#e.tags||[])}getOperationId(t){return this.#e.getOperationId?.(t)}async#o(t){try{return await this.#e.outputSchema.parseAsync(t)}catch(r){throw r instanceof Mr.ZodError?new Fe(r):r}}async#n({method:t,logger:r,options:o,response:n,...s}){for(let i of this.#e.middlewares||[])if(!(t==="options"&&!(i instanceof Ie))&&(Object.assign(o,await i.execute({...s,options:o,response:n,logger:r})),n.writableEnded)){r.warn("A middleware has closed the stream. Accumulated options:",o);break}}async#s({input:t,...r}){let o;try{o=await this.#e.inputSchema.parseAsync(t)}catch(n){throw n instanceof Mr.ZodError?new X(n):n}return this.#e.handler({...r,input:o})}async#i(t){try{await this.#e.resultHandler.execute(t)}catch(r){ut({...t,error:new ie(oe(r),t.error||void 0)})}}async execute({request:t,response:r,logger:o,config:n}){let s=zt(t),i={},p={output:{},error:null},d=pt(t,n.inputSources);try{if(await this.#n({method:s,input:d,request:t,response:r,logger:o,options:i}),r.writableEnded)return;if(s==="options")return void r.status(200).end();p={output:await this.#o(await this.#s({input:d,logger:o,options:i})),error:null}}catch(c){p={output:null,error:oe(c)}}await this.#i({...p,input:d,request:t,response:r,logger:o,options:i})}};var jr=(e,t)=>e&&t?e.and(t):e||t,zr=(e,t)=>e?e.and(t):t;import{globalRegistry as Lr,z as H}from"zod";var Ae={positive:200,negative:400},Ne=Object.keys(Ae);var Kt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},be=class extends Kt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return Bt(this.#e,{variant:"positive",args:[t],statusCodes:[Ae.positive],mimeTypes:[C.json]})}getNegativeResponse(){return Bt(this.#t,{variant:"negative",args:[],statusCodes:[Ae.negative],mimeTypes:[C.json]})}},Re=new be({positive:e=>{let t=H.object({status:H.literal("success"),data:e}),r=Z(e);return r.length&&Lr.add(t,{examples:r.map(o=>({status:"success",data:o}))}),t},negative:H.object({status:H.literal("error"),error:H.object({message:H.string()})}).example({status:"error",error:{message:"Sample error message"}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(e){let i=ke(e);return _e(i,s,o,t),void n.status(i.statusCode).set(i.headers).json({status:"error",error:{message:Se(i)}})}n.status(Ae.positive).json({status:"success",data:r})}}),qt=new be({positive:e=>{let t=e instanceof H.ZodObject&&"items"in e.shape&&e.shape.items instanceof H.ZodArray?e.shape.items:H.array(H.any());if(Z(t).length)return t;let r=Z(e).filter(o=>E(o)&&"items"in o&&Array.isArray(o.items)).map(o=>o.items);if(r.length){let o=t.meta();Lr.remove(t).add(t,{...o,examples:r})}return t},negative:H.string().example("Sample error message"),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let i=ke(r);return _e(i,o,n,s),void e.status(i.statusCode).type("text/plain").send(Se(i))}if("items"in t&&Array.isArray(t.items))return void e.status(Ae.positive).json(t.items);throw new Error("Property 'items' is missing in the endpoint output")}});var Oe=class e{constructor(t){this.resultHandler=t}schema=void 0;middlewares=[];#e(t){let r=new e(this.resultHandler);return r.middlewares=this.middlewares.concat(t),r.schema=jr(this.schema,t.schema),r}addMiddleware(t){return this.#e(t instanceof U?t:new U(t))}use=this.addExpressMiddleware;addExpressMiddleware(...t){return this.#e(new Ie(...t))}addOptions(t){return this.#e(new U({handler:t}))}build({input:t=He,output:r,operationId:o,scope:n,tag:s,method:i,...p}){let{middlewares:d,resultHandler:c}=this,m=typeof i=="string"?[i]:i,y=typeof o=="function"?o:w=>o&&`${o}${w==="head"?"__HEAD":""}`,g=typeof n=="string"?[n]:n||[],h=typeof s=="string"?[s]:s||[];return new ft({...p,middlewares:d,outputSchema:r,resultHandler:c,scopes:g,tags:h,methods:m,getOperationId:y,inputSchema:zr(this.schema,t)})}buildVoid({handler:t,...r}){return this.build({...r,output:He,handler:async o=>(await t(o),{})})}},mn=new Oe(Re),ln=new Oe(qt);import Sn from"ansis";import{inspect as bn}from"node:util";import{performance as qr}from"node:perf_hooks";import{blue as un,green as fn,hex as yn,red as hn,cyanBright as gn}from"ansis";import*as $r from"ramda";var Ft={debug:un,info:fn,warn:yn("#FFA500"),error:hn,ctx:gn},yt={debug:10,info:20,warn:30,error:40},Zr=e=>E(e)&&Object.keys(yt).some(t=>t in e),Br=e=>e in yt,Hr=(e,t)=>yt[e]<yt[t],xn=(e,t=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:t,style:"unit",unitDisplay:"long",unit:e}),Me=$r.memoizeWith((e,t)=>`${e}${t}`,xn),Kr=e=>e<1e-6?Me("nanosecond",3).format(e/1e-6):e<.001?Me("nanosecond").format(e/1e-6):e<1?Me("microsecond").format(e/.001):e<1e3?Me("millisecond").format(e):e<6e4?Me("second",2).format(e/1e3):Me("minute",2).format(e/6e4);var Ve=class e{config;constructor({color:t=Sn.isSupported(),level:r=fe()?"warn":"debug",depth:o=2,ctx:n={}}={}){this.config={color:t,level:r,depth:o,ctx:n}}format(t){let{depth:r,color:o,level:n}=this.config;return bn(t,{depth:r,colors:o,breakLength:n==="debug"?80:1/0,compact:n==="debug"?3:!0})}print(t,r,o){let{level:n,ctx:{requestId:s,...i},color:p}=this.config;if(n==="silent"||Hr(t,n))return;let d=[new Date().toISOString()];s&&d.push(p?Ft.ctx(s):s),d.push(p?`${Ft[t](t)}:`:`${t}:`,r),o!==void 0&&d.push(this.format(o)),Object.keys(i).length>0&&d.push(this.format(i)),console.log(d.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}get ctx(){return this.config.ctx}profile(t){let r=qr.now();return()=>{let o=qr.now()-r,{message:n,severity:s="debug",formatter:i=Kr}=typeof t=="object"?t:{message:t};this.print(typeof s=="function"?s(o):s,n,i(o))}}};import*as Fr from"ramda";var Ge=class e extends ve{#e;constructor(t){super(),this.#e=t}get entries(){let t=Fr.filter(r=>!!r[1],Object.entries(this.#e));return Object.freeze(t)}deprecated(){let t=Object.entries(this.#e).reduce((r,[o,n])=>Object.assign(r,{[o]:n.deprecated()}),{});return new e(t)}};import Rn from"express";var We=class{#e;constructor(...t){this.#e=t}apply(t,r){return r(t,Rn.static(...this.#e))}};import St from"express";import Zn from"node:http";import Bn from"node:https";var je=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new De(e)};import In from"http-errors";import{z as Ur}from"zod";import*as S from"ramda";var On=e=>e.type==="object",Tn=S.mergeDeepWith((e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return S.concat(e,t);if(e===t)return t;throw new Error("Can not flatten properties",{cause:{a:e,b:t}})}),Pn=S.pipe(Object.keys,S.without(["type","properties","required","examples","description","additionalProperties"]),S.isEmpty),Dr=S.pair(!0),ze=(e,t="coerce")=>{let r=[S.pair(!1,e)],o={type:"object",properties:{}},n=[];for(;r.length;){let[s,i]=r.shift();if(i.description&&(o.description??=i.description),i.allOf&&r.push(...i.allOf.map(p=>{if(t==="throw"&&!(p.type==="object"&&Pn(p)))throw new Error("Can not merge");return S.pair(s,p)})),i.anyOf&&r.push(...S.map(Dr,i.anyOf)),i.oneOf&&r.push(...S.map(Dr,i.oneOf)),i.examples?.length&&(s?o.examples=S.concat(o.examples||[],i.examples):o.examples=ue(o.examples?.filter(E)||[],i.examples.filter(E),([p,d])=>S.mergeDeepRight(p,d))),!!On(i)&&(r.push([s,{examples:wn(i)}]),i.properties&&(o.properties=(t==="throw"?Tn:S.mergeDeepRight)(o.properties,i.properties),!s&&i.required&&n.push(...i.required)),E(i.propertyNames))){let p=[];typeof i.propertyNames.const=="string"&&p.push(i.propertyNames.const),i.propertyNames.enum&&p.push(...i.propertyNames.enum.filter(c=>typeof c=="string"));let d={...Object(i.additionalProperties)};for(let c of p)o.properties[c]??=d;s||n.push(...p)}}return n.length&&(o.required=[...new Set(n)]),o},wn=e=>Object.entries(e.properties||{}).reduce((t,[r,o])=>{let{examples:n=[]}=E(o)?o:{};return ue(t,n.map(S.objOf(r)),([s,i])=>({...s,...i}))},[]);var ht=class{constructor(t){this.logger=t}#e=new WeakSet;#t=new WeakMap;checkSchema(t,r){if(!this.#e.has(t)){for(let o of["input","output"]){let n=[Ur.toJSONSchema(t[`${o}Schema`],{unrepresentable:"any"})];for(;n.length>0;){let s=n.shift();s.type&&s.type!=="object"&&this.logger.warn(`Endpoint ${o} schema is not object-based`,r);for(let i of["allOf","oneOf","anyOf"])s[i]&&n.push(...s[i])}}if(t.requestType==="json"){let o=Zt(t.inputSchema,"input");o&&this.logger.warn("The final input schema of the endpoint contains an unsupported JSON payload type.",Object.assign(r,{reason:o}))}for(let o of Ne)for(let{mimeTypes:n,schema:s}of t.getResponses(o)){if(!n?.includes(C.json))continue;let i=Zt(s,"output");i&&this.logger.warn(`The final ${o} response schema of the endpoint contains an unsupported JSON payload type.`,Object.assign(r,{reason:i}))}this.#e.add(t)}}checkPathParams(t,r,o){let n=this.#t.get(r);if(n?.paths.includes(t))return;let s=at(t);if(s.length===0)return;let i=n?.flat||ze(Ur.toJSONSchema(r.inputSchema,{unrepresentable:"any",io:"input"}));for(let p of s)p in i.properties||this.logger.warn("The input schema of the endpoint is most likely missing the parameter of the path it's assigned to.",Object.assign(o,{path:t,param:p}));n?n.paths.push(t):this.#t.set(r,{flat:i,paths:[t]})}};var gt=e=>(t,...r)=>{e(t,...r),t==="get"&&e("head",...r)},Cn=e=>{let[t,r]=e.trim().split(/ (.+)/,2);return r&&me(t)?[r,t]:[e]},En=e=>e.trim().split("/").filter(Boolean).join("/"),_r=(e,t)=>Object.entries(e).map(([r,o])=>{let[n,s]=Cn(r);return[[t||""].concat(En(n)||[]).join("/"),o,s]}),kn=(e,t)=>{throw new xe("Route with explicit method can only be assigned with Endpoint",e,t)},Jr=(e,t,r)=>{if(!(!r||r.includes(e)))throw new xe(`Method ${e} is not supported by the assigned Endpoint.`,e,t)},Dt=(e,t,r)=>{let o=`${e} ${t}`;if(r.has(o))throw new xe("Route has a duplicate",e,t);r.add(o)},Le=({routing:e,onEndpoint:t,onStatic:r})=>{let o=_r(e),n=new Set;for(;o.length;){let[s,i,p]=o.shift();if(i instanceof Je)if(p)Dt(p,s,n),Jr(p,s,i.methods),t(p,s,i);else{let{methods:d=["get"]}=i;for(let c of d)Dt(c,s,n),t(c,s,i)}else if(p&&kn(p,s),i instanceof We)r&&i.apply(s,r);else if(i instanceof Ge)for(let[d,c]of i.entries){let{methods:m}=c;Dt(d,s,n),Jr(d,s,m),t(d,s,c)}else o.unshift(..._r(i,s))}};import*as Vr from"ramda";var Gr=e=>e.sort((t,r)=>+me(r)-+me(t)||t.localeCompare(r)).join(", ").toUpperCase(),vn=e=>({method:t},r,o)=>{let n=Gr(e);r.set({Allow:n});let s=In(405,`${t} is not allowed`,{headers:{Allow:n}});o(s)},An=e=>({"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":Gr(e),"Access-Control-Allow-Headers":"content-type"}),Ut=({app:e,getLogger:t,config:r,routing:o,parsers:n})=>{let s=fe()?void 0:new ht(t()),i=new Map;Le({routing:o,onEndpoint:(c,m,y)=>{fe()||(s?.checkSchema(y,{path:m,method:c}),s?.checkPathParams(m,y,{method:c}));let g=n?.[y.requestType]||[],h=Vr.pair(g,y);i.has(m)||i.set(m,new Map(r.cors?[["options",h]]:[])),i.get(m)?.set(c,h)},onStatic:e.use.bind(e)}),s=void 0;let d=new Map;for(let[c,m]of i){let y=Array.from(m.keys());y.includes("get")&&y.push("head");for(let[g,[h,w]]of m){let I=h.slice().concat(async(j,b)=>{let v=t(j);return w.execute({request:j,response:b,logger:v,config:r})});r.cors&&I.unshift(async(j,b,v)=>{let A=t(j),$=An(y),N=typeof r.cors=="function"?await r.cors({request:j,endpoint:w,logger:A,defaultHeaders:$}):$;b.set(N),v()}),e[g](c,...I)}r.wrongMethodBehavior!==404&&d.set(c,vn(y))}for(let[c,m]of d)e.all(c,m)};import Mn from"http-errors";import{setInterval as Nn}from"node:timers/promises";var Wr=e=>"_httpMessage"in e&&typeof e._httpMessage=="object"&&e._httpMessage!==null&&"headersSent"in e._httpMessage&&typeof e._httpMessage.headersSent=="boolean"&&"setHeader"in e._httpMessage&&typeof e._httpMessage.setHeader=="function",Yr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Qr=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Xr=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),eo=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var to=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,s=c=>void n.delete(c.destroy()),i=c=>void(Wr(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):s(c)),p=c=>void(o?c.destroy():n.add(c.once("close",()=>void n.delete(c))));for(let c of e)for(let m of["connection","secureConnection"])c.on(m,p);let d=async()=>{for(let c of e)c.on("request",Xr);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(Qr(c)||Yr(c))&&i(c);for await(let c of Nn(10,Date.now()))if(n.size===0||Date.now()-c>=t)break;for(let c of n)s(c);return Promise.allSettled(e.map(eo))};return{sockets:n,shutdown:()=>o??=d()}};var ro=({errorHandler:e,getLogger:t})=>async(r,o,n,s)=>r?e.execute({error:oe(r),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):s(),oo=({errorHandler:e,getLogger:t})=>async(r,o)=>{let n=Mn(404,`Can not ${r.method} ${r.path}`),s=t(r);try{await e.execute({request:r,response:o,logger:s,error:n,input:null,output:null,options:{}})}catch(i){ut({response:o,logger:s,error:new ie(oe(i),n)})}},jn=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},zn=e=>({log:e.debug.bind(e)}),no=async({getLogger:e,config:t})=>{let r=await je("express-fileupload"),{limitError:o,beforeUpload:n,...s}={...typeof t.upload=="object"&&t.upload},i=[];return i.push(async(p,d,c)=>{let m=e(p);return await n?.({request:p,logger:m}),r({debug:!0,...s,abortOnLimit:!1,parseNested:!0,logger:zn(m)})(p,d,c)}),o&&i.push(jn(o)),i},so=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},io=({logger:e,config:{childLoggerProvider:t,accessLogger:r=({method:o,path:n},s)=>s.debug(`${o}: ${n}`)}})=>async(o,n,s)=>{let i=await t?.({request:o,parent:e})||e;r?.(o,i),o.res&&(o.res.locals[Ce]={logger:i}),s()},ao=e=>t=>t?.res?.locals[Ce]?.logger||e,po=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
3
+ `).slice(1))),co=({servers:e,logger:t,options:{timeout:r,beforeExit:o,events:n=["SIGINT","SIGTERM"]}})=>{let s=to(e,{logger:t,timeout:r}),i=async()=>{await s.shutdown(),await o?.(),process.exit()};for(let p of n)process.on(p,i)};import{gray as Ln,hex as mo,italic as xt,whiteBright as $n}from"ansis";var lo=e=>{if(e.columns<132)return;let t=xt("Proudly supports transgender community.".padStart(109)),r=xt("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),o=xt("Thank you for choosing Express Zod API for your project.".padStart(132)),n=xt("for Sara".padEnd(20)),s=mo("#F5A9B8"),i=mo("#5BCEFA"),p=new Array(14).fill(i,1,3).fill(s,3,5).fill($n,5,7).fill(s,7,9).fill(i,9,12).fill(Ln,12,13),d=`
4
4
  8888888888 8888888888P 888 d8888 8888888b. 8888888
5
5
  888 d88P 888 d88888 888 Y88b 888
6
6
  888 d88P 888 d88P888 888 888 888
@@ -15,9 +15,9 @@ ${n}888${r}
15
15
  ${o}
16
16
  `;e.write(d.split(`
17
17
  `).map((c,m)=>p[m]?p[m](c):c).join(`
18
- `))};var co=e=>{e.startupLogo!==!1&&po(process.stdout);let t=e.errorHandler||Se,r=zr(e.logger)?e.logger:new Je(e.logger);r.debug("Running",{build:"v25.0.0-beta.3",env:process.env.NODE_ENV||"development"}),so(r);let o=oo({logger:r,config:e}),s={getLogger:no(r),errorHandler:t},i=eo(s),p=Xr(s);return{...s,logger:r,notFoundHandler:i,catcher:p,loggingMiddleware:o}},$n=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:s}=co(e);return qt({app:e.app.use(s),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},Mn=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,catcher:s,loggingMiddleware:i}=co(e),p=yt().disable("x-powered-by").use(i);if(e.compression){let x=await je("compression");p.use(x(typeof e.compression=="object"?e.compression:void 0))}await e.beforeRouting?.({app:p,getLogger:o});let d={json:[e.jsonParser||yt.json()],raw:[e.rawParser||yt.raw(),ro],form:[e.formParser||yt.urlencoded()],upload:e.upload?await to({config:e,getLogger:o}):[]};qt({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(s,n);let c=[],m=(x,y)=>()=>x.listen(y,()=>r.info("Listening",y)),g=[];if(e.http){let x=zn.createServer(p);c.push(x),g.push(m(x,e.http.listen))}if(e.https){let x=Ln.createServer(e.https.options,p);c.push(x),g.push(m(x,e.https.listen))}return c.length||r.warn("No servers configured."),e.gracefulShutdown&&io({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:g.map(x=>x())}};import{OpenApiBuilder as as}from"openapi3-ts/oas31";import*as Io from"ramda";import*as R from"ramda";var mo=e=>E(e)&&"or"in e,lo=e=>E(e)&&"and"in e,Ft=e=>!lo(e)&&!mo(e),uo=e=>{let t=R.filter(Ft,e),r=R.chain(R.prop("and"),R.filter(lo,e)),[o,n]=R.partition(Ft,r),s=R.concat(t,o),i=R.filter(mo,e);return R.map(R.prop("or"),R.concat(i,n)).reduce((d,c)=>le(d,R.map(m=>Ft(m)?[m]:m.and,c),([m,g])=>R.concat(m,g)),R.reject(R.isEmpty,[s]))};import{isReferenceObject as ho,isSchemaObject as gt}from"openapi3-ts/oas31";import*as l from"ramda";import{z as yo}from"zod";var fo=["a-im","accept","accept-additions","accept-ch","accept-charset","accept-datetime","accept-encoding","accept-features","accept-language","accept-signature","access-control","access-control-request-headers","access-control-request-method","alpn","alt-used","alternates","amp-cache-transform","apply-to-redirect-ref","authentication-control","authentication-info","authorization","available-dictionary","c-ext","c-man","c-opt","c-pep","c-pep-info","cache-control","cal-managed-id","caldav-timezones","capsule-protocol","cert-not-after","cert-not-before","client-cert","client-cert-chain","close","cmcd-object","cmcd-request","cmcd-session","cmcd-status","cmsd-dynamic","cmsd-static","concealed-auth-export","configuration-context","connection","content-digest","content-disposition","content-encoding","content-id","content-language","content-length","content-location","content-md5","content-range","content-script-type","content-type","cookie","cookie2","cross-origin-embedder-policy","cross-origin-embedder-policy-report-only","cross-origin-opener-policy","cross-origin-opener-policy-report-only","cross-origin-resource-policy","cta-common-access-token","dasl","date","dav","default-style","delta-base","deprecation","depth","derived-from","destination","detached-jws","differential-id","dictionary-id","digest","dpop","dpop-nonce","early-data","ediint-features","expect","expect-ct","ext","forwarded","from","getprofile","hobareg","host","http2-settings","if","if-match","if-modified-since","if-none-match","if-range","if-schedule-tag-match","if-unmodified-since","im","include-referred-token-binding-id","isolation","keep-alive","label","last-event-id","link","link-template","lock-token","man","max-forwards","memento-datetime","meter","method-check","method-check-expires","mime-version","negotiate","nel","odata-entityid","odata-isolation","odata-maxversion","odata-version","opt","ordering-type","origin","origin-agent-cluster","oscore","oslc-core-version","overwrite","p3p","pep","pep-info","permissions-policy","pics-label","ping-from","ping-to","position","pragma","prefer","preference-applied","priority","profileobject","protocol","protocol-info","protocol-query","protocol-request","proxy-authorization","proxy-features","proxy-instruction","public","public-key-pins","public-key-pins-report-only","range","redirect-ref","referer","referer-root","referrer-policy","repeatability-client-id","repeatability-first-sent","repeatability-request-id","repeatability-result","replay-nonce","reporting-endpoints","repr-digest","safe","schedule-reply","schedule-tag","sec-fetch-storage-access","sec-gpc","sec-purpose","sec-token-binding","sec-websocket-extensions","sec-websocket-key","sec-websocket-protocol","sec-websocket-version","security-scheme","setprofile","signature","signature-input","slug","soapaction","status-uri","sunset","surrogate-capability","tcn","te","timeout","topic","traceparent","tracestate","trailer","transfer-encoding","ttl","upgrade","urgency","uri","use-as-dictionary","user-agent","variant-vary","via","want-content-digest","want-digest","want-repr-digest","warning","x-content-type-options","x-frame-options"];var go=50,xo="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Bn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},bo=e=>e.replace(At,t=>`{${t.slice(1)}}`),Kn=({},e)=>{if(e.isResponse)throw new Q("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},Hn=({jsonSchema:e})=>({...e,externalDocs:{description:"raw binary data",url:"https://swagger.io/specification/#working-with-binary-data"}}),qn=({zodSchema:e,jsonSchema:t})=>{if(!oe(e,"union")||!("discriminator"in e._zod.def))return t;let r=e._zod.def.discriminator;return{...t,discriminator:t.discriminator??{propertyName:r}}},Fn=l.tryCatch(({jsonSchema:e})=>{if(!e.allOf)throw"no allOf";return ze(e,"throw")},(e,{jsonSchema:t})=>t),Dn=({jsonSchema:e})=>{if(!e.anyOf)return e;let t=e.anyOf[0];return Object.assign(t,{type:Wn(t.type)})},We=e=>e,Un=({jsonSchema:{examples:e,description:t}},r)=>{if(r.isResponse)throw new Q("Please use ez.dateOut() for output.",r);let o={description:t||"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:xo}};return e?.length&&(o.examples=e),o},_n=({jsonSchema:{examples:e,description:t}},r)=>{if(!r.isResponse)throw new Q("Please use ez.dateIn() for input.",r);let o={description:t||"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:xo}};return e?.length&&(o.examples=e),o},Jn=()=>({type:"string",format:"bigint",pattern:/^-?\d+$/.source}),Vn=({zodSchema:e,jsonSchema:t})=>e._zod.def.rest!==null?t:{...t,items:{not:{}}},Gn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Bn?.[t]},Wn=e=>e==="null"?e:typeof e=="string"?[e,"null"]:e&&[...new Set(e).add("null")],Yn=({zodSchema:e,jsonSchema:t},r)=>{let o=e._zod.def[r.isResponse?"out":"in"],n=e._zod.def[r.isResponse?"in":"out"];if(!oe(o,"transform"))return t;let s=We(_t(n,{ctx:r}));if(gt(s))if(r.isResponse){let i=at(o,Gn(s));if(i&&["number","string","boolean"].includes(i))return{...t,type:i}}else{let{type:i,...p}=s;return{...p,format:`${p.format||i} (preprocessed)`}}return t},Qn=({jsonSchema:e})=>{if(e.type!=="object")return e;let t=e;return!t.properties||!("raw"in t.properties)||!E(t.properties.raw)?e:t.properties.raw},Dt=e=>e.length?l.fromPairs(l.zip(l.times(t=>`example${t+1}`,e.length),l.map(l.objOf("value"),e))):void 0,Xn=(e,t)=>t?.includes(e)||e.startsWith("x-")||fo.includes(e),So=({path:e,method:t,request:r,inputSources:o,makeRef:n,composition:s,isHeader:i,security:p,description:d=`${t.toUpperCase()} ${e} Parameter`})=>{let c=ze(r),m=st(e),g=o.includes("query"),x=o.includes("params"),y=o.includes("headers"),v=S=>x&&m.includes(S),k=l.chain(l.filter(S=>S.type==="header"),p??[]).map(({name:S})=>S),z=S=>y&&(i?.(S,t,e)??Xn(S,k));return Object.entries(c.properties).reduce((S,[A,C])=>{if(!E(C))return S;let M=v(A)?"path":z(A)?"header":g?"query":void 0;if(!M)return S;let N=We(C),ee=s==="components"?n(C.id||JSON.stringify(C),N,ne(d,A)):N;return S.concat({name:A,in:M,deprecated:C.deprecated,required:c.required?.includes(A)||!1,description:N.description||d,schema:ee,examples:Dt(gt(N)&&N.examples?.length?N.examples:l.pluck(A,c.examples?.filter(l.both(E,l.has(A)))||[]))})},[])},Ut={nullable:Dn,union:qn,bigint:Jn,intersection:Fn,tuple:Vn,pipe:Yn,[ye]:Un,[ge]:_n,[ie]:Kn,[B]:Qn,[fe]:Hn},es=(e,t,r)=>{let o=[e,t];for(;o.length;){let n=o.shift();if(l.is(Object,n)){if(ho(n)&&!n.$ref.startsWith("#/components")){let s=n.$ref.split("/").pop(),i=t[s];i&&(n.$ref=r.makeRef(i.id||i,We(i)).$ref);continue}o.push(...l.values(n))}l.is(Array,n)&&o.push(...l.values(n))}return e},_t=(e,{ctx:t,rules:r=Ut})=>{let{$defs:o={},properties:n={}}=yo.toJSONSchema(yo.object({subject:e}),{unrepresentable:"any",io:t.isResponse?"output":"input",override:s=>{let i=W(s.zodSchema),p=r[i&&i in r?i:s.zodSchema._zod.def.type];if(p){let d={...p(s,t)};for(let c in s.jsonSchema)delete s.jsonSchema[c];Object.assign(s.jsonSchema,d)}}});return es(E(n.subject)?n.subject:{},o,t)},Ro=(e,t)=>{if(ho(e))return[e,!1];let r=!1,o=l.map(p=>{let[d,c]=Ro(p,t);return r=r||c,d}),n=l.omit(t),s={properties:n,examples:l.map(n),required:l.without(t),allOf:o,oneOf:o,anyOf:o},i=l.evolve(s,e);return[i,r||!!i.required?.length]},Oo=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:s,composition:i,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:m=`${e.toUpperCase()} ${t} ${jt(n)} response ${p?d:""}`.trim()})=>{if(!o)return{description:m};let g=We(_t(r,{rules:{...c,...Ut},ctx:{isResponse:!0,makeRef:s,path:t,method:e}})),x=[];gt(g)&&g.examples&&(x.push(...g.examples),delete g.examples);let y={schema:i==="components"?s(r,g,ne(m)):g,examples:Dt(x)};return{description:m,content:l.fromPairs(l.xprod(o,[y]))}},ts=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},rs=({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},os=({name:e})=>({type:"apiKey",in:"header",name:e}),ns=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ss=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),is=({flows:e={}})=>({type:"oauth2",flows:l.map(t=>({...t,scopes:t.scopes||{}}),l.reject(l.isNil,e))}),To=(e,t=[])=>{let r=o=>o.type==="basic"?{type:"http",scheme:"basic"}:o.type==="bearer"?ts(o):o.type==="input"?rs(o,t):o.type==="header"?os(o):o.type==="cookie"?ns(o):o.type==="openid"?ss(o):is(o);return e.map(o=>o.map(r))},Po=(e,t,r)=>e.map(o=>o.reduce((n,s)=>{let i=r(s),p=["oauth2","openIdConnect"].includes(s.type);return Object.assign(n,{[i]:p?t:[]})},{})),wo=({schema:e,brandHandling:t,makeRef:r,path:o,method:n})=>_t(e,{rules:{...t,...Ut},ctx:{isResponse:!1,makeRef:r,path:o,method:n}}),Eo=({method:e,path:t,schema:r,request:o,mimeType:n,makeRef:s,composition:i,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let[c,m]=Ro(We(o),p),g=[];gt(c)&&c.examples&&(g.push(...c.examples),delete c.examples);let x={schema:i==="components"?s(r,c,ne(d)):c,examples:Dt(g.length?g:ze(o).examples?.filter(v=>E(v)&&!Array.isArray(v)).map(l.omit(p))||[])},y={description:d,content:{[n]:x}};return(m||n===w.raw)&&(y.required=!0),y},ko=e=>Object.entries(e).reduce((t,[r,o])=>{if(!o)return t;let n={name:r,description:typeof o=="string"?o:o.description};return typeof o=="object"&&o.url&&(n.externalDocs={url:o.url}),t.concat(n)},[]),Jt=e=>e.length<=go?e:e.slice(0,go-1)+"\u2026",ht=e=>e.length?e.slice():void 0;var Vt=class extends as{#e=new Map;#t=new Map;#r=new Map;#o(t,r,o=this.#r.get(t)){return o||(o=`Schema${this.#r.size+1}`,this.#r.set(t,o)),this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}#n(t,r,o){let n=o||ne(r,t),s=this.#t.get(n);if(s===void 0)return this.#t.set(n,1),n;if(o)throw new Q(`Duplicated operationId: "${o}"`,{method:r,isResponse:!1,path:t});return s++,this.#t.set(n,s),`${n}${s}`}#s(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.#e.get(t.type)||0)+1;return this.#e.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,descriptions:i,brandHandling:p,tags:d,isHeader:c,hasSummaryFromDescription:m=!0,composition:g="inline"}){super(),this.addInfo({title:o,version:n});for(let y of typeof s=="string"?[s]:s)this.addServer({url:y});Le({routing:t,onEndpoint:(y,v,k)=>{let z={path:v,method:k,endpoint:y,composition:g,brandHandling:p,makeRef:this.#o.bind(this)},{description:S,shortDescription:A,scopes:C,inputSchema:M}=y,N=A?Jt(A):m&&S?Jt(S):void 0,ee=r.inputSources?.[k]||Ct[k],Pe=this.#n(v,k,y.getOperationId(k)),et=wo({...z,schema:M}),ce=uo(y.security),tt=So({...z,inputSources:ee,isHeader:c,security:ce,request:et,description:i?.requestParameter?.call(null,{method:k,path:v,operationId:Pe})}),rt={};for(let te of Ce){let de=y.getResponses(te);for(let{mimeTypes:nt,schema:It,statusCodes:fr}of de)for(let vt of fr)rt[vt]=Oo({...z,variant:te,schema:It,mimeTypes:nt,statusCode:vt,hasMultipleStatusCodes:de.length>1||fr.length>1,description:i?.[`${te}Response`]?.call(null,{method:k,path:v,operationId:Pe,statusCode:vt})})}let ot=ee.includes("body")?Eo({...z,request:et,paramNames:Io.pluck("name",tt),schema:M,mimeType:w[y.requestType],description:i?.requestBody?.call(null,{method:k,path:v,operationId:Pe})}):void 0,Et=Po(To(ce,ee),C,te=>{let de=this.#s(te);return this.addSecurityScheme(de,te),de}),kt={operationId:Pe,summary:N,description:S,deprecated:y.isDeprecated||void 0,tags:ht(y.tags),parameters:ht(tt),requestBody:ot,security:ht(Et),responses:rt};this.addPath(bo(v),{[k]:kt})}}),d&&(this.rootDoc.tags=ko(d))}};import{createRequest as ps,createResponse as cs}from"node-mocks-http";var ds=e=>ps({...e,headers:{"content-type":w.json,...e?.headers}}),ms=e=>cs(e),ls=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:Lr(o)?(...s)=>t[o].push(s):Reflect.get(r,o,n)}})},vo=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=ds(e),s=ms({req:n,...t});s.req=t?.req||n,n.res=s;let i=ls(o),p={cors:!1,logger:i,...r};return{requestMock:n,responseMock:s,loggerMock:i,configMock:p}},us=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:s}=vo(t);return await e.execute({request:r,response:o,config:s,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},fs=async({middleware:e,options:t={},...r})=>{let{requestMock:o,responseMock:n,loggerMock:s,configMock:{inputSources:i,errorHandler:p=Se}}=vo(r),d=it(o,i),c={request:o,response:n,logger:s,input:d,options:t};try{let m=await e.execute(c);return{requestMock:o,responseMock:n,loggerMock:s,output:m}}catch(m){return await p.execute({...c,error:re(m),output:null}),{requestMock:o,responseMock:n,loggerMock:s,output:{}}}};import*as zo from"ramda";import wt from"typescript";import{z as Bs}from"zod";import*as No from"ramda";import G from"typescript";import*as _ from"ramda";import u from"typescript";var a=u.factory,xt=[a.createModifier(u.SyntaxKind.ExportKeyword)],ys=[a.createModifier(u.SyntaxKind.AsyncKeyword)],Ye={public:[a.createModifier(u.SyntaxKind.PublicKeyword)],protectedReadonly:[a.createModifier(u.SyntaxKind.ProtectedKeyword),a.createModifier(u.SyntaxKind.ReadonlyKeyword)]},Gt=(e,t)=>u.addSyntheticLeadingComment(e,u.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),Wt=(e,t)=>{let r=u.createSourceFile("print.ts","",u.ScriptTarget.Latest,!1,u.ScriptKind.TS);return u.createPrinter(t).printNode(u.EmitHint.Unspecified,e,r)},gs=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Yt=e=>typeof e=="string"&&gs.test(e)?a.createIdentifier(e):P(e),bt=(e,...t)=>a.createTemplateExpression(a.createTemplateHead(e),t.map(([r,o=""],n)=>a.createTemplateSpan(r,n===t.length-1?a.createTemplateTail(o):a.createTemplateMiddle(o)))),St=(e,{type:t,mod:r,init:o,optional:n}={})=>a.createParameterDeclaration(r,void 0,e,n?a.createToken(u.SyntaxKind.QuestionToken):void 0,t?f(t):void 0,o),$e=e=>Object.entries(e).map(([t,r])=>St(t,typeof r=="string"||typeof r=="number"||typeof r=="object"&&"kind"in r?{type:r}:r)),Qt=(e,t=[])=>a.createConstructorDeclaration(Ye.public,e,a.createBlock(t)),f=(e,t)=>typeof e=="number"?a.createKeywordTypeNode(e):typeof e=="string"||u.isIdentifier(e)?a.createTypeReferenceNode(e,t&&_.map(f,t)):e,Xt=f("Record",[u.SyntaxKind.StringKeyword,u.SyntaxKind.AnyKeyword]),J=e=>{let t=new Map;for(let r of e)t.set(xs(r)?r.kind:r,r);return a.createUnionTypeNode(Array.from(t.values()))},Oe=(e,t,{isOptional:r,isDeprecated:o,comment:n}={})=>{let s=f(t),i=a.createPropertySignature(void 0,Yt(e),r?a.createToken(u.SyntaxKind.QuestionToken):void 0,r?J([s,f(u.SyntaxKind.UndefinedKeyword)]):s),p=_.reject(_.isNil,[o?"@deprecated":void 0,n]);return p.length?Gt(i,p.join(" ")):i},er=e=>u.setEmitFlags(e,u.EmitFlags.SingleLine),tr=(...e)=>a.createArrayBindingPattern(e.map(t=>a.createBindingElement(void 0,void 0,t))),j=(e,t,{type:r,expose:o}={})=>a.createVariableStatement(o&&xt,a.createVariableDeclarationList([a.createVariableDeclaration(e,void 0,r?f(r):void 0,t)],u.NodeFlags.Const)),rr=(e,t)=>V(e,J(_.map($,t)),{expose:!0}),V=(e,t,{expose:r,comment:o,params:n}={})=>{let s=a.createTypeAliasDeclaration(r?xt:void 0,e,n&&ir(n),t);return o?Gt(s,o):s},Ao=(e,t)=>a.createPropertyDeclaration(Ye.public,e,void 0,f(t),void 0),or=(e,t,r,{typeParams:o,returns:n}={})=>a.createMethodDeclaration(Ye.public,void 0,e,void 0,o&&ir(o),t,n,a.createBlock(r)),nr=(e,t,{typeParams:r}={})=>a.createClassDeclaration(xt,e,r&&ir(r),void 0,t),sr=e=>a.createTypeOperatorNode(u.SyntaxKind.KeyOfKeyword,f(e)),Rt=e=>f(Promise.name,[e]),Ot=(e,t,{expose:r,comment:o}={})=>{let n=a.createInterfaceDeclaration(r?xt:void 0,e,void 0,void 0,t);return o?Gt(n,o):n},ir=e=>(Array.isArray(e)?e.map(t=>_.pair(t,void 0)):Object.entries(e)).map(([t,r])=>{let{type:o,init:n}=typeof r=="object"&&"init"in r?r:{type:r};return a.createTypeParameterDeclaration([],t,o?f(o):void 0,n?f(n):void 0)}),Te=(e,t,{isAsync:r}={})=>a.createArrowFunction(r?ys:void 0,void 0,Array.isArray(e)?_.map(St,e):$e(e),void 0,void 0,t),O=e=>e,Qe=(e,t,r)=>a.createConditionalExpression(e,a.createToken(u.SyntaxKind.QuestionToken),t,a.createToken(u.SyntaxKind.ColonToken),r),T=(e,...t)=>(...r)=>a.createCallExpression(t.reduce((o,n)=>typeof n=="string"||u.isIdentifier(n)?a.createPropertyAccessExpression(o,n):a.createElementAccessExpression(o,n),typeof e=="string"?a.createIdentifier(e):e),void 0,r),Me=(e,...t)=>a.createNewExpression(a.createIdentifier(e),void 0,t),Tt=(e,t)=>f("Extract",[e,t]),ar=(e,t)=>a.createExpressionStatement(a.createBinaryExpression(e,a.createToken(u.SyntaxKind.EqualsToken),t)),H=(e,t)=>a.createIndexedAccessTypeNode(f(e),f(t)),Co=e=>J([f(e),Rt(e)]),pr=(e,t)=>a.createFunctionTypeNode(void 0,$e(e),f(t)),P=e=>typeof e=="number"?a.createNumericLiteral(e):typeof e=="bigint"?a.createBigIntLiteral(e.toString()):typeof e=="boolean"?e?a.createTrue():a.createFalse():e===null?a.createNull():a.createStringLiteral(e),$=e=>a.createLiteralTypeNode(P(e)),hs=[u.SyntaxKind.AnyKeyword,u.SyntaxKind.BigIntKeyword,u.SyntaxKind.BooleanKeyword,u.SyntaxKind.NeverKeyword,u.SyntaxKind.NumberKeyword,u.SyntaxKind.ObjectKeyword,u.SyntaxKind.StringKeyword,u.SyntaxKind.SymbolKeyword,u.SyntaxKind.UndefinedKeyword,u.SyntaxKind.UnknownKeyword,u.SyntaxKind.VoidKeyword],xs=e=>hs.includes(e.kind);var Pt=class{constructor(t){this.serverUrl=t}paths=new Set;tags=new Map;registry=new Map;#e={pathType:a.createIdentifier("Path"),implementationType:a.createIdentifier("Implementation"),keyParameter:a.createIdentifier("key"),pathParameter:a.createIdentifier("path"),paramsArgument:a.createIdentifier("params"),ctxArgument:a.createIdentifier("ctx"),methodParameter:a.createIdentifier("method"),requestParameter:a.createIdentifier("request"),eventParameter:a.createIdentifier("event"),dataParameter:a.createIdentifier("data"),handlerParameter:a.createIdentifier("handler"),msgParameter:a.createIdentifier("msg"),parseRequestFn:a.createIdentifier("parseRequest"),substituteFn:a.createIdentifier("substitute"),provideMethod:a.createIdentifier("provide"),onMethod:a.createIdentifier("on"),implementationArgument:a.createIdentifier("implementation"),hasBodyConst:a.createIdentifier("hasBody"),undefinedValue:a.createIdentifier("undefined"),responseConst:a.createIdentifier("response"),restConst:a.createIdentifier("rest"),searchParamsConst:a.createIdentifier("searchParams"),defaultImplementationConst:a.createIdentifier("defaultImplementation"),clientConst:a.createIdentifier("client"),contentTypeConst:a.createIdentifier("contentType"),isJsonConst:a.createIdentifier("isJSON"),sourceProp:a.createIdentifier("source")};interfaces={input:a.createIdentifier("Input"),positive:a.createIdentifier("PositiveResponse"),negative:a.createIdentifier("NegativeResponse"),encoded:a.createIdentifier("EncodedResponse"),response:a.createIdentifier("Response")};methodType=rr("Method",Kt);someOfType=V("SomeOf",H("T",sr("T")),{params:["T"]});requestType=V("Request",sr(this.interfaces.input),{expose:!0});someOf=({name:t})=>f(this.someOfType.name,[t]);makePathType=()=>rr(this.#e.pathType,Array.from(this.paths));makePublicInterfaces=()=>Object.keys(this.interfaces).map(t=>Ot(this.interfaces[t],Array.from(this.registry).map(([r,{store:o,isDeprecated:n}])=>Oe(r,o[t],{isDeprecated:n})),{expose:!0}));makeEndpointTags=()=>j("endpointTags",a.createObjectLiteralExpression(Array.from(this.tags).map(([t,r])=>a.createPropertyAssignment(Yt(t),a.createArrayLiteralExpression(No.map(P,r))))),{expose:!0});makeImplementationType=()=>V(this.#e.implementationType,pr({[this.#e.methodParameter.text]:this.methodType.name,[this.#e.pathParameter.text]:G.SyntaxKind.StringKeyword,[this.#e.paramsArgument.text]:Xt,[this.#e.ctxArgument.text]:{optional:!0,type:"T"}},Rt(G.SyntaxKind.AnyKeyword)),{expose:!0,params:{T:{init:G.SyntaxKind.UnknownKeyword}}});makeParseRequestFn=()=>j(this.#e.parseRequestFn,Te({[this.#e.requestParameter.text]:G.SyntaxKind.StringKeyword},a.createAsExpression(T(this.#e.requestParameter,O("split"))(a.createRegularExpressionLiteral("/ (.+)/"),P(2)),a.createTupleTypeNode([f(this.methodType.name),f(this.#e.pathType)]))));makeSubstituteFn=()=>j(this.#e.substituteFn,Te({[this.#e.pathParameter.text]:G.SyntaxKind.StringKeyword,[this.#e.paramsArgument.text]:Xt},a.createBlock([j(this.#e.restConst,a.createObjectLiteralExpression([a.createSpreadAssignment(this.#e.paramsArgument)])),a.createForInStatement(a.createVariableDeclarationList([a.createVariableDeclaration(this.#e.keyParameter)],G.NodeFlags.Const),this.#e.paramsArgument,a.createBlock([ar(this.#e.pathParameter,T(this.#e.pathParameter,O("replace"))(bt(":",[this.#e.keyParameter]),Te([],a.createBlock([a.createExpressionStatement(a.createDeleteExpression(a.createElementAccessExpression(this.#e.restConst,this.#e.keyParameter))),a.createReturnStatement(a.createElementAccessExpression(this.#e.paramsArgument,this.#e.keyParameter))]))))])),a.createReturnStatement(a.createAsExpression(a.createArrayLiteralExpression([this.#e.pathParameter,this.#e.restConst]),f("const")))])));#t=()=>or(this.#e.provideMethod,$e({[this.#e.requestParameter.text]:"K",[this.#e.paramsArgument.text]:H(this.interfaces.input,"K"),[this.#e.ctxArgument.text]:{optional:!0,type:"T"}}),[j(tr(this.#e.methodParameter,this.#e.pathParameter),T(this.#e.parseRequestFn)(this.#e.requestParameter)),a.createReturnStatement(T(a.createThis(),this.#e.implementationArgument)(this.#e.methodParameter,a.createSpreadElement(T(this.#e.substituteFn)(this.#e.pathParameter,this.#e.paramsArgument)),this.#e.ctxArgument))],{typeParams:{K:this.requestType.name},returns:Rt(H(this.interfaces.response,"K"))});makeClientClass=t=>nr(t,[Qt([St(this.#e.implementationArgument,{type:f(this.#e.implementationType,["T"]),mod:Ye.protectedReadonly,init:this.#e.defaultImplementationConst})]),this.#t()],{typeParams:["T"]});#r=t=>bt("?",[Me(URLSearchParams.name,t)]);#o=()=>Me(URL.name,bt("",[this.#e.pathParameter],[this.#e.searchParamsConst]),P(this.serverUrl));makeDefaultImplementation=()=>{let t=a.createPropertyAssignment(O("method"),T(this.#e.methodParameter,O("toUpperCase"))()),r=a.createPropertyAssignment(O("headers"),Qe(this.#e.hasBodyConst,a.createObjectLiteralExpression([a.createPropertyAssignment(P("Content-Type"),P(w.json))]),this.#e.undefinedValue)),o=a.createPropertyAssignment(O("body"),Qe(this.#e.hasBodyConst,T(JSON[Symbol.toStringTag],O("stringify"))(this.#e.paramsArgument),this.#e.undefinedValue)),n=j(this.#e.responseConst,a.createAwaitExpression(T(fetch.name)(this.#o(),a.createObjectLiteralExpression([t,r,o])))),s=j(this.#e.hasBodyConst,a.createLogicalNot(T(a.createArrayLiteralExpression([P("get"),P("delete")]),O("includes"))(this.#e.methodParameter))),i=j(this.#e.searchParamsConst,Qe(this.#e.hasBodyConst,P(""),this.#r(this.#e.paramsArgument))),p=j(this.#e.contentTypeConst,T(this.#e.responseConst,O("headers"),O("get"))(P("content-type"))),d=a.createIfStatement(a.createPrefixUnaryExpression(G.SyntaxKind.ExclamationToken,this.#e.contentTypeConst),a.createReturnStatement()),c=j(this.#e.isJsonConst,T(this.#e.contentTypeConst,O("startsWith"))(P(w.json))),m=a.createReturnStatement(T(this.#e.responseConst,Qe(this.#e.isJsonConst,P(O("json")),P(O("text"))))());return j(this.#e.defaultImplementationConst,Te([this.#e.methodParameter,this.#e.pathParameter,this.#e.paramsArgument],a.createBlock([s,i,n,p,d,c,m]),{isAsync:!0}),{type:this.#e.implementationType})};#n=()=>Qt($e({request:"K",params:H(this.interfaces.input,"K")}),[j(tr(this.#e.pathParameter,this.#e.restConst),T(this.#e.substituteFn)(a.createElementAccessExpression(T(this.#e.parseRequestFn)(this.#e.requestParameter),P(1)),this.#e.paramsArgument)),j(this.#e.searchParamsConst,this.#r(this.#e.restConst)),ar(a.createPropertyAccessExpression(a.createThis(),this.#e.sourceProp),Me("EventSource",this.#o()))]);#s=t=>a.createTypeLiteralNode([Oe(O("event"),t)]);#i=()=>or(this.#e.onMethod,$e({[this.#e.eventParameter.text]:"E",[this.#e.handlerParameter.text]:pr({[this.#e.dataParameter.text]:H(Tt("R",er(this.#s("E"))),$(O("data")))},Co(G.SyntaxKind.VoidKeyword))}),[a.createExpressionStatement(T(a.createThis(),this.#e.sourceProp,O("addEventListener"))(this.#e.eventParameter,Te([this.#e.msgParameter],T(this.#e.handlerParameter)(T(JSON[Symbol.toStringTag],O("parse"))(a.createPropertyAccessExpression(a.createParenthesizedExpression(a.createAsExpression(this.#e.msgParameter,f(MessageEvent.name))),O("data"))))))),a.createReturnStatement(a.createThis())],{typeParams:{E:H("R",$(O("event")))}});makeSubscriptionClass=t=>nr(t,[Ao(this.#e.sourceProp,"EventSource"),this.#n(),this.#i()],{typeParams:{K:Tt(this.requestType.name,a.createTemplateLiteralType(a.createTemplateHead("get "),[a.createTemplateLiteralTypeSpan(f(G.SyntaxKind.StringKeyword),a.createTemplateTail(""))])),R:Tt(H(this.interfaces.positive,"K"),er(this.#s(G.SyntaxKind.StringKeyword)))}});makeUsageStatements=(t,r)=>[j(this.#e.clientConst,Me(t)),T(this.#e.clientConst,this.#e.provideMethod)(P("get /v1/user/retrieve"),a.createObjectLiteralExpression([a.createPropertyAssignment("id",P("10"))])),T(Me(r,P("get /v1/events/stream"),a.createObjectLiteralExpression()),this.#e.onMethod)(P("time"),Te(["time"],a.createBlock([])))]};import*as I from"ramda";import h from"typescript";import{globalRegistry as bs}from"zod";var cr=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let s=W(e),i=s&&s in r?r[s]:r[e._zod.def.type],d=i?i(e,{...n,next:m=>cr(m,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),c=t&&t(e,{prev:d,...n});return c?{...d,...c}:d};var{factory:F}=h,Ss={[h.SyntaxKind.AnyKeyword]:"",[h.SyntaxKind.BigIntKeyword]:BigInt(0),[h.SyntaxKind.BooleanKeyword]:!1,[h.SyntaxKind.NumberKeyword]:0,[h.SyntaxKind.ObjectKeyword]:{},[h.SyntaxKind.StringKeyword]:"",[h.SyntaxKind.UndefinedKeyword]:void 0},dr={name:I.path(["name","text"]),type:I.path(["type"]),optional:I.path(["questionToken"])},Rs=({_zod:{def:e}})=>{let t=e.values.map(r=>r===void 0?f(h.SyntaxKind.UndefinedKeyword):$(r));return t.length===1?t[0]:J(t)},Os=({_zod:{def:e}},{next:t})=>{let r=[...e.parts],o=()=>{let i="";for(;r.length;){let p=r.shift();if(oe(p)){r.unshift(p);break}i+=p??""}return i},n=F.createTemplateHead(o()),s=[];for(;r.length;){let i=t(r.shift()),p=o(),d=r.length?F.createTemplateMiddle:F.createTemplateTail;s.push(F.createTemplateLiteralTypeSpan(i,d(p)))}return s.length?F.createTemplateLiteralType(n,s):$(n.text)},Ts=(e,{isResponse:t,next:r,makeAlias:o})=>{let n=()=>{let s=Object.entries(e._zod.def.shape).map(([i,p])=>{let{description:d,deprecated:c}=bs.get(p)||{};return Oe(i,r(p),{comment:d,isDeprecated:c,isOptional:(t?p._zod.optout:p._zod.optin)==="optional"})});return F.createTypeLiteralNode(s)};return Pr(e,{io:t?"output":"input"})?o(e,n):n()},Ps=({_zod:{def:e}},{next:t})=>F.createArrayTypeNode(t(e.element)),ws=({_zod:{def:e}})=>J(Object.values(e.entries).map($)),Es=({_zod:{def:e}},{next:t})=>J(e.options.map(t)),ks=e=>Ss?.[e.kind],Is=({_zod:{def:e}},{next:t})=>J([t(e.innerType),$(null)]),vs=({_zod:{def:e}},{next:t})=>F.createTupleTypeNode(e.items.map(t).concat(e.rest===null?[]:F.createRestTypeNode(t(e.rest)))),As=({_zod:{def:e}},{next:t})=>f("Record",[e.keyType,e.valueType].map(t)),Cs=I.tryCatch(e=>{if(!e.every(h.isTypeLiteralNode))throw new Error("Not objects");let t=I.chain(I.prop("members"),e),r=I.uniqWith((...o)=>{if(!I.eqBy(dr.name,...o))return!1;if(I.both(I.eqBy(dr.type),I.eqBy(dr.optional))(...o))return!0;throw new Error("Has conflicting prop")},t);return F.createTypeLiteralNode(r)},(e,t)=>F.createIntersectionTypeNode(t)),Ns=({_zod:{def:e}},{next:t})=>Cs([e.left,e.right].map(t)),q=e=>()=>f(e),Xe=({_zod:{def:e}},{next:t})=>t(e.innerType),jo=e=>f(e?h.SyntaxKind.UnknownKeyword:h.SyntaxKind.AnyKeyword),js=({_zod:{def:e}},{next:t,isResponse:r})=>{let o=e[r?"out":"in"],n=e[r?"in":"out"];if(!oe(o,"transform"))return t(o);let s=t(n),i=at(o,ks(s)),p={number:h.SyntaxKind.NumberKeyword,bigint:h.SyntaxKind.BigIntKeyword,boolean:h.SyntaxKind.BooleanKeyword,string:h.SyntaxKind.StringKeyword,undefined:h.SyntaxKind.UndefinedKeyword,object:h.SyntaxKind.ObjectKeyword};return f(i&&p[i]||jo(r))},zs=()=>$(null),Ls=({_zod:{def:e}},{makeAlias:t,next:r})=>t(e.getter,()=>r(e.getter())),$s=()=>f("Buffer"),Ms=(e,{next:t})=>t(e._zod.def.shape.raw),Zs={string:q(h.SyntaxKind.StringKeyword),number:q(h.SyntaxKind.NumberKeyword),bigint:q(h.SyntaxKind.BigIntKeyword),boolean:q(h.SyntaxKind.BooleanKeyword),any:q(h.SyntaxKind.AnyKeyword),undefined:q(h.SyntaxKind.UndefinedKeyword),[ye]:q(h.SyntaxKind.StringKeyword),[ge]:q(h.SyntaxKind.StringKeyword),never:q(h.SyntaxKind.NeverKeyword),void:q(h.SyntaxKind.UndefinedKeyword),unknown:q(h.SyntaxKind.UnknownKeyword),null:zs,array:Ps,tuple:vs,record:As,object:Ts,literal:Rs,template_literal:Os,intersection:Ns,union:Es,default:Xe,enum:ws,optional:Xe,nonoptional:Xe,nullable:Is,catch:Xe,pipe:js,lazy:Ls,readonly:Xe,[fe]:$s,[B]:Ms},mr=(e,{brandHandling:t,ctx:r})=>cr(e,{rules:{...t,...Zs},onMissing:({},{isResponse:o})=>jo(o),ctx:r});var lr=class extends Pt{#e=[this.someOfType];#t=new Map;#r=[];#o(t,r){let o=this.#t.get(t)?.name?.text;if(!o){o=`Type${this.#t.size+1}`;let n=$(null);this.#t.set(t,V(o,n)),this.#t.set(t,V(o,r()))}return f(o)}constructor({routing:t,brandHandling:r,variant:o="client",clientClassName:n="Client",subscriptionClassName:s="Subscription",serverUrl:i="https://example.com",noContent:p=Bs.undefined()}){super(i);let d={makeAlias:this.#o.bind(this)},c={brandHandling:r,ctx:{...d,isResponse:!1}},m={brandHandling:r,ctx:{...d,isResponse:!0}};Le({routing:t,onEndpoint:(x,y,v)=>{let k=ne.bind(null,v,y),{isDeprecated:z,inputSchema:S,tags:A}=x,C=`${v} ${y}`,M=V(k("input"),mr(S,c),{comment:C});this.#e.push(M);let N=Ce.reduce((et,ce)=>{let tt=x.getResponses(ce),rt=zo.chain(([Et,{schema:kt,mimeTypes:te,statusCodes:de}])=>{let nt=V(k(ce,"variant",`${Et+1}`),mr(te?kt:p,m),{comment:C});return this.#e.push(nt),de.map(It=>Oe(It,nt.name))},Array.from(tt.entries())),ot=Ot(k(ce,"response","variants"),rt,{comment:C});return this.#e.push(ot),Object.assign(et,{[ce]:ot})},{});this.paths.add(y);let ee=$(C),Pe={input:f(M.name),positive:this.someOf(N.positive),negative:this.someOf(N.negative),response:J([H(this.interfaces.positive,ee),H(this.interfaces.negative,ee)]),encoded:a.createIntersectionTypeNode([f(N.positive.name),f(N.negative.name)])};this.registry.set(C,{isDeprecated:z,store:Pe}),this.tags.set(C,A)}}),this.#e.unshift(...this.#t.values()),this.#e.push(this.makePathType(),this.methodType,...this.makePublicInterfaces(),this.requestType),o!=="types"&&(this.#e.push(this.makeEndpointTags(),this.makeParseRequestFn(),this.makeSubstituteFn(),this.makeImplementationType(),this.makeDefaultImplementation(),this.makeClientClass(n),this.makeSubscriptionClass(s)),this.#r.push(...this.makeUsageStatements(n,s)))}#n(t){return this.#r.length?this.#r.map(r=>typeof r=="string"?r:Wt(r,t)).join(`
19
- `):void 0}print(t){let r=this.#n(t),o=r&&wt.addSyntheticLeadingComment(wt.addSyntheticLeadingComment(a.createEmptyStatement(),wt.SyntaxKind.SingleLineCommentTrivia," Usage example:"),wt.SyntaxKind.MultiLineCommentTrivia,`
20
- ${r}`);return this.#e.concat(o||[]).map((n,s)=>Wt(n,s<this.#e.length?t:{...t,omitTrailingSemicolon:!0})).join(`
18
+ `))};var uo=e=>{e.startupLogo!==!1&&lo(process.stdout);let t=e.errorHandler||Re,r=Zr(e.logger)?e.logger:new Ve(e.logger);r.debug("Running",{build:"v25.0.0-beta.4",env:process.env.NODE_ENV||"development"}),po(r);let o=io({logger:r,config:e}),s={getLogger:ao(r),errorHandler:t},i=oo(s),p=ro(s);return{...s,logger:r,notFoundHandler:i,catcher:p,loggingMiddleware:o}},Hn=(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,loggingMiddleware:s}=uo(e);return Ut({app:e.app.use(s),routing:t,getLogger:o,config:e}),{notFoundHandler:n,logger:r}},Kn=async(e,t)=>{let{logger:r,getLogger:o,notFoundHandler:n,catcher:s,loggingMiddleware:i}=uo(e),p=St().disable("x-powered-by").use(i);if(e.compression){let g=await je("compression");p.use(g(typeof e.compression=="object"?e.compression:void 0))}await e.beforeRouting?.({app:p,getLogger:o});let d={json:[e.jsonParser||St.json()],raw:[e.rawParser||St.raw(),so],form:[e.formParser||St.urlencoded()],upload:e.upload?await no({config:e,getLogger:o}):[]};Ut({app:p,routing:t,getLogger:o,config:e,parsers:d}),p.use(s,n);let c=[],m=(g,h)=>()=>g.listen(h,()=>r.info("Listening",h)),y=[];if(e.http){let g=Zn.createServer(p);c.push(g),y.push(m(g,e.http.listen))}if(e.https){let g=Bn.createServer(e.https.options,p);c.push(g),y.push(m(g,e.https.listen))}return c.length||r.warn("No servers configured."),e.gracefulShutdown&&co({logger:r,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,servers:y.map(g=>g())}};import{OpenApiBuilder as ms}from"openapi3-ts/oas31";import*as Ao from"ramda";import*as R from"ramda";var fo=e=>E(e)&&"or"in e,yo=e=>E(e)&&"and"in e,_t=e=>!yo(e)&&!fo(e),ho=e=>{let t=R.filter(_t,e),r=R.chain(R.prop("and"),R.filter(yo,e)),[o,n]=R.partition(_t,r),s=R.concat(t,o),i=R.filter(fo,e);return R.map(R.prop("or"),R.concat(i,n)).reduce((d,c)=>ue(d,R.map(m=>_t(m)?[m]:m.and,c),([m,y])=>R.concat(m,y)),R.reject(R.isEmpty,[s]))};import{isReferenceObject as bo,isSchemaObject as bt}from"openapi3-ts/oas31";import*as l from"ramda";import{z as xo}from"zod";var go=["a-im","accept","accept-additions","accept-ch","accept-charset","accept-datetime","accept-encoding","accept-features","accept-language","accept-signature","access-control","access-control-request-headers","access-control-request-method","alpn","alt-used","alternates","amp-cache-transform","apply-to-redirect-ref","authentication-control","authentication-info","authorization","available-dictionary","c-ext","c-man","c-opt","c-pep","c-pep-info","cache-control","cal-managed-id","caldav-timezones","capsule-protocol","cert-not-after","cert-not-before","client-cert","client-cert-chain","close","cmcd-object","cmcd-request","cmcd-session","cmcd-status","cmsd-dynamic","cmsd-static","concealed-auth-export","configuration-context","connection","content-digest","content-disposition","content-encoding","content-id","content-language","content-length","content-location","content-md5","content-range","content-script-type","content-type","cookie","cookie2","cross-origin-embedder-policy","cross-origin-embedder-policy-report-only","cross-origin-opener-policy","cross-origin-opener-policy-report-only","cross-origin-resource-policy","cta-common-access-token","dasl","date","dav","default-style","delta-base","deprecation","depth","derived-from","destination","detached-jws","differential-id","dictionary-id","digest","dpop","dpop-nonce","early-data","ediint-features","expect","expect-ct","ext","forwarded","from","getprofile","hobareg","host","http2-settings","if","if-match","if-modified-since","if-none-match","if-range","if-schedule-tag-match","if-unmodified-since","im","include-referred-token-binding-id","isolation","keep-alive","label","last-event-id","link","link-template","lock-token","man","max-forwards","memento-datetime","meter","method-check","method-check-expires","mime-version","negotiate","nel","odata-entityid","odata-isolation","odata-maxversion","odata-version","opt","ordering-type","origin","origin-agent-cluster","oscore","oslc-core-version","overwrite","p3p","pep","pep-info","permissions-policy","pics-label","ping-from","ping-to","position","pragma","prefer","preference-applied","priority","profileobject","protocol","protocol-info","protocol-query","protocol-request","proxy-authorization","proxy-features","proxy-instruction","public","public-key-pins","public-key-pins-report-only","range","redirect-ref","referer","referer-root","referrer-policy","repeatability-client-id","repeatability-first-sent","repeatability-request-id","repeatability-result","replay-nonce","reporting-endpoints","repr-digest","safe","schedule-reply","schedule-tag","sec-fetch-storage-access","sec-gpc","sec-purpose","sec-token-binding","sec-websocket-extensions","sec-websocket-key","sec-websocket-protocol","sec-websocket-version","security-scheme","setprofile","signature","signature-input","slug","soapaction","status-uri","sunset","surrogate-capability","tcn","te","timeout","topic","traceparent","tracestate","trailer","transfer-encoding","ttl","upgrade","urgency","uri","use-as-dictionary","user-agent","variant-vary","via","want-content-digest","want-digest","want-repr-digest","warning","x-content-type-options","x-frame-options"];var So=50,Ro="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Fn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Oo=e=>e.replace(jt,t=>`{${t.slice(1)}}`),Dn=({},e)=>{if(e.isResponse)throw new Q("Please use ez.upload() only for input.",e);return{type:"string",format:"binary"}},Un=({jsonSchema:e})=>({...e,externalDocs:{description:"raw binary data",url:"https://swagger.io/specification/#working-with-binary-data"}}),_n=({zodSchema:e,jsonSchema:t})=>{if(!ne(e,"union")||!("discriminator"in e._zod.def))return t;let r=e._zod.def.discriminator;return{...t,discriminator:t.discriminator??{propertyName:r}}},Jn=l.tryCatch(({jsonSchema:e})=>{if(!e.allOf)throw"no allOf";return ze(e,"throw")},(e,{jsonSchema:t})=>t),Vn=({jsonSchema:e})=>{if(!e.anyOf)return e;let t=e.anyOf[0];return Object.assign(t,{type:es(t.type)})},Ye=e=>e,Gn=({jsonSchema:{examples:e,description:t}},r)=>{if(r.isResponse)throw new Q("Please use ez.dateOut() for output.",r);let o={description:t||"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:Ro}};return e?.length&&(o.examples=e),o},Wn=({jsonSchema:{examples:e,description:t}},r)=>{if(!r.isResponse)throw new Q("Please use ez.dateIn() for input.",r);let o={description:t||"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Ro}};return e?.length&&(o.examples=e),o},Yn=()=>({type:"string",format:"bigint",pattern:/^-?\d+$/.source}),Qn=({zodSchema:e,jsonSchema:t})=>e._zod.def.rest!==null?t:{...t,items:{not:{}}},Xn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Fn?.[t]},es=e=>e==="null"?e:typeof e=="string"?[e,"null"]:e&&[...new Set(e).add("null")],ts=({zodSchema:e,jsonSchema:t},r)=>{let o=e._zod.def[r.isResponse?"out":"in"],n=e._zod.def[r.isResponse?"in":"out"];if(!ne(o,"transform"))return t;let s=Ye(Gt(n,{ctx:r}));if(bt(s))if(r.isResponse){let i=ct(o,Xn(s));if(i&&["number","string","boolean"].includes(i))return{...t,type:i}}else{let{type:i,...p}=s;return{...p,format:`${p.format||i} (preprocessed)`}}return t},rs=({jsonSchema:e})=>{if(e.type!=="object")return e;let t=e;return!t.properties||!("raw"in t.properties)||!E(t.properties.raw)?e:t.properties.raw},Jt=e=>e.length?l.fromPairs(l.zip(l.times(t=>`example${t+1}`,e.length),l.map(l.objOf("value"),e))):void 0,os=(e,t)=>t?.includes(e)||e.startsWith("x-")||go.includes(e),To=({path:e,method:t,request:r,inputSources:o,makeRef:n,composition:s,isHeader:i,security:p,description:d=`${t.toUpperCase()} ${e} Parameter`})=>{let c=ze(r),m=at(e),y=o.includes("query"),g=o.includes("params"),h=o.includes("headers"),w=b=>g&&m.includes(b),I=l.chain(l.filter(b=>b.type==="header"),p??[]).map(({name:b})=>b),j=b=>h&&(i?.(b,t,e)??os(b,I));return Object.entries(c.properties).reduce((b,[v,A])=>{if(!E(A))return b;let $=w(v)?"path":j(v)?"header":y?"query":void 0;if(!$)return b;let N=Ye(A),ee=s==="components"?n(A.id||JSON.stringify(A),N,se(d,v)):N;return b.concat({name:v,in:$,deprecated:A.deprecated,required:c.required?.includes(v)||!1,description:N.description||d,schema:ee,examples:Jt(bt(N)&&N.examples?.length?N.examples:l.pluck(v,c.examples?.filter(l.both(E,l.has(v)))||[]))})},[])},Vt={nullable:Vn,union:_n,bigint:Yn,intersection:Jn,tuple:Qn,pipe:ts,[he]:Gn,[ge]:Wn,[ae]:Dn,[B]:rs,[ye]:Un},ns=(e,t,r)=>{let o=[e,t];for(;o.length;){let n=o.shift();if(l.is(Object,n)){if(bo(n)&&!n.$ref.startsWith("#/components")){let s=n.$ref.split("/").pop(),i=t[s];i&&(n.$ref=r.makeRef(i.id||i,Ye(i)).$ref);continue}o.push(...l.values(n))}l.is(Array,n)&&o.push(...l.values(n))}return e},Gt=(e,{ctx:t,rules:r=Vt})=>{let{$defs:o={},properties:n={}}=xo.toJSONSchema(xo.object({subject:e}),{unrepresentable:"any",io:t.isResponse?"output":"input",override:s=>{let i=W(s.zodSchema),p=r[i&&i in r?i:s.zodSchema._zod.def.type];if(p){let d={...p(s,t)};for(let c in s.jsonSchema)delete s.jsonSchema[c];Object.assign(s.jsonSchema,d)}}});return ns(E(n.subject)?n.subject:{},o,t)},Po=(e,t)=>{if(bo(e))return[e,!1];let r=!1,o=l.map(p=>{let[d,c]=Po(p,t);return r=r||c,d}),n=l.omit(t),s={properties:n,examples:l.map(n),required:l.without(t),allOf:o,oneOf:o,anyOf:o},i=l.evolve(s,e);return[i,r||!!i.required?.length]},wo=({method:e,path:t,schema:r,mimeTypes:o,variant:n,makeRef:s,composition:i,hasMultipleStatusCodes:p,statusCode:d,brandHandling:c,description:m=`${e.toUpperCase()} ${t} ${$t(n)} response ${p?d:""}`.trim()})=>{if(!o||!dt(e,n))return{description:m};let y=Ye(Gt(r,{rules:{...c,...Vt},ctx:{isResponse:!0,makeRef:s,path:t,method:e}})),g=[];bt(y)&&y.examples&&(g.push(...y.examples),delete y.examples);let h={schema:i==="components"?s(r,y,se(m)):y,examples:Jt(g)};return{description:m,content:l.fromPairs(l.xprod(o,[h]))}},ss=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},is=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},as=({name:e})=>({type:"apiKey",in:"header",name:e}),ps=({name:e})=>({type:"apiKey",in:"cookie",name:e}),cs=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),ds=({flows:e={}})=>({type:"oauth2",flows:l.map(t=>({...t,scopes:t.scopes||{}}),l.reject(l.isNil,e))}),Co=(e,t=[])=>{let r=o=>o.type==="basic"?{type:"http",scheme:"basic"}:o.type==="bearer"?ss(o):o.type==="input"?is(o,t):o.type==="header"?as(o):o.type==="cookie"?ps(o):o.type==="openid"?cs(o):ds(o);return e.map(o=>o.map(r))},Eo=(e,t,r)=>e.map(o=>o.reduce((n,s)=>{let i=r(s),p=["oauth2","openIdConnect"].includes(s.type);return Object.assign(n,{[i]:p?t:[]})},{})),ko=({schema:e,brandHandling:t,makeRef:r,path:o,method:n})=>Gt(e,{rules:{...t,...Vt},ctx:{isResponse:!1,makeRef:r,path:o,method:n}}),Io=({method:e,path:t,schema:r,request:o,mimeType:n,makeRef:s,composition:i,paramNames:p,description:d=`${e.toUpperCase()} ${t} Request body`})=>{let[c,m]=Po(Ye(o),p),y=[];bt(c)&&c.examples&&(y.push(...c.examples),delete c.examples);let g={schema:i==="components"?s(r,c,se(d)):c,examples:Jt(y.length?y:ze(o).examples?.filter(w=>E(w)&&!Array.isArray(w)).map(l.omit(p))||[])},h={description:d,content:{[n]:g}};return(m||n===C.raw)&&(h.required=!0),h},vo=e=>Object.entries(e).reduce((t,[r,o])=>{if(!o)return t;let n={name:r,description:typeof o=="string"?o:o.description};return typeof o=="object"&&o.url&&(n.externalDocs={url:o.url}),t.concat(n)},[]),Wt=e=>e.length<=So?e:e.slice(0,So-1)+"\u2026",Rt=e=>e.length?e.slice():void 0;var Yt=class extends ms{#e=new Map;#t=new Map;#r=new Map;#o(t,r,o=this.#r.get(t)){return o||(o=`Schema${this.#r.size+1}`,this.#r.set(t,o)),this.addSchema(o,r),{$ref:`#/components/schemas/${o}`}}#n(t,r,o){let n=o||se(r,t),s=this.#t.get(n);if(s===void 0)return this.#t.set(n,1),n;if(o)throw new Q(`Duplicated operationId: "${o}"`,{method:r,isResponse:!1,path:t});return s++,this.#t.set(n,s),`${n}${s}`}#s(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.#e.get(t.type)||0)+1;return this.#e.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,descriptions:i,brandHandling:p,tags:d,isHeader:c,hasSummaryFromDescription:m=!0,composition:y="inline"}){super(),this.addInfo({title:o,version:n});for(let h of typeof s=="string"?[s]:s)this.addServer({url:h});Le({routing:t,onEndpoint:gt((h,w,I)=>{let j={path:w,method:h,endpoint:I,composition:y,brandHandling:p,makeRef:this.#o.bind(this)},{description:b,shortDescription:v,scopes:A,inputSchema:$}=I,N=v?Wt(v):m&&b?Wt(b):void 0,ee=Lt(h,r.inputSources),we=this.#n(w,h,I.getOperationId(h)),tt=ko({...j,schema:$}),te=ho(I.security),rt=To({...j,inputSources:ee,isHeader:c,security:te,request:tt,description:i?.requestParameter?.call(null,{method:h,path:w,operationId:we})}),ot={};for(let re of Ne){let de=I.getResponses(re);for(let{mimeTypes:Nt,schema:st,statusCodes:it}of de)for(let Mt of it)ot[Mt]=wo({...j,variant:re,schema:st,mimeTypes:Nt,statusCode:Mt,hasMultipleStatusCodes:de.length>1||it.length>1,description:i?.[`${re}Response`]?.call(null,{method:h,path:w,operationId:we,statusCode:Mt})})}let nt=ee.includes("body")?Io({...j,request:tt,paramNames:Ao.pluck("name",rt),schema:$,mimeType:C[I.requestType],description:i?.requestBody?.call(null,{method:h,path:w,operationId:we})}):void 0,vt=Eo(Co(te,ee),A,re=>{let de=this.#s(re);return this.addSecurityScheme(de,re),de}),At={operationId:we,summary:N,description:b,deprecated:I.isDeprecated||void 0,tags:Rt(I.tags),parameters:Rt(rt),requestBody:nt,security:Rt(vt),responses:ot};this.addPath(Oo(w),{[h]:At})})}),d&&(this.rootDoc.tags=vo(d))}};import{createRequest as ls,createResponse as us}from"node-mocks-http";var fs=e=>ls({...e,headers:{"content-type":C.json,...e?.headers}}),ys=e=>us(e),hs=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:Br(o)?(...s)=>t[o].push(s):Reflect.get(r,o,n)}})},No=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=fs(e),s=ys({req:n,...t});s.req=t?.req||n,n.res=s;let i=hs(o),p={cors:!1,logger:i,...r};return{requestMock:n,responseMock:s,loggerMock:i,configMock:p}},gs=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:s}=No(t);return await e.execute({request:r,response:o,config:s,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}},xs=async({middleware:e,options:t={},...r})=>{let{requestMock:o,responseMock:n,loggerMock:s,configMock:{inputSources:i,errorHandler:p=Re}}=No(r),d=pt(o,i),c={request:o,response:n,logger:s,input:d,options:t};try{let m=await e.execute(c);return{requestMock:o,responseMock:n,loggerMock:s,output:m}}catch(m){return await p.execute({...c,error:oe(m),output:null}),{requestMock:o,responseMock:n,loggerMock:s,output:{}}}};import*as $o from"ramda";import It from"typescript";import{z as Fs}from"zod";import*as zo from"ramda";import G from"typescript";import*as _ from"ramda";import u from"typescript";var a=u.factory,Ot=[a.createModifier(u.SyntaxKind.ExportKeyword)],Ss=[a.createModifier(u.SyntaxKind.AsyncKeyword)],Qe={public:[a.createModifier(u.SyntaxKind.PublicKeyword)],protectedReadonly:[a.createModifier(u.SyntaxKind.ProtectedKeyword),a.createModifier(u.SyntaxKind.ReadonlyKeyword)]},Qt=(e,t)=>u.addSyntheticLeadingComment(e,u.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),Xt=(e,t)=>{let r=u.createSourceFile("print.ts","",u.ScriptTarget.Latest,!1,u.ScriptKind.TS);return u.createPrinter(t).printNode(u.EmitHint.Unspecified,e,r)},bs=/^[A-Za-z_$][A-Za-z0-9_$]*$/,er=e=>typeof e=="string"&&bs.test(e)?a.createIdentifier(e):O(e),Tt=(e,...t)=>a.createTemplateExpression(a.createTemplateHead(e),t.map(([r,o=""],n)=>a.createTemplateSpan(r,n===t.length-1?a.createTemplateTail(o):a.createTemplateMiddle(o)))),Pt=(e,{type:t,mod:r,init:o,optional:n}={})=>a.createParameterDeclaration(r,void 0,e,n?a.createToken(u.SyntaxKind.QuestionToken):void 0,t?f(t):void 0,o),$e=e=>Object.entries(e).map(([t,r])=>Pt(t,typeof r=="string"||typeof r=="number"||typeof r=="object"&&"kind"in r?{type:r}:r)),tr=(e,t=[])=>a.createConstructorDeclaration(Qe.public,e,a.createBlock(t)),f=(e,t)=>typeof e=="number"?a.createKeywordTypeNode(e):typeof e=="string"||u.isIdentifier(e)?a.createTypeReferenceNode(e,t&&_.map(f,t)):e,rr=f("Record",[u.SyntaxKind.StringKeyword,u.SyntaxKind.AnyKeyword]),J=e=>{let t=new Map;for(let r of e)t.set(Os(r)?r.kind:r,r);return a.createUnionTypeNode(Array.from(t.values()))},Te=(e,t,{isOptional:r,isDeprecated:o,comment:n}={})=>{let s=f(t),i=a.createPropertySignature(void 0,er(e),r?a.createToken(u.SyntaxKind.QuestionToken):void 0,r?J([s,f(u.SyntaxKind.UndefinedKeyword)]):s),p=_.reject(_.isNil,[o?"@deprecated":void 0,n]);return p.length?Qt(i,p.join(" ")):i},or=e=>u.setEmitFlags(e,u.EmitFlags.SingleLine),nr=(...e)=>a.createArrayBindingPattern(e.map(t=>a.createBindingElement(void 0,void 0,t))),M=(e,t,{type:r,expose:o}={})=>a.createVariableStatement(o&&Ot,a.createVariableDeclarationList([a.createVariableDeclaration(e,void 0,r?f(r):void 0,t)],u.NodeFlags.Const)),sr=(e,t)=>V(e,J(_.map(L,t)),{expose:!0}),V=(e,t,{expose:r,comment:o,params:n}={})=>{let s=a.createTypeAliasDeclaration(r?Ot:void 0,e,n&&cr(n),t);return o?Qt(s,o):s},Mo=(e,t)=>a.createPropertyDeclaration(Qe.public,e,void 0,f(t),void 0),ir=(e,t,r,{typeParams:o,returns:n}={})=>a.createMethodDeclaration(Qe.public,void 0,e,void 0,o&&cr(o),t,n,a.createBlock(r)),ar=(e,t,{typeParams:r}={})=>a.createClassDeclaration(Ot,e,r&&cr(r),void 0,t),pr=e=>a.createTypeOperatorNode(u.SyntaxKind.KeyOfKeyword,f(e)),wt=e=>f(Promise.name,[e]),Ct=(e,t,{expose:r,comment:o}={})=>{let n=a.createInterfaceDeclaration(r?Ot:void 0,e,void 0,void 0,t);return o?Qt(n,o):n},cr=e=>(Array.isArray(e)?e.map(t=>_.pair(t,void 0)):Object.entries(e)).map(([t,r])=>{let{type:o,init:n}=typeof r=="object"&&"init"in r?r:{type:r};return a.createTypeParameterDeclaration([],t,o?f(o):void 0,n?f(n):void 0)}),Pe=(e,t,{isAsync:r}={})=>a.createArrowFunction(r?Ss:void 0,void 0,Array.isArray(e)?_.map(Pt,e):$e(e),void 0,void 0,t),T=e=>e,Xe=(e,t,r)=>a.createConditionalExpression(e,a.createToken(u.SyntaxKind.QuestionToken),t,a.createToken(u.SyntaxKind.ColonToken),r),P=(e,...t)=>(...r)=>a.createCallExpression(t.reduce((o,n)=>typeof n=="string"||u.isIdentifier(n)?a.createPropertyAccessExpression(o,n):a.createElementAccessExpression(o,n),typeof e=="string"?a.createIdentifier(e):e),void 0,r),Ze=(e,...t)=>a.createNewExpression(a.createIdentifier(e),void 0,t),Et=(e,t)=>f("Extract",[e,t]),dr=(e,t)=>a.createExpressionStatement(a.createBinaryExpression(e,a.createToken(u.SyntaxKind.EqualsToken),t)),K=(e,t)=>a.createIndexedAccessTypeNode(f(e),f(t)),jo=e=>J([f(e),wt(e)]),mr=(e,t)=>a.createFunctionTypeNode(void 0,$e(e),f(t)),O=e=>typeof e=="number"?a.createNumericLiteral(e):typeof e=="bigint"?a.createBigIntLiteral(e.toString()):typeof e=="boolean"?e?a.createTrue():a.createFalse():e===null?a.createNull():a.createStringLiteral(e),L=e=>a.createLiteralTypeNode(O(e)),Rs=[u.SyntaxKind.AnyKeyword,u.SyntaxKind.BigIntKeyword,u.SyntaxKind.BooleanKeyword,u.SyntaxKind.NeverKeyword,u.SyntaxKind.NumberKeyword,u.SyntaxKind.ObjectKeyword,u.SyntaxKind.StringKeyword,u.SyntaxKind.SymbolKeyword,u.SyntaxKind.UndefinedKeyword,u.SyntaxKind.UnknownKeyword,u.SyntaxKind.VoidKeyword],Os=e=>Rs.includes(e.kind);var kt=class{constructor(t){this.serverUrl=t}paths=new Set;tags=new Map;registry=new Map;#e={pathType:a.createIdentifier("Path"),implementationType:a.createIdentifier("Implementation"),keyParameter:a.createIdentifier("key"),pathParameter:a.createIdentifier("path"),paramsArgument:a.createIdentifier("params"),ctxArgument:a.createIdentifier("ctx"),methodParameter:a.createIdentifier("method"),requestParameter:a.createIdentifier("request"),eventParameter:a.createIdentifier("event"),dataParameter:a.createIdentifier("data"),handlerParameter:a.createIdentifier("handler"),msgParameter:a.createIdentifier("msg"),parseRequestFn:a.createIdentifier("parseRequest"),substituteFn:a.createIdentifier("substitute"),provideMethod:a.createIdentifier("provide"),onMethod:a.createIdentifier("on"),implementationArgument:a.createIdentifier("implementation"),hasBodyConst:a.createIdentifier("hasBody"),undefinedValue:a.createIdentifier("undefined"),responseConst:a.createIdentifier("response"),restConst:a.createIdentifier("rest"),searchParamsConst:a.createIdentifier("searchParams"),defaultImplementationConst:a.createIdentifier("defaultImplementation"),clientConst:a.createIdentifier("client"),contentTypeConst:a.createIdentifier("contentType"),isJsonConst:a.createIdentifier("isJSON"),sourceProp:a.createIdentifier("source")};interfaces={input:a.createIdentifier("Input"),positive:a.createIdentifier("PositiveResponse"),negative:a.createIdentifier("NegativeResponse"),encoded:a.createIdentifier("EncodedResponse"),response:a.createIdentifier("Response")};methodType=sr("Method",xr);someOfType=V("SomeOf",K("T",pr("T")),{params:["T"]});requestType=V("Request",pr(this.interfaces.input),{expose:!0});someOf=({name:t})=>f(this.someOfType.name,[t]);makePathType=()=>sr(this.#e.pathType,Array.from(this.paths));makePublicInterfaces=()=>Object.keys(this.interfaces).map(t=>Ct(this.interfaces[t],Array.from(this.registry).map(([r,{store:o,isDeprecated:n}])=>Te(r,o[t],{isDeprecated:n})),{expose:!0}));makeEndpointTags=()=>M("endpointTags",a.createObjectLiteralExpression(Array.from(this.tags).map(([t,r])=>a.createPropertyAssignment(er(t),a.createArrayLiteralExpression(zo.map(O,r))))),{expose:!0});makeImplementationType=()=>V(this.#e.implementationType,mr({[this.#e.methodParameter.text]:this.methodType.name,[this.#e.pathParameter.text]:G.SyntaxKind.StringKeyword,[this.#e.paramsArgument.text]:rr,[this.#e.ctxArgument.text]:{optional:!0,type:"T"}},wt(G.SyntaxKind.AnyKeyword)),{expose:!0,params:{T:{init:G.SyntaxKind.UnknownKeyword}}});makeParseRequestFn=()=>M(this.#e.parseRequestFn,Pe({[this.#e.requestParameter.text]:G.SyntaxKind.StringKeyword},a.createAsExpression(P(this.#e.requestParameter,T("split"))(a.createRegularExpressionLiteral("/ (.+)/"),O(2)),a.createTupleTypeNode([f(this.methodType.name),f(this.#e.pathType)]))));makeSubstituteFn=()=>M(this.#e.substituteFn,Pe({[this.#e.pathParameter.text]:G.SyntaxKind.StringKeyword,[this.#e.paramsArgument.text]:rr},a.createBlock([M(this.#e.restConst,a.createObjectLiteralExpression([a.createSpreadAssignment(this.#e.paramsArgument)])),a.createForInStatement(a.createVariableDeclarationList([a.createVariableDeclaration(this.#e.keyParameter)],G.NodeFlags.Const),this.#e.paramsArgument,a.createBlock([dr(this.#e.pathParameter,P(this.#e.pathParameter,T("replace"))(Tt(":",[this.#e.keyParameter]),Pe([],a.createBlock([a.createExpressionStatement(a.createDeleteExpression(a.createElementAccessExpression(this.#e.restConst,this.#e.keyParameter))),a.createReturnStatement(a.createElementAccessExpression(this.#e.paramsArgument,this.#e.keyParameter))]))))])),a.createReturnStatement(a.createAsExpression(a.createArrayLiteralExpression([this.#e.pathParameter,this.#e.restConst]),f("const")))])));#t=()=>ir(this.#e.provideMethod,$e({[this.#e.requestParameter.text]:"K",[this.#e.paramsArgument.text]:K(this.interfaces.input,"K"),[this.#e.ctxArgument.text]:{optional:!0,type:"T"}}),[M(nr(this.#e.methodParameter,this.#e.pathParameter),P(this.#e.parseRequestFn)(this.#e.requestParameter)),a.createReturnStatement(P(a.createThis(),this.#e.implementationArgument)(this.#e.methodParameter,a.createSpreadElement(P(this.#e.substituteFn)(this.#e.pathParameter,this.#e.paramsArgument)),this.#e.ctxArgument))],{typeParams:{K:this.requestType.name},returns:wt(K(this.interfaces.response,"K"))});makeClientClass=t=>ar(t,[tr([Pt(this.#e.implementationArgument,{type:f(this.#e.implementationType,["T"]),mod:Qe.protectedReadonly,init:this.#e.defaultImplementationConst})]),this.#t()],{typeParams:["T"]});#r=t=>Tt("?",[Ze(URLSearchParams.name,t)]);#o=()=>Ze(URL.name,Tt("",[this.#e.pathParameter],[this.#e.searchParamsConst]),O(this.serverUrl));makeDefaultImplementation=()=>{let t=a.createPropertyAssignment(T("method"),P(this.#e.methodParameter,T("toUpperCase"))()),r=a.createPropertyAssignment(T("headers"),Xe(this.#e.hasBodyConst,a.createObjectLiteralExpression([a.createPropertyAssignment(O("Content-Type"),O(C.json))]),this.#e.undefinedValue)),o=a.createPropertyAssignment(T("body"),Xe(this.#e.hasBodyConst,P(JSON[Symbol.toStringTag],T("stringify"))(this.#e.paramsArgument),this.#e.undefinedValue)),n=M(this.#e.responseConst,a.createAwaitExpression(P(fetch.name)(this.#o(),a.createObjectLiteralExpression([t,r,o])))),s=M(this.#e.hasBodyConst,a.createLogicalNot(P(a.createArrayLiteralExpression([O("get"),O("head"),O("delete")]),T("includes"))(this.#e.methodParameter))),i=M(this.#e.searchParamsConst,Xe(this.#e.hasBodyConst,O(""),this.#r(this.#e.paramsArgument))),p=M(this.#e.contentTypeConst,P(this.#e.responseConst,T("headers"),T("get"))(O("content-type"))),d=a.createIfStatement(a.createPrefixUnaryExpression(G.SyntaxKind.ExclamationToken,this.#e.contentTypeConst),a.createReturnStatement()),c=M(this.#e.isJsonConst,P(this.#e.contentTypeConst,T("startsWith"))(O(C.json))),m=a.createReturnStatement(P(this.#e.responseConst,Xe(this.#e.isJsonConst,O(T("json")),O(T("text"))))());return M(this.#e.defaultImplementationConst,Pe([this.#e.methodParameter,this.#e.pathParameter,this.#e.paramsArgument],a.createBlock([s,i,n,p,d,c,m]),{isAsync:!0}),{type:this.#e.implementationType})};#n=()=>tr($e({request:"K",params:K(this.interfaces.input,"K")}),[M(nr(this.#e.pathParameter,this.#e.restConst),P(this.#e.substituteFn)(a.createElementAccessExpression(P(this.#e.parseRequestFn)(this.#e.requestParameter),O(1)),this.#e.paramsArgument)),M(this.#e.searchParamsConst,this.#r(this.#e.restConst)),dr(a.createPropertyAccessExpression(a.createThis(),this.#e.sourceProp),Ze("EventSource",this.#o()))]);#s=t=>a.createTypeLiteralNode([Te(T("event"),t)]);#i=()=>ir(this.#e.onMethod,$e({[this.#e.eventParameter.text]:"E",[this.#e.handlerParameter.text]:mr({[this.#e.dataParameter.text]:K(Et("R",or(this.#s("E"))),L(T("data")))},jo(G.SyntaxKind.VoidKeyword))}),[a.createExpressionStatement(P(a.createThis(),this.#e.sourceProp,T("addEventListener"))(this.#e.eventParameter,Pe([this.#e.msgParameter],P(this.#e.handlerParameter)(P(JSON[Symbol.toStringTag],T("parse"))(a.createPropertyAccessExpression(a.createParenthesizedExpression(a.createAsExpression(this.#e.msgParameter,f(MessageEvent.name))),T("data"))))))),a.createReturnStatement(a.createThis())],{typeParams:{E:K("R",L(T("event")))}});makeSubscriptionClass=t=>ar(t,[Mo(this.#e.sourceProp,"EventSource"),this.#n(),this.#i()],{typeParams:{K:Et(this.requestType.name,a.createTemplateLiteralType(a.createTemplateHead("get "),[a.createTemplateLiteralTypeSpan(f(G.SyntaxKind.StringKeyword),a.createTemplateTail(""))])),R:Et(K(this.interfaces.positive,"K"),or(this.#s(G.SyntaxKind.StringKeyword)))}});makeUsageStatements=(t,r)=>[M(this.#e.clientConst,Ze(t)),P(this.#e.clientConst,this.#e.provideMethod)(O("get /v1/user/retrieve"),a.createObjectLiteralExpression([a.createPropertyAssignment("id",O("10"))])),P(Ze(r,O("get /v1/events/stream"),a.createObjectLiteralExpression()),this.#e.onMethod)(O("time"),Pe(["time"],a.createBlock([])))]};import*as k from"ramda";import x from"typescript";import{globalRegistry as Ts}from"zod";var lr=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let s=W(e),i=s&&s in r?r[s]:r[e._zod.def.type],d=i?i(e,{...n,next:m=>lr(m,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),c=t&&t(e,{prev:d,...n});return c?{...d,...c}:d};var{factory:F}=x,Ps={[x.SyntaxKind.AnyKeyword]:"",[x.SyntaxKind.BigIntKeyword]:BigInt(0),[x.SyntaxKind.BooleanKeyword]:!1,[x.SyntaxKind.NumberKeyword]:0,[x.SyntaxKind.ObjectKeyword]:{},[x.SyntaxKind.StringKeyword]:"",[x.SyntaxKind.UndefinedKeyword]:void 0},ur={name:k.path(["name","text"]),type:k.path(["type"]),optional:k.path(["questionToken"])},ws=({_zod:{def:e}})=>{let t=e.values.map(r=>r===void 0?f(x.SyntaxKind.UndefinedKeyword):L(r));return t.length===1?t[0]:J(t)},Cs=({_zod:{def:e}},{next:t})=>{let r=[...e.parts],o=()=>{let i="";for(;r.length;){let p=r.shift();if(ne(p)){r.unshift(p);break}i+=p??""}return i},n=F.createTemplateHead(o()),s=[];for(;r.length;){let i=t(r.shift()),p=o(),d=r.length?F.createTemplateMiddle:F.createTemplateTail;s.push(F.createTemplateLiteralTypeSpan(i,d(p)))}return s.length?F.createTemplateLiteralType(n,s):L(n.text)},Es=(e,{isResponse:t,next:r,makeAlias:o})=>{let n=()=>{let s=Object.entries(e._zod.def.shape).map(([i,p])=>{let{description:d,deprecated:c}=Ts.get(p)||{};return Te(i,r(p),{comment:d,isDeprecated:c,isOptional:(t?p._zod.optout:p._zod.optin)==="optional"})});return F.createTypeLiteralNode(s)};return kr(e,{io:t?"output":"input"})?o(e,n):n()},ks=({_zod:{def:e}},{next:t})=>F.createArrayTypeNode(t(e.element)),Is=({_zod:{def:e}})=>J(Object.values(e.entries).map(L)),vs=({_zod:{def:e}},{next:t})=>J(e.options.map(t)),As=e=>Ps?.[e.kind],Ns=({_zod:{def:e}},{next:t})=>J([t(e.innerType),L(null)]),Ms=({_zod:{def:e}},{next:t})=>F.createTupleTypeNode(e.items.map(t).concat(e.rest===null?[]:F.createRestTypeNode(t(e.rest)))),js=({_zod:{def:e}},{next:t})=>f("Record",[e.keyType,e.valueType].map(t)),zs=k.tryCatch(e=>{if(!e.every(x.isTypeLiteralNode))throw new Error("Not objects");let t=k.chain(k.prop("members"),e),r=k.uniqWith((...o)=>{if(!k.eqBy(ur.name,...o))return!1;if(k.both(k.eqBy(ur.type),k.eqBy(ur.optional))(...o))return!0;throw new Error("Has conflicting prop")},t);return F.createTypeLiteralNode(r)},(e,t)=>F.createIntersectionTypeNode(t)),Ls=({_zod:{def:e}},{next:t})=>zs([e.left,e.right].map(t)),q=e=>()=>f(e),et=({_zod:{def:e}},{next:t})=>t(e.innerType),Lo=e=>f(e?x.SyntaxKind.UnknownKeyword:x.SyntaxKind.AnyKeyword),$s=({_zod:{def:e}},{next:t,isResponse:r})=>{let o=e[r?"out":"in"],n=e[r?"in":"out"];if(!ne(o,"transform"))return t(o);let s=t(n),i=ct(o,As(s)),p={number:x.SyntaxKind.NumberKeyword,bigint:x.SyntaxKind.BigIntKeyword,boolean:x.SyntaxKind.BooleanKeyword,string:x.SyntaxKind.StringKeyword,undefined:x.SyntaxKind.UndefinedKeyword,object:x.SyntaxKind.ObjectKeyword};return f(i&&p[i]||Lo(r))},Zs=()=>L(null),Bs=({_zod:{def:e}},{makeAlias:t,next:r})=>t(e.getter,()=>r(e.getter())),Hs=()=>f("Buffer"),Ks=(e,{next:t})=>t(e._zod.def.shape.raw),qs={string:q(x.SyntaxKind.StringKeyword),number:q(x.SyntaxKind.NumberKeyword),bigint:q(x.SyntaxKind.BigIntKeyword),boolean:q(x.SyntaxKind.BooleanKeyword),any:q(x.SyntaxKind.AnyKeyword),undefined:q(x.SyntaxKind.UndefinedKeyword),[he]:q(x.SyntaxKind.StringKeyword),[ge]:q(x.SyntaxKind.StringKeyword),never:q(x.SyntaxKind.NeverKeyword),void:q(x.SyntaxKind.UndefinedKeyword),unknown:q(x.SyntaxKind.UnknownKeyword),null:Zs,array:ks,tuple:Ms,record:js,object:Es,literal:ws,template_literal:Cs,intersection:Ls,union:vs,default:et,enum:Is,optional:et,nonoptional:et,nullable:Ns,catch:et,pipe:$s,lazy:Bs,readonly:et,[ye]:Hs,[B]:Ks},fr=(e,{brandHandling:t,ctx:r})=>lr(e,{rules:{...t,...qs},onMissing:({},{isResponse:o})=>Lo(o),ctx:r});var yr=class extends kt{#e=[this.someOfType];#t=new Map;#r=[];#o(t,r){let o=this.#t.get(t)?.name?.text;if(!o){o=`Type${this.#t.size+1}`;let n=L(null);this.#t.set(t,V(o,n)),this.#t.set(t,V(o,r()))}return f(o)}constructor({routing:t,brandHandling:r,variant:o="client",clientClassName:n="Client",subscriptionClassName:s="Subscription",serverUrl:i="https://example.com",noContent:p=Fs.undefined()}){super(i);let d={makeAlias:this.#o.bind(this)},c={brandHandling:r,ctx:{...d,isResponse:!1}},m={brandHandling:r,ctx:{...d,isResponse:!0}};Le({routing:t,onEndpoint:gt((g,h,w)=>{let I=se.bind(null,g,h),{isDeprecated:j,inputSchema:b,tags:v}=w,A=`${g} ${h}`,$=V(I("input"),fr(b,c),{comment:A});this.#e.push($);let N=Ne.reduce((tt,te)=>{let rt=w.getResponses(te),ot=$o.chain(([vt,{schema:At,mimeTypes:re,statusCodes:de}])=>{let Nt=re&&dt(g,te),st=V(I(te,"variant",`${vt+1}`),fr(Nt?At:p,m),{comment:A});return this.#e.push(st),de.map(it=>Te(it,st.name))},Array.from(rt.entries())),nt=Ct(I(te,"response","variants"),ot,{comment:A});return this.#e.push(nt),Object.assign(tt,{[te]:nt})},{});this.paths.add(h);let ee=L(A),we={input:f($.name),positive:this.someOf(N.positive),negative:this.someOf(N.negative),response:J([K(this.interfaces.positive,ee),K(this.interfaces.negative,ee)]),encoded:a.createIntersectionTypeNode([f(N.positive.name),f(N.negative.name)])};this.registry.set(A,{isDeprecated:j,store:we}),this.tags.set(A,v)})}),this.#e.unshift(...this.#t.values()),this.#e.push(this.makePathType(),this.methodType,...this.makePublicInterfaces(),this.requestType),o!=="types"&&(this.#e.push(this.makeEndpointTags(),this.makeParseRequestFn(),this.makeSubstituteFn(),this.makeImplementationType(),this.makeDefaultImplementation(),this.makeClientClass(n),this.makeSubscriptionClass(s)),this.#r.push(...this.makeUsageStatements(n,s)))}#n(t){return this.#r.length?this.#r.map(r=>typeof r=="string"?r:Xt(r,t)).join(`
19
+ `):void 0}print(t){let r=this.#n(t),o=r&&It.addSyntheticLeadingComment(It.addSyntheticLeadingComment(a.createEmptyStatement(),It.SyntaxKind.SingleLineCommentTrivia," Usage example:"),It.SyntaxKind.MultiLineCommentTrivia,`
20
+ ${r}`);return this.#e.concat(o||[]).map((n,s)=>Xt(n,s<this.#e.length?t:{...t,omitTrailingSemicolon:!0})).join(`
21
21
 
22
- `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let i=(await je("prettier")).format;o=p=>i(p,{filepath:"client.ts"})}catch{}let n=this.#n(t);this.#r=n&&o?[await o(n)]:this.#r;let s=this.print(t);return o?o(s):s}};import{z as Ze}from"zod";var $o=(e,t)=>Ze.object({data:t,event:Ze.literal(e),id:Ze.string().optional(),retry:Ze.int().positive().optional()}),Ks=(e,t,r)=>$o(String(t),e[t]).transform(o=>[`event: ${o.event}`,`data: ${JSON.stringify(o.data)}`,"",""].join(`
23
- `)).parse({event:t,data:r}),Hs=1e4,Lo=e=>e.headersSent||e.writeHead(200,{connection:"keep-alive","content-type":w.sse,"cache-control":"no-cache"}),qs=e=>new U({handler:async({response:t})=>setTimeout(()=>Lo(t),Hs)&&{isClosed:()=>t.writableEnded||t.closed,emit:(r,o)=>{Lo(t),t.write(Ks(e,r,o),"utf-8"),t.flush?.()}}}),Fs=e=>new be({positive:()=>{let[t,...r]=Object.entries(e).map(([o,n])=>$o(o,n));return{mimeType:w.sse,schema:r.length?Ze.discriminatedUnion("event",[t,...r]):t}},negative:{mimeType:"text/plain",schema:Ze.string()},handler:async({response:t,error:r,logger:o,request:n,input:s})=>{if(r){let i=ke(r);Ue(i,o,n,s),t.headersSent||t.status(i.statusCode).type("text/plain").write(xe(i),"utf-8")}t.end()}}),ur=class extends Re{constructor(t){super(Fs(t)),this.middlewares=[qs(t)]}};var Ds={dateIn:yr,dateOut:gr,form:xr,upload:br,raw:Rr,buffer:pt};export{Je as BuiltinLogger,Ve as DependsOnMethod,Vt as Documentation,Q as DocumentationError,Re as EndpointsFactory,ur as EventStreamFactory,X as InputValidationError,lr as Integration,U as Middleware,Fe as MissingPeerError,qe as OutputValidationError,be as ResultHandler,he as RoutingError,Ge as ServeStatic,pn as arrayEndpointsFactory,Zt as arrayResultHandler,$n as attachRouting,Do as createConfig,Mn as createServer,an as defaultEndpointsFactory,Se as defaultResultHandler,ke as ensureHttpError,Ds as ez,Z as getExamples,me as getMessageFromError,us as testEndpoint,fs as testMiddleware};
22
+ `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let i=(await je("prettier")).format;o=p=>i(p,{filepath:"client.ts"})}catch{}let n=this.#n(t);this.#r=n&&o?[await o(n)]:this.#r;let s=this.print(t);return o?o(s):s}};import{z as Be}from"zod";var Bo=(e,t)=>Be.object({data:t,event:Be.literal(e),id:Be.string().optional(),retry:Be.int().positive().optional()}),Ds=(e,t,r)=>Bo(String(t),e[t]).transform(o=>[`event: ${o.event}`,`data: ${JSON.stringify(o.data)}`,"",""].join(`
23
+ `)).parse({event:t,data:r}),Us=1e4,Zo=e=>e.headersSent||e.writeHead(200,{connection:"keep-alive","content-type":C.sse,"cache-control":"no-cache"}),_s=e=>new U({handler:async({response:t})=>setTimeout(()=>Zo(t),Us)&&{isClosed:()=>t.writableEnded||t.closed,emit:(r,o)=>{Zo(t),t.write(Ds(e,r,o),"utf-8"),t.flush?.()}}}),Js=e=>new be({positive:()=>{let[t,...r]=Object.entries(e).map(([o,n])=>Bo(o,n));return{mimeType:C.sse,schema:r.length?Be.discriminatedUnion("event",[t,...r]):t}},negative:{mimeType:"text/plain",schema:Be.string()},handler:async({response:t,error:r,logger:o,request:n,input:s})=>{if(r){let i=ke(r);_e(i,o,n,s),t.headersSent||t.status(i.statusCode).type("text/plain").write(Se(i),"utf-8")}t.end()}}),hr=class extends Oe{constructor(t){super(Js(t)),this.middlewares=[_s(t)]}};var Vs={dateIn:Sr,dateOut:br,form:Or,upload:Tr,raw:wr,buffer:mt};export{Ve as BuiltinLogger,Ge as DependsOnMethod,Yt as Documentation,Q as DocumentationError,Oe as EndpointsFactory,hr as EventStreamFactory,X as InputValidationError,yr as Integration,U as Middleware,De as MissingPeerError,Fe as OutputValidationError,be as ResultHandler,xe as RoutingError,We as ServeStatic,ln as arrayEndpointsFactory,qt as arrayResultHandler,Hn as attachRouting,Jo as createConfig,Kn as createServer,mn as defaultEndpointsFactory,Re as defaultResultHandler,ke as ensureHttpError,Vs as ez,Z as getExamples,le as getMessageFromError,gs as testEndpoint,xs as testMiddleware};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "25.0.0-beta.3",
3
+ "version": "25.0.0-beta.4",
4
4
  "description": "A Typescript framework to help you get an API server up and running with I/O schema validation and custom middlewares in minutes.",
5
5
  "license": "MIT",
6
6
  "repository": {