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 +41 -22
- package/README.md +11 -10
- package/SECURITY.md +1 -1
- package/dist/index.d.mts +18 -5
- package/dist/index.d.ts +18 -5
- package/dist/index.js +7 -7
- package/dist/index.mjs +7 -7
- package/package.json +17 -17
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 `
|
|
11
|
-
- Method `createLogger()` removed as redundant;
|
|
10
|
+
- Method `createLogger()` requires an additional argument;
|
|
12
11
|
- Read the migration guide below.
|
|
13
12
|
- Features:
|
|
14
|
-
-
|
|
15
|
-
|
|
16
|
-
- Supporting
|
|
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
|
-
-
|
|
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
|
|
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
|
|
34
|
-
|
|
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
|
|
38
|
-
import { createConfig,
|
|
36
|
+
import winston from "winston";
|
|
37
|
+
import { createConfig, createLogger, createServer } from "express-zod-api";
|
|
39
38
|
|
|
40
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
|
|
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:
|
|
64
|
-
|
|
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
|
-
-
|
|
89
|
-
-
|
|
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
|
|
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#
|
|
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
|
|
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
|
-
|
|
812
|
-
|
|
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
|
|
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
|
-
|
|
812
|
-
|
|
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
|
|
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},
|
|
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,
|
|
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
|
|
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,
|
|
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={};
|
|
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
|
|
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=
|
|
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(
|
|
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(
|
|
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,
|
|
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
|
|
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-
|
|
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",
|