express-zod-api 15.0.0-beta3 → 15.0.0-beta5

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
@@ -5,56 +5,71 @@
5
5
  ### 15.0.0
6
6
 
7
7
  - **Breaking changes**:
8
- - `express-fileupload` and `compression` become optional peer dependencies;
8
+ - Packages `express-fileupload` and `compression` become optional peer dependencies;
9
9
  - Methods `createServer()` and `attachRouting()` become async;
10
- - Method `testEndpoint()` requires an additional argument;
11
- - Method `createLogger()` removed as redundant;
10
+ - Method `createLogger()` is removed;
12
11
  - Read the migration guide below.
13
12
  - Features:
14
- - `winston` is now optional: supporting any logger having `debug()`, `warn()`, `info()` and `error()` methods;
15
- - Introducing module augmentation approach for setting the type of chosen logger;
16
- - Supporting both `jest` and `vitest` frameworks for `testEndpoint()`.
13
+ - Supporting any logger having `debug()`, `warn()`, `info()` and `error()` methods;
14
+ - Package `winston` is now optional.
15
+ - Supporting any testing framework having a function mocking method for `testEndpoint()`:
16
+ - Both `jest` and `vitest` are supported automatically;
17
+ - With most modern Node.js you can also use the integrated `node:test` module.
18
+ - Introducing module augmentation approach for integrating chosen logger and testing framework.
17
19
  - How to migrate while maintaining previous functionality and behavior:
18
- - If you're going to continue using `winston`:
19
- - Near your `const config = createConfig(...)` add the module augmentation statement (see example below).
20
+ - Near your `const config` add a module augmentation statement based on `winston.Logger` type (see example below).
21
+ - If you've been using `createLogger()` method:
22
+ - Instead, place its argument as a value of the `logger` property supplied to `createConfig()`.
20
23
  - If you have `upload` option enabled in your config:
21
24
  - Install `express-fileupload` and `@types/express-fileupload` packages;
22
25
  - If you have `compression` option enabled in your config:
23
26
  - Install `compression` and `@types/compression` packages;
24
- - If you're using `createLogger()` method:
25
- - Place its argument as a value of `logger` property supplied to `createConfig()`.
26
27
  - If you're using the entities returned from `createServer()` or `attachRouting()` methods:
27
- - Add `await` before calling them: `const {...} = await createServer(...)`.
28
+ - Add `await` before calling those methods.
28
29
  - If you can not use `await` (on the top level of CommonJS):
29
30
  - Wrap your code with async IIFE or use `.then()` (see example below).
30
31
  - If you're using `testEndpoint()` method:
31
- - Add module augmentation statement once anywhere in your tests (see below).
32
+ - Add module augmentation statement once anywhere within your tests based on `jest.Mock` type (see example below).
32
33
 
33
34
  ```typescript
34
35
  import type { Logger } from "winston";
35
36
  import { createConfig, createServer, testEndpoint } from "express-zod-api";
36
37
 
37
- // The configuration remains the same
38
+ // Use logger property instead of the removed createLogger method
38
39
  const config = createConfig({
39
40
  logger: { level: "debug", color: true },
40
41
  });
41
42
 
42
- // Set the type of logger used near your configuration
43
+ // Set the type of the logger used near your configuration
43
44
  declare module "express-zod-api" {
44
45
  interface LoggerOverrides extends Logger {}
45
46
  }
46
47
 
47
- // await is only needed when you're using the returns of createServer() or attachRouting()
48
+ // if using entities returned from createServer() or attachRouting(): add "await" before it.
48
49
  // For using await on the top level CJS, wrap it in async IIFE:
49
50
  // (async () => { await ... })();
50
51
  const { app, httpServer } = await createServer(config, routing);
51
52
 
52
- // Adjust your tests: place it once anywhere
53
+ // Adjust your tests: set the MockOverrides type once anywhere
53
54
  declare module "express-zod-api" {
54
55
  interface MockOverrides extends jest.Mock {} // or Mock from vitest
55
56
  }
56
57
 
58
+ // Both jest and vitest are supported automatically
57
59
  const { responseMock } = await testEndpoint({ endpoint });
60
+
61
+ // For other testing frameworks:
62
+
63
+ // 1. specify fnMethod property
64
+ import { mock, Mock } from "node:test";
65
+ await testEndpoint({
66
+ endpoint,
67
+ fnMethod: mock.fn.bind(mock), // https://nodejs.org/docs/latest-v20.x/api/test.html#mocking
68
+ });
69
+ // 2. and set the MockOverrides type once
70
+ declare module "express-zod-api" {
71
+ interface MockOverrides extends Mock {} // Mock of your testing framework
72
+ }
58
73
  ```
59
74
 
60
75
  ## Version 14
package/README.md CHANGED
@@ -85,13 +85,16 @@ Therefore, many basic tasks can be accomplished faster and easier, in particular
85
85
  - [Typescript](https://www.typescriptlang.org/) first.
86
86
  - Web server — [Express.js](https://expressjs.com/).
87
87
  - Schema validation — [Zod 3.x](https://github.com/colinhacks/zod).
88
- - Logger [Winston](https://github.com/winstonjs/winston) by default,
89
- - Supports any logger having `info()`, `debug()`, `error()` and `warn()` methods.
88
+ - Supports any logger having `info()`, `debug()`, `error()` and `warn()` methods;
89
+ - [Winston](https://github.com/winstonjs/winston) is default.
90
90
  - Generators:
91
- - Documentation — [OpenAPI 3.x](https://github.com/metadevpro/openapi3-ts) (Swagger Specification).
91
+ - Documentation — [OpenAPI 3.x](https://github.com/metadevpro/openapi3-ts) (Swagger Specification);
92
92
  - Client side types — inspired by [zod-to-ts](https://github.com/sachinraja/zod-to-ts).
93
93
  - File uploads — [Express-FileUpload](https://github.com/richardgirges/express-fileupload)
94
94
  (based on [Busboy](https://github.com/mscdex/busboy)).
95
+ - Supports any testing framework having a function mocking method;
96
+ - [Jest](https://github.com/jestjs/jest) and [Vitest](https://github.com/vitest-dev/vitest)
97
+ are both supported automatically.
95
98
 
96
99
  ## Concept
97
100
 
@@ -139,8 +142,8 @@ Create a minimal configuration. _See all available options
139
142
  [in sources](https://github.com/RobinTail/express-zod-api/blob/master/src/config-type.ts)._
140
143
 
141
144
  ```typescript
142
- import type { Logger } from "winston";
143
145
  import { createConfig } from "express-zod-api";
146
+ import type { Logger } from "winston";
144
147
 
145
148
  const config = createConfig({
146
149
  server: {
@@ -150,7 +153,7 @@ const config = createConfig({
150
153
  logger: { level: "debug", color: true },
151
154
  });
152
155
 
153
- // Setting the type of logger used
156
+ // Setting the type of the logger used
154
157
  declare module "express-zod-api" {
155
158
  interface LoggerOverrides extends Logger {}
156
159
  }
@@ -795,13 +798,11 @@ you can connect your routing to the app instead of using `createServer()`.
795
798
 
796
799
  ```typescript
797
800
  import express from "express";
798
- import { createConfig, attachRouting } from "express-zod-api";
801
+ import { createConfig, attachRouting, Routing } from "express-zod-api";
799
802
 
800
803
  const app = express();
801
804
  const config = createConfig({ app /* cors, logger, ... */ });
802
- const routing = {
803
- /* ... */
804
- };
805
+ const routing: Routing = {};
805
806
 
806
807
  // This async IIFE is only required for the top level CommonJS
807
808
  (async () => {
@@ -1013,10 +1014,12 @@ const exampleEndpoint = taggedEndpointsFactory.build({
1013
1014
  ## How to test endpoints
1014
1015
 
1015
1016
  The way to test endpoints is to mock the request, response, and logger objects, invoke the `execute()` method, and
1016
- assert the expectations for calls of certain mocked methods. The library provides a special method that makes mocking
1017
- easier, it requires either `jest` (with `@types/jest`) or `vitest` to be installed. It automatically detects which
1018
- of those testing libraries is installed and uses its mocking functions. However, in order to have proper mocking types
1019
- in your own tests, you need to specify it once in your tests excplicitly, so the test might look this way:
1017
+ assert the expectations for calls of certain mocked methods. The library provides a special method `testEndpoint` that
1018
+ makes mocking easier. It requires you either to install `jest` (with `@types/jest`) or `vitest`
1019
+ (detects automatically), or to specify the `fnMethod` property assigned with a function mocking method of your testing
1020
+ framework, which can also be `node:test` module of most modern Node.js versions.
1021
+ However, in order to have proper mocking types in your own tests, you also need to specify `MockOverrides` once in your
1022
+ tests excplicitly, so the tests should look this way:
1020
1023
 
1021
1024
  ```typescript
1022
1025
  import { testEndpoint } from "express-zod-api";
@@ -1033,6 +1036,7 @@ test("should respond successfully", async () => {
1033
1036
  method: "POST", // default: GET
1034
1037
  body: {}, // incoming data as if after parsing (JSON)
1035
1038
  },
1039
+ // fnMethod — for testing frameworks other than jest or vitest
1036
1040
  // responseProps, configProps, loggerProps
1037
1041
  });
1038
1042
  expect(loggerMock.error).toHaveBeenCalledTimes(0);
package/SECURITY.md CHANGED
@@ -25,6 +25,6 @@
25
25
  Found a vulnerability or other security issue?
26
26
 
27
27
  Please urgently inform me privately by
28
- [email](https://github.com/RobinTail/express-zod-api/blob/master/package.json#L140).
28
+ [email](https://github.com/RobinTail/express-zod-api/blob/master/package.json#L14).
29
29
 
30
30
  I will try to fix it as soon as possible.
package/dist/index.d.mts CHANGED
@@ -103,7 +103,7 @@ interface LoggerOverrides {
103
103
  type AbstractLogger = Record<"info" | "debug" | "warn" | "error", (message: string, meta?: any) => any> & LoggerOverrides;
104
104
  interface SimplifiedWinstonConfig {
105
105
  level: "silent" | "warn" | "debug";
106
- color: boolean;
106
+ color?: boolean;
107
107
  }
108
108
 
109
109
  interface MiddlewareParams<IN, OPT> {
@@ -806,8 +806,15 @@ declare class Documentation extends OpenApiBuilder {
806
806
  constructor({ routing, config, title, version, serverUrl, successfulResponseDescription, errorResponseDescription, hasSummaryFromDescription, composition, serializer, }: DocumentationParams);
807
807
  }
808
808
 
809
+ /**
810
+ * @desc Using module augmentation approach you can set the Mock type of your actual testing framework.
811
+ * @example declare module "express-zod-api" { interface MockOverrides extends Mock {} }
812
+ * @link https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
813
+ * */
809
814
  interface MockOverrides {
810
815
  }
816
+ /** @desc Compatibility constraints for a function mocking method of a testing framework. */
817
+ type MockFunction = (implementation?: (...args: any[]) => any) => MockOverrides;
811
818
  interface TestEndpointProps<REQ, RES, LOG> {
812
819
  /** @desc The endpoint to test */
813
820
  endpoint: AbstractEndpoint;
@@ -831,13 +838,15 @@ interface TestEndpointProps<REQ, RES, LOG> {
831
838
  * @default { info, warn, error, debug }
832
839
  * */
833
840
  loggerProps?: LOG;
841
+ /**
842
+ * @desc Optionally specify the function mocking method of your testing framework
843
+ * @default jest.fn || vi.fn // from vitest
844
+ * @example mock.fn.bind(mock) // from node:test, binding might be necessary
845
+ * */
846
+ fnMethod?: MockFunction;
834
847
  }
835
- /**
836
- * @desc You need to install either jest (with @types/jest) or vitest in order to use this method
837
- * @requires jest
838
- * @requires vitest
839
- * */
840
- declare const testEndpoint: <LOG extends Record<string, any>, REQ extends Record<string, any>, RES extends Record<string, any>>({ endpoint, requestProps, responseProps, configProps, loggerProps, }: TestEndpointProps<REQ, RES, LOG>) => Promise<{
848
+ /** @desc Requires either jest (with @types/jest) or vitest or to specify the fnMethod option */
849
+ declare const testEndpoint: <LOG extends Record<string, any>, REQ extends Record<string, any>, RES extends Record<string, any>>({ endpoint, requestProps, responseProps, configProps, loggerProps, fnMethod: userDefined, }: TestEndpointProps<REQ, RES, LOG>) => Promise<{
841
850
  requestMock: {
842
851
  method: string;
843
852
  } & Record<"header", MockOverrides> & REQ;
package/dist/index.d.ts CHANGED
@@ -103,7 +103,7 @@ interface LoggerOverrides {
103
103
  type AbstractLogger = Record<"info" | "debug" | "warn" | "error", (message: string, meta?: any) => any> & LoggerOverrides;
104
104
  interface SimplifiedWinstonConfig {
105
105
  level: "silent" | "warn" | "debug";
106
- color: boolean;
106
+ color?: boolean;
107
107
  }
108
108
 
109
109
  interface MiddlewareParams<IN, OPT> {
@@ -806,8 +806,15 @@ declare class Documentation extends OpenApiBuilder {
806
806
  constructor({ routing, config, title, version, serverUrl, successfulResponseDescription, errorResponseDescription, hasSummaryFromDescription, composition, serializer, }: DocumentationParams);
807
807
  }
808
808
 
809
+ /**
810
+ * @desc Using module augmentation approach you can set the Mock type of your actual testing framework.
811
+ * @example declare module "express-zod-api" { interface MockOverrides extends Mock {} }
812
+ * @link https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
813
+ * */
809
814
  interface MockOverrides {
810
815
  }
816
+ /** @desc Compatibility constraints for a function mocking method of a testing framework. */
817
+ type MockFunction = (implementation?: (...args: any[]) => any) => MockOverrides;
811
818
  interface TestEndpointProps<REQ, RES, LOG> {
812
819
  /** @desc The endpoint to test */
813
820
  endpoint: AbstractEndpoint;
@@ -831,13 +838,15 @@ interface TestEndpointProps<REQ, RES, LOG> {
831
838
  * @default { info, warn, error, debug }
832
839
  * */
833
840
  loggerProps?: LOG;
841
+ /**
842
+ * @desc Optionally specify the function mocking method of your testing framework
843
+ * @default jest.fn || vi.fn // from vitest
844
+ * @example mock.fn.bind(mock) // from node:test, binding might be necessary
845
+ * */
846
+ fnMethod?: MockFunction;
834
847
  }
835
- /**
836
- * @desc You need to install either jest (with @types/jest) or vitest in order to use this method
837
- * @requires jest
838
- * @requires vitest
839
- * */
840
- declare const testEndpoint: <LOG extends Record<string, any>, REQ extends Record<string, any>, RES extends Record<string, any>>({ endpoint, requestProps, responseProps, configProps, loggerProps, }: TestEndpointProps<REQ, RES, LOG>) => Promise<{
848
+ /** @desc Requires either jest (with @types/jest) or vitest or to specify the fnMethod option */
849
+ declare const testEndpoint: <LOG extends Record<string, any>, REQ extends Record<string, any>, RES extends Record<string, any>>({ endpoint, requestProps, responseProps, configProps, loggerProps, fnMethod: userDefined, }: TestEndpointProps<REQ, RES, LOG>) => Promise<{
841
850
  requestMock: {
842
851
  method: string;
843
852
  } & Record<"header", MockOverrides> & REQ;
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- "use strict";var Cr=Object.create;var Ee=Object.defineProperty;var wr=Object.getOwnPropertyDescriptor;var Nr=Object.getOwnPropertyNames;var vr=Object.getPrototypeOf,Mr=Object.prototype.hasOwnProperty;var Ct=(e,t)=>{for(var r in t)Ee(e,r,{get:t[r],enumerable:!0})},wt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Nr(t))!Mr.call(e,n)&&n!==r&&Ee(e,n,{get:()=>t[n],enumerable:!(o=wr(t,n))||o.enumerable});return e};var M=(e,t,r)=>(r=e!=null?Cr(vr(e)):{},wt(t||!e||!e.__esModule?Ee(r,"default",{value:e,enumerable:!0}):r,e)),zr=e=>wt(Ee({},"__esModule",{value:!0}),e);var yn={};Ct(yn,{AbstractEndpoint:()=>ee,DependsOnMethod:()=>fe,Documentation:()=>Be,DocumentationError:()=>I,EndpointsFactory:()=>ue,InputValidationError:()=>K,Integration:()=>Ye,MissingPeerError:()=>Y,OutputValidationError:()=>q,RoutingError:()=>J,ServeStatic:()=>ye,arrayEndpointsFactory:()=>_t,arrayResultHandler:()=>ke,attachRouting:()=>Xt,createConfig:()=>Nt,createMiddleware:()=>He,createResultHandler:()=>je,createServer:()=>er,defaultEndpointsFactory:()=>Bt,defaultResultHandler:()=>me,ez:()=>Et,getExamples:()=>U,getMessageFromError:()=>L,getStatusCodeFromError:()=>Re,testEndpoint:()=>fr,withMeta:()=>k});module.exports=zr(yn);function Nt(e){return e}var F=require("zod");var Dt=require("http-errors"),jt=require("crypto"),R=require("zod");var b=require("zod");var Dr="ZodFile",jr=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,N=class e extends b.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t),n=o.parsedType===b.ZodParsedType.string&&typeof o.data=="string";if(this.isString&&!n)return(0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_type,expected:b.ZodParsedType.string,received:o.parsedType}),b.INVALID;let s=o.parsedType===b.ZodParsedType.object&&Buffer.isBuffer(o.data);return this.isBuffer&&!s?((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_type,expected:b.ZodParsedType.object,received:o.parsedType,message:"Expected Buffer"}),b.INVALID):(n&&this.isBase64&&!jr.test(o.data)&&((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.custom,message:this._def.message||"Does not match base64 encoding"}),r.dirty()),{status:r.value,value:o.data})}string=t=>new e({...this._def,...be(t),type:""});buffer=t=>new e({...this._def,...be(t),type:Buffer.from([])});binary=t=>new e({...this._def,...be(t),encoding:"binary"});base64=t=>new e({...this._def,...be(t),encoding:"base64"});get isBinary(){return this._def.encoding==="binary"}get isBase64(){return this._def.encoding==="base64"}get isString(){return typeof this._def.type=="string"}get isBuffer(){return Buffer.isBuffer(this._def.type)}static create=()=>new e({typeName:Dr,type:""})};var Ie=require("ramda"),E="expressZodApiMeta",kr=e=>{let t=e.constructor,r=(0,Ie.clone)(e._def);return r[E]=r[E]||{examples:[]},new t(r)},k=e=>{let t=kr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=k(t);return o._def[E].examples.push(r),o}}}),t},vt=e=>E in e._def?typeof e._def[E]=="object"&&e._def[E]!==null:!1,Mt=(e,t)=>{if(!vt(e))return;let r=e._def;return t in r[E]?r[E][t]:void 0},Ce=(e,t)=>{if(!vt(e))return t;let r=k(t),o=Oe(r._def[E].examples,e._def[E].examples);if(r._def[E].examples=[],o.type==="single")r._def[E].examples=o.value;else for(let[n,s]of o.value)r._def[E].examples.push((0,Ie.mergeDeepRight)({...n},{...s}));return r};var W="application/json",Se="multipart/form-data",zt="application/octet-stream";var C=require("zod"),Lr="ZodUpload",Ur=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",se=class e extends C.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==C.ZodParsedType.object||!Ur(r.data)?((0,C.addIssueToContext)(r,{code:C.ZodIssueCode.custom,message:`Expected file upload, received ${r.parsedType}`}),C.INVALID):(0,C.OK)(r.data)}static create=()=>new e({typeName:Lr})};var Hr=e=>{let r=(e.header("content-type")||"").slice(0,Se.length).toLowerCase()===Se;return"files"in e&&r},we={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Kr=["body","query","params"],et=e=>e.method.toLowerCase(),tt=e=>e.startsWith("x-"),Fr=e=>Object.entries(e.headers).reduce((t,[r,o])=>tt(r)?{...t,[r]:o}:t,{}),kt=(e,t)=>{let r=et(e);if(r==="options")return{};let o=Kr;return r in we&&(o=we[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Hr(e):!0).reduce((n,s)=>({...n,...s==="headers"?Fr(e):e[s]}),{})},Ne=e=>!isNaN(e.getTime()),ie=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),L=e=>e instanceof R.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof q?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Re=e=>(0,Dt.isHttpError)(e)?e.statusCode:e instanceof K?400:500,rt=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
1
+ "use strict";var Cr=Object.create;var Ee=Object.defineProperty;var wr=Object.getOwnPropertyDescriptor;var Nr=Object.getOwnPropertyNames;var vr=Object.getPrototypeOf,Mr=Object.prototype.hasOwnProperty;var It=(e,t)=>{for(var r in t)Ee(e,r,{get:t[r],enumerable:!0})},Ct=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Nr(t))!Mr.call(e,n)&&n!==r&&Ee(e,n,{get:()=>t[n],enumerable:!(o=wr(t,n))||o.enumerable});return e};var z=(e,t,r)=>(r=e!=null?Cr(vr(e)):{},Ct(t||!e||!e.__esModule?Ee(r,"default",{value:e,enumerable:!0}):r,e)),zr=e=>Ct(Ee({},"__esModule",{value:!0}),e);var yn={};It(yn,{AbstractEndpoint:()=>ee,DependsOnMethod:()=>fe,Documentation:()=>Be,DocumentationError:()=>C,EndpointsFactory:()=>me,InputValidationError:()=>K,Integration:()=>Ye,MissingPeerError:()=>J,OutputValidationError:()=>q,RoutingError:()=>Y,ServeStatic:()=>ye,arrayEndpointsFactory:()=>$t,arrayResultHandler:()=>ke,attachRouting:()=>Xt,createConfig:()=>wt,createMiddleware:()=>He,createResultHandler:()=>je,createServer:()=>er,defaultEndpointsFactory:()=>Ft,defaultResultHandler:()=>le,ez:()=>Zt,getExamples:()=>U,getMessageFromError:()=>L,getStatusCodeFromError:()=>Re,testEndpoint:()=>fr,withMeta:()=>k});module.exports=zr(yn);function wt(e){return e}var F=require("zod");var zt=require("http-errors"),Dt=require("crypto"),R=require("zod");var b=require("zod");var Dr="ZodFile",jr=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,v=class e extends b.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t),n=o.parsedType===b.ZodParsedType.string&&typeof o.data=="string";if(this.isString&&!n)return(0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_type,expected:b.ZodParsedType.string,received:o.parsedType}),b.INVALID;let s=o.parsedType===b.ZodParsedType.object&&Buffer.isBuffer(o.data);return this.isBuffer&&!s?((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_type,expected:b.ZodParsedType.object,received:o.parsedType,message:"Expected Buffer"}),b.INVALID):(n&&this.isBase64&&!jr.test(o.data)&&((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.custom,message:this._def.message||"Does not match base64 encoding"}),r.dirty()),{status:r.value,value:o.data})}string=t=>new e({...this._def,...be(t),type:""});buffer=t=>new e({...this._def,...be(t),type:Buffer.from([])});binary=t=>new e({...this._def,...be(t),encoding:"binary"});base64=t=>new e({...this._def,...be(t),encoding:"base64"});get isBinary(){return this._def.encoding==="binary"}get isBase64(){return this._def.encoding==="base64"}get isString(){return typeof this._def.type=="string"}get isBuffer(){return Buffer.isBuffer(this._def.type)}static create=()=>new e({typeName:Dr,type:""})};var Ie=require("ramda"),I="expressZodApiMeta",kr=e=>{let t=e.constructor,r=(0,Ie.clone)(e._def);return r[I]=r[I]||{examples:[]},new t(r)},k=e=>{let t=kr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=k(t);return o._def[I].examples.push(r),o}}}),t},Nt=e=>I in e._def?typeof e._def[I]=="object"&&e._def[I]!==null:!1,vt=(e,t)=>{if(!Nt(e))return;let r=e._def;return t in r[I]?r[I][t]:void 0},Ce=(e,t)=>{if(!Nt(e))return t;let r=k(t),o=Se(r._def[I].examples,e._def[I].examples);if(r._def[I].examples=[],o.type==="single")r._def[I].examples=o.value;else for(let[n,s]of o.value)r._def[I].examples.push((0,Ie.mergeDeepRight)({...n},{...s}));return r};var W="application/json",Oe="multipart/form-data",Mt="application/octet-stream";var w=require("zod"),Lr="ZodUpload",Ur=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",se=class e extends w.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==w.ZodParsedType.object||!Ur(r.data)?((0,w.addIssueToContext)(r,{code:w.ZodIssueCode.custom,message:`Expected file upload, received ${r.parsedType}`}),w.INVALID):(0,w.OK)(r.data)}static create=()=>new e({typeName:Lr})};var Hr=e=>{let r=(e.header("content-type")||"").slice(0,Oe.length).toLowerCase()===Oe;return"files"in e&&r},we={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Kr=["body","query","params"],et=e=>e.method.toLowerCase(),tt=e=>e.startsWith("x-"),Fr=e=>Object.entries(e.headers).reduce((t,[r,o])=>tt(r)?{...t,[r]:o}:t,{}),jt=(e,t)=>{let r=et(e);if(r==="options")return{};let o=Kr;return r in we&&(o=we[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Hr(e):!0).reduce((n,s)=>({...n,...s==="headers"?Fr(e):e[s]}),{})},Ne=e=>!isNaN(e.getTime()),ie=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),L=e=>e instanceof R.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof q?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Re=e=>(0,zt.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=Mt(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},Oe=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}},Ae=e=>e.reduce((t,r)=>t||r,!1),G=e=>e instanceof R.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof R.z.ZodUnion?Ae(e.options.map(G)):e instanceof R.z.ZodIntersection?Ae([e._def.left,e._def.right].map(G)):!1,z=({subject:e,condition:t,maxDepth:r,depth:o=1})=>{if(t(e))return!0;if(r!==void 0&&o>=r)return!1;let n={condition:t,maxDepth:r,depth:o+1};return e instanceof R.z.ZodObject?Ae(Object.values(e.shape).map(s=>z({subject:s,...n}))):e instanceof R.z.ZodUnion?Ae(e.options.map(s=>z({subject:s,...n}))):e instanceof R.z.ZodIntersection?Ae([e._def.left,e._def.right].map(s=>z({subject:s,...n}))):e instanceof R.z.ZodOptional||e instanceof R.z.ZodNullable?z({subject:e.unwrap(),...n}):e instanceof R.z.ZodEffects||e instanceof R.z.ZodTransformer?z({subject:e.innerType(),...n}):e instanceof R.z.ZodRecord?z({subject:e.valueSchema,...n}):e instanceof R.z.ZodArray?z({subject:e.element,...n}):e instanceof R.z.ZodDefault?z({subject:e._def.innerType,...n}):!1},Lt=e=>z({subject:e,condition:t=>t instanceof se}),ae=e=>z({subject:e,condition:t=>t instanceof N,maxDepth:3}),Pe=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,H=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),ve=e=>(0,jt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Me=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},be=e=>typeof e=="string"?{message:e}:e||{},pe=async(e,t="default")=>{try{return(await import(e))[t]}catch{throw new Y(e)}},Ut=async(e,t)=>{for(let{moduleName:r,moduleExport:o}of e)try{return await pe(r,o)}catch{}try{let r=t?.provider();if(r)return r}catch{}throw new Y(e.concat(t?[t]:[]).map(({moduleName:r})=>r))};var J=class extends Error{name="RoutingError"},I=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
- Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},V=class extends Error{name="IOSchemaError"},q=class extends V{name="OutputValidationError";originalError;constructor(t){super(L(t)),this.originalError=t}},K=class extends V{name="InputValidationError";originalError;constructor(t){super(L(t)),this.originalError=t}},de=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},Y=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var Ht=e=>typeof e=="object"&&e!==null,Q=e=>Ht(e)&&"or"in e,X=e=>Ht(e)&&"and"in e,ze=e=>({and:e.reduce((t,r)=>t.concat(X(r)?r.and:r),[])}),De=(e,t)=>X(e)?{and:e.and.map(r=>Q(r)?{or:r.or.map(t)}:t(r))}:Q(e)?{or:e.or.map(r=>X(r)?{and:r.and.map(t)}:t(r))}:t(e),ot=e=>e.and.reduce((t,r)=>{let o=Oe(t.or,Q(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(ze),t},{or:[]}),ce=(e,t)=>{if(X(e))return X(t)?ze([e,t]):Q(t)?ce(ot(e),t):ze([e,t]);if(Q(e)){if(X(t))return ce(t,e);if(Q(t)){let{type:r,value:o}=Oe(e.or,t.or);return{or:r==="single"?o:o.map(ze)}}return ce(e,{and:[t]})}return X(t)||Q(t)?ce(t,e):{and:[e,t]}};var v=require("zod");var le={positive:200,negative:400},je=e=>e,me=je({getPositiveResponse:e=>{let t=U({schema:e}),r=k(v.z.object({status:v.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>k(v.z.object({status:v.z.literal("error"),error:v.z.object({message:v.z.string()})})).example({status:"error",error:{message:L(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(le.positive).json({status:"success",data:r});return}let a=Re(e);rt({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:L(e)}})}}),ke=je({getPositiveResponse:e=>{let t=U({schema:e}),r=k("shape"in e&&"items"in e.shape&&e.shape.items instanceof v.z.ZodArray?e.shape.items:v.z.array(v.z.any()));return t.reduce((o,n)=>typeof n=="object"&&n!==null&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},getNegativeResponse:()=>k(v.z.string()).example(L(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Re(r);rt({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),Le=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
- Original error: ${e.originalError.message}.`:""))};var Kt=(e,t=[W])=>{if(e instanceof F.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},ee=class{},Ue=class extends ee{#e;#r;#o;#n;#s;#i;#a;#t;#p;#d;#c;#l=[];constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:u,shortDescription:g}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:h,schema:x})=>{if(G(x))throw new V(`Using transformations on the top level of endpoint ${h} is not allowed.`)}),this.#i=n,this.#a=s,this.#o=d,this.#c=a,this.#r=t,this.#p=p,this.#d=c,this.#e={long:u,short:g};let l={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#n={input:Lt(r)?[Se]:ae(r)?[zt]:[W],positive:Kt(l.positive),negative:Kt(l.negative)},this.#t={input:r,output:o,positive:l.positive instanceof F.z.ZodType?l.positive:l.positive.schema,negative:l.negative instanceof F.z.ZodType?l.negative:l.negative.schema},this.#s={positive:l.positive instanceof F.z.ZodType?le.positive:l.positive.statusCode||le.positive,negative:l.negative instanceof F.z.ZodType?le.negative:l.negative.statusCode||le.negative}}_setSiblingMethods(t){this.#l=t}getDescription(t){return this.#e[t]}getMethods(){return this.#r}getSchema(t){return this.#t[t]}getMimeTypes(t){return this.#n[t]}getStatusCode(t){return this.#s[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?ce(t,r.security):t,{and:[]})}getScopes(){return this.#p}getTags(){return this.#d}getOperationId(t){return this.#c(t)}#m(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#r.concat(this.#l).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#t.output.parseAsync(t)}catch(r){throw r instanceof F.z.ZodError?new q(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.#o){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(u){throw u instanceof F.z.ZodError?new K(u):u}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#t.input.parseAsync(t)}catch(s){throw s instanceof F.z.ZodError?new K(s):s}return this.#i({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.#a.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){Le({logger:n,response:o,error:new de(ie(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=et(t),a=null,p=null;if(n.cors){let c=this.#m();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let u in c)r.set(u,c[u])}let d=kt(t,n.inputSources);try{let{options:c,isStreamClosed:u}=await this.#f({method:s,input:d,request:t,response:r,logger:o});if(u)return;if(s==="options"){r.status(200).end();return}a=await this.#u(await this.#y({input:d,options:c,logger:o}))}catch(c){p=ie(c)}await this.#g({input:d,output:a,request:t,response:r,error:p,logger:o})}};var Ft=["get","post","put","delete","patch"];var nt=require("zod");var $t=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Ce(s,n),o)};var He=e=>{if(G(e.input))throw new V("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var ue=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:nt.z.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,g=>{if(g&&g instanceof Error)return c(o(g));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(He({input:nt.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,u="methods"in p?p.methods:[p.method],g=typeof a=="function"?a:()=>a,l="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],h="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Ue({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:l,tags:h,methods:u,getOperationId:g,description:n,shortDescription:s,inputSchema:$t(d,t)})}},Bt=new ue(me),_t=new ue(ke);var Gt=require("util");var qt=e=>typeof e=="object"&&e!==null&&"level"in e&&"color"in e&&typeof e.color=="boolean"&&typeof e.level=="string"&&["silent","warn","debug"].includes(e.level),Vt=async e=>{let{createLogger:t,transports:r,format:{printf:o,timestamp:n,colorize:s,combine:a},config:{npm:p}}=await pe("winston"),d=l=>{let{[Symbol.for("level")]:h,[Symbol.for("message")]:x,[Symbol.for("splat")]:T,...P}=l;return(0,Gt.inspect)(P,!1,1,e.color)},c=l=>o(({timestamp:h,message:x,level:T,durationMs:P,...m})=>(typeof x=="object"&&(m={...m,...x},x="[No message]"),`${h} ${T}: ${x}`+(P===void 0?"":` duration: ${P}ms`)+(Object.keys(m).length===0?"":" "+(l?d(m):JSON.stringify(m))))),u=[n()],g={handleExceptions:!0};switch(e.color&&u.push(s()),e.level){case"debug":g.level="debug",u.push(c(!0));break;case"silent":case"warn":default:g.level="warn",u.push(c())}return g.format=a(...u),t({silent:e.level==="silent",levels:p.levels,transports:[new r.Console(g)],exitOnError:!1})};var fe=class{constructor(t){this.endpoints=t}};var Wt=M(require("express")),ye=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Wt.default.static(...this.params))}};var te=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new J(`The entry '${s}' must avoid having slashes \u2014 use nesting instead.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof ee){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof ye)r&&a.apply(p,r);else if(a instanceof fe){if(Object.entries(a.endpoints).forEach(([d,c])=>{if(!c.getMethods().includes(d))throw new J(`Endpoint assigned to ${d} method of ${p} must support ${d} method.`);t(c,p,d)}),n&&Object.keys(a.endpoints).length>0){let[d,...c]=Object.keys(a.endpoints),u=a.endpoints[d];u._setSiblingMethods(c),t(u,p,"options")}}else te({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var Yt=()=>`
3
+ `,{url:t.url,payload:r})},U=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=vt(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},Se=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}},Ae=e=>e.reduce((t,r)=>t||r,!1),G=e=>e instanceof R.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof R.z.ZodUnion?Ae(e.options.map(G)):e instanceof R.z.ZodIntersection?Ae([e._def.left,e._def.right].map(G)):!1,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 R.z.ZodObject?Ae(Object.values(e.shape).map(s=>D({subject:s,...n}))):e instanceof R.z.ZodUnion?Ae(e.options.map(s=>D({subject:s,...n}))):e instanceof R.z.ZodIntersection?Ae([e._def.left,e._def.right].map(s=>D({subject:s,...n}))):e instanceof R.z.ZodOptional||e instanceof R.z.ZodNullable?D({subject:e.unwrap(),...n}):e instanceof R.z.ZodEffects||e instanceof R.z.ZodTransformer?D({subject:e.innerType(),...n}):e instanceof R.z.ZodRecord?D({subject:e.valueSchema,...n}):e instanceof R.z.ZodArray?D({subject:e.element,...n}):e instanceof R.z.ZodDefault?D({subject:e._def.innerType,...n}):!1},kt=e=>D({subject:e,condition:t=>t instanceof se}),ae=e=>D({subject:e,condition:t=>t instanceof v,maxDepth:3}),Pe=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,H=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),ve=e=>(0,Dt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Me=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},be=e=>typeof e=="string"?{message:e}:e||{};var Y=class extends Error{name="RoutingError"},C=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
+ Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},V=class extends Error{name="IOSchemaError"},q=class extends V{name="OutputValidationError";originalError;constructor(t){super(L(t)),this.originalError=t}},K=class extends V{name="InputValidationError";originalError;constructor(t){super(L(t)),this.originalError=t}},pe=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},J=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var Lt=e=>typeof e=="object"&&e!==null,Q=e=>Lt(e)&&"or"in e,X=e=>Lt(e)&&"and"in e,ze=e=>({and:e.reduce((t,r)=>t.concat(X(r)?r.and:r),[])}),De=(e,t)=>X(e)?{and:e.and.map(r=>Q(r)?{or:r.or.map(t)}:t(r))}:Q(e)?{or:e.or.map(r=>X(r)?{and:r.and.map(t)}:t(r))}:t(e),ot=e=>e.and.reduce((t,r)=>{let o=Se(t.or,Q(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(ze),t},{or:[]}),de=(e,t)=>{if(X(e))return X(t)?ze([e,t]):Q(t)?de(ot(e),t):ze([e,t]);if(Q(e)){if(X(t))return de(t,e);if(Q(t)){let{type:r,value:o}=Se(e.or,t.or);return{or:r==="single"?o:o.map(ze)}}return de(e,{and:[t]})}return X(t)||Q(t)?de(t,e):{and:[e,t]}};var M=require("zod");var ce={positive:200,negative:400},je=e=>e,le=je({getPositiveResponse:e=>{let t=U({schema:e}),r=k(M.z.object({status:M.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>k(M.z.object({status:M.z.literal("error"),error:M.z.object({message:M.z.string()})})).example({status:"error",error:{message:L(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(ce.positive).json({status:"success",data:r});return}let a=Re(e);rt({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:L(e)}})}}),ke=je({getPositiveResponse:e=>{let t=U({schema:e}),r=k("shape"in e&&"items"in e.shape&&e.shape.items instanceof M.z.ZodArray?e.shape.items:M.z.array(M.z.any()));return t.reduce((o,n)=>typeof n=="object"&&n!==null&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},getNegativeResponse:()=>k(M.z.string()).example(L(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Re(r);rt({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),Le=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
+ Original error: ${e.originalError.message}.`:""))};var Ut=(e,t=[W])=>{if(e instanceof F.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},ee=class{},Ue=class extends ee{#e;#r;#o;#n;#s;#i;#a;#t;#p;#d;#c;#l=[];constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:u,shortDescription:g}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:h,schema:x})=>{if(G(x))throw new V(`Using transformations on the top level of endpoint ${h} is not allowed.`)}),this.#i=n,this.#a=s,this.#o=d,this.#c=a,this.#r=t,this.#p=p,this.#d=c,this.#e={long:u,short:g};let m={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#n={input:kt(r)?[Oe]:ae(r)?[Mt]:[W],positive:Ut(m.positive),negative:Ut(m.negative)},this.#t={input:r,output:o,positive:m.positive instanceof F.z.ZodType?m.positive:m.positive.schema,negative:m.negative instanceof F.z.ZodType?m.negative:m.negative.schema},this.#s={positive:m.positive instanceof F.z.ZodType?ce.positive:m.positive.statusCode||ce.positive,negative:m.negative instanceof F.z.ZodType?ce.negative:m.negative.statusCode||ce.negative}}_setSiblingMethods(t){this.#l=t}getDescription(t){return this.#e[t]}getMethods(){return this.#r}getSchema(t){return this.#t[t]}getMimeTypes(t){return this.#n[t]}getStatusCode(t){return this.#s[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?de(t,r.security):t,{and:[]})}getScopes(){return this.#p}getTags(){return this.#d}getOperationId(t){return this.#c(t)}#m(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#r.concat(this.#l).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#t.output.parseAsync(t)}catch(r){throw r instanceof F.z.ZodError?new q(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.#o){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(u){throw u instanceof F.z.ZodError?new K(u):u}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#t.input.parseAsync(t)}catch(s){throw s instanceof F.z.ZodError?new K(s):s}return this.#i({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.#a.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){Le({logger:n,response:o,error:new pe(ie(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=et(t),a=null,p=null;if(n.cors){let c=this.#m();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let u in c)r.set(u,c[u])}let d=jt(t,n.inputSources);try{let{options:c,isStreamClosed:u}=await this.#f({method:s,input:d,request:t,response:r,logger:o});if(u)return;if(s==="options"){r.status(200).end();return}a=await this.#u(await this.#y({input:d,options:c,logger:o}))}catch(c){p=ie(c)}await this.#g({input:d,output:a,request:t,response:r,error:p,logger:o})}};var Ht=["get","post","put","delete","patch"];var nt=require("zod");var Kt=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Ce(s,n),o)};var He=e=>{if(G(e.input))throw new V("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var me=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:nt.z.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,g=>{if(g&&g instanceof Error)return c(o(g));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(He({input:nt.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,u="methods"in p?p.methods:[p.method],g=typeof a=="function"?a:()=>a,m="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],h="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Ue({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:m,tags:h,methods:u,getOperationId:g,description:n,shortDescription:s,inputSchema:Kt(d,t)})}},Ft=new me(le),$t=new me(ke);var _t=require("util");var ue=async(e,t="default")=>{try{return(await import(e))[t]}catch{}try{return await Promise.resolve().then(()=>require(e)[t])}catch{}throw new J(e)},Bt=async e=>{for(let{moduleName:t,moduleExport:r}of e)try{return await ue(t,r)}catch{}throw new J(e.map(({moduleName:t})=>t))};var Gt=e=>typeof e=="object"&&e!==null&&"level"in e&&("color"in e?typeof e.color=="boolean":!0)&&typeof e.level=="string"&&["silent","warn","debug"].includes(e.level),qt=async e=>{let{createLogger:t,transports:r,format:{printf:o,timestamp:n,colorize:s,combine:a},config:{npm:p}}=await ue("winston"),d=m=>{let{[Symbol.for("level")]:h,[Symbol.for("message")]:x,[Symbol.for("splat")]:T,...P}=m;return(0,_t.inspect)(P,!1,1,e.color)},c=m=>o(({timestamp:h,message:x,level:T,durationMs:P,...l})=>{typeof x=="object"&&(l={...l,...x},x="[No message]");let S=Object.keys(l).length>0,Z=[];return P&&Z.push("duration:",`${P}ms`),S?Z.push(m?d(l):JSON.stringify(l)):Z.push(...l?.[Symbol.for("splat")]||[]),[h,`${T}:`,x,...Z].join(" ")}),u=[n()],g={handleExceptions:!0};switch(e.color&&u.push(s()),e.level){case"debug":g.level="debug",u.push(c(!0));break;case"silent":case"warn":default:g.level="warn",u.push(c())}return g.format=a(...u),t({silent:e.level==="silent",levels:p.levels,transports:[new r.Console(g)],exitOnError:!1})};var fe=class{constructor(t){this.endpoints=t}};var Vt=z(require("express")),ye=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Vt.default.static(...this.params))}};var te=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new Y(`The entry '${s}' must avoid having slashes \u2014 use nesting instead.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof ee){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof ye)r&&a.apply(p,r);else if(a instanceof fe){if(Object.entries(a.endpoints).forEach(([d,c])=>{if(!c.getMethods().includes(d))throw new Y(`Endpoint assigned to ${d} method of ${p} must support ${d} method.`);t(c,p,d)}),n&&Object.keys(a.endpoints).length>0){let[d,...c]=Object.keys(a.endpoints),u=a.endpoints[d];u._setSiblingMethods(c),t(u,p,"options")}}else te({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var Wt=()=>`
6
6
  \x1B[94m\x1B[39m
7
7
  \x1B[94m\x1B[39m
8
8
  \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
@@ -19,7 +19,7 @@ Original error: ${e.originalError.message}.`:""))};var Kt=(e,t=[W])=>{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(Yt()),te({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var it=M(require("express")),Jt=M(require("http")),at=M(require("https"));var pt=M(require("http-errors")),$r=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,pt.default)(400,ie(r).message),request:o,response:n,logger:t,input:null,output:null})},Br=(e,t)=>(r,o)=>{let n=(0,pt.default)(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Le({response:o,logger:t,error:new de(ie(s).message,n)})}},Qt=async e=>{let t=qt(e.logger)?await Vt(e.logger):e.logger,r=e.errorHandler||me,o=Br(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Xt=async(e,t)=>{let{logger:r,notFoundHandler:o}=await Qt(e);return st({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},er=async(e,t)=>{let r=(0,it.default)().disable("x-powered-by");if(e.server.compression){let p=await pe("compression");r.use(p(typeof e.server.compression=="object"?e.server.compression:void 0))}if(r.use(e.server.jsonParser||it.default.json()),e.server.upload){let p=await pe("express-fileupload");r.use(p({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}))}e.server.rawParser&&(r.use(e.server.rawParser),r.use((p,{},d)=>{Buffer.isBuffer(p.body)&&(p.body={raw:p.body}),d()}));let{logger:o,errorHandler:n,notFoundHandler:s}=await Qt(e);r.use($r(n,o)),st({app:r,routing:t,logger:o,config:e}),r.use(s);let a={httpServer:Jt.default.createServer(r),httpsServer:e.https?at.default.createServer(e.https.options,r):void 0};for(let p of Object.values(a)){let d=p instanceof at.default.Server?e.https.listen:e.server.listen;p?.listen(d,()=>{typeof d=="object"?o.info("Listening",d):o.info(`Listening ${d}`)})}return{app:r,...a,logger:o}};var ur=require("openapi3-ts/oas30");var $=require("openapi3-ts/oas30"),ge=require("ramda"),O=require("zod");var S=require("zod");var dt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,_r="ZodDateIn",Ke=class e extends S.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==S.ZodParsedType.string)return(0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_type,expected:S.ZodParsedType.string,received:o.parsedType}),S.INVALID;dt.test(o.data)||((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ne(n)?{status:r.value,value:n}:((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_date}),S.INVALID)}static create=()=>new e({typeName:_r})};var re=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,a=n,d=s?s({schema:e,...a,next:u=>re({...u,...a,onEach:t,rules:r,onMissing:o})}):o({schema:e,...a}),c=t&&t({schema:e,prev:d,...a});return c?{...d,...c}:d};var tr=50,or="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Gr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},nr=/:([A-Za-z0-9_]+)/g,sr=e=>{let t=e.match(nr);return t?t.map(r=>r.slice(1)):[]},ir=e=>e.replace(nr,t=>`{${t.slice(1)}}`),qr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Vr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Wr=()=>({format:"any"}),Yr=e=>{if(e.isResponse)throw new I({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Jr=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||e?"binary":t?"byte":"file"}),Qr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Xr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),eo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),to=({schema:e,next:t})=>t({schema:e.unwrap()}),ro=({schema:e,next:t})=>t({schema:e._def.innerType}),oo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),rr=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),no=({schema:{value:e}})=>({type:typeof e,enum:[e]}),so=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Pe(s)?s instanceof O.z.ZodOptional:s.isOptional())});return{type:"object",properties:Fe({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},io=()=>({type:"string",nullable:!0,format:"null"}),ao=e=>{if(e.isResponse)throw new I({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:dt.source,externalDocs:{url:or}}},po=e=>{if(!e.isResponse)throw new I({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:or}}},co=e=>{throw new I({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},lo=()=>({type:"boolean"}),mo=()=>({type:"integer",format:"bigint"}),uo=e=>e.reduce((t,r)=>t&&r instanceof O.z.ZodLiteral,!0),fo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof O.z.ZodEnum||e instanceof O.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Fe({schema:O.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof O.z.ZodLiteral)return{type:"object",properties:Fe({schema:O.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof O.z.ZodUnion&&uo(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Fe({schema:O.z.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},yo=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),go=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${(0,$.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},ho=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:g}}})=>{let l=g.find(T=>T.kind==="regex"),h=g.find(T=>T.kind==="datetime"),x=l?l.regex:h?h.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...u&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...x&&{pattern:`/${x.source}/${x.flags}`}}},xo=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Fe=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),To=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Gr?.[t]},bo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,$.isSchemaObject)(o)){let s=Me({effect:n,sample:To(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:O.z.any()})}if(!t&&n.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Oo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),So=({schema:e,next:t})=>t({schema:e.unwrap()}),Ao=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},ar=(e,t,r=[])=>{let o=U({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?(0,ge.omit)(r,s):s}}),{})}},Ro=(e,t,r)=>{let o=U({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}},Ze=(e,t)=>{if(e instanceof O.z.ZodObject)return e;let r;if(e instanceof O.z.ZodUnion||e instanceof O.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Ze(o,t)).reduce((o,n)=>o.merge(n.partial()),O.z.object({}));else if(e instanceof O.z.ZodEffects){if(G(e))throw new I({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Ze(e._def.schema,t)}else r=Ze(e._def.left,t).merge(Ze(e._def.right,t));return Ce(e,r)},pr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),u=Ze(c,{path:e,method:t,isResponse:!1}).shape,g=sr(e),l=o.includes("query"),h=o.includes("params"),x=o.includes("headers"),T=m=>h&&g.includes(m),P=m=>x&&tt(m);return Object.keys(u).filter(m=>l||T(m)).map(m=>{let A=re({schema:u[m],isResponse:!1,rules:lt,onEach:mt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:e,method:t}),j=p==="components"?a(H(e,t,`${d} ${m}`),A):A;return{name:m,in:T(m)?"path":P(m)?"header":"query",required:!u[m].isOptional(),description:(0,$.isSchemaObject)(A)&&A.description||`${t.toUpperCase()} ${e} ${d}`,schema:j,...Ro(c,!1,m)}})},lt={ZodString:ho,ZodNumber:xo,ZodBigInt:mo,ZodBoolean:lo,ZodDateIn:ao,ZodDateOut:po,ZodNull:io,ZodArray:yo,ZodTuple:go,ZodRecord:fo,ZodObject:so,ZodLiteral:no,ZodIntersection:eo,ZodUnion:Qr,ZodFile:Jr,ZodUpload:Yr,ZodAny:Wr,ZodDefault:qr,ZodEnum:rr,ZodNativeEnum:rr,ZodEffects:bo,ZodOptional:to,ZodNullable:oo,ZodDiscriminatedUnion:Xr,ZodBranded:So,ZodDate:co,ZodCatch:Vr,ZodPipeline:Oo,ZodLazy:Ao,ZodReadonly:ro},mt=({schema:e,isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof O.z.ZodLazy,s=r.type!==void 0,a=t&&Pe(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:U({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},ut=({schema:e,...t})=>{throw new I({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},ct=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r=e.properties?(0,ge.omit)(t,e.properties):void 0,o=e.example?(0,ge.omit)(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>ct(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>ct(p,t)):void 0;return(0,ge.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},dr=e=>(0,$.isSchemaObject)(e)?(0,ge.omit)(["example"],e):e,ft=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),u=r.getMimeTypes(o?"positive":"negative"),g=dr(re({schema:c,isResponse:!0,rules:lt,onEach:mt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:t,method:e})),l=ar(c,!0),h=p==="components"?a(H(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:u.reduce((x,T)=>({...x,[T]:{schema:h,...l}}),{})}},Po=()=>({type:"http",scheme:"basic"}),Zo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Eo=({name:e})=>({type:"apiKey",in:"query",name:e}),Io=({name:e})=>({type:"apiKey",in:"header",name:e}),Co=({name:e})=>({type:"apiKey",in:"cookie",name:e}),wo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),No=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),cr=e=>{let t={basic:Po,bearer:Zo,input:Eo,header:Io,cookie:Co,openid:wo,oauth2:No};return De(e,r=>t[r.type](r))},$e=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return $e(ot(e))}return $e({or:[e]})},lr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=sr(t),c=r.getSchema("input"),u=dr(ct(re({schema:ae(c)?N.create().buffer():c,isResponse:!1,rules:lt,onEach:mt,onMissing:ut,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),g=ar(r.getSchema("input"),!1,d),l=a==="components"?s(H(t,e,p),u):u;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((h,x)=>({...h,[x]:{schema:l,...g}}),{})}},mr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),yt=e=>e.length<=tr?e:e.slice(0,tr-1)+"\u2026";var Be=class extends ur.OpenApiBuilder{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o){if(o in this.lastOperationIdSuffixes)throw new I({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return this.lastOperationIdSuffixes[o]=1,o}let n=H(t,r);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:u=ve}){super(),this.addInfo({title:o,version:n});for(let l of typeof s=="string"?[s]:s)this.addServer({url:l});te({routing:t,onEndpoint:(l,h,x)=>{let T=x,P={path:h,method:T,endpoint:l,composition:c,serializer:u,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,A]=["short","long"].map(l.getDescription.bind(l)),j=r.inputSources?.[T]||we[T],he=pr({...P,inputSources:j}),w={operationId:this.ensureUniqOperationId(h,T,l.getOperationId(T)),responses:{[l.getStatusCode("positive")]:ft({...P,clue:a,isPositive:!0}),[l.getStatusCode("negative")]:ft({...P,clue:p,isPositive:!1})}};A&&(w.description=A,d&&m===void 0&&(w.summary=yt(A))),m&&(w.summary=yt(m)),l.getTags().length>0&&(w.tags=l.getTags()),he.length>0&&(w.parameters=he),j.includes("body")&&(w.requestBody=lr(P));let xe=$e(De(cr(l.getSecurity()),Te=>{let It=this.ensureUniqSecuritySchemaName(Te),Ir=["oauth2","openIdConnect"].includes(Te.type)?l.getScopes():[];return this.addSecurityScheme(It,Te),{name:It,scopes:Ir}}));xe.length>0&&(w.security=xe);let Xe=ir(h);this.addPath(Xe,{[T]:w})}}),this.rootDoc.tags=r.tags?mr(r.tags):[]}};var gt=M(require("http"));var vo=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>W),...t}),Mo=({fnMethod:e,responseProps:t})=>{let r={writableEnded:!1,statusCode:200,statusMessage:gt.default.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=gt.default.STATUS_CODES[o],r)),json:e(()=>r),send:e(()=>r),end:e(()=>(r.writableEnded=!0,r)),...t};return r},fr=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n})=>{let s=(await Ut([{moduleName:"vitest",moduleExport:"vi"}],{moduleName:"jest",provider:()=>jest})).fn,a=vo({fnMethod:s,requestProps:t}),p=Mo({fnMethod:s,responseProps:r}),d={info:s(),warn:s(),error:s(),debug:s(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};var _=M(require("typescript"));var D=M(require("typescript")),i=D.default.factory,oe=[i.createModifier(D.default.SyntaxKind.ExportKeyword)],zo=[i.createModifier(D.default.SyntaxKind.AsyncKeyword)],Do=[i.createModifier(D.default.SyntaxKind.PublicKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],yr=[i.createModifier(D.default.SyntaxKind.ProtectedKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],jo=i.createTemplateHead(""),ko=i.createTemplateTail(""),Lo=i.createTemplateMiddle(" "),ht=e=>i.createTemplateLiteralType(jo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?ko:Lo))),xt=ht(["M","P"]),_e=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Ge=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(_e(o,e[o],t)),[]),Tt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),gr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),bt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),Ot=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],D.default.NodeFlags.Const),St=(e,t)=>i.createTypeAliasDeclaration(oe,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),qe=(e,t)=>i.createTypeAliasDeclaration(oe,e,void 0,t),hr=(e,t,r)=>i.createPropertyDeclaration(Do,e,void 0,t,r),xr=(e,t,r=[])=>i.createClassDeclaration(oe,e,void 0,void 0,[t,...r]),Tr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),br=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(D.default.SyntaxKind.AnyKeyword)]),At=(e,t,r)=>i.createInterfaceDeclaration(oe,e,void 0,t,r),Or=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Sr=(e,t)=>i.createArrowFunction(zo,void 0,e.map(r=>_e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Rt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,Ge({acc:void 0,key:void 0}),void 0,void 0,t),r]);var y=M(require("typescript")),Zr=require("zod");var B=M(require("typescript")),{factory:Ve}=B.default,Pt=(e,t)=>{B.default.addSyntheticLeadingComment(e,B.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},We=(e,t,r)=>{let o=Ve.createTypeAliasDeclaration(void 0,Ve.createIdentifier(t),void 0,e);return r&&Pt(o,r),o},Ar=(e,t)=>{let r=B.default.createSourceFile("print.ts","",B.default.ScriptTarget.Latest,!1,B.default.ScriptKind.TS);return B.default.createPrinter(t).printNode(B.default.EmitHint.Unspecified,e,r)},Uo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Rr=e=>Uo.test(e)?Ve.createIdentifier(e):Ve.createStringLiteral(e);var{factory:f}=y.default,Ho={[y.default.SyntaxKind.AnyKeyword]:"",[y.default.SyntaxKind.BigIntKeyword]:BigInt(0),[y.default.SyntaxKind.BooleanKeyword]:!1,[y.default.SyntaxKind.NumberKeyword]:0,[y.default.SyntaxKind.ObjectKeyword]:{},[y.default.SyntaxKind.StringKeyword]:"",[y.default.SyntaxKind.UndefinedKeyword]:void 0},Ko=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Fo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Pe(a)?a instanceof Zr.z.ZodOptional:a.isOptional(),d=f.createPropertySignature(void 0,Rr(s),p&&o?f.createToken(y.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Pt(d,a.description),d});return f.createTypeLiteralNode(n)},$o=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),Bo=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Pr=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),_o=e=>Ho?.[e.kind],Go=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Me({effect:n,sample:_o(o)}),a={number:y.default.SyntaxKind.NumberKeyword,bigint:y.default.SyntaxKind.BigIntKeyword,boolean:y.default.SyntaxKind.BooleanKeyword,string:y.default.SyntaxKind.StringKeyword,undefined:y.default.SyntaxKind.UndefinedKeyword,object:y.default.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(s&&a[s]||y.default.SyntaxKind.AnyKeyword)}return o},qo=({schema:e})=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),Vo=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.default.SyntaxKind.UndefinedKeyword)]):o},Wo=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),Yo=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),Jo=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),Qo=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Xo=({next:e,schema:t})=>e({schema:t._def.innerType}),ne=e=>()=>f.createKeywordTypeNode(e),en=({next:e,schema:t})=>e({schema:t.unwrap()}),tn=({next:e,schema:t})=>e({schema:t._def.innerType}),rn=({next:e,schema:t})=>e({schema:t._def.innerType}),on=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),nn=()=>f.createLiteralTypeNode(f.createNull()),sn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,f.createLiteralTypeNode(f.createNull())),t(s,r({schema:n.schema}))))()},an=({schema:{isBuffer:e}})=>e?f.createTypeReferenceNode("Buffer"):f.createKeywordTypeNode(y.default.SyntaxKind.StringKeyword),pn={ZodString:ne(y.default.SyntaxKind.StringKeyword),ZodNumber:ne(y.default.SyntaxKind.NumberKeyword),ZodBigInt:ne(y.default.SyntaxKind.BigIntKeyword),ZodBoolean:ne(y.default.SyntaxKind.BooleanKeyword),ZodDateIn:ne(y.default.SyntaxKind.StringKeyword),ZodDateOut:ne(y.default.SyntaxKind.StringKeyword),ZodNull:nn,ZodArray:$o,ZodTuple:Yo,ZodRecord:Jo,ZodObject:Fo,ZodLiteral:Ko,ZodIntersection:Qo,ZodUnion:Pr,ZodFile:an,ZodAny:ne(y.default.SyntaxKind.AnyKeyword),ZodDefault:Xo,ZodEnum:Bo,ZodNativeEnum:qo,ZodEffects:Go,ZodOptional:Vo,ZodNullable:Wo,ZodDiscriminatedUnion:Pr,ZodBranded:en,ZodCatch:rn,ZodPipeline:on,ZodLazy:sn,ZodReadonly:tn},Zt=({schema:e,...t})=>re({schema:e,rules:pn,onMissing:()=>f.createKeywordTypeNode(y.default.SyntaxKind.AnyKeyword),...t});var Ye=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=We(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=ve,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){te({routing:t,onEndpoint:(m,A,j)=>{let he=H(A,j,"input"),Qe=H(A,j,"response"),w={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},xe=m.getSchema("input"),Xe=Zt({...w,schema:ae(xe)?N.create().buffer():xe,isResponse:!1}),Te=Zt({...w,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(We(Xe,he),We(Te,Qe)),j!=="options"&&(this.paths.push(A),this.registry[`${j} ${A}`]={in:he,out:Qe,isJson:m.getMimeTypes("positive").includes(W),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=St("Path",this.paths),a=St("Method",Ft),p=qe("MethodPath",ht([a.name,s.name])),d=[i.createHeritageClause(_.default.SyntaxKind.ExtendsKeyword,[Tt(p.name,_.default.SyntaxKind.AnyKeyword)])],c=At("Input",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].in))),u=At("Response",d,Object.keys(this.registry).map(m=>bt(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,u),r==="types")return;let g=i.createVariableStatement(oe,Ot("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),l=i.createVariableStatement(oe,Ot("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(A=>i.createStringLiteral(A)))))))),h=qe("Provider",i.createFunctionTypeNode(Or({M:a.name,P:s.name}),Ge({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),xt)}),Tr(u.name,xt))),x=qe("Implementation",i.createFunctionTypeNode(void 0,Ge({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(_.default.SyntaxKind.StringKeyword),params:Tt(_.default.SyntaxKind.StringKeyword,_.default.SyntaxKind.AnyKeyword)}),br())),T=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),P=xr("ExpressZodAPIClient",gr([_e("implementation",i.createTypeReferenceNode(x.name),yr)]),[hr("provide",i.createTypeReferenceNode(h.name),Sr(["method","path","params"],[i.createIdentifier("method"),Rt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[T,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Rt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[T]),_.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);_.default.addSyntheticLeadingComment(P,_.default.SyntaxKind.MultiLineCommentTrivia,`
22
+ `.trim();var st=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Wt()),te({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var it=z(require("express")),Yt=z(require("http")),Jt=z(require("https"));var at=z(require("http-errors")),$r=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,at.default)(400,ie(r).message),request:o,response:n,logger:t,input:null,output:null})},Br=(e,t)=>(r,o)=>{let n=(0,at.default)(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Le({response:o,logger:t,error:new pe(ie(s).message,n)})}},Qt=async e=>{let t=Gt(e.logger)?await qt(e.logger):e.logger,r=e.errorHandler||le,o=Br(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Xt=async(e,t)=>{let{logger:r,notFoundHandler:o}=await Qt(e);return st({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},er=async(e,t)=>{let r=(0,it.default)().disable("x-powered-by");if(e.server.compression){let d=await ue("compression");r.use(d(typeof e.server.compression=="object"?e.server.compression:void 0))}if(r.use(e.server.jsonParser||it.default.json()),e.server.upload){let d=await ue("express-fileupload");r.use(d({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}))}e.server.rawParser&&(r.use(e.server.rawParser),r.use((d,{},c)=>{Buffer.isBuffer(d.body)&&(d.body={raw:d.body}),c()}));let{logger:o,errorHandler:n,notFoundHandler:s}=await Qt(e);r.use($r(n,o)),st({app:r,routing:t,logger:o,config:e}),r.use(s);let a=(d,c)=>d.listen(c,()=>{o.info("Listening",c)}),p={httpServer:a(Yt.default.createServer(r),e.server.listen),httpsServer:e.https?a(Jt.default.createServer(e.https.options,r),e.https.listen):void 0};return{app:r,...p,logger:o}};var ur=require("openapi3-ts/oas30");var $=require("openapi3-ts/oas30"),ge=require("ramda"),O=require("zod");var A=require("zod");var pt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,_r="ZodDateIn",Ke=class e extends A.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==A.ZodParsedType.string)return(0,A.addIssueToContext)(o,{code:A.ZodIssueCode.invalid_type,expected:A.ZodParsedType.string,received:o.parsedType}),A.INVALID;pt.test(o.data)||((0,A.addIssueToContext)(o,{code:A.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ne(n)?{status:r.value,value:n}:((0,A.addIssueToContext)(o,{code:A.ZodIssueCode.invalid_date}),A.INVALID)}static create=()=>new e({typeName:_r})};var re=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,a=n,d=s?s({schema:e,...a,next:u=>re({...u,...a,onEach:t,rules:r,onMissing:o})}):o({schema:e,...a}),c=t&&t({schema:e,prev:d,...a});return c?{...d,...c}:d};var tr=50,or="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Gr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},nr=/:([A-Za-z0-9_]+)/g,sr=e=>{let t=e.match(nr);return t?t.map(r=>r.slice(1)):[]},ir=e=>e.replace(nr,t=>`{${t.slice(1)}}`),qr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Vr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Wr=()=>({format:"any"}),Yr=e=>{if(e.isResponse)throw new C({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Jr=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||e?"binary":t?"byte":"file"}),Qr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Xr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),eo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),to=({schema:e,next:t})=>t({schema:e.unwrap()}),ro=({schema:e,next:t})=>t({schema:e._def.innerType}),oo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),rr=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),no=({schema:{value:e}})=>({type:typeof e,enum:[e]}),so=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Pe(s)?s instanceof O.z.ZodOptional:s.isOptional())});return{type:"object",properties:Fe({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},io=()=>({type:"string",nullable:!0,format:"null"}),ao=e=>{if(e.isResponse)throw new C({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}}},po=e=>{if(!e.isResponse)throw new C({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:or}}},co=e=>{throw new C({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},lo=()=>({type:"boolean"}),mo=()=>({type:"integer",format:"bigint"}),uo=e=>e.reduce((t,r)=>t&&r instanceof O.z.ZodLiteral,!0),fo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof O.z.ZodEnum||e instanceof O.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Fe({schema:O.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof O.z.ZodLiteral)return{type:"object",properties:Fe({schema:O.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof O.z.ZodUnion&&uo(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Fe({schema:O.z.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},yo=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),go=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${(0,$.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},ho=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:g}}})=>{let m=g.find(T=>T.kind==="regex"),h=g.find(T=>T.kind==="datetime"),x=m?m.regex:h?h.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...u&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...x&&{pattern:`/${x.source}/${x.flags}`}}},xo=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Fe=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),To=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Gr?.[t]},bo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,$.isSchemaObject)(o)){let s=Me({effect:n,sample:To(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:O.z.any()})}if(!t&&n.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},So=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Oo=({schema:e,next:t})=>t({schema:e.unwrap()}),Ao=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},ar=(e,t,r=[])=>{let o=U({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?(0,ge.omit)(r,s):s}}),{})}},Ro=(e,t,r)=>{let o=U({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}},Ze=(e,t)=>{if(e instanceof O.z.ZodObject)return e;let r;if(e instanceof O.z.ZodUnion||e instanceof O.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Ze(o,t)).reduce((o,n)=>o.merge(n.partial()),O.z.object({}));else if(e instanceof O.z.ZodEffects){if(G(e))throw new C({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Ze(e._def.schema,t)}else r=Ze(e._def.left,t).merge(Ze(e._def.right,t));return Ce(e,r)},pr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),u=Ze(c,{path:e,method:t,isResponse:!1}).shape,g=sr(e),m=o.includes("query"),h=o.includes("params"),x=o.includes("headers"),T=l=>h&&g.includes(l),P=l=>x&&tt(l);return Object.keys(u).filter(l=>m||T(l)).map(l=>{let S=re({schema:u[l],isResponse:!1,rules:ct,onEach:lt,onMissing:mt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),Z=p==="components"?a(H(e,t,`${d} ${l}`),S):S;return{name:l,in:T(l)?"path":P(l)?"header":"query",required:!u[l].isOptional(),description:(0,$.isSchemaObject)(S)&&S.description||`${t.toUpperCase()} ${e} ${d}`,schema:Z,...Ro(c,!1,l)}})},ct={ZodString:ho,ZodNumber:xo,ZodBigInt:mo,ZodBoolean:lo,ZodDateIn:ao,ZodDateOut:po,ZodNull:io,ZodArray:yo,ZodTuple:go,ZodRecord:fo,ZodObject:so,ZodLiteral:no,ZodIntersection:eo,ZodUnion:Qr,ZodFile:Jr,ZodUpload:Yr,ZodAny:Wr,ZodDefault:qr,ZodEnum:rr,ZodNativeEnum:rr,ZodEffects:bo,ZodOptional:to,ZodNullable:oo,ZodDiscriminatedUnion:Xr,ZodBranded:Oo,ZodDate:co,ZodCatch:Vr,ZodPipeline:So,ZodLazy:Ao,ZodReadonly:ro},lt=({schema:e,isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof O.z.ZodLazy,s=r.type!==void 0,a=t&&Pe(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:U({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},mt=({schema:e,...t})=>{throw new C({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},dt=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r=e.properties?(0,ge.omit)(t,e.properties):void 0,o=e.example?(0,ge.omit)(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>dt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>dt(p,t)):void 0;return(0,ge.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},dr=e=>(0,$.isSchemaObject)(e)?(0,ge.omit)(["example"],e):e,ut=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),u=r.getMimeTypes(o?"positive":"negative"),g=dr(re({schema:c,isResponse:!0,rules:ct,onEach:lt,onMissing:mt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),m=ar(c,!0),h=p==="components"?a(H(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:u.reduce((x,T)=>({...x,[T]:{schema:h,...m}}),{})}},Po=()=>({type:"http",scheme:"basic"}),Zo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Eo=({name:e})=>({type:"apiKey",in:"query",name:e}),Io=({name:e})=>({type:"apiKey",in:"header",name:e}),Co=({name:e})=>({type:"apiKey",in:"cookie",name:e}),wo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),No=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),cr=e=>{let t={basic:Po,bearer:Zo,input:Eo,header:Io,cookie:Co,openid:wo,oauth2:No};return De(e,r=>t[r.type](r))},$e=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return $e(ot(e))}return $e({or:[e]})},lr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=sr(t),c=r.getSchema("input"),u=dr(dt(re({schema:ae(c)?v.create().buffer():c,isResponse:!1,rules:ct,onEach:lt,onMissing:mt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),g=ar(r.getSchema("input"),!1,d),m=a==="components"?s(H(t,e,p),u):u;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((h,x)=>({...h,[x]:{schema:m,...g}}),{})}},mr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),ft=e=>e.length<=tr?e:e.slice(0,tr-1)+"\u2026";var Be=class extends ur.OpenApiBuilder{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o){if(o in this.lastOperationIdSuffixes)throw new C({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t});return this.lastOperationIdSuffixes[o]=1,o}let n=H(t,r);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:u=ve}){super(),this.addInfo({title:o,version:n});for(let m of typeof s=="string"?[s]:s)this.addServer({url:m});te({routing:t,onEndpoint:(m,h,x)=>{let T=x,P={path:h,method:T,endpoint:m,composition:c,serializer:u,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[l,S]=["short","long"].map(m.getDescription.bind(m)),Z=r.inputSources?.[T]||we[T],he=pr({...P,inputSources:Z}),N={operationId:this.ensureUniqOperationId(h,T,m.getOperationId(T)),responses:{[m.getStatusCode("positive")]:ut({...P,clue:a,isPositive:!0}),[m.getStatusCode("negative")]:ut({...P,clue:p,isPositive:!1})}};S&&(N.description=S,d&&l===void 0&&(N.summary=ft(S))),l&&(N.summary=ft(l)),m.getTags().length>0&&(N.tags=m.getTags()),he.length>0&&(N.parameters=he),Z.includes("body")&&(N.requestBody=lr(P));let xe=$e(De(cr(m.getSecurity()),Te=>{let Et=this.ensureUniqSecuritySchemaName(Te),Ir=["oauth2","openIdConnect"].includes(Te.type)?m.getScopes():[];return this.addSecurityScheme(Et,Te),{name:Et,scopes:Ir}}));xe.length>0&&(N.security=xe);let Xe=ir(h);this.addPath(Xe,{[T]:N})}}),this.rootDoc.tags=r.tags?mr(r.tags):[]}};var yt=z(require("http"));var vo=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>W),...t}),Mo=({fnMethod:e,responseProps:t})=>{let r={writableEnded:!1,statusCode:200,statusMessage:yt.default.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=yt.default.STATUS_CODES[o],r)),json:e(()=>r),send:e(()=>r),end:e(()=>(r.writableEnded=!0,r)),...t};return r},fr=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,fnMethod:s})=>{let a=s||(await Bt([{moduleName:"vitest",moduleExport:"vi"},{moduleName:"@jest/globals",moduleExport:"jest"}])).fn,p=vo({fnMethod:a,requestProps:t}),d=Mo({fnMethod:a,responseProps:r}),c={info:a(),warn:a(),error:a(),debug:a(),...n},u={cors:!1,logger:c,...o};return await e.execute({request:p,response:d,config:u,logger:c}),{requestMock:p,responseMock:d,loggerMock:c}};var _=z(require("typescript"));var j=z(require("typescript")),i=j.default.factory,oe=[i.createModifier(j.default.SyntaxKind.ExportKeyword)],zo=[i.createModifier(j.default.SyntaxKind.AsyncKeyword)],Do=[i.createModifier(j.default.SyntaxKind.PublicKeyword),i.createModifier(j.default.SyntaxKind.ReadonlyKeyword)],yr=[i.createModifier(j.default.SyntaxKind.ProtectedKeyword),i.createModifier(j.default.SyntaxKind.ReadonlyKeyword)],jo=i.createTemplateHead(""),ko=i.createTemplateTail(""),Lo=i.createTemplateMiddle(" "),gt=e=>i.createTemplateLiteralType(jo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?ko:Lo))),ht=gt(["M","P"]),_e=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Ge=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(_e(o,e[o],t)),[]),xt=(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([])),Tt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),bt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],j.default.NodeFlags.Const),St=(e,t)=>i.createTypeAliasDeclaration(oe,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),qe=(e,t)=>i.createTypeAliasDeclaration(oe,e,void 0,t),hr=(e,t,r)=>i.createPropertyDeclaration(Do,e,void 0,t,r),xr=(e,t,r=[])=>i.createClassDeclaration(oe,e,void 0,void 0,[t,...r]),Tr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),br=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(j.default.SyntaxKind.AnyKeyword)]),Ot=(e,t,r)=>i.createInterfaceDeclaration(oe,e,void 0,t,r),Sr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Or=(e,t)=>i.createArrowFunction(zo,void 0,e.map(r=>_e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),At=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,Ge({acc:void 0,key:void 0}),void 0,void 0,t),r]);var y=z(require("typescript")),Zr=require("zod");var B=z(require("typescript")),{factory:Ve}=B.default,Rt=(e,t)=>{B.default.addSyntheticLeadingComment(e,B.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},We=(e,t,r)=>{let o=Ve.createTypeAliasDeclaration(void 0,Ve.createIdentifier(t),void 0,e);return r&&Rt(o,r),o},Ar=(e,t)=>{let r=B.default.createSourceFile("print.ts","",B.default.ScriptTarget.Latest,!1,B.default.ScriptKind.TS);return B.default.createPrinter(t).printNode(B.default.EmitHint.Unspecified,e,r)},Uo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Rr=e=>Uo.test(e)?Ve.createIdentifier(e):Ve.createStringLiteral(e);var{factory:f}=y.default,Ho={[y.default.SyntaxKind.AnyKeyword]:"",[y.default.SyntaxKind.BigIntKeyword]:BigInt(0),[y.default.SyntaxKind.BooleanKeyword]:!1,[y.default.SyntaxKind.NumberKeyword]:0,[y.default.SyntaxKind.ObjectKeyword]:{},[y.default.SyntaxKind.StringKeyword]:"",[y.default.SyntaxKind.UndefinedKeyword]:void 0},Ko=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Fo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Pe(a)?a instanceof Zr.z.ZodOptional:a.isOptional(),d=f.createPropertySignature(void 0,Rr(s),p&&o?f.createToken(y.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Rt(d,a.description),d});return f.createTypeLiteralNode(n)},$o=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),Bo=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Pr=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),_o=e=>Ho?.[e.kind],Go=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Me({effect:n,sample:_o(o)}),a={number:y.default.SyntaxKind.NumberKeyword,bigint:y.default.SyntaxKind.BigIntKeyword,boolean:y.default.SyntaxKind.BooleanKeyword,string:y.default.SyntaxKind.StringKeyword,undefined:y.default.SyntaxKind.UndefinedKeyword,object:y.default.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(s&&a[s]||y.default.SyntaxKind.AnyKeyword)}return o},qo=({schema:e})=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),Vo=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.default.SyntaxKind.UndefinedKeyword)]):o},Wo=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),Yo=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),Jo=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),Qo=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Xo=({next:e,schema:t})=>e({schema:t._def.innerType}),ne=e=>()=>f.createKeywordTypeNode(e),en=({next:e,schema:t})=>e({schema:t.unwrap()}),tn=({next:e,schema:t})=>e({schema:t._def.innerType}),rn=({next:e,schema:t})=>e({schema:t._def.innerType}),on=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),nn=()=>f.createLiteralTypeNode(f.createNull()),sn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,f.createLiteralTypeNode(f.createNull())),t(s,r({schema:n.schema}))))()},an=({schema:{isBuffer:e}})=>e?f.createTypeReferenceNode("Buffer"):f.createKeywordTypeNode(y.default.SyntaxKind.StringKeyword),pn={ZodString:ne(y.default.SyntaxKind.StringKeyword),ZodNumber:ne(y.default.SyntaxKind.NumberKeyword),ZodBigInt:ne(y.default.SyntaxKind.BigIntKeyword),ZodBoolean:ne(y.default.SyntaxKind.BooleanKeyword),ZodDateIn:ne(y.default.SyntaxKind.StringKeyword),ZodDateOut:ne(y.default.SyntaxKind.StringKeyword),ZodNull:nn,ZodArray:$o,ZodTuple:Yo,ZodRecord:Jo,ZodObject:Fo,ZodLiteral:Ko,ZodIntersection:Qo,ZodUnion:Pr,ZodFile:an,ZodAny:ne(y.default.SyntaxKind.AnyKeyword),ZodDefault:Xo,ZodEnum:Bo,ZodNativeEnum:qo,ZodEffects:Go,ZodOptional:Vo,ZodNullable:Wo,ZodDiscriminatedUnion:Pr,ZodBranded:en,ZodCatch:rn,ZodPipeline:on,ZodLazy:sn,ZodReadonly:tn},Pt=({schema:e,...t})=>re({schema:e,rules:pn,onMissing:()=>f.createKeywordTypeNode(y.default.SyntaxKind.AnyKeyword),...t});var Ye=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=We(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=ve,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){te({routing:t,onEndpoint:(l,S,Z)=>{let he=H(S,Z,"input"),Qe=H(S,Z,"response"),N={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},xe=l.getSchema("input"),Xe=Pt({...N,schema:ae(xe)?v.create().buffer():xe,isResponse:!1}),Te=Pt({...N,isResponse:!0,schema:l.getSchema("positive").or(l.getSchema("negative"))});this.agg.push(We(Xe,he),We(Te,Qe)),Z!=="options"&&(this.paths.push(S),this.registry[`${Z} ${S}`]={in:he,out:Qe,isJson:l.getMimeTypes("positive").includes(W),tags:l.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=St("Path",this.paths),a=St("Method",Ht),p=qe("MethodPath",gt([a.name,s.name])),d=[i.createHeritageClause(_.default.SyntaxKind.ExtendsKeyword,[xt(p.name,_.default.SyntaxKind.AnyKeyword)])],c=Ot("Input",d,Object.keys(this.registry).map(l=>Tt(l,this.registry[l].in))),u=Ot("Response",d,Object.keys(this.registry).map(l=>Tt(l,this.registry[l].out)));if(this.agg.push(s,a,p,c,u),r==="types")return;let g=i.createVariableStatement(oe,bt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(l=>this.registry[l].isJson).map(l=>i.createPropertyAssignment(`"${l}"`,i.createTrue()))))),m=i.createVariableStatement(oe,bt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(l=>i.createPropertyAssignment(`"${l}"`,i.createArrayLiteralExpression(this.registry[l].tags.map(S=>i.createStringLiteral(S)))))))),h=qe("Provider",i.createFunctionTypeNode(Sr({M:a.name,P:s.name}),Ge({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),ht)}),Tr(u.name,ht))),x=qe("Implementation",i.createFunctionTypeNode(void 0,Ge({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(_.default.SyntaxKind.StringKeyword),params:xt(_.default.SyntaxKind.StringKeyword,_.default.SyntaxKind.AnyKeyword)}),br())),T=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),P=xr("ExpressZodAPIClient",gr([_e("implementation",i.createTypeReferenceNode(x.name),yr)]),[hr("provide",i.createTypeReferenceNode(h.name),Or(["method","path","params"],[i.createIdentifier("method"),At("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[T,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),At("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[T]),_.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);_.default.addSyntheticLeadingComment(P,_.default.SyntaxKind.MultiLineCommentTrivia,`
23
23
  export const exampleImplementation: Implementation = async (
24
24
  method,
25
25
  path,
@@ -40,6 +40,6 @@ export const exampleImplementation: Implementation = async (
40
40
 
41
41
  const client = new ExpressZodAPIClient(exampleImplementation);
42
42
  client.provide("get", "/v1/user/retrieve", { id: "10" });
43
- `,!0),this.agg.push(g,l,h,x,P)}print(t){return this.agg.map(r=>Ar(r,t)).join(`
43
+ `,!0),this.agg.push(g,m,h,x,P)}print(t){return this.agg.map(r=>Ar(r,t)).join(`
44
44
 
45
- `)}};var Et={};Ct(Et,{dateIn:()=>mn,dateOut:()=>un,file:()=>cn,raw:()=>fn,upload:()=>ln});var Er=require("zod");var Z=require("zod");var dn="ZodDateOut",Je=class e extends Z.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==Z.ZodParsedType.date?((0,Z.addIssueToContext)(o,{code:Z.ZodIssueCode.invalid_type,expected:Z.ZodParsedType.date,received:o.parsedType}),Z.INVALID):Ne(o.data)?{status:r.value,value:o.data.toISOString()}:((0,Z.addIssueToContext)(o,{code:Z.ZodIssueCode.invalid_date}),Z.INVALID)}static create=()=>new e({typeName:dn})};var cn=N.create,ln=se.create,mn=Ke.create,un=Je.create,fn=()=>Er.z.object({raw:N.create().buffer()});0&&(module.exports={AbstractEndpoint,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,MissingPeerError,OutputValidationError,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});
45
+ `)}};var Zt={};It(Zt,{dateIn:()=>mn,dateOut:()=>un,file:()=>cn,raw:()=>fn,upload:()=>ln});var Er=require("zod");var E=require("zod");var dn="ZodDateOut",Je=class e extends E.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==E.ZodParsedType.date?((0,E.addIssueToContext)(o,{code:E.ZodIssueCode.invalid_type,expected:E.ZodParsedType.date,received:o.parsedType}),E.INVALID):Ne(o.data)?{status:r.value,value:o.data.toISOString()}:((0,E.addIssueToContext)(o,{code:E.ZodIssueCode.invalid_date}),E.INVALID)}static create=()=>new e({typeName:dn})};var cn=v.create,ln=se.create,mn=Ke.create,un=Je.create,fn=()=>Er.z.object({raw:v.create().buffer()});0&&(module.exports={AbstractEndpoint,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,MissingPeerError,OutputValidationError,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
- var Tr=Object.defineProperty;var br=(e,t)=>{for(var r in t)Tr(e,r,{get:t[r],enumerable:!0})};function Or(e){return e}import{z as U}from"zod";import{isHttpError as jr}from"http-errors";import{createHash as kr}from"crypto";import{z as A}from"zod";import{INVALID as Ot,ZodIssueCode as $e,ZodParsedType as Oe,ZodType as Sr,addIssueToContext as Be}from"zod";var Ar="ZodFile",Rr=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,E=class e extends Sr{_parse(t){let{status:r,ctx:o}=this._processInputParams(t),n=o.parsedType===Oe.string&&typeof o.data=="string";if(this.isString&&!n)return Be(o,{code:$e.invalid_type,expected:Oe.string,received:o.parsedType}),Ot;let s=o.parsedType===Oe.object&&Buffer.isBuffer(o.data);return this.isBuffer&&!s?(Be(o,{code:$e.invalid_type,expected:Oe.object,received:o.parsedType,message:"Expected Buffer"}),Ot):(n&&this.isBase64&&!Rr.test(o.data)&&(Be(o,{code:$e.custom,message:this._def.message||"Does not match base64 encoding"}),r.dirty()),{status:r.value,value:o.data})}string=t=>new e({...this._def,...de(t),type:""});buffer=t=>new e({...this._def,...de(t),type:Buffer.from([])});binary=t=>new e({...this._def,...de(t),encoding:"binary"});base64=t=>new e({...this._def,...de(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:Ar,type:""})};import{clone as Pr,mergeDeepRight as Zr}from"ramda";var R="expressZodApiMeta",Er=e=>{let t=e.constructor,r=Pr(e._def);return r[R]=r[R]||{examples:[]},new t(r)},M=e=>{let t=Er(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=M(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,At=(e,t)=>{if(!St(e))return;let r=e._def;return t in r[R]?r[R][t]:void 0},Se=(e,t)=>{if(!St(e))return t;let r=M(t),o=ce(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(Zr({...n},{...s}));return r};var F="application/json",le="multipart/form-data",Rt="application/octet-stream";import{INVALID as Ir,OK as Cr,ZodIssueCode as wr,ZodParsedType as Nr,ZodType as vr,addIssueToContext as Mr}from"zod";var zr="ZodUpload",Dr=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",Y=class e extends vr{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==Nr.object||!Dr(r.data)?(Mr(r,{code:wr.custom,message:`Expected file upload, received ${r.parsedType}`}),Ir):Cr(r.data)}static create=()=>new e({typeName:zr})};var Lr=e=>{let r=(e.header("content-type")||"").slice(0,le.length).toLowerCase()===le;return"files"in e&&r},Ae={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Ur=["body","query","params"],_e=e=>e.method.toLowerCase(),Ge=e=>e.startsWith("x-"),Hr=e=>Object.entries(e.headers).reduce((t,[r,o])=>Ge(r)?{...t,[r]:o}:t,{}),Pt=(e,t)=>{let r=_e(e);if(r==="options")return{};let o=Ur;return r in Ae&&(o=Ae[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Lr(e):!0).reduce((n,s)=>({...n,...s==="headers"?Hr(e):e[s]}),{})},Re=e=>!isNaN(e.getTime()),J=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),D=e=>e instanceof A.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,Pe=e=>jr(e)?e.statusCode:e instanceof k?400:500,qe=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
1
+ var Tr=Object.defineProperty;var St=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var br=(e,t)=>{for(var r in t)Tr(e,r,{get:t[r],enumerable:!0})};function Sr(e){return e}import{z as U}from"zod";import{isHttpError as jr}from"http-errors";import{createHash as kr}from"crypto";import{z as R}from"zod";import{INVALID as Ot,ZodIssueCode as $e,ZodParsedType as Se,ZodType as Or,addIssueToContext as Be}from"zod";var Ar="ZodFile",Rr=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,I=class e extends Or{_parse(t){let{status:r,ctx:o}=this._processInputParams(t),n=o.parsedType===Se.string&&typeof o.data=="string";if(this.isString&&!n)return Be(o,{code:$e.invalid_type,expected:Se.string,received:o.parsedType}),Ot;let s=o.parsedType===Se.object&&Buffer.isBuffer(o.data);return this.isBuffer&&!s?(Be(o,{code:$e.invalid_type,expected:Se.object,received:o.parsedType,message:"Expected Buffer"}),Ot):(n&&this.isBase64&&!Rr.test(o.data)&&(Be(o,{code:$e.custom,message:this._def.message||"Does not match base64 encoding"}),r.dirty()),{status:r.value,value:o.data})}string=t=>new e({...this._def,...de(t),type:""});buffer=t=>new e({...this._def,...de(t),type:Buffer.from([])});binary=t=>new e({...this._def,...de(t),encoding:"binary"});base64=t=>new e({...this._def,...de(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:Ar,type:""})};import{clone as Pr,mergeDeepRight as Zr}from"ramda";var P="expressZodApiMeta",Er=e=>{let t=e.constructor,r=Pr(e._def);return r[P]=r[P]||{examples:[]},new t(r)},M=e=>{let t=Er(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=M(t);return o._def[P].examples.push(r),o}}}),t},At=e=>P in e._def?typeof e._def[P]=="object"&&e._def[P]!==null:!1,Rt=(e,t)=>{if(!At(e))return;let r=e._def;return t in r[P]?r[P][t]:void 0},Oe=(e,t)=>{if(!At(e))return t;let r=M(t),o=ce(r._def[P].examples,e._def[P].examples);if(r._def[P].examples=[],o.type==="single")r._def[P].examples=o.value;else for(let[n,s]of o.value)r._def[P].examples.push(Zr({...n},{...s}));return r};var F="application/json",le="multipart/form-data",Pt="application/octet-stream";import{INVALID as Ir,OK as Cr,ZodIssueCode as wr,ZodParsedType as Nr,ZodType as vr,addIssueToContext as Mr}from"zod";var zr="ZodUpload",Dr=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",Y=class e extends vr{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==Nr.object||!Dr(r.data)?(Mr(r,{code:wr.custom,message:`Expected file upload, received ${r.parsedType}`}),Ir):Cr(r.data)}static create=()=>new e({typeName:zr})};var Lr=e=>{let r=(e.header("content-type")||"").slice(0,le.length).toLowerCase()===le;return"files"in e&&r},Ae={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Ur=["body","query","params"],_e=e=>e.method.toLowerCase(),Ge=e=>e.startsWith("x-"),Hr=e=>Object.entries(e.headers).reduce((t,[r,o])=>Ge(r)?{...t,[r]:o}:t,{}),Zt=(e,t)=>{let r=_e(e);if(r==="options")return{};let o=Ur;return r in Ae&&(o=Ae[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Lr(e):!0).reduce((n,s)=>({...n,...s==="headers"?Hr(e):e[s]}),{})},Re=e=>!isNaN(e.getTime()),J=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),D=e=>e instanceof R.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,Pe=e=>jr(e)?e.statusCode:e instanceof k?400:500,qe=({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=At(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},ce=(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}},me=e=>e.reduce((t,r)=>t||r,!1),z=e=>e instanceof A.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof A.ZodUnion?me(e.options.map(z)):e instanceof A.ZodIntersection?me([e._def.left,e._def.right].map(z)):!1,I=({subject:e,condition:t,maxDepth:r,depth:o=1})=>{if(t(e))return!0;if(r!==void 0&&o>=r)return!1;let n={condition:t,maxDepth:r,depth:o+1};return e instanceof A.ZodObject?me(Object.values(e.shape).map(s=>I({subject:s,...n}))):e instanceof A.ZodUnion?me(e.options.map(s=>I({subject:s,...n}))):e instanceof A.ZodIntersection?me([e._def.left,e._def.right].map(s=>I({subject:s,...n}))):e instanceof A.ZodOptional||e instanceof A.ZodNullable?I({subject:e.unwrap(),...n}):e instanceof A.ZodEffects||e instanceof A.ZodTransformer?I({subject:e.innerType(),...n}):e instanceof A.ZodRecord?I({subject:e.valueSchema,...n}):e instanceof A.ZodArray?I({subject:e.element,...n}):e instanceof A.ZodDefault?I({subject:e._def.innerType,...n}):!1},Zt=e=>I({subject:e,condition:t=>t instanceof Y}),Q=e=>I({subject:e,condition:t=>t instanceof E,maxDepth:3}),ue=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(""),Ze=e=>kr("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ee=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},de=e=>typeof e=="string"?{message:e}:e||{},X=async(e,t="default")=>{try{return(await import(e))[t]}catch{throw new ee(e)}},Et=async(e,t)=>{for(let{moduleName:r,moduleExport:o}of e)try{return await X(r,o)}catch{}try{let r=t?.provider();if(r)return r}catch{}throw new ee(e.concat(t?[t]:[]).map(({moduleName:r})=>r))};var te=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)}},L=class extends Error{name="IOSchemaError"},$=class extends L{name="OutputValidationError";originalError;constructor(t){super(D(t)),this.originalError=t}},k=class extends L{name="InputValidationError";originalError;constructor(t){super(D(t)),this.originalError=t}},re=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},ee=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var It=e=>typeof e=="object"&&e!==null,B=e=>It(e)&&"or"in e,_=e=>It(e)&&"and"in e,Ie=e=>({and:e.reduce((t,r)=>t.concat(_(r)?r.and:r),[])}),Ce=(e,t)=>_(e)?{and:e.and.map(r=>B(r)?{or:r.or.map(t)}:t(r))}:B(e)?{or:e.or.map(r=>_(r)?{and:r.and.map(t)}:t(r))}:t(e),Ve=e=>e.and.reduce((t,r)=>{let o=ce(t.or,B(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(Ie),t},{or:[]}),oe=(e,t)=>{if(_(e))return _(t)?Ie([e,t]):B(t)?oe(Ve(e),t):Ie([e,t]);if(B(e)){if(_(t))return oe(t,e);if(B(t)){let{type:r,value:o}=ce(e.or,t.or);return{or:r==="single"?o:o.map(Ie)}}return oe(e,{and:[t]})}return _(t)||B(t)?oe(t,e):{and:[e,t]}};import{z as C}from"zod";var ne={positive:200,negative:400},We=e=>e,fe=We({getPositiveResponse:e=>{let t=j({schema:e}),r=M(C.object({status:C.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>M(C.object({status:C.literal("error"),error:C.object({message:C.string()})})).example({status:"error",error:{message:D(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(ne.positive).json({status:"success",data:r});return}let a=Pe(e);qe({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:D(e)}})}}),Ye=We({getPositiveResponse:e=>{let t=j({schema:e}),r=M("shape"in e&&"items"in e.shape&&e.shape.items instanceof C.ZodArray?e.shape.items:C.array(C.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:()=>M(C.string()).example(D(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Pe(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")}}),we=({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 Ct=(e,t=[F])=>{if(e instanceof U.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},se=class{},Ne=class extends se{#e;#r;#o;#n;#s;#i;#a;#t;#p;#d;#c;#l=[];constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:u,shortDescription:g}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:h,schema:x})=>{if(z(x))throw new L(`Using transformations on the top level of endpoint ${h} is not allowed.`)}),this.#i=n,this.#a=s,this.#o=d,this.#c=a,this.#r=t,this.#p=p,this.#d=c,this.#e={long:u,short:g};let l={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#n={input:Zt(r)?[le]:Q(r)?[Rt]:[F],positive:Ct(l.positive),negative:Ct(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?ne.positive:l.positive.statusCode||ne.positive,negative:l.negative instanceof U.ZodType?ne.negative:l.negative.statusCode||ne.negative}}_setSiblingMethods(t){this.#l=t}getDescription(t){return this.#e[t]}getMethods(){return this.#r}getSchema(t){return this.#t[t]}getMimeTypes(t){return this.#n[t]}getStatusCode(t){return this.#s[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?oe(t,r.security):t,{and:[]})}getScopes(){return this.#p}getTags(){return this.#d}getOperationId(t){return this.#c(t)}#m(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#r.concat(this.#l).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#t.output.parseAsync(t)}catch(r){throw r instanceof U.ZodError?new $(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.#o){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(u){throw u instanceof U.ZodError?new k(u):u}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#t.input.parseAsync(t)}catch(s){throw s instanceof U.ZodError?new k(s):s}return this.#i({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.#a.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){we({logger:n,response:o,error:new re(J(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=_e(t),a=null,p=null;if(n.cors){let c=this.#m();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let u in c)r.set(u,c[u])}let d=Pt(t,n.inputSources);try{let{options:c,isStreamClosed:u}=await this.#f({method:s,input:d,request:t,response:r,logger:o});if(u)return;if(s==="options"){r.status(200).end();return}a=await this.#u(await this.#y({input:d,options:c,logger:o}))}catch(c){p=J(c)}await this.#g({input:d,output:a,request:t,response:r,error:p,logger:o})}};var wt=["get","post","put","delete","patch"];import{z as vt}from"zod";var Nt=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Se(s,n),o)};var Je=e=>{if(z(e.input))throw new L("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var ye=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:vt.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,g=>{if(g&&g instanceof Error)return c(o(g));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(Je({input:vt.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,u="methods"in p?p.methods:[p.method],g=typeof a=="function"?a:()=>a,l="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],h="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Ne({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:l,tags:h,methods:u,getOperationId:g,description:n,shortDescription:s,inputSchema:Nt(d,t)})}},Kr=new ye(fe),Fr=new ye(Ye);import{inspect as $r}from"util";var Mt=e=>typeof e=="object"&&e!==null&&"level"in e&&"color"in e&&typeof e.color=="boolean"&&typeof e.level=="string"&&["silent","warn","debug"].includes(e.level),zt=async e=>{let{createLogger:t,transports:r,format:{printf:o,timestamp:n,colorize:s,combine:a},config:{npm:p}}=await X("winston"),d=l=>{let{[Symbol.for("level")]:h,[Symbol.for("message")]:x,[Symbol.for("splat")]:T,...S}=l;return $r(S,!1,1,e.color)},c=l=>o(({timestamp:h,message:x,level:T,durationMs:S,...m})=>(typeof x=="object"&&(m={...m,...x},x="[No message]"),`${h} ${T}: ${x}`+(S===void 0?"":` duration: ${S}ms`)+(Object.keys(m).length===0?"":" "+(l?d(m):JSON.stringify(m))))),u=[n()],g={handleExceptions:!0};switch(e.color&&u.push(s()),e.level){case"debug":g.level="debug",u.push(c(!0));break;case"silent":case"warn":default:g.level="warn",u.push(c())}return g.format=a(...u),t({silent:e.level==="silent",levels:p.levels,transports:[new r.Console(g)],exitOnError:!1})};var ge=class{constructor(t){this.endpoints=t}};import Br from"express";var he=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 te(`The entry '${s}' must avoid having slashes \u2014 use nesting instead.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof se){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof he)r&&a.apply(p,r);else if(a instanceof ge){if(Object.entries(a.endpoints).forEach(([d,c])=>{if(!c.getMethods().includes(d))throw new te(`Endpoint assigned to ${d} method of ${p} must support ${d} method.`);t(c,p,d)}),n&&Object.keys(a.endpoints).length>0){let[d,...c]=Object.keys(a.endpoints),u=a.endpoints[d];u._setSiblingMethods(c),t(u,p,"options")}}else G({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var Dt=()=>`
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},ce=(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}},me=e=>e.reduce((t,r)=>t||r,!1),z=e=>e instanceof R.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof R.ZodUnion?me(e.options.map(z)):e instanceof R.ZodIntersection?me([e._def.left,e._def.right].map(z)):!1,C=({subject:e,condition:t,maxDepth:r,depth:o=1})=>{if(t(e))return!0;if(r!==void 0&&o>=r)return!1;let n={condition:t,maxDepth:r,depth:o+1};return e instanceof R.ZodObject?me(Object.values(e.shape).map(s=>C({subject:s,...n}))):e instanceof R.ZodUnion?me(e.options.map(s=>C({subject:s,...n}))):e instanceof R.ZodIntersection?me([e._def.left,e._def.right].map(s=>C({subject:s,...n}))):e instanceof R.ZodOptional||e instanceof R.ZodNullable?C({subject:e.unwrap(),...n}):e instanceof R.ZodEffects||e instanceof R.ZodTransformer?C({subject:e.innerType(),...n}):e instanceof R.ZodRecord?C({subject:e.valueSchema,...n}):e instanceof R.ZodArray?C({subject:e.element,...n}):e instanceof R.ZodDefault?C({subject:e._def.innerType,...n}):!1},Et=e=>C({subject:e,condition:t=>t instanceof Y}),Q=e=>C({subject:e,condition:t=>t instanceof I,maxDepth:3}),ue=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(""),Ze=e=>kr("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ee=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},de=e=>typeof e=="string"?{message:e}:e||{};var X=class extends Error{name="RoutingError"},Z=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)}},L=class extends Error{name="IOSchemaError"},$=class extends L{name="OutputValidationError";originalError;constructor(t){super(D(t)),this.originalError=t}},k=class extends L{name="InputValidationError";originalError;constructor(t){super(D(t)),this.originalError=t}},ee=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},te=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var It=e=>typeof e=="object"&&e!==null,B=e=>It(e)&&"or"in e,_=e=>It(e)&&"and"in e,Ie=e=>({and:e.reduce((t,r)=>t.concat(_(r)?r.and:r),[])}),Ce=(e,t)=>_(e)?{and:e.and.map(r=>B(r)?{or:r.or.map(t)}:t(r))}:B(e)?{or:e.or.map(r=>_(r)?{and:r.and.map(t)}:t(r))}:t(e),Ve=e=>e.and.reduce((t,r)=>{let o=ce(t.or,B(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(Ie),t},{or:[]}),re=(e,t)=>{if(_(e))return _(t)?Ie([e,t]):B(t)?re(Ve(e),t):Ie([e,t]);if(B(e)){if(_(t))return re(t,e);if(B(t)){let{type:r,value:o}=ce(e.or,t.or);return{or:r==="single"?o:o.map(Ie)}}return re(e,{and:[t]})}return _(t)||B(t)?re(t,e):{and:[e,t]}};import{z as w}from"zod";var oe={positive:200,negative:400},We=e=>e,fe=We({getPositiveResponse:e=>{let t=j({schema:e}),r=M(w.object({status:w.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>M(w.object({status:w.literal("error"),error:w.object({message:w.string()})})).example({status:"error",error:{message:D(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(oe.positive).json({status:"success",data:r});return}let a=Pe(e);qe({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:D(e)}})}}),Ye=We({getPositiveResponse:e=>{let t=j({schema:e}),r=M("shape"in e&&"items"in e.shape&&e.shape.items instanceof w.ZodArray?e.shape.items:w.array(w.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:()=>M(w.string()).example(D(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Pe(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")}}),we=({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 Ct=(e,t=[F])=>{if(e instanceof U.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},ne=class{},Ne=class extends ne{#e;#r;#o;#n;#s;#i;#a;#t;#p;#d;#c;#l=[];constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:u,shortDescription:g}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:h,schema:x})=>{if(z(x))throw new L(`Using transformations on the top level of endpoint ${h} is not allowed.`)}),this.#i=n,this.#a=s,this.#o=d,this.#c=a,this.#r=t,this.#p=p,this.#d=c,this.#e={long:u,short:g};let m={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#n={input:Et(r)?[le]:Q(r)?[Pt]:[F],positive:Ct(m.positive),negative:Ct(m.negative)},this.#t={input:r,output:o,positive:m.positive instanceof U.ZodType?m.positive:m.positive.schema,negative:m.negative instanceof U.ZodType?m.negative:m.negative.schema},this.#s={positive:m.positive instanceof U.ZodType?oe.positive:m.positive.statusCode||oe.positive,negative:m.negative instanceof U.ZodType?oe.negative:m.negative.statusCode||oe.negative}}_setSiblingMethods(t){this.#l=t}getDescription(t){return this.#e[t]}getMethods(){return this.#r}getSchema(t){return this.#t[t]}getMimeTypes(t){return this.#n[t]}getStatusCode(t){return this.#s[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?re(t,r.security):t,{and:[]})}getScopes(){return this.#p}getTags(){return this.#d}getOperationId(t){return this.#c(t)}#m(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#r.concat(this.#l).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#t.output.parseAsync(t)}catch(r){throw r instanceof U.ZodError?new $(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.#o){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(u){throw u instanceof U.ZodError?new k(u):u}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#t.input.parseAsync(t)}catch(s){throw s instanceof U.ZodError?new k(s):s}return this.#i({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.#a.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){we({logger:n,response:o,error:new ee(J(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=_e(t),a=null,p=null;if(n.cors){let c=this.#m();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let u in c)r.set(u,c[u])}let d=Zt(t,n.inputSources);try{let{options:c,isStreamClosed:u}=await this.#f({method:s,input:d,request:t,response:r,logger:o});if(u)return;if(s==="options"){r.status(200).end();return}a=await this.#u(await this.#y({input:d,options:c,logger:o}))}catch(c){p=J(c)}await this.#g({input:d,output:a,request:t,response:r,error:p,logger:o})}};var wt=["get","post","put","delete","patch"];import{z as vt}from"zod";var Nt=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Oe(s,n),o)};var Je=e=>{if(z(e.input))throw new L("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var ye=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:vt.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,g=>{if(g&&g instanceof Error)return c(o(g));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(Je({input:vt.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,u="methods"in p?p.methods:[p.method],g=typeof a=="function"?a:()=>a,m="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],h="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Ne({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:m,tags:h,methods:u,getOperationId:g,description:n,shortDescription:s,inputSchema:Nt(d,t)})}},Kr=new ye(fe),Fr=new ye(Ye);import{inspect as $r}from"util";var se=async(e,t="default")=>{try{return(await import(e))[t]}catch{}try{return await Promise.resolve().then(()=>St(e)[t])}catch{}throw new te(e)},Mt=async e=>{for(let{moduleName:t,moduleExport:r}of e)try{return await se(t,r)}catch{}throw new te(e.map(({moduleName:t})=>t))};var zt=e=>typeof e=="object"&&e!==null&&"level"in e&&("color"in e?typeof e.color=="boolean":!0)&&typeof e.level=="string"&&["silent","warn","debug"].includes(e.level),Dt=async e=>{let{createLogger:t,transports:r,format:{printf:o,timestamp:n,colorize:s,combine:a},config:{npm:p}}=await se("winston"),d=m=>{let{[Symbol.for("level")]:h,[Symbol.for("message")]:x,[Symbol.for("splat")]:T,...O}=m;return $r(O,!1,1,e.color)},c=m=>o(({timestamp:h,message:x,level:T,durationMs:O,...l})=>{typeof x=="object"&&(l={...l,...x},x="[No message]");let b=Object.keys(l).length>0,A=[];return O&&A.push("duration:",`${O}ms`),b?A.push(m?d(l):JSON.stringify(l)):A.push(...l?.[Symbol.for("splat")]||[]),[h,`${T}:`,x,...A].join(" ")}),u=[n()],g={handleExceptions:!0};switch(e.color&&u.push(s()),e.level){case"debug":g.level="debug",u.push(c(!0));break;case"silent":case"warn":default:g.level="warn",u.push(c())}return g.format=a(...u),t({silent:e.level==="silent",levels:p.levels,transports:[new r.Console(g)],exitOnError:!1})};var ge=class{constructor(t){this.endpoints=t}};import Br from"express";var he=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 p=`${o||""}${s?`/${s}`:""}`;if(a instanceof ne){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof he)r&&a.apply(p,r);else if(a instanceof ge){if(Object.entries(a.endpoints).forEach(([d,c])=>{if(!c.getMethods().includes(d))throw new X(`Endpoint assigned to ${d} method of ${p} must support ${d} method.`);t(c,p,d)}),n&&Object.keys(a.endpoints).length>0){let[d,...c]=Object.keys(a.endpoints),u=a.endpoints[d];u._setSiblingMethods(c),t(u,p,"options")}}else G({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var jt=()=>`
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 Ct=(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 Qe=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Dt()),G({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};import jt from"express";import _r from"http";import kt from"https";import Lt from"http-errors";var Gr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:Lt(400,J(r).message),request:o,response:n,logger:t,input:null,output:null})},qr=(e,t)=>(r,o)=>{let n=Lt(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){we({response:o,logger:t,error:new re(J(s).message,n)})}},Ut=async e=>{let t=Mt(e.logger)?await zt(e.logger):e.logger,r=e.errorHandler||fe,o=qr(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Vr=async(e,t)=>{let{logger:r,notFoundHandler:o}=await Ut(e);return Qe({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},Wr=async(e,t)=>{let r=jt().disable("x-powered-by");if(e.server.compression){let p=await X("compression");r.use(p(typeof e.server.compression=="object"?e.server.compression:void 0))}if(r.use(e.server.jsonParser||jt.json()),e.server.upload){let p=await X("express-fileupload");r.use(p({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}))}e.server.rawParser&&(r.use(e.server.rawParser),r.use((p,{},d)=>{Buffer.isBuffer(p.body)&&(p.body={raw:p.body}),d()}));let{logger:o,errorHandler:n,notFoundHandler:s}=await Ut(e);r.use(Gr(n,o)),Qe({app:r,routing:t,logger:o,config:e}),r.use(s);let a={httpServer:_r.createServer(r),httpsServer:e.https?kt.createServer(e.https.options,r):void 0};for(let p of Object.values(a)){let d=p instanceof kt.Server?e.https.listen:e.server.listen;p?.listen(d,()=>{typeof d=="object"?o.info("Listening",d):o.info(`Listening ${d}`)})}return{app:r,...a,logger:o}};import{OpenApiBuilder as Lo}from"openapi3-ts/oas30";import{isReferenceObject as Bt,isSchemaObject as be}from"openapi3-ts/oas30";import{omit as Te}from"ramda";import{z as b}from"zod";import{INVALID as Ht,ZodIssueCode as Xe,ZodParsedType as Kt,ZodType as Yr,addIssueToContext as et}from"zod";var tt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Jr="ZodDateIn",ve=class e extends Yr{_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}),Ht;tt.test(o.data)||(et(o,{code:Xe.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Re(n)?{status:r.value,value:n}:(et(o,{code:Xe.invalid_date}),Ht)}static create=()=>new e({typeName:Jr})};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,d=s?s({schema:e,...a,next:u=>q({...u,...a,onEach:t,rules:r,onMissing:o})}):o({schema:e,...a}),c=t&&t({schema:e,prev:d,...a});return c?{...d,...c}:d};var Ft=50,_t="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Qr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Gt=/:([A-Za-z0-9_]+)/g,qt=e=>{let t=e.match(Gt);return t?t.map(r=>r.slice(1)):[]},Vt=e=>e.replace(Gt,t=>`{${t.slice(1)}}`),Xr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),eo=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),to=()=>({format:"any"}),ro=e=>{if(e.isResponse)throw new P({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},oo=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||e?"binary":t?"byte":"file"}),no=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),so=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),io=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),ao=({schema:e,next:t})=>t({schema:e.unwrap()}),po=({schema:e,next:t})=>t({schema:e._def.innerType}),co=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),$t=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),lo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),mo=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&ue(s)?s instanceof b.ZodOptional:s.isOptional())});return{type:"object",properties:Me({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},uo=()=>({type:"string",nullable:!0,format:"null"}),fo=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:_t}}},yo=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:_t}}},go=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})},ho=()=>({type:"boolean"}),xo=()=>({type:"integer",format:"bigint"}),To=e=>e.reduce((t,r)=>t&&r instanceof b.ZodLiteral,!0),bo=({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:Me({schema:b.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof b.ZodLiteral)return{type:"object",properties:Me({schema:b.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof b.ZodUnion&&To(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Me({schema:b.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},Oo=({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}}),So=({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}: ${be(o)?o.type:o.$ref}`).join(", ")}}}},Ao=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:g}}})=>{let l=g.find(T=>T.kind==="regex"),h=g.find(T=>T.kind==="datetime"),x=l?l.regex:h?h.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...u&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...x&&{pattern:`/${x.source}/${x.flags}`}}},Ro=({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}},Me=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Po=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Qr?.[t]},Zo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&be(o)){let s=Ee({effect:n,sample:Po(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:b.any()})}if(!t&&n.type==="preprocess"&&be(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Eo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Io=({schema:e,next:t})=>t({schema:e.unwrap()}),Co=({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}))))()},Wt=(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)?Te(r,s):s}}),{})}},wo=(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,{})}},xe=(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=>xe(o,t)).reduce((o,n)=>o.merge(n.partial()),b.object({}));else if(e instanceof b.ZodEffects){if(z(e))throw new P({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=xe(e._def.schema,t)}else r=xe(e._def.left,t).merge(xe(e._def.right,t));return Se(e,r)},Yt=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),u=xe(c,{path:e,method:t,isResponse:!1}).shape,g=qt(e),l=o.includes("query"),h=o.includes("params"),x=o.includes("headers"),T=m=>h&&g.includes(m),S=m=>x&&Ge(m);return Object.keys(u).filter(m=>l||T(m)).map(m=>{let O=q({schema:u[m],isResponse:!1,rules:ot,onEach:nt,onMissing:st,serializer:n,getRef:s,makeRef:a,path:e,method:t}),w=p==="components"?a(N(e,t,`${d} ${m}`),O):O;return{name:m,in:T(m)?"path":S(m)?"header":"query",required:!u[m].isOptional(),description:be(O)&&O.description||`${t.toUpperCase()} ${e} ${d}`,schema:w,...wo(c,!1,m)}})},ot={ZodString:Ao,ZodNumber:Ro,ZodBigInt:xo,ZodBoolean:ho,ZodDateIn:fo,ZodDateOut:yo,ZodNull:uo,ZodArray:Oo,ZodTuple:So,ZodRecord:bo,ZodObject:mo,ZodLiteral:lo,ZodIntersection:io,ZodUnion:no,ZodFile:oo,ZodUpload:ro,ZodAny:to,ZodDefault:Xr,ZodEnum:$t,ZodNativeEnum:$t,ZodEffects:Zo,ZodOptional:ao,ZodNullable:co,ZodDiscriminatedUnion:so,ZodBranded:Io,ZodDate:go,ZodCatch:eo,ZodPipeline:Eo,ZodLazy:Co,ZodReadonly:po},nt=({schema:e,isResponse:t,prev:r})=>{if(Bt(r))return{};let{description:o}=e,n=e instanceof b.ZodLazy,s=r.type!==void 0,a=t&&ue(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:j({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},st=({schema:e,...t})=>{throw new P({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},rt=(e,t)=>{if(Bt(e))return e;let r=e.properties?Te(t,e.properties):void 0,o=e.example?Te(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>rt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>rt(p,t)):void 0;return Te(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},Jt=e=>be(e)?Te(["example"],e):e,it=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),u=r.getMimeTypes(o?"positive":"negative"),g=Jt(q({schema:c,isResponse:!0,rules:ot,onEach:nt,onMissing:st,serializer:n,getRef:s,makeRef:a,path:t,method:e})),l=Wt(c,!0),h=p==="components"?a(N(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:u.reduce((x,T)=>({...x,[T]:{schema:h,...l}}),{})}},No=()=>({type:"http",scheme:"basic"}),vo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Mo=({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}),jo=({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}}},{})}),Qt=e=>{let t={basic:No,bearer:vo,input:Mo,header:zo,cookie:Do,openid:jo,oauth2:ko};return Ce(e,r=>t[r.type](r))},ze=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 ze(Ve(e))}return ze({or:[e]})},Xt=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=qt(t),c=r.getSchema("input"),u=Jt(rt(q({schema:Q(c)?E.create().buffer():c,isResponse:!1,rules:ot,onEach:nt,onMissing:st,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),g=Wt(r.getSchema("input"),!1,d),l=a==="components"?s(N(t,e,p),u):u;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((h,x)=>({...h,[x]:{schema:l,...g}}),{})}},er=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<=Ft?e:e.slice(0,Ft-1)+"\u2026";var pt=class extends Lo{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:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:u=Ze}){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,x)=>{let T=x,S={path:h,method:T,endpoint:l,composition:c,serializer:u,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,O]=["short","long"].map(l.getDescription.bind(l)),w=r.inputSources?.[T]||Ae[T],ie=Yt({...S,inputSources:w}),Z={operationId:this.ensureUniqOperationId(h,T,l.getOperationId(T)),responses:{[l.getStatusCode("positive")]:it({...S,clue:a,isPositive:!0}),[l.getStatusCode("negative")]:it({...S,clue:p,isPositive:!1})}};O&&(Z.description=O,d&&m===void 0&&(Z.summary=at(O))),m&&(Z.summary=at(m)),l.getTags().length>0&&(Z.tags=l.getTags()),ie.length>0&&(Z.parameters=ie),w.includes("body")&&(Z.requestBody=Xt(S));let ae=ze(Ce(Qt(l.getSecurity()),pe=>{let bt=this.ensureUniqSecuritySchemaName(pe),xr=["oauth2","openIdConnect"].includes(pe.type)?l.getScopes():[];return this.addSecurityScheme(bt,pe),{name:bt,scopes:xr}}));ae.length>0&&(Z.security=ae);let Fe=Vt(h);this.addPath(Fe,{[T]:Z})}}),this.rootDoc.tags=r.tags?er(r.tags):[]}};import tr from"http";var Uo=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>F),...t}),Ho=({fnMethod:e,responseProps:t})=>{let r={writableEnded:!1,statusCode:200,statusMessage:tr.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=tr.STATUS_CODES[o],r)),json:e(()=>r),send:e(()=>r),end:e(()=>(r.writableEnded=!0,r)),...t};return r},Ko=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n})=>{let s=(await Et([{moduleName:"vitest",moduleExport:"vi"}],{moduleName:"jest",provider:()=>jest})).fn,a=Uo({fnMethod:s,requestProps:t}),p=Ho({fnMethod:s,responseProps:r}),d={info:s(),warn:s(),error:s(),debug:s(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};import K from"typescript";import v from"typescript";var i=v.factory,V=[i.createModifier(v.SyntaxKind.ExportKeyword)],Fo=[i.createModifier(v.SyntaxKind.AsyncKeyword)],$o=[i.createModifier(v.SyntaxKind.PublicKeyword),i.createModifier(v.SyntaxKind.ReadonlyKeyword)],rr=[i.createModifier(v.SyntaxKind.ProtectedKeyword),i.createModifier(v.SyntaxKind.ReadonlyKeyword)],Bo=i.createTemplateHead(""),_o=i.createTemplateTail(""),Go=i.createTemplateMiddle(" "),dt=e=>i.createTemplateLiteralType(Bo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?_o:Go))),ct=dt(["M","P"]),De=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),je=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(De(o,e[o],t)),[]),lt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),or=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),mt=(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)],v.NodeFlags.Const),ft=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),ke=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,t),nr=(e,t,r)=>i.createPropertyDeclaration($o,e,void 0,t,r),sr=(e,t,r=[])=>i.createClassDeclaration(V,e,void 0,void 0,[t,...r]),ir=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),ar=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(v.SyntaxKind.AnyKeyword)]),yt=(e,t,r)=>i.createInterfaceDeclaration(V,e,void 0,t,r),pr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),dr=(e,t)=>i.createArrowFunction(Fo,void 0,e.map(r=>De(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,je({acc:void 0,key:void 0}),void 0,void 0,t),r]);import y from"typescript";import{z as Vo}from"zod";import H from"typescript";var{factory:Le}=H,ht=(e,t)=>{H.addSyntheticLeadingComment(e,H.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ue=(e,t,r)=>{let o=Le.createTypeAliasDeclaration(void 0,Le.createIdentifier(t),void 0,e);return r&&ht(o,r),o},cr=(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_$]*$/,lr=e=>qo.test(e)?Le.createIdentifier(e):Le.createStringLiteral(e);var{factory:f}=y,Wo={[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},Yo=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Jo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&ue(a)?a instanceof Vo.ZodOptional:a.isOptional(),d=f.createPropertySignature(void 0,lr(s),p&&o?f.createToken(y.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&ht(d,a.description),d});return f.createTypeLiteralNode(n)},Qo=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),Xo=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),mr=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),en=e=>Wo?.[e.kind],tn=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ee({effect:n,sample:en(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},rn=({schema:e})=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),on=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},nn=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),sn=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),an=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),pn=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),dn=({next:e,schema:t})=>e({schema:t._def.innerType}),W=e=>()=>f.createKeywordTypeNode(e),cn=({next:e,schema:t})=>e({schema:t.unwrap()}),ln=({next:e,schema:t})=>e({schema:t._def.innerType}),mn=({next:e,schema:t})=>e({schema:t._def.innerType}),un=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),fn=()=>f.createLiteralTypeNode(f.createNull()),yn=({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}))))()},gn=({schema:{isBuffer:e}})=>e?f.createTypeReferenceNode("Buffer"):f.createKeywordTypeNode(y.SyntaxKind.StringKeyword),hn={ZodString:W(y.SyntaxKind.StringKeyword),ZodNumber:W(y.SyntaxKind.NumberKeyword),ZodBigInt:W(y.SyntaxKind.BigIntKeyword),ZodBoolean:W(y.SyntaxKind.BooleanKeyword),ZodDateIn:W(y.SyntaxKind.StringKeyword),ZodDateOut:W(y.SyntaxKind.StringKeyword),ZodNull:fn,ZodArray:Qo,ZodTuple:sn,ZodRecord:an,ZodObject:Jo,ZodLiteral:Yo,ZodIntersection:pn,ZodUnion:mr,ZodFile:gn,ZodAny:W(y.SyntaxKind.AnyKeyword),ZodDefault:dn,ZodEnum:Xo,ZodNativeEnum:rn,ZodEffects:tn,ZodOptional:on,ZodNullable:nn,ZodDiscriminatedUnion:mr,ZodBranded:cn,ZodCatch:mn,ZodPipeline:un,ZodLazy:yn,ZodReadonly:ln},xt=({schema:e,...t})=>q({schema:e,rules:hn,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]=Ue(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ze,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){G({routing:t,onEndpoint:(m,O,w)=>{let ie=N(O,w,"input"),Ke=N(O,w,"response"),Z={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},ae=m.getSchema("input"),Fe=xt({...Z,schema:Q(ae)?E.create().buffer():ae,isResponse:!1}),pe=xt({...Z,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(Ue(Fe,ie),Ue(pe,Ke)),w!=="options"&&(this.paths.push(O),this.registry[`${w} ${O}`]={in:ie,out:Ke,isJson:m.getMimeTypes("positive").includes(F),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=ft("Path",this.paths),a=ft("Method",wt),p=ke("MethodPath",dt([a.name,s.name])),d=[i.createHeritageClause(K.SyntaxKind.ExtendsKeyword,[lt(p.name,K.SyntaxKind.AnyKeyword)])],c=yt("Input",d,Object.keys(this.registry).map(m=>mt(m,this.registry[m].in))),u=yt("Response",d,Object.keys(this.registry).map(m=>mt(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,u),r==="types")return;let g=i.createVariableStatement(V,ut("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),l=i.createVariableStatement(V,ut("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(O=>i.createStringLiteral(O)))))))),h=ke("Provider",i.createFunctionTypeNode(pr({M:a.name,P:s.name}),je({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),ct)}),ir(u.name,ct))),x=ke("Implementation",i.createFunctionTypeNode(void 0,je({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(K.SyntaxKind.StringKeyword),params:lt(K.SyntaxKind.StringKeyword,K.SyntaxKind.AnyKeyword)}),ar())),T=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),S=sr("ExpressZodAPIClient",or([De("implementation",i.createTypeReferenceNode(x.name),rr)]),[nr("provide",i.createTypeReferenceNode(h.name),dr(["method","path","params"],[i.createIdentifier("method"),gt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[T,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,[T]),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(S,K.SyntaxKind.MultiLineCommentTrivia,`
22
+ `.trim();var Qe=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(jt()),G({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};import kt from"express";import _r from"http";import Gr from"https";import Lt from"http-errors";var qr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:Lt(400,J(r).message),request:o,response:n,logger:t,input:null,output:null})},Vr=(e,t)=>(r,o)=>{let n=Lt(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){we({response:o,logger:t,error:new ee(J(s).message,n)})}},Ut=async e=>{let t=zt(e.logger)?await Dt(e.logger):e.logger,r=e.errorHandler||fe,o=Vr(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Wr=async(e,t)=>{let{logger:r,notFoundHandler:o}=await Ut(e);return Qe({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},Yr=async(e,t)=>{let r=kt().disable("x-powered-by");if(e.server.compression){let d=await se("compression");r.use(d(typeof e.server.compression=="object"?e.server.compression:void 0))}if(r.use(e.server.jsonParser||kt.json()),e.server.upload){let d=await se("express-fileupload");r.use(d({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}))}e.server.rawParser&&(r.use(e.server.rawParser),r.use((d,{},c)=>{Buffer.isBuffer(d.body)&&(d.body={raw:d.body}),c()}));let{logger:o,errorHandler:n,notFoundHandler:s}=await Ut(e);r.use(qr(n,o)),Qe({app:r,routing:t,logger:o,config:e}),r.use(s);let a=(d,c)=>d.listen(c,()=>{o.info("Listening",c)}),p={httpServer:a(_r.createServer(r),e.server.listen),httpsServer:e.https?a(Gr.createServer(e.https.options,r),e.https.listen):void 0};return{app:r,...p,logger:o}};import{OpenApiBuilder as Uo}from"openapi3-ts/oas30";import{isReferenceObject as Bt,isSchemaObject as be}from"openapi3-ts/oas30";import{omit as Te}from"ramda";import{z as S}from"zod";import{INVALID as Ht,ZodIssueCode as Xe,ZodParsedType as Kt,ZodType as Jr,addIssueToContext as et}from"zod";var tt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Qr="ZodDateIn",ve=class e extends Jr{_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}),Ht;tt.test(o.data)||(et(o,{code:Xe.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Re(n)?{status:r.value,value:n}:(et(o,{code:Xe.invalid_date}),Ht)}static create=()=>new e({typeName:Qr})};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,d=s?s({schema:e,...a,next:u=>q({...u,...a,onEach:t,rules:r,onMissing:o})}):o({schema:e,...a}),c=t&&t({schema:e,prev:d,...a});return c?{...d,...c}:d};var Ft=50,_t="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Xr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Gt=/:([A-Za-z0-9_]+)/g,qt=e=>{let t=e.match(Gt);return t?t.map(r=>r.slice(1)):[]},Vt=e=>e.replace(Gt,t=>`{${t.slice(1)}}`),eo=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),to=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),ro=()=>({format:"any"}),oo=e=>{if(e.isResponse)throw new Z({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},no=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||e?"binary":t?"byte":"file"}),so=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),io=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),ao=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),po=({schema:e,next:t})=>t({schema:e.unwrap()}),co=({schema:e,next:t})=>t({schema:e._def.innerType}),lo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),$t=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),mo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),uo=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&ue(s)?s instanceof S.ZodOptional:s.isOptional())});return{type:"object",properties:Me({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},fo=()=>({type:"string",nullable:!0,format:"null"}),yo=e=>{if(e.isResponse)throw new Z({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:_t}}},go=e=>{if(!e.isResponse)throw new Z({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:_t}}},ho=e=>{throw new Z({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})},xo=()=>({type:"boolean"}),To=()=>({type:"integer",format:"bigint"}),bo=e=>e.reduce((t,r)=>t&&r instanceof S.ZodLiteral,!0),So=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof S.ZodEnum||e instanceof S.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Me({schema:S.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof S.ZodLiteral)return{type:"object",properties:Me({schema:S.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof S.ZodUnion&&bo(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:Me({schema:S.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},Oo=({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}: ${be(o)?o.type:o.$ref}`).join(", ")}}}},Ro=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:g}}})=>{let m=g.find(T=>T.kind==="regex"),h=g.find(T=>T.kind==="datetime"),x=m?m.regex:h?h.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...u&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...x&&{pattern:`/${x.source}/${x.flags}`}}},Po=({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}},Me=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Zo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Xr?.[t]},Eo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&be(o)){let s=Ee({effect:n,sample:Zo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:S.any()})}if(!t&&n.type==="preprocess"&&be(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Io=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Co=({schema:e,next:t})=>t({schema:e.unwrap()}),wo=({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}))))()},Wt=(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)?Te(r,s):s}}),{})}},No=(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,{})}},xe=(e,t)=>{if(e instanceof S.ZodObject)return e;let r;if(e instanceof S.ZodUnion||e instanceof S.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>xe(o,t)).reduce((o,n)=>o.merge(n.partial()),S.object({}));else if(e instanceof S.ZodEffects){if(z(e))throw new Z({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=xe(e._def.schema,t)}else r=xe(e._def.left,t).merge(xe(e._def.right,t));return Oe(e,r)},Yt=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),u=xe(c,{path:e,method:t,isResponse:!1}).shape,g=qt(e),m=o.includes("query"),h=o.includes("params"),x=o.includes("headers"),T=l=>h&&g.includes(l),O=l=>x&&Ge(l);return Object.keys(u).filter(l=>m||T(l)).map(l=>{let b=q({schema:u[l],isResponse:!1,rules:ot,onEach:nt,onMissing:st,serializer:n,getRef:s,makeRef:a,path:e,method:t}),A=p==="components"?a(N(e,t,`${d} ${l}`),b):b;return{name:l,in:T(l)?"path":O(l)?"header":"query",required:!u[l].isOptional(),description:be(b)&&b.description||`${t.toUpperCase()} ${e} ${d}`,schema:A,...No(c,!1,l)}})},ot={ZodString:Ro,ZodNumber:Po,ZodBigInt:To,ZodBoolean:xo,ZodDateIn:yo,ZodDateOut:go,ZodNull:fo,ZodArray:Oo,ZodTuple:Ao,ZodRecord:So,ZodObject:uo,ZodLiteral:mo,ZodIntersection:ao,ZodUnion:so,ZodFile:no,ZodUpload:oo,ZodAny:ro,ZodDefault:eo,ZodEnum:$t,ZodNativeEnum:$t,ZodEffects:Eo,ZodOptional:po,ZodNullable:lo,ZodDiscriminatedUnion:io,ZodBranded:Co,ZodDate:ho,ZodCatch:to,ZodPipeline:Io,ZodLazy:wo,ZodReadonly:co},nt=({schema:e,isResponse:t,prev:r})=>{if(Bt(r))return{};let{description:o}=e,n=e instanceof S.ZodLazy,s=r.type!==void 0,a=t&&ue(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:j({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},st=({schema:e,...t})=>{throw new Z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},rt=(e,t)=>{if(Bt(e))return e;let r=e.properties?Te(t,e.properties):void 0,o=e.example?Te(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>rt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>rt(p,t)):void 0;return Te(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},Jt=e=>be(e)?Te(["example"],e):e,it=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),u=r.getMimeTypes(o?"positive":"negative"),g=Jt(q({schema:c,isResponse:!0,rules:ot,onEach:nt,onMissing:st,serializer:n,getRef:s,makeRef:a,path:t,method:e})),m=Wt(c,!0),h=p==="components"?a(N(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:u.reduce((x,T)=>({...x,[T]:{schema:h,...m}}),{})}},vo=()=>({type:"http",scheme:"basic"}),Mo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),zo=({name:e})=>({type:"apiKey",in:"query",name:e}),Do=({name:e})=>({type:"apiKey",in:"header",name:e}),jo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),ko=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Lo=({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}}},{})}),Qt=e=>{let t={basic:vo,bearer:Mo,input:zo,header:Do,cookie:jo,openid:ko,oauth2:Lo};return Ce(e,r=>t[r.type](r))},ze=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 ze(Ve(e))}return ze({or:[e]})},Xt=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=qt(t),c=r.getSchema("input"),u=Jt(rt(q({schema:Q(c)?I.create().buffer():c,isResponse:!1,rules:ot,onEach:nt,onMissing:st,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),g=Wt(r.getSchema("input"),!1,d),m=a==="components"?s(N(t,e,p),u):u;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((h,x)=>({...h,[x]:{schema:m,...g}}),{})}},er=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<=Ft?e:e.slice(0,Ft-1)+"\u2026";var pt=class extends Uo{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 Z({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:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:u=Ze}){super(),this.addInfo({title:o,version:n});for(let m of typeof s=="string"?[s]:s)this.addServer({url:m});G({routing:t,onEndpoint:(m,h,x)=>{let T=x,O={path:h,method:T,endpoint:m,composition:c,serializer:u,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[l,b]=["short","long"].map(m.getDescription.bind(m)),A=r.inputSources?.[T]||Ae[T],ie=Yt({...O,inputSources:A}),E={operationId:this.ensureUniqOperationId(h,T,m.getOperationId(T)),responses:{[m.getStatusCode("positive")]:it({...O,clue:a,isPositive:!0}),[m.getStatusCode("negative")]:it({...O,clue:p,isPositive:!1})}};b&&(E.description=b,d&&l===void 0&&(E.summary=at(b))),l&&(E.summary=at(l)),m.getTags().length>0&&(E.tags=m.getTags()),ie.length>0&&(E.parameters=ie),A.includes("body")&&(E.requestBody=Xt(O));let ae=ze(Ce(Qt(m.getSecurity()),pe=>{let bt=this.ensureUniqSecuritySchemaName(pe),xr=["oauth2","openIdConnect"].includes(pe.type)?m.getScopes():[];return this.addSecurityScheme(bt,pe),{name:bt,scopes:xr}}));ae.length>0&&(E.security=ae);let Fe=Vt(h);this.addPath(Fe,{[T]:E})}}),this.rootDoc.tags=r.tags?er(r.tags):[]}};import tr from"http";var Ho=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>F),...t}),Ko=({fnMethod:e,responseProps:t})=>{let r={writableEnded:!1,statusCode:200,statusMessage:tr.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=tr.STATUS_CODES[o],r)),json:e(()=>r),send:e(()=>r),end:e(()=>(r.writableEnded=!0,r)),...t};return r},Fo=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,fnMethod:s})=>{let a=s||(await Mt([{moduleName:"vitest",moduleExport:"vi"},{moduleName:"@jest/globals",moduleExport:"jest"}])).fn,p=Ho({fnMethod:a,requestProps:t}),d=Ko({fnMethod:a,responseProps:r}),c={info:a(),warn:a(),error:a(),debug:a(),...n},u={cors:!1,logger:c,...o};return await e.execute({request:p,response:d,config:u,logger:c}),{requestMock:p,responseMock:d,loggerMock:c}};import K from"typescript";import v from"typescript";var i=v.factory,V=[i.createModifier(v.SyntaxKind.ExportKeyword)],$o=[i.createModifier(v.SyntaxKind.AsyncKeyword)],Bo=[i.createModifier(v.SyntaxKind.PublicKeyword),i.createModifier(v.SyntaxKind.ReadonlyKeyword)],rr=[i.createModifier(v.SyntaxKind.ProtectedKeyword),i.createModifier(v.SyntaxKind.ReadonlyKeyword)],_o=i.createTemplateHead(""),Go=i.createTemplateTail(""),qo=i.createTemplateMiddle(" "),dt=e=>i.createTemplateLiteralType(_o,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Go:qo))),ct=dt(["M","P"]),De=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),je=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(De(o,e[o],t)),[]),lt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),or=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),mt=(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)],v.NodeFlags.Const),ft=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),ke=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,t),nr=(e,t,r)=>i.createPropertyDeclaration(Bo,e,void 0,t,r),sr=(e,t,r=[])=>i.createClassDeclaration(V,e,void 0,void 0,[t,...r]),ir=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),ar=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(v.SyntaxKind.AnyKeyword)]),yt=(e,t,r)=>i.createInterfaceDeclaration(V,e,void 0,t,r),pr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),dr=(e,t)=>i.createArrowFunction($o,void 0,e.map(r=>De(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,je({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)},Ue=(e,t,r)=>{let o=Le.createTypeAliasDeclaration(void 0,Le.createIdentifier(t),void 0,e);return r&&ht(o,r),o},cr=(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)},Vo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,lr=e=>Vo.test(e)?Le.createIdentifier(e):Le.createStringLiteral(e);var{factory:f}=y,Yo={[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},Jo=({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 p=t&&ue(a)?a instanceof Wo.ZodOptional:a.isOptional(),d=f.createPropertySignature(void 0,lr(s),p&&o?f.createToken(y.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&ht(d,a.description),d});return f.createTypeLiteralNode(n)},Xo=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),en=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),mr=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),tn=e=>Yo?.[e.kind],rn=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ee({effect:n,sample:tn(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},on=({schema:e})=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),nn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},sn=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),an=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),pn=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),dn=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),cn=({next:e,schema:t})=>e({schema:t._def.innerType}),W=e=>()=>f.createKeywordTypeNode(e),ln=({next:e,schema:t})=>e({schema:t.unwrap()}),mn=({next:e,schema:t})=>e({schema:t._def.innerType}),un=({next:e,schema:t})=>e({schema:t._def.innerType}),fn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),yn=()=>f.createLiteralTypeNode(f.createNull()),gn=({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}))))()},hn=({schema:{isBuffer:e}})=>e?f.createTypeReferenceNode("Buffer"):f.createKeywordTypeNode(y.SyntaxKind.StringKeyword),xn={ZodString:W(y.SyntaxKind.StringKeyword),ZodNumber:W(y.SyntaxKind.NumberKeyword),ZodBigInt:W(y.SyntaxKind.BigIntKeyword),ZodBoolean:W(y.SyntaxKind.BooleanKeyword),ZodDateIn:W(y.SyntaxKind.StringKeyword),ZodDateOut:W(y.SyntaxKind.StringKeyword),ZodNull:yn,ZodArray:Xo,ZodTuple:an,ZodRecord:pn,ZodObject:Qo,ZodLiteral:Jo,ZodIntersection:dn,ZodUnion:mr,ZodFile:hn,ZodAny:W(y.SyntaxKind.AnyKeyword),ZodDefault:cn,ZodEnum:en,ZodNativeEnum:on,ZodEffects:rn,ZodOptional:nn,ZodNullable:sn,ZodDiscriminatedUnion:mr,ZodBranded:ln,ZodCatch:un,ZodPipeline:fn,ZodLazy:gn,ZodReadonly:mn},xt=({schema:e,...t})=>q({schema:e,rules:xn,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]=Ue(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ze,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){G({routing:t,onEndpoint:(l,b,A)=>{let ie=N(b,A,"input"),Ke=N(b,A,"response"),E={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},ae=l.getSchema("input"),Fe=xt({...E,schema:Q(ae)?I.create().buffer():ae,isResponse:!1}),pe=xt({...E,isResponse:!0,schema:l.getSchema("positive").or(l.getSchema("negative"))});this.agg.push(Ue(Fe,ie),Ue(pe,Ke)),A!=="options"&&(this.paths.push(b),this.registry[`${A} ${b}`]={in:ie,out:Ke,isJson:l.getMimeTypes("positive").includes(F),tags:l.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=ft("Path",this.paths),a=ft("Method",wt),p=ke("MethodPath",dt([a.name,s.name])),d=[i.createHeritageClause(K.SyntaxKind.ExtendsKeyword,[lt(p.name,K.SyntaxKind.AnyKeyword)])],c=yt("Input",d,Object.keys(this.registry).map(l=>mt(l,this.registry[l].in))),u=yt("Response",d,Object.keys(this.registry).map(l=>mt(l,this.registry[l].out)));if(this.agg.push(s,a,p,c,u),r==="types")return;let g=i.createVariableStatement(V,ut("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(l=>this.registry[l].isJson).map(l=>i.createPropertyAssignment(`"${l}"`,i.createTrue()))))),m=i.createVariableStatement(V,ut("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(l=>i.createPropertyAssignment(`"${l}"`,i.createArrayLiteralExpression(this.registry[l].tags.map(b=>i.createStringLiteral(b)))))))),h=ke("Provider",i.createFunctionTypeNode(pr({M:a.name,P:s.name}),je({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),ct)}),ir(u.name,ct))),x=ke("Implementation",i.createFunctionTypeNode(void 0,je({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(K.SyntaxKind.StringKeyword),params:lt(K.SyntaxKind.StringKeyword,K.SyntaxKind.AnyKeyword)}),ar())),T=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),O=sr("ExpressZodAPIClient",or([De("implementation",i.createTypeReferenceNode(x.name),rr)]),[nr("provide",i.createTypeReferenceNode(h.name),dr(["method","path","params"],[i.createIdentifier("method"),gt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[T,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,[T]),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(O,K.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,x,S)}print(t){return this.agg.map(r=>cr(r,t)).join(`
43
+ `,!0),this.agg.push(g,m,h,x,O)}print(t){return this.agg.map(r=>cr(r,t)).join(`
44
44
 
45
- `)}};var hr={};br(hr,{dateIn:()=>An,dateOut:()=>Rn,file:()=>On,raw:()=>Pn,upload:()=>Sn});import{z as bn}from"zod";import{INVALID as ur,ZodIssueCode as fr,ZodParsedType as yr,ZodType as xn,addIssueToContext as gr}from"zod";var Tn="ZodDateOut",He=class e extends xn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==yr.date?(gr(o,{code:fr.invalid_type,expected:yr.date,received:o.parsedType}),ur):Re(o.data)?{status:r.value,value:o.data.toISOString()}:(gr(o,{code:fr.invalid_date}),ur)}static create=()=>new e({typeName:Tn})};var On=E.create,Sn=Y.create,An=ve.create,Rn=He.create,Pn=()=>bn.object({raw:E.create().buffer()});export{se as AbstractEndpoint,ge as DependsOnMethod,pt as Documentation,P as DocumentationError,ye as EndpointsFactory,k as InputValidationError,Tt as Integration,ee as MissingPeerError,$ as OutputValidationError,te as RoutingError,he as ServeStatic,Fr as arrayEndpointsFactory,Ye as arrayResultHandler,Vr as attachRouting,Or as createConfig,Je as createMiddleware,We as createResultHandler,Wr as createServer,Kr as defaultEndpointsFactory,fe as defaultResultHandler,hr as ez,j as getExamples,D as getMessageFromError,Pe as getStatusCodeFromError,Ko as testEndpoint,M as withMeta};
45
+ `)}};var hr={};br(hr,{dateIn:()=>Rn,dateOut:()=>Pn,file:()=>On,raw:()=>Zn,upload:()=>An});import{z as Sn}from"zod";import{INVALID as ur,ZodIssueCode as fr,ZodParsedType as yr,ZodType as Tn,addIssueToContext as gr}from"zod";var bn="ZodDateOut",He=class e extends Tn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==yr.date?(gr(o,{code:fr.invalid_type,expected:yr.date,received:o.parsedType}),ur):Re(o.data)?{status:r.value,value:o.data.toISOString()}:(gr(o,{code:fr.invalid_date}),ur)}static create=()=>new e({typeName:bn})};var On=I.create,An=Y.create,Rn=ve.create,Pn=He.create,Zn=()=>Sn.object({raw:I.create().buffer()});export{ne as AbstractEndpoint,ge as DependsOnMethod,pt as Documentation,Z as DocumentationError,ye as EndpointsFactory,k as InputValidationError,Tt as Integration,te as MissingPeerError,$ as OutputValidationError,X as RoutingError,he as ServeStatic,Fr as arrayEndpointsFactory,Ye as arrayResultHandler,Wr as attachRouting,Sr as createConfig,Je as createMiddleware,We as createResultHandler,Yr as createServer,Kr as defaultEndpointsFactory,fe as defaultResultHandler,hr as ez,j as getExamples,D as getMessageFromError,Pe as getStatusCodeFromError,Fo as testEndpoint,M as withMeta};
package/package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "15.0.0-beta3",
3
+ "version": "15.0.0-beta5",
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
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/RobinTail/express-zod-api.git"
9
+ },
10
+ "homepage": "https://ez.robintail.cz",
11
+ "author": {
12
+ "name": "Anna Bocharova",
13
+ "url": "https://robintail.cz",
14
+ "email": "me@robintail.cz"
15
+ },
16
+ "bugs": {
17
+ "url": "https://github.com/RobinTail/express-zod-api/issues"
18
+ },
6
19
  "scripts": {
7
20
  "start": "yarn tsnode example/index.ts",
8
21
  "build": "yarn build:compile && yarn build:tests && yarn build:assets",
@@ -48,6 +61,9 @@
48
61
  }
49
62
  }
50
63
  },
64
+ "engines": {
65
+ "node": "^18.0.0 || ^20.1.0"
66
+ },
51
67
  "dependencies": {
52
68
  "openapi3-ts": "^4.1.2",
53
69
  "ramda": "^0.29.1"
@@ -149,22 +165,6 @@
149
165
  "winston": "^3.10.0",
150
166
  "zod": "^3.22.3"
151
167
  },
152
- "engines": {
153
- "node": "^18.0.0 || ^20.1.0"
154
- },
155
- "repository": {
156
- "type": "git",
157
- "url": "git+https://github.com/RobinTail/express-zod-api.git"
158
- },
159
- "homepage": "https://ez.robintail.cz",
160
- "author": {
161
- "name": "Anna Bocharova",
162
- "url": "https://robintail.cz",
163
- "email": "me@robintail.cz"
164
- },
165
- "bugs": {
166
- "url": "https://github.com/RobinTail/express-zod-api/issues"
167
- },
168
168
  "keywords": [
169
169
  "nodejs",
170
170
  "api",