express-zod-api 14.2.3 → 15.0.0-beta2

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 | 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,47 @@ declare class Documentation extends OpenApiBuilder {
793
806
  constructor({ routing, config, title, version, serverUrl, successfulResponseDescription, errorResponseDescription, hasSummaryFromDescription, composition, serializer, }: DocumentationParams);
794
807
  }
795
808
 
809
+ interface MockOverrides {
810
+ }
796
811
  interface TestEndpointProps<REQ, RES, LOG> {
812
+ /** @desc The endpoint to test */
797
813
  endpoint: AbstractEndpoint;
814
+ /**
815
+ * @desc Additional properties to set on Request mock
816
+ * @default { method: "GET", header: () => "application/json" }
817
+ * */
798
818
  requestProps?: REQ;
819
+ /**
820
+ * @desc Additional properties to set on Response mock
821
+ * @default { writableEnded, statusCode, statusMessage, set, setHeader, header, status, json, send, end }
822
+ * */
799
823
  responseProps?: RES;
824
+ /**
825
+ * @desc Additional properties to set on config mock
826
+ * @default { cors: false, logger }
827
+ * */
800
828
  configProps?: Partial<CommonConfig>;
829
+ /**
830
+ * @desc Additional properties to set on logger mock
831
+ * @default { info, warn, error, debug }
832
+ * */
801
833
  loggerProps?: LOG;
802
- /** @deprecated for testing purposes only */
803
- __noJest?: boolean;
804
834
  }
805
835
  /**
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<{
836
+ * @desc You need to install either jest (with @types/jest) or vitest in order to use this method
837
+ * @requires jest
838
+ * @requires vitest
839
+ * */
840
+ declare const testEndpoint: <LOG extends Record<string, any>, REQ extends Record<string, any>, RES extends Record<string, any>>({ endpoint, requestProps, responseProps, configProps, loggerProps, }: TestEndpointProps<REQ, RES, LOG>) => Promise<{
809
841
  requestMock: {
810
842
  method: string;
811
- } & Record<"header", jest.Mock<any, any, any>> & (REQ extends undefined ? {} : REQ);
843
+ } & Record<"header", MockOverrides> & REQ;
812
844
  responseMock: {
813
845
  writableEnded: boolean;
814
846
  statusCode: number;
815
847
  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);
848
+ } & Record<"status" | "set" | "header" | "end" | "setHeader" | "json" | "send", MockOverrides> & RES;
849
+ loggerMock: Record<"info" | "debug" | "warn" | "error", MockOverrides> & LOG;
818
850
  }>;
819
851
 
820
852
  interface Registry {
@@ -887,4 +919,4 @@ declare namespace proprietarySchemas {
887
919
  export { proprietarySchemas_dateIn as dateIn, proprietarySchemas_dateOut as dateOut, proprietarySchemas_file as file, proprietarySchemas_raw as raw, proprietarySchemas_upload as upload };
888
920
  }
889
921
 
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 };
922
+ 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 MockOverrides, 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 Cr=Object.create;var Ee=Object.defineProperty;var wr=Object.getOwnPropertyDescriptor;var Nr=Object.getOwnPropertyNames;var vr=Object.getPrototypeOf,Mr=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 Nr(t))!Mr.call(e,n)&&n!==r&&Ee(e,n,{get:()=>t[n],enumerable:!(o=wr(t,n))||o.enumerable});return e};var M=(e,t,r)=>(r=e!=null?Cr(vr(e)):{},wt(t||!e||!e.__esModule?Ee(r,"default",{value:e,enumerable:!0}):r,e)),zr=e=>wt(Ee({},"__esModule",{value:!0}),e);var yn={};Ct(yn,{AbstractEndpoint:()=>ee,DependsOnMethod:()=>fe,Documentation:()=>Be,DocumentationError:()=>I,EndpointsFactory:()=>ue,InputValidationError:()=>K,Integration:()=>Ye,MissingPeerError:()=>Y,OutputValidationError:()=>q,RoutingError:()=>J,ServeStatic:()=>ye,arrayEndpointsFactory:()=>_t,arrayResultHandler:()=>ke,attachRouting:()=>Xt,createConfig:()=>Nt,createMiddleware:()=>He,createResultHandler:()=>je,createServer:()=>er,defaultEndpointsFactory:()=>Bt,defaultResultHandler:()=>me,ez:()=>Et,getExamples:()=>U,getMessageFromError:()=>L,getStatusCodeFromError:()=>Re,testEndpoint:()=>fr,withMeta:()=>k});module.exports=zr(yn);function Nt(e){return e}var F=require("zod");var Dt=require("http-errors"),jt=require("crypto"),R=require("zod");var b=require("zod");var Dr="ZodFile",jr=/^(?:[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&&!jr.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,...be(t),type:""});buffer=t=>new e({...this._def,...be(t),type:Buffer.from([])});binary=t=>new e({...this._def,...be(t),encoding:"binary"});base64=t=>new e({...this._def,...be(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",kr=e=>{let t=e.constructor,r=(0,Ie.clone)(e._def);return r[E]=r[E]||{examples:[]},new t(r)},k=e=>{let t=kr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=k(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,Mt=(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=k(t),o=Oe(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",zt="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",se=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 Hr=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"]},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,{}),kt=(e,t)=>{let r=et(e);if(r==="options")return{};let o=Kr;return r in we&&(o=we[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]}),{})},Ne=e=>!isNaN(e.getTime()),ie=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),L=e=>e instanceof R.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,Dt.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
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})},U=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=Mt(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},Oe=(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}},Ae=e=>e.reduce((t,r)=>t||r,!1),G=e=>e instanceof R.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof R.z.ZodUnion?Ae(e.options.map(G)):e instanceof R.z.ZodIntersection?Ae([e._def.left,e._def.right].map(G)):!1,z=({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 R.z.ZodObject?Ae(Object.values(e.shape).map(s=>z({subject:s,...n}))):e instanceof R.z.ZodUnion?Ae(e.options.map(s=>z({subject:s,...n}))):e instanceof R.z.ZodIntersection?Ae([e._def.left,e._def.right].map(s=>z({subject:s,...n}))):e instanceof R.z.ZodOptional||e instanceof R.z.ZodNullable?z({subject:e.unwrap(),...n}):e instanceof R.z.ZodEffects||e instanceof R.z.ZodTransformer?z({subject:e.innerType(),...n}):e instanceof R.z.ZodRecord?z({subject:e.valueSchema,...n}):e instanceof R.z.ZodArray?z({subject:e.element,...n}):e instanceof R.z.ZodDefault?z({subject:e._def.innerType,...n}):!1},Lt=e=>z({subject:e,condition:t=>t instanceof se}),ae=e=>z({subject:e,condition:t=>t instanceof N,maxDepth:3}),Pe=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"),Me=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},be=e=>typeof e=="string"?{message:e}:e||{},pe=async(e,t="default")=>{try{return(await import(e))[t]}catch{throw new Y(e)}},Ut=async e=>{for(let{moduleName:t,moduleExport:r}of e)try{return await pe(t,r)}catch{}throw new Y(e.map(({moduleName:t})=>t))};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(L(t)),this.originalError=t}},K=class extends V{name="InputValidationError";originalError;constructor(t){super(L(t)),this.originalError=t}},de=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},Y=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var Ht=e=>typeof e=="object"&&e!==null,Q=e=>Ht(e)&&"or"in e,X=e=>Ht(e)&&"and"in e,ze=e=>({and:e.reduce((t,r)=>t.concat(X(r)?r.and:r),[])}),De=(e,t)=>X(e)?{and:e.and.map(r=>Q(r)?{or:r.or.map(t)}:t(r))}:Q(e)?{or:e.or.map(r=>X(r)?{and:r.and.map(t)}:t(r))}:t(e),ot=e=>e.and.reduce((t,r)=>{let o=Oe(t.or,Q(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(ze),t},{or:[]}),ce=(e,t)=>{if(X(e))return X(t)?ze([e,t]):Q(t)?ce(ot(e),t):ze([e,t]);if(Q(e)){if(X(t))return ce(t,e);if(Q(t)){let{type:r,value:o}=Oe(e.or,t.or);return{or:r==="single"?o:o.map(ze)}}return ce(e,{and:[t]})}return X(t)||Q(t)?ce(t,e):{and:[e,t]}};var v=require("zod");var le={positive:200,negative:400},je=e=>e,me=je({getPositiveResponse:e=>{let t=U({schema:e}),r=k(v.z.object({status:v.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>k(v.z.object({status:v.z.literal("error"),error:v.z.object({message:v.z.string()})})).example({status:"error",error:{message:L(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(le.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:L(e)}})}}),ke=je({getPositiveResponse:e=>{let t=U({schema:e}),r=k("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:()=>k(v.z.string()).example(L(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=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")}}),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 Kt=(e,t=[W])=>{if(e instanceof F.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},ee=class{},Ue=class extends ee{#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:Lt(r)?[Se]:ae(r)?[zt]:[W],positive:Kt(l.positive),negative:Kt(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?le.positive:l.positive.statusCode||le.positive,negative:l.negative instanceof F.z.ZodType?le.negative:l.negative.statusCode||le.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?ce(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 F.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 F.z.ZodError?new K(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 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(p){Le({logger:n,response:o,error:new de(ie(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=kt(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=ie(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 $t=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>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 ue=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 Ue({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:l,tags:h,methods:u,getOperationId:g,description:n,shortDescription:s,inputSchema:$t(d,t)})}},Bt=new ue(me),_t=new ue(ke);var Gt=require("util");var qt=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),Vt=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,Gt.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 fe=class{constructor(t){this.endpoints=t}};var Wt=M(require("express")),ye=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Wt.default.static(...this.params))}};var te=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new J(`The entry '${s}' must avoid having slashes \u2014 use nesting instead.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof ee){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof ye)r&&a.apply(p,r);else if(a instanceof fe){if(Object.entries(a.endpoints).forEach(([d,c])=>{if(!c.getMethods().includes(d))throw new J(`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 te({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var Yt=()=>`
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(Yt()),te({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=M(require("express")),Jt=M(require("http")),at=M(require("https"));var pt=M(require("http-errors")),$r=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,pt.default)(400,ie(r).message),request:o,response:n,logger:t,input:null,output:null})},Br=(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){Le({response:o,logger:t,error:new de(ie(s).message,n)})}},Qt=async e=>{let t=qt(e.logger)?await Vt(e.logger):e.logger,r=e.errorHandler||me,o=Br(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Xt=async(e,t)=>{let{logger:r,notFoundHandler:o}=await Qt(e);return st({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},er=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 Qt(e);r.use($r(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 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 ur=require("openapi3-ts/oas30");var $=require("openapi3-ts/oas30"),ge=require("ramda"),O=require("zod");var S=require("zod");var dt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,_r="ZodDateIn",Ke=class e extends S.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==S.ZodParsedType.string)return(0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_type,expected:S.ZodParsedType.string,received:o.parsedType}),S.INVALID;dt.test(o.data)||((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ne(n)?{status:r.value,value:n}:((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_date}),S.INVALID)}static create=()=>new e({typeName:_r})};var re=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,a=n,d=s?s({schema:e,...a,next:u=>re({...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 tr=50,or="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Gr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},nr=/:([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()}),Vr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Wr=()=>({format:"any"}),Yr=e=>{if(e.isResponse)throw new I({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Jr=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||e?"binary":t?"byte":"file"}),Qr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Xr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),eo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),to=({schema:e,next:t})=>t({schema:e.unwrap()}),ro=({schema:e,next:t})=>t({schema:e._def.innerType}),oo=({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)}),no=({schema:{value:e}})=>({type:typeof e,enum:[e]}),so=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Pe(s)?s instanceof O.z.ZodOptional:s.isOptional())});return{type:"object",properties:Fe({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},io=()=>({type:"string",nullable:!0,format:"null"}),ao=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:or}}},po=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}}},co=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})},lo=()=>({type:"boolean"}),mo=()=>({type:"integer",format:"bigint"}),uo=e=>e.reduce((t,r)=>t&&r instanceof O.z.ZodLiteral,!0),fo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof O.z.ZodEnum||e instanceof O.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Fe({schema:O.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof O.z.ZodLiteral)return{type:"object",properties:Fe({schema:O.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof O.z.ZodUnion&&uo(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Fe({schema:O.z.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},yo=({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}}),go=({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(", ")}}}},ho=({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}`}}},xo=({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]})}),{}),To=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Gr?.[t]},bo=({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=Me({effect:n,sample:To(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:O.z.any()})}if(!t&&n.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Oo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),So=({schema:e,next:t})=>t({schema:e.unwrap()}),Ao=({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,ge.omit)(r,s):s}}),{})}},Ro=(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 O.z.ZodObject)return e;let r;if(e instanceof O.z.ZodUnion||e instanceof O.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Ze(o,t)).reduce((o,n)=>o.merge(n.partial()),O.z.object({}));else if(e instanceof O.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)},pr=({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=sr(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 A=re({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}`),A):A;return{name:m,in:T(m)?"path":P(m)?"header":"query",required:!u[m].isOptional(),description:(0,$.isSchemaObject)(A)&&A.description||`${t.toUpperCase()} ${e} ${d}`,schema:j,...Ro(c,!1,m)}})},lt={ZodString:ho,ZodNumber:xo,ZodBigInt:mo,ZodBoolean:lo,ZodDateIn:ao,ZodDateOut:po,ZodNull:io,ZodArray:yo,ZodTuple:go,ZodRecord:fo,ZodObject:so,ZodLiteral:no,ZodIntersection:eo,ZodUnion:Qr,ZodFile:Jr,ZodUpload:Yr,ZodAny:Wr,ZodDefault:qr,ZodEnum:rr,ZodNativeEnum:rr,ZodEffects:bo,ZodOptional:to,ZodNullable:oo,ZodDiscriminatedUnion:Xr,ZodBranded:So,ZodDate:co,ZodCatch:Vr,ZodPipeline:Oo,ZodLazy:Ao,ZodReadonly:ro},mt=({schema:e,isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof O.z.ZodLazy,s=r.type!==void 0,a=t&&Pe(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:U({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,ge.omit)(t,e.properties):void 0,o=e.example?(0,ge.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,ge.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})},dr=e=>(0,$.isSchemaObject)(e)?(0,ge.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=dr(re({schema:c,isResponse:!0,rules:lt,onEach:mt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:t,method:e})),l=ar(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}}),{})}},Po=()=>({type:"http",scheme:"basic"}),Zo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Eo=({name:e})=>({type:"apiKey",in:"query",name:e}),Io=({name:e})=>({type:"apiKey",in:"header",name:e}),Co=({name:e})=>({type:"apiKey",in:"cookie",name:e}),wo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),No=({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:Po,bearer:Zo,input:Eo,header:Io,cookie:Co,openid:wo,oauth2:No};return De(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]})},lr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=sr(t),c=r.getSchema("input"),u=dr(ct(re({schema:ae(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=ar(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}}),{})}},mr=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 Be=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: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});te({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,A]=["short","long"].map(l.getDescription.bind(l)),j=r.inputSources?.[T]||we[T],he=pr({...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})}};A&&(w.description=A,d&&m===void 0&&(w.summary=yt(A))),m&&(w.summary=yt(m)),l.getTags().length>0&&(w.tags=l.getTags()),he.length>0&&(w.parameters=he),j.includes("body")&&(w.requestBody=lr(P));let xe=$e(De(cr(l.getSecurity()),Te=>{let It=this.ensureUniqSecuritySchemaName(Te),Ir=["oauth2","openIdConnect"].includes(Te.type)?l.getScopes():[];return this.addSecurityScheme(It,Te),{name:It,scopes:Ir}}));xe.length>0&&(w.security=xe);let Xe=ir(h);this.addPath(Xe,{[T]:w})}}),this.rootDoc.tags=r.tags?mr(r.tags):[]}};var gt=M(require("http"));var vo=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>W),...t}),Mo=({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},fr=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n})=>{let s=(await Ut([{moduleName:"vitest",moduleExport:"vi"},{moduleName:"@jest/globals",moduleExport:"jest"}])).fn,a=vo({fnMethod:s,requestProps:t}),p=Mo({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 _=M(require("typescript"));var D=M(require("typescript")),i=D.default.factory,oe=[i.createModifier(D.default.SyntaxKind.ExportKeyword)],zo=[i.createModifier(D.default.SyntaxKind.AsyncKeyword)],Do=[i.createModifier(D.default.SyntaxKind.PublicKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],yr=[i.createModifier(D.default.SyntaxKind.ProtectedKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],jo=i.createTemplateHead(""),ko=i.createTemplateTail(""),Lo=i.createTemplateMiddle(" "),ht=e=>i.createTemplateLiteralType(jo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?ko: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)]),gr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),bt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),Ot=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],D.default.NodeFlags.Const),St=(e,t)=>i.createTypeAliasDeclaration(oe,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),qe=(e,t)=>i.createTypeAliasDeclaration(oe,e,void 0,t),hr=(e,t,r)=>i.createPropertyDeclaration(Do,e,void 0,t,r),xr=(e,t,r=[])=>i.createClassDeclaration(oe,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(D.default.SyntaxKind.AnyKeyword)]),At=(e,t,r)=>i.createInterfaceDeclaration(oe,e,void 0,t,r),Or=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)),Rt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,Ge({acc:void 0,key:void 0}),void 0,void 0,t),r]);var y=M(require("typescript")),Zr=require("zod");var B=M(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},Ar=(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,Ho={[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},Ko=({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&&Pe(a)?a instanceof Zr.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)},$o=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),Bo=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Pr=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),_o=e=>Ho?.[e.kind],Go=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Me({effect:n,sample:_o(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)))),Vo=({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},Wo=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),Yo=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),Jo=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),Qo=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Xo=({next:e,schema:t})=>e({schema:t._def.innerType}),ne=e=>()=>f.createKeywordTypeNode(e),en=({next:e,schema:t})=>e({schema:t.unwrap()}),tn=({next:e,schema:t})=>e({schema:t._def.innerType}),rn=({next:e,schema:t})=>e({schema:t._def.innerType}),on=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),nn=()=>f.createLiteralTypeNode(f.createNull()),sn=({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}))))()},an=({schema:{isBuffer:e}})=>e?f.createTypeReferenceNode("Buffer"):f.createKeywordTypeNode(y.default.SyntaxKind.StringKeyword),pn={ZodString:ne(y.default.SyntaxKind.StringKeyword),ZodNumber:ne(y.default.SyntaxKind.NumberKeyword),ZodBigInt:ne(y.default.SyntaxKind.BigIntKeyword),ZodBoolean:ne(y.default.SyntaxKind.BooleanKeyword),ZodDateIn:ne(y.default.SyntaxKind.StringKeyword),ZodDateOut:ne(y.default.SyntaxKind.StringKeyword),ZodNull:nn,ZodArray:$o,ZodTuple:Yo,ZodRecord:Jo,ZodObject:Fo,ZodLiteral:Ko,ZodIntersection:Qo,ZodUnion:Pr,ZodFile:an,ZodAny:ne(y.default.SyntaxKind.AnyKeyword),ZodDefault:Xo,ZodEnum:Bo,ZodNativeEnum:qo,ZodEffects:Go,ZodOptional:Vo,ZodNullable:Wo,ZodDiscriminatedUnion:Pr,ZodBranded:en,ZodCatch:rn,ZodPipeline:on,ZodLazy:sn,ZodReadonly:tn},Zt=({schema:e,...t})=>re({schema:e,rules:pn,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}}){te({routing:t,onEndpoint:(m,A,j)=>{let he=H(A,j,"input"),Qe=H(A,j,"response"),w={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},xe=m.getSchema("input"),Xe=Zt({...w,schema:ae(xe)?N.create().buffer():xe,isResponse:!1}),Te=Zt({...w,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(We(Xe,he),We(Te,Qe)),j!=="options"&&(this.paths.push(A),this.registry[`${j} ${A}`]={in:he,out:Qe,isJson:m.getMimeTypes("positive").includes(W),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=St("Path",this.paths),a=St("Method",Ft),p=qe("MethodPath",ht([a.name,s.name])),d=[i.createHeritageClause(_.default.SyntaxKind.ExtendsKeyword,[Tt(p.name,_.default.SyntaxKind.AnyKeyword)])],c=At("Input",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].in))),u=At("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(oe,Ot("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),l=i.createVariableStatement(oe,Ot("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(A=>i.createStringLiteral(A)))))))),h=qe("Provider",i.createFunctionTypeNode(Or({M:a.name,P:s.name}),Ge({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),xt)}),Tr(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)}),br())),T=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),P=xr("ExpressZodAPIClient",gr([_e("implementation",i.createTypeReferenceNode(x.name),yr)]),[hr("provide",i.createTypeReferenceNode(h.name),Sr(["method","path","params"],[i.createIdentifier("method"),Rt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[T,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Rt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[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=>Ar(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:()=>mn,dateOut:()=>un,file:()=>cn,raw:()=>fn,upload:()=>ln});var Er=require("zod");var Z=require("zod");var dn="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:dn})};var cn=N.create,ln=se.create,mn=Ke.create,un=Je.create,fn=()=>Er.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});