express-zod-api 15.0.0-beta4 → 15.0.0-beta6

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,71 +5,90 @@
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()` requires an additional argument;
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 different testing 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()`:
17
16
  - Both `jest` and `vitest` are supported automatically;
18
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.
19
19
  - How to migrate while maintaining previous functionality and behavior:
20
- - If you're going to continue using `winston`:
21
- - 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).
22
21
  - If you have `upload` option enabled in your config:
23
22
  - Install `express-fileupload` and `@types/express-fileupload` packages;
24
23
  - If you have `compression` option enabled in your config:
25
24
  - Install `compression` and `@types/compression` packages;
26
- - If you're using `createLogger()` method:
27
- - Place its argument as a value of `logger` property supplied to `createConfig()`.
28
25
  - If you're using the entities returned from `createServer()` or `attachRouting()` methods:
29
- - Add `await` before calling them: `const {...} = await createServer(...)`.
26
+ - Add `await` before calling those methods.
30
27
  - If you can not use `await` (on the top level of CommonJS):
31
28
  - Wrap your code with async IIFE or use `.then()` (see example below).
32
29
  - If you're using `testEndpoint()` method:
33
- - Add module augmentation statement once anywhere in your tests (see below);
34
- - When using testing framework other than `jest` or `vitest`, specify `fnMethod` property to `testEndpoint()`.
30
+ - Add module augmentation statement once anywhere within your tests based on `jest.Mock` type (see example below).
31
+ - If you're using `createLogger()` helper:
32
+ - Consider using `logger` property supplied to `createConfig()` instead;
33
+ - Otherwise, supply also the `winston` argument to the helper (`import winston from "winston"`).
35
34
 
36
35
  ```typescript
37
- import type { Logger } from "winston";
38
- import { createConfig, createServer, testEndpoint } from "express-zod-api";
36
+ import winston from "winston";
37
+ import { createConfig, createLogger, createServer } from "express-zod-api";
39
38
 
40
- // The configuration remains the same
39
+ // Use the logger property of config to use Winston logger
41
40
  const config = createConfig({
42
41
  logger: { level: "debug", color: true },
43
42
  });
44
43
 
45
- // Set the type of logger used near your configuration
44
+ // If you need that pretty logger outside the API, use the existing helper instead:
45
+ const logger = createLogger({ winston, level: "debug", color: true });
46
+
47
+ // Set the type of the logger used near your configuration
46
48
  declare module "express-zod-api" {
47
- interface LoggerOverrides extends Logger {}
49
+ interface LoggerOverrides extends winston.Logger {}
48
50
  }
49
51
 
50
- // await is only needed when you're using the returns of createServer() or attachRouting()
52
+ // if using entities returned from createServer() or attachRouting(): add "await" before it.
51
53
  // For using await on the top level CJS, wrap it in async IIFE:
52
54
  // (async () => { await ... })();
53
55
  const { app, httpServer } = await createServer(config, routing);
56
+ ```
54
57
 
55
- // Adjust your tests: place it once anywhere
58
+ ```typescript
59
+ // Adjust your tests: set the MockOverrides type once anywhere
56
60
  declare module "express-zod-api" {
57
61
  interface MockOverrides extends jest.Mock {} // or Mock from vitest
58
62
  }
59
63
 
60
64
  // Both jest and vitest are supported automatically
65
+ import { testEndpoint } from "express-zod-api";
61
66
  const { responseMock } = await testEndpoint({ endpoint });
62
67
 
63
- // For other testing frameworks: specify fnMethod property
64
- import { mock } from "node:test";
68
+ // For other testing frameworks:
69
+
70
+ // 1. specify fnMethod property
71
+ import { mock, Mock } from "node:test";
65
72
  await testEndpoint({
66
73
  endpoint,
67
74
  fnMethod: mock.fn.bind(mock), // https://nodejs.org/docs/latest-v20.x/api/test.html#mocking
68
75
  });
76
+ // 2. and set the MockOverrides type once
77
+ declare module "express-zod-api" {
78
+ interface MockOverrides extends Mock {} // Mock of your testing framework
79
+ }
69
80
  ```
70
81
 
71
82
  ## Version 14
72
83
 
84
+ ### v14.2.4
85
+
86
+ - Fixed internal logging format when primivite are supplied as a second argument to the logger methods.
87
+
88
+ ```typescript
89
+ logger.info("Listening", 8090);
90
+ ```
91
+
73
92
  ### v14.2.3
74
93
 
75
94
  - `express-fileupload` version is 1.4.3.
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 () => {
@@ -1014,7 +1015,7 @@ const exampleEndpoint = taggedEndpointsFactory.build({
1014
1015
 
1015
1016
  The way to test endpoints is to mock the request, response, and logger objects, invoke the `execute()` method, and
1016
1017
  assert the expectations for calls of certain mocked methods. The library provides a special method `testEndpoint` that
1017
- makes mocking easier. It requires your either to install `jest` (with `@types/jest`) or `vitest`
1018
+ makes mocking easier. It requires you either to install `jest` (with `@types/jest`) or `vitest`
1018
1019
  (detects automatically), or to specify the `fnMethod` property assigned with a function mocking method of your testing
1019
1020
  framework, which can also be `node:test` module of most modern Node.js versions.
1020
1021
  However, in order to have proper mocking types in your own tests, you also need to specify `MockOverrides` once in your
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
@@ -4,6 +4,7 @@ import fileUpload, { UploadedFile } from 'express-fileupload';
4
4
  import https, { ServerOptions } from 'node:https';
5
5
  import { z, ZodTypeDef, ZodType, ParseInput, ParseReturnType, ZodError } from 'zod';
6
6
  import { HttpError } from 'http-errors';
7
+ import Winston from 'winston';
7
8
  import { ListenOptions } from 'node:net';
8
9
  import * as qs from 'qs';
9
10
  import * as express_serve_static_core from 'express-serve-static-core';
@@ -103,8 +104,16 @@ interface LoggerOverrides {
103
104
  type AbstractLogger = Record<"info" | "debug" | "warn" | "error", (message: string, meta?: any) => any> & LoggerOverrides;
104
105
  interface SimplifiedWinstonConfig {
105
106
  level: "silent" | "warn" | "debug";
106
- color: boolean;
107
+ color?: boolean;
107
108
  }
109
+ /**
110
+ * @desc a helper for creating a winston logger easier
111
+ * @requires winston
112
+ * @example createLogger({ winston, level: "debug", color: true })
113
+ * */
114
+ declare const createLogger: ({ winston: { createLogger: create, transports, format: { printf, timestamp: useTimestamp, colorize, combine }, config: { npm }, }, ...config }: SimplifiedWinstonConfig & {
115
+ winston: typeof Winston;
116
+ }) => Winston.Logger;
108
117
 
109
118
  interface MiddlewareParams<IN, OPT> {
110
119
  input: IN;
@@ -806,11 +815,15 @@ declare class Documentation extends OpenApiBuilder {
806
815
  constructor({ routing, config, title, version, serverUrl, successfulResponseDescription, errorResponseDescription, hasSummaryFromDescription, composition, serializer, }: DocumentationParams);
807
816
  }
808
817
 
818
+ /**
819
+ * @desc Using module augmentation approach you can set the Mock type of your actual testing framework.
820
+ * @example declare module "express-zod-api" { interface MockOverrides extends Mock {} }
821
+ * @link https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
822
+ * */
809
823
  interface MockOverrides {
810
824
  }
811
- interface MockFunction {
812
- (implementation?: (...args: any[]) => any): MockOverrides;
813
- }
825
+ /** @desc Compatibility constraints for a function mocking method of a testing framework. */
826
+ type MockFunction = (implementation?: (...args: any[]) => any) => MockOverrides;
814
827
  interface TestEndpointProps<REQ, RES, LOG> {
815
828
  /** @desc The endpoint to test */
816
829
  endpoint: AbstractEndpoint;
@@ -924,4 +937,4 @@ declare namespace proprietarySchemas {
924
937
  export { proprietarySchemas_dateIn as dateIn, proprietarySchemas_dateOut as dateOut, proprietarySchemas_file as file, proprietarySchemas_raw as raw, proprietarySchemas_upload as upload };
925
938
  }
926
939
 
927
- export { AbstractEndpoint, type AppConfig, type BasicSecurity, type BearerSecurity, type CommonConfig, type CookieSecurity, type CustomHeaderSecurity, DependsOnMethod, Documentation, DocumentationError, EndpointsFactory, type FlatObject, type IOSchema, type InputSecurity, InputValidationError, Integration, type LoggerOverrides, type Metadata, type Method, type MiddlewareDefinition, MissingPeerError, type MockOverrides, type OAuth2Security, type OpenIdSecurity, OutputValidationError, type ResultHandlerDefinition, type Routing, RoutingError, ServeStatic, type ServerConfig, type ZodDateInDef, type ZodDateOutDef, type ZodFileDef, type ZodUploadDef, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
940
+ export { AbstractEndpoint, type AppConfig, type BasicSecurity, type BearerSecurity, type CommonConfig, type CookieSecurity, type CustomHeaderSecurity, DependsOnMethod, Documentation, DocumentationError, EndpointsFactory, type FlatObject, type IOSchema, type InputSecurity, InputValidationError, Integration, type LoggerOverrides, type Metadata, type Method, type MiddlewareDefinition, MissingPeerError, type MockOverrides, type OAuth2Security, type OpenIdSecurity, OutputValidationError, type ResultHandlerDefinition, type Routing, RoutingError, ServeStatic, type ServerConfig, type ZodDateInDef, type ZodDateOutDef, type ZodFileDef, type ZodUploadDef, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createLogger, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ import fileUpload, { UploadedFile } from 'express-fileupload';
4
4
  import https, { ServerOptions } from 'node:https';
5
5
  import { z, ZodTypeDef, ZodType, ParseInput, ParseReturnType, ZodError } from 'zod';
6
6
  import { HttpError } from 'http-errors';
7
+ import Winston from 'winston';
7
8
  import { ListenOptions } from 'node:net';
8
9
  import * as qs from 'qs';
9
10
  import * as express_serve_static_core from 'express-serve-static-core';
@@ -103,8 +104,16 @@ interface LoggerOverrides {
103
104
  type AbstractLogger = Record<"info" | "debug" | "warn" | "error", (message: string, meta?: any) => any> & LoggerOverrides;
104
105
  interface SimplifiedWinstonConfig {
105
106
  level: "silent" | "warn" | "debug";
106
- color: boolean;
107
+ color?: boolean;
107
108
  }
109
+ /**
110
+ * @desc a helper for creating a winston logger easier
111
+ * @requires winston
112
+ * @example createLogger({ winston, level: "debug", color: true })
113
+ * */
114
+ declare const createLogger: ({ winston: { createLogger: create, transports, format: { printf, timestamp: useTimestamp, colorize, combine }, config: { npm }, }, ...config }: SimplifiedWinstonConfig & {
115
+ winston: typeof Winston;
116
+ }) => Winston.Logger;
108
117
 
109
118
  interface MiddlewareParams<IN, OPT> {
110
119
  input: IN;
@@ -806,11 +815,15 @@ declare class Documentation extends OpenApiBuilder {
806
815
  constructor({ routing, config, title, version, serverUrl, successfulResponseDescription, errorResponseDescription, hasSummaryFromDescription, composition, serializer, }: DocumentationParams);
807
816
  }
808
817
 
818
+ /**
819
+ * @desc Using module augmentation approach you can set the Mock type of your actual testing framework.
820
+ * @example declare module "express-zod-api" { interface MockOverrides extends Mock {} }
821
+ * @link https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
822
+ * */
809
823
  interface MockOverrides {
810
824
  }
811
- interface MockFunction {
812
- (implementation?: (...args: any[]) => any): MockOverrides;
813
- }
825
+ /** @desc Compatibility constraints for a function mocking method of a testing framework. */
826
+ type MockFunction = (implementation?: (...args: any[]) => any) => MockOverrides;
814
827
  interface TestEndpointProps<REQ, RES, LOG> {
815
828
  /** @desc The endpoint to test */
816
829
  endpoint: AbstractEndpoint;
@@ -924,4 +937,4 @@ declare namespace proprietarySchemas {
924
937
  export { proprietarySchemas_dateIn as dateIn, proprietarySchemas_dateOut as dateOut, proprietarySchemas_file as file, proprietarySchemas_raw as raw, proprietarySchemas_upload as upload };
925
938
  }
926
939
 
927
- export { AbstractEndpoint, type AppConfig, type BasicSecurity, type BearerSecurity, type CommonConfig, type CookieSecurity, type CustomHeaderSecurity, DependsOnMethod, Documentation, DocumentationError, EndpointsFactory, type FlatObject, type IOSchema, type InputSecurity, InputValidationError, Integration, type LoggerOverrides, type Metadata, type Method, type MiddlewareDefinition, MissingPeerError, type MockOverrides, type OAuth2Security, type OpenIdSecurity, OutputValidationError, type ResultHandlerDefinition, type Routing, RoutingError, ServeStatic, type ServerConfig, type ZodDateInDef, type ZodDateOutDef, type ZodFileDef, type ZodUploadDef, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
940
+ export { AbstractEndpoint, type AppConfig, type BasicSecurity, type BearerSecurity, type CommonConfig, type CookieSecurity, type CustomHeaderSecurity, DependsOnMethod, Documentation, DocumentationError, EndpointsFactory, type FlatObject, type IOSchema, type InputSecurity, InputValidationError, Integration, type LoggerOverrides, type Metadata, type Method, type MiddlewareDefinition, MissingPeerError, type MockOverrides, type OAuth2Security, type OpenIdSecurity, OutputValidationError, type ResultHandlerDefinition, type Routing, RoutingError, ServeStatic, type ServerConfig, type ZodDateInDef, type ZodDateOutDef, type ZodFileDef, type ZodUploadDef, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createLogger, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- "use strict";var Cr=Object.create;var 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:()=>me,InputValidationError:()=>K,Integration:()=>Ye,MissingPeerError:()=>J,OutputValidationError:()=>q,RoutingError:()=>Y,ServeStatic:()=>ye,arrayEndpointsFactory:()=>Bt,arrayResultHandler:()=>ke,attachRouting:()=>Xt,createConfig:()=>Nt,createMiddleware:()=>He,createResultHandler:()=>je,createServer:()=>er,defaultEndpointsFactory:()=>$t,defaultResultHandler:()=>le,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 wr=Object.create;var Ee=Object.defineProperty;var Cr=Object.getOwnPropertyDescriptor;var Nr=Object.getOwnPropertyNames;var vr=Object.getPrototypeOf,Mr=Object.prototype.hasOwnProperty;var wt=(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=Cr(t,n))||o.enumerable});return e};var D=(e,t,r)=>(r=e!=null?wr(vr(e)):{},Ct(t||!e||!e.__esModule?Ee(r,"default",{value:e,enumerable:!0}):r,e)),Dr=e=>Ct(Ee({},"__esModule",{value:!0}),e);var yn={};wt(yn,{AbstractEndpoint:()=>ee,DependsOnMethod:()=>ue,Documentation:()=>_e,DocumentationError:()=>w,EndpointsFactory:()=>me,InputValidationError:()=>K,Integration:()=>Je,MissingPeerError:()=>J,OutputValidationError:()=>q,RoutingError:()=>Y,ServeStatic:()=>fe,arrayEndpointsFactory:()=>Bt,arrayResultHandler:()=>ke,attachRouting:()=>Xt,createConfig:()=>Nt,createLogger:()=>Ke,createMiddleware:()=>He,createResultHandler:()=>je,createServer:()=>er,defaultEndpointsFactory:()=>$t,defaultResultHandler:()=>le,ez:()=>Et,getExamples:()=>U,getMessageFromError:()=>L,getStatusCodeFromError:()=>Ae,testEndpoint:()=>fr,withMeta:()=>k});module.exports=Dr(yn);function Nt(e){return e}var F=require("zod");var zt=require("http-errors"),jt=require("crypto"),R=require("zod");var b=require("zod");var zr="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,...Te(t),type:""});buffer=t=>new e({...this._def,...Te(t),type:Buffer.from([])});binary=t=>new e({...this._def,...Te(t),encoding:"binary"});base64=t=>new e({...this._def,...Te(t),encoding:"base64"});get isBinary(){return this._def.encoding==="binary"}get isBase64(){return this._def.encoding==="base64"}get isString(){return typeof this._def.type=="string"}get isBuffer(){return Buffer.isBuffer(this._def.type)}static create=()=>new e({typeName:zr,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},vt=e=>I in e._def?typeof e._def[I]=="object"&&e._def[I]!==null:!1,Mt=(e,t)=>{if(!vt(e))return;let r=e._def;return t in r[I]?r[I][t]:void 0},we=(e,t)=>{if(!vt(e))return t;let r=k(t),o=be(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",Se="multipart/form-data",Dt="application/octet-stream";var C=require("zod"),Lr="ZodUpload",Ur=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",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},Ce={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Kr=["body","query","params"],tt=e=>e.method.toLowerCase(),rt=e=>e.startsWith("x-"),Fr=e=>Object.entries(e.headers).reduce((t,[r,o])=>rt(r)?{...t,[r]:o}:t,{}),kt=(e,t)=>{let r=tt(e);if(r==="options")return{};let o=Kr;return r in Ce&&(o=Ce[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Hr(e):!0).reduce((n,s)=>({...n,...s==="headers"?Fr(e):e[s]}),{})},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,Ae=e=>(0,zt.isHttpError)(e)?e.statusCode:e instanceof K?400:500,ot=({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||{};var Y=class extends Error{name="RoutingError"},I=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
- Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},V=class extends Error{name="IOSchemaError"},q=class extends V{name="OutputValidationError";originalError;constructor(t){super(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 Ut=e=>typeof e=="object"&&e!==null,Q=e=>Ut(e)&&"or"in e,X=e=>Ut(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:[]}),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}=Oe(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 v=require("zod");var ce={positive:200,negative:400},je=e=>e,le=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(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 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 Ht=(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:Ht(l.positive),negative:Ht(l.negative)},this.#t={input:r,output:o,positive:l.positive instanceof F.z.ZodType?l.positive:l.positive.schema,negative:l.negative instanceof F.z.ZodType?l.negative:l.negative.schema},this.#s={positive:l.positive instanceof F.z.ZodType?ce.positive:l.positive.statusCode||ce.positive,negative:l.negative instanceof F.z.ZodType?ce.negative:l.negative.statusCode||ce.negative}}_setSiblingMethods(t){this.#l=t}getDescription(t){return this.#e[t]}getMethods(){return this.#r}getSchema(t){return this.#t[t]}getMimeTypes(t){return this.#n[t]}getStatusCode(t){return this.#s[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?de(t,r.security):t,{and:[]})}getScopes(){return this.#p}getTags(){return this.#d}getOperationId(t){return this.#c(t)}#m(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#r.concat(this.#l).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#t.output.parseAsync(t)}catch(r){throw r instanceof 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=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 Kt=["get","post","put","delete","patch"];var nt=require("zod");var Ft=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Ce(s,n),o)};var He=e=>{if(G(e.input))throw new V("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var me=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:nt.z.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,g=>{if(g&&g instanceof Error)return c(o(g));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(He({input:nt.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,u="methods"in p?p.methods:[p.method],g=typeof a=="function"?a:()=>a,l="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],h="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Ue({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:l,tags:h,methods:u,getOperationId:g,description:n,shortDescription:s,inputSchema:Ft(d,t)})}},$t=new me(le),Bt=new me(ke);var Gt=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)},_t=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 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 ue("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 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 Yt=()=>`
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},be=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}},Oe=e=>e.reduce((t,r)=>t||r,!1),G=e=>e instanceof R.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof R.z.ZodUnion?Oe(e.options.map(G)):e instanceof R.z.ZodIntersection?Oe([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?Oe(Object.values(e.shape).map(s=>z({subject:s,...n}))):e instanceof R.z.ZodUnion?Oe(e.options.map(s=>z({subject:s,...n}))):e instanceof R.z.ZodIntersection?Oe([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 v,maxDepth:3}),Re=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,H=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),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}},Te=e=>typeof e=="string"?{message:e}:e||{};var Y=class extends Error{name="RoutingError"},w=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 Ut=e=>typeof e=="object"&&e!==null,Q=e=>Ut(e)&&"or"in e,X=e=>Ut(e)&&"and"in e,De=e=>({and:e.reduce((t,r)=>t.concat(X(r)?r.and:r),[])}),ze=(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),nt=e=>e.and.reduce((t,r)=>{let o=be(t.or,Q(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(De),t},{or:[]}),de=(e,t)=>{if(X(e))return X(t)?De([e,t]):Q(t)?de(nt(e),t):De([e,t]);if(Q(e)){if(X(t))return de(t,e);if(Q(t)){let{type:r,value:o}=be(e.or,t.or);return{or:r==="single"?o:o.map(De)}}return de(e,{and:[t]})}return 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=Ae(e);ot({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=Ae(r);ot({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),Le=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
+ Original error: ${e.originalError.message}.`:""))};var Ht=(e,t=[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:Lt(r)?[Se]:ae(r)?[Dt]:[W],positive:Ht(m.positive),negative:Ht(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=tt(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 Kt=["get","post","put","delete","patch"];var st=require("zod");var Ft=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>we(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:st.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:st.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:Ft(d,t)})}},$t=new me(le),Bt=new me(ke);var _t=require("util"),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),Ke=({winston:{createLogger:e,transports:t,format:{printf:r,timestamp:o,colorize:n,combine:s},config:{npm:a}},...p})=>{let d=m=>{let{[Symbol.for("level")]:h,[Symbol.for("message")]:x,[Symbol.for("splat")]:T,...P}=m;return(0,_t.inspect)(P,!1,1,p.color)},c=m=>r(({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=[o()],g={handleExceptions:!0};switch(p.color&&u.push(n()),p.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=s(...u),e({silent:p.level==="silent",levels:a.levels,transports:[new t.Console(g)],exitOnError:!1})};var ue=class{constructor(t){this.endpoints=t}};var qt=D(require("express")),fe=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,qt.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 fe)r&&a.apply(p,r);else if(a instanceof ue){if(Object.entries(a.endpoints).forEach(([d,c])=>{if(!c.getMethods().includes(d))throw new Y(`Endpoint assigned to ${d} method of ${p} must support ${d} method.`);t(c,p,d)}),n&&Object.keys(a.endpoints).length>0){let[d,...c]=Object.keys(a.endpoints),u=a.endpoints[d];u._setSiblingMethods(c),t(u,p,"options")}}else te({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var Vt=()=>`
6
6
  \x1B[94m\x1B[39m
7
7
  \x1B[94m\x1B[39m
8
8
  \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
@@ -19,7 +19,7 @@ Original error: ${e.originalError.message}.`:""))};var Ht=(e,t=[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 pe(ie(s).message,n)})}},Qt=async e=>{let t=qt(e.logger)?await Vt(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 p=await ue("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 ue("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,fnMethod:s})=>{let a=s||(await _t([{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 _=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",Kt),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 it=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Vt()),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 at=D(require("express")),Yt=D(require("http")),Jt=D(require("https"));var Pe=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)},Wt=async e=>{for(let{moduleName:t,moduleExport:r}of e)try{return await Pe(t,r)}catch{}throw new J(e.map(({moduleName:t})=>t))};var pt=D(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 pe(ie(s).message,n)})}},Qt=async e=>{let t=Gt(e.logger)?Ke({...e.logger,winston:await Pe("winston")}):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 it({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},er=async(e,t)=>{let r=(0,at.default)().disable("x-powered-by");if(e.server.compression){let d=await Pe("compression");r.use(d(typeof e.server.compression=="object"?e.server.compression:void 0))}if(r.use(e.server.jsonParser||at.default.json()),e.server.upload){let d=await Pe("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)),it({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"),ye=require("ramda"),O=require("zod");var A=require("zod");var dt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,_r="ZodDateIn",Fe=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;dt.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 w({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&&Re(s)?s instanceof O.z.ZodOptional:s.isOptional())});return{type:"object",properties:$e({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},io=()=>({type:"string",nullable:!0,format:"null"}),ao=e=>{if(e.isResponse)throw new w({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 w({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 w({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:$e({schema:O.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof O.z.ZodLiteral)return{type:"object",properties:$e({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:$e({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}},$e=({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,ye.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 w({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 we(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&&rt(l);return Object.keys(u).filter(l=>m||T(l)).map(l=>{let S=re({schema:u[l],isResponse:!1,rules:lt,onEach:mt,onMissing:ut,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)}})},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:Oo,ZodDate:co,ZodCatch:Vr,ZodPipeline:So,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&&Re(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 w({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},ct=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r=e.properties?(0,ye.omit)(t,e.properties):void 0,o=e.example?(0,ye.omit)(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>ct(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>ct(p,t)):void 0;return(0,ye.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},dr=e=>(0,$.isSchemaObject)(e)?(0,ye.omit)(["example"],e):e,ft=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),u=r.getMimeTypes(o?"positive":"negative"),g=dr(re({schema:c,isResponse:!0,rules:lt,onEach:mt,onMissing:ut,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}),wo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Co=({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:wo,openid:Co,oauth2:No};return ze(e,r=>t[r.type](r))},Be=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 Be(nt(e))}return Be({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)?v.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),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}}}}),yt=e=>e.length<=tr?e:e.slice(0,tr-1)+"\u2026";var _e=class extends ur.OpenApiBuilder{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o){if(o in this.lastOperationIdSuffixes)throw new w({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]||Ce[T],ge=pr({...P,inputSources:Z}),N={operationId:this.ensureUniqOperationId(h,T,m.getOperationId(T)),responses:{[m.getStatusCode("positive")]:ft({...P,clue:a,isPositive:!0}),[m.getStatusCode("negative")]:ft({...P,clue:p,isPositive:!1})}};S&&(N.description=S,d&&l===void 0&&(N.summary=yt(S))),l&&(N.summary=yt(l)),m.getTags().length>0&&(N.tags=m.getTags()),ge.length>0&&(N.parameters=ge),Z.includes("body")&&(N.requestBody=lr(P));let he=Be(ze(cr(m.getSecurity()),xe=>{let It=this.ensureUniqSecuritySchemaName(xe),Ir=["oauth2","openIdConnect"].includes(xe.type)?m.getScopes():[];return this.addSecurityScheme(It,xe),{name:It,scopes:Ir}}));he.length>0&&(N.security=he);let et=ir(h);this.addPath(et,{[T]:N})}}),this.rootDoc.tags=r.tags?mr(r.tags):[]}};var gt=D(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,fnMethod:s})=>{let a=s||(await Wt([{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 _=D(require("typescript"));var j=D(require("typescript")),i=j.default.factory,oe=[i.createModifier(j.default.SyntaxKind.ExportKeyword)],Do=[i.createModifier(j.default.SyntaxKind.AsyncKeyword)],zo=[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(" "),ht=e=>i.createTemplateLiteralType(jo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?ko:Lo))),xt=ht(["M","P"]),Ge=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),qe=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Ge(o,e[o],t)),[]),Tt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),gr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),bt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),St=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],j.default.NodeFlags.Const),Ot=(e,t)=>i.createTypeAliasDeclaration(oe,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Ve=(e,t)=>i.createTypeAliasDeclaration(oe,e,void 0,t),hr=(e,t,r)=>i.createPropertyDeclaration(zo,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)]),At=(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(Do,void 0,e.map(r=>Ge(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,qe({acc:void 0,key:void 0}),void 0,void 0,t),r]);var y=D(require("typescript")),Zr=require("zod");var B=D(require("typescript")),{factory:We}=B.default,Pt=(e,t)=>{B.default.addSyntheticLeadingComment(e,B.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ye=(e,t,r)=>{let o=We.createTypeAliasDeclaration(void 0,We.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)?We.createIdentifier(e):We.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&&Re(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 Je=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=Ye(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=ve,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){te({routing:t,onEndpoint:(l,S,Z)=>{let ge=H(S,Z,"input"),Xe=H(S,Z,"response"),N={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},he=l.getSchema("input"),et=Zt({...N,schema:ae(he)?v.create().buffer():he,isResponse:!1}),xe=Zt({...N,isResponse:!0,schema:l.getSchema("positive").or(l.getSchema("negative"))});this.agg.push(Ye(et,ge),Ye(xe,Xe)),Z!=="options"&&(this.paths.push(S),this.registry[`${Z} ${S}`]={in:ge,out:Xe,isJson:l.getMimeTypes("positive").includes(W),tags:l.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Ot("Path",this.paths),a=Ot("Method",Kt),p=Ve("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(l=>bt(l,this.registry[l].in))),u=At("Response",d,Object.keys(this.registry).map(l=>bt(l,this.registry[l].out)));if(this.agg.push(s,a,p,c,u),r==="types")return;let g=i.createVariableStatement(oe,St("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(l=>this.registry[l].isJson).map(l=>i.createPropertyAssignment(`"${l}"`,i.createTrue()))))),m=i.createVariableStatement(oe,St("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(l=>i.createPropertyAssignment(`"${l}"`,i.createArrayLiteralExpression(this.registry[l].tags.map(S=>i.createStringLiteral(S)))))))),h=Ve("Provider",i.createFunctionTypeNode(Sr({M:a.name,P:s.name}),qe({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),xt)}),Tr(u.name,xt))),x=Ve("Implementation",i.createFunctionTypeNode(void 0,qe({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([Ge("implementation",i.createTypeReferenceNode(x.name),yr)]),[hr("provide",i.createTypeReferenceNode(h.name),Or(["method","path","params"],[i.createIdentifier("method"),Rt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[T,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Rt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[T]),_.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);_.default.addSyntheticLeadingComment(P,_.default.SyntaxKind.MultiLineCommentTrivia,`
23
23
  export const exampleImplementation: Implementation = async (
24
24
  method,
25
25
  path,
@@ -40,6 +40,6 @@ export const exampleImplementation: Implementation = async (
40
40
 
41
41
  const client = new ExpressZodAPIClient(exampleImplementation);
42
42
  client.provide("get", "/v1/user/retrieve", { id: "10" });
43
- `,!0),this.agg.push(g,l,h,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 Et={};wt(Et,{dateIn:()=>mn,dateOut:()=>un,file:()=>cn,raw:()=>fn,upload:()=>ln});var Er=require("zod");var E=require("zod");var dn="ZodDateOut",Qe=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=Fe.create,un=Qe.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,createLogger,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
- var br=Object.defineProperty;var Ot=(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 Or=(e,t)=>{for(var r in t)br(e,r,{get:t[r],enumerable:!0})};function Sr(e){return e}import{z as U}from"zod";import{isHttpError as kr}from"http-errors";import{createHash as Lr}from"crypto";import{z as A}from"zod";import{INVALID as St,ZodIssueCode as $e,ZodParsedType as Oe,ZodType as Ar,addIssueToContext as Be}from"zod";var Rr="ZodFile",Pr=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,E=class e extends Ar{_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}),St;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"}),St):(n&&this.isBase64&&!Pr.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:Rr,type:""})};import{clone as Zr,mergeDeepRight as Er}from"ramda";var R="expressZodApiMeta",Ir=e=>{let t=e.constructor,r=Zr(e._def);return r[R]=r[R]||{examples:[]},new t(r)},M=e=>{let t=Ir(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=M(t);return o._def[R].examples.push(r),o}}}),t},At=e=>R in e._def?typeof e._def[R]=="object"&&e._def[R]!==null:!1,Rt=(e,t)=>{if(!At(e))return;let r=e._def;return t in r[R]?r[R][t]:void 0},Se=(e,t)=>{if(!At(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(Er({...n},{...s}));return r};var F="application/json",le="multipart/form-data",Pt="application/octet-stream";import{INVALID as Cr,OK as wr,ZodIssueCode as Nr,ZodParsedType as vr,ZodType as Mr,addIssueToContext as zr}from"zod";var Dr="ZodUpload",jr=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 Mr{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==vr.object||!jr(r.data)?(zr(r,{code:Nr.custom,message:`Expected file upload, received ${r.parsedType}`}),Cr):wr(r.data)}static create=()=>new e({typeName:Dr})};var Ur=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"]},Hr=["body","query","params"],_e=e=>e.method.toLowerCase(),Ge=e=>e.startsWith("x-"),Kr=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=Hr;return r in Ae&&(o=Ae[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Ur(e):!0).reduce((n,s)=>({...n,...s==="headers"?Kr(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=>kr(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 Ot=(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 At,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}),At;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"}),At):(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,...pe(t),type:""});buffer=t=>new e({...this._def,...pe(t),type:Buffer.from([])});binary=t=>new e({...this._def,...pe(t),encoding:"binary"});base64=t=>new e({...this._def,...pe(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},Rt=e=>P in e._def?typeof e._def[P]=="object"&&e._def[P]!==null:!1,Pt=(e,t)=>{if(!Rt(e))return;let r=e._def;return t in r[P]?r[P][t]:void 0},Oe=(e,t)=>{if(!Rt(e))return t;let r=M(t),o=de(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",ce="multipart/form-data",Zt="application/octet-stream";import{INVALID as Ir,OK as wr,ZodIssueCode as Cr,ZodParsedType as Nr,ZodType as vr,addIssueToContext as Mr}from"zod";var Dr="ZodUpload",zr=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",Y=class e extends vr{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==Nr.object||!zr(r.data)?(Mr(r,{code:Cr.custom,message:`Expected file upload, received ${r.parsedType}`}),Ir):wr(r.data)}static create=()=>new e({typeName:Dr})};var Lr=e=>{let r=(e.header("content-type")||"").slice(0,ce.length).toLowerCase()===ce;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,{}),Et=(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}`),z=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=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 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},Et=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=>Lr("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"},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}},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 C}from"zod";var oe={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(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 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},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 l={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#n={input:Et(r)?[le]:Q(r)?[Pt]:[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?oe.positive:l.positive.statusCode||oe.positive,negative:l.negative instanceof U.ZodType?oe.negative:l.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)=>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)})}},Fr=new ye(fe),$r=new ye(Ye);import{inspect as Br}from"util";var se=async(e,t="default")=>{try{return(await import(e))[t]}catch{}try{return await Promise.resolve().then(()=>Ot(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"&&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=l=>{let{[Symbol.for("level")]:h,[Symbol.for("message")]:x,[Symbol.for("splat")]:T,...S}=l;return Br(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 _r from"express";var he=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,_r.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=()=>`
3
+ `,{url:t.url,payload:r})},j=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=Pt(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},de=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}},le=e=>e.reduce((t,r)=>t||r,!1),D=e=>e instanceof R.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof R.ZodUnion?le(e.options.map(D)):e instanceof R.ZodIntersection?le([e._def.left,e._def.right].map(D)):!1,w=({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?le(Object.values(e.shape).map(s=>w({subject:s,...n}))):e instanceof R.ZodUnion?le(e.options.map(s=>w({subject:s,...n}))):e instanceof R.ZodIntersection?le([e._def.left,e._def.right].map(s=>w({subject:s,...n}))):e instanceof R.ZodOptional||e instanceof R.ZodNullable?w({subject:e.unwrap(),...n}):e instanceof R.ZodEffects||e instanceof R.ZodTransformer?w({subject:e.innerType(),...n}):e instanceof R.ZodRecord?w({subject:e.valueSchema,...n}):e instanceof R.ZodArray?w({subject:e.element,...n}):e instanceof R.ZodDefault?w({subject:e._def.innerType,...n}):!1},It=e=>w({subject:e,condition:t=>t instanceof Y}),Q=e=>w({subject:e,condition:t=>t instanceof I,maxDepth:3}),me=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,N=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),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}},pe=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(z(t)),this.originalError=t}},k=class extends L{name="InputValidationError";originalError;constructor(t){super(z(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 wt=e=>typeof e=="object"&&e!==null,B=e=>wt(e)&&"or"in e,_=e=>wt(e)&&"and"in e,Ie=e=>({and:e.reduce((t,r)=>t.concat(_(r)?r.and:r),[])}),we=(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=de(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}=de(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 C}from"zod";var oe={positive:200,negative:400},We=e=>e,ue=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:z(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:z(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(z(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")}}),Ce=({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(D(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:It(r)?[ce]:Q(r)?[Zt]:[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){Ce({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=Et(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 Nt=["get","post","put","delete","patch"];import{z as Mt}from"zod";var vt=(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(D(e.input))throw new L("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var fe=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:Mt.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:Mt.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:vt(d,t)})}},Kr=new fe(ue),Fr=new fe(Ye);import{inspect as $r}from"util";var Dt=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),Qe=({winston:{createLogger:e,transports:t,format:{printf:r,timestamp:o,colorize:n,combine:s},config:{npm:a}},...p})=>{let d=m=>{let{[Symbol.for("level")]:h,[Symbol.for("message")]:x,[Symbol.for("splat")]:T,...O}=m;return $r(O,!1,1,p.color)},c=m=>r(({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=[o()],g={handleExceptions:!0};switch(p.color&&u.push(n()),p.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=s(...u),e({silent:p.level==="silent",levels:a.levels,transports:[new t.Console(g)],exitOnError:!1})};var ye=class{constructor(t){this.endpoints=t}};import Br from"express";var ge=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 ge)r&&a.apply(p,r);else if(a instanceof ye){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 zt=()=>`
6
6
  \x1B[94m\x1B[39m
7
7
  \x1B[94m\x1B[39m
8
8
  \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
@@ -19,7 +19,7 @@ Original error: ${e.originalError.message}.`:""))};var 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(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 Gr from"http";import Lt from"https";import Ut from"http-errors";var qr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:Ut(400,J(r).message),request:o,response:n,logger:t,input:null,output:null})},Vr=(e,t)=>(r,o)=>{let n=Ut(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)})}},Ht=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 Ht(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 p=await se("compression");r.use(p(typeof e.server.compression=="object"?e.server.compression:void 0))}if(r.use(e.server.jsonParser||kt.json()),e.server.upload){let p=await se("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 Ht(e);r.use(qr(n,o)),Qe({app:r,routing:t,logger:o,config:e}),r.use(s);let a={httpServer:Gr.createServer(r),httpsServer:e.https?Lt.createServer(e.https.options,r):void 0};for(let p of Object.values(a)){let d=p instanceof Lt.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 Uo}from"openapi3-ts/oas30";import{isReferenceObject as _t,isSchemaObject as be}from"openapi3-ts/oas30";import{omit as Te}from"ramda";import{z as b}from"zod";import{INVALID as Kt,ZodIssueCode as Xe,ZodParsedType as Ft,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!==Ft.string)return et(o,{code:Xe.invalid_type,expected:Ft.string,received:o.parsedType}),Kt;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}),Kt)}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 $t=50,Gt="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:[]},qt=/:([A-Za-z0-9_]+)/g,Vt=e=>{let t=e.match(qt);return t?t.map(r=>r.slice(1)):[]},Wt=e=>e.replace(qt,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 P({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()})}),Bt=({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 b.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 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:Gt}}},go=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:Gt}}},ho=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})},xo=()=>({type:"boolean"}),To=()=>({type:"integer",format:"bigint"}),bo=e=>e.reduce((t,r)=>t&&r instanceof b.ZodLiteral,!0),Oo=({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&&bo(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})}},So=({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 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}`}}},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:b.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}))))()},Yt=(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 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)},Jt=({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=Vt(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,...No(c,!1,m)}})},ot={ZodString:Ro,ZodNumber:Po,ZodBigInt:To,ZodBoolean:xo,ZodDateIn:yo,ZodDateOut:go,ZodNull:fo,ZodArray:So,ZodTuple:Ao,ZodRecord:Oo,ZodObject:uo,ZodLiteral:mo,ZodIntersection:ao,ZodUnion:so,ZodFile:no,ZodUpload:oo,ZodAny:ro,ZodDefault:eo,ZodEnum:Bt,ZodNativeEnum:Bt,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(_t(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(_t(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})},Qt=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=Qt(q({schema:c,isResponse:!0,rules:ot,onEach:nt,onMissing:st,serializer:n,getRef:s,makeRef:a,path:t,method:e})),l=Yt(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}}),{})}},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}}},{})}),Xt=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]})},er=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=Vt(t),c=r.getSchema("input"),u=Qt(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=Yt(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}}),{})}},tr=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<=$t?e:e.slice(0,$t-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 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=Jt({...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=er(S));let ae=ze(Ce(Xt(l.getSecurity()),pe=>{let bt=this.ensureUniqSecuritySchemaName(pe),Tr=["oauth2","openIdConnect"].includes(pe.type)?l.getScopes():[];return this.addSecurityScheme(bt,pe),{name:bt,scopes:Tr}}));ae.length>0&&(Z.security=ae);let Fe=Wt(h);this.addPath(Fe,{[T]:Z})}}),this.rootDoc.tags=r.tags?tr(r.tags):[]}};import rr 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:rr.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=rr.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)],or=[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)]),nr=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),sr=(e,t,r)=>i.createPropertyDeclaration(Bo,e,void 0,t,r),ir=(e,t,r=[])=>i.createClassDeclaration(V,e,void 0,void 0,[t,...r]),ar=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),pr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(v.SyntaxKind.AnyKeyword)]),yt=(e,t,r)=>i.createInterfaceDeclaration(V,e,void 0,t,r),dr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),cr=(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},lr=(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_$]*$/,mr=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,mr(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)))),ur=({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:ur,ZodFile:hn,ZodAny:W(y.SyntaxKind.AnyKeyword),ZodDefault:cn,ZodEnum:en,ZodNativeEnum:on,ZodEffects:rn,ZodOptional:nn,ZodNullable:sn,ZodDiscriminatedUnion:ur,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:(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(dr({M:a.name,P:s.name}),je({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),ct)}),ar(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)}),pr())),T=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),S=ir("ExpressZodAPIClient",nr([De("implementation",i.createTypeReferenceNode(x.name),or)]),[sr("provide",i.createTypeReferenceNode(h.name),cr(["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 Xe=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(zt()),G({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(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";var he=async(e,t="default")=>{try{return(await import(e))[t]}catch{}try{return await Promise.resolve().then(()=>Ot(e)[t])}catch{}throw new te(e)},jt=async e=>{for(let{moduleName:t,moduleExport:r}of e)try{return await he(t,r)}catch{}throw new te(e.map(({moduleName:t})=>t))};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){Ce({response:o,logger:t,error:new ee(J(s).message,n)})}},Ut=async e=>{let t=Dt(e.logger)?Qe({...e.logger,winston:await he("winston")}):e.logger,r=e.errorHandler||ue,o=Vr(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Wr=async(e,t)=>{let{logger:r,notFoundHandler:o}=await Ut(e);return Xe({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 he("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 he("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)),Xe({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 et,ZodParsedType as Kt,ZodType as Jr,addIssueToContext as tt}from"zod";var rt=/^\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 tt(o,{code:et.invalid_type,expected:Kt.string,received:o.parsedType}),Ht;rt.test(o.data)||(tt(o,{code:et.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Re(n)?{status:r.value,value:n}:(tt(o,{code:et.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&&me(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:rt.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"]}),wo=({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}}),{})}},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(D(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:nt,onEach:st,onMissing:it,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)}})},nt={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:wo,ZodDate:ho,ZodCatch:to,ZodPipeline:Io,ZodLazy:Co,ZodReadonly:co},st=({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&&me(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]}}},it=({schema:e,...t})=>{throw new Z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},ot=(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=>ot(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>ot(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,at=({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:nt,onEach:st,onMissing:it,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}}),Do=({name:e})=>({type:"apiKey",in:"query",name:e}),zo=({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:Do,header:zo,cookie:jo,openid:ko,oauth2:Lo};return we(e,r=>t[r.type](r))},De=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return De(Ve(e))}return De({or:[e]})},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(ot(q({schema:Q(c)?I.create().buffer():c,isResponse:!1,rules:nt,onEach:st,onMissing:it,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}}}}),pt=e=>e.length<=Ft?e:e.slice(0,Ft-1)+"\u2026";var dt=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],se=Yt({...O,inputSources:A}),E={operationId:this.ensureUniqOperationId(h,T,m.getOperationId(T)),responses:{[m.getStatusCode("positive")]:at({...O,clue:a,isPositive:!0}),[m.getStatusCode("negative")]:at({...O,clue:p,isPositive:!1})}};b&&(E.description=b,d&&l===void 0&&(E.summary=pt(b))),l&&(E.summary=pt(l)),m.getTags().length>0&&(E.tags=m.getTags()),se.length>0&&(E.parameters=se),A.includes("body")&&(E.requestBody=Xt(O));let ie=De(we(Qt(m.getSecurity()),ae=>{let St=this.ensureUniqSecuritySchemaName(ae),xr=["oauth2","openIdConnect"].includes(ae.type)?m.getScopes():[];return this.addSecurityScheme(St,ae),{name:St,scopes:xr}}));ie.length>0&&(E.security=ie);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 jt([{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(" "),ct=e=>i.createTemplateLiteralType(_o,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Go:qo))),lt=ct(["M","P"]),ze=(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(ze(o,e[o],t)),[]),mt=(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([])),ut=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),ft=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],v.NodeFlags.Const),yt=(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)]),gt=(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=>ze(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),ht=(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,xt=(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&&xt(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&&me(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&&xt(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},Tt=({schema:e,...t})=>q({schema:e,rules:xn,onMissing:()=>f.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),...t});var bt=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 se=N(b,A,"input"),Ke=N(b,A,"response"),E={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},ie=l.getSchema("input"),Fe=Tt({...E,schema:Q(ie)?I.create().buffer():ie,isResponse:!1}),ae=Tt({...E,isResponse:!0,schema:l.getSchema("positive").or(l.getSchema("negative"))});this.agg.push(Ue(Fe,se),Ue(ae,Ke)),A!=="options"&&(this.paths.push(b),this.registry[`${A} ${b}`]={in:se,out:Ke,isJson:l.getMimeTypes("positive").includes(F),tags:l.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=yt("Path",this.paths),a=yt("Method",Nt),p=ke("MethodPath",ct([a.name,s.name])),d=[i.createHeritageClause(K.SyntaxKind.ExtendsKeyword,[mt(p.name,K.SyntaxKind.AnyKeyword)])],c=gt("Input",d,Object.keys(this.registry).map(l=>ut(l,this.registry[l].in))),u=gt("Response",d,Object.keys(this.registry).map(l=>ut(l,this.registry[l].out)));if(this.agg.push(s,a,p,c,u),r==="types")return;let g=i.createVariableStatement(V,ft("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(l=>this.registry[l].isJson).map(l=>i.createPropertyAssignment(`"${l}"`,i.createTrue()))))),m=i.createVariableStatement(V,ft("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),lt)}),ir(u.name,lt))),x=ke("Implementation",i.createFunctionTypeNode(void 0,je({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(K.SyntaxKind.StringKeyword),params:mt(K.SyntaxKind.StringKeyword,K.SyntaxKind.AnyKeyword)}),ar())),T=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),O=sr("ExpressZodAPIClient",or([ze("implementation",i.createTypeReferenceNode(x.name),rr)]),[nr("provide",i.createTypeReferenceNode(h.name),dr(["method","path","params"],[i.createIdentifier("method"),ht("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[T,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),ht("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=>lr(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 xr={};Or(xr,{dateIn:()=>Rn,dateOut:()=>Pn,file:()=>Sn,raw:()=>Zn,upload:()=>An});import{z as On}from"zod";import{INVALID as fr,ZodIssueCode as yr,ZodParsedType as gr,ZodType as Tn,addIssueToContext as hr}from"zod";var bn="ZodDateOut",He=class e extends Tn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==gr.date?(hr(o,{code:yr.invalid_type,expected:gr.date,received:o.parsedType}),fr):Re(o.data)?{status:r.value,value:o.data.toISOString()}:(hr(o,{code:yr.invalid_date}),fr)}static create=()=>new e({typeName:bn})};var Sn=E.create,An=Y.create,Rn=ve.create,Pn=He.create,Zn=()=>On.object({raw:E.create().buffer()});export{ne as AbstractEndpoint,ge as DependsOnMethod,pt as Documentation,P as DocumentationError,ye as EndpointsFactory,k as InputValidationError,Tt as Integration,te as MissingPeerError,$ as OutputValidationError,X as RoutingError,he as ServeStatic,$r as arrayEndpointsFactory,Ye as arrayResultHandler,Wr as attachRouting,Sr as createConfig,Je as createMiddleware,We as createResultHandler,Yr as createServer,Fr as defaultEndpointsFactory,fe as defaultResultHandler,xr as ez,j as getExamples,D as getMessageFromError,Pe as getStatusCodeFromError,Fo 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,ye as DependsOnMethod,dt as Documentation,Z as DocumentationError,fe as EndpointsFactory,k as InputValidationError,bt as Integration,te as MissingPeerError,$ as OutputValidationError,X as RoutingError,ge as ServeStatic,Fr as arrayEndpointsFactory,Ye as arrayResultHandler,Wr as attachRouting,Sr as createConfig,Qe as createLogger,Je as createMiddleware,We as createResultHandler,Yr as createServer,Kr as defaultEndpointsFactory,ue as defaultResultHandler,hr as ez,j as getExamples,z 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-beta4",
3
+ "version": "15.0.0-beta6",
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",