express-zod-api 12.4.0 → 14.0.0-beta1

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/dist/index.d.ts CHANGED
@@ -1,12 +1,10 @@
1
1
  import compression from 'compression';
2
- import { NextHandleFunction } from 'connect';
3
- import express, { Request, Response, Express } from 'express';
2
+ import express, { Request, Response, NextFunction, RequestHandler, Express } from 'express';
4
3
  import fileUpload, { UploadedFile } from 'express-fileupload';
5
4
  import https, { ServerOptions } from 'node:https';
6
5
  import winston, { Logger } from 'winston';
7
6
  import { z, ZodTypeDef, ZodType, ParseInput, ParseReturnType, ZodError } from 'zod';
8
7
  import { HttpError } from 'http-errors';
9
- export { default as createHttpError } from 'http-errors';
10
8
  import * as qs from 'qs';
11
9
  import * as express_serve_static_core from 'express-serve-static-core';
12
10
  import * as http from 'http';
@@ -112,7 +110,7 @@ interface MiddlewareDefinition<IN extends IOSchema<"strip">, OPT, OUT extends Fl
112
110
  }
113
111
  type AnyMiddlewareDef = MiddlewareDefinition<any, any, any, any>;
114
112
  declare const createMiddleware: <IN extends IOSchema<"strip">, OPT, OUT extends FlatObject, SCO extends string>(props: MiddlewareCreationProps<IN, OPT, OUT, SCO>) => MiddlewareDefinition<IN, OPT, OUT, SCO>;
115
- type ExpressMiddleware<R extends Request, S extends Response> = (request: R, response: S, next: (error?: any) => void) => void | Promise<void>;
113
+ type ExpressMiddleware<R extends Request, S extends Response> = (request: R, response: S, next: NextFunction) => void | Promise<void>;
116
114
  interface ExpressMiddlewareFeatures<R extends Request, S extends Response, OUT extends FlatObject> {
117
115
  provider?: (request: R, response: S) => OUT | Promise<OUT>;
118
116
  transformer?: (err: Error) => HttpError | Error;
@@ -127,13 +125,8 @@ type IOSchema<U extends z.UnknownKeysParam = any> = z.ZodObject<any, U> | z.ZodU
127
125
  type ProbableIntersection<A extends IOSchema<"strip"> | null, B extends IOSchema> = A extends null ? B : A extends IOSchema<"strip"> ? z.ZodIntersection<A, B> : never;
128
126
 
129
127
  type Method = "get" | "post" | "put" | "delete" | "patch";
130
- type MethodsDefinition<M extends Method> = {
131
- methods: M[];
132
- } | {
133
- method: M;
134
- };
135
128
 
136
- type FlatObject = Record<string, any>;
129
+ type FlatObject = Record<string, unknown>;
137
130
  declare const getMessageFromError: (error: Error) => string;
138
131
  declare const getStatusCodeFromError: (error: Error) => number;
139
132
  declare const getExamples: <T extends z.ZodTypeAny, V extends "original" | "parsed" | undefined>({ schema, variant, validate, }: {
@@ -153,13 +146,12 @@ declare const getExamples: <T extends z.ZodTypeAny, V extends "original" | "pars
153
146
  }) => readonly (V extends "parsed" ? z.output<T> : z.input<T>)[];
154
147
  type ErrMessage = Exclude<Parameters<typeof z.ZodString.prototype.email>[0], undefined>;
155
148
 
149
+ interface Metadata<T extends z.ZodTypeAny> {
150
+ examples: z.input<T>[];
151
+ }
156
152
  declare const metaProp = "expressZodApiMeta";
157
153
  type MetaProp = typeof metaProp;
158
- type MetaDef<T extends z.ZodTypeAny> = {
159
- [K in MetaProp]: {
160
- examples: z.input<T>[];
161
- };
162
- };
154
+ type MetaDef<T extends z.ZodTypeAny> = Record<MetaProp, Metadata<T>>;
163
155
  type ExampleSetter<T extends z.ZodTypeAny> = (example: z.input<T>) => WithMeta<T>;
164
156
  type WithMeta<T extends z.ZodTypeAny> = T & {
165
157
  _def: T["_def"] & MetaDef<T>;
@@ -231,7 +223,7 @@ declare class ZodUpload extends ZodType<UploadedFile, ZodUploadDef> {
231
223
  static create: () => ZodUpload;
232
224
  }
233
225
 
234
- interface OpenAPIContext {
226
+ interface OpenAPIContext extends FlatObject {
235
227
  isResponse: boolean;
236
228
  serializer: (schema: z.ZodTypeAny) => string;
237
229
  getRef: (name: string) => ReferenceObject | undefined;
@@ -244,10 +236,6 @@ interface OpenAPIContext {
244
236
  declare class RoutingError extends Error {
245
237
  name: string;
246
238
  }
247
- /** @desc An error related to the issues of using DependsOnMethod class */
248
- declare class DependsOnMethodError extends RoutingError {
249
- name: string;
250
- }
251
239
  /**
252
240
  * @desc An error related to the generating of the documentation
253
241
  * */
@@ -275,9 +263,11 @@ declare class InputValidationError extends IOSchemaError {
275
263
  }
276
264
 
277
265
  interface ResultHandlerParams<RES> {
266
+ /** null in case of failure to parse or to find the matching endpoint (error: not found) */
267
+ input: FlatObject | null;
268
+ /** null in case of errors or failures */
269
+ output: FlatObject | null;
278
270
  error: Error | null;
279
- input: any;
280
- output: any;
281
271
  request: Request;
282
272
  response: Response<RES>;
283
273
  logger: Logger;
@@ -288,6 +278,7 @@ interface ResultHandlerDefinition<POS extends z.ZodTypeAny, NEG extends z.ZodTyp
288
278
  getNegativeResponse: () => NEG | ApiResponse<NEG>;
289
279
  handler: ResultHandler<z.output<POS> | z.output<NEG>>;
290
280
  }
281
+ type AnyResultHandlerDefinition = ResultHandlerDefinition<z.ZodTypeAny, z.ZodTypeAny>;
291
282
  declare const createResultHandler: <POS extends z.ZodTypeAny, NEG extends z.ZodTypeAny>(definition: ResultHandlerDefinition<POS, NEG>) => ResultHandlerDefinition<POS, NEG>;
292
283
  declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
293
284
  status: z.ZodLiteral<"success">;
@@ -405,9 +396,9 @@ declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
405
396
  * @desc Responding with array is a bad practice keeping your endpoints from evolving without breaking changes.
406
397
  * @desc This handler expects your endpoint to have the property 'items' in the output object schema
407
398
  * */
408
- declare const arrayResultHandler: ResultHandlerDefinition<z.ZodArray<any, "many"> & {
409
- _def: z.ZodArrayDef<any> & MetaDef<z.ZodArray<any, "many">>;
410
- example: (example: any[]) => z.ZodArray<any, "many"> & any;
399
+ declare const arrayResultHandler: ResultHandlerDefinition<z.ZodArray<z.ZodTypeAny, "many"> & {
400
+ _def: z.ZodArrayDef<z.ZodTypeAny> & MetaDef<z.ZodArray<z.ZodTypeAny, "many">>;
401
+ example: (example: any[]) => z.ZodArray<z.ZodTypeAny, "many"> & any;
411
402
  }, z.ZodString & {
412
403
  _def: z.ZodStringDef & MetaDef<z.ZodString>;
413
404
  example: (example: string) => z.ZodString & any;
@@ -441,34 +432,28 @@ declare abstract class AbstractEndpoint {
441
432
  abstract _setSiblingMethods(methods: Method[]): void;
442
433
  abstract getOperationId(method: Method): string | undefined;
443
434
  }
444
- type EndpointProps<IN extends IOSchema, OUT extends IOSchema, OPT extends FlatObject, M extends Method, POS extends z.ZodTypeAny, NEG extends z.ZodTypeAny, SCO extends string, TAG extends string> = {
445
- middlewares: AnyMiddlewareDef[];
446
- inputSchema: IN;
447
- outputSchema: OUT;
448
- handler: Handler<z.output<IN>, z.input<OUT>, OPT>;
449
- resultHandler: ResultHandlerDefinition<POS, NEG>;
450
- description?: string;
451
- shortDescription?: string;
452
- operationId?: string | ((method: Method) => string);
453
- } & ({
454
- scopes?: SCO[];
455
- } | {
456
- scope?: SCO;
457
- }) & ({
458
- tags?: TAG[];
459
- } | {
460
- tag?: TAG;
461
- }) & MethodsDefinition<M>;
462
- declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends FlatObject, M extends Method, POS extends z.ZodTypeAny, NEG extends z.ZodTypeAny, SCO extends string, TAG extends string> extends AbstractEndpoint {
435
+ declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends FlatObject, POS extends z.ZodTypeAny, NEG extends z.ZodTypeAny, SCO extends string, TAG extends string> extends AbstractEndpoint {
463
436
  #private;
464
- constructor({ middlewares, inputSchema, outputSchema, handler, resultHandler, description, shortDescription, ...rest }: EndpointProps<IN, OUT, OPT, M, POS, NEG, SCO, TAG>);
437
+ constructor({ methods, inputSchema, outputSchema, handler, resultHandler, getOperationId, scopes, middlewares, tags, description: long, shortDescription: short, }: {
438
+ middlewares?: AnyMiddlewareDef[];
439
+ inputSchema: IN;
440
+ outputSchema: OUT;
441
+ handler: Handler<z.output<IN>, z.input<OUT>, OPT>;
442
+ resultHandler: ResultHandlerDefinition<POS, NEG>;
443
+ description?: string;
444
+ shortDescription?: string;
445
+ getOperationId?: (method: Method) => string | undefined;
446
+ methods: Method[];
447
+ scopes?: SCO[];
448
+ tags?: TAG[];
449
+ });
465
450
  /**
466
451
  * @desc Sets the other methods supported by the same path. Used by Routing in DependsOnMethod case, for options.
467
452
  * @deprecated This method is for internal needs of the library, please avoid using it.
468
453
  * */
469
454
  _setSiblingMethods(methods: Method[]): void;
470
455
  getDescription(variant: DescriptionVariant): string | undefined;
471
- getMethods(): M[];
456
+ getMethods(): Method[];
472
457
  getSchema(variant: "input"): IN;
473
458
  getSchema(variant: "output"): OUT;
474
459
  getSchema(variant: "positive"): POS;
@@ -507,7 +492,7 @@ interface ServerConfig {
507
492
  * @desc Custom JSON parser.
508
493
  * @default express.json()
509
494
  * */
510
- jsonParser?: NextHandleFunction;
495
+ jsonParser?: RequestHandler;
511
496
  /**
512
497
  * @desc Enable or configure uploads handling.
513
498
  * @default false
@@ -557,7 +542,7 @@ interface CommonConfig<TAG extends string = string> {
557
542
  * @default defaultResultHandler
558
543
  * @see defaultResultHandler
559
544
  */
560
- errorHandler?: ResultHandlerDefinition<any, any>;
545
+ errorHandler?: AnyResultHandlerDefinition;
561
546
  /** @desc Logger configuration or your custom winston logger. */
562
547
  logger: LoggerConfig | Logger;
563
548
  /**
@@ -580,7 +565,7 @@ interface CommonConfig<TAG extends string = string> {
580
565
  }
581
566
  declare const createConfig: <TAG extends string, T extends (ServerConfig | AppConfig) & CommonConfig<TAG>>(config: T) => T;
582
567
 
583
- type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<"strip"> | null, OPT extends FlatObject, M extends Method, SCO extends string, TAG extends string> = {
568
+ type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<"strip"> | null, OPT extends FlatObject, SCO extends string, TAG extends string> = {
584
569
  input: IN;
585
570
  output: OUT;
586
571
  handler: Handler<z.output<ProbableIntersection<MIN, IN>>, z.input<OUT>, OPT>;
@@ -588,6 +573,10 @@ type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<
588
573
  shortDescription?: string;
589
574
  operationId?: string | ((method: Method) => string);
590
575
  } & ({
576
+ method: Method;
577
+ } | {
578
+ methods: Method[];
579
+ }) & ({
591
580
  scopes?: SCO[];
592
581
  } | {
593
582
  scope?: SCO;
@@ -595,7 +584,7 @@ type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<
595
584
  tags?: TAG[];
596
585
  } | {
597
586
  tag?: TAG;
598
- }) & MethodsDefinition<M>;
587
+ });
599
588
  declare class EndpointsFactory<POS extends z.ZodTypeAny, NEG extends z.ZodTypeAny, IN extends IOSchema<"strip"> | null = null, OUT extends FlatObject = {}, SCO extends string = string, TAG extends string = string> {
600
589
  #private;
601
590
  protected resultHandler: ResultHandlerDefinition<POS, NEG>;
@@ -610,7 +599,7 @@ declare class EndpointsFactory<POS extends z.ZodTypeAny, NEG extends z.ZodTypeAn
610
599
  use: <R extends Request<express_serve_static_core.ParamsDictionary, any, any, qs.ParsedQs, Record<string, any>>, S extends Response<any, Record<string, any>>, AOUT extends FlatObject = {}>(middleware: ExpressMiddleware<R, S>, features?: ExpressMiddlewareFeatures<R, S, AOUT> | undefined) => EndpointsFactory<POS, NEG, IN, OUT & AOUT, SCO, TAG>;
611
600
  addExpressMiddleware<R extends Request, S extends Response, AOUT extends FlatObject = {}>(middleware: ExpressMiddleware<R, S>, features?: ExpressMiddlewareFeatures<R, S, AOUT>): EndpointsFactory<POS, NEG, IN, OUT & AOUT, SCO, TAG>;
612
601
  addOptions<AOUT extends FlatObject>(options: AOUT): EndpointsFactory<POS, NEG, IN, OUT & AOUT, SCO, TAG>;
613
- build<BIN extends IOSchema, BOUT extends IOSchema, M extends Method>({ input, handler, output: outputSchema, ...rest }: BuildProps<BIN, BOUT, IN, OUT, M, SCO, TAG>): Endpoint<ProbableIntersection<IN, BIN>, BOUT, OUT, M, POS, NEG, SCO, TAG>;
602
+ build<BIN extends IOSchema, BOUT extends IOSchema>({ input, handler, output: outputSchema, description, shortDescription, operationId, ...rest }: BuildProps<BIN, BOUT, IN, OUT, SCO, TAG>): Endpoint<ProbableIntersection<IN, BIN>, BOUT, OUT, POS, NEG, SCO, TAG>;
614
603
  }
615
604
  declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
616
605
  status: z.ZodLiteral<"success">;
@@ -728,9 +717,9 @@ declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
728
717
  * @desc Responding with array is a bad practice keeping your endpoints from evolving without breaking changes.
729
718
  * @desc The result handler of this factory expects your endpoint to have the property 'items' in the output schema
730
719
  */
731
- declare const arrayEndpointsFactory: EndpointsFactory<z.ZodArray<any, "many"> & {
732
- _def: z.ZodArrayDef<any> & MetaDef<z.ZodArray<any, "many">>;
733
- example: (example: any[]) => z.ZodArray<any, "many"> & any;
720
+ declare const arrayEndpointsFactory: EndpointsFactory<z.ZodArray<z.ZodTypeAny, "many"> & {
721
+ _def: z.ZodArrayDef<z.ZodTypeAny> & MetaDef<z.ZodArray<z.ZodTypeAny, "many">>;
722
+ example: (example: any[]) => z.ZodArray<z.ZodTypeAny, "many"> & any;
734
723
  }, z.ZodString & {
735
724
  _def: z.ZodStringDef & MetaDef<z.ZodString>;
736
725
  example: (example: string) => z.ZodString & any;
@@ -739,12 +728,8 @@ declare const arrayEndpointsFactory: EndpointsFactory<z.ZodArray<any, "many"> &
739
728
  declare const createLogger: (loggerConfig: LoggerConfig) => winston.Logger;
740
729
 
741
730
  declare class DependsOnMethod {
742
- readonly methods: {
743
- [K in Method]?: Endpoint<any, any, any, K, any, any, any, any> | Endpoint<any, any, any, Method, any, any, any, any>;
744
- };
745
- constructor(methods: {
746
- [K in Method]?: Endpoint<any, any, any, K, any, any, any, any> | Endpoint<any, any, any, Method, any, any, any, any>;
747
- });
731
+ readonly endpoints: Partial<Record<Method, AbstractEndpoint>>;
732
+ constructor(endpoints: Partial<Record<Method, AbstractEndpoint>>);
748
733
  }
749
734
 
750
735
  type OriginalStatic = typeof express.static;
@@ -773,7 +758,7 @@ declare const createServer: (config: ServerConfig & CommonConfig, routing: Routi
773
758
  interface DocumentationParams {
774
759
  title: string;
775
760
  version: string;
776
- serverUrl: string;
761
+ serverUrl: string | [string, ...string[]];
777
762
  routing: Routing;
778
763
  config: CommonConfig;
779
764
  /** @default Successful response */
@@ -820,7 +805,7 @@ declare const testEndpoint: <REQ extends Partial<Record<keyof Request<express_se
820
805
  writableEnded: boolean;
821
806
  statusCode: number;
822
807
  statusMessage: string;
823
- } & Record<"status" | "header" | "set" | "json" | "end" | "send" | "setHeader", jest.Mock<any, any, any>> & (RES extends undefined ? {} : RES);
808
+ } & Record<"status" | "header" | "set" | "end" | "send" | "json" | "setHeader", jest.Mock<any, any, any>> & (RES extends undefined ? {} : RES);
824
809
  loggerMock: Record<"error" | "warn" | "debug" | "info", jest.Mock<any, any, any>> & (LOG extends undefined ? {} : LOG);
825
810
  }>;
826
811
 
@@ -890,4 +875,4 @@ declare namespace proprietarySchemas {
890
875
  };
891
876
  }
892
877
 
893
- export { AbstractEndpoint, BasicSecurity, BearerSecurity, CommonConfig, CookieSecurity, CustomHeaderSecurity, DependsOnMethod, DependsOnMethodError, Documentation, DocumentationError, EndpointsFactory, FlatObject, IOSchema, InputSecurity, InputValidationError, Integration, LoggerConfig, Method, MiddlewareDefinition, OAuth2Security, OpenIdSecurity, OutputValidationError, ResultHandlerDefinition, Routing, RoutingError, ServeStatic, ZodDateInDef, ZodDateOutDef, ZodFileDef, ZodUploadDef, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createLogger, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
878
+ export { AbstractEndpoint, BasicSecurity, BearerSecurity, CommonConfig, CookieSecurity, CustomHeaderSecurity, DependsOnMethod, Documentation, DocumentationError, EndpointsFactory, FlatObject, IOSchema, InputSecurity, InputValidationError, Integration, LoggerConfig, Method, MiddlewareDefinition, OAuth2Security, OpenIdSecurity, OutputValidationError, ResultHandlerDefinition, Routing, RoutingError, ServeStatic, ZodDateInDef, ZodDateOutDef, ZodFileDef, ZodUploadDef, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createLogger, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
package/dist/index.js CHANGED
@@ -1,20 +1,8 @@
1
- "use strict";var Ar=Object.create;var Pe=Object.defineProperty;var Ir=Object.getOwnPropertyDescriptor;var Cr=Object.getOwnPropertyNames;var Nr=Object.getPrototypeOf,Mr=Object.prototype.hasOwnProperty;var Mt=(e,t)=>{for(var r in t)Pe(e,r,{get:t[r],enumerable:!0})},wt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Cr(t))!Mr.call(e,n)&&n!==r&&Pe(e,n,{get:()=>t[n],enumerable:!(o=Ir(t,n))||o.enumerable});return e};var R=(e,t,r)=>(r=e!=null?Ar(Nr(e)):{},wt(t||!e||!e.__esModule?Pe(r,"default",{value:e,enumerable:!0}):r,e)),wr=e=>wt(Pe({},"__esModule",{value:!0}),e);var un={};Mt(un,{AbstractEndpoint:()=>X,DependsOnMethod:()=>le,DependsOnMethodError:()=>se,Documentation:()=>Fe,DocumentationError:()=>P,EndpointsFactory:()=>pe,InputValidationError:()=>U,Integration:()=>Be,OutputValidationError:()=>V,RoutingError:()=>Q,ServeStatic:()=>me,arrayEndpointsFactory:()=>Gt,arrayResultHandler:()=>ze,attachRouting:()=>Xt,createConfig:()=>zt,createHttpError:()=>Zr.default,createLogger:()=>Oe,createMiddleware:()=>Le,createResultHandler:()=>De,createServer:()=>er,defaultEndpointsFactory:()=>_t,defaultResultHandler:()=>W,ez:()=>Ct,getExamples:()=>k,getMessageFromError:()=>L,getStatusCodeFromError:()=>xe,testEndpoint:()=>mr,withMeta:()=>j});module.exports=wr(un);var Dt={silent:!0,warn:!0,debug:!0},zt=e=>e;var F=require("zod");var kt=require("http-errors"),Ht=require("crypto"),b=require("zod");var Ze=require("ramda"),E="expressZodApiMeta",Dr=e=>{let t=e.constructor,r=(0,Ze.clone)(e._def);return r[E]=r[E]||{examples:[]},new t(r)},j=e=>{let t=Dr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=j(t);return o._def[E].examples.push(r),o}}}),t},vt=e=>E in e._def?typeof e._def[E]=="object"&&e._def[E]!==null:!1,jt=(e,t)=>{if(!vt(e))return;let r=e._def;return t in r[E]?r[E][t]:void 0},Ee=(e,t)=>{if(!vt(e))return t;let r=j(t),o=ye(r._def[E].examples,e._def[E].examples);if(r._def[E].examples=[],o.type==="single")r._def[E].examples=o.value;else for(let[n,s]of o.value)r._def[E].examples.push((0,Ze.mergeDeepRight)({...n},{...s}));return r};var Lt=R(require("mime")),J=Lt.default.getType("json")||"application/json",ge="multipart/form-data";var C=require("zod"),zr="ZodUpload",vr=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.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",oe=class e extends C.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==C.ZodParsedType.object||!vr(r.data)?((0,C.addIssueToContext)(r,{code:C.ZodIssueCode.custom,message:`Expected file upload, received ${r.parsedType}`}),C.INVALID):(0,C.OK)(r.data)}static create=()=>new e({typeName:zr})};var et=/:([A-Za-z0-9_]+)/g,jr=e=>{let r=(e.header("content-type")||"").slice(0,ge.length).toLowerCase()===ge;return"files"in e&&r},Ae={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Lr=["body","query","params"],tt=e=>e.method.toLowerCase(),rt=e=>e.startsWith("x-"),kr=e=>Object.entries(e.headers).reduce((t,[r,o])=>rt(r)?{...t,[r]:o}:t,{}),Ut=(e,t)=>{let r=tt(e);if(r==="options")return{};let o=Lr;return r in Ae&&(o=Ae[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?jr(e):!0).reduce((n,s)=>({...n,...s==="headers"?kr(e):e[s]}),{})},ot=e=>typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(Dt).includes(e.level)&&typeof e.color=="boolean",Ie=e=>!isNaN(e.getTime()),ne=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),L=e=>e instanceof b.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof V?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,xe=e=>e instanceof kt.HttpError?e.statusCode:e instanceof U?400:500,nt=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
1
+ "use strict";var Zr=Object.create;var Re=Object.defineProperty;var Ar=Object.getOwnPropertyDescriptor;var Er=Object.getOwnPropertyNames;var Ir=Object.getPrototypeOf,Cr=Object.prototype.hasOwnProperty;var It=(e,t)=>{for(var r in t)Re(e,r,{get:t[r],enumerable:!0})},Ct=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Er(t))!Cr.call(e,n)&&n!==r&&Re(e,n,{get:()=>t[n],enumerable:!(o=Ar(t,n))||o.enumerable});return e};var I=(e,t,r)=>(r=e!=null?Zr(Ir(e)):{},Ct(t||!e||!e.__esModule?Re(r,"default",{value:e,enumerable:!0}):r,e)),wr=e=>Ct(Re({},"__esModule",{value:!0}),e);var mn={};It(mn,{AbstractEndpoint:()=>ee,DependsOnMethod:()=>ce,Documentation:()=>Ke,DocumentationError:()=>P,EndpointsFactory:()=>pe,InputValidationError:()=>H,Integration:()=>Ge,OutputValidationError:()=>V,RoutingError:()=>J,ServeStatic:()=>le,arrayEndpointsFactory:()=>Ft,arrayResultHandler:()=>ze,attachRouting:()=>Jt,createConfig:()=>Nt,createLogger:()=>be,createMiddleware:()=>je,createResultHandler:()=>De,createServer:()=>Qt,defaultEndpointsFactory:()=>Kt,defaultResultHandler:()=>X,ez:()=>At,getExamples:()=>L,getMessageFromError:()=>k,getStatusCodeFromError:()=>he,testEndpoint:()=>lr,withMeta:()=>j});module.exports=wr(mn);var wt={silent:!0,warn:!0,debug:!0},Nt=e=>e;var K=require("zod");var Mt=require("http-errors"),vt=require("crypto"),S=require("zod");var Pe=require("ramda"),A="expressZodApiMeta",Nr=e=>{let t=e.constructor,r=(0,Pe.clone)(e._def);return r[A]=r[A]||{examples:[]},new t(r)},j=e=>{let t=Nr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=j(t);return o._def[A].examples.push(r),o}}}),t},Dt=e=>A in e._def?typeof e._def[A]=="object"&&e._def[A]!==null:!1,zt=(e,t)=>{if(!Dt(e))return;let r=e._def;return t in r[A]?r[A][t]:void 0},Ze=(e,t)=>{if(!Dt(e))return t;let r=j(t),o=fe(r._def[A].examples,e._def[A].examples);if(r._def[A].examples=[],o.type==="single")r._def[A].examples=o.value;else for(let[n,s]of o.value)r._def[A].examples.push((0,Pe.mergeDeepRight)({...n},{...s}));return r};var Y="application/json",ye="multipart/form-data";var C=require("zod"),Dr="ZodUpload",zr=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.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",ne=class e extends C.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==C.ZodParsedType.object||!zr(r.data)?((0,C.addIssueToContext)(r,{code:C.ZodIssueCode.custom,message:`Expected file upload, received ${r.parsedType}`}),C.INVALID):(0,C.OK)(r.data)}static create=()=>new e({typeName:Dr})};var Mr=e=>{let r=(e.header("content-type")||"").slice(0,ye.length).toLowerCase()===ye;return"files"in e&&r},Ae={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},vr=["body","query","params"],Xe=e=>e.method.toLowerCase(),et=e=>e.startsWith("x-"),jr=e=>Object.entries(e.headers).reduce((t,[r,o])=>et(r)?{...t,[r]:o}:t,{}),jt=(e,t)=>{let r=Xe(e);if(r==="options")return{};let o=vr;return r in Ae&&(o=Ae[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Mr(e):!0).reduce((n,s)=>({...n,...s==="headers"?jr(e):e[s]}),{})},tt=e=>typeof e=="object"&&e!==null&&"level"in e&&typeof e.level=="string"&&Object.keys(wt).includes(e.level)&&"color"in e&&typeof e.color=="boolean",Ee=e=>!isNaN(e.getTime()),se=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),k=e=>e instanceof S.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof V?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,he=e=>(0,Mt.isHttpError)(e)?e.statusCode:e instanceof H?400:500,rt=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
2
2
  ${o.stack}
3
- `,{url:t.url,payload:r})},k=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=jt(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},ye=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}},st=e=>{let t=e.match(et);return t?t.map(r=>r.slice(1)):[]},he=e=>e.reduce((t,r)=>t||r,!1),q=e=>e instanceof b.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof b.z.ZodUnion?he(e.options.map(q)):e instanceof b.z.ZodIntersection?he([e._def.left,e._def.right].map(q)):!1,w=e=>e instanceof oe?!0:e instanceof b.z.ZodObject?he(Object.values(e.shape).map(w)):e instanceof b.z.ZodUnion?he(e.options.map(w)):e instanceof b.z.ZodIntersection?he([e._def.left,e._def.right].map(w)):e instanceof b.z.ZodOptional||e instanceof b.z.ZodNullable?w(e.unwrap()):e instanceof b.z.ZodEffects||e instanceof b.z.ZodTransformer?w(e._def.schema):e instanceof b.z.ZodRecord?w(e._def.valueType):e instanceof b.z.ZodArray?w(e._def.type):e instanceof b.z.ZodDefault?w(e._def.innerType):!1,Te=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,H=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Ce=e=>(0,Ht.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ne=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},it=e=>typeof e=="string"?{message:e}:e||{};var Q=class extends Error{name="RoutingError"},se=class extends Q{name="DependsOnMethodError"},P=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
- Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},B=class extends Error{name="IOSchemaError"},V=class extends B{name="OutputValidationError";originalError;constructor(t){super(L(t)),this.originalError=t}},U=class extends B{name="InputValidationError";originalError;constructor(t){super(L(t)),this.originalError=t}},ie=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var K=e=>typeof e=="object"&&e!==null,Me=e=>({and:e.reduce((t,r)=>t.concat(K(r)&&"and"in r?r.and:r),[])}),we=(e,t)=>{if(K(e)){if("and"in e)return{and:e.and.map(r=>K(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>K(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},at=e=>e.and.reduce((t,r)=>{let o=ye(t.or,K(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(Me),t},{or:[]}),ae=(e,t)=>{if(K(e)){if("and"in e){if(K(t)){if("and"in t)return Me([e,t]);if("or"in t)return ae(at(e),t)}return Me([e,t])}if("or"in e){if(K(t)){if("and"in t)return ae(t,e);if("or"in t){let r=ye(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(Me)}}}return ae(e,{and:[t]})}}return K(t)&&("and"in t||"or"in t)?ae(t,e):{and:[e,t]}};var M=require("zod");var de={positive:200,negative:400},De=e=>e,W=De({getPositiveResponse:e=>{let t=k({schema:e}),r=j(M.z.object({status:M.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>j(M.z.object({status:M.z.literal("error"),error:M.z.object({message:M.z.string()})})).example({status:"error",error:{message:L(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(de.positive).json({status:"success",data:r});return}let a=xe(e);nt({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:L(e)}})}}),ze=De({getPositiveResponse:e=>{let t=k({schema:e}),r=j("shape"in e&&"items"in e.shape&&e.shape.items instanceof M.z.ZodArray?e.shape.items:M.z.array(M.z.any()));return t.reduce((o,n)=>typeof n=="object"&&n!==null&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},getNegativeResponse:()=>j(M.z.string()).example(L(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=xe(r);nt({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).send(r.message);return}"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),ve=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
- Original error: ${e.originalError.message}.`:""))};var Kt=(e,t=[J])=>{if(e instanceof F.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},X=class{},je=class extends X{#e;#t=[];#a=[];#n=[];#d;#p;#c;#l;#r;#s=[];#i=[];#o;constructor({middlewares:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,description:a,shortDescription:p,...d}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:l,schema:g})=>{if(q(g))throw new B(`Using transformations on the top level of endpoint ${l} is not allowed.`)}),this.#n=t,this.#o=d.operationId;let c={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#d={input:w(r)?[ge]:[J],positive:Kt(c.positive),negative:Kt(c.negative)},this.#r={input:r,output:o,positive:c.positive instanceof F.z.ZodType?c.positive:c.positive.schema,negative:c.negative instanceof F.z.ZodType?c.negative:c.negative.schema},this.#p={positive:c.positive instanceof F.z.ZodType?de.positive:c.positive.statusCode||de.positive,negative:c.negative instanceof F.z.ZodType?de.negative:c.negative.statusCode||de.negative},this.#c=n,this.#l=s,this.#e={long:a,short:p},"scopes"in d&&d.scopes&&this.#s.push(...d.scopes),"scope"in d&&d.scope&&this.#s.push(d.scope),"tags"in d&&d.tags&&this.#i.push(...d.tags),"tag"in d&&d.tag&&this.#i.push(d.tag),"methods"in d?this.#t=d.methods:this.#t=[d.method]}_setSiblingMethods(t){this.#a=t}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return this.#r[t]}getMimeTypes(t){return this.#d[t]}getStatusCode(t){return this.#p[t]}getSecurity(){return this.#n.reduce((t,r)=>r.security?ae(t,r.security):t,{and:[]})}getScopes(){return this.#s}getTags(){return this.#i}getOperationId(t){return typeof this.#o=="function"?this.#o(t):this.#o}#m(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#t.concat(this.#a).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#r.output.parseAsync(t)}catch(r){throw r instanceof F.z.ZodError?new V(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.#n){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(l){throw l instanceof F.z.ZodError?new U(l):l}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#r.input.parseAsync(t)}catch(s){throw s instanceof F.z.ZodError?new U(s):s}return this.#c({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.#l.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){ve({logger:n,response:o,error:new ie(ne(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=tt(t),a,p=null;if(n.cors){let c=this.#m();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let l in c)r.set(l,c[l])}let d=Ut(t,n.inputSources);try{let{options:c,isStreamClosed:l}=await this.#f({method:s,input:d,request:t,response:r,logger:o});if(l)return;if(s==="options"){r.status(200).end();return}a=await this.#u(await this.#y({input:d,options:c,logger:o}))}catch(c){p=ne(c)}await this.#g({input:d,output:a,request:t,response:r,error:p,logger:o})}};var Ft=["get","post","put","delete","patch"];var dt=require("zod");var $t=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Ee(s,n),o)};var Le=e=>{if(q(e.input))throw new B("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var pe=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:dt.z.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,g=>{if(g&&g instanceof Error)return c(o(g));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(Le({input:dt.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new je({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:$t(s,t),...n})}},_t=new pe(W),Gt=new pe(ze);var qt=require("util"),ce=require("triple-beam"),Se=R(require("winston")),{combine:Hr,colorize:Ur,timestamp:Kr,printf:Fr}=Se.default.format,Oe=e=>{let t=s=>{let{[ce.LEVEL]:a,[ce.MESSAGE]:p,[ce.SPLAT]:d,...c}=s;return(0,qt.inspect)(c,!1,1,e.color)},r=s=>Fr(({timestamp:a,message:p,level:d,durationMs:c,...l})=>(typeof p=="object"&&(l={...l,...p},p="[No message]"),`${a} ${d}: ${p}`+(c===void 0?"":` duration: ${c}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[Kr()],n={handleExceptions:!0};switch(e.color&&o.push(Ur()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=Hr(...o),Se.default.createLogger({silent:e.level==="silent",levels:Se.default.config.npm.levels,transports:[new Se.default.transports.Console(n)],exitOnError:!1})};var le=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new se(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
6
- This error should prevent mistakes during the development process.
7
- Example:
8
-
9
- new ${this.constructor.name}({
10
- ${r}: endpointsFactory.build({
11
- methods: ['${r}', `+((t[r]?.getMethods()||[]).map(n=>`'${n}'`).join(", ")||"...")+`]
12
- // or method: '${r}'
13
- ...
14
- })
15
- });
16
- `)})}};var Vt=R(require("express")),me=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Vt.default.static(...this.params))}};var ee=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new Q(`Routing elements should not contain '/' character.
17
- The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof X){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof me)r&&a.apply(p,r);else if(a instanceof le){if(Object.entries(a.methods).forEach(([d,c])=>{t(c,p,d)}),n&&Object.keys(a.methods).length>0){let[d,...c]=Object.keys(a.methods),l=a.methods[d];l._setSiblingMethods(c),t(l,p,"options")}}else ee({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var Bt=()=>`
3
+ `,{url:t.url,payload:r})},L=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=zt(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},fe=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}},ge=e=>e.reduce((t,r)=>t||r,!1),q=e=>e instanceof S.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof S.z.ZodUnion?ge(e.options.map(q)):e instanceof S.z.ZodIntersection?ge([e._def.left,e._def.right].map(q)):!1,D=e=>e instanceof ne?!0:e instanceof S.z.ZodObject?ge(Object.values(e.shape).map(D)):e instanceof S.z.ZodUnion?ge(e.options.map(D)):e instanceof S.z.ZodIntersection?ge([e._def.left,e._def.right].map(D)):e instanceof S.z.ZodOptional||e instanceof S.z.ZodNullable?D(e.unwrap()):e instanceof S.z.ZodEffects||e instanceof S.z.ZodTransformer?D(e._def.schema):e instanceof S.z.ZodRecord?D(e._def.valueType):e instanceof S.z.ZodArray?D(e._def.type):e instanceof S.z.ZodDefault?D(e._def.innerType):!1,xe=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,U=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Ie=e=>(0,vt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ce=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},ot=e=>typeof e=="string"?{message:e}:e||{};var J=class extends Error{name="RoutingError"},P=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
+ Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},G=class extends Error{name="IOSchemaError"},V=class extends G{name="OutputValidationError";originalError;constructor(t){super(k(t)),this.originalError=t}},H=class extends G{name="InputValidationError";originalError;constructor(t){super(k(t)),this.originalError=t}},ie=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var kt=e=>typeof e=="object"&&e!==null,Q=e=>kt(e)&&"or"in e,W=e=>kt(e)&&"and"in e,we=e=>({and:e.reduce((t,r)=>t.concat(W(r)?r.and:r),[])}),Ne=(e,t)=>W(e)?{and:e.and.map(r=>Q(r)?{or:r.or.map(t)}:t(r))}:Q(e)?{or:e.or.map(r=>W(r)?{and:r.and.map(t)}:t(r))}:t(e),nt=e=>e.and.reduce((t,r)=>{let o=fe(t.or,Q(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(we),t},{or:[]}),ae=(e,t)=>{if(W(e))return W(t)?we([e,t]):Q(t)?ae(nt(e),t):we([e,t]);if(Q(e)){if(W(t))return ae(t,e);if(Q(t)){let{type:r,value:o}=fe(e.or,t.or);return{or:r==="single"?o:o.map(we)}}return ae(e,{and:[t]})}return W(t)||Q(t)?ae(t,e):{and:[e,t]}};var N=require("zod");var de={positive:200,negative:400},De=e=>e,X=De({getPositiveResponse:e=>{let t=L({schema:e}),r=j(N.z.object({status:N.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>j(N.z.object({status:N.z.literal("error"),error:N.z.object({message:N.z.string()})})).example({status:"error",error:{message:k(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(de.positive).json({status:"success",data:r});return}let a=he(e);rt({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:k(e)}})}}),ze=De({getPositiveResponse:e=>{let t=L({schema:e}),r=j("shape"in e&&"items"in e.shape&&e.shape.items instanceof N.z.ZodArray?e.shape.items:N.z.array(N.z.any()));return t.reduce((o,n)=>typeof n=="object"&&n!==null&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},getNegativeResponse:()=>j(N.z.string()).example(k(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=he(r);rt({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),Me=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
+ Original error: ${e.originalError.message}.`:""))};var Lt=(e,t=[Y])=>{if(e instanceof K.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},ee=class{},ve=class extends ee{#e;#r;#o;#n;#s;#i;#a;#t;#d;#p;#c;#l=[];constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,getOperationId:a=()=>{},scopes:d=[],middlewares:p=[],tags:c=[],description:l,shortDescription:g}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:h,schema:R})=>{if(q(R))throw new G(`Using transformations on the top level of endpoint ${h} is not allowed.`)}),this.#i=n,this.#a=s,this.#o=p,this.#c=a,this.#r=t,this.#d=d,this.#p=c,this.#e={long:l,short:g};let m={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#n={input:D(r)?[ye]:[Y],positive:Lt(m.positive),negative:Lt(m.negative)},this.#t={input:r,output:o,positive:m.positive instanceof K.z.ZodType?m.positive:m.positive.schema,negative:m.negative instanceof K.z.ZodType?m.negative:m.negative.schema},this.#s={positive:m.positive instanceof K.z.ZodType?de.positive:m.positive.statusCode||de.positive,negative:m.negative instanceof K.z.ZodType?de.negative:m.negative.statusCode||de.negative}}_setSiblingMethods(t){this.#l=t}getDescription(t){return this.#e[t]}getMethods(){return this.#r}getSchema(t){return this.#t[t]}getMimeTypes(t){return this.#n[t]}getStatusCode(t){return this.#s[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?ae(t,r.security):t,{and:[]})}getScopes(){return this.#d}getTags(){return this.#p}getOperationId(t){return this.#c(t)}#m(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#r.concat(this.#l).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#t.output.parseAsync(t)}catch(r){throw r instanceof K.z.ZodError?new V(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s}){let a={},d=!1;for(let p of this.#o){if(t==="options"&&p.type==="proprietary")continue;let c;try{c=await p.input.parseAsync(r)}catch(l){throw l instanceof K.z.ZodError?new H(l):l}if(Object.assign(a,await p.middleware({input:c,options:a,request:o,response:n,logger:s})),d="writableEnded"in n&&n.writableEnded,d){s.warn(`The middleware ${p.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:d}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#t.input.parseAsync(t)}catch(s){throw s instanceof K.z.ZodError?new H(s):s}return this.#i({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.#a.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(d){Me({logger:n,response:o,error:new ie(se(d).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=Xe(t),a=null,d=null;if(n.cors){let c=this.#m();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let l in c)r.set(l,c[l])}let p=jt(t,n.inputSources);try{let{options:c,isStreamClosed:l}=await this.#f({method:s,input:p,request:t,response:r,logger:o});if(l)return;if(s==="options"){r.status(200).end();return}a=await this.#u(await this.#y({input:p,options:c,logger:o}))}catch(c){d=se(c)}await this.#g({input:p,output:a,request:t,response:r,error:d,logger:o})}};var Ut=["get","post","put","delete","patch"];var st=require("zod");var Ht=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Ze(s,n),o)};var je=e=>{if(q(e.input))throw new G("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var pe=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:st.z.object({}),middleware:async({request:a,response:d})=>new Promise((p,c)=>{t(a,d,g=>{if(g&&g instanceof Error)return c(o(g));p(n(a,d))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(je({input:st.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:s,operationId:a,...d}){let{middlewares:p,resultHandler:c}=this,l="methods"in d?d.methods:[d.method],g=typeof a=="function"?a:()=>a,m="scopes"in d?d.scopes:"scope"in d&&d.scope?[d.scope]:[],h="tags"in d?d.tags:"tag"in d&&d.tag?[d.tag]:[];return new ve({handler:r,middlewares:p,outputSchema:o,resultHandler:c,scopes:m,tags:h,methods:l,getOperationId:g,description:n,shortDescription:s,inputSchema:Ht(p,t)})}},Kt=new pe(X),Ft=new pe(ze);var $t=require("util"),Te=I(require("winston")),{combine:kr,colorize:Lr,timestamp:Ur,printf:Hr}=Te.default.format,be=e=>{let t=s=>{let{[Symbol.for("level")]:a,[Symbol.for("message")]:d,[Symbol.for("splat")]:p,...c}=s;return(0,$t.inspect)(c,!1,1,e.color)},r=s=>Hr(({timestamp:a,message:d,level:p,durationMs:c,...l})=>(typeof d=="object"&&(l={...l,...d},d="[No message]"),`${a} ${p}: ${d}`+(c===void 0?"":` duration: ${c}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[Ur()],n={handleExceptions:!0};switch(e.color&&o.push(Lr()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=kr(...o),Te.default.createLogger({silent:e.level==="silent",levels:Te.default.config.npm.levels,transports:[new Te.default.transports.Console(n)],exitOnError:!1})};var ce=class{constructor(t){this.endpoints=t}};var _t=I(require("express")),le=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,_t.default.static(...this.params))}};var te=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new J(`The entry '${s}' must avoid having slashes \u2014 use nesting instead.`);let d=`${o||""}${s?`/${s}`:""}`;if(a instanceof ee){let p=a.getMethods().slice();n&&p.push("options"),p.forEach(c=>{t(a,d,c)})}else if(a instanceof le)r&&a.apply(d,r);else if(a instanceof ce){if(Object.entries(a.endpoints).forEach(([p,c])=>{if(!c.getMethods().includes(p))throw new J(`Endpoint assigned to ${p} method of ${d} must support ${p} method.`);t(c,d,p)}),n&&Object.keys(a.endpoints).length>0){let[p,...c]=Object.keys(a.endpoints),l=a.endpoints[p];l._setSiblingMethods(c),t(l,d,"options")}}else te({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:d})})};var qt=()=>`
18
6
  \x1B[94m\x1B[39m
19
7
  \x1B[94m\x1B[39m
20
8
  \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
@@ -27,11 +15,11 @@ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let
27
15
  \x1B[95m8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P' d8888888888 "Y88P" "Y88888 d88P 888 888 8888888\x1B[39m\x1B[94m\x1B[39m
28
16
  \x1B[94m 888\x1B[39m
29
17
  \x1B[94m 888\x1B[3m Proudly supports transgender community.\x1B[23m\x1B[39m
30
- \x1B[94m\x1B[3mfor Adriana \x1B[23m888\x1B[3m Start your API server with I/O schema validation and custom middlewares in minutes.\x1B[23m\x1B[39m\x1B[90m\x1B[39m
18
+ \x1B[94m\x1B[3mfor Katie \x1B[23m888\x1B[3m Start your API server with I/O schema validation and custom middlewares in minutes.\x1B[23m\x1B[39m\x1B[90m\x1B[39m
31
19
  \x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
32
20
  \x1B[0m\x1B[0m
33
21
  \x1B[0m\x1B[0m
34
- `.trim();var pt=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Bt()),ee({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var ke=R(require("express")),Yt=R(require("compression")),Jt=R(require("express-fileupload")),Qt=R(require("https"));var ct=R(require("http-errors")),$r=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,ct.default)(400,ne(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Wt=(e,t)=>(r,o)=>{let n=(0,ct.default)(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){ve({response:o,logger:t,error:new ie(ne(s).message,n)})}},Xt=(e,t)=>{let r=ot(e.logger)?Oe(e.logger):e.logger;pt({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||W;return{notFoundHandler:Wt(o,r),logger:r}},er=(e,t)=>{let r=ot(e.logger)?Oe(e.logger):e.logger,o=(0,ke.default)();o.disable("x-powered-by");let n=e.errorHandler||W,s=e.server.compression?(0,Yt.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,ke.json)(),p=e.server.upload?(0,Jt.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use($r(n,r)),pt({app:o,routing:t,logger:r,config:e}),o.use(Wt(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=Qt.default.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}};var lr=require("openapi3-ts/oas30");var $=require("openapi3-ts/oas30"),ue=require("ramda"),x=require("zod");var T=require("zod");var lt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,_r="ZodDateIn",He=class e extends T.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==T.ZodParsedType.string)return(0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_type,expected:T.ZodParsedType.string,received:o.parsedType}),T.INVALID;lt.test(o.data)||((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ie(n)?{status:r.value,value:n}:((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_date}),T.INVALID)}static create=()=>new e({typeName:_r})};var te=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>te({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var tr=50,or="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Gr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},nr=e=>e.replace(et,t=>`{${t.slice(1)}}`),qr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Vr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Br=()=>({format:"any"}),Yr=e=>{if(e.isResponse)throw new P({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Jr=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new P({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},Qr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Wr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),Xr=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),eo=({schema:e,next:t})=>t({schema:e.unwrap()}),to=({schema:e,next:t})=>t({schema:e._def.innerType}),ro=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),rr=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),oo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),no=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Te(s)?s instanceof x.z.ZodOptional:s.isOptional())});return{type:"object",properties:Ue({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},so=()=>({type:"string",nullable:!0,format:"null"}),io=e=>{if(e.isResponse)throw new P({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:lt.source,externalDocs:{url:or}}},ao=e=>{if(!e.isResponse)throw new P({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:or}}},po=e=>{throw new P({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},co=()=>({type:"boolean"}),lo=()=>({type:"integer",format:"bigint"}),mo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.z.ZodEnum||e instanceof x.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ue({schema:x.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.z.ZodLiteral)return{type:"object",properties:Ue({schema:x.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.z.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.z.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ue({schema:x.z.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},uo=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),fo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${(0,$.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},yo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:g}}})=>{let y=g.find(h=>h.kind==="regex"),S=g.find(h=>h.kind==="datetime"),I=y?y.regex:S?S.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...I&&{pattern:`/${I.source}/${I.flags}`}}},go=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ue=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),ho=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Gr?.[t]},xo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,$.isSchemaObject)(o)){let s=Ne({effect:n,sample:ho(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.z.any()})}if(!t&&n.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},To=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),So=({schema:e,next:t})=>t({schema:e.unwrap()}),Oo=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},sr=(e,t,r=[])=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?(0,ue.omit)(r,s):s}}),{})}},bo=(e,t,r)=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}},be=(e,t)=>{if(e instanceof x.z.ZodObject)return e;let r;if(e instanceof x.z.ZodUnion||e instanceof x.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>be(o,t)).reduce((o,n)=>o.merge(n.partial()),x.z.object({}));else if(e instanceof x.z.ZodEffects){if(q(e))throw new P({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=be(e._def.schema,t)}else r=be(e._def.left,t).merge(be(e._def.right,t));return Ee(e,r)},ir=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=be(c,{path:e,method:t,isResponse:!1}).shape,g=st(e),y=o.includes("query"),S=o.includes("params"),I=o.includes("headers"),h=m=>S&&g.includes(m),z=m=>I&&rt(m);return Object.keys(l).filter(m=>y||h(m)).map(m=>{let O=te({schema:l[m],isResponse:!1,rules:ut,onEach:ft,onMissing:yt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),v=p==="components"?a(H(e,t,`${d} ${m}`),O):O;return{name:m,in:h(m)?"path":z(m)?"header":"query",required:!l[m].isOptional(),description:(0,$.isSchemaObject)(O)&&O.description||`${t.toUpperCase()} ${e} ${d}`,schema:v,...bo(c,!1,m)}})},ut={ZodString:yo,ZodNumber:go,ZodBigInt:lo,ZodBoolean:co,ZodDateIn:io,ZodDateOut:ao,ZodNull:so,ZodArray:uo,ZodTuple:fo,ZodRecord:mo,ZodObject:no,ZodLiteral:oo,ZodIntersection:Xr,ZodUnion:Qr,ZodFile:Jr,ZodUpload:Yr,ZodAny:Br,ZodDefault:qr,ZodEnum:rr,ZodNativeEnum:rr,ZodEffects:xo,ZodOptional:eo,ZodNullable:ro,ZodDiscriminatedUnion:Wr,ZodBranded:So,ZodDate:po,ZodCatch:Vr,ZodPipeline:To,ZodLazy:Oo,ZodReadonly:to},ft=({schema:e,isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof x.z.ZodLazy,s=r.type!==void 0,a=t&&Te(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:k({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},yt=({schema:e,...t})=>{throw new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},mt=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r=e.properties?(0,ue.omit)(t,e.properties):void 0,o=e.example?(0,ue.omit)(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>mt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>mt(p,t)):void 0;return(0,ue.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},ar=e=>(0,$.isSchemaObject)(e)?(0,ue.omit)(["example"],e):e,gt=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),g=ar(te({schema:c,isResponse:!0,rules:ut,onEach:ft,onMissing:yt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),y=sr(c,!0),S=p==="components"?a(H(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((I,h)=>({...I,[h]:{schema:S,...y}}),{})}},Ro=()=>({type:"http",scheme:"basic"}),Po=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Zo=({name:e})=>({type:"apiKey",in:"query",name:e}),Eo=({name:e})=>({type:"apiKey",in:"header",name:e}),Ao=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Io=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Co=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),dr=e=>{let t={basic:Ro,bearer:Po,input:Zo,header:Eo,cookie:Ao,openid:Io,oauth2:Co};return we(e,r=>t[r.type](r))},Ke=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Ke(at(e))}return Ke({or:[e]})},pr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=st(t),c=ar(mt(te({schema:r.getSchema("input"),isResponse:!1,rules:ut,onEach:ft,onMissing:yt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=sr(r.getSchema("input"),!1,d),g=a==="components"?s(H(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((y,S)=>({...y,[S]:{schema:g,...l}}),{})}},cr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),ht=e=>e.length<=tr?e:e.slice(0,tr-1)+"\u2026";var Fe=class extends lr.OpenApiBuilder{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o){if(o in this.lastOperationIdSuffixes)throw new P({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return this.lastOperationIdSuffixes[o]=1,o}let n=H(t,r);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Ce}){super(),this.addInfo({title:o,version:n}).addServer({url:s}),ee({routing:t,onEndpoint:(y,S,I)=>{let h=I,z={path:S,method:h,endpoint:y,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,O]=["short","long"].map(y.getDescription.bind(y)),v=r.inputSources?.[h]||Ae[h],fe=ir({...z,inputSources:v}),N={operationId:this.ensureUniqOperationId(S,h,y.getOperationId(h)),responses:{[y.getStatusCode("positive")]:gt({...z,clue:a,isPositive:!0}),[y.getStatusCode("negative")]:gt({...z,clue:p,isPositive:!1})}};O&&(N.description=O,d&&m===void 0&&(N.summary=ht(O))),m&&(N.summary=ht(m)),y.getTags().length>0&&(N.tags=y.getTags()),fe.length>0&&(N.parameters=fe),v.includes("body")&&(N.requestBody=pr(z));let Re=Ke(we(dr(y.getSecurity()),Xe=>{let Nt=this.ensureUniqSecuritySchemaName(Xe),Er=["oauth2","openIdConnect"].includes(Xe.type)?y.getScopes():[];return this.addSecurityScheme(Nt,Xe),{name:Nt,scopes:Er}}));Re.length>0&&(N.security=Re);let We=nr(S);this.addPath(We,{[h]:N})}}),this.rootDoc.tags=r.tags?cr(r.tags):[]}};var xt=R(require("http"));var No=e=>({method:"GET",header:jest.fn(()=>J),...e}),Mo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:xt.default.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=xt.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},mr=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=No(t),p=Mo(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};var G=R(require("typescript"));var D=R(require("typescript")),i=D.default.factory,re=[i.createModifier(D.default.SyntaxKind.ExportKeyword)],wo=[i.createModifier(D.default.SyntaxKind.AsyncKeyword)],Do=[i.createModifier(D.default.SyntaxKind.PublicKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],ur=[i.createModifier(D.default.SyntaxKind.ProtectedKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],zo=i.createTemplateHead(""),vo=i.createTemplateTail(""),jo=i.createTemplateMiddle(" "),Tt=e=>i.createTemplateLiteralType(zo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?vo:jo))),St=Tt(["M","P"]),$e=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),_e=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat($e(o,e[o],t)),[]),Ot=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),fr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),bt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),Rt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],D.default.NodeFlags.Const),Pt=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Ge=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,t),yr=(e,t,r)=>i.createPropertyDeclaration(Do,e,void 0,t,r),gr=(e,t,r=[])=>i.createClassDeclaration(re,e,void 0,void 0,[t,...r]),hr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),xr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(D.default.SyntaxKind.AnyKeyword)]),Zt=(e,t,r)=>i.createInterfaceDeclaration(re,e,void 0,t,r),Tr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Sr=(e,t)=>i.createArrowFunction(wo,void 0,e.map(r=>$e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Et=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,_e({acc:void 0,key:void 0}),void 0,void 0,t),r]);var f=R(require("typescript")),Pr=require("zod");var _=R(require("typescript")),{factory:qe}=_.default,At=(e,t)=>{_.default.addSyntheticLeadingComment(e,_.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ve=(e,t,r)=>{let o=qe.createTypeAliasDeclaration(void 0,qe.createIdentifier(t),void 0,e);return r&&At(o,r),o},Or=(e,t)=>{let r=_.default.createSourceFile("print.ts","",_.default.ScriptTarget.Latest,!1,_.default.ScriptKind.TS);return _.default.createPrinter(t).printNode(_.default.EmitHint.Unspecified,e,r)},Lo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,br=e=>Lo.test(e)?qe.createIdentifier(e):qe.createStringLiteral(e);var{factory:u}=f.default,ko={[f.default.SyntaxKind.AnyKeyword]:"",[f.default.SyntaxKind.BigIntKeyword]:BigInt(0),[f.default.SyntaxKind.BooleanKeyword]:!1,[f.default.SyntaxKind.NumberKeyword]:0,[f.default.SyntaxKind.ObjectKeyword]:{},[f.default.SyntaxKind.StringKeyword]:"",[f.default.SyntaxKind.UndefinedKeyword]:void 0},Ho=({schema:{value:e}})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Uo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Te(a)?a instanceof Pr.z.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,br(s),p&&o?u.createToken(f.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&At(d,a.description),d});return u.createTypeLiteralNode(n)},Ko=({schema:{element:e},next:t})=>u.createArrayTypeNode(t({schema:e})),Fo=({schema:{options:e}})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Rr=({schema:{options:e},next:t})=>u.createUnionTypeNode(e.map(r=>t({schema:r}))),$o=e=>ko?.[e.kind],_o=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ne({effect:n,sample:$o(o)}),a={number:f.default.SyntaxKind.NumberKeyword,bigint:f.default.SyntaxKind.BigIntKeyword,boolean:f.default.SyntaxKind.BooleanKeyword,string:f.default.SyntaxKind.StringKeyword,undefined:f.default.SyntaxKind.UndefinedKeyword,object:f.default.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(s&&a[s]||f.default.SyntaxKind.AnyKeyword)}return o},Go=({schema:e})=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),qo=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(f.default.SyntaxKind.UndefinedKeyword)]):o},Vo=({next:e,schema:t})=>u.createUnionTypeNode([e({schema:t.unwrap()}),u.createLiteralTypeNode(u.createNull())]),Bo=({next:e,schema:{items:t}})=>u.createTupleTypeNode(t.map(r=>e({schema:r}))),Yo=({next:e,schema:{keySchema:t,valueSchema:r}})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),Jo=({next:e,schema:t})=>u.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Qo=({next:e,schema:t})=>e({schema:t._def.innerType}),Y=e=>()=>u.createKeywordTypeNode(e),Wo=({next:e,schema:t})=>e({schema:t.unwrap()}),Xo=({next:e,schema:t})=>e({schema:t._def.innerType}),en=({next:e,schema:t})=>e({schema:t._def.innerType}),tn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),rn=()=>u.createLiteralTypeNode(u.createNull()),on=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,u.createLiteralTypeNode(u.createNull())),t(s,r({schema:n.schema}))))()},nn={ZodString:Y(f.default.SyntaxKind.StringKeyword),ZodNumber:Y(f.default.SyntaxKind.NumberKeyword),ZodBigInt:Y(f.default.SyntaxKind.BigIntKeyword),ZodBoolean:Y(f.default.SyntaxKind.BooleanKeyword),ZodDateIn:Y(f.default.SyntaxKind.StringKeyword),ZodDateOut:Y(f.default.SyntaxKind.StringKeyword),ZodNull:rn,ZodArray:Ko,ZodTuple:Bo,ZodRecord:Yo,ZodObject:Uo,ZodLiteral:Ho,ZodIntersection:Jo,ZodUnion:Rr,ZodFile:Y(f.default.SyntaxKind.StringKeyword),ZodAny:Y(f.default.SyntaxKind.AnyKeyword),ZodDefault:Qo,ZodEnum:Fo,ZodNativeEnum:Go,ZodEffects:_o,ZodOptional:qo,ZodNullable:Vo,ZodDiscriminatedUnion:Rr,ZodBranded:Wo,ZodCatch:en,ZodPipeline:tn,ZodLazy:on,ZodReadonly:Xo},It=({schema:e,...t})=>te({schema:e,rules:nn,onMissing:()=>u.createKeywordTypeNode(f.default.SyntaxKind.AnyKeyword),...t});var Be=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=Ve(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ce,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(m,O,v)=>{let fe=H(O,v,"input"),Qe=H(O,v,"response"),N={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Re=It({...N,schema:m.getSchema("input"),isResponse:!1}),We=It({...N,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(Ve(Re,fe),Ve(We,Qe)),v!=="options"&&(this.paths.push(O),this.registry[`${v} ${O}`]={in:fe,out:Qe,isJson:m.getMimeTypes("positive").includes(J),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Pt("Path",this.paths),a=Pt("Method",Ft),p=Ge("MethodPath",Tt([a.name,s.name])),d=[i.createHeritageClause(G.default.SyntaxKind.ExtendsKeyword,[Ot(p.name,G.default.SyntaxKind.AnyKeyword)])],c=Zt("Input",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].in))),l=Zt("Response",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let g=i.createVariableStatement(re,Rt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),y=i.createVariableStatement(re,Rt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(O=>i.createStringLiteral(O)))))))),S=Ge("Provider",i.createFunctionTypeNode(Tr({M:a.name,P:s.name}),_e({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),St)}),hr(l.name,St))),I=Ge("Implementation",i.createFunctionTypeNode(void 0,_e({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(G.default.SyntaxKind.StringKeyword),params:Ot(G.default.SyntaxKind.StringKeyword,G.default.SyntaxKind.AnyKeyword)}),xr())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),z=gr("ExpressZodAPIClient",fr([$e("implementation",i.createTypeReferenceNode(I.name),ur)]),[yr("provide",i.createTypeReferenceNode(S.name),Sr(["method","path","params"],[i.createIdentifier("method"),Et("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Et("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),G.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);G.default.addSyntheticLeadingComment(z,G.default.SyntaxKind.MultiLineCommentTrivia,`
22
+ `.trim();var it=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(qt()),te({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(d,p)=>{t.info(`${d.method}: ${s}`),await n.execute({request:d,response:p,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var ke=I(require("express")),Vt=I(require("compression")),Gt=I(require("express-fileupload")),Bt=I(require("https"));var at=I(require("http-errors")),Kr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,at.default)(400,se(r).message),request:o,response:n,logger:t,input:null,output:null})},Yt=(e,t)=>(r,o)=>{let n=(0,at.default)(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Me({response:o,logger:t,error:new ie(se(s).message,n)})}},Jt=(e,t)=>{let r=tt(e.logger)?be(e.logger):e.logger;it({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||X;return{notFoundHandler:Yt(o,r),logger:r}},Qt=(e,t)=>{let r=tt(e.logger)?be(e.logger):e.logger,o=(0,ke.default)();o.disable("x-powered-by");let n=e.errorHandler||X,s=e.server.compression?(0,Vt.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,ke.json)(),d=e.server.upload?(0,Gt.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,p=[].concat(s||[]).concat(a).concat(d||[]);o.use(p),o.use(Kr(n,r)),it({app:o,routing:t,logger:r,config:e}),o.use(Yt(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=Bt.default.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}};var cr=require("openapi3-ts/oas30");var F=require("openapi3-ts/oas30"),me=require("ramda"),T=require("zod");var b=require("zod");var dt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Fr="ZodDateIn",Le=class e extends b.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==b.ZodParsedType.string)return(0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_type,expected:b.ZodParsedType.string,received:o.parsedType}),b.INVALID;dt.test(o.data)||((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ee(n)?{status:r.value,value:n}:((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_date}),b.INVALID)}static create=()=>new e({typeName:Fr})};var re=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,a=n,p=s?s({schema:e,...a,next:l=>re({...l,...a,onEach:t,rules:r,onMissing:o})}):o({schema:e,...a}),c=t&&t({schema:e,prev:p,...a});return c?{...p,...c}:p};var Wt=50,er="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",$r={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},tr=/:([A-Za-z0-9_]+)/g,rr=e=>{let t=e.match(tr);return t?t.map(r=>r.slice(1)):[]},or=e=>e.replace(tr,t=>`{${t.slice(1)}}`),_r=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),qr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Vr=()=>({format:"any"}),Gr=e=>{if(e.isResponse)throw new P({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Br=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new P({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},Yr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Jr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),Qr=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Wr=({schema:e,next:t})=>t({schema:e.unwrap()}),Xr=({schema:e,next:t})=>t({schema:e._def.innerType}),eo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Xt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),to=({schema:{value:e}})=>({type:typeof e,enum:[e]}),ro=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&xe(s)?s instanceof T.z.ZodOptional:s.isOptional())});return{type:"object",properties:Ue({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},oo=()=>({type:"string",nullable:!0,format:"null"}),no=e=>{if(e.isResponse)throw new P({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:dt.source,externalDocs:{url:er}}},so=e=>{if(!e.isResponse)throw new P({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:er}}},io=e=>{throw new P({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},ao=()=>({type:"boolean"}),po=()=>({type:"integer",format:"bigint"}),co=e=>e.reduce((t,r)=>t&&r instanceof T.z.ZodLiteral,!0),lo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof T.z.ZodEnum||e instanceof T.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ue({schema:T.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.z.ZodLiteral)return{type:"object",properties:Ue({schema:T.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.z.ZodUnion&&co(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Ue({schema:T.z.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},mo=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),uo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${(0,F.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},fo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:p,isEmoji:c,isDatetime:l,_def:{checks:g}}})=>{let m=g.find(x=>x.kind==="regex"),h=g.find(x=>x.kind==="datetime"),R=m?m.regex:h?h.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...d&&{format:"ulid"},...p&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...R&&{pattern:`/${R.source}/${R.flags}`}}},yo=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ue=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),go=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return $r?.[t]},ho=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,F.isSchemaObject)(o)){let s=Ce({effect:n,sample:go(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:T.z.any()})}if(!t&&n.type==="preprocess"&&(0,F.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},xo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),To=({schema:e,next:t})=>t({schema:e.unwrap()}),bo=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},nr=(e,t,r=[])=>{let o=L({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?(0,me.omit)(r,s):s}}),{})}},Oo=(e,t,r)=>{let o=L({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}},Oe=(e,t)=>{if(e instanceof T.z.ZodObject)return e;let r;if(e instanceof T.z.ZodUnion||e instanceof T.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Oe(o,t)).reduce((o,n)=>o.merge(n.partial()),T.z.object({}));else if(e instanceof T.z.ZodEffects){if(q(e))throw new P({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Oe(e._def.schema,t)}else r=Oe(e._def.left,t).merge(Oe(e._def.right,t));return Ze(e,r)},sr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:p="parameter"})=>{let c=r.getSchema("input"),l=Oe(c,{path:e,method:t,isResponse:!1}).shape,g=rr(e),m=o.includes("query"),h=o.includes("params"),R=o.includes("headers"),x=u=>h&&g.includes(u),M=u=>R&&et(u);return Object.keys(l).filter(u=>m||x(u)).map(u=>{let O=re({schema:l[u],isResponse:!1,rules:ct,onEach:lt,onMissing:mt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),v=d==="components"?a(U(e,t,`${p} ${u}`),O):O;return{name:u,in:x(u)?"path":M(u)?"header":"query",required:!l[u].isOptional(),description:(0,F.isSchemaObject)(O)&&O.description||`${t.toUpperCase()} ${e} ${p}`,schema:v,...Oo(c,!1,u)}})},ct={ZodString:fo,ZodNumber:yo,ZodBigInt:po,ZodBoolean:ao,ZodDateIn:no,ZodDateOut:so,ZodNull:oo,ZodArray:mo,ZodTuple:uo,ZodRecord:lo,ZodObject:ro,ZodLiteral:to,ZodIntersection:Qr,ZodUnion:Yr,ZodFile:Br,ZodUpload:Gr,ZodAny:Vr,ZodDefault:_r,ZodEnum:Xt,ZodNativeEnum:Xt,ZodEffects:ho,ZodOptional:Wr,ZodNullable:eo,ZodDiscriminatedUnion:Jr,ZodBranded:To,ZodDate:io,ZodCatch:qr,ZodPipeline:xo,ZodLazy:bo,ZodReadonly:Xr},lt=({schema:e,isResponse:t,prev:r})=>{if((0,F.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof T.z.ZodLazy,s=r.type!==void 0,a=t&&xe(e),d=!n&&s&&!a&&e.isNullable(),p=n?[]:L({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...p.length>0&&{example:p[0]}}},mt=({schema:e,...t})=>{throw new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},pt=(e,t)=>{if((0,F.isReferenceObject)(e))return e;let r=e.properties?(0,me.omit)(t,e.properties):void 0,o=e.example?(0,me.omit)(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>pt(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>pt(d,t)):void 0;return(0,me.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},d])=>d===void 0).map(([d])=>d),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},ir=e=>(0,F.isSchemaObject)(e)?(0,me.omit)(["example"],e):e,ut=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:p="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),g=ir(re({schema:c,isResponse:!0,rules:ct,onEach:lt,onMissing:mt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),m=nr(c,!0),h=d==="components"?a(U(t,e,p),g):g;return{description:`${e.toUpperCase()} ${t} ${p}`,content:l.reduce((R,x)=>({...R,[x]:{schema:h,...m}}),{})}},So=()=>({type:"http",scheme:"basic"}),Ro=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Po=({name:e})=>({type:"apiKey",in:"query",name:e}),Zo=({name:e})=>({type:"apiKey",in:"header",name:e}),Ao=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Eo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Io=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),ar=e=>{let t={basic:So,bearer:Ro,input:Po,header:Zo,cookie:Ao,openid:Eo,oauth2:Io};return Ne(e,r=>t[r.type](r))},He=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return He(nt(e))}return He({or:[e]})},dr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let p=rr(t),c=ir(pt(re({schema:r.getSchema("input"),isResponse:!1,rules:ct,onEach:lt,onMissing:mt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),p)),l=nr(r.getSchema("input"),!1,p),g=a==="components"?s(U(t,e,d),c):c;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((m,h)=>({...m,[h]:{schema:g,...l}}),{})}},pr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),ft=e=>e.length<=Wt?e:e.slice(0,Wt-1)+"\u2026";var Ke=class extends cr.OpenApiBuilder{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o){if(o in this.lastOperationIdSuffixes)throw new P({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return this.lastOperationIdSuffixes[o]=1,o}let n=U(t,r);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:d="Error response",hasSummaryFromDescription:p=!0,composition:c="inline",serializer:l=Ie}){super(),this.addInfo({title:o,version:n});for(let m of typeof s=="string"?[s]:s)this.addServer({url:m});te({routing:t,onEndpoint:(m,h,R)=>{let x=R,M={path:h,method:x,endpoint:m,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[u,O]=["short","long"].map(m.getDescription.bind(m)),v=r.inputSources?.[x]||Ae[x],ue=sr({...M,inputSources:v}),w={operationId:this.ensureUniqOperationId(h,x,m.getOperationId(x)),responses:{[m.getStatusCode("positive")]:ut({...M,clue:a,isPositive:!0}),[m.getStatusCode("negative")]:ut({...M,clue:d,isPositive:!1})}};O&&(w.description=O,p&&u===void 0&&(w.summary=ft(O))),u&&(w.summary=ft(u)),m.getTags().length>0&&(w.tags=m.getTags()),ue.length>0&&(w.parameters=ue),v.includes("body")&&(w.requestBody=dr(M));let Se=He(Ne(ar(m.getSecurity()),We=>{let Et=this.ensureUniqSecuritySchemaName(We),Pr=["oauth2","openIdConnect"].includes(We.type)?m.getScopes():[];return this.addSecurityScheme(Et,We),{name:Et,scopes:Pr}}));Se.length>0&&(w.security=Se);let Qe=or(h);this.addPath(Qe,{[x]:w})}}),this.rootDoc.tags=r.tags?pr(r.tags):[]}};var yt=I(require("http"));var Co=e=>({method:"GET",header:jest.fn(()=>Y),...e}),wo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:yt.default.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=yt.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},lr=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=Co(t),d=wo(r),p={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:p,...o};return await e.execute({request:a,response:d,config:c,logger:p}),{requestMock:a,responseMock:d,loggerMock:p}};var _=I(require("typescript"));var z=I(require("typescript")),i=z.default.factory,oe=[i.createModifier(z.default.SyntaxKind.ExportKeyword)],No=[i.createModifier(z.default.SyntaxKind.AsyncKeyword)],Do=[i.createModifier(z.default.SyntaxKind.PublicKeyword),i.createModifier(z.default.SyntaxKind.ReadonlyKeyword)],mr=[i.createModifier(z.default.SyntaxKind.ProtectedKeyword),i.createModifier(z.default.SyntaxKind.ReadonlyKeyword)],zo=i.createTemplateHead(""),Mo=i.createTemplateTail(""),vo=i.createTemplateMiddle(" "),gt=e=>i.createTemplateLiteralType(zo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Mo:vo))),ht=gt(["M","P"]),Fe=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),$e=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Fe(o,e[o],t)),[]),xt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),ur=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),Tt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),bt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],z.default.NodeFlags.Const),Ot=(e,t)=>i.createTypeAliasDeclaration(oe,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),_e=(e,t)=>i.createTypeAliasDeclaration(oe,e,void 0,t),fr=(e,t,r)=>i.createPropertyDeclaration(Do,e,void 0,t,r),yr=(e,t,r=[])=>i.createClassDeclaration(oe,e,void 0,void 0,[t,...r]),gr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),hr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(z.default.SyntaxKind.AnyKeyword)]),St=(e,t,r)=>i.createInterfaceDeclaration(oe,e,void 0,t,r),xr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Tr=(e,t)=>i.createArrowFunction(No,void 0,e.map(r=>Fe(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Rt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,$e({acc:void 0,key:void 0}),void 0,void 0,t),r]);var y=I(require("typescript")),Rr=require("zod");var $=I(require("typescript")),{factory:qe}=$.default,Pt=(e,t)=>{$.default.addSyntheticLeadingComment(e,$.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ve=(e,t,r)=>{let o=qe.createTypeAliasDeclaration(void 0,qe.createIdentifier(t),void 0,e);return r&&Pt(o,r),o},br=(e,t)=>{let r=$.default.createSourceFile("print.ts","",$.default.ScriptTarget.Latest,!1,$.default.ScriptKind.TS);return $.default.createPrinter(t).printNode($.default.EmitHint.Unspecified,e,r)},jo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Or=e=>jo.test(e)?qe.createIdentifier(e):qe.createStringLiteral(e);var{factory:f}=y.default,ko={[y.default.SyntaxKind.AnyKeyword]:"",[y.default.SyntaxKind.BigIntKeyword]:BigInt(0),[y.default.SyntaxKind.BooleanKeyword]:!1,[y.default.SyntaxKind.NumberKeyword]:0,[y.default.SyntaxKind.ObjectKeyword]:{},[y.default.SyntaxKind.StringKeyword]:"",[y.default.SyntaxKind.UndefinedKeyword]:void 0},Lo=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Uo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&xe(a)?a instanceof Rr.z.ZodOptional:a.isOptional(),p=f.createPropertySignature(void 0,Or(s),d&&o?f.createToken(y.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Pt(p,a.description),p});return f.createTypeLiteralNode(n)},Ho=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),Ko=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Sr=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),Fo=e=>ko?.[e.kind],$o=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ce({effect:n,sample:Fo(o)}),a={number:y.default.SyntaxKind.NumberKeyword,bigint:y.default.SyntaxKind.BigIntKeyword,boolean:y.default.SyntaxKind.BooleanKeyword,string:y.default.SyntaxKind.StringKeyword,undefined:y.default.SyntaxKind.UndefinedKeyword,object:y.default.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(s&&a[s]||y.default.SyntaxKind.AnyKeyword)}return o},_o=({schema:e})=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),qo=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.default.SyntaxKind.UndefinedKeyword)]):o},Vo=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),Go=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),Bo=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),Yo=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Jo=({next:e,schema:t})=>e({schema:t._def.innerType}),B=e=>()=>f.createKeywordTypeNode(e),Qo=({next:e,schema:t})=>e({schema:t.unwrap()}),Wo=({next:e,schema:t})=>e({schema:t._def.innerType}),Xo=({next:e,schema:t})=>e({schema:t._def.innerType}),en=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),tn=()=>f.createLiteralTypeNode(f.createNull()),rn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,f.createLiteralTypeNode(f.createNull())),t(s,r({schema:n.schema}))))()},on={ZodString:B(y.default.SyntaxKind.StringKeyword),ZodNumber:B(y.default.SyntaxKind.NumberKeyword),ZodBigInt:B(y.default.SyntaxKind.BigIntKeyword),ZodBoolean:B(y.default.SyntaxKind.BooleanKeyword),ZodDateIn:B(y.default.SyntaxKind.StringKeyword),ZodDateOut:B(y.default.SyntaxKind.StringKeyword),ZodNull:tn,ZodArray:Ho,ZodTuple:Go,ZodRecord:Bo,ZodObject:Uo,ZodLiteral:Lo,ZodIntersection:Yo,ZodUnion:Sr,ZodFile:B(y.default.SyntaxKind.StringKeyword),ZodAny:B(y.default.SyntaxKind.AnyKeyword),ZodDefault:Jo,ZodEnum:Ko,ZodNativeEnum:_o,ZodEffects:$o,ZodOptional:qo,ZodNullable:Vo,ZodDiscriminatedUnion:Sr,ZodBranded:Qo,ZodCatch:Xo,ZodPipeline:en,ZodLazy:rn,ZodReadonly:Wo},Zt=({schema:e,...t})=>re({schema:e,rules:on,onMissing:()=>f.createKeywordTypeNode(y.default.SyntaxKind.AnyKeyword),...t});var Ge=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=Ve(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ie,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){te({routing:t,onEndpoint:(u,O,v)=>{let ue=U(O,v,"input"),Je=U(O,v,"response"),w={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Se=Zt({...w,schema:u.getSchema("input"),isResponse:!1}),Qe=Zt({...w,isResponse:!0,schema:u.getSchema("positive").or(u.getSchema("negative"))});this.agg.push(Ve(Se,ue),Ve(Qe,Je)),v!=="options"&&(this.paths.push(O),this.registry[`${v} ${O}`]={in:ue,out:Je,isJson:u.getMimeTypes("positive").includes(Y),tags:u.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Ot("Path",this.paths),a=Ot("Method",Ut),d=_e("MethodPath",gt([a.name,s.name])),p=[i.createHeritageClause(_.default.SyntaxKind.ExtendsKeyword,[xt(d.name,_.default.SyntaxKind.AnyKeyword)])],c=St("Input",p,Object.keys(this.registry).map(u=>Tt(u,this.registry[u].in))),l=St("Response",p,Object.keys(this.registry).map(u=>Tt(u,this.registry[u].out)));if(this.agg.push(s,a,d,c,l),r==="types")return;let g=i.createVariableStatement(oe,bt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(u=>this.registry[u].isJson).map(u=>i.createPropertyAssignment(`"${u}"`,i.createTrue()))))),m=i.createVariableStatement(oe,bt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(u=>i.createPropertyAssignment(`"${u}"`,i.createArrayLiteralExpression(this.registry[u].tags.map(O=>i.createStringLiteral(O)))))))),h=_e("Provider",i.createFunctionTypeNode(xr({M:a.name,P:s.name}),$e({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),ht)}),gr(l.name,ht))),R=_e("Implementation",i.createFunctionTypeNode(void 0,$e({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(_.default.SyntaxKind.StringKeyword),params:xt(_.default.SyntaxKind.StringKeyword,_.default.SyntaxKind.AnyKeyword)}),hr())),x=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),M=yr("ExpressZodAPIClient",ur([Fe("implementation",i.createTypeReferenceNode(R.name),mr)]),[fr("provide",i.createTypeReferenceNode(h.name),Tr(["method","path","params"],[i.createIdentifier("method"),Rt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[x,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Rt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[x]),_.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);_.default.addSyntheticLeadingComment(M,_.default.SyntaxKind.MultiLineCommentTrivia,`
35
23
  export const exampleImplementation: Implementation = async (
36
24
  method,
37
25
  path,
@@ -52,6 +40,6 @@ export const exampleImplementation: Implementation = async (
52
40
 
53
41
  const client = new ExpressZodAPIClient(exampleImplementation);
54
42
  client.provide("get", "/v1/user/retrieve", { id: "10" });
55
- `,!0),this.agg.push(g,y,S,I,z)}print(t){return this.agg.map(r=>Or(r,t)).join(`
43
+ `,!0),this.agg.push(g,m,h,R,M)}print(t){return this.agg.map(r=>br(r,t)).join(`
56
44
 
57
- `)}};var Ct={};Mt(Ct,{dateIn:()=>ln,dateOut:()=>mn,file:()=>pn,upload:()=>cn});var Z=require("zod");var sn="ZodDateOut",Ye=class e extends Z.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==Z.ZodParsedType.date?((0,Z.addIssueToContext)(o,{code:Z.ZodIssueCode.invalid_type,expected:Z.ZodParsedType.date,received:o.parsedType}),Z.INVALID):Ie(o.data)?{status:r.value,value:o.data.toISOString()}:((0,Z.addIssueToContext)(o,{code:Z.ZodIssueCode.invalid_date}),Z.INVALID)}static create=()=>new e({typeName:sn})};var A=require("zod");var an="ZodFile",dn=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Je=class e extends A.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==A.ZodParsedType.string)return(0,A.addIssueToContext)(o,{code:A.ZodIssueCode.invalid_type,expected:A.ZodParsedType.string,received:o.parsedType}),A.INVALID;for(let n of this._def.checks)n.kind==="base64"&&(dn.test(o.data)||((0,A.addIssueToContext)(o,{code:A.ZodIssueCode.custom,message:n.message}),r.dirty()));return{status:r.value,value:o.data}}binary=t=>new e({...this._def,checks:[...this._def.checks,{kind:"binary",...it(t)}]});base64=t=>new e({...this._def,checks:[...this._def.checks,{kind:"base64",...it(t)}]});get isBinary(){return!!this._def.checks.find(t=>t.kind==="binary")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}static create=()=>new e({checks:[],typeName:an})};var pn=Je.create,cn=oe.create,ln=He.create,mn=Ye.create;var Zr=R(require("http-errors"));0&&(module.exports={AbstractEndpoint,DependsOnMethod,DependsOnMethodError,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,OutputValidationError,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createHttpError,createLogger,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});
45
+ `)}};var At={};It(At,{dateIn:()=>cn,dateOut:()=>ln,file:()=>dn,upload:()=>pn});var Z=require("zod");var nn="ZodDateOut",Be=class e extends Z.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==Z.ZodParsedType.date?((0,Z.addIssueToContext)(o,{code:Z.ZodIssueCode.invalid_type,expected:Z.ZodParsedType.date,received:o.parsedType}),Z.INVALID):Ee(o.data)?{status:r.value,value:o.data.toISOString()}:((0,Z.addIssueToContext)(o,{code:Z.ZodIssueCode.invalid_date}),Z.INVALID)}static create=()=>new e({typeName:nn})};var E=require("zod");var sn="ZodFile",an=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Ye=class e extends E.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==E.ZodParsedType.string)return(0,E.addIssueToContext)(o,{code:E.ZodIssueCode.invalid_type,expected:E.ZodParsedType.string,received:o.parsedType}),E.INVALID;for(let n of this._def.checks)n.kind==="base64"&&(an.test(o.data)||((0,E.addIssueToContext)(o,{code:E.ZodIssueCode.custom,message:n.message}),r.dirty()));return{status:r.value,value:o.data}}binary=t=>new e({...this._def,checks:[...this._def.checks,{kind:"binary",...ot(t)}]});base64=t=>new e({...this._def,checks:[...this._def.checks,{kind:"base64",...ot(t)}]});get isBinary(){return!!this._def.checks.find(t=>t.kind==="binary")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}static create=()=>new e({checks:[],typeName:sn})};var dn=Ye.create,pn=ne.create,cn=Le.create,ln=Be.create;0&&(module.exports={AbstractEndpoint,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,OutputValidationError,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createLogger,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});