express-zod-api 14.2.0 → 14.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,13 +2,21 @@
2
2
 
3
3
  ## Version 14
4
4
 
5
+ ### v14.2.1
6
+
7
+ - Improving the type of `createConfig()` method by using overloads.
8
+ - This should resolve the confusion on two different types of configuration that this method accepts.
9
+ - The object argument has either to have `server` OR `app` property, it can not have them both.
10
+ - The config having `server` is for using with `createServer()`, while the one having `app` is for `attachRouting()`.
11
+ - Upgraded `tsup` and `esbuild` involved in building the distribution.
12
+
5
13
  ### v14.2.0
6
14
 
7
15
  - `express-fileupload` version is 1.4.2.
8
16
  - Featuring raw data handling in requests: you can now accept `application/octet-stream` typed requests and similar.
9
17
  - Including the mentioned MIME type of the request in the generated documentation.
10
18
  - In order to enable this feature you need to set the `rawParser` config option to `express.raw()`.
11
- - Explore its additional options [in Exress.js documentation](https://expressjs.com/en/4x/api.html#express.raw).
19
+ - Explore its additional options [in Express.js documentation](https://expressjs.com/en/4x/api.html#express.raw).
12
20
  - When the feature is enabled, the raw data is placed into `request.body.raw` property, being `Buffer`.
13
21
  - The proprietary schema `ez.file()` is now equipped with two additional refinements:
14
22
  - `.string()` — for parsing string data, default for backward compatibility.
@@ -1886,9 +1894,9 @@ test("should respond successfully", async () => {
1886
1894
  body: { ... },
1887
1895
  },
1888
1896
  });
1889
- expect(loggerMock.error).toBeCalledTimes(0);
1890
- expect(responseMock.status).toBeCalledWith(200);
1891
- expect(responseMock.json).toBeCalledWith({
1897
+ expect(loggerMock.error).toHaveBeenCalledTimes(0);
1898
+ expect(responseMock.status).toHaveBeenCalledTimes(200);
1899
+ expect(responseMock.json).toHaveBeenCalledWith({
1892
1900
  status: "success",
1893
1901
  data: { ... },
1894
1902
  });
package/README.md CHANGED
@@ -837,7 +837,7 @@ defaultEndpointsFactory.build({
837
837
 
838
838
  Some APIs may require an endpoint to be able to accept and process raw data, such as streaming or uploading a binary
839
839
  file as an entire body of request. In order to enable this feature you need to set the `rawParser` config feature to
840
- `express.raw()`. See also its options [in Exress.js documentation](https://expressjs.com/en/4x/api.html#express.raw).
840
+ `express.raw()`. See also its options [in Express.js documentation](https://expressjs.com/en/4x/api.html#express.raw).
841
841
  The raw data is placed into `request.body.raw` property, having type `Buffer`. Then use the proprietary `ez.raw()`
842
842
  schema (which is an alias for `z.object({ raw: ez.file().buffer() })`) as the input schema of your endpoint.
843
843
 
@@ -1004,9 +1004,9 @@ test("should respond successfully", async () => {
1004
1004
  },
1005
1005
  // responseProps, configProps, loggerProps
1006
1006
  });
1007
- expect(loggerMock.error).toBeCalledTimes(0);
1008
- expect(responseMock.status).toBeCalledWith(200);
1009
- expect(responseMock.json).toBeCalledWith({
1007
+ expect(loggerMock.error).toHaveBeenCalledTimes(0);
1008
+ expect(responseMock.status).toHaveBeenCalledWith(200);
1009
+ expect(responseMock.json).toHaveBeenCalledWith({
1010
1010
  status: "success",
1011
1011
  data: { ... },
1012
1012
  });
package/dist/index.d.mts CHANGED
@@ -476,50 +476,6 @@ interface LoggerConfig {
476
476
  level: "silent" | "warn" | "debug";
477
477
  color: boolean;
478
478
  }
479
- type UploadOptions = Pick<fileUpload.Options, "createParentPath" | "uriDecodeFileNames" | "safeFileNames" | "preserveExtension" | "useTempFiles" | "tempFileDir" | "debug" | "uploadTimeout">;
480
- type CompressionOptions = Pick<compression.CompressionOptions, "threshold" | "level" | "strategy" | "chunkSize" | "memLevel">;
481
- interface ServerConfig {
482
- /** @desc Server configuration. */
483
- server: {
484
- /** @desc Port, UNIX socket or custom options. */
485
- listen: number | string | ListenOptions;
486
- /**
487
- * @desc Custom JSON parser.
488
- * @default express.json()
489
- * @link https://expressjs.com/en/4x/api.html#express.json
490
- * */
491
- jsonParser?: RequestHandler;
492
- /**
493
- * @desc Enable or configure uploads handling.
494
- * @default false
495
- * */
496
- upload?: boolean | UploadOptions;
497
- /**
498
- * @desc Enable or configure response compression.
499
- * @default false
500
- */
501
- compression?: boolean | CompressionOptions;
502
- /**
503
- * @desc Enables parsing certain request payloads into raw Buffers (application/octet-stream by default)
504
- * @desc When enabled, use ez.raw() as input schema to get input.raw in Endpoint's handler
505
- * @default undefined
506
- * @example express.raw()
507
- * @link https://expressjs.com/en/4x/api.html#express.raw
508
- * */
509
- rawParser?: RequestHandler;
510
- };
511
- /** @desc Enables HTTPS server as well. */
512
- https?: {
513
- /** @desc At least "cert" and "key" options required. */
514
- options: ServerOptions;
515
- /** @desc Port, UNIX socket or custom options. */
516
- listen: number | string | ListenOptions;
517
- };
518
- }
519
- interface AppConfig {
520
- /** @desc Your custom express app instead. */
521
- app: Express;
522
- }
523
479
  type InputSource = keyof Pick<Request, "query" | "body" | "files" | "params" | "headers">;
524
480
  type InputSources = Record<Method, InputSource[]>;
525
481
  type Headers = Record<string, string>;
@@ -567,7 +523,52 @@ interface CommonConfig<TAG extends string = string> {
567
523
  */
568
524
  tags?: TagsConfig<TAG>;
569
525
  }
570
- declare const createConfig: <TAG extends string, T extends (ServerConfig | AppConfig) & CommonConfig<TAG>>(config: T) => T;
526
+ type UploadOptions = Pick<fileUpload.Options, "createParentPath" | "uriDecodeFileNames" | "safeFileNames" | "preserveExtension" | "useTempFiles" | "tempFileDir" | "debug" | "uploadTimeout">;
527
+ type CompressionOptions = Pick<compression.CompressionOptions, "threshold" | "level" | "strategy" | "chunkSize" | "memLevel">;
528
+ interface ServerConfig<TAG extends string = string> extends CommonConfig<TAG> {
529
+ /** @desc Server configuration. */
530
+ server: {
531
+ /** @desc Port, UNIX socket or custom options. */
532
+ listen: number | string | ListenOptions;
533
+ /**
534
+ * @desc Custom JSON parser.
535
+ * @default express.json()
536
+ * @link https://expressjs.com/en/4x/api.html#express.json
537
+ * */
538
+ jsonParser?: RequestHandler;
539
+ /**
540
+ * @desc Enable or configure uploads handling.
541
+ * @default false
542
+ * */
543
+ upload?: boolean | UploadOptions;
544
+ /**
545
+ * @desc Enable or configure response compression.
546
+ * @default false
547
+ */
548
+ compression?: boolean | CompressionOptions;
549
+ /**
550
+ * @desc Enables parsing certain request payloads into raw Buffers (application/octet-stream by default)
551
+ * @desc When enabled, use ez.raw() as input schema to get input.raw in Endpoint's handler
552
+ * @default undefined
553
+ * @example express.raw()
554
+ * @link https://expressjs.com/en/4x/api.html#express.raw
555
+ * */
556
+ rawParser?: RequestHandler;
557
+ };
558
+ /** @desc Enables HTTPS server as well. */
559
+ https?: {
560
+ /** @desc At least "cert" and "key" options required. */
561
+ options: ServerOptions;
562
+ /** @desc Port, UNIX socket or custom options. */
563
+ listen: number | string | ListenOptions;
564
+ };
565
+ }
566
+ interface AppConfig<TAG extends string = string> extends CommonConfig<TAG> {
567
+ /** @desc Your custom express app instead. */
568
+ app: Express;
569
+ }
570
+ declare function createConfig<TAG extends string>(config: ServerConfig<TAG>): ServerConfig<TAG>;
571
+ declare function createConfig<TAG extends string>(config: AppConfig<TAG>): AppConfig<TAG>;
571
572
 
572
573
  type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<"strip"> | null, OPT extends FlatObject, SCO extends string, TAG extends string> = {
573
574
  input: IN;
@@ -751,11 +752,11 @@ interface Routing {
751
752
  [SEGMENT: string]: Routing | DependsOnMethod | AbstractEndpoint | ServeStatic;
752
753
  }
753
754
 
754
- declare const attachRouting: (config: AppConfig & CommonConfig, routing: Routing) => {
755
+ declare const attachRouting: (config: AppConfig, routing: Routing) => {
755
756
  notFoundHandler: express.RequestHandler<express_serve_static_core.ParamsDictionary, any, any, qs.ParsedQs, Record<string, any>>;
756
757
  logger: Logger;
757
758
  };
758
- declare const createServer: (config: ServerConfig & CommonConfig, routing: Routing) => {
759
+ declare const createServer: (config: ServerConfig, routing: Routing) => {
759
760
  logger: Logger;
760
761
  httpServer: http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;
761
762
  httpsServer: https.Server<typeof http.IncomingMessage, typeof http.ServerResponse> | undefined;
@@ -883,13 +884,7 @@ declare const proprietarySchemas_file: typeof file;
883
884
  declare const proprietarySchemas_raw: typeof raw;
884
885
  declare const proprietarySchemas_upload: typeof upload;
885
886
  declare namespace proprietarySchemas {
886
- export {
887
- proprietarySchemas_dateIn as dateIn,
888
- proprietarySchemas_dateOut as dateOut,
889
- proprietarySchemas_file as file,
890
- proprietarySchemas_raw as raw,
891
- proprietarySchemas_upload as upload,
892
- };
887
+ export { proprietarySchemas_dateIn as dateIn, proprietarySchemas_dateOut as dateOut, proprietarySchemas_file as file, proprietarySchemas_raw as raw, proprietarySchemas_upload as upload };
893
888
  }
894
889
 
895
- export { AbstractEndpoint, BasicSecurity, BearerSecurity, CommonConfig, CookieSecurity, CustomHeaderSecurity, DependsOnMethod, Documentation, DocumentationError, EndpointsFactory, FlatObject, IOSchema, InputSecurity, InputValidationError, Integration, LoggerConfig, Metadata, Method, MiddlewareDefinition, OAuth2Security, OpenIdSecurity, OutputValidationError, ResultHandlerDefinition, Routing, RoutingError, ServeStatic, ZodDateInDef, ZodDateOutDef, ZodFileDef, ZodUploadDef, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createLogger, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
890
+ export { AbstractEndpoint, 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 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 };
package/dist/index.d.ts CHANGED
@@ -476,50 +476,6 @@ interface LoggerConfig {
476
476
  level: "silent" | "warn" | "debug";
477
477
  color: boolean;
478
478
  }
479
- type UploadOptions = Pick<fileUpload.Options, "createParentPath" | "uriDecodeFileNames" | "safeFileNames" | "preserveExtension" | "useTempFiles" | "tempFileDir" | "debug" | "uploadTimeout">;
480
- type CompressionOptions = Pick<compression.CompressionOptions, "threshold" | "level" | "strategy" | "chunkSize" | "memLevel">;
481
- interface ServerConfig {
482
- /** @desc Server configuration. */
483
- server: {
484
- /** @desc Port, UNIX socket or custom options. */
485
- listen: number | string | ListenOptions;
486
- /**
487
- * @desc Custom JSON parser.
488
- * @default express.json()
489
- * @link https://expressjs.com/en/4x/api.html#express.json
490
- * */
491
- jsonParser?: RequestHandler;
492
- /**
493
- * @desc Enable or configure uploads handling.
494
- * @default false
495
- * */
496
- upload?: boolean | UploadOptions;
497
- /**
498
- * @desc Enable or configure response compression.
499
- * @default false
500
- */
501
- compression?: boolean | CompressionOptions;
502
- /**
503
- * @desc Enables parsing certain request payloads into raw Buffers (application/octet-stream by default)
504
- * @desc When enabled, use ez.raw() as input schema to get input.raw in Endpoint's handler
505
- * @default undefined
506
- * @example express.raw()
507
- * @link https://expressjs.com/en/4x/api.html#express.raw
508
- * */
509
- rawParser?: RequestHandler;
510
- };
511
- /** @desc Enables HTTPS server as well. */
512
- https?: {
513
- /** @desc At least "cert" and "key" options required. */
514
- options: ServerOptions;
515
- /** @desc Port, UNIX socket or custom options. */
516
- listen: number | string | ListenOptions;
517
- };
518
- }
519
- interface AppConfig {
520
- /** @desc Your custom express app instead. */
521
- app: Express;
522
- }
523
479
  type InputSource = keyof Pick<Request, "query" | "body" | "files" | "params" | "headers">;
524
480
  type InputSources = Record<Method, InputSource[]>;
525
481
  type Headers = Record<string, string>;
@@ -567,7 +523,52 @@ interface CommonConfig<TAG extends string = string> {
567
523
  */
568
524
  tags?: TagsConfig<TAG>;
569
525
  }
570
- declare const createConfig: <TAG extends string, T extends (ServerConfig | AppConfig) & CommonConfig<TAG>>(config: T) => T;
526
+ type UploadOptions = Pick<fileUpload.Options, "createParentPath" | "uriDecodeFileNames" | "safeFileNames" | "preserveExtension" | "useTempFiles" | "tempFileDir" | "debug" | "uploadTimeout">;
527
+ type CompressionOptions = Pick<compression.CompressionOptions, "threshold" | "level" | "strategy" | "chunkSize" | "memLevel">;
528
+ interface ServerConfig<TAG extends string = string> extends CommonConfig<TAG> {
529
+ /** @desc Server configuration. */
530
+ server: {
531
+ /** @desc Port, UNIX socket or custom options. */
532
+ listen: number | string | ListenOptions;
533
+ /**
534
+ * @desc Custom JSON parser.
535
+ * @default express.json()
536
+ * @link https://expressjs.com/en/4x/api.html#express.json
537
+ * */
538
+ jsonParser?: RequestHandler;
539
+ /**
540
+ * @desc Enable or configure uploads handling.
541
+ * @default false
542
+ * */
543
+ upload?: boolean | UploadOptions;
544
+ /**
545
+ * @desc Enable or configure response compression.
546
+ * @default false
547
+ */
548
+ compression?: boolean | CompressionOptions;
549
+ /**
550
+ * @desc Enables parsing certain request payloads into raw Buffers (application/octet-stream by default)
551
+ * @desc When enabled, use ez.raw() as input schema to get input.raw in Endpoint's handler
552
+ * @default undefined
553
+ * @example express.raw()
554
+ * @link https://expressjs.com/en/4x/api.html#express.raw
555
+ * */
556
+ rawParser?: RequestHandler;
557
+ };
558
+ /** @desc Enables HTTPS server as well. */
559
+ https?: {
560
+ /** @desc At least "cert" and "key" options required. */
561
+ options: ServerOptions;
562
+ /** @desc Port, UNIX socket or custom options. */
563
+ listen: number | string | ListenOptions;
564
+ };
565
+ }
566
+ interface AppConfig<TAG extends string = string> extends CommonConfig<TAG> {
567
+ /** @desc Your custom express app instead. */
568
+ app: Express;
569
+ }
570
+ declare function createConfig<TAG extends string>(config: ServerConfig<TAG>): ServerConfig<TAG>;
571
+ declare function createConfig<TAG extends string>(config: AppConfig<TAG>): AppConfig<TAG>;
571
572
 
572
573
  type BuildProps<IN extends IOSchema, OUT extends IOSchema, MIN extends IOSchema<"strip"> | null, OPT extends FlatObject, SCO extends string, TAG extends string> = {
573
574
  input: IN;
@@ -751,11 +752,11 @@ interface Routing {
751
752
  [SEGMENT: string]: Routing | DependsOnMethod | AbstractEndpoint | ServeStatic;
752
753
  }
753
754
 
754
- declare const attachRouting: (config: AppConfig & CommonConfig, routing: Routing) => {
755
+ declare const attachRouting: (config: AppConfig, routing: Routing) => {
755
756
  notFoundHandler: express.RequestHandler<express_serve_static_core.ParamsDictionary, any, any, qs.ParsedQs, Record<string, any>>;
756
757
  logger: Logger;
757
758
  };
758
- declare const createServer: (config: ServerConfig & CommonConfig, routing: Routing) => {
759
+ declare const createServer: (config: ServerConfig, routing: Routing) => {
759
760
  logger: Logger;
760
761
  httpServer: http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;
761
762
  httpsServer: https.Server<typeof http.IncomingMessage, typeof http.ServerResponse> | undefined;
@@ -883,13 +884,7 @@ declare const proprietarySchemas_file: typeof file;
883
884
  declare const proprietarySchemas_raw: typeof raw;
884
885
  declare const proprietarySchemas_upload: typeof upload;
885
886
  declare namespace proprietarySchemas {
886
- export {
887
- proprietarySchemas_dateIn as dateIn,
888
- proprietarySchemas_dateOut as dateOut,
889
- proprietarySchemas_file as file,
890
- proprietarySchemas_raw as raw,
891
- proprietarySchemas_upload as upload,
892
- };
887
+ export { proprietarySchemas_dateIn as dateIn, proprietarySchemas_dateOut as dateOut, proprietarySchemas_file as file, proprietarySchemas_raw as raw, proprietarySchemas_upload as upload };
893
888
  }
894
889
 
895
- export { AbstractEndpoint, BasicSecurity, BearerSecurity, CommonConfig, CookieSecurity, CustomHeaderSecurity, DependsOnMethod, Documentation, DocumentationError, EndpointsFactory, FlatObject, IOSchema, InputSecurity, InputValidationError, Integration, LoggerConfig, Metadata, Method, MiddlewareDefinition, OAuth2Security, OpenIdSecurity, OutputValidationError, ResultHandlerDefinition, Routing, RoutingError, ServeStatic, ZodDateInDef, ZodDateOutDef, ZodFileDef, ZodUploadDef, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createLogger, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
890
+ export { AbstractEndpoint, 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 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 };
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)),Mr=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:()=>V,RoutingError:()=>J,ServeStatic:()=>ue,arrayEndpointsFactory:()=>_t,arrayResultHandler:()=>je,attachRouting:()=>Xt,createConfig:()=>Nt,createLogger:()=>He,createMiddleware:()=>Ue,createResultHandler:()=>ve,createServer:()=>er,defaultEndpointsFactory:()=>$t,defaultResultHandler:()=>ce,ez:()=>Et,getExamples:()=>U,getMessageFromError:()=>k,getStatusCodeFromError:()=>Se,testEndpoint:()=>fr,withMeta:()=>L});module.exports=Mr(Tn);var Nt=e=>e;var F=require("zod");var vt=require("http-errors"),jt=require("crypto"),P=require("zod");var T=require("zod");var vr="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:vr,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",Mt="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 V?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Se=e=>(0,vt.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 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:()=>Se,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,Se=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
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}},Oe=e=>e.reduce((t,r)=>t||r,!1),q=e=>e instanceof P.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof P.z.ZodUnion?Oe(e.options.map(q)):e instanceof P.z.ZodIntersection?Oe([e._def.left,e._def.right].map(q)):!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?Oe(Object.values(e.shape).map(s=>D({subject:s,...n}))):e instanceof P.z.ZodUnion?Oe(e.options.map(s=>D({subject:s,...n}))):e instanceof P.z.ZodIntersection?Oe([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)}},G=class extends Error{name="IOSchemaError"},V=class extends G{name="OutputValidationError";originalError;constructor(t){super(k(t)),this.originalError=t}},K=class extends G{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),[])}),Me=(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},ve=e=>e,ce=ve({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=Se(e);rt({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:k(e)}})}}),je=ve({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=Se(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:O})=>{if(q(O))throw new G(`Using transformations on the top level of endpoint ${h} is not allowed.`)}),this.#i=n,this.#a=s,this.#o=p,this.#c=a,this.#r=t,this.#d=d,this.#p=c,this.#e={long:m,short:g};let l={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#n={input:kt(r)?[be]:ie(r)?[Mt]:[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 V(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s}){let a={},d=!1;for(let p of this.#o){if(t==="options"&&p.type==="proprietary")continue;let c;try{c=await p.input.parseAsync(r)}catch(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(q(e.input))throw new G("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:qr}=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=>qr(({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 qt=A(require("express")),ue=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,qt.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 Vt=()=>`
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}},Oe=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?Oe(e.options.map(G)):e instanceof P.z.ZodIntersection?Oe([e._def.left,e._def.right].map(G)):!1,D=({subject:e,condition:t,maxDepth:r,depth:o=1})=>{if(t(e))return!0;if(r!==void 0&&o>=r)return!1;let n={condition:t,maxDepth:r,depth:o+1};return e instanceof P.z.ZodObject?Oe(Object.values(e.shape).map(s=>D({subject:s,...n}))):e instanceof P.z.ZodUnion?Oe(e.options.map(s=>D({subject:s,...n}))):e instanceof P.z.ZodIntersection?Oe([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=Se(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=Se(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:O})=>{if(G(O))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=()=>`
6
6
  \x1B[94m\x1B[39m
7
7
  \x1B[94m\x1B[39m
8
8
  \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
@@ -19,7 +19,7 @@ Original error: ${e.originalError.message}.`:""))};var Ht=(e,t=[Y])=>{if(e insta
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(Vt()),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")),Gt=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")),Vr=(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})},Gr=(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=Gr(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,Gt.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(Vr(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 S=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 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;pt.test(o.data)||((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return we(n)?{status:r.value,value:n}:((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_date}),S.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(", ")}}}},Oo=({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"),O=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},...O&&{pattern:`/${O.source}/${O.flags}`}}},So=({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(q(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"),O=o.includes("headers"),x=u=>h&&g.includes(u),v=u=>O&&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":v(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:Oo,ZodNumber:So,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((O,x)=>({...O,[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}),Mo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),vo=({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:Mo,oauth2:vo};return Me(e,r=>t[r.type](r))},$e=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return $e(ot(e))}return $e({or:[e]})},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,O)=>({...h,[O]:{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,O)=>{let x=O,v={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({...v,inputSources:j}),w={operationId:this.ensureUniqOperationId(h,x,l.getOperationId(x)),responses:{[l.getStatusCode("positive")]:ft({...v,clue:a,isPositive:!0}),[l.getStatusCode("negative")]:ft({...v,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(v));let ge=$e(Me(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 M=A(require("typescript")),i=M.default.factory,re=[i.createModifier(M.default.SyntaxKind.ExportKeyword)],ko=[i.createModifier(M.default.SyntaxKind.AsyncKeyword)],Uo=[i.createModifier(M.default.SyntaxKind.PublicKeyword),i.createModifier(M.default.SyntaxKind.ReadonlyKeyword)],yr=[i.createModifier(M.default.SyntaxKind.ProtectedKeyword),i.createModifier(M.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),qe=(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)),Ot=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],M.default.NodeFlags.Const),St=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Ve=(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(M.default.SyntaxKind.AnyKeyword)]),Rt=(e,t,r)=>i.createInterfaceDeclaration(re,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(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,qe({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:Ge}=_.default,Zt=(e,t)=>{_.default.addSyntheticLeadingComment(e,_.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ye=(e,t,r)=>{let o=Ge.createTypeAliasDeclaration(void 0,Ge.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)?Ge.createIdentifier(e):Ge.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)),qo=({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)},Vo=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),Go=({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:Vo,ZodTuple:en,ZodRecord:tn,ZodObject:qo,ZodLiteral:Bo,ZodIntersection:rn,ZodUnion:Zr,ZodFile:mn,ZodAny:oe(y.default.SyntaxKind.AnyKeyword),ZodDefault:on,ZodEnum:Go,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=St("Path",this.paths),a=St("Method",Kt),d=Ve("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,Ot("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(u=>this.registry[u].isJson).map(u=>i.createPropertyAssignment(`"${u}"`,i.createTrue()))))),l=i.createVariableStatement(re,Ot("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(u=>i.createPropertyAssignment(`"${u}"`,i.createArrayLiteralExpression(this.registry[u].tags.map(R=>i.createStringLiteral(R)))))))),h=Ve("Provider",i.createFunctionTypeNode(Or({M:a.name,P:s.name}),qe({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),xt)}),Tr(m.name,xt))),O=Ve("Implementation",i.createFunctionTypeNode(void 0,qe({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(""))]),v=xr("ExpressZodAPIClient",gr([Be("implementation",i.createTypeReferenceNode(O.name),yr)]),[hr("provide",i.createTypeReferenceNode(h.name),Sr(["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(v,B.default.SyntaxKind.MultiLineCommentTrivia,`
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 S=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 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;pt.test(o.data)||((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return we(n)?{status:r.value,value:n}:((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_date}),S.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(", ")}}}},Oo=({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"),O=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},...O&&{pattern:`/${O.source}/${O.flags}`}}},So=({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"),O=o.includes("headers"),x=u=>h&&g.includes(u),M=u=>O&&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:Oo,ZodNumber:So,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((O,x)=>({...O,[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,O)=>({...h,[O]:{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,O)=>{let x=O,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)),Ot=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],v.default.NodeFlags.Const),St=(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),Or=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Sr=(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=St("Path",this.paths),a=St("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,Ot("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(u=>this.registry[u].isJson).map(u=>i.createPropertyAssignment(`"${u}"`,i.createTrue()))))),l=i.createVariableStatement(re,Ot("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(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(m.name,xt))),O=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(O.name),yr)]),[hr("provide",i.createTypeReferenceNode(h.name),Sr(["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,`
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,O,v)}print(t){return this.agg.map(r=>Rr(r,t)).join(`
43
+ `,!0),this.agg.push(g,l,h,O,M)}print(t){return this.agg.map(r=>Rr(r,t)).join(`
44
44
 
45
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});
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
- var gr=Object.defineProperty;var hr=(e,t)=>{for(var r in t)gr(e,r,{get:t[r],enumerable:!0})};var xr=e=>e;import{z as U}from"zod";import{isHttpError as Dr}from"http-errors";import{createHash as Mr}from"crypto";import{z as S}from"zod";import{INVALID as Ot,ZodIssueCode as Fe,ZodParsedType as Te,ZodType as Tr,addIssueToContext as $e}from"zod";var br="ZodFile",Or=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,A=class e extends Tr{_parse(t){let{status:r,ctx:o}=this._processInputParams(t),n=o.parsedType===Te.string&&typeof o.data=="string";if(this.isString&&!n)return $e(o,{code:Fe.invalid_type,expected:Te.string,received:o.parsedType}),Ot;let s=o.parsedType===Te.object&&Buffer.isBuffer(o.data);return this.isBuffer&&!s?($e(o,{code:Fe.invalid_type,expected:Te.object,received:o.parsedType,message:"Expected Buffer"}),Ot):(n&&this.isBase64&&!Or.test(o.data)&&($e(o,{code:Fe.custom,message:this._def.message||"Does not match base64 encoding"}),r.dirty()),{status:r.value,value:o.data})}string=t=>new e({...this._def,...ae(t),type:""});buffer=t=>new e({...this._def,...ae(t),type:Buffer.from([])});binary=t=>new e({...this._def,...ae(t),encoding:"binary"});base64=t=>new e({...this._def,...ae(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:br,type:""})};import{clone as Sr,mergeDeepRight as Rr}from"ramda";var R="expressZodApiMeta",Pr=e=>{let t=e.constructor,r=Sr(e._def);return r[R]=r[R]||{examples:[]},new t(r)},D=e=>{let t=Pr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=D(t);return o._def[R].examples.push(r),o}}}),t},St=e=>R in e._def?typeof e._def[R]=="object"&&e._def[R]!==null:!1,Rt=(e,t)=>{if(!St(e))return;let r=e._def;return t in r[R]?r[R][t]:void 0},be=(e,t)=>{if(!St(e))return t;let r=D(t),o=de(r._def[R].examples,e._def[R].examples);if(r._def[R].examples=[],o.type==="single")r._def[R].examples=o.value;else for(let[n,s]of o.value)r._def[R].examples.push(Rr({...n},{...s}));return r};var F="application/json",pe="multipart/form-data",Pt="application/octet-stream";import{INVALID as Zr,OK as Ar,ZodIssueCode as Er,ZodParsedType as Ir,ZodType as Cr,addIssueToContext as wr}from"zod";var Nr="ZodUpload",zr=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",J=class e extends Cr{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==Ir.object||!zr(r.data)?(wr(r,{code:Er.custom,message:`Expected file upload, received ${r.parsedType}`}),Zr):Ar(r.data)}static create=()=>new e({typeName:Nr})};var vr=e=>{let r=(e.header("content-type")||"").slice(0,pe.length).toLowerCase()===pe;return"files"in e&&r},Oe={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},jr=["body","query","params"],_e=e=>e.method.toLowerCase(),Be=e=>e.startsWith("x-"),Lr=e=>Object.entries(e.headers).reduce((t,[r,o])=>Be(r)?{...t,[r]:o}:t,{}),Zt=(e,t)=>{let r=_e(e);if(r==="options")return{};let o=jr;return r in Oe&&(o=Oe[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?vr(e):!0).reduce((n,s)=>({...n,...s==="headers"?Lr(e):e[s]}),{})},Se=e=>!isNaN(e.getTime()),Q=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),v=e=>e instanceof S.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof $?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Re=e=>Dr(e)?e.statusCode:e instanceof L?400:500,qe=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
1
+ var gr=Object.defineProperty;var hr=(e,t)=>{for(var r in t)gr(e,r,{get:t[r],enumerable:!0})};function xr(e){return e}import{z as U}from"zod";import{isHttpError as Dr}from"http-errors";import{createHash as vr}from"crypto";import{z as S}from"zod";import{INVALID as Ot,ZodIssueCode as Fe,ZodParsedType as Te,ZodType as Tr,addIssueToContext as $e}from"zod";var br="ZodFile",Or=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,A=class e extends Tr{_parse(t){let{status:r,ctx:o}=this._processInputParams(t),n=o.parsedType===Te.string&&typeof o.data=="string";if(this.isString&&!n)return $e(o,{code:Fe.invalid_type,expected:Te.string,received:o.parsedType}),Ot;let s=o.parsedType===Te.object&&Buffer.isBuffer(o.data);return this.isBuffer&&!s?($e(o,{code:Fe.invalid_type,expected:Te.object,received:o.parsedType,message:"Expected Buffer"}),Ot):(n&&this.isBase64&&!Or.test(o.data)&&($e(o,{code:Fe.custom,message:this._def.message||"Does not match base64 encoding"}),r.dirty()),{status:r.value,value:o.data})}string=t=>new e({...this._def,...ae(t),type:""});buffer=t=>new e({...this._def,...ae(t),type:Buffer.from([])});binary=t=>new e({...this._def,...ae(t),encoding:"binary"});base64=t=>new e({...this._def,...ae(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:br,type:""})};import{clone as Sr,mergeDeepRight as Rr}from"ramda";var R="expressZodApiMeta",Pr=e=>{let t=e.constructor,r=Sr(e._def);return r[R]=r[R]||{examples:[]},new t(r)},D=e=>{let t=Pr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=D(t);return o._def[R].examples.push(r),o}}}),t},St=e=>R in e._def?typeof e._def[R]=="object"&&e._def[R]!==null:!1,Rt=(e,t)=>{if(!St(e))return;let r=e._def;return t in r[R]?r[R][t]:void 0},be=(e,t)=>{if(!St(e))return t;let r=D(t),o=de(r._def[R].examples,e._def[R].examples);if(r._def[R].examples=[],o.type==="single")r._def[R].examples=o.value;else for(let[n,s]of o.value)r._def[R].examples.push(Rr({...n},{...s}));return r};var F="application/json",pe="multipart/form-data",Pt="application/octet-stream";import{INVALID as Zr,OK as Ar,ZodIssueCode as Er,ZodParsedType as Ir,ZodType as Cr,addIssueToContext as wr}from"zod";var Nr="ZodUpload",zr=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",J=class e extends Cr{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==Ir.object||!zr(r.data)?(wr(r,{code:Er.custom,message:`Expected file upload, received ${r.parsedType}`}),Zr):Ar(r.data)}static create=()=>new e({typeName:Nr})};var Mr=e=>{let r=(e.header("content-type")||"").slice(0,pe.length).toLowerCase()===pe;return"files"in e&&r},Oe={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},jr=["body","query","params"],_e=e=>e.method.toLowerCase(),Be=e=>e.startsWith("x-"),Lr=e=>Object.entries(e.headers).reduce((t,[r,o])=>Be(r)?{...t,[r]:o}:t,{}),Zt=(e,t)=>{let r=_e(e);if(r==="options")return{};let o=jr;return r in Oe&&(o=Oe[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Mr(e):!0).reduce((n,s)=>({...n,...s==="headers"?Lr(e):e[s]}),{})},Se=e=>!isNaN(e.getTime()),Q=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),M=e=>e instanceof S.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof $?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Re=e=>Dr(e)?e.statusCode:e instanceof L?400:500,Ge=({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})},j=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=Rt(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},de=(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}},ce=e=>e.reduce((t,r)=>t||r,!1),M=e=>e instanceof S.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof S.ZodUnion?ce(e.options.map(M)):e instanceof S.ZodIntersection?ce([e._def.left,e._def.right].map(M)):!1,E=({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 S.ZodObject?ce(Object.values(e.shape).map(s=>E({subject:s,...n}))):e instanceof S.ZodUnion?ce(e.options.map(s=>E({subject:s,...n}))):e instanceof S.ZodIntersection?ce([e._def.left,e._def.right].map(s=>E({subject:s,...n}))):e instanceof S.ZodOptional||e instanceof S.ZodNullable?E({subject:e.unwrap(),...n}):e instanceof S.ZodEffects||e instanceof S.ZodTransformer?E({subject:e.innerType(),...n}):e instanceof S.ZodRecord?E({subject:e.valueSchema,...n}):e instanceof S.ZodArray?E({subject:e.element,...n}):e instanceof S.ZodDefault?E({subject:e._def.innerType,...n}):!1},At=e=>E({subject:e,condition:t=>t instanceof J}),W=e=>E({subject:e,condition:t=>t instanceof A,maxDepth:3}),me=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,N=(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(""),Pe=e=>Mr("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ze=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},ae=e=>typeof e=="string"?{message:e}:e||{};var X=class extends Error{name="RoutingError"},P=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
- Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},k=class extends Error{name="IOSchemaError"},$=class extends k{name="OutputValidationError";originalError;constructor(t){super(v(t)),this.originalError=t}},L=class extends k{name="InputValidationError";originalError;constructor(t){super(v(t)),this.originalError=t}},ee=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var Et=e=>typeof e=="object"&&e!==null,_=e=>Et(e)&&"or"in e,B=e=>Et(e)&&"and"in e,Ae=e=>({and:e.reduce((t,r)=>t.concat(B(r)?r.and:r),[])}),Ee=(e,t)=>B(e)?{and:e.and.map(r=>_(r)?{or:r.or.map(t)}:t(r))}:_(e)?{or:e.or.map(r=>B(r)?{and:r.and.map(t)}:t(r))}:t(e),Ve=e=>e.and.reduce((t,r)=>{let o=de(t.or,_(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(Ae),t},{or:[]}),te=(e,t)=>{if(B(e))return B(t)?Ae([e,t]):_(t)?te(Ve(e),t):Ae([e,t]);if(_(e)){if(B(t))return te(t,e);if(_(t)){let{type:r,value:o}=de(e.or,t.or);return{or:r==="single"?o:o.map(Ae)}}return te(e,{and:[t]})}return B(t)||_(t)?te(t,e):{and:[e,t]}};import{z as I}from"zod";var re={positive:200,negative:400},Ge=e=>e,le=Ge({getPositiveResponse:e=>{let t=j({schema:e}),r=D(I.object({status:I.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>D(I.object({status:I.literal("error"),error:I.object({message:I.string()})})).example({status:"error",error:{message:v(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(re.positive).json({status:"success",data:r});return}let a=Re(e);qe({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:v(e)}})}}),Ye=Ge({getPositiveResponse:e=>{let t=j({schema:e}),r=D("shape"in e&&"items"in e.shape&&e.shape.items instanceof I.ZodArray?e.shape.items:I.array(I.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:()=>D(I.string()).example(v(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Re(r);qe({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")}}),Ie=({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 It=(e,t=[F])=>{if(e instanceof U.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},oe=class{},Ce=class extends oe{#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:T})=>{if(M(T))throw new k(`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:At(r)?[pe]:W(r)?[Pt]:[F],positive:It(l.positive),negative:It(l.negative)},this.#t={input:r,output:o,positive:l.positive instanceof U.ZodType?l.positive:l.positive.schema,negative:l.negative instanceof U.ZodType?l.negative:l.negative.schema},this.#s={positive:l.positive instanceof U.ZodType?re.positive:l.positive.statusCode||re.positive,negative:l.negative instanceof U.ZodType?re.negative:l.negative.statusCode||re.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?te(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 U.ZodError?new $(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 U.ZodError?new L(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 U.ZodError?new L(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){Ie({logger:n,response:o,error:new ee(Q(d).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=_e(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=Zt(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=Q(c)}await this.#g({input:p,output:a,request:t,response:r,error:d,logger:o})}};var Ct=["get","post","put","delete","patch"];import{z as Nt}from"zod";var wt=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>be(s,n),o)};var Je=e=>{if(M(e.input))throw new k("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.object({}),middleware:async({request:a,response:d})=>new Promise((p,c)=>{t(a,d,g=>{if(g&&g instanceof Error)return c(o(g));p(n(a,d))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(Je({input:Nt.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 Ce({handler:r,middlewares:p,outputSchema:o,resultHandler:c,scopes:l,tags:h,methods:m,getOperationId:g,description:n,shortDescription:s,inputSchema:wt(p,t)})}},kr=new ue(le),Ur=new ue(Ye);import{inspect as Hr}from"util";import we from"winston";var{combine:Kr,colorize:Fr,timestamp:$r,printf:_r}=we.format,Qe=e=>{let t=s=>{let{[Symbol.for("level")]:a,[Symbol.for("message")]:d,[Symbol.for("splat")]:p,...c}=s;return Hr(c,!1,1,e.color)},r=s=>_r(({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=[$r()],n={handleExceptions:!0};switch(e.color&&o.push(Fr()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=Kr(...o),we.createLogger({silent:e.level==="silent",levels:we.config.npm.levels,transports:[new we.transports.Console(n)],exitOnError:!1})};var fe=class{constructor(t){this.endpoints=t}};import Br from"express";var ye=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Br.static(...this.params))}};var q=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new X(`The entry '${s}' must avoid having slashes \u2014 use nesting instead.`);let d=`${o||""}${s?`/${s}`:""}`;if(a instanceof oe){let p=a.getMethods().slice();n&&p.push("options"),p.forEach(c=>{t(a,d,c)})}else if(a instanceof ye)r&&a.apply(d,r);else if(a instanceof fe){if(Object.entries(a.endpoints).forEach(([p,c])=>{if(!c.getMethods().includes(p))throw new X(`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 q({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:d})})};var zt=()=>`
3
+ `,{url:t.url,payload:r})},j=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=Rt(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},de=(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}},ce=e=>e.reduce((t,r)=>t||r,!1),v=e=>e instanceof S.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof S.ZodUnion?ce(e.options.map(v)):e instanceof S.ZodIntersection?ce([e._def.left,e._def.right].map(v)):!1,E=({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 S.ZodObject?ce(Object.values(e.shape).map(s=>E({subject:s,...n}))):e instanceof S.ZodUnion?ce(e.options.map(s=>E({subject:s,...n}))):e instanceof S.ZodIntersection?ce([e._def.left,e._def.right].map(s=>E({subject:s,...n}))):e instanceof S.ZodOptional||e instanceof S.ZodNullable?E({subject:e.unwrap(),...n}):e instanceof S.ZodEffects||e instanceof S.ZodTransformer?E({subject:e.innerType(),...n}):e instanceof S.ZodRecord?E({subject:e.valueSchema,...n}):e instanceof S.ZodArray?E({subject:e.element,...n}):e instanceof S.ZodDefault?E({subject:e._def.innerType,...n}):!1},At=e=>E({subject:e,condition:t=>t instanceof J}),W=e=>E({subject:e,condition:t=>t instanceof A,maxDepth:3}),me=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,N=(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(""),Pe=e=>vr("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ze=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},ae=e=>typeof e=="string"?{message:e}:e||{};var X=class extends Error{name="RoutingError"},P=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
+ Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},k=class extends Error{name="IOSchemaError"},$=class extends k{name="OutputValidationError";originalError;constructor(t){super(M(t)),this.originalError=t}},L=class extends k{name="InputValidationError";originalError;constructor(t){super(M(t)),this.originalError=t}},ee=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var Et=e=>typeof e=="object"&&e!==null,_=e=>Et(e)&&"or"in e,B=e=>Et(e)&&"and"in e,Ae=e=>({and:e.reduce((t,r)=>t.concat(B(r)?r.and:r),[])}),Ee=(e,t)=>B(e)?{and:e.and.map(r=>_(r)?{or:r.or.map(t)}:t(r))}:_(e)?{or:e.or.map(r=>B(r)?{and:r.and.map(t)}:t(r))}:t(e),qe=e=>e.and.reduce((t,r)=>{let o=de(t.or,_(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(Ae),t},{or:[]}),te=(e,t)=>{if(B(e))return B(t)?Ae([e,t]):_(t)?te(qe(e),t):Ae([e,t]);if(_(e)){if(B(t))return te(t,e);if(_(t)){let{type:r,value:o}=de(e.or,t.or);return{or:r==="single"?o:o.map(Ae)}}return te(e,{and:[t]})}return B(t)||_(t)?te(t,e):{and:[e,t]}};import{z as I}from"zod";var re={positive:200,negative:400},Ve=e=>e,le=Ve({getPositiveResponse:e=>{let t=j({schema:e}),r=D(I.object({status:I.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>D(I.object({status:I.literal("error"),error:I.object({message:I.string()})})).example({status:"error",error:{message:M(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(re.positive).json({status:"success",data:r});return}let a=Re(e);Ge({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:M(e)}})}}),Ye=Ve({getPositiveResponse:e=>{let t=j({schema:e}),r=D("shape"in e&&"items"in e.shape&&e.shape.items instanceof I.ZodArray?e.shape.items:I.array(I.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:()=>D(I.string()).example(M(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Re(r);Ge({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")}}),Ie=({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 It=(e,t=[F])=>{if(e instanceof U.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},oe=class{},Ce=class extends oe{#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:T})=>{if(v(T))throw new k(`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:At(r)?[pe]:W(r)?[Pt]:[F],positive:It(l.positive),negative:It(l.negative)},this.#t={input:r,output:o,positive:l.positive instanceof U.ZodType?l.positive:l.positive.schema,negative:l.negative instanceof U.ZodType?l.negative:l.negative.schema},this.#s={positive:l.positive instanceof U.ZodType?re.positive:l.positive.statusCode||re.positive,negative:l.negative instanceof U.ZodType?re.negative:l.negative.statusCode||re.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?te(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 U.ZodError?new $(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 U.ZodError?new L(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 U.ZodError?new L(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){Ie({logger:n,response:o,error:new ee(Q(d).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=_e(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=Zt(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=Q(c)}await this.#g({input:p,output:a,request:t,response:r,error:d,logger:o})}};var Ct=["get","post","put","delete","patch"];import{z as Nt}from"zod";var wt=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>be(s,n),o)};var Je=e=>{if(v(e.input))throw new k("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.object({}),middleware:async({request:a,response:d})=>new Promise((p,c)=>{t(a,d,g=>{if(g&&g instanceof Error)return c(o(g));p(n(a,d))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(Je({input:Nt.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 Ce({handler:r,middlewares:p,outputSchema:o,resultHandler:c,scopes:l,tags:h,methods:m,getOperationId:g,description:n,shortDescription:s,inputSchema:wt(p,t)})}},kr=new ue(le),Ur=new ue(Ye);import{inspect as Hr}from"util";import we from"winston";var{combine:Kr,colorize:Fr,timestamp:$r,printf:_r}=we.format,Qe=e=>{let t=s=>{let{[Symbol.for("level")]:a,[Symbol.for("message")]:d,[Symbol.for("splat")]:p,...c}=s;return Hr(c,!1,1,e.color)},r=s=>_r(({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=[$r()],n={handleExceptions:!0};switch(e.color&&o.push(Fr()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=Kr(...o),we.createLogger({silent:e.level==="silent",levels:we.config.npm.levels,transports:[new we.transports.Console(n)],exitOnError:!1})};var fe=class{constructor(t){this.endpoints=t}};import Br from"express";var ye=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Br.static(...this.params))}};var G=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new X(`The entry '${s}' must avoid having slashes \u2014 use nesting instead.`);let d=`${o||""}${s?`/${s}`:""}`;if(a instanceof oe){let p=a.getMethods().slice();n&&p.push("options"),p.forEach(c=>{t(a,d,c)})}else if(a instanceof ye)r&&a.apply(d,r);else if(a instanceof fe){if(Object.entries(a.endpoints).forEach(([p,c])=>{if(!c.getMethods().includes(p))throw new X(`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 G({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:d})})};var zt=()=>`
6
6
  \x1B[94m\x1B[39m
7
7
  \x1B[94m\x1B[39m
8
8
  \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
@@ -19,7 +19,7 @@ Original error: ${e.originalError.message}.`:""))};var It=(e,t=[F])=>{if(e insta
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 We=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(zt()),q({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)}})};import Dt from"express";import qr from"compression";import Vr from"express-fileupload";import Gr from"http";import Mt from"https";import{Logger as Yr}from"winston";import vt from"http-errors";var Jr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:vt(400,Q(r).message),request:o,response:n,logger:t,input:null,output:null})},Qr=(e,t)=>(r,o)=>{let n=vt(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Ie({response:o,logger:t,error:new ee(Q(s).message,n)})}},jt=e=>{let t=e.logger instanceof Yr?e.logger:Qe(e.logger),r=e.errorHandler||le,o=Qr(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Wr=(e,t)=>{let{logger:r,notFoundHandler:o}=jt(e);return We({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},Xr=(e,t)=>{let r=Dt().disable("x-powered-by");e.server.compression&&r.use(qr(typeof e.server.compression=="object"?e.server.compression:void 0)),r.use(e.server.jsonParser||Dt.json()),e.server.upload&&r.use(Vr({...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}=jt(e);r.use(Jr(n,o)),We({app:r,routing:t,logger:o,config:e}),r.use(s);let a={httpServer:Gr.createServer(r),httpsServer:e.https?Mt.createServer(e.https.options,r):void 0};for(let d of Object.values(a)){let p=d instanceof Mt.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}};import{OpenApiBuilder as Fo}from"openapi3-ts/oas30";import{isReferenceObject as Kt,isSchemaObject as xe}from"openapi3-ts/oas30";import{omit as he}from"ramda";import{z as b}from"zod";import{INVALID as Lt,ZodIssueCode as Xe,ZodParsedType as kt,ZodType as eo,addIssueToContext as et}from"zod";var tt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,to="ZodDateIn",Ne=class e extends eo{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==kt.string)return et(o,{code:Xe.invalid_type,expected:kt.string,received:o.parsedType}),Lt;tt.test(o.data)||(et(o,{code:Xe.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Se(n)?{status:r.value,value:n}:(et(o,{code:Xe.invalid_date}),Lt)}static create=()=>new e({typeName:to})};var V=({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=>V({...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 Ut=50,Ft="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",ro={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},$t=/:([A-Za-z0-9_]+)/g,_t=e=>{let t=e.match($t);return t?t.map(r=>r.slice(1)):[]},Bt=e=>e.replace($t,t=>`{${t.slice(1)}}`),oo=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),no=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),so=()=>({format:"any"}),io=e=>{if(e.isResponse)throw new P({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},ao=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||e?"binary":t?"byte":"file"}),po=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),co=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),mo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),lo=({schema:e,next:t})=>t({schema:e.unwrap()}),uo=({schema:e,next:t})=>t({schema:e._def.innerType}),fo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Ht=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),yo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),go=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&me(s)?s instanceof b.ZodOptional:s.isOptional())});return{type:"object",properties:ze({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},ho=()=>({type:"string",nullable:!0,format:"null"}),xo=e=>{if(e.isResponse)throw new P({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:tt.source,externalDocs:{url:Ft}}},To=e=>{if(!e.isResponse)throw new P({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Ft}}},bo=e=>{throw new P({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},Oo=()=>({type:"boolean"}),So=()=>({type:"integer",format:"bigint"}),Ro=e=>e.reduce((t,r)=>t&&r instanceof b.ZodLiteral,!0),Po=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof b.ZodEnum||e instanceof b.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:ze({schema:b.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof b.ZodLiteral)return{type:"object",properties:ze({schema:b.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof b.ZodUnion&&Ro(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:ze({schema:b.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},Zo=({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}}),Ao=({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}: ${xe(o)?o.type:o.$ref}`).join(", ")}}}},Eo=({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"),T=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},...T&&{pattern:`/${T.source}/${T.flags}`}}},Io=({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}},ze=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Co=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return ro?.[t]},wo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&xe(o)){let s=Ze({effect:n,sample:Co(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:b.any()})}if(!t&&n.type==="preprocess"&&xe(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},No=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),zo=({schema:e,next:t})=>t({schema:e.unwrap()}),Do=({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}))))()},qt=(e,t,r=[])=>{let o=j({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)?he(r,s):s}}),{})}},Mo=(e,t,r)=>{let o=j({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,{})}},ge=(e,t)=>{if(e instanceof b.ZodObject)return e;let r;if(e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>ge(o,t)).reduce((o,n)=>o.merge(n.partial()),b.object({}));else if(e instanceof b.ZodEffects){if(M(e))throw new P({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=ge(e._def.schema,t)}else r=ge(e._def.left,t).merge(ge(e._def.right,t));return be(e,r)},Vt=({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=ge(c,{path:e,method:t,isResponse:!1}).shape,g=_t(e),l=o.includes("query"),h=o.includes("params"),T=o.includes("headers"),x=u=>h&&g.includes(u),C=u=>T&&Be(u);return Object.keys(m).filter(u=>l||x(u)).map(u=>{let O=V({schema:m[u],isResponse:!1,rules:ot,onEach:nt,onMissing:st,serializer:n,getRef:s,makeRef:a,path:e,method:t}),w=d==="components"?a(N(e,t,`${p} ${u}`),O):O;return{name:u,in:x(u)?"path":C(u)?"header":"query",required:!m[u].isOptional(),description:xe(O)&&O.description||`${t.toUpperCase()} ${e} ${p}`,schema:w,...Mo(c,!1,u)}})},ot={ZodString:Eo,ZodNumber:Io,ZodBigInt:So,ZodBoolean:Oo,ZodDateIn:xo,ZodDateOut:To,ZodNull:ho,ZodArray:Zo,ZodTuple:Ao,ZodRecord:Po,ZodObject:go,ZodLiteral:yo,ZodIntersection:mo,ZodUnion:po,ZodFile:ao,ZodUpload:io,ZodAny:so,ZodDefault:oo,ZodEnum:Ht,ZodNativeEnum:Ht,ZodEffects:wo,ZodOptional:lo,ZodNullable:fo,ZodDiscriminatedUnion:co,ZodBranded:zo,ZodDate:bo,ZodCatch:no,ZodPipeline:No,ZodLazy:Do,ZodReadonly:uo},nt=({schema:e,isResponse:t,prev:r})=>{if(Kt(r))return{};let{description:o}=e,n=e instanceof b.ZodLazy,s=r.type!==void 0,a=t&&me(e),d=!n&&s&&!a&&e.isNullable(),p=n?[]:j({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...p.length>0&&{example:p[0]}}},st=({schema:e,...t})=>{throw new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},rt=(e,t)=>{if(Kt(e))return e;let r=e.properties?he(t,e.properties):void 0,o=e.example?he(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>rt(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>rt(d,t)):void 0;return he(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})},Gt=e=>xe(e)?he(["example"],e):e,it=({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=Gt(V({schema:c,isResponse:!0,rules:ot,onEach:nt,onMissing:st,serializer:n,getRef:s,makeRef:a,path:t,method:e})),l=qt(c,!0),h=d==="components"?a(N(t,e,p),g):g;return{description:`${e.toUpperCase()} ${t} ${p}`,content:m.reduce((T,x)=>({...T,[x]:{schema:h,...l}}),{})}},vo=()=>({type:"http",scheme:"basic"}),jo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Lo=({name:e})=>({type:"apiKey",in:"query",name:e}),ko=({name:e})=>({type:"apiKey",in:"header",name:e}),Uo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Ho=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Ko=({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}}},{})}),Yt=e=>{let t={basic:vo,bearer:jo,input:Lo,header:ko,cookie:Uo,openid:Ho,oauth2:Ko};return Ee(e,r=>t[r.type](r))},De=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 De(Ve(e))}return De({or:[e]})},Jt=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let p=_t(t),c=r.getSchema("input"),m=Gt(rt(V({schema:W(c)?A.create().buffer():c,isResponse:!1,rules:ot,onEach:nt,onMissing:st,serializer:o,getRef:n,makeRef:s,path:t,method:e}),p)),g=qt(r.getSchema("input"),!1,p),l=a==="components"?s(N(t,e,d),m):m;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((h,T)=>({...h,[T]:{schema:l,...g}}),{})}},Qt=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}}}}),at=e=>e.length<=Ut?e:e.slice(0,Ut-1)+"\u2026";var dt=class extends Fo{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o){if(o in this.lastOperationIdSuffixes)throw new P({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return this.lastOperationIdSuffixes[o]=1,o}let n=N(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=Pe}){super(),this.addInfo({title:o,version:n});for(let l of typeof s=="string"?[s]:s)this.addServer({url:l});q({routing:t,onEndpoint:(l,h,T)=>{let x=T,C={path:h,method:x,endpoint:l,composition:c,serializer:m,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[u,O]=["short","long"].map(l.getDescription.bind(l)),w=r.inputSources?.[x]||Oe[x],ne=Vt({...C,inputSources:w}),Z={operationId:this.ensureUniqOperationId(h,x,l.getOperationId(x)),responses:{[l.getStatusCode("positive")]:it({...C,clue:a,isPositive:!0}),[l.getStatusCode("negative")]:it({...C,clue:d,isPositive:!1})}};O&&(Z.description=O,p&&u===void 0&&(Z.summary=at(O))),u&&(Z.summary=at(u)),l.getTags().length>0&&(Z.tags=l.getTags()),ne.length>0&&(Z.parameters=ne),w.includes("body")&&(Z.requestBody=Jt(C));let se=De(Ee(Yt(l.getSecurity()),ie=>{let bt=this.ensureUniqSecuritySchemaName(ie),yr=["oauth2","openIdConnect"].includes(ie.type)?l.getScopes():[];return this.addSecurityScheme(bt,ie),{name:bt,scopes:yr}}));se.length>0&&(Z.security=se);let Ke=Bt(h);this.addPath(Ke,{[x]:Z})}}),this.rootDoc.tags=r.tags?Qt(r.tags):[]}};import Wt from"http";var $o=e=>({method:"GET",header:jest.fn(()=>F),...e}),_o=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:Wt.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=Wt.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},Bo=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=$o(t),d=_o(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}};import K from"typescript";import z from"typescript";var i=z.factory,G=[i.createModifier(z.SyntaxKind.ExportKeyword)],qo=[i.createModifier(z.SyntaxKind.AsyncKeyword)],Vo=[i.createModifier(z.SyntaxKind.PublicKeyword),i.createModifier(z.SyntaxKind.ReadonlyKeyword)],Xt=[i.createModifier(z.SyntaxKind.ProtectedKeyword),i.createModifier(z.SyntaxKind.ReadonlyKeyword)],Go=i.createTemplateHead(""),Yo=i.createTemplateTail(""),Jo=i.createTemplateMiddle(" "),pt=e=>i.createTemplateLiteralType(Go,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Yo:Jo))),ct=pt(["M","P"]),Me=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),ve=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Me(o,e[o],t)),[]),mt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),er=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),lt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),ut=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],z.NodeFlags.Const),ft=(e,t)=>i.createTypeAliasDeclaration(G,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),je=(e,t)=>i.createTypeAliasDeclaration(G,e,void 0,t),tr=(e,t,r)=>i.createPropertyDeclaration(Vo,e,void 0,t,r),rr=(e,t,r=[])=>i.createClassDeclaration(G,e,void 0,void 0,[t,...r]),or=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),nr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(z.SyntaxKind.AnyKeyword)]),yt=(e,t,r)=>i.createInterfaceDeclaration(G,e,void 0,t,r),sr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),ir=(e,t)=>i.createArrowFunction(qo,void 0,e.map(r=>Me(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),gt=(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,ve({acc:void 0,key:void 0}),void 0,void 0,t),r]);import y from"typescript";import{z as Wo}from"zod";import H from"typescript";var{factory:Le}=H,ht=(e,t)=>{H.addSyntheticLeadingComment(e,H.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ke=(e,t,r)=>{let o=Le.createTypeAliasDeclaration(void 0,Le.createIdentifier(t),void 0,e);return r&&ht(o,r),o},ar=(e,t)=>{let r=H.createSourceFile("print.ts","",H.ScriptTarget.Latest,!1,H.ScriptKind.TS);return H.createPrinter(t).printNode(H.EmitHint.Unspecified,e,r)},Qo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,dr=e=>Qo.test(e)?Le.createIdentifier(e):Le.createStringLiteral(e);var{factory:f}=y,Xo={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},en=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),tn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&me(a)?a instanceof Wo.ZodOptional:a.isOptional(),p=f.createPropertySignature(void 0,dr(s),d&&o?f.createToken(y.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&ht(p,a.description),p});return f.createTypeLiteralNode(n)},rn=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),on=({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}))),nn=e=>Xo?.[e.kind],sn=({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:nn(o)}),a={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(s&&a[s]||y.SyntaxKind.AnyKeyword)}return o},an=({schema:e})=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),dn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},pn=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),cn=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),mn=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),ln=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),un=({next:e,schema:t})=>e({schema:t._def.innerType}),Y=e=>()=>f.createKeywordTypeNode(e),fn=({next:e,schema:t})=>e({schema:t.unwrap()}),yn=({next:e,schema:t})=>e({schema:t._def.innerType}),gn=({next:e,schema:t})=>e({schema:t._def.innerType}),hn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),xn=()=>f.createLiteralTypeNode(f.createNull()),Tn=({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}))))()},bn=({schema:{isBuffer:e}})=>e?f.createTypeReferenceNode("Buffer"):f.createKeywordTypeNode(y.SyntaxKind.StringKeyword),On={ZodString:Y(y.SyntaxKind.StringKeyword),ZodNumber:Y(y.SyntaxKind.NumberKeyword),ZodBigInt:Y(y.SyntaxKind.BigIntKeyword),ZodBoolean:Y(y.SyntaxKind.BooleanKeyword),ZodDateIn:Y(y.SyntaxKind.StringKeyword),ZodDateOut:Y(y.SyntaxKind.StringKeyword),ZodNull:xn,ZodArray:rn,ZodTuple:cn,ZodRecord:mn,ZodObject:tn,ZodLiteral:en,ZodIntersection:ln,ZodUnion:pr,ZodFile:bn,ZodAny:Y(y.SyntaxKind.AnyKeyword),ZodDefault:un,ZodEnum:on,ZodNativeEnum:an,ZodEffects:sn,ZodOptional:dn,ZodNullable:pn,ZodDiscriminatedUnion:pr,ZodBranded:fn,ZodCatch:gn,ZodPipeline:hn,ZodLazy:Tn,ZodReadonly:yn},xt=({schema:e,...t})=>V({schema:e,rules:On,onMissing:()=>f.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),...t});var Tt=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=ke(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Pe,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){q({routing:t,onEndpoint:(u,O,w)=>{let ne=N(O,w,"input"),He=N(O,w,"response"),Z={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},se=u.getSchema("input"),Ke=xt({...Z,schema:W(se)?A.create().buffer():se,isResponse:!1}),ie=xt({...Z,isResponse:!0,schema:u.getSchema("positive").or(u.getSchema("negative"))});this.agg.push(ke(Ke,ne),ke(ie,He)),w!=="options"&&(this.paths.push(O),this.registry[`${w} ${O}`]={in:ne,out:He,isJson:u.getMimeTypes("positive").includes(F),tags:u.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=ft("Path",this.paths),a=ft("Method",Ct),d=je("MethodPath",pt([a.name,s.name])),p=[i.createHeritageClause(K.SyntaxKind.ExtendsKeyword,[mt(d.name,K.SyntaxKind.AnyKeyword)])],c=yt("Input",p,Object.keys(this.registry).map(u=>lt(u,this.registry[u].in))),m=yt("Response",p,Object.keys(this.registry).map(u=>lt(u,this.registry[u].out)));if(this.agg.push(s,a,d,c,m),r==="types")return;let g=i.createVariableStatement(G,ut("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(u=>this.registry[u].isJson).map(u=>i.createPropertyAssignment(`"${u}"`,i.createTrue()))))),l=i.createVariableStatement(G,ut("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(u=>i.createPropertyAssignment(`"${u}"`,i.createArrayLiteralExpression(this.registry[u].tags.map(O=>i.createStringLiteral(O)))))))),h=je("Provider",i.createFunctionTypeNode(sr({M:a.name,P:s.name}),ve({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),ct)}),or(m.name,ct))),T=je("Implementation",i.createFunctionTypeNode(void 0,ve({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(K.SyntaxKind.StringKeyword),params:mt(K.SyntaxKind.StringKeyword,K.SyntaxKind.AnyKeyword)}),nr())),x=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),C=rr("ExpressZodAPIClient",er([Me("implementation",i.createTypeReferenceNode(T.name),Xt)]),[tr("provide",i.createTypeReferenceNode(h.name),ir(["method","path","params"],[i.createIdentifier("method"),gt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[x,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),gt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[x]),K.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())]))]);K.addSyntheticLeadingComment(C,K.SyntaxKind.MultiLineCommentTrivia,`
22
+ `.trim();var We=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(zt()),G({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)}})};import Dt from"express";import Gr from"compression";import qr from"express-fileupload";import Vr from"http";import vt from"https";import{Logger as Yr}from"winston";import Mt from"http-errors";var Jr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:Mt(400,Q(r).message),request:o,response:n,logger:t,input:null,output:null})},Qr=(e,t)=>(r,o)=>{let n=Mt(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Ie({response:o,logger:t,error:new ee(Q(s).message,n)})}},jt=e=>{let t=e.logger instanceof Yr?e.logger:Qe(e.logger),r=e.errorHandler||le,o=Qr(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Wr=(e,t)=>{let{logger:r,notFoundHandler:o}=jt(e);return We({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},Xr=(e,t)=>{let r=Dt().disable("x-powered-by");e.server.compression&&r.use(Gr(typeof e.server.compression=="object"?e.server.compression:void 0)),r.use(e.server.jsonParser||Dt.json()),e.server.upload&&r.use(qr({...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}=jt(e);r.use(Jr(n,o)),We({app:r,routing:t,logger:o,config:e}),r.use(s);let a={httpServer:Vr.createServer(r),httpsServer:e.https?vt.createServer(e.https.options,r):void 0};for(let d of Object.values(a)){let p=d instanceof vt.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}};import{OpenApiBuilder as Fo}from"openapi3-ts/oas30";import{isReferenceObject as Kt,isSchemaObject as xe}from"openapi3-ts/oas30";import{omit as he}from"ramda";import{z as b}from"zod";import{INVALID as Lt,ZodIssueCode as Xe,ZodParsedType as kt,ZodType as eo,addIssueToContext as et}from"zod";var tt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,to="ZodDateIn",Ne=class e extends eo{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==kt.string)return et(o,{code:Xe.invalid_type,expected:kt.string,received:o.parsedType}),Lt;tt.test(o.data)||(et(o,{code:Xe.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Se(n)?{status:r.value,value:n}:(et(o,{code:Xe.invalid_date}),Lt)}static create=()=>new e({typeName:to})};var q=({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=>q({...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 Ut=50,Ft="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",ro={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},$t=/:([A-Za-z0-9_]+)/g,_t=e=>{let t=e.match($t);return t?t.map(r=>r.slice(1)):[]},Bt=e=>e.replace($t,t=>`{${t.slice(1)}}`),oo=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),no=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),so=()=>({format:"any"}),io=e=>{if(e.isResponse)throw new P({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},ao=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||e?"binary":t?"byte":"file"}),po=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),co=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),mo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),lo=({schema:e,next:t})=>t({schema:e.unwrap()}),uo=({schema:e,next:t})=>t({schema:e._def.innerType}),fo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Ht=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),yo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),go=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&me(s)?s instanceof b.ZodOptional:s.isOptional())});return{type:"object",properties:ze({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},ho=()=>({type:"string",nullable:!0,format:"null"}),xo=e=>{if(e.isResponse)throw new P({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:tt.source,externalDocs:{url:Ft}}},To=e=>{if(!e.isResponse)throw new P({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Ft}}},bo=e=>{throw new P({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},Oo=()=>({type:"boolean"}),So=()=>({type:"integer",format:"bigint"}),Ro=e=>e.reduce((t,r)=>t&&r instanceof b.ZodLiteral,!0),Po=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof b.ZodEnum||e instanceof b.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:ze({schema:b.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof b.ZodLiteral)return{type:"object",properties:ze({schema:b.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof b.ZodUnion&&Ro(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:ze({schema:b.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},Zo=({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}}),Ao=({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}: ${xe(o)?o.type:o.$ref}`).join(", ")}}}},Eo=({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"),T=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},...T&&{pattern:`/${T.source}/${T.flags}`}}},Io=({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}},ze=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Co=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return ro?.[t]},wo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&xe(o)){let s=Ze({effect:n,sample:Co(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:b.any()})}if(!t&&n.type==="preprocess"&&xe(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},No=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),zo=({schema:e,next:t})=>t({schema:e.unwrap()}),Do=({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}))))()},Gt=(e,t,r=[])=>{let o=j({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)?he(r,s):s}}),{})}},vo=(e,t,r)=>{let o=j({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,{})}},ge=(e,t)=>{if(e instanceof b.ZodObject)return e;let r;if(e instanceof b.ZodUnion||e instanceof b.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>ge(o,t)).reduce((o,n)=>o.merge(n.partial()),b.object({}));else if(e instanceof b.ZodEffects){if(v(e))throw new P({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=ge(e._def.schema,t)}else r=ge(e._def.left,t).merge(ge(e._def.right,t));return be(e,r)},qt=({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=ge(c,{path:e,method:t,isResponse:!1}).shape,g=_t(e),l=o.includes("query"),h=o.includes("params"),T=o.includes("headers"),x=u=>h&&g.includes(u),C=u=>T&&Be(u);return Object.keys(m).filter(u=>l||x(u)).map(u=>{let O=q({schema:m[u],isResponse:!1,rules:ot,onEach:nt,onMissing:st,serializer:n,getRef:s,makeRef:a,path:e,method:t}),w=d==="components"?a(N(e,t,`${p} ${u}`),O):O;return{name:u,in:x(u)?"path":C(u)?"header":"query",required:!m[u].isOptional(),description:xe(O)&&O.description||`${t.toUpperCase()} ${e} ${p}`,schema:w,...vo(c,!1,u)}})},ot={ZodString:Eo,ZodNumber:Io,ZodBigInt:So,ZodBoolean:Oo,ZodDateIn:xo,ZodDateOut:To,ZodNull:ho,ZodArray:Zo,ZodTuple:Ao,ZodRecord:Po,ZodObject:go,ZodLiteral:yo,ZodIntersection:mo,ZodUnion:po,ZodFile:ao,ZodUpload:io,ZodAny:so,ZodDefault:oo,ZodEnum:Ht,ZodNativeEnum:Ht,ZodEffects:wo,ZodOptional:lo,ZodNullable:fo,ZodDiscriminatedUnion:co,ZodBranded:zo,ZodDate:bo,ZodCatch:no,ZodPipeline:No,ZodLazy:Do,ZodReadonly:uo},nt=({schema:e,isResponse:t,prev:r})=>{if(Kt(r))return{};let{description:o}=e,n=e instanceof b.ZodLazy,s=r.type!==void 0,a=t&&me(e),d=!n&&s&&!a&&e.isNullable(),p=n?[]:j({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...p.length>0&&{example:p[0]}}},st=({schema:e,...t})=>{throw new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},rt=(e,t)=>{if(Kt(e))return e;let r=e.properties?he(t,e.properties):void 0,o=e.example?he(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>rt(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>rt(d,t)):void 0;return he(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})},Vt=e=>xe(e)?he(["example"],e):e,it=({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=Vt(q({schema:c,isResponse:!0,rules:ot,onEach:nt,onMissing:st,serializer:n,getRef:s,makeRef:a,path:t,method:e})),l=Gt(c,!0),h=d==="components"?a(N(t,e,p),g):g;return{description:`${e.toUpperCase()} ${t} ${p}`,content:m.reduce((T,x)=>({...T,[x]:{schema:h,...l}}),{})}},Mo=()=>({type:"http",scheme:"basic"}),jo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Lo=({name:e})=>({type:"apiKey",in:"query",name:e}),ko=({name:e})=>({type:"apiKey",in:"header",name:e}),Uo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Ho=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Ko=({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}}},{})}),Yt=e=>{let t={basic:Mo,bearer:jo,input:Lo,header:ko,cookie:Uo,openid:Ho,oauth2:Ko};return Ee(e,r=>t[r.type](r))},De=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 De(qe(e))}return De({or:[e]})},Jt=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let p=_t(t),c=r.getSchema("input"),m=Vt(rt(q({schema:W(c)?A.create().buffer():c,isResponse:!1,rules:ot,onEach:nt,onMissing:st,serializer:o,getRef:n,makeRef:s,path:t,method:e}),p)),g=Gt(r.getSchema("input"),!1,p),l=a==="components"?s(N(t,e,d),m):m;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((h,T)=>({...h,[T]:{schema:l,...g}}),{})}},Qt=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}}}}),at=e=>e.length<=Ut?e:e.slice(0,Ut-1)+"\u2026";var dt=class extends Fo{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o){if(o in this.lastOperationIdSuffixes)throw new P({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return this.lastOperationIdSuffixes[o]=1,o}let n=N(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=Pe}){super(),this.addInfo({title:o,version:n});for(let l of typeof s=="string"?[s]:s)this.addServer({url:l});G({routing:t,onEndpoint:(l,h,T)=>{let x=T,C={path:h,method:x,endpoint:l,composition:c,serializer:m,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[u,O]=["short","long"].map(l.getDescription.bind(l)),w=r.inputSources?.[x]||Oe[x],ne=qt({...C,inputSources:w}),Z={operationId:this.ensureUniqOperationId(h,x,l.getOperationId(x)),responses:{[l.getStatusCode("positive")]:it({...C,clue:a,isPositive:!0}),[l.getStatusCode("negative")]:it({...C,clue:d,isPositive:!1})}};O&&(Z.description=O,p&&u===void 0&&(Z.summary=at(O))),u&&(Z.summary=at(u)),l.getTags().length>0&&(Z.tags=l.getTags()),ne.length>0&&(Z.parameters=ne),w.includes("body")&&(Z.requestBody=Jt(C));let se=De(Ee(Yt(l.getSecurity()),ie=>{let bt=this.ensureUniqSecuritySchemaName(ie),yr=["oauth2","openIdConnect"].includes(ie.type)?l.getScopes():[];return this.addSecurityScheme(bt,ie),{name:bt,scopes:yr}}));se.length>0&&(Z.security=se);let Ke=Bt(h);this.addPath(Ke,{[x]:Z})}}),this.rootDoc.tags=r.tags?Qt(r.tags):[]}};import Wt from"http";var $o=e=>({method:"GET",header:jest.fn(()=>F),...e}),_o=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:Wt.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=Wt.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},Bo=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=$o(t),d=_o(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}};import K from"typescript";import z from"typescript";var i=z.factory,V=[i.createModifier(z.SyntaxKind.ExportKeyword)],Go=[i.createModifier(z.SyntaxKind.AsyncKeyword)],qo=[i.createModifier(z.SyntaxKind.PublicKeyword),i.createModifier(z.SyntaxKind.ReadonlyKeyword)],Xt=[i.createModifier(z.SyntaxKind.ProtectedKeyword),i.createModifier(z.SyntaxKind.ReadonlyKeyword)],Vo=i.createTemplateHead(""),Yo=i.createTemplateTail(""),Jo=i.createTemplateMiddle(" "),pt=e=>i.createTemplateLiteralType(Vo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Yo:Jo))),ct=pt(["M","P"]),ve=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Me=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(ve(o,e[o],t)),[]),mt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),er=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),lt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),ut=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],z.NodeFlags.Const),ft=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),je=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,t),tr=(e,t,r)=>i.createPropertyDeclaration(qo,e,void 0,t,r),rr=(e,t,r=[])=>i.createClassDeclaration(V,e,void 0,void 0,[t,...r]),or=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),nr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(z.SyntaxKind.AnyKeyword)]),yt=(e,t,r)=>i.createInterfaceDeclaration(V,e,void 0,t,r),sr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),ir=(e,t)=>i.createArrowFunction(Go,void 0,e.map(r=>ve(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),gt=(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,Me({acc:void 0,key:void 0}),void 0,void 0,t),r]);import y from"typescript";import{z as Wo}from"zod";import H from"typescript";var{factory:Le}=H,ht=(e,t)=>{H.addSyntheticLeadingComment(e,H.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ke=(e,t,r)=>{let o=Le.createTypeAliasDeclaration(void 0,Le.createIdentifier(t),void 0,e);return r&&ht(o,r),o},ar=(e,t)=>{let r=H.createSourceFile("print.ts","",H.ScriptTarget.Latest,!1,H.ScriptKind.TS);return H.createPrinter(t).printNode(H.EmitHint.Unspecified,e,r)},Qo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,dr=e=>Qo.test(e)?Le.createIdentifier(e):Le.createStringLiteral(e);var{factory:f}=y,Xo={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},en=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),tn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&me(a)?a instanceof Wo.ZodOptional:a.isOptional(),p=f.createPropertySignature(void 0,dr(s),d&&o?f.createToken(y.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&ht(p,a.description),p});return f.createTypeLiteralNode(n)},rn=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),on=({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}))),nn=e=>Xo?.[e.kind],sn=({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:nn(o)}),a={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(s&&a[s]||y.SyntaxKind.AnyKeyword)}return o},an=({schema:e})=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),dn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},pn=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),cn=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),mn=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),ln=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),un=({next:e,schema:t})=>e({schema:t._def.innerType}),Y=e=>()=>f.createKeywordTypeNode(e),fn=({next:e,schema:t})=>e({schema:t.unwrap()}),yn=({next:e,schema:t})=>e({schema:t._def.innerType}),gn=({next:e,schema:t})=>e({schema:t._def.innerType}),hn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),xn=()=>f.createLiteralTypeNode(f.createNull()),Tn=({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}))))()},bn=({schema:{isBuffer:e}})=>e?f.createTypeReferenceNode("Buffer"):f.createKeywordTypeNode(y.SyntaxKind.StringKeyword),On={ZodString:Y(y.SyntaxKind.StringKeyword),ZodNumber:Y(y.SyntaxKind.NumberKeyword),ZodBigInt:Y(y.SyntaxKind.BigIntKeyword),ZodBoolean:Y(y.SyntaxKind.BooleanKeyword),ZodDateIn:Y(y.SyntaxKind.StringKeyword),ZodDateOut:Y(y.SyntaxKind.StringKeyword),ZodNull:xn,ZodArray:rn,ZodTuple:cn,ZodRecord:mn,ZodObject:tn,ZodLiteral:en,ZodIntersection:ln,ZodUnion:pr,ZodFile:bn,ZodAny:Y(y.SyntaxKind.AnyKeyword),ZodDefault:un,ZodEnum:on,ZodNativeEnum:an,ZodEffects:sn,ZodOptional:dn,ZodNullable:pn,ZodDiscriminatedUnion:pr,ZodBranded:fn,ZodCatch:gn,ZodPipeline:hn,ZodLazy:Tn,ZodReadonly:yn},xt=({schema:e,...t})=>q({schema:e,rules:On,onMissing:()=>f.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),...t});var Tt=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=ke(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Pe,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){G({routing:t,onEndpoint:(u,O,w)=>{let ne=N(O,w,"input"),He=N(O,w,"response"),Z={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},se=u.getSchema("input"),Ke=xt({...Z,schema:W(se)?A.create().buffer():se,isResponse:!1}),ie=xt({...Z,isResponse:!0,schema:u.getSchema("positive").or(u.getSchema("negative"))});this.agg.push(ke(Ke,ne),ke(ie,He)),w!=="options"&&(this.paths.push(O),this.registry[`${w} ${O}`]={in:ne,out:He,isJson:u.getMimeTypes("positive").includes(F),tags:u.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=ft("Path",this.paths),a=ft("Method",Ct),d=je("MethodPath",pt([a.name,s.name])),p=[i.createHeritageClause(K.SyntaxKind.ExtendsKeyword,[mt(d.name,K.SyntaxKind.AnyKeyword)])],c=yt("Input",p,Object.keys(this.registry).map(u=>lt(u,this.registry[u].in))),m=yt("Response",p,Object.keys(this.registry).map(u=>lt(u,this.registry[u].out)));if(this.agg.push(s,a,d,c,m),r==="types")return;let g=i.createVariableStatement(V,ut("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(u=>this.registry[u].isJson).map(u=>i.createPropertyAssignment(`"${u}"`,i.createTrue()))))),l=i.createVariableStatement(V,ut("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(u=>i.createPropertyAssignment(`"${u}"`,i.createArrayLiteralExpression(this.registry[u].tags.map(O=>i.createStringLiteral(O)))))))),h=je("Provider",i.createFunctionTypeNode(sr({M:a.name,P:s.name}),Me({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),ct)}),or(m.name,ct))),T=je("Implementation",i.createFunctionTypeNode(void 0,Me({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(K.SyntaxKind.StringKeyword),params:mt(K.SyntaxKind.StringKeyword,K.SyntaxKind.AnyKeyword)}),nr())),x=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),C=rr("ExpressZodAPIClient",er([ve("implementation",i.createTypeReferenceNode(T.name),Xt)]),[tr("provide",i.createTypeReferenceNode(h.name),ir(["method","path","params"],[i.createIdentifier("method"),gt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[x,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),gt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[x]),K.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())]))]);K.addSyntheticLeadingComment(C,K.SyntaxKind.MultiLineCommentTrivia,`
23
23
  export const exampleImplementation: Implementation = async (
24
24
  method,
25
25
  path,
@@ -42,4 +42,4 @@ const client = new ExpressZodAPIClient(exampleImplementation);
42
42
  client.provide("get", "/v1/user/retrieve", { id: "10" });
43
43
  `,!0),this.agg.push(g,l,h,T,C)}print(t){return this.agg.map(r=>ar(r,t)).join(`
44
44
 
45
- `)}};var fr={};hr(fr,{dateIn:()=>En,dateOut:()=>In,file:()=>Zn,raw:()=>Cn,upload:()=>An});import{z as Pn}from"zod";import{INVALID as cr,ZodIssueCode as mr,ZodParsedType as lr,ZodType as Sn,addIssueToContext as ur}from"zod";var Rn="ZodDateOut",Ue=class e extends Sn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==lr.date?(ur(o,{code:mr.invalid_type,expected:lr.date,received:o.parsedType}),cr):Se(o.data)?{status:r.value,value:o.data.toISOString()}:(ur(o,{code:mr.invalid_date}),cr)}static create=()=>new e({typeName:Rn})};var Zn=A.create,An=J.create,En=Ne.create,In=Ue.create,Cn=()=>Pn.object({raw:A.create().buffer()});export{oe as AbstractEndpoint,fe as DependsOnMethod,dt as Documentation,P as DocumentationError,ue as EndpointsFactory,L as InputValidationError,Tt as Integration,$ as OutputValidationError,X as RoutingError,ye as ServeStatic,Ur as arrayEndpointsFactory,Ye as arrayResultHandler,Wr as attachRouting,xr as createConfig,Qe as createLogger,Je as createMiddleware,Ge as createResultHandler,Xr as createServer,kr as defaultEndpointsFactory,le as defaultResultHandler,fr as ez,j as getExamples,v as getMessageFromError,Re as getStatusCodeFromError,Bo as testEndpoint,D as withMeta};
45
+ `)}};var fr={};hr(fr,{dateIn:()=>En,dateOut:()=>In,file:()=>Zn,raw:()=>Cn,upload:()=>An});import{z as Pn}from"zod";import{INVALID as cr,ZodIssueCode as mr,ZodParsedType as lr,ZodType as Sn,addIssueToContext as ur}from"zod";var Rn="ZodDateOut",Ue=class e extends Sn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==lr.date?(ur(o,{code:mr.invalid_type,expected:lr.date,received:o.parsedType}),cr):Se(o.data)?{status:r.value,value:o.data.toISOString()}:(ur(o,{code:mr.invalid_date}),cr)}static create=()=>new e({typeName:Rn})};var Zn=A.create,An=J.create,En=Ne.create,In=Ue.create,Cn=()=>Pn.object({raw:A.create().buffer()});export{oe as AbstractEndpoint,fe as DependsOnMethod,dt as Documentation,P as DocumentationError,ue as EndpointsFactory,L as InputValidationError,Tt as Integration,$ as OutputValidationError,X as RoutingError,ye as ServeStatic,Ur as arrayEndpointsFactory,Ye as arrayResultHandler,Wr as attachRouting,xr as createConfig,Qe as createLogger,Je as createMiddleware,Ve as createResultHandler,Xr as createServer,kr as defaultEndpointsFactory,le as defaultResultHandler,fr as ez,j as getExamples,M as getMessageFromError,Re as getStatusCodeFromError,Bo as testEndpoint,D as withMeta};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "14.2.0",
3
+ "version": "14.2.1",
4
4
  "description": "A Typescript library to help you get an API server up and running with I/O schema validation and custom middlewares in minutes.",
5
5
  "license": "MIT",
6
6
  "scripts": {
@@ -115,7 +115,7 @@
115
115
  "jest": "^29.6.4",
116
116
  "make-coverage-badge": "^1.2.0",
117
117
  "mockdate": "^3.0.5",
118
- "prettier": "3.0.3",
118
+ "prettier": "3.1.0",
119
119
  "strip-ansi": "^6.0.1",
120
120
  "tsd": "^0.29.0",
121
121
  "tsup": "^7.2.0",