express-zod-api 14.2.2 → 15.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
@@ -2,7 +2,6 @@ import compression from 'compression';
2
2
  import express, { Request, Response, NextFunction, RequestHandler, Express } from 'express';
3
3
  import fileUpload, { UploadedFile } from 'express-fileupload';
4
4
  import https, { ServerOptions } from 'node:https';
5
- import winston, { Logger } from 'winston';
6
5
  import { z, ZodTypeDef, ZodType, ParseInput, ParseReturnType, ZodError } from 'zod';
7
6
  import { HttpError } from 'http-errors';
8
7
  import { ListenOptions } from 'node:net';
@@ -93,12 +92,26 @@ interface OAuth2Security<S extends string> {
93
92
  * */
94
93
  type Security<K extends string = string, S extends string = string> = BasicSecurity | BearerSecurity | InputSecurity<K> | CustomHeaderSecurity | CookieSecurity | OpenIdSecurity | OAuth2Security<S>;
95
94
 
95
+ /**
96
+ * @desc Using module augmentation approach you can set the type of the actual logger used
97
+ * @example declare module "express-zod-api" { interface LoggerOverrides extends winston.Logger {} }
98
+ * @link https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
99
+ * */
100
+ interface LoggerOverrides {
101
+ }
102
+ /** @desc You can use any logger compatible with this type. */
103
+ type AbstractLogger = Record<"info" | "debug" | "warn" | "error", (message: string, meta?: any) => any> & LoggerOverrides;
104
+ interface SimplifiedWinstonConfig {
105
+ level: "silent" | "warn" | "debug";
106
+ color: boolean;
107
+ }
108
+
96
109
  interface MiddlewareParams<IN, OPT> {
97
110
  input: IN;
98
111
  options: OPT;
99
112
  request: Request;
100
113
  response: Response;
101
- logger: Logger;
114
+ logger: AbstractLogger;
102
115
  }
103
116
  type Middleware<IN, OPT, OUT> = (params: MiddlewareParams<IN, OPT>) => Promise<OUT>;
104
117
  interface MiddlewareCreationProps<IN extends IOSchema<"strip">, OPT, OUT extends FlatObject, SCO extends string> {
@@ -261,6 +274,10 @@ declare class InputValidationError extends IOSchemaError {
261
274
  readonly originalError: ZodError;
262
275
  constructor(originalError: ZodError);
263
276
  }
277
+ declare class MissingPeerError extends Error {
278
+ name: string;
279
+ constructor(module: string);
280
+ }
264
281
 
265
282
  interface ResultHandlerParams<RES> {
266
283
  /** null in case of failure to parse or to find the matching endpoint (error: not found) */
@@ -270,7 +287,7 @@ interface ResultHandlerParams<RES> {
270
287
  error: Error | null;
271
288
  request: Request;
272
289
  response: Response<RES>;
273
- logger: Logger;
290
+ logger: AbstractLogger;
274
291
  }
275
292
  type ResultHandler<RES> = (params: ResultHandlerParams<RES>) => void | Promise<void>;
276
293
  interface ResultHandlerDefinition<POS extends z.ZodTypeAny, NEG extends z.ZodTypeAny> {
@@ -407,7 +424,7 @@ declare const arrayResultHandler: ResultHandlerDefinition<z.ZodArray<z.ZodTypeAn
407
424
  type Handler<IN, OUT, OPT> = (params: {
408
425
  input: IN;
409
426
  options: OPT;
410
- logger: Logger;
427
+ logger: AbstractLogger;
411
428
  }) => Promise<OUT>;
412
429
  type DescriptionVariant = "short" | "long";
413
430
  type IOVariant = "input" | "output";
@@ -417,7 +434,7 @@ declare abstract class AbstractEndpoint {
417
434
  abstract execute(params: {
418
435
  request: Request;
419
436
  response: Response;
420
- logger: Logger;
437
+ logger: AbstractLogger;
421
438
  config: CommonConfig;
422
439
  }): Promise<void>;
423
440
  abstract getDescription(variant: DescriptionVariant): string | undefined;
@@ -467,15 +484,11 @@ declare class Endpoint<IN extends IOSchema, OUT extends IOSchema, OPT extends Fl
467
484
  execute({ request, response, logger, config, }: {
468
485
  request: Request;
469
486
  response: Response;
470
- logger: Logger;
487
+ logger: AbstractLogger;
471
488
  config: CommonConfig;
472
489
  }): Promise<void>;
473
490
  }
474
491
 
475
- interface LoggerConfig {
476
- level: "silent" | "warn" | "debug";
477
- color: boolean;
478
- }
479
492
  type InputSource = keyof Pick<Request, "query" | "body" | "files" | "params" | "headers">;
480
493
  type InputSources = Record<Method, InputSource[]>;
481
494
  type Headers = Record<string, string>;
@@ -484,7 +497,7 @@ type HeadersProvider = (params: {
484
497
  defaultHeaders: Headers;
485
498
  request: Request;
486
499
  endpoint: AbstractEndpoint;
487
- logger: Logger;
500
+ logger: AbstractLogger;
488
501
  }) => Headers | Promise<Headers>;
489
502
  type TagsConfig<TAG extends string> = Record<TAG, string | {
490
503
  description: string;
@@ -503,8 +516,11 @@ interface CommonConfig<TAG extends string = string> {
503
516
  * @see defaultResultHandler
504
517
  */
505
518
  errorHandler?: AnyResultHandlerDefinition;
506
- /** @desc Logger configuration or your custom winston logger. */
507
- logger: LoggerConfig | Logger;
519
+ /**
520
+ * @desc Logger configuration (winston) or instance of any other logger.
521
+ * @example { level: "debug", color: true }
522
+ * */
523
+ logger: SimplifiedWinstonConfig | AbstractLogger;
508
524
  /**
509
525
  * @desc You can disable the startup logo.
510
526
  * @default true
@@ -539,11 +555,13 @@ interface ServerConfig<TAG extends string = string> extends CommonConfig<TAG> {
539
555
  /**
540
556
  * @desc Enable or configure uploads handling.
541
557
  * @default false
558
+ * @requires express-fileupload
542
559
  * */
543
560
  upload?: boolean | UploadOptions;
544
561
  /**
545
562
  * @desc Enable or configure response compression.
546
563
  * @default false
564
+ * @requires compression
547
565
  */
548
566
  compression?: boolean | CompressionOptions;
549
567
  /**
@@ -594,11 +612,8 @@ declare class EndpointsFactory<POS extends z.ZodTypeAny, NEG extends z.ZodTypeAn
594
612
  #private;
595
613
  protected resultHandler: ResultHandlerDefinition<POS, NEG>;
596
614
  protected middlewares: AnyMiddlewareDef[];
615
+ /** @desc Consider using the "config" prop with the "tags" option to enforce constraints on tagging the endpoints */
597
616
  constructor(resultHandler: ResultHandlerDefinition<POS, NEG>);
598
- /**
599
- * @desc Consider using the "config" prop with the "tags" option to enforce constraints on tagging the endpoints
600
- * @todo in next major release consider making config required for using in Endpoint::constructor
601
- * */
602
617
  constructor(params: {
603
618
  resultHandler: ResultHandlerDefinition<POS, NEG>;
604
619
  config?: CommonConfig<TAG>;
@@ -733,8 +748,6 @@ declare const arrayEndpointsFactory: EndpointsFactory<z.ZodArray<z.ZodTypeAny, "
733
748
  example: (example: string) => z.ZodString & any;
734
749
  }, null, {}, string, string>;
735
750
 
736
- declare const createLogger: (loggerConfig: LoggerConfig) => winston.Logger;
737
-
738
751
  declare class DependsOnMethod {
739
752
  readonly endpoints: Partial<Record<Method, AbstractEndpoint>>;
740
753
  constructor(endpoints: Partial<Record<Method, AbstractEndpoint>>);
@@ -752,16 +765,16 @@ interface Routing {
752
765
  [SEGMENT: string]: Routing | DependsOnMethod | AbstractEndpoint | ServeStatic;
753
766
  }
754
767
 
755
- declare const attachRouting: (config: AppConfig, routing: Routing) => {
768
+ declare const attachRouting: (config: AppConfig, routing: Routing) => Promise<{
756
769
  notFoundHandler: express.RequestHandler<express_serve_static_core.ParamsDictionary, any, any, qs.ParsedQs, Record<string, any>>;
757
- logger: Logger;
758
- };
759
- declare const createServer: (config: ServerConfig, routing: Routing) => {
760
- logger: Logger;
770
+ logger: AbstractLogger;
771
+ }>;
772
+ declare const createServer: (config: ServerConfig, routing: Routing) => Promise<{
773
+ logger: AbstractLogger;
761
774
  httpServer: http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;
762
775
  httpsServer: https.Server<typeof http.IncomingMessage, typeof http.ServerResponse> | undefined;
763
776
  app: express_serve_static_core.Express;
764
- };
777
+ }>;
765
778
 
766
779
  interface DocumentationParams {
767
780
  title: string;
@@ -793,28 +806,51 @@ declare class Documentation extends OpenApiBuilder {
793
806
  constructor({ routing, config, title, version, serverUrl, successfulResponseDescription, errorResponseDescription, hasSummaryFromDescription, composition, serializer, }: DocumentationParams);
794
807
  }
795
808
 
796
- interface TestEndpointProps<REQ, RES, LOG> {
809
+ type MockFunction = <S>(implementation?: (...args: any[]) => any) => S;
810
+ interface TestEndpointProps<REQ, RES, LOG, FN> {
811
+ /** @desc The endpoint to test */
797
812
  endpoint: AbstractEndpoint;
813
+ /**
814
+ * @desc Additional properties to set on Request mock
815
+ * @default { method: "GET", header: () => "application/json" }
816
+ * */
798
817
  requestProps?: REQ;
818
+ /**
819
+ * @desc Additional properties to set on Response mock
820
+ * @default { writableEnded, statusCode, statusMessage, set, setHeader, header, status, json, send, end }
821
+ * */
799
822
  responseProps?: RES;
823
+ /**
824
+ * @desc Additional properties to set on config mock
825
+ * @default { cors: false, logger }
826
+ * */
800
827
  configProps?: Partial<CommonConfig>;
828
+ /**
829
+ * @desc Additional properties to set on logger mock
830
+ * @default { info, warn, error, debug }
831
+ * */
801
832
  loggerProps?: LOG;
802
- /** @deprecated for testing purposes only */
803
- __noJest?: boolean;
833
+ /**
834
+ * @example jest.fn
835
+ * @example vi.fn
836
+ * */
837
+ fnMethod: FN;
804
838
  }
805
839
  /**
806
- * @description You need to install Jest and probably @types/jest to use this method
807
- */
808
- declare const testEndpoint: <REQ extends Partial<Record<keyof Request<express_serve_static_core.ParamsDictionary, any, any, qs.ParsedQs, Record<string, any>>, any>> | undefined = undefined, RES extends Partial<Record<keyof Response<any, Record<string, any>>, any>> | undefined = undefined, LOG extends Partial<Record<keyof Logger, any>> | undefined = undefined>({ endpoint, requestProps, responseProps, configProps, loggerProps, __noJest, }: TestEndpointProps<REQ, RES, LOG>) => Promise<{
840
+ * @desc You need to install either jest (with @types/jest) or vitest in order to use this method
841
+ * @requires jest
842
+ * @requires vitest
843
+ * */
844
+ declare const testEndpoint: <FN extends MockFunction, LOG extends Record<string, any>, REQ extends Record<string, any>, RES extends Record<string, any>>({ endpoint, requestProps, responseProps, configProps, loggerProps, fnMethod, }: TestEndpointProps<REQ, RES, LOG, FN>) => Promise<{
809
845
  requestMock: {
810
846
  method: string;
811
- } & Record<"header", jest.Mock<any, any, any>> & (REQ extends undefined ? {} : REQ);
847
+ } & Record<"header", ReturnType<FN>> & REQ;
812
848
  responseMock: {
813
849
  writableEnded: boolean;
814
850
  statusCode: number;
815
851
  statusMessage: string;
816
- } & Record<"status" | "set" | "header" | "end" | "send" | "json" | "setHeader", jest.Mock<any, any, any>> & (RES extends undefined ? {} : RES);
817
- loggerMock: Record<"error" | "warn" | "debug" | "info", jest.Mock<any, any, any>> & (LOG extends undefined ? {} : LOG);
852
+ } & Record<"status" | "set" | "header" | "end" | "setHeader" | "json" | "send", ReturnType<FN>> & RES;
853
+ loggerMock: Record<"info" | "debug" | "warn" | "error", ReturnType<FN>> & LOG;
818
854
  }>;
819
855
 
820
856
  interface Registry {
@@ -887,4 +923,4 @@ declare namespace proprietarySchemas {
887
923
  export { proprietarySchemas_dateIn as dateIn, proprietarySchemas_dateOut as dateOut, proprietarySchemas_file as file, proprietarySchemas_raw as raw, proprietarySchemas_upload as upload };
888
924
  }
889
925
 
890
- export { AbstractEndpoint, type AppConfig, type BasicSecurity, type BearerSecurity, type CommonConfig, type CookieSecurity, type CustomHeaderSecurity, DependsOnMethod, Documentation, DocumentationError, EndpointsFactory, type FlatObject, type IOSchema, type InputSecurity, InputValidationError, Integration, type LoggerConfig, type Metadata, type Method, type MiddlewareDefinition, type OAuth2Security, type OpenIdSecurity, OutputValidationError, type ResultHandlerDefinition, type Routing, RoutingError, ServeStatic, type ServerConfig, type ZodDateInDef, type ZodDateOutDef, type ZodFileDef, type ZodUploadDef, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createLogger, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
926
+ export { AbstractEndpoint, type AppConfig, type BasicSecurity, type BearerSecurity, type CommonConfig, type CookieSecurity, type CustomHeaderSecurity, DependsOnMethod, Documentation, DocumentationError, EndpointsFactory, type FlatObject, type IOSchema, type InputSecurity, InputValidationError, Integration, type LoggerOverrides, type Metadata, type Method, type MiddlewareDefinition, MissingPeerError, type OAuth2Security, type OpenIdSecurity, OutputValidationError, type ResultHandlerDefinition, type Routing, RoutingError, ServeStatic, type ServerConfig, type ZodDateInDef, type ZodDateOutDef, type ZodFileDef, type ZodUploadDef, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- "use strict";var Cr=Object.create;var Ae=Object.defineProperty;var wr=Object.getOwnPropertyDescriptor;var Nr=Object.getOwnPropertyNames;var zr=Object.getPrototypeOf,Dr=Object.prototype.hasOwnProperty;var Ct=(e,t)=>{for(var r in t)Ae(e,r,{get:t[r],enumerable:!0})},wt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Nr(t))!Dr.call(e,n)&&n!==r&&Ae(e,n,{get:()=>t[n],enumerable:!(o=wr(t,n))||o.enumerable});return e};var A=(e,t,r)=>(r=e!=null?Cr(zr(e)):{},wt(t||!e||!e.__esModule?Ae(r,"default",{value:e,enumerable:!0}):r,e)),vr=e=>wt(Ae({},"__esModule",{value:!0}),e);var Tn={};Ct(Tn,{AbstractEndpoint:()=>X,DependsOnMethod:()=>le,Documentation:()=>_e,DocumentationError:()=>I,EndpointsFactory:()=>me,InputValidationError:()=>K,Integration:()=>Je,OutputValidationError:()=>q,RoutingError:()=>J,ServeStatic:()=>ue,arrayEndpointsFactory:()=>_t,arrayResultHandler:()=>je,attachRouting:()=>Xt,createConfig:()=>Nt,createLogger:()=>He,createMiddleware:()=>Ue,createResultHandler:()=>Me,createServer:()=>er,defaultEndpointsFactory:()=>$t,defaultResultHandler:()=>ce,ez:()=>Et,getExamples:()=>U,getMessageFromError:()=>k,getStatusCodeFromError:()=>Oe,testEndpoint:()=>fr,withMeta:()=>L});module.exports=vr(Tn);function Nt(e){return e}var F=require("zod");var Mt=require("http-errors"),jt=require("crypto"),P=require("zod");var T=require("zod");var Mr="ZodFile",jr=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,N=class e extends T.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t),n=o.parsedType===T.ZodParsedType.string&&typeof o.data=="string";if(this.isString&&!n)return(0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_type,expected:T.ZodParsedType.string,received:o.parsedType}),T.INVALID;let s=o.parsedType===T.ZodParsedType.object&&Buffer.isBuffer(o.data);return this.isBuffer&&!s?((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_type,expected:T.ZodParsedType.object,received:o.parsedType,message:"Expected Buffer"}),T.INVALID):(n&&this.isBase64&&!jr.test(o.data)&&((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.custom,message:this._def.message||"Does not match base64 encoding"}),r.dirty()),{status:r.value,value:o.data})}string=t=>new e({...this._def,...xe(t),type:""});buffer=t=>new e({...this._def,...xe(t),type:Buffer.from([])});binary=t=>new e({...this._def,...xe(t),encoding:"binary"});base64=t=>new e({...this._def,...xe(t),encoding:"base64"});get isBinary(){return this._def.encoding==="binary"}get isBase64(){return this._def.encoding==="base64"}get isString(){return typeof this._def.type=="string"}get isBuffer(){return Buffer.isBuffer(this._def.type)}static create=()=>new e({typeName:Mr,type:""})};var Ee=require("ramda"),E="expressZodApiMeta",Lr=e=>{let t=e.constructor,r=(0,Ee.clone)(e._def);return r[E]=r[E]||{examples:[]},new t(r)},L=e=>{let t=Lr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=L(t);return o._def[E].examples.push(r),o}}}),t},zt=e=>E in e._def?typeof e._def[E]=="object"&&e._def[E]!==null:!1,Dt=(e,t)=>{if(!zt(e))return;let r=e._def;return t in r[E]?r[E][t]:void 0},Ie=(e,t)=>{if(!zt(e))return t;let r=L(t),o=Te(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,Ee.mergeDeepRight)({...n},{...s}));return r};var Y="application/json",be="multipart/form-data",vt="application/octet-stream";var C=require("zod"),kr="ZodUpload",Ur=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||!Ur(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:kr})};var Hr=e=>{let r=(e.header("content-type")||"").slice(0,be.length).toLowerCase()===be;return"files"in e&&r},Ce={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Kr=["body","query","params"],et=e=>e.method.toLowerCase(),tt=e=>e.startsWith("x-"),Fr=e=>Object.entries(e.headers).reduce((t,[r,o])=>tt(r)?{...t,[r]:o}:t,{}),Lt=(e,t)=>{let r=et(e);if(r==="options")return{};let o=Kr;return r in Ce&&(o=Ce[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Hr(e):!0).reduce((n,s)=>({...n,...s==="headers"?Fr(e):e[s]}),{})},we=e=>!isNaN(e.getTime()),se=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),k=e=>e instanceof P.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof q?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Oe=e=>(0,Mt.isHttpError)(e)?e.statusCode:e instanceof K?400:500,rt=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
1
+ "use strict";var Ir=Object.create;var Ee=Object.defineProperty;var Cr=Object.getOwnPropertyDescriptor;var wr=Object.getOwnPropertyNames;var Nr=Object.getPrototypeOf,vr=Object.prototype.hasOwnProperty;var Ct=(e,t)=>{for(var r in t)Ee(e,r,{get:t[r],enumerable:!0})},wt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of wr(t))!vr.call(e,n)&&n!==r&&Ee(e,n,{get:()=>t[n],enumerable:!(o=Cr(t,n))||o.enumerable});return e};var z=(e,t,r)=>(r=e!=null?Ir(Nr(e)):{},wt(t||!e||!e.__esModule?Ee(r,"default",{value:e,enumerable:!0}):r,e)),zr=e=>wt(Ee({},"__esModule",{value:!0}),e);var fn={};Ct(fn,{AbstractEndpoint:()=>X,DependsOnMethod:()=>ue,Documentation:()=>Be,DocumentationError:()=>I,EndpointsFactory:()=>me,InputValidationError:()=>F,Integration:()=>Ye,MissingPeerError:()=>ae,OutputValidationError:()=>q,RoutingError:()=>Y,ServeStatic:()=>fe,arrayEndpointsFactory:()=>Bt,arrayResultHandler:()=>Le,attachRouting:()=>Qt,createConfig:()=>Nt,createMiddleware:()=>He,createResultHandler:()=>je,createServer:()=>Xt,defaultEndpointsFactory:()=>$t,defaultResultHandler:()=>le,ez:()=>Et,getExamples:()=>k,getMessageFromError:()=>U,getStatusCodeFromError:()=>Re,testEndpoint:()=>ur,withMeta:()=>L});module.exports=zr(fn);function Nt(e){return e}var K=require("zod");var Mt=require("http-errors"),jt=require("crypto"),A=require("zod");var b=require("zod");var Dr="ZodFile",Mr=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,N=class e extends b.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t),n=o.parsedType===b.ZodParsedType.string&&typeof o.data=="string";if(this.isString&&!n)return(0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_type,expected:b.ZodParsedType.string,received:o.parsedType}),b.INVALID;let s=o.parsedType===b.ZodParsedType.object&&Buffer.isBuffer(o.data);return this.isBuffer&&!s?((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_type,expected:b.ZodParsedType.object,received:o.parsedType,message:"Expected Buffer"}),b.INVALID):(n&&this.isBase64&&!Mr.test(o.data)&&((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.custom,message:this._def.message||"Does not match base64 encoding"}),r.dirty()),{status:r.value,value:o.data})}string=t=>new e({...this._def,...Te(t),type:""});buffer=t=>new e({...this._def,...Te(t),type:Buffer.from([])});binary=t=>new e({...this._def,...Te(t),encoding:"binary"});base64=t=>new e({...this._def,...Te(t),encoding:"base64"});get isBinary(){return this._def.encoding==="binary"}get isBase64(){return this._def.encoding==="base64"}get isString(){return typeof this._def.type=="string"}get isBuffer(){return Buffer.isBuffer(this._def.type)}static create=()=>new e({typeName:Dr,type:""})};var Ie=require("ramda"),E="expressZodApiMeta",jr=e=>{let t=e.constructor,r=(0,Ie.clone)(e._def);return r[E]=r[E]||{examples:[]},new t(r)},L=e=>{let t=jr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=L(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,zt=(e,t)=>{if(!vt(e))return;let r=e._def;return t in r[E]?r[E][t]:void 0},Ce=(e,t)=>{if(!vt(e))return t;let r=L(t),o=be(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,Ie.mergeDeepRight)({...n},{...s}));return r};var W="application/json",Se="multipart/form-data",Dt="application/octet-stream";var C=require("zod"),Lr="ZodUpload",Ur=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||!Ur(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:Lr})};var kr=e=>{let r=(e.header("content-type")||"").slice(0,Se.length).toLowerCase()===Se;return"files"in e&&r},we={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Hr=["body","query","params"],et=e=>e.method.toLowerCase(),tt=e=>e.startsWith("x-"),Fr=e=>Object.entries(e.headers).reduce((t,[r,o])=>tt(r)?{...t,[r]:o}:t,{}),Lt=(e,t)=>{let r=et(e);if(r==="options")return{};let o=Hr;return r in we&&(o=we[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?kr(e):!0).reduce((n,s)=>({...n,...s==="headers"?Fr(e):e[s]}),{})},Ne=e=>!isNaN(e.getTime()),se=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),U=e=>e instanceof A.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof q?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Re=e=>(0,Mt.isHttpError)(e)?e.statusCode:e instanceof F?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})},U=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=Dt(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},Te=(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}},Se=e=>e.reduce((t,r)=>t||r,!1),G=e=>e instanceof P.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof P.z.ZodUnion?Se(e.options.map(G)):e instanceof P.z.ZodIntersection?Se([e._def.left,e._def.right].map(G)):!1,D=({subject:e,condition:t,maxDepth:r,depth:o=1})=>{if(t(e))return!0;if(r!==void 0&&o>=r)return!1;let n={condition:t,maxDepth:r,depth:o+1};return e instanceof P.z.ZodObject?Se(Object.values(e.shape).map(s=>D({subject:s,...n}))):e instanceof P.z.ZodUnion?Se(e.options.map(s=>D({subject:s,...n}))):e instanceof P.z.ZodIntersection?Se([e._def.left,e._def.right].map(s=>D({subject:s,...n}))):e instanceof P.z.ZodOptional||e instanceof P.z.ZodNullable?D({subject:e.unwrap(),...n}):e instanceof P.z.ZodEffects||e instanceof P.z.ZodTransformer?D({subject:e.innerType(),...n}):e instanceof P.z.ZodRecord?D({subject:e.valueSchema,...n}):e instanceof P.z.ZodArray?D({subject:e.element,...n}):e instanceof P.z.ZodDefault?D({subject:e._def.innerType,...n}):!1},kt=e=>D({subject:e,condition:t=>t instanceof ne}),ie=e=>D({subject:e,condition:t=>t instanceof N,maxDepth:3}),Re=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(""),Ne=e=>(0,jt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),ze=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},xe=e=>typeof e=="string"?{message:e}:e||{};var J=class extends Error{name="RoutingError"},I=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)}},V=class extends Error{name="IOSchemaError"},q=class extends V{name="OutputValidationError";originalError;constructor(t){super(k(t)),this.originalError=t}},K=class extends V{name="InputValidationError";originalError;constructor(t){super(k(t)),this.originalError=t}},ae=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var Ut=e=>typeof e=="object"&&e!==null,Q=e=>Ut(e)&&"or"in e,W=e=>Ut(e)&&"and"in e,De=e=>({and:e.reduce((t,r)=>t.concat(W(r)?r.and:r),[])}),ve=(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),ot=e=>e.and.reduce((t,r)=>{let o=Te(t.or,Q(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(De),t},{or:[]}),de=(e,t)=>{if(W(e))return W(t)?De([e,t]):Q(t)?de(ot(e),t):De([e,t]);if(Q(e)){if(W(t))return de(t,e);if(Q(t)){let{type:r,value:o}=Te(e.or,t.or);return{or:r==="single"?o:o.map(De)}}return de(e,{and:[t]})}return W(t)||Q(t)?de(t,e):{and:[e,t]}};var z=require("zod");var pe={positive:200,negative:400},Me=e=>e,ce=Me({getPositiveResponse:e=>{let t=U({schema:e}),r=L(z.z.object({status:z.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>L(z.z.object({status:z.z.literal("error"),error:z.z.object({message:z.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(pe.positive).json({status:"success",data:r});return}let a=Oe(e);rt({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:k(e)}})}}),je=Me({getPositiveResponse:e=>{let t=U({schema:e}),r=L("shape"in e&&"items"in e.shape&&e.shape.items instanceof z.z.ZodArray?e.shape.items:z.z.array(z.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:()=>L(z.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=Oe(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")}}),Le=({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 Ht=(e,t=[Y])=>{if(e instanceof F.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},X=class{},ke=class extends X{#e;#r;#o;#n;#s;#i;#a;#t;#d;#p;#c;#m=[];constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,getOperationId:a=()=>{},scopes:d=[],middlewares:p=[],tags:c=[],description:m,shortDescription:g}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:h,schema:S})=>{if(G(S))throw new V(`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:m,short:g};let l={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#n={input:kt(r)?[be]:ie(r)?[vt]:[Y],positive:Ht(l.positive),negative:Ht(l.negative)},this.#t={input:r,output:o,positive:l.positive instanceof F.z.ZodType?l.positive:l.positive.schema,negative:l.negative instanceof F.z.ZodType?l.negative:l.negative.schema},this.#s={positive:l.positive instanceof F.z.ZodType?pe.positive:l.positive.statusCode||pe.positive,negative:l.negative instanceof F.z.ZodType?pe.negative:l.negative.statusCode||pe.negative}}_setSiblingMethods(t){this.#m=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?de(t,r.security):t,{and:[]})}getScopes(){return this.#d}getTags(){return this.#p}getOperationId(t){return this.#c(t)}#l(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#r.concat(this.#m).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 F.z.ZodError?new q(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(m){throw m instanceof F.z.ZodError?new K(m):m}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 F.z.ZodError?new K(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){Le({logger:n,response:o,error:new ae(se(d).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=et(t),a=null,d=null;if(n.cors){let c=this.#l();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let m in c)r.set(m,c[m])}let p=Lt(t,n.inputSources);try{let{options:c,isStreamClosed:m}=await this.#f({method:s,input:p,request:t,response:r,logger:o});if(m)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 Kt=["get","post","put","delete","patch"];var nt=require("zod");var Ft=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Ie(s,n),o)};var Ue=e=>{if(G(e.input))throw new V("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var me=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:nt.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(Ue({input:nt.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,m="methods"in d?d.methods:[d.method],g=typeof a=="function"?a:()=>a,l="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 ke({handler:r,middlewares:p,outputSchema:o,resultHandler:c,scopes:l,tags:h,methods:m,getOperationId:g,description:n,shortDescription:s,inputSchema:Ft(p,t)})}},$t=new me(ce),_t=new me(je);var Bt=require("util"),Pe=A(require("winston")),{combine:$r,colorize:_r,timestamp:Br,printf:Gr}=Pe.default.format,He=e=>{let t=s=>{let{[Symbol.for("level")]:a,[Symbol.for("message")]:d,[Symbol.for("splat")]:p,...c}=s;return(0,Bt.inspect)(c,!1,1,e.color)},r=s=>Gr(({timestamp:a,message:d,level:p,durationMs:c,...m})=>(typeof d=="object"&&(m={...m,...d},d="[No message]"),`${a} ${p}: ${d}`+(c===void 0?"":` duration: ${c}ms`)+(Object.keys(m).length===0?"":" "+(s?t(m):JSON.stringify(m))))),o=[Br()],n={handleExceptions:!0};switch(e.color&&o.push(_r()),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=$r(...o),Pe.default.createLogger({silent:e.level==="silent",levels:Pe.default.config.npm.levels,transports:[new Pe.default.transports.Console(n)],exitOnError:!1})};var le=class{constructor(t){this.endpoints=t}};var Gt=A(require("express")),ue=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Gt.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 J(`The entry '${s}' must avoid having slashes \u2014 use nesting instead.`);let d=`${o||""}${s?`/${s}`:""}`;if(a instanceof X){let p=a.getMethods().slice();n&&p.push("options"),p.forEach(c=>{t(a,d,c)})}else if(a instanceof ue)r&&a.apply(d,r);else if(a instanceof le){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),m=a.endpoints[p];m._setSiblingMethods(c),t(m,d,"options")}}else ee({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:d})})};var qt=()=>`
3
+ `,{url:t.url,payload:r})},k=({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},be=(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}},Oe=e=>e.reduce((t,r)=>t||r,!1),G=e=>e instanceof A.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof A.z.ZodUnion?Oe(e.options.map(G)):e instanceof A.z.ZodIntersection?Oe([e._def.left,e._def.right].map(G)):!1,D=({subject:e,condition:t,maxDepth:r,depth:o=1})=>{if(t(e))return!0;if(r!==void 0&&o>=r)return!1;let n={condition:t,maxDepth:r,depth:o+1};return e instanceof A.z.ZodObject?Oe(Object.values(e.shape).map(s=>D({subject:s,...n}))):e instanceof A.z.ZodUnion?Oe(e.options.map(s=>D({subject:s,...n}))):e instanceof A.z.ZodIntersection?Oe([e._def.left,e._def.right].map(s=>D({subject:s,...n}))):e instanceof A.z.ZodOptional||e instanceof A.z.ZodNullable?D({subject:e.unwrap(),...n}):e instanceof A.z.ZodEffects||e instanceof A.z.ZodTransformer?D({subject:e.innerType(),...n}):e instanceof A.z.ZodRecord?D({subject:e.valueSchema,...n}):e instanceof A.z.ZodArray?D({subject:e.element,...n}):e instanceof A.z.ZodDefault?D({subject:e._def.innerType,...n}):!1},Ut=e=>D({subject:e,condition:t=>t instanceof ne}),ie=e=>D({subject:e,condition:t=>t instanceof N,maxDepth:3}),Ae=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(""),ve=e=>(0,jt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),ze=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},Te=e=>typeof e=="string"?{message:e}:e||{},Pe=async(e,t="default")=>{try{return(await import(e))[t]}catch{throw new ae(e)}};var Y=class extends Error{name="RoutingError"},I=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)}},V=class extends Error{name="IOSchemaError"},q=class extends V{name="OutputValidationError";originalError;constructor(t){super(U(t)),this.originalError=t}},F=class extends V{name="InputValidationError";originalError;constructor(t){super(U(t)),this.originalError=t}},pe=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},ae=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: '${t}'. Please install it to use the feature activated in config.`)}};var kt=e=>typeof e=="object"&&e!==null,J=e=>kt(e)&&"or"in e,Q=e=>kt(e)&&"and"in e,De=e=>({and:e.reduce((t,r)=>t.concat(Q(r)?r.and:r),[])}),Me=(e,t)=>Q(e)?{and:e.and.map(r=>J(r)?{or:r.or.map(t)}:t(r))}:J(e)?{or:e.or.map(r=>Q(r)?{and:r.and.map(t)}:t(r))}:t(e),ot=e=>e.and.reduce((t,r)=>{let o=be(t.or,J(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(De),t},{or:[]}),de=(e,t)=>{if(Q(e))return Q(t)?De([e,t]):J(t)?de(ot(e),t):De([e,t]);if(J(e)){if(Q(t))return de(t,e);if(J(t)){let{type:r,value:o}=be(e.or,t.or);return{or:r==="single"?o:o.map(De)}}return de(e,{and:[t]})}return Q(t)||J(t)?de(t,e):{and:[e,t]}};var v=require("zod");var ce={positive:200,negative:400},je=e=>e,le=je({getPositiveResponse:e=>{let t=k({schema:e}),r=L(v.z.object({status:v.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>L(v.z.object({status:v.z.literal("error"),error:v.z.object({message:v.z.string()})})).example({status:"error",error:{message:U(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(ce.positive).json({status:"success",data:r});return}let a=Re(e);rt({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:U(e)}})}}),Le=je({getPositiveResponse:e=>{let t=k({schema:e}),r=L("shape"in e&&"items"in e.shape&&e.shape.items instanceof v.z.ZodArray?e.shape.items:v.z.array(v.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:()=>L(v.z.string()).example(U(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Re(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")}}),Ue=({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 Ht=(e,t=[W])=>{if(e instanceof K.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},X=class{},ke=class extends X{#e;#r;#o;#n;#s;#i;#a;#t;#p;#d;#c;#l=[];constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:u,shortDescription:g}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:h,schema:x})=>{if(G(x))throw new V(`Using transformations on the top level of endpoint ${h} is not allowed.`)}),this.#i=n,this.#a=s,this.#o=d,this.#c=a,this.#r=t,this.#p=p,this.#d=c,this.#e={long:u,short:g};let l={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#n={input:Ut(r)?[Se]:ie(r)?[Dt]:[W],positive:Ht(l.positive),negative:Ht(l.negative)},this.#t={input:r,output:o,positive:l.positive instanceof K.z.ZodType?l.positive:l.positive.schema,negative:l.negative instanceof K.z.ZodType?l.negative:l.negative.schema},this.#s={positive:l.positive instanceof K.z.ZodType?ce.positive:l.positive.statusCode||ce.positive,negative:l.negative instanceof K.z.ZodType?ce.negative:l.negative.statusCode||ce.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?de(t,r.security):t,{and:[]})}getScopes(){return this.#p}getTags(){return this.#d}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 q(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.#o){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(u){throw u instanceof K.z.ZodError?new F(u):u}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.#t.input.parseAsync(t)}catch(s){throw s instanceof K.z.ZodError?new F(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(p){Ue({logger:n,response:o,error:new pe(se(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=et(t),a=null,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 u in c)r.set(u,c[u])}let d=Lt(t,n.inputSources);try{let{options:c,isStreamClosed:u}=await this.#f({method:s,input:d,request:t,response:r,logger:o});if(u)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=se(c)}await this.#g({input:d,output:a,request:t,response:r,error:p,logger:o})}};var Ft=["get","post","put","delete","patch"];var nt=require("zod");var Kt=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Ce(s,n),o)};var He=e=>{if(G(e.input))throw new V("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var me=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:nt.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(He({input:nt.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,u="methods"in p?p.methods:[p.method],g=typeof a=="function"?a:()=>a,l="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],h="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new ke({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:l,tags:h,methods:u,getOperationId:g,description:n,shortDescription:s,inputSchema:Kt(d,t)})}},$t=new me(le),Bt=new me(Le);var _t=require("util");var Gt=e=>typeof e=="object"&&e!==null&&"level"in e&&"color"in e&&typeof e.color=="boolean"&&typeof e.level=="string"&&["silent","warn","debug"].includes(e.level),qt=async e=>{let{createLogger:t,transports:r,format:{printf:o,timestamp:n,colorize:s,combine:a},config:{npm:p}}=await Pe("winston"),d=l=>{let{[Symbol.for("level")]:h,[Symbol.for("message")]:x,[Symbol.for("splat")]:T,...P}=l;return(0,_t.inspect)(P,!1,1,e.color)},c=l=>o(({timestamp:h,message:x,level:T,durationMs:P,...m})=>(typeof x=="object"&&(m={...m,...x},x="[No message]"),`${h} ${T}: ${x}`+(P===void 0?"":` duration: ${P}ms`)+(Object.keys(m).length===0?"":" "+(l?d(m):JSON.stringify(m))))),u=[n()],g={handleExceptions:!0};switch(e.color&&u.push(s()),e.level){case"debug":g.level="debug",u.push(c(!0));break;case"silent":case"warn":default:g.level="warn",u.push(c())}return g.format=a(...u),t({silent:e.level==="silent",levels:p.levels,transports:[new r.Console(g)],exitOnError:!1})};var ue=class{constructor(t){this.endpoints=t}};var Vt=z(require("express")),fe=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 Y(`The entry '${s}' must avoid having slashes \u2014 use nesting instead.`);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 fe)r&&a.apply(p,r);else if(a instanceof ue){if(Object.entries(a.endpoints).forEach(([d,c])=>{if(!c.getMethods().includes(d))throw new Y(`Endpoint assigned to ${d} method of ${p} must support ${d} method.`);t(c,p,d)}),n&&Object.keys(a.endpoints).length>0){let[d,...c]=Object.keys(a.endpoints),u=a.endpoints[d];u._setSiblingMethods(c),t(u,p,"options")}}else ee({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var Wt=()=>`
6
6
  \x1B[94m\x1B[39m
7
7
  \x1B[94m\x1B[39m
8
8
  \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
@@ -15,11 +15,11 @@ Original error: ${e.originalError.message}.`:""))};var Ht=(e,t=[Y])=>{if(e insta
15
15
  \x1B[95m8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P' d8888888888 "Y88P" "Y88888 d88P 888 888 8888888\x1B[39m\x1B[94m\x1B[39m
16
16
  \x1B[94m 888\x1B[39m
17
17
  \x1B[94m 888\x1B[3m Proudly supports transgender community.\x1B[23m\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
18
+ \x1B[94m\x1B[3mfor Vika \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
19
19
  \x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
20
20
  \x1B[0m\x1B[0m
21
21
  \x1B[0m\x1B[0m
22
- `.trim();var st=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(qt()),ee({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 it=A(require("express")),Vt=A(require("compression")),Yt=A(require("express-fileupload")),Jt=A(require("http")),at=A(require("https")),Qt=require("winston");var dt=A(require("http-errors")),qr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,dt.default)(400,se(r).message),request:o,response:n,logger:t,input:null,output:null})},Vr=(e,t)=>(r,o)=>{let n=(0,dt.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){Le({response:o,logger:t,error:new ae(se(s).message,n)})}},Wt=e=>{let t=e.logger instanceof Qt.Logger?e.logger:He(e.logger),r=e.errorHandler||ce,o=Vr(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Xt=(e,t)=>{let{logger:r,notFoundHandler:o}=Wt(e);return st({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},er=(e,t)=>{let r=(0,it.default)().disable("x-powered-by");e.server.compression&&r.use((0,Vt.default)(typeof e.server.compression=="object"?e.server.compression:void 0)),r.use(e.server.jsonParser||it.default.json()),e.server.upload&&r.use((0,Yt.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0})),e.server.rawParser&&(r.use(e.server.rawParser),r.use((d,{},p)=>{Buffer.isBuffer(d.body)&&(d.body={raw:d.body}),p()}));let{logger:o,errorHandler:n,notFoundHandler:s}=Wt(e);r.use(qr(n,o)),st({app:r,routing:t,logger:o,config:e}),r.use(s);let a={httpServer:Jt.default.createServer(r),httpsServer:e.https?at.default.createServer(e.https.options,r):void 0};for(let d of Object.values(a)){let p=d instanceof at.default.Server?e.https.listen:e.server.listen;d?.listen(p,()=>{typeof p=="object"?o.info("Listening",p):o.info(`Listening ${p}`)})}return{app:r,...a,logger:o}};var ur=require("openapi3-ts/oas30");var $=require("openapi3-ts/oas30"),fe=require("ramda"),b=require("zod");var O=require("zod");var pt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Yr="ZodDateIn",Ke=class e extends O.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==O.ZodParsedType.string)return(0,O.addIssueToContext)(o,{code:O.ZodIssueCode.invalid_type,expected:O.ZodParsedType.string,received:o.parsedType}),O.INVALID;pt.test(o.data)||((0,O.addIssueToContext)(o,{code:O.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return we(n)?{status:r.value,value:n}:((0,O.addIssueToContext)(o,{code:O.ZodIssueCode.invalid_date}),O.INVALID)}static create=()=>new e({typeName:Yr})};var te=({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:m=>te({...m,...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 tr=50,or="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Jr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},nr=/:([A-Za-z0-9_]+)/g,sr=e=>{let t=e.match(nr);return t?t.map(r=>r.slice(1)):[]},ir=e=>e.replace(nr,t=>`{${t.slice(1)}}`),Qr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Wr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Xr=()=>({format:"any"}),eo=e=>{if(e.isResponse)throw new I({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},to=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||e?"binary":t?"byte":"file"}),ro=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),oo=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),no=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),so=({schema:e,next:t})=>t({schema:e.unwrap()}),io=({schema:e,next:t})=>t({schema:e._def.innerType}),ao=({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)}),po=({schema:{value:e}})=>({type:typeof e,enum:[e]}),co=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Re(s)?s instanceof b.z.ZodOptional:s.isOptional())});return{type:"object",properties:Fe({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},mo=()=>({type:"string",nullable:!0,format:"null"}),lo=e=>{if(e.isResponse)throw new I({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:pt.source,externalDocs:{url:or}}},uo=e=>{if(!e.isResponse)throw new I({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:or}}},fo=e=>{throw new I({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})},yo=()=>({type:"boolean"}),go=()=>({type:"integer",format:"bigint"}),ho=e=>e.reduce((t,r)=>t&&r instanceof b.z.ZodLiteral,!0),xo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof b.z.ZodEnum||e instanceof b.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Fe({schema:b.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof b.z.ZodLiteral)return{type:"object",properties:Fe({schema:b.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof b.z.ZodUnion&&ho(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Fe({schema:b.z.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},To=({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}}),bo=({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(", ")}}}},So=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:p,isEmoji:c,isDatetime:m,_def:{checks:g}}})=>{let l=g.find(x=>x.kind==="regex"),h=g.find(x=>x.kind==="datetime"),S=l?l.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",...m&&{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},...S&&{pattern:`/${S.source}/${S.flags}`}}},Oo=({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}},Fe=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Ro=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Jr?.[t]},Po=({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=ze({effect:n,sample:Ro(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:b.z.any()})}if(!t&&n.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Zo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Ao=({schema:e,next:t})=>t({schema:e.unwrap()}),Eo=({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}))))()},ar=(e,t,r=[])=>{let o=U({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,fe.omit)(r,s):s}}),{})}},Io=(e,t,r)=>{let o=U({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,{})}},Ze=(e,t)=>{if(e instanceof b.z.ZodObject)return e;let r;if(e instanceof b.z.ZodUnion||e instanceof b.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Ze(o,t)).reduce((o,n)=>o.merge(n.partial()),b.z.object({}));else if(e instanceof b.z.ZodEffects){if(G(e))throw new I({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Ze(e._def.schema,t)}else r=Ze(e._def.left,t).merge(Ze(e._def.right,t));return Ie(e,r)},dr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:p="parameter"})=>{let c=r.getSchema("input"),m=Ze(c,{path:e,method:t,isResponse:!1}).shape,g=sr(e),l=o.includes("query"),h=o.includes("params"),S=o.includes("headers"),x=u=>h&&g.includes(u),M=u=>S&&tt(u);return Object.keys(m).filter(u=>l||x(u)).map(u=>{let R=te({schema:m[u],isResponse:!1,rules:mt,onEach:lt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:e,method:t}),j=d==="components"?a(H(e,t,`${p} ${u}`),R):R;return{name:u,in:x(u)?"path":M(u)?"header":"query",required:!m[u].isOptional(),description:(0,$.isSchemaObject)(R)&&R.description||`${t.toUpperCase()} ${e} ${p}`,schema:j,...Io(c,!1,u)}})},mt={ZodString:So,ZodNumber:Oo,ZodBigInt:go,ZodBoolean:yo,ZodDateIn:lo,ZodDateOut:uo,ZodNull:mo,ZodArray:To,ZodTuple:bo,ZodRecord:xo,ZodObject:co,ZodLiteral:po,ZodIntersection:no,ZodUnion:ro,ZodFile:to,ZodUpload:eo,ZodAny:Xr,ZodDefault:Qr,ZodEnum:rr,ZodNativeEnum:rr,ZodEffects:Po,ZodOptional:so,ZodNullable:ao,ZodDiscriminatedUnion:oo,ZodBranded:Ao,ZodDate:fo,ZodCatch:Wr,ZodPipeline:Zo,ZodLazy:Eo,ZodReadonly:io},lt=({schema:e,isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof b.z.ZodLazy,s=r.type!==void 0,a=t&&Re(e),d=!n&&s&&!a&&e.isNullable(),p=n?[]:U({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...p.length>0&&{example:p[0]}}},ut=({schema:e,...t})=>{throw new I({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},ct=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r=e.properties?(0,fe.omit)(t,e.properties):void 0,o=e.example?(0,fe.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=>ct(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>ct(d,t)):void 0;return(0,fe.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})},pr=e=>(0,$.isSchemaObject)(e)?(0,fe.omit)(["example"],e):e,ft=({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"),m=r.getMimeTypes(o?"positive":"negative"),g=pr(te({schema:c,isResponse:!0,rules:mt,onEach:lt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:t,method:e})),l=ar(c,!0),h=d==="components"?a(H(t,e,p),g):g;return{description:`${e.toUpperCase()} ${t} ${p}`,content:m.reduce((S,x)=>({...S,[x]:{schema:h,...l}}),{})}},Co=()=>({type:"http",scheme:"basic"}),wo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),No=({name:e})=>({type:"apiKey",in:"query",name:e}),zo=({name:e})=>({type:"apiKey",in:"header",name:e}),Do=({name:e})=>({type:"apiKey",in:"cookie",name:e}),vo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Mo=({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}}},{})}),cr=e=>{let t={basic:Co,bearer:wo,input:No,header:zo,cookie:Do,openid:vo,oauth2:Mo};return ve(e,r=>t[r.type](r))},$e=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 $e(ot(e))}return $e({or:[e]})},mr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let p=sr(t),c=r.getSchema("input"),m=pr(ct(te({schema:ie(c)?N.create().buffer():c,isResponse:!1,rules:mt,onEach:lt,onMissing:ut,serializer:o,getRef:n,makeRef:s,path:t,method:e}),p)),g=ar(r.getSchema("input"),!1,p),l=a==="components"?s(H(t,e,d),m):m;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((h,S)=>({...h,[S]:{schema:l,...g}}),{})}},lr=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}}}}),yt=e=>e.length<=tr?e:e.slice(0,tr-1)+"\u2026";var _e=class extends ur.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 I({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:d="Error response",hasSummaryFromDescription:p=!0,composition:c="inline",serializer:m=Ne}){super(),this.addInfo({title:o,version:n});for(let l of typeof s=="string"?[s]:s)this.addServer({url:l});ee({routing:t,onEndpoint:(l,h,S)=>{let x=S,M={path:h,method:x,endpoint:l,composition:c,serializer:m,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[u,R]=["short","long"].map(l.getDescription.bind(l)),j=r.inputSources?.[x]||Ce[x],ye=dr({...M,inputSources:j}),w={operationId:this.ensureUniqOperationId(h,x,l.getOperationId(x)),responses:{[l.getStatusCode("positive")]:ft({...M,clue:a,isPositive:!0}),[l.getStatusCode("negative")]:ft({...M,clue:d,isPositive:!1})}};R&&(w.description=R,p&&u===void 0&&(w.summary=yt(R))),u&&(w.summary=yt(u)),l.getTags().length>0&&(w.tags=l.getTags()),ye.length>0&&(w.parameters=ye),j.includes("body")&&(w.requestBody=mr(M));let ge=$e(ve(cr(l.getSecurity()),he=>{let It=this.ensureUniqSecuritySchemaName(he),Ir=["oauth2","openIdConnect"].includes(he.type)?l.getScopes():[];return this.addSecurityScheme(It,he),{name:It,scopes:Ir}}));ge.length>0&&(w.security=ge);let Xe=ir(h);this.addPath(Xe,{[x]:w})}}),this.rootDoc.tags=r.tags?lr(r.tags):[]}};var gt=A(require("http"));var jo=e=>({method:"GET",header:jest.fn(()=>Y),...e}),Lo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:gt.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=gt.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},fr=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=jo(t),d=Lo(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 B=A(require("typescript"));var v=A(require("typescript")),i=v.default.factory,re=[i.createModifier(v.default.SyntaxKind.ExportKeyword)],ko=[i.createModifier(v.default.SyntaxKind.AsyncKeyword)],Uo=[i.createModifier(v.default.SyntaxKind.PublicKeyword),i.createModifier(v.default.SyntaxKind.ReadonlyKeyword)],yr=[i.createModifier(v.default.SyntaxKind.ProtectedKeyword),i.createModifier(v.default.SyntaxKind.ReadonlyKeyword)],Ho=i.createTemplateHead(""),Ko=i.createTemplateTail(""),Fo=i.createTemplateMiddle(" "),ht=e=>i.createTemplateLiteralType(Ho,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Ko:Fo))),xt=ht(["M","P"]),Be=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Ge=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Be(o,e[o],t)),[]),Tt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),gr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),bt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),St=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],v.default.NodeFlags.Const),Ot=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),qe=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,t),hr=(e,t,r)=>i.createPropertyDeclaration(Uo,e,void 0,t,r),xr=(e,t,r=[])=>i.createClassDeclaration(re,e,void 0,void 0,[t,...r]),Tr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),br=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(v.default.SyntaxKind.AnyKeyword)]),Rt=(e,t,r)=>i.createInterfaceDeclaration(re,e,void 0,t,r),Sr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Or=(e,t)=>i.createArrowFunction(ko,void 0,e.map(r=>Be(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Pt=(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,Ge({acc:void 0,key:void 0}),void 0,void 0,t),r]);var y=A(require("typescript")),Ar=require("zod");var _=A(require("typescript")),{factory:Ve}=_.default,Zt=(e,t)=>{_.default.addSyntheticLeadingComment(e,_.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ye=(e,t,r)=>{let o=Ve.createTypeAliasDeclaration(void 0,Ve.createIdentifier(t),void 0,e);return r&&Zt(o,r),o},Rr=(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)},$o=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Pr=e=>$o.test(e)?Ve.createIdentifier(e):Ve.createStringLiteral(e);var{factory:f}=y.default,_o={[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},Bo=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Go=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&Re(a)?a instanceof Ar.z.ZodOptional:a.isOptional(),p=f.createPropertySignature(void 0,Pr(s),d&&o?f.createToken(y.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Zt(p,a.description),p});return f.createTypeLiteralNode(n)},qo=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),Vo=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Zr=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),Yo=e=>_o?.[e.kind],Jo=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=ze({effect:n,sample:Yo(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},Qo=({schema:e})=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),Wo=({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},Xo=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),en=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),tn=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),rn=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),on=({next:e,schema:t})=>e({schema:t._def.innerType}),oe=e=>()=>f.createKeywordTypeNode(e),nn=({next:e,schema:t})=>e({schema:t.unwrap()}),sn=({next:e,schema:t})=>e({schema:t._def.innerType}),an=({next:e,schema:t})=>e({schema:t._def.innerType}),dn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),pn=()=>f.createLiteralTypeNode(f.createNull()),cn=({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}))))()},mn=({schema:{isBuffer:e}})=>e?f.createTypeReferenceNode("Buffer"):f.createKeywordTypeNode(y.default.SyntaxKind.StringKeyword),ln={ZodString:oe(y.default.SyntaxKind.StringKeyword),ZodNumber:oe(y.default.SyntaxKind.NumberKeyword),ZodBigInt:oe(y.default.SyntaxKind.BigIntKeyword),ZodBoolean:oe(y.default.SyntaxKind.BooleanKeyword),ZodDateIn:oe(y.default.SyntaxKind.StringKeyword),ZodDateOut:oe(y.default.SyntaxKind.StringKeyword),ZodNull:pn,ZodArray:qo,ZodTuple:en,ZodRecord:tn,ZodObject:Go,ZodLiteral:Bo,ZodIntersection:rn,ZodUnion:Zr,ZodFile:mn,ZodAny:oe(y.default.SyntaxKind.AnyKeyword),ZodDefault:on,ZodEnum:Vo,ZodNativeEnum:Qo,ZodEffects:Jo,ZodOptional:Wo,ZodNullable:Xo,ZodDiscriminatedUnion:Zr,ZodBranded:nn,ZodCatch:an,ZodPipeline:dn,ZodLazy:cn,ZodReadonly:sn},At=({schema:e,...t})=>te({schema:e,rules:ln,onMissing:()=>f.createKeywordTypeNode(y.default.SyntaxKind.AnyKeyword),...t});var Je=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=Ye(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ne,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(u,R,j)=>{let ye=H(R,j,"input"),We=H(R,j,"response"),w={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},ge=u.getSchema("input"),Xe=At({...w,schema:ie(ge)?N.create().buffer():ge,isResponse:!1}),he=At({...w,isResponse:!0,schema:u.getSchema("positive").or(u.getSchema("negative"))});this.agg.push(Ye(Xe,ye),Ye(he,We)),j!=="options"&&(this.paths.push(R),this.registry[`${j} ${R}`]={in:ye,out:We,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",Kt),d=qe("MethodPath",ht([a.name,s.name])),p=[i.createHeritageClause(B.default.SyntaxKind.ExtendsKeyword,[Tt(d.name,B.default.SyntaxKind.AnyKeyword)])],c=Rt("Input",p,Object.keys(this.registry).map(u=>bt(u,this.registry[u].in))),m=Rt("Response",p,Object.keys(this.registry).map(u=>bt(u,this.registry[u].out)));if(this.agg.push(s,a,d,c,m),r==="types")return;let g=i.createVariableStatement(re,St("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(u=>this.registry[u].isJson).map(u=>i.createPropertyAssignment(`"${u}"`,i.createTrue()))))),l=i.createVariableStatement(re,St("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(u=>i.createPropertyAssignment(`"${u}"`,i.createArrayLiteralExpression(this.registry[u].tags.map(R=>i.createStringLiteral(R)))))))),h=qe("Provider",i.createFunctionTypeNode(Sr({M:a.name,P:s.name}),Ge({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),xt)}),Tr(m.name,xt))),S=qe("Implementation",i.createFunctionTypeNode(void 0,Ge({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(B.default.SyntaxKind.StringKeyword),params:Tt(B.default.SyntaxKind.StringKeyword,B.default.SyntaxKind.AnyKeyword)}),br())),x=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),M=xr("ExpressZodAPIClient",gr([Be("implementation",i.createTypeReferenceNode(S.name),yr)]),[hr("provide",i.createTypeReferenceNode(h.name),Or(["method","path","params"],[i.createIdentifier("method"),Pt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[x,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Pt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[x]),B.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())]))]);B.default.addSyntheticLeadingComment(M,B.default.SyntaxKind.MultiLineCommentTrivia,`
22
+ `.trim();var st=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Wt()),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 it=z(require("express")),Yt=z(require("http")),at=z(require("https"));var pt=z(require("http-errors")),Kr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,pt.default)(400,se(r).message),request:o,response:n,logger:t,input:null,output:null})},$r=(e,t)=>(r,o)=>{let n=(0,pt.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){Ue({response:o,logger:t,error:new pe(se(s).message,n)})}},Jt=async e=>{let t=Gt(e.logger)?await qt(e.logger):e.logger,r=e.errorHandler||le,o=$r(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Qt=async(e,t)=>{let{logger:r,notFoundHandler:o}=await Jt(e);return st({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},Xt=async(e,t)=>{let r=(0,it.default)().disable("x-powered-by");if(e.server.compression){let p=await Pe("compression");r.use(p(typeof e.server.compression=="object"?e.server.compression:void 0))}if(r.use(e.server.jsonParser||it.default.json()),e.server.upload){let p=await Pe("express-fileupload");r.use(p({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}))}e.server.rawParser&&(r.use(e.server.rawParser),r.use((p,{},d)=>{Buffer.isBuffer(p.body)&&(p.body={raw:p.body}),d()}));let{logger:o,errorHandler:n,notFoundHandler:s}=await Jt(e);r.use(Kr(n,o)),st({app:r,routing:t,logger:o,config:e}),r.use(s);let a={httpServer:Yt.default.createServer(r),httpsServer:e.https?at.default.createServer(e.https.options,r):void 0};for(let p of Object.values(a)){let d=p instanceof at.default.Server?e.https.listen:e.server.listen;p?.listen(d,()=>{typeof d=="object"?o.info("Listening",d):o.info(`Listening ${d}`)})}return{app:r,...a,logger:o}};var mr=require("openapi3-ts/oas30");var $=require("openapi3-ts/oas30"),ye=require("ramda"),S=require("zod");var O=require("zod");var dt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Br="ZodDateIn",Fe=class e extends O.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==O.ZodParsedType.string)return(0,O.addIssueToContext)(o,{code:O.ZodIssueCode.invalid_type,expected:O.ZodParsedType.string,received:o.parsedType}),O.INVALID;dt.test(o.data)||((0,O.addIssueToContext)(o,{code:O.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ne(n)?{status:r.value,value:n}:((0,O.addIssueToContext)(o,{code:O.ZodIssueCode.invalid_date}),O.INVALID)}static create=()=>new e({typeName:Br})};var te=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,a=n,d=s?s({schema:e,...a,next:u=>te({...u,...a,onEach:t,rules:r,onMissing:o})}):o({schema:e,...a}),c=t&&t({schema:e,prev:d,...a});return c?{...d,...c}:d};var er=50,rr="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:[]},or=/:([A-Za-z0-9_]+)/g,nr=e=>{let t=e.match(or);return t?t.map(r=>r.slice(1)):[]},sr=e=>e.replace(or,t=>`{${t.slice(1)}}`),Gr=({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"}),Wr=e=>{if(e.isResponse)throw new I({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Yr=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||e?"binary":t?"byte":"file"}),Jr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Qr=({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()})}),tr=({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&&Ae(s)?s instanceof S.z.ZodOptional:s.isOptional())});return{type:"object",properties:Ke({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},so=()=>({type:"string",nullable:!0,format:"null"}),io=e=>{if(e.isResponse)throw new I({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:rr}}},ao=e=>{if(!e.isResponse)throw new I({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:rr}}},po=e=>{throw new I({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=e=>e.reduce((t,r)=>t&&r instanceof S.z.ZodLiteral,!0),uo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof S.z.ZodEnum||e instanceof S.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ke({schema:S.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof S.z.ZodLiteral)return{type:"object",properties:Ke({schema:S.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof S.z.ZodUnion&&mo(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Ke({schema:S.z.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},fo=({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}}),yo=({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(", ")}}}},go=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:g}}})=>{let l=g.find(T=>T.kind==="regex"),h=g.find(T=>T.kind==="datetime"),x=l?l.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",...u&&{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},...x&&{pattern:`/${x.source}/${x.flags}`}}},ho=({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}},Ke=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),xo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return _r?.[t]},To=({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=ze({effect:n,sample:xo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:S.z.any()})}if(!t&&n.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},bo=({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}))))()},ir=(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,ye.omit)(r,s):s}}),{})}},Ro=(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,{})}},Ze=(e,t)=>{if(e instanceof S.z.ZodObject)return e;let r;if(e instanceof S.z.ZodUnion||e instanceof S.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Ze(o,t)).reduce((o,n)=>o.merge(n.partial()),S.z.object({}));else if(e instanceof S.z.ZodEffects){if(G(e))throw new I({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Ze(e._def.schema,t)}else r=Ze(e._def.left,t).merge(Ze(e._def.right,t));return Ce(e,r)},ar=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),u=Ze(c,{path:e,method:t,isResponse:!1}).shape,g=nr(e),l=o.includes("query"),h=o.includes("params"),x=o.includes("headers"),T=m=>h&&g.includes(m),P=m=>x&&tt(m);return Object.keys(u).filter(m=>l||T(m)).map(m=>{let R=te({schema:u[m],isResponse:!1,rules:lt,onEach:mt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:e,method:t}),j=p==="components"?a(H(e,t,`${d} ${m}`),R):R;return{name:m,in:T(m)?"path":P(m)?"header":"query",required:!u[m].isOptional(),description:(0,$.isSchemaObject)(R)&&R.description||`${t.toUpperCase()} ${e} ${d}`,schema:j,...Ro(c,!1,m)}})},lt={ZodString:go,ZodNumber:ho,ZodBigInt:lo,ZodBoolean:co,ZodDateIn:io,ZodDateOut:ao,ZodNull:so,ZodArray:fo,ZodTuple:yo,ZodRecord:uo,ZodObject:no,ZodLiteral:oo,ZodIntersection:Xr,ZodUnion:Jr,ZodFile:Yr,ZodUpload:Wr,ZodAny:Vr,ZodDefault:Gr,ZodEnum:tr,ZodNativeEnum:tr,ZodEffects:To,ZodOptional:eo,ZodNullable:ro,ZodDiscriminatedUnion:Qr,ZodBranded:So,ZodDate:po,ZodCatch:qr,ZodPipeline:bo,ZodLazy:Oo,ZodReadonly:to},mt=({schema:e,isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof S.z.ZodLazy,s=r.type!==void 0,a=t&&Ae(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]}}},ut=({schema:e,...t})=>{throw new I({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},ct=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r=e.properties?(0,ye.omit)(t,e.properties):void 0,o=e.example?(0,ye.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=>ct(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>ct(p,t)):void 0;return(0,ye.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})},pr=e=>(0,$.isSchemaObject)(e)?(0,ye.omit)(["example"],e):e,ft=({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"),u=r.getMimeTypes(o?"positive":"negative"),g=pr(te({schema:c,isResponse:!0,rules:lt,onEach:mt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:t,method:e})),l=ir(c,!0),h=p==="components"?a(H(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:u.reduce((x,T)=>({...x,[T]:{schema:h,...l}}),{})}},Ao=()=>({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}),Io=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Co=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),wo=({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:Ao,bearer:Po,input:Zo,header:Eo,cookie:Io,openid:Co,oauth2:wo};return Me(e,r=>t[r.type](r))},$e=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 $e(ot(e))}return $e({or:[e]})},cr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=nr(t),c=r.getSchema("input"),u=pr(ct(te({schema:ie(c)?N.create().buffer():c,isResponse:!1,rules:lt,onEach:mt,onMissing:ut,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),g=ir(r.getSchema("input"),!1,d),l=a==="components"?s(H(t,e,p),u):u;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((h,x)=>({...h,[x]:{schema:l,...g}}),{})}},lr=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}}}}),yt=e=>e.length<=er?e:e.slice(0,er-1)+"\u2026";var Be=class extends mr.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 I({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:u=ve}){super(),this.addInfo({title:o,version:n});for(let l of typeof s=="string"?[s]:s)this.addServer({url:l});ee({routing:t,onEndpoint:(l,h,x)=>{let T=x,P={path:h,method:T,endpoint:l,composition:c,serializer:u,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,R]=["short","long"].map(l.getDescription.bind(l)),j=r.inputSources?.[T]||we[T],ge=ar({...P,inputSources:j}),w={operationId:this.ensureUniqOperationId(h,T,l.getOperationId(T)),responses:{[l.getStatusCode("positive")]:ft({...P,clue:a,isPositive:!0}),[l.getStatusCode("negative")]:ft({...P,clue:p,isPositive:!1})}};R&&(w.description=R,d&&m===void 0&&(w.summary=yt(R))),m&&(w.summary=yt(m)),l.getTags().length>0&&(w.tags=l.getTags()),ge.length>0&&(w.parameters=ge),j.includes("body")&&(w.requestBody=cr(P));let he=$e(Me(dr(l.getSecurity()),xe=>{let It=this.ensureUniqSecuritySchemaName(xe),Er=["oauth2","openIdConnect"].includes(xe.type)?l.getScopes():[];return this.addSecurityScheme(It,xe),{name:It,scopes:Er}}));he.length>0&&(w.security=he);let Xe=sr(h);this.addPath(Xe,{[T]:w})}}),this.rootDoc.tags=r.tags?lr(r.tags):[]}};var gt=z(require("http"));var No=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>W),...t}),vo=({fnMethod:e,responseProps:t})=>{let r={writableEnded:!1,statusCode:200,statusMessage:gt.default.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=gt.default.STATUS_CODES[o],r)),json:e(()=>r),send:e(()=>r),end:e(()=>(r.writableEnded=!0,r)),...t};return r},ur=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,fnMethod:s})=>{let a=No({fnMethod:s,requestProps:t}),p=vo({fnMethod:s,responseProps:r}),d={info:s(),warn:s(),error:s(),debug:s(),...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 _=z(require("typescript"));var M=z(require("typescript")),i=M.default.factory,re=[i.createModifier(M.default.SyntaxKind.ExportKeyword)],zo=[i.createModifier(M.default.SyntaxKind.AsyncKeyword)],Do=[i.createModifier(M.default.SyntaxKind.PublicKeyword),i.createModifier(M.default.SyntaxKind.ReadonlyKeyword)],fr=[i.createModifier(M.default.SyntaxKind.ProtectedKeyword),i.createModifier(M.default.SyntaxKind.ReadonlyKeyword)],Mo=i.createTemplateHead(""),jo=i.createTemplateTail(""),Lo=i.createTemplateMiddle(" "),ht=e=>i.createTemplateLiteralType(Mo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?jo:Lo))),xt=ht(["M","P"]),_e=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Ge=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(_e(o,e[o],t)),[]),Tt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),yr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),bt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),St=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],M.default.NodeFlags.Const),Ot=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),qe=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,t),gr=(e,t,r)=>i.createPropertyDeclaration(Do,e,void 0,t,r),hr=(e,t,r=[])=>i.createClassDeclaration(re,e,void 0,void 0,[t,...r]),xr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),Tr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(M.default.SyntaxKind.AnyKeyword)]),Rt=(e,t,r)=>i.createInterfaceDeclaration(re,e,void 0,t,r),br=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Sr=(e,t)=>i.createArrowFunction(zo,void 0,e.map(r=>_e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),At=(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,Ge({acc:void 0,key:void 0}),void 0,void 0,t),r]);var y=z(require("typescript")),Pr=require("zod");var B=z(require("typescript")),{factory:Ve}=B.default,Pt=(e,t)=>{B.default.addSyntheticLeadingComment(e,B.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},We=(e,t,r)=>{let o=Ve.createTypeAliasDeclaration(void 0,Ve.createIdentifier(t),void 0,e);return r&&Pt(o,r),o},Or=(e,t)=>{let r=B.default.createSourceFile("print.ts","",B.default.ScriptTarget.Latest,!1,B.default.ScriptKind.TS);return B.default.createPrinter(t).printNode(B.default.EmitHint.Unspecified,e,r)},Uo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Rr=e=>Uo.test(e)?Ve.createIdentifier(e):Ve.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},Ho=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Fo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Ae(a)?a instanceof Pr.z.ZodOptional:a.isOptional(),d=f.createPropertySignature(void 0,Rr(s),p&&o?f.createToken(y.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Pt(d,a.description),d});return f.createTypeLiteralNode(n)},Ko=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),$o=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Ar=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),Bo=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=ze({effect:n,sample:Bo(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},Go=({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())]),Wo=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),Yo=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),Jo=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Qo=({next:e,schema:t})=>e({schema:t._def.innerType}),oe=e=>()=>f.createKeywordTypeNode(e),Xo=({next:e,schema:t})=>e({schema:t.unwrap()}),en=({next:e,schema:t})=>e({schema:t._def.innerType}),tn=({next:e,schema:t})=>e({schema:t._def.innerType}),rn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),on=()=>f.createLiteralTypeNode(f.createNull()),nn=({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}))))()},sn=({schema:{isBuffer:e}})=>e?f.createTypeReferenceNode("Buffer"):f.createKeywordTypeNode(y.default.SyntaxKind.StringKeyword),an={ZodString:oe(y.default.SyntaxKind.StringKeyword),ZodNumber:oe(y.default.SyntaxKind.NumberKeyword),ZodBigInt:oe(y.default.SyntaxKind.BigIntKeyword),ZodBoolean:oe(y.default.SyntaxKind.BooleanKeyword),ZodDateIn:oe(y.default.SyntaxKind.StringKeyword),ZodDateOut:oe(y.default.SyntaxKind.StringKeyword),ZodNull:on,ZodArray:Ko,ZodTuple:Wo,ZodRecord:Yo,ZodObject:Fo,ZodLiteral:Ho,ZodIntersection:Jo,ZodUnion:Ar,ZodFile:sn,ZodAny:oe(y.default.SyntaxKind.AnyKeyword),ZodDefault:Qo,ZodEnum:$o,ZodNativeEnum:Go,ZodEffects:_o,ZodOptional:qo,ZodNullable:Vo,ZodDiscriminatedUnion:Ar,ZodBranded:Xo,ZodCatch:tn,ZodPipeline:rn,ZodLazy:nn,ZodReadonly:en},Zt=({schema:e,...t})=>te({schema:e,rules:an,onMissing:()=>f.createKeywordTypeNode(y.default.SyntaxKind.AnyKeyword),...t});var Ye=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=We(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=ve,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(m,R,j)=>{let ge=H(R,j,"input"),Qe=H(R,j,"response"),w={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},he=m.getSchema("input"),Xe=Zt({...w,schema:ie(he)?N.create().buffer():he,isResponse:!1}),xe=Zt({...w,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(We(Xe,ge),We(xe,Qe)),j!=="options"&&(this.paths.push(R),this.registry[`${j} ${R}`]={in:ge,out:Qe,isJson:m.getMimeTypes("positive").includes(W),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Ot("Path",this.paths),a=Ot("Method",Ft),p=qe("MethodPath",ht([a.name,s.name])),d=[i.createHeritageClause(_.default.SyntaxKind.ExtendsKeyword,[Tt(p.name,_.default.SyntaxKind.AnyKeyword)])],c=Rt("Input",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].in))),u=Rt("Response",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,u),r==="types")return;let g=i.createVariableStatement(re,St("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),l=i.createVariableStatement(re,St("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(R=>i.createStringLiteral(R)))))))),h=qe("Provider",i.createFunctionTypeNode(br({M:a.name,P:s.name}),Ge({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),xt)}),xr(u.name,xt))),x=qe("Implementation",i.createFunctionTypeNode(void 0,Ge({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(_.default.SyntaxKind.StringKeyword),params:Tt(_.default.SyntaxKind.StringKeyword,_.default.SyntaxKind.AnyKeyword)}),Tr())),T=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),P=hr("ExpressZodAPIClient",yr([_e("implementation",i.createTypeReferenceNode(x.name),fr)]),[gr("provide",i.createTypeReferenceNode(h.name),Sr(["method","path","params"],[i.createIdentifier("method"),At("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[T,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),At("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[T]),_.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(P,_.default.SyntaxKind.MultiLineCommentTrivia,`
23
23
  export const exampleImplementation: Implementation = async (
24
24
  method,
25
25
  path,
@@ -40,6 +40,6 @@ export const exampleImplementation: Implementation = async (
40
40
 
41
41
  const client = new ExpressZodAPIClient(exampleImplementation);
42
42
  client.provide("get", "/v1/user/retrieve", { id: "10" });
43
- `,!0),this.agg.push(g,l,h,S,M)}print(t){return this.agg.map(r=>Rr(r,t)).join(`
43
+ `,!0),this.agg.push(g,l,h,x,P)}print(t){return this.agg.map(r=>Or(r,t)).join(`
44
44
 
45
- `)}};var Et={};Ct(Et,{dateIn:()=>gn,dateOut:()=>hn,file:()=>fn,raw:()=>xn,upload:()=>yn});var Er=require("zod");var Z=require("zod");var un="ZodDateOut",Qe=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):we(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:un})};var fn=N.create,yn=ne.create,gn=Ke.create,hn=Qe.create,xn=()=>Er.z.object({raw:N.create().buffer()});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});
45
+ `)}};var Et={};Ct(Et,{dateIn:()=>ln,dateOut:()=>mn,file:()=>dn,raw:()=>un,upload:()=>cn});var Zr=require("zod");var Z=require("zod");var pn="ZodDateOut",Je=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):Ne(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:pn})};var dn=N.create,cn=ne.create,ln=Fe.create,mn=Je.create,un=()=>Zr.z.object({raw:N.create().buffer()});0&&(module.exports={AbstractEndpoint,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,MissingPeerError,OutputValidationError,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});