express-zod-api 25.5.3 → 25.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/README.md +55 -55
- package/dist/index.d.ts +57 -52
- package/dist/index.js +4 -4
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
## Version 25
|
|
4
4
|
|
|
5
|
+
### v25.6.1
|
|
6
|
+
|
|
7
|
+
- Technical update before v26: no significant changes.
|
|
8
|
+
|
|
9
|
+
### v25.6.0
|
|
10
|
+
|
|
11
|
+
- Added `afterRouting` hook to server configuration:
|
|
12
|
+
- Similar to `beforeRouting` one;
|
|
13
|
+
- A code to execute after processing the Routing of your API, but before error handling.
|
|
14
|
+
|
|
5
15
|
### v25.5.3
|
|
6
16
|
|
|
7
17
|
- Updated environment requirements in the Readme:
|
package/README.md
CHANGED
|
@@ -86,61 +86,61 @@ Therefore, many basic tasks can be accomplished faster and easier, in particular
|
|
|
86
86
|
|
|
87
87
|
These people contributed to the improvement of the framework by reporting bugs, making changes and suggesting ideas:
|
|
88
88
|
|
|
89
|
-
[<img src="https://github.com/squishykid.png" alt="@squishykid" width="
|
|
90
|
-
[<img src="https://github.com/jakub-msqt.png" alt="@jakub-msqt" width="
|
|
91
|
-
[<img src="https://github.com/misha-z1nchuk.png" alt="@misha-z1nchuk" width="
|
|
92
|
-
[<img src="https://github.com/GreaterTamarack.png" alt="@GreaterTamarack" width="
|
|
93
|
-
[<img src="https://github.com/pepegc.png" alt="@pepegc" width="
|
|
94
|
-
[<img src="https://github.com/MichaelHindley.png" alt="@MichaelHindley" width="
|
|
95
|
-
[<img src="https://github.com/zoton2.png" alt="@zoton2" width="
|
|
96
|
-
[<img src="https://github.com/ThomasKientz.png" alt="@ThomasKientz" width="
|
|
97
|
-
[<img src="https://github.com/james10424.png" alt="@james10424" width="
|
|
98
|
-
[<img src="https://github.com/HeikoOsigus.png" alt="@HeikoOsigus" width="
|
|
99
|
-
[<img src="https://github.com/crgeary.png" alt="@crgeary" width="
|
|
100
|
-
[<img src="https://github.com/williamgcampbell.png" alt="@williamgcampbell" width="
|
|
101
|
-
[<img src="https://github.com/gmorgen1.png" alt="@gmorgen1" width="
|
|
102
|
-
[<img src="https://github.com/danmichaelo.png" alt="@danmichaelo" width="
|
|
103
|
-
[<img src="https://github.com/APTy.png" alt="@APTy" width="
|
|
104
|
-
[<img src="https://github.com/LufyCZ.png" alt="@LufyCZ" width="
|
|
105
|
-
[<img src="https://github.com/mlms13.png" alt="@mlms13" width="
|
|
106
|
-
[<img src="https://github.com/bobgubko.png" alt="@bobgubko" width="
|
|
107
|
-
[<img src="https://github.com/LucWag.png" alt="@LucWag" width="
|
|
108
|
-
[<img src="https://github.com/HenriJ.png" alt="@HenriJ" width="
|
|
109
|
-
[<img src="https://github.com/JonParton.png" alt="@JonParton" width="
|
|
110
|
-
[<img src="https://github.com/t1nky.png" alt="@t1nky" width="
|
|
111
|
-
[<img src="https://github.com/Tomtec331.png" alt="@Tomtec331" width="
|
|
112
|
-
[<img src="https://github.com/rottmann.png" alt="@rottmann" width="
|
|
113
|
-
[<img src="https://github.com/boarush.png" alt="@boarush" width="
|
|
114
|
-
[<img src="https://github.com/shawncarr.png" alt="@shawncarr" width="
|
|
115
|
-
[<img src="https://github.com/ben-xD.png" alt="@ben-xD" width="
|
|
116
|
-
[<img src="https://github.com/daniel-white.png" alt="@daniel-white" width="
|
|
117
|
-
[<img src="https://github.com/kotsmile.png" alt="@kotsmile" width="
|
|
118
|
-
[<img src="https://github.com/arlyon.png" alt="@arlyon" width="
|
|
119
|
-
[<img src="https://github.com/elee1766.png" alt="@elee1766" width="
|
|
120
|
-
[<img src="https://github.com/danclaytondev.png" alt="@danclaytondev" width="
|
|
121
|
-
[<img src="https://github.com/huyhoang160593.png" alt="@huyhoang160593" width="
|
|
122
|
-
[<img src="https://github.com/sarahssharkey.png" alt="@sarahssharkey" width="
|
|
123
|
-
[<img src="https://github.com/master-chu.png" alt="@master-chu" width="
|
|
124
|
-
[<img src="https://github.com/alindsay55661.png" alt="@alindsay55661" width="
|
|
125
|
-
[<img src="https://github.com/john-schmitz.png" alt="@john-schmitz" width="
|
|
126
|
-
[<img src="https://github.com/miki725.png" alt="@miki725" width="
|
|
127
|
-
[<img src="https://github.com/dev-m1-macbook.png" alt="@dev-m1-macbook" width="
|
|
128
|
-
[<img src="https://github.com/McMerph.png" alt="@McMerph" width="
|
|
129
|
-
[<img src="https://github.com/niklashigi.png" alt="@niklashigi" width="
|
|
130
|
-
[<img src="https://github.com/maxcohn.png" alt="@maxcohn" width="
|
|
131
|
-
[<img src="https://github.com/VideoSystemsTech.png" alt="@VideoSystemsTech" width="
|
|
132
|
-
[<img src="https://github.com/TheWisestOne.png" alt="@TheWisestOne" width="
|
|
133
|
-
[<img src="https://github.com/lazylace37.png" alt="@lazylace37" width="
|
|
134
|
-
[<img src="https://github.com/leosuncin.png" alt="@leosuncin" width="
|
|
135
|
-
[<img src="https://github.com/kirdk.png" alt="@kirdk" width="
|
|
136
|
-
[<img src="https://github.com/johngeorgewright.png" alt="@johngeorgewright" width="
|
|
137
|
-
[<img src="https://github.com/ssteuteville.png" alt="@ssteuteville" width="
|
|
138
|
-
[<img src="https://github.com/foxfirecodes.png" alt="@foxfirecodes" width="
|
|
139
|
-
[<img src="https://github.com/HardCoreQual.png" alt="@HardCoreQual" width="
|
|
140
|
-
[<img src="https://github.com/hellovai.png" alt="@hellovai" width="
|
|
141
|
-
[<img src="https://github.com/Isaac-Leonard.png" alt="@Isaac-Leonard" width="
|
|
142
|
-
[<img src="https://github.com/digimuza.png" alt="@digimuza" width="
|
|
143
|
-
[<img src="https://github.com/glitch452.png" alt="@glitch452" width="
|
|
89
|
+
[<img src="https://github.com/squishykid.png" alt="@squishykid" width="50" />](https://github.com/squishykid)
|
|
90
|
+
[<img src="https://github.com/jakub-msqt.png" alt="@jakub-msqt" width="50" />](https://github.com/jakub-msqt)
|
|
91
|
+
[<img src="https://github.com/misha-z1nchuk.png" alt="@misha-z1nchuk" width="50" />](https://github.com/misha-z1nchuk)
|
|
92
|
+
[<img src="https://github.com/GreaterTamarack.png" alt="@GreaterTamarack" width="50" />](https://github.com/GreaterTamarack)
|
|
93
|
+
[<img src="https://github.com/pepegc.png" alt="@pepegc" width="50" />](https://github.com/pepegc)
|
|
94
|
+
[<img src="https://github.com/MichaelHindley.png" alt="@MichaelHindley" width="50" />](https://github.com/MichaelHindley)
|
|
95
|
+
[<img src="https://github.com/zoton2.png" alt="@zoton2" width="50" />](https://github.com/zoton2)
|
|
96
|
+
[<img src="https://github.com/ThomasKientz.png" alt="@ThomasKientz" width="50" />](https://github.com/ThomasKientz)
|
|
97
|
+
[<img src="https://github.com/james10424.png" alt="@james10424" width="50" />](https://github.com/james10424)
|
|
98
|
+
[<img src="https://github.com/HeikoOsigus.png" alt="@HeikoOsigus" width="50" />](https://github.com/HeikoOsigus)
|
|
99
|
+
[<img src="https://github.com/crgeary.png" alt="@crgeary" width="50" />](https://github.com/crgeary)
|
|
100
|
+
[<img src="https://github.com/williamgcampbell.png" alt="@williamgcampbell" width="50" />](https://github.com/williamgcampbell)
|
|
101
|
+
[<img src="https://github.com/gmorgen1.png" alt="@gmorgen1" width="50" />](https://github.com/gmorgen1)
|
|
102
|
+
[<img src="https://github.com/danmichaelo.png" alt="@danmichaelo" width="50" />](https://github.com/danmichaelo)
|
|
103
|
+
[<img src="https://github.com/APTy.png" alt="@APTy" width="50" />](https://github.com/APTy)
|
|
104
|
+
[<img src="https://github.com/LufyCZ.png" alt="@LufyCZ" width="50" />](https://github.com/LufyCZ)
|
|
105
|
+
[<img src="https://github.com/mlms13.png" alt="@mlms13" width="50" />](https://github.com/mlms13)
|
|
106
|
+
[<img src="https://github.com/bobgubko.png" alt="@bobgubko" width="50" />](https://github.com/bobgubko)
|
|
107
|
+
[<img src="https://github.com/LucWag.png" alt="@LucWag" width="50" />](https://github.com/LucWag)
|
|
108
|
+
[<img src="https://github.com/HenriJ.png" alt="@HenriJ" width="50" />](https://github.com/HenriJ)
|
|
109
|
+
[<img src="https://github.com/JonParton.png" alt="@JonParton" width="50" />](https://github.com/JonParton)
|
|
110
|
+
[<img src="https://github.com/t1nky.png" alt="@t1nky" width="50" />](https://github.com/t1nky)
|
|
111
|
+
[<img src="https://github.com/Tomtec331.png" alt="@Tomtec331" width="50" />](https://github.com/Tomtec331)
|
|
112
|
+
[<img src="https://github.com/rottmann.png" alt="@rottmann" width="50" />](https://github.com/rottmann)
|
|
113
|
+
[<img src="https://github.com/boarush.png" alt="@boarush" width="50" />](https://github.com/boarush)
|
|
114
|
+
[<img src="https://github.com/shawncarr.png" alt="@shawncarr" width="50" />](https://github.com/shawncarr)
|
|
115
|
+
[<img src="https://github.com/ben-xD.png" alt="@ben-xD" width="50" />](https://github.com/ben-xD)
|
|
116
|
+
[<img src="https://github.com/daniel-white.png" alt="@daniel-white" width="50" />](https://github.com/daniel-white)
|
|
117
|
+
[<img src="https://github.com/kotsmile.png" alt="@kotsmile" width="50" />](https://github.com/kotsmile)
|
|
118
|
+
[<img src="https://github.com/arlyon.png" alt="@arlyon" width="50" />](https://github.com/arlyon)
|
|
119
|
+
[<img src="https://github.com/elee1766.png" alt="@elee1766" width="50" />](https://github.com/elee1766)
|
|
120
|
+
[<img src="https://github.com/danclaytondev.png" alt="@danclaytondev" width="50" />](https://github.com/danclaytondev)
|
|
121
|
+
[<img src="https://github.com/huyhoang160593.png" alt="@huyhoang160593" width="50" />](https://github.com/huyhoang160593)
|
|
122
|
+
[<img src="https://github.com/sarahssharkey.png" alt="@sarahssharkey" width="50" />](https://github.com/sarahssharkey)
|
|
123
|
+
[<img src="https://github.com/master-chu.png" alt="@master-chu" width="50" />](https://github.com/master-chu)
|
|
124
|
+
[<img src="https://github.com/alindsay55661.png" alt="@alindsay55661" width="50" />](https://github.com/alindsay55661)
|
|
125
|
+
[<img src="https://github.com/john-schmitz.png" alt="@john-schmitz" width="50" />](https://github.com/john-schmitz)
|
|
126
|
+
[<img src="https://github.com/miki725.png" alt="@miki725" width="50" />](https://github.com/miki725)
|
|
127
|
+
[<img src="https://github.com/dev-m1-macbook.png" alt="@dev-m1-macbook" width="50" />](https://github.com/dev-m1-macbook)
|
|
128
|
+
[<img src="https://github.com/McMerph.png" alt="@McMerph" width="50" />](https://github.com/McMerph)
|
|
129
|
+
[<img src="https://github.com/niklashigi.png" alt="@niklashigi" width="50" />](https://github.com/niklashigi)
|
|
130
|
+
[<img src="https://github.com/maxcohn.png" alt="@maxcohn" width="50" />](https://github.com/maxcohn)
|
|
131
|
+
[<img src="https://github.com/VideoSystemsTech.png" alt="@VideoSystemsTech" width="50" />](https://github.com/VideoSystemsTech)
|
|
132
|
+
[<img src="https://github.com/TheWisestOne.png" alt="@TheWisestOne" width="50" />](https://github.com/TheWisestOne)
|
|
133
|
+
[<img src="https://github.com/lazylace37.png" alt="@lazylace37" width="50" />](https://github.com/lazylace37)
|
|
134
|
+
[<img src="https://github.com/leosuncin.png" alt="@leosuncin" width="50" />](https://github.com/leosuncin)
|
|
135
|
+
[<img src="https://github.com/kirdk.png" alt="@kirdk" width="50" />](https://github.com/kirdk)
|
|
136
|
+
[<img src="https://github.com/johngeorgewright.png" alt="@johngeorgewright" width="50" />](https://github.com/johngeorgewright)
|
|
137
|
+
[<img src="https://github.com/ssteuteville.png" alt="@ssteuteville" width="50" />](https://github.com/ssteuteville)
|
|
138
|
+
[<img src="https://github.com/foxfirecodes.png" alt="@foxfirecodes" width="50" />](https://github.com/foxfirecodes)
|
|
139
|
+
[<img src="https://github.com/HardCoreQual.png" alt="@HardCoreQual" width="50" />](https://github.com/HardCoreQual)
|
|
140
|
+
[<img src="https://github.com/hellovai.png" alt="@hellovai" width="50" />](https://github.com/hellovai)
|
|
141
|
+
[<img src="https://github.com/Isaac-Leonard.png" alt="@Isaac-Leonard" width="50" />](https://github.com/Isaac-Leonard)
|
|
142
|
+
[<img src="https://github.com/digimuza.png" alt="@digimuza" width="50" />](https://github.com/digimuza)
|
|
143
|
+
[<img src="https://github.com/glitch452.png" alt="@glitch452" width="50" />](https://github.com/glitch452)
|
|
144
144
|
|
|
145
145
|
# How it works
|
|
146
146
|
|
package/dist/index.d.ts
CHANGED
|
@@ -15,8 +15,8 @@ import compression from "compression";
|
|
|
15
15
|
import * as express_fileupload0 from "express-fileupload";
|
|
16
16
|
import fileUpload from "express-fileupload";
|
|
17
17
|
import { ListenOptions } from "node:net";
|
|
18
|
-
import * as
|
|
19
|
-
import * as
|
|
18
|
+
import * as express_serve_static_core0 from "express-serve-static-core";
|
|
19
|
+
import * as qs0 from "qs";
|
|
20
20
|
import * as zod_v4_core0 from "zod/v4/core";
|
|
21
21
|
|
|
22
22
|
//#region src/method.d.ts
|
|
@@ -37,8 +37,8 @@ type ClientMethod = (typeof clientMethods)[number];
|
|
|
37
37
|
//#endregion
|
|
38
38
|
//#region src/api-response.d.ts
|
|
39
39
|
/** @public this is the user facing configuration */
|
|
40
|
-
interface ApiResponse<S extends z.ZodType> {
|
|
41
|
-
schema: S;
|
|
40
|
+
interface ApiResponse<S$1 extends z.ZodType> {
|
|
41
|
+
schema: S$1;
|
|
42
42
|
/** @default 200 for a positive and 400 for a negative response */
|
|
43
43
|
statusCode?: number | [number, ...number[]];
|
|
44
44
|
/**
|
|
@@ -56,7 +56,7 @@ type EmptySchema = typeof emptySchema;
|
|
|
56
56
|
type EmptyObject = z.output<EmptySchema>;
|
|
57
57
|
type FlatObject = Record<string, unknown>;
|
|
58
58
|
/** @link https://stackoverflow.com/a/65492934 */
|
|
59
|
-
type NoNever<T, F> = [T] extends [never] ? F : T;
|
|
59
|
+
type NoNever<T$1, F> = [T$1] extends [never] ? F : T$1;
|
|
60
60
|
/**
|
|
61
61
|
* @desc Using module augmentation approach you can specify tags as the keys of this interface
|
|
62
62
|
* @example declare module "express-zod-api" { interface TagOverrides { users: unknown } }
|
|
@@ -85,7 +85,7 @@ interface LoggerOverrides {}
|
|
|
85
85
|
type ActualLogger = AbstractLogger & LoggerOverrides;
|
|
86
86
|
//#endregion
|
|
87
87
|
//#region src/builtin-logger.d.ts
|
|
88
|
-
interface Context
|
|
88
|
+
interface Context extends FlatObject {
|
|
89
89
|
requestId?: string;
|
|
90
90
|
}
|
|
91
91
|
interface BuiltinLoggerConfig {
|
|
@@ -106,7 +106,7 @@ interface BuiltinLoggerConfig {
|
|
|
106
106
|
* @desc Context: the metadata applicable for each logged entry, used by .child() method
|
|
107
107
|
* @see childLoggerProvider
|
|
108
108
|
* */
|
|
109
|
-
ctx: Context
|
|
109
|
+
ctx: Context;
|
|
110
110
|
}
|
|
111
111
|
interface ProfilerOptions {
|
|
112
112
|
message: string;
|
|
@@ -131,12 +131,12 @@ declare class BuiltinLogger implements AbstractLogger {
|
|
|
131
131
|
info(message: string, meta?: unknown): void;
|
|
132
132
|
warn(message: string, meta?: unknown): void;
|
|
133
133
|
error(message: string, meta?: unknown): void;
|
|
134
|
-
child(ctx: Context
|
|
134
|
+
child(ctx: Context): BuiltinLogger;
|
|
135
135
|
/**
|
|
136
136
|
* @desc The argument used for instance created by .child() method
|
|
137
137
|
* @see ChildLoggerProvider
|
|
138
138
|
* */
|
|
139
|
-
get ctx(): Context
|
|
139
|
+
get ctx(): Context;
|
|
140
140
|
/** @desc Measures the duration until you invoke the returned callback */
|
|
141
141
|
profile(message: string): () => void;
|
|
142
142
|
profile(options: ProfilerOptions): () => void;
|
|
@@ -154,13 +154,13 @@ type Extension<Current extends IOSchema | undefined, Inc extends IOSchema | unde
|
|
|
154
154
|
type FinalInputSchema<FIN extends IOSchema | undefined, BIN extends IOSchema> = z.ZodIntersection<FIN extends IOSchema ? FIN : BIN, BIN>;
|
|
155
155
|
//#endregion
|
|
156
156
|
//#region src/logical-container.d.ts
|
|
157
|
-
type LogicalOr<T> = {
|
|
158
|
-
or: T[];
|
|
157
|
+
type LogicalOr<T$1> = {
|
|
158
|
+
or: T$1[];
|
|
159
159
|
};
|
|
160
|
-
type LogicalAnd<T> = {
|
|
161
|
-
and: T[];
|
|
160
|
+
type LogicalAnd<T$1> = {
|
|
161
|
+
and: T$1[];
|
|
162
162
|
};
|
|
163
|
-
type LogicalContainer<T> = LogicalOr<T | LogicalAnd<T>> | LogicalAnd<T | LogicalOr<T>> | T;
|
|
163
|
+
type LogicalContainer<T$1> = LogicalOr<T$1 | LogicalAnd<T$1>> | LogicalAnd<T$1 | LogicalOr<T$1>> | T$1;
|
|
164
164
|
//#endregion
|
|
165
165
|
//#region src/security.d.ts
|
|
166
166
|
interface BasicSecurity {
|
|
@@ -170,9 +170,9 @@ interface BearerSecurity {
|
|
|
170
170
|
type: "bearer";
|
|
171
171
|
format?: "JWT" | string;
|
|
172
172
|
}
|
|
173
|
-
interface InputSecurity<K extends string> {
|
|
173
|
+
interface InputSecurity<K$1 extends string> {
|
|
174
174
|
type: "input";
|
|
175
|
-
name: K;
|
|
175
|
+
name: K$1;
|
|
176
176
|
}
|
|
177
177
|
interface HeaderSecurity {
|
|
178
178
|
type: "header";
|
|
@@ -205,28 +205,28 @@ interface RefreshUrl {
|
|
|
205
205
|
/** @desc The URL to be used for obtaining refresh tokens. Can be relative to the API server URL. */
|
|
206
206
|
refreshUrl?: string;
|
|
207
207
|
}
|
|
208
|
-
interface Scopes<K extends string> {
|
|
208
|
+
interface Scopes<K$1 extends string> {
|
|
209
209
|
/** @desc The available scopes for the OAuth2 security and their short descriptions. Optional. */
|
|
210
|
-
scopes?: Record<K, string>;
|
|
210
|
+
scopes?: Record<K$1, string>;
|
|
211
211
|
}
|
|
212
|
-
type AuthCodeFlow<S extends string> = AuthUrl & TokenUrl & RefreshUrl & Scopes<S>;
|
|
213
|
-
type ImplicitFlow<S extends string> = AuthUrl & RefreshUrl & Scopes<S>;
|
|
214
|
-
type PasswordFlow<S extends string> = TokenUrl & RefreshUrl & Scopes<S>;
|
|
215
|
-
type ClientCredFlow<S extends string> = TokenUrl & RefreshUrl & Scopes<S>;
|
|
212
|
+
type AuthCodeFlow<S$1 extends string> = AuthUrl & TokenUrl & RefreshUrl & Scopes<S$1>;
|
|
213
|
+
type ImplicitFlow<S$1 extends string> = AuthUrl & RefreshUrl & Scopes<S$1>;
|
|
214
|
+
type PasswordFlow<S$1 extends string> = TokenUrl & RefreshUrl & Scopes<S$1>;
|
|
215
|
+
type ClientCredFlow<S$1 extends string> = TokenUrl & RefreshUrl & Scopes<S$1>;
|
|
216
216
|
/**
|
|
217
217
|
* @see https://swagger.io/docs/specification/authentication/oauth2/
|
|
218
218
|
*/
|
|
219
|
-
interface OAuth2Security<S extends string> {
|
|
219
|
+
interface OAuth2Security<S$1 extends string> {
|
|
220
220
|
type: "oauth2";
|
|
221
221
|
flows?: {
|
|
222
222
|
/** @desc Authorization Code flow (previously called accessCode in OpenAPI 2.0) */
|
|
223
|
-
authorizationCode?: AuthCodeFlow<S>;
|
|
223
|
+
authorizationCode?: AuthCodeFlow<S$1>;
|
|
224
224
|
/** @desc Implicit flow */
|
|
225
|
-
implicit?: ImplicitFlow<S>;
|
|
225
|
+
implicit?: ImplicitFlow<S$1>;
|
|
226
226
|
/** @desc Resource Owner Password flow */
|
|
227
|
-
password?: PasswordFlow<S>;
|
|
227
|
+
password?: PasswordFlow<S$1>;
|
|
228
228
|
/** @desc Client Credentials flow (previously called application in OpenAPI 2.0) */
|
|
229
|
-
clientCredentials?: ClientCredFlow<S>;
|
|
229
|
+
clientCredentials?: ClientCredFlow<S$1>;
|
|
230
230
|
};
|
|
231
231
|
}
|
|
232
232
|
/**
|
|
@@ -234,7 +234,7 @@ interface OAuth2Security<S extends string> {
|
|
|
234
234
|
* @param K is an optional input field used by InputSecurity
|
|
235
235
|
* @param S is an optional union of scopes used by OAuth2Security
|
|
236
236
|
* */
|
|
237
|
-
type Security<K extends string = string, S extends string = string> = BasicSecurity | BearerSecurity | InputSecurity<K> | HeaderSecurity | CookieSecurity | OpenIdSecurity | OAuth2Security<S>;
|
|
237
|
+
type Security<K$1 extends string = string, S$1 extends string = string> = BasicSecurity | BearerSecurity | InputSecurity<K$1> | HeaderSecurity | CookieSecurity | OpenIdSecurity | OAuth2Security<S$1>;
|
|
238
238
|
//#endregion
|
|
239
239
|
//#region src/middleware.d.ts
|
|
240
240
|
type Handler$2<IN, OPT, OUT> = (params: {
|
|
@@ -291,12 +291,12 @@ declare class Middleware<OPT extends FlatObject, OUT extends FlatObject, SCO ext
|
|
|
291
291
|
logger: ActualLogger;
|
|
292
292
|
}): Promise<OUT>;
|
|
293
293
|
}
|
|
294
|
-
declare class ExpressMiddleware<R extends Request, S extends Response, OUT extends FlatObject> extends Middleware<FlatObject, OUT, string> {
|
|
295
|
-
constructor(nativeMw: (request: R, response: S, next: NextFunction) => any, {
|
|
294
|
+
declare class ExpressMiddleware<R extends Request, S$1 extends Response, OUT extends FlatObject> extends Middleware<FlatObject, OUT, string> {
|
|
295
|
+
constructor(nativeMw: (request: R, response: S$1, next: NextFunction) => any, {
|
|
296
296
|
provider,
|
|
297
297
|
transformer
|
|
298
298
|
}?: {
|
|
299
|
-
provider?: (request: R, response: S) => OUT | Promise<OUT>;
|
|
299
|
+
provider?: (request: R, response: S$1) => OUT | Promise<OUT>;
|
|
300
300
|
transformer?: (err: Error) => Error;
|
|
301
301
|
});
|
|
302
302
|
}
|
|
@@ -340,7 +340,7 @@ type Handler$1<RES = unknown> = (params: DiscriminatedResult & {
|
|
|
340
340
|
response: Response<RES>;
|
|
341
341
|
logger: ActualLogger;
|
|
342
342
|
}) => void | Promise<void>;
|
|
343
|
-
type Result<S extends z.ZodType = z.ZodType> = S | ApiResponse<S> | ApiResponse<S>[];
|
|
343
|
+
type Result<S$1 extends z.ZodType = z.ZodType> = S$1 | ApiResponse<S$1> | ApiResponse<S$1>[];
|
|
344
344
|
type LazyResult<R extends Result, A extends unknown[] = []> = (...args: A) => R;
|
|
345
345
|
declare abstract class AbstractResultHandler {
|
|
346
346
|
#private;
|
|
@@ -547,7 +547,7 @@ interface GracefulOptions {
|
|
|
547
547
|
/** @desc The hook to call after the server was closed, but before terminating the process. */
|
|
548
548
|
beforeExit?: () => void | Promise<void>;
|
|
549
549
|
}
|
|
550
|
-
type
|
|
550
|
+
type ServerHook = (params: {
|
|
551
551
|
app: IRouter;
|
|
552
552
|
/** @desc Returns child logger for the given request (if configured) or the configured logger otherwise */
|
|
553
553
|
getLogger: GetLogger;
|
|
@@ -608,7 +608,12 @@ interface ServerConfig extends CommonConfig {
|
|
|
608
608
|
* @desc It can help to avoid making a DIY solution based on the attachRouting() approach.
|
|
609
609
|
* @example ({ app }) => { app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument)); }
|
|
610
610
|
* */
|
|
611
|
-
beforeRouting?:
|
|
611
|
+
beforeRouting?: ServerHook;
|
|
612
|
+
/**
|
|
613
|
+
* @desc A code to execute after processing the Routing of your API, but before error handling.
|
|
614
|
+
* @see beforeRouting
|
|
615
|
+
* */
|
|
616
|
+
afterRouting?: ServerHook;
|
|
612
617
|
/**
|
|
613
618
|
* @desc Rejects new connections and attempts to finish ongoing ones in the specified time before exit.
|
|
614
619
|
* */
|
|
@@ -665,11 +670,11 @@ declare class EndpointsFactory<IN extends IOSchema | undefined = undefined, OUT
|
|
|
665
670
|
protected middlewares: AbstractMiddleware[];
|
|
666
671
|
constructor(resultHandler: AbstractResultHandler);
|
|
667
672
|
addMiddleware<AOUT extends FlatObject, ASCO extends string, AIN extends IOSchema | undefined = undefined>(subject: Middleware<OUT, AOUT, ASCO, AIN> | ConstructorParameters<typeof Middleware<OUT, AOUT, ASCO, AIN>>[0]): EndpointsFactory<Extension<IN, AIN>, OUT & AOUT, SCO & ASCO>;
|
|
668
|
-
use: <R extends Request, S extends Response, AOUT extends FlatObject = Record<string, never>>(nativeMw: (request: R, response: S, next: express0.NextFunction) => any, params_1?: {
|
|
669
|
-
provider?: ((request: R, response: S) => AOUT | Promise<AOUT>) | undefined;
|
|
673
|
+
use: <R extends Request, S$1 extends Response, AOUT extends FlatObject = Record<string, never>>(nativeMw: (request: R, response: S$1, next: express0.NextFunction) => any, params_1?: {
|
|
674
|
+
provider?: ((request: R, response: S$1) => AOUT | Promise<AOUT>) | undefined;
|
|
670
675
|
transformer?: (err: Error) => Error;
|
|
671
676
|
} | undefined) => EndpointsFactory<Extension<IN, undefined>, OUT & AOUT, SCO>;
|
|
672
|
-
addExpressMiddleware<R extends Request, S extends Response, AOUT extends FlatObject = EmptyObject>(...params: ConstructorParameters<typeof ExpressMiddleware<R, S, AOUT>>): EndpointsFactory<Extension<IN, undefined>, OUT & AOUT, SCO>;
|
|
677
|
+
addExpressMiddleware<R extends Request, S$1 extends Response, AOUT extends FlatObject = EmptyObject>(...params: ConstructorParameters<typeof ExpressMiddleware<R, S$1, AOUT>>): EndpointsFactory<Extension<IN, undefined>, OUT & AOUT, SCO>;
|
|
673
678
|
addOptions<AOUT extends FlatObject>(getOptions: () => Promise<AOUT>): EndpointsFactory<Extension<IN, undefined>, OUT & AOUT, SCO>;
|
|
674
679
|
build<BOUT extends IOSchema, BIN extends IOSchema = EmptySchema>({
|
|
675
680
|
input,
|
|
@@ -696,11 +701,11 @@ declare const arrayEndpointsFactory: EndpointsFactory<undefined, Record<string,
|
|
|
696
701
|
//#endregion
|
|
697
702
|
//#region src/server.d.ts
|
|
698
703
|
declare const attachRouting: (config: AppConfig, routing: Routing) => {
|
|
699
|
-
notFoundHandler: express.RequestHandler<
|
|
704
|
+
notFoundHandler: express.RequestHandler<express_serve_static_core0.ParamsDictionary, any, any, qs0.ParsedQs, Record<string, any>>;
|
|
700
705
|
logger: AbstractLogger | BuiltinLogger;
|
|
701
706
|
};
|
|
702
707
|
declare const createServer: (config: ServerConfig, routing: Routing) => Promise<{
|
|
703
|
-
app:
|
|
708
|
+
app: express_serve_static_core0.Express;
|
|
704
709
|
logger: AbstractLogger | BuiltinLogger;
|
|
705
710
|
servers: (http.Server<typeof http.IncomingMessage, typeof http.ServerResponse> | https.Server<typeof http.IncomingMessage, typeof http.ServerResponse>)[];
|
|
706
711
|
}>;
|
|
@@ -865,10 +870,10 @@ declare const testEndpoint: <LOG extends FlatObject, REQ extends RequestOptions>
|
|
|
865
870
|
/** @desc The endpoint to test */
|
|
866
871
|
endpoint: AbstractEndpoint;
|
|
867
872
|
}) => Promise<{
|
|
868
|
-
requestMock: node_mocks_http0.MockRequest<Request<
|
|
873
|
+
requestMock: node_mocks_http0.MockRequest<Request<express_serve_static_core0.ParamsDictionary, any, any, qs0.ParsedQs, Record<string, any>> & REQ>;
|
|
869
874
|
responseMock: node_mocks_http0.MockResponse<Response<any, Record<string, any>>>;
|
|
870
875
|
loggerMock: AbstractLogger & LOG & {
|
|
871
|
-
_getLogs: () => Record<"
|
|
876
|
+
_getLogs: () => Record<"debug" | "info" | "warn" | "error", unknown[]>;
|
|
872
877
|
};
|
|
873
878
|
}>;
|
|
874
879
|
declare const testMiddleware: <LOG extends FlatObject, REQ extends RequestOptions>({
|
|
@@ -881,10 +886,10 @@ declare const testMiddleware: <LOG extends FlatObject, REQ extends RequestOption
|
|
|
881
886
|
/** @desc The aggregated output from previously executed middlewares */
|
|
882
887
|
options?: FlatObject;
|
|
883
888
|
}) => Promise<{
|
|
884
|
-
requestMock: node_mocks_http0.MockRequest<Request<
|
|
889
|
+
requestMock: node_mocks_http0.MockRequest<Request<express_serve_static_core0.ParamsDictionary, any, any, qs0.ParsedQs, Record<string, any>> & REQ>;
|
|
885
890
|
responseMock: node_mocks_http0.MockResponse<Response<any, Record<string, any>>>;
|
|
886
891
|
loggerMock: AbstractLogger & LOG & {
|
|
887
|
-
_getLogs: () => Record<"
|
|
892
|
+
_getLogs: () => Record<"debug" | "info" | "warn" | "error", unknown[]>;
|
|
888
893
|
};
|
|
889
894
|
output: FlatObject;
|
|
890
895
|
}>;
|
|
@@ -903,10 +908,10 @@ interface NextHandlerInc<U> {
|
|
|
903
908
|
interface PrevInc<U> {
|
|
904
909
|
prev: U;
|
|
905
910
|
}
|
|
906
|
-
type SchemaHandler<U, Context extends FlatObject = EmptyObject, Variant extends "regular" | "each" | "last" = "regular"> = (schema: any,
|
|
911
|
+
type SchemaHandler<U, Context$1 extends FlatObject = EmptyObject, Variant extends "regular" | "each" | "last" = "regular"> = (schema: any,
|
|
907
912
|
// eslint-disable-line @typescript-eslint/no-explicit-any -- for assignment compatibility
|
|
908
|
-
ctx: Context & (Variant extends "regular" ? NextHandlerInc<U> : Variant extends "each" ? PrevInc<U> : Context)) => U;
|
|
909
|
-
type HandlingRules<U, Context extends FlatObject = EmptyObject, K extends string | symbol = string | symbol> = Partial<Record<K, SchemaHandler<U, Context>>>;
|
|
913
|
+
ctx: Context$1 & (Variant extends "regular" ? NextHandlerInc<U> : Variant extends "each" ? PrevInc<U> : Context$1)) => U;
|
|
914
|
+
type HandlingRules<U, Context$1 extends FlatObject = EmptyObject, K$1 extends string | symbol = string | symbol> = Partial<Record<K$1, SchemaHandler<U, Context$1>>>;
|
|
910
915
|
//#endregion
|
|
911
916
|
//#region src/zts-helpers.d.ts
|
|
912
917
|
interface ZTSContext extends FlatObject {
|
|
@@ -988,7 +993,7 @@ interface Emitter<E extends EventsMap> extends FlatObject {
|
|
|
988
993
|
/** @desc Abort signal bound to the client connection lifecycle */
|
|
989
994
|
signal: AbortSignal;
|
|
990
995
|
/** @desc Sends an event to the stream according to the declared schema */
|
|
991
|
-
emit: <K extends keyof E>(event: K, data: z.input<E[K]>) => void;
|
|
996
|
+
emit: <K$1 extends keyof E>(event: K$1, data: z.input<E[K$1]>) => void;
|
|
992
997
|
}
|
|
993
998
|
declare class EventStreamFactory<E extends EventsMap> extends EndpointsFactory<undefined, Emitter<E>> {
|
|
994
999
|
constructor(events: E);
|
|
@@ -1009,13 +1014,13 @@ declare const base: z.ZodObject<{
|
|
|
1009
1014
|
raw: z.core.$ZodBranded<z.ZodCustom<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>, symbol>;
|
|
1010
1015
|
}, z.core.$strip>;
|
|
1011
1016
|
type Base = ReturnType<typeof base.brand<symbol>>;
|
|
1012
|
-
declare const extended: <S extends z.core.$ZodShape>(extra: S) => z.core.$ZodBranded<z.ZodObject<("raw" & keyof S extends never ? {
|
|
1017
|
+
declare const extended: <S$1 extends z.core.$ZodShape>(extra: S$1) => z.core.$ZodBranded<z.ZodObject<("raw" & keyof S$1 extends never ? {
|
|
1013
1018
|
raw: z.core.$ZodBranded<z.ZodCustom<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>, symbol>;
|
|
1014
|
-
} & S : ({
|
|
1019
|
+
} & S$1 : ({
|
|
1015
1020
|
raw: z.core.$ZodBranded<z.ZodCustom<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>, symbol>;
|
|
1016
|
-
} extends infer T_1 extends z.core.util.SomeObject ? { [K in keyof T_1 as K extends keyof S ? never : K]: T_1[K] } : never) & { [K_1 in keyof S]: S[K_1] }) extends infer T ? { [k in keyof T]: T[k] } : never, z.core.$strip>, symbol>;
|
|
1021
|
+
} extends infer T_1 extends z.core.util.SomeObject ? { [K in keyof T_1 as K extends keyof S$1 ? never : K]: T_1[K] } : never) & { [K_1 in keyof S$1]: S$1[K_1] }) extends infer T ? { [k in keyof T]: T[k] } : never, z.core.$strip>, symbol>;
|
|
1017
1022
|
declare function raw(): Base;
|
|
1018
|
-
declare function raw<S extends z.core.$ZodShape>(extra: S): ReturnType<typeof extended<S>>;
|
|
1023
|
+
declare function raw<S$1 extends z.core.$ZodShape>(extra: S$1): ReturnType<typeof extended<S$1>>;
|
|
1019
1024
|
//#endregion
|
|
1020
1025
|
//#region src/proprietary-schemas.d.ts
|
|
1021
1026
|
declare const ez: {
|
|
@@ -1024,7 +1029,7 @@ declare const ez: {
|
|
|
1024
1029
|
...rest
|
|
1025
1030
|
}?: DateInParams) => zod_v4_core0.$ZodBranded<zod0.ZodPipe<zod0.ZodPipe<zod0.ZodUnion<readonly [zod0.ZodISODate, zod0.ZodISODateTime, zod0.ZodISODateTime]>, zod0.ZodTransform<Date, string>>, zod0.ZodDate>, symbol>;
|
|
1026
1031
|
dateOut: (meta?: DateOutParams) => zod_v4_core0.$ZodBranded<zod0.ZodPipe<zod0.ZodDate, zod0.ZodTransform<string, Date>>, symbol>;
|
|
1027
|
-
form: <S extends zod_v4_core0.$ZodShape>(base: S | zod0.ZodObject<S>) => zod_v4_core0.$ZodBranded<zod0.ZodObject<S, zod_v4_core0.$strip>, symbol>;
|
|
1032
|
+
form: <S$1 extends zod_v4_core0.$ZodShape>(base: S$1 | zod0.ZodObject<S$1>) => zod_v4_core0.$ZodBranded<zod0.ZodObject<S$1, zod_v4_core0.$strip>, symbol>;
|
|
1028
1033
|
upload: () => zod_v4_core0.$ZodBranded<zod0.ZodCustom<express_fileupload0.UploadedFile, express_fileupload0.UploadedFile>, symbol>;
|
|
1029
1034
|
raw: typeof raw;
|
|
1030
1035
|
buffer: () => zod_v4_core0.$ZodBranded<zod0.ZodCustom<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>, symbol>;
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{getBrand as e}from"@express-zod-api/zod-plugin";import*as t from"ramda";import{globalRegistry as n,z as r}from"zod";import i,{isHttpError as a}from"http-errors";import o,{blue as s,cyanBright as c,gray as l,green as u,hex as d,italic as f,red as p,whiteBright as m}from"ansis";import{inspect as ee}from"node:util";import{performance as h}from"node:perf_hooks";import g from"express";import te from"node:http";import ne from"node:https";import{setInterval as re}from"node:timers/promises";import{OpenApiBuilder as ie,isReferenceObject as ae,isSchemaObject as _}from"openapi3-ts/oas31";import{createRequest as oe,createResponse as se}from"node-mocks-http";import v from"typescript";function ce(e){return e}const y={json:`application/json`,upload:`multipart/form-data`,raw:`application/octet-stream`,sse:`text/event-stream`,form:`application/x-www-form-urlencoded`},le=[`get`,`post`,`put`,`delete`,`patch`],ue=[...le,`head`],b=e=>le.includes(e),de=r.object({}),fe=/:([A-Za-z0-9_]+)/g,pe=e=>e.match(fe)?.map(e=>e.slice(1))||[],me=e=>{let t=(e.header(`content-type`)||``).toLowerCase().startsWith(y.upload);return`files`in e&&t},he={get:[`query`,`params`],post:[`body`,`params`,`files`],put:[`body`,`params`],patch:[`body`,`params`],delete:[`query`,`params`]},ge=[`body`,`query`,`params`],_e=e=>e.method.toLowerCase(),ve=(e,t={})=>{if(e===`options`)return[];let n=e===`head`?`get`:b(e)?e:void 0;return(n?t[n]||he[n]:void 0)||ge},ye=(e,t={})=>{let n=_e(e);return ve(n,t).filter(t=>t===`files`?me(e):!0).reduce((t,n)=>Object.assign(t,e[n]),{})},x=e=>e instanceof Error?e:e instanceof r.ZodError?new r.ZodRealError(e.issues):Error(String(e)),S=e=>e instanceof r.ZodError?e.issues.map(({path:e,message:t})=>`${e.length?`${r.core.toDotPath(e)}: `:``}${t}`).join(`; `):e.message,C=(e,n)=>T(e)&&`_zod`in e&&(n?t.path([`_zod`,`def`,`type`],e)===n:!0),be=(e,n,r)=>e.length&&n.length?t.xprod(e,n).map(r):e.concat(n),xe=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),w=(...e)=>{let n=t.chain(e=>e.split(/[^A-Z0-9]/gi),e);return t.chain(e=>e.replaceAll(/[A-Z]+/g,e=>`/${e}`).split(`/`),n).map(xe).join(``)},Se=t.tryCatch((e,t)=>typeof r.parse(e,t),t.always(void 0)),T=e=>typeof e==`object`&&!!e,Ce=t.memoizeWith(()=>`static`,()=>process.env.NODE_ENV===`production`),we=(e,t)=>!!t&&e!==`head`,Te=Symbol(`Buffer`),Ee=()=>r.custom(e=>Buffer.isBuffer(e),{error:`Expected Buffer`}).brand(Te),De=Symbol(`DateIn`),Oe=({examples:e,...t}={})=>r.union([r.iso.date(),r.iso.datetime(),r.iso.datetime({local:!0})]).meta({examples:e}).transform(e=>new Date(e)).pipe(r.date()).brand(De).meta(t),ke=Symbol(`DateOut`),Ae=(e={})=>r.date().transform(e=>e.toISOString()).brand(ke).meta(e);var je=class extends Error{name=`RoutingError`;cause;constructor(e,t,n){super(e),this.cause={method:t,path:n}}},E=class extends Error{name=`DocumentationError`;cause;constructor(e,{method:t,path:n,isResponse:r}){super(e),this.cause=`${r?`Response`:`Input`} schema of an Endpoint assigned to ${t.toUpperCase()} method of ${n} path.`}},Me=class extends Error{name=`IOSchemaError`},Ne=class extends Me{name=`DeepCheckError`;constructor(e){super(`Found`,{cause:e}),this.cause=e}},Pe=class extends Me{name=`OutputValidationError`;constructor(e){let t=new r.ZodError(e.issues.map(({path:e,...t})=>({...t,path:[`output`,...e]})));super(S(t),{cause:e}),this.cause=e}},D=class extends Me{name=`InputValidationError`;constructor(e){super(S(e),{cause:e}),this.cause=e}},Fe=class extends Error{name=`ResultHandlerError`;constructor(e,t){super(S(e),{cause:e}),this.cause=e,this.handled=t}},Ie=class extends Error{name=`MissingPeerError`;constructor(e){super(`Missing peer dependency: ${e}. Please install it to use the feature.`)}};const Le=Symbol(`Form`),Re=e=>(e instanceof r.ZodObject?e:r.object(e)).brand(Le),O=Symbol(`Upload`),ze=()=>r.custom(e=>typeof e==`object`&&!!e&&`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.encoding==`string`&&typeof e.mimetype==`string`&&Buffer.isBuffer(e.data)&&typeof e.tempFilePath==`string`&&typeof e.truncated==`boolean`&&typeof e.size==`number`&&typeof e.md5==`string`&&typeof e.mv==`function`,{error:({input:e})=>({message:`Expected file upload, received ${typeof e}`})}).brand(O),k=Symbol(`Raw`),Be=r.object({raw:Ee()}),Ve=e=>Be.extend(e).brand(k);function He(e){return e?Ve(e):Be.brand(k)}const Ue=(e,{io:n,condition:i})=>t.tryCatch(()=>void r.toJSONSchema(e,{io:n,unrepresentable:`any`,override:({zodSchema:e})=>{if(i(e))throw new Ne(e)}}),e=>e.cause)(),We=(e,{io:n})=>{let i=[r.toJSONSchema(e,{io:n,unrepresentable:`any`})];for(;i.length;){let e=i.shift();if(t.is(Object,e)){if(e.$ref===`#`)return!0;i.push(...t.values(e))}t.is(Array,e)&&i.push(...t.values(e))}return!1},Ge=t=>Ue(t,{condition:t=>{let n=e(t);return typeof n==`symbol`&&[O,k,Le].includes(n)},io:`input`}),Ke=[`nan`,`symbol`,`map`,`set`,`bigint`,`void`,`promise`,`never`,`function`],qe=(t,n)=>Ue(t,{io:n,condition:t=>{let r=e(t),{type:i}=t._zod.def;return!!(Ke.includes(i)||r===Te||n===`input`&&(i===`date`||r===ke)||n===`output`&&(r===De||r===k||r===O))}}),Je=(e,{variant:t,args:n,...i})=>{if(typeof e==`function`&&(e=e(...n)),e instanceof r.ZodType)return[{schema:e,...i}];if(Array.isArray(e)&&!e.length){let e=Error(`At least one ${t} response schema required.`);throw new Fe(e)}return(Array.isArray(e)?e:[e]).map(({schema:e,statusCode:t,mimeType:n})=>({schema:e,statusCodes:typeof t==`number`?[t]:t||i.statusCodes,mimeTypes:typeof n==`string`?[n]:n===void 0?i.mimeTypes:n}))},Ye=(e,t,{url:n},r)=>!e.expose&&t.error(`Server side error`,{error:e,url:n,payload:r}),A=e=>a(e)?e:i(e instanceof D?400:500,S(e),{cause:e.cause||e}),j=e=>Ce()&&!e.expose?i(e.statusCode).message:e.message,Xe=e=>Object.entries(e._zod.def.shape).reduce((e,[r,i])=>{let{examples:a=[]}=n.get(i)||{};return be(e,a.map(t.objOf(r)),([e,t])=>({...e,...t}))},[]),Ze=({error:e,logger:t,response:n})=>{t.error(`Result handler failure`,e);let r=j(i(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`\nOriginal error: ${e.handled.message}.`:``),{expose:a(e.cause)?e.cause.expose:!1}));n.status(500).type(`text/plain`).end(r)};var Qe=class{},M=class extends Qe{#schema;#security;#handler;constructor({input:e,security:t,handler:n}){super(),this.#schema=e,this.#security=t,this.#handler=n}get security(){return this.#security}get schema(){return this.#schema}async execute({input:e,...t}){try{let n=await(this.#schema||de).parseAsync(e);return this.#handler({...t,input:n})}catch(e){throw e instanceof r.ZodError?new D(e):e}}},$e=class extends M{constructor(e,{provider:t=()=>({}),transformer:n=e=>e}={}){super({handler:async({request:r,response:i})=>new Promise((a,o)=>{let s=e=>{if(e&&e instanceof Error)return o(n(e));a(t(r,i))};e(r,i,s)?.catch(s)})})}},et=class{nest(e){return Object.assign(e,{"":this})}},tt=class extends et{},nt=class i extends tt{#def;#ensureOutputExamples=t.once(()=>{if(n.get(this.#def.outputSchema)?.examples?.length||!C(this.#def.outputSchema,`object`))return;let e=Xe(this.#def.outputSchema);if(!e.length)return;let t=this.#def.outputSchema.meta();n.remove(this.#def.outputSchema).add(this.#def.outputSchema,{...t,examples:e})});constructor(e){super(),this.#def=e}#clone(e){return new i({...this.#def,...e})}deprecated(){return this.#clone({deprecated:!0})}get isDeprecated(){return this.#def.deprecated||!1}get description(){return this.#def.description}get shortDescription(){return this.#def.shortDescription}get methods(){return Object.freeze(this.#def.methods)}get inputSchema(){return this.#def.inputSchema}get outputSchema(){return this.#ensureOutputExamples(),this.#def.outputSchema}get requestType(){let t=Ge(this.#def.inputSchema);if(t){let n=e(t);if(n===O)return`upload`;if(n===k)return`raw`;if(n===Le)return`form`}return`json`}getResponses(e){return e===`positive`&&this.#ensureOutputExamples(),Object.freeze(e===`negative`?this.#def.resultHandler.getNegativeResponse():this.#def.resultHandler.getPositiveResponse(this.#def.outputSchema))}get security(){let e=t.pluck(`security`,this.#def.middlewares||[]);return t.reject(t.isNil,e)}get scopes(){return Object.freeze(this.#def.scopes||[])}get tags(){return Object.freeze(this.#def.tags||[])}getOperationId(e){return this.#def.getOperationId?.(e)}async#parseOutput(e){try{return await this.#def.outputSchema.parseAsync(e)}catch(e){throw e instanceof r.ZodError?new Pe(e):e}}async#runMiddlewares({method:e,logger:t,options:n,response:r,...i}){for(let a of this.#def.middlewares||[])if(!(e===`options`&&!(a instanceof $e))&&(Object.assign(n,await a.execute({...i,options:n,response:r,logger:t})),r.writableEnded)){t.warn(`A middleware has closed the stream. Accumulated options:`,n);break}}async#parseAndRunHandler({input:e,...t}){let n;try{n=await this.#def.inputSchema.parseAsync(e)}catch(e){throw e instanceof r.ZodError?new D(e):e}return this.#def.handler({...t,input:n})}async#handleResult(e){try{await this.#def.resultHandler.execute(e)}catch(t){Ze({...e,error:new Fe(x(t),e.error||void 0)})}}async execute({request:e,response:t,logger:n,config:r}){let i=_e(e),a={},o={output:{},error:null},s=ye(e,r.inputSources);try{if(await this.#runMiddlewares({method:i,input:s,request:e,response:t,logger:n,options:a}),t.writableEnded)return;if(i===`options`)return void t.status(200).end();o={output:await this.#parseOutput(await this.#parseAndRunHandler({input:s,logger:n,options:a})),error:null}}catch(e){o={output:null,error:x(e)}}await this.#handleResult({...o,input:s,request:e,response:t,logger:n,options:a})}};const rt=(e,t)=>e&&t?e.and(t):e||t,it=(e,t)=>e?e.and(t):t,N={positive:200,negative:400},at=Object.keys(N);var ot=class{#handler;constructor(e){this.#handler=e}execute(...e){return this.#handler(...e)}},P=class extends ot{#positive;#negative;constructor(e){super(e.handler),this.#positive=e.positive,this.#negative=e.negative}getPositiveResponse(e){return Je(this.#positive,{variant:`positive`,args:[e],statusCodes:[N.positive],mimeTypes:[y.json]})}getNegativeResponse(){return Je(this.#negative,{variant:`negative`,args:[],statusCodes:[N.negative],mimeTypes:[y.json]})}};const st=r.object({status:r.literal(`error`),error:r.object({message:r.string()})});n.add(st,{examples:[{status:`error`,error:{message:`Sample error message`}}]});const F=new P({positive:e=>{let t=r.object({status:r.literal(`success`),data:e}),{examples:i}=n.get(e)||{};return i?.length&&n.add(t,{examples:i.map(e=>({status:`success`,data:e}))}),t},negative:st,handler:({error:e,input:t,output:n,request:r,response:i,logger:a})=>{if(e){let n=A(e);Ye(n,a,r,t),i.status(n.statusCode).set(n.headers).json({status:`error`,error:{message:j(n)}});return}i.status(N.positive).json({status:`success`,data:n})}}),ct=r.string();n.add(ct,{examples:[`Sample error message`]});const lt=new P({positive:e=>{let t=e instanceof r.ZodObject&&`items`in e.shape&&e.shape.items instanceof r.ZodArray?e.shape.items:r.array(r.any());if(n.get(t)?.examples?.length)return t;let i=n.get(e)?.examples?.filter(e=>T(e)&&`items`in e&&Array.isArray(e.items)).map(e=>e.items);if(i?.length){let e=t.meta();n.remove(t).add(t,{...e,examples:i})}return t},negative:{schema:ct,mimeType:`text/plain`},handler:({response:e,output:t,error:n,logger:r,request:i,input:a})=>{if(n){let t=A(n);Ye(t,r,i,a),e.status(t.statusCode).type(`text/plain`).send(j(t));return}if(`items`in t&&Array.isArray(t.items)){e.status(N.positive).json(t.items);return}throw Error(`Property 'items' is missing in the endpoint output`)}});var ut=class e{schema=void 0;middlewares=[];constructor(e){this.resultHandler=e}#extend(t){let n=new e(this.resultHandler);return n.middlewares=this.middlewares.concat(t),n.schema=rt(this.schema,t.schema),n}addMiddleware(e){return this.#extend(e instanceof M?e:new M(e))}use=this.addExpressMiddleware;addExpressMiddleware(...e){return this.#extend(new $e(...e))}addOptions(e){return this.#extend(new M({handler:e}))}build({input:e=de,output:t,operationId:n,scope:r,tag:i,method:a,...o}){let{middlewares:s,resultHandler:c}=this,l=typeof a==`string`?[a]:a,u=typeof n==`function`?n:e=>n&&`${n}${e===`head`?`__HEAD`:``}`,d=typeof r==`string`?[r]:r||[],f=typeof i==`string`?[i]:i||[];return new nt({...o,middlewares:s,outputSchema:t,resultHandler:c,scopes:d,tags:f,methods:l,getOperationId:u,inputSchema:it(this.schema,e)})}buildVoid({handler:e,...t}){return this.build({...t,output:de,handler:async t=>(await e(t),{})})}};const dt=new ut(F),ft=new ut(lt),pt={debug:s,info:u,warn:d(`#FFA500`),error:p,ctx:c},mt={debug:10,info:20,warn:30,error:40},ht=e=>T(e)&&Object.keys(mt).some(t=>t in e),gt=e=>e in mt,_t=(e,t)=>mt[e]<mt[t],I=t.memoizeWith((e,t)=>`${e}${t}`,(e,t=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:t,style:`unit`,unitDisplay:`long`,unit:e})),vt=e=>e<1e-6?I(`nanosecond`,3).format(e/1e-6):e<.001?I(`nanosecond`).format(e/1e-6):e<1?I(`microsecond`).format(e/.001):e<1e3?I(`millisecond`).format(e):e<6e4?I(`second`,2).format(e/1e3):I(`minute`,2).format(e/6e4);var yt=class e{config;constructor({color:e=o.isSupported(),level:t=Ce()?`warn`:`debug`,depth:n=2,ctx:r={}}={}){this.config={color:e,level:t,depth:n,ctx:r}}format(e){let{depth:t,color:n,level:r}=this.config;return ee(e,{depth:t,colors:n,breakLength:r===`debug`?80:1/0,compact:r===`debug`?3:!0})}print(e,t,n){let{level:r,ctx:{requestId:i,...a},color:o}=this.config;if(r===`silent`||_t(e,r))return;let s=[new Date().toISOString()];i&&s.push(o?pt.ctx(i):i),s.push(o?`${pt[e](e)}:`:`${e}:`,t),n!==void 0&&s.push(this.format(n)),Object.keys(a).length>0&&s.push(this.format(a)),console.log(s.join(` `))}debug(e,t){this.print(`debug`,e,t)}info(e,t){this.print(`info`,e,t)}warn(e,t){this.print(`warn`,e,t)}error(e,t){this.print(`error`,e,t)}child(t){return new e({...this.config,ctx:t})}get ctx(){return this.config.ctx}profile(e){let t=h.now();return()=>{let n=h.now()-t,{message:r,severity:i=`debug`,formatter:a=vt}=typeof e==`object`?e:{message:e};this.print(typeof i==`function`?i(n):i,r,a(n))}}},bt=class e extends et{#endpoints;constructor(e){super(),this.#endpoints=e}get entries(){let e=t.filter(e=>!!e[1],Object.entries(this.#endpoints));return Object.freeze(e)}deprecated(){let t=Object.entries(this.#endpoints).reduce((e,[t,n])=>Object.assign(e,{[t]:n.deprecated()}),{});return new e(t)}},xt=class{#params;constructor(...e){this.#params=e}apply(e,t){return t(e,g.static(...this.#params))}};const St=async(e,t=`default`)=>{try{return(await import(e))[t]}catch{}throw new Ie(e)},Ct=e=>e.type===`object`,wt=t.mergeDeepWith((e,n)=>{if(Array.isArray(e)&&Array.isArray(n))return t.concat(e,n);if(e===n)return n;throw Error(`Can not flatten properties`,{cause:{a:e,b:n}})}),Tt=t.pipe(Object.keys,t.without([`type`,`properties`,`required`,`examples`,`description`,`additionalProperties`]),t.isEmpty),Et=t.pair(!0),Dt=(e,n=`coerce`)=>{let r=[t.pair(!1,e)],i={type:`object`,properties:{}},a=[];for(;r.length;){let[e,o]=r.shift();if(o.description&&(i.description??=o.description),o.allOf&&r.push(...o.allOf.map(r=>{if(n===`throw`&&!(r.type===`object`&&Tt(r)))throw Error(`Can not merge`);return t.pair(e,r)})),o.anyOf&&r.push(...t.map(Et,o.anyOf)),o.oneOf&&r.push(...t.map(Et,o.oneOf)),o.examples?.length&&(e?i.examples=t.concat(i.examples||[],o.examples):i.examples=be(i.examples?.filter(T)||[],o.examples.filter(T),([e,n])=>t.mergeDeepRight(e,n))),Ct(o)&&(r.push([e,{examples:Ot(o)}]),o.properties&&(i.properties=(n===`throw`?wt:t.mergeDeepRight)(i.properties,o.properties),!e&&o.required&&a.push(...o.required)),T(o.propertyNames))){let t=[];typeof o.propertyNames.const==`string`&&t.push(o.propertyNames.const),o.propertyNames.enum&&t.push(...o.propertyNames.enum.filter(e=>typeof e==`string`));let n={...Object(o.additionalProperties)};for(let e of t)i.properties[e]??=n;e||a.push(...t)}}return a.length&&(i.required=[...new Set(a)]),i},Ot=e=>Object.entries(e.properties||{}).reduce((e,[n,r])=>{let{examples:i=[]}=T(r)?r:{};return be(e,i.map(t.objOf(n)),([e,t])=>({...e,...t}))},[]);var kt=class{#verifiedEndpoints=new WeakSet;#verifiedPaths=new WeakMap;constructor(e){this.logger=e}checkSchema(e,t){if(!this.#verifiedEndpoints.has(e)){for(let n of[`input`,`output`]){let i=[r.toJSONSchema(e[`${n}Schema`],{unrepresentable:`any`})];for(;i.length>0;){let e=i.shift();e.type&&e.type!==`object`&&this.logger.warn(`Endpoint ${n} schema is not object-based`,t);for(let t of[`allOf`,`oneOf`,`anyOf`])e[t]&&i.push(...e[t])}}if(e.requestType===`json`){let n=qe(e.inputSchema,`input`);n&&this.logger.warn(`The final input schema of the endpoint contains an unsupported JSON payload type.`,Object.assign(t,{reason:n}))}for(let n of at)for(let{mimeTypes:r,schema:i}of e.getResponses(n)){if(!r?.includes(y.json))continue;let e=qe(i,`output`);e&&this.logger.warn(`The final ${n} response schema of the endpoint contains an unsupported JSON payload type.`,Object.assign(t,{reason:e}))}this.#verifiedEndpoints.add(e)}}checkPathParams(e,t,n){let i=this.#verifiedPaths.get(t);if(i?.paths.includes(e))return;let a=pe(e);if(a.length===0)return;let o=i?.flat||Dt(r.toJSONSchema(t.inputSchema,{unrepresentable:`any`,io:`input`}));for(let t of a)t in o.properties||this.logger.warn(`The input schema of the endpoint is most likely missing the parameter of the path it's assigned to.`,Object.assign(n,{path:e,param:t}));i?i.paths.push(e):this.#verifiedPaths.set(t,{flat:o,paths:[e]})}};const At=e=>(t,...n)=>{e(t,...n),t===`get`&&e(`head`,...n)},jt=e=>{let[t,n]=e.trim().split(/ (.+)/,2);return n&&b(t)?[n,t]:[e]},Mt=e=>e.trim().split(`/`).filter(Boolean).join(`/`),Nt=(e,t)=>Object.entries(e).map(([e,n])=>{let[r,i]=jt(e);return[[t||``].concat(Mt(r)||[]).join(`/`),n,i]}),Pt=(e,t)=>{throw new je(`Route with explicit method can only be assigned with Endpoint`,e,t)},Ft=(e,t,n)=>{if(!(!n||n.includes(e)))throw new je(`Method ${e} is not supported by the assigned Endpoint.`,e,t)},It=(e,t,n)=>{let r=`${e} ${t}`;if(n.has(r))throw new je(`Route has a duplicate`,e,t);n.add(r)},Lt=({routing:e,onEndpoint:t,onStatic:n})=>{let r=Nt(e),i=new Set;for(;r.length;){let[e,a,o]=r.shift();if(a instanceof tt)if(o)It(o,e,i),Ft(o,e,a.methods),t(o,e,a);else{let{methods:n=[`get`]}=a;for(let r of n)It(r,e,i),t(r,e,a)}else if(o&&Pt(o,e),a instanceof xt)n&&a.apply(e,n);else if(a instanceof bt)for(let[n,r]of a.entries){let{methods:a}=r;It(n,e,i),Ft(n,e,a),t(n,e,r)}else r.unshift(...Nt(a,e))}},Rt=e=>e.sort((e,t)=>b(t)-+b(e)||e.localeCompare(t)).join(`, `).toUpperCase(),zt=e=>({method:t},n,r)=>{let a=Rt(e);n.set({Allow:a});let o=i(405,`${t} is not allowed`,{headers:{Allow:a}});r(o)},Bt=e=>({"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":Rt(e),"Access-Control-Allow-Headers":`content-type`}),Vt=({app:e,getLogger:n,config:r,routing:i,parsers:a})=>{let o=Ce()?void 0:new kt(n()),s=new Map;return Lt({routing:i,onEndpoint:(e,n,i)=>{o?.checkSchema(i,{path:n,method:e}),o?.checkPathParams(n,i,{method:e});let c=a?.[i.requestType]||[],l=t.pair(c,i);s.has(n)||s.set(n,new Map(r.cors?[[`options`,l]]:[])),s.get(n)?.set(e,l)},onStatic:e.use.bind(e)}),s},Ht=({app:e,config:t,getLogger:n,...r})=>{let i=Vt({app:e,getLogger:n,config:t,...r}),a=new Map;for(let[r,o]of i){let i=Array.from(o.keys());i.includes(`get`)&&i.push(`head`);for(let[a,[s,c]]of o){let o=s.slice().concat(async(e,r)=>{let i=n(e);return c.execute({request:e,response:r,logger:i,config:t})});t.cors&&o.unshift(async(e,r,a)=>{let o=n(e),s=Bt(i),l=typeof t.cors==`function`?await t.cors({request:e,endpoint:c,logger:o,defaultHeaders:s}):s;r.set(l),a()}),e[a](r,...o)}t.wrongMethodBehavior!==404&&a.set(r,zt(i))}for(let[t,n]of a)e.all(t,n)},Ut=e=>`_httpMessage`in e&&typeof e._httpMessage==`object`&&e._httpMessage!==null&&`headersSent`in e._httpMessage&&typeof e._httpMessage.headersSent==`boolean`&&`setHeader`in e._httpMessage&&typeof e._httpMessage.setHeader==`function`,Wt=e=>`server`in e&&typeof e.server==`object`&&e.server!==null&&`close`in e.server&&typeof e.server.close==`function`,Gt=e=>`encrypted`in e&&typeof e.encrypted==`boolean`&&e.encrypted,Kt=({},e)=>void(!e.headersSent&&e.setHeader(`connection`,`close`)),qt=e=>new Promise((t,n)=>void e.close(e=>e?n(e):t())),Jt=(e,{timeout:t=1e3,logger:n}={})=>{let r,i=new Set,a=e=>void i.delete(e.destroy()),o=e=>void(Ut(e)?!e._httpMessage.headersSent&&e._httpMessage.setHeader(`connection`,`close`):a(e)),s=e=>void(r?e.destroy():i.add(e.once(`close`,()=>void i.delete(e))));for(let t of e)for(let e of[`connection`,`secureConnection`])t.on(e,s);let c=async()=>{for(let t of e)t.on(`request`,Kt);n?.info(`Graceful shutdown`,{sockets:i.size,timeout:t});for(let e of i)(Gt(e)||Wt(e))&&o(e);for await(let e of re(10,Date.now()))if(i.size===0||Date.now()-e>=t)break;for(let e of i)a(e);return Promise.allSettled(e.map(qt))};return{sockets:i,shutdown:()=>r??=c()}},Yt=Symbol.for(`express-zod-api`),Xt=({errorHandler:e,getLogger:t})=>async(n,r,i,a)=>n?e.execute({error:x(n),request:r,response:i,input:null,output:null,options:{},logger:t(r)}):a(),Zt=({errorHandler:e,getLogger:t})=>async(n,r)=>{let a=i(404,`Can not ${n.method} ${n.path}`),o=t(n);try{await e.execute({request:n,response:r,logger:o,error:a,input:null,output:null,options:{}})}catch(e){Ze({response:r,logger:o,error:new Fe(x(e),a)})}},Qt=e=>(t,{},n)=>{if(Object.values(t?.files||[]).flat().find(({truncated:e})=>e))return n(e);n()},$t=e=>({log:e.debug.bind(e)}),en=async({getLogger:e,config:t})=>{let n=await St(`express-fileupload`),{limitError:r,beforeUpload:i,...a}={...typeof t.upload==`object`&&t.upload},o=[];return o.push(async(t,r,o)=>{let s=e(t);return await i?.({request:t,logger:s}),n({debug:!0,...a,abortOnLimit:!1,parseNested:!0,logger:$t(s)})(t,r,o)}),r&&o.push(Qt(r)),o},tn=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},nn=({logger:e,config:{childLoggerProvider:t,accessLogger:n=({method:e,path:t},n)=>n.debug(`${e}: ${t}`)}})=>async(r,i,a)=>{let o=await t?.({request:r,parent:e})||e;n?.(r,o),r.res&&(r.res.locals[Yt]={logger:o}),a()},rn=e=>t=>t?.res?.locals[Yt]?.logger||e,an=e=>process.on(`deprecation`,({message:t,namespace:n,name:r,stack:i})=>e.warn(`${r} (${n}): ${t}`,i.split(`
|
|
1
|
+
import{getBrand as e}from"@express-zod-api/zod-plugin";import*as t from"ramda";import{globalRegistry as n,z as r}from"zod";import i,{isHttpError as a}from"http-errors";import o,{blue as s,cyanBright as c,gray as l,green as u,hex as d,italic as f,red as p,whiteBright as m}from"ansis";import{inspect as ee}from"node:util";import{performance as h}from"node:perf_hooks";import g from"express";import te from"node:http";import ne from"node:https";import{setInterval as re}from"node:timers/promises";import{OpenApiBuilder as ie,isReferenceObject as ae,isSchemaObject as _}from"openapi3-ts/oas31";import{createRequest as oe,createResponse as se}from"node-mocks-http";import v from"typescript";function ce(e){return e}const y={json:`application/json`,upload:`multipart/form-data`,raw:`application/octet-stream`,sse:`text/event-stream`,form:`application/x-www-form-urlencoded`},le=[`get`,`post`,`put`,`delete`,`patch`],ue=[...le,`head`],b=e=>le.includes(e),de=r.object({}),fe=/:([A-Za-z0-9_]+)/g,pe=e=>e.match(fe)?.map(e=>e.slice(1))||[],me=e=>{let t=(e.header(`content-type`)||``).toLowerCase().startsWith(y.upload);return`files`in e&&t},he={get:[`query`,`params`],post:[`body`,`params`,`files`],put:[`body`,`params`],patch:[`body`,`params`],delete:[`query`,`params`]},ge=[`body`,`query`,`params`],_e=e=>e.method.toLowerCase(),ve=(e,t={})=>{if(e===`options`)return[];let n=e===`head`?`get`:b(e)?e:void 0;return(n?t[n]||he[n]:void 0)||ge},ye=(e,t={})=>ve(_e(e),t).filter(t=>t===`files`?me(e):!0).reduce((t,n)=>Object.assign(t,e[n]),{}),x=e=>e instanceof Error?e:e instanceof r.ZodError?new r.ZodRealError(e.issues):Error(String(e)),S=e=>e instanceof r.ZodError?e.issues.map(({path:e,message:t})=>`${e.length?`${r.core.toDotPath(e)}: `:``}${t}`).join(`; `):e.message,C=(e,n)=>T(e)&&`_zod`in e&&(n?t.path([`_zod`,`def`,`type`],e)===n:!0),be=(e,n,r)=>e.length&&n.length?t.xprod(e,n).map(r):e.concat(n),xe=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),w=(...e)=>{let n=t.chain(e=>e.split(/[^A-Z0-9]/gi),e);return t.chain(e=>e.replaceAll(/[A-Z]+/g,e=>`/${e}`).split(`/`),n).map(xe).join(``)},Se=t.tryCatch((e,t)=>typeof r.parse(e,t),t.always(void 0)),T=e=>typeof e==`object`&&!!e,Ce=t.memoizeWith(()=>`static`,()=>process.env.NODE_ENV===`production`),we=(e,t)=>!!t&&e!==`head`,Te=Symbol(`Buffer`),Ee=()=>r.custom(e=>Buffer.isBuffer(e),{error:`Expected Buffer`}).brand(Te),De=Symbol(`DateIn`),Oe=({examples:e,...t}={})=>r.union([r.iso.date(),r.iso.datetime(),r.iso.datetime({local:!0})]).meta({examples:e}).transform(e=>new Date(e)).pipe(r.date()).brand(De).meta(t),ke=Symbol(`DateOut`),Ae=(e={})=>r.date().transform(e=>e.toISOString()).brand(ke).meta(e);var je=class extends Error{name=`RoutingError`;cause;constructor(e,t,n){super(e),this.cause={method:t,path:n}}},E=class extends Error{name=`DocumentationError`;cause;constructor(e,{method:t,path:n,isResponse:r}){super(e),this.cause=`${r?`Response`:`Input`} schema of an Endpoint assigned to ${t.toUpperCase()} method of ${n} path.`}},Me=class extends Error{name=`IOSchemaError`},Ne=class extends Me{name=`DeepCheckError`;constructor(e){super(`Found`,{cause:e}),this.cause=e}},Pe=class extends Me{name=`OutputValidationError`;constructor(e){let t=new r.ZodError(e.issues.map(({path:e,...t})=>({...t,path:[`output`,...e]})));super(S(t),{cause:e}),this.cause=e}},D=class extends Me{name=`InputValidationError`;constructor(e){super(S(e),{cause:e}),this.cause=e}},Fe=class extends Error{name=`ResultHandlerError`;constructor(e,t){super(S(e),{cause:e}),this.cause=e,this.handled=t}},Ie=class extends Error{name=`MissingPeerError`;constructor(e){super(`Missing peer dependency: ${e}. Please install it to use the feature.`)}};const Le=Symbol(`Form`),Re=e=>(e instanceof r.ZodObject?e:r.object(e)).brand(Le),O=Symbol(`Upload`),ze=()=>r.custom(e=>typeof e==`object`&&!!e&&`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.encoding==`string`&&typeof e.mimetype==`string`&&Buffer.isBuffer(e.data)&&typeof e.tempFilePath==`string`&&typeof e.truncated==`boolean`&&typeof e.size==`number`&&typeof e.md5==`string`&&typeof e.mv==`function`,{error:({input:e})=>({message:`Expected file upload, received ${typeof e}`})}).brand(O),k=Symbol(`Raw`),Be=r.object({raw:Ee()}),Ve=e=>Be.extend(e).brand(k);function He(e){return e?Ve(e):Be.brand(k)}const Ue=(e,{io:n,condition:i})=>t.tryCatch(()=>void r.toJSONSchema(e,{io:n,unrepresentable:`any`,override:({zodSchema:e})=>{if(i(e))throw new Ne(e)}}),e=>e.cause)(),We=(e,{io:n})=>{let i=[r.toJSONSchema(e,{io:n,unrepresentable:`any`})];for(;i.length;){let e=i.shift();if(t.is(Object,e)){if(e.$ref===`#`)return!0;i.push(...t.values(e))}t.is(Array,e)&&i.push(...t.values(e))}return!1},Ge=t=>Ue(t,{condition:t=>{let n=e(t);return typeof n==`symbol`&&[O,k,Le].includes(n)},io:`input`}),Ke=[`nan`,`symbol`,`map`,`set`,`bigint`,`void`,`promise`,`never`,`function`],qe=(t,n)=>Ue(t,{io:n,condition:t=>{let r=e(t),{type:i}=t._zod.def;return!!(Ke.includes(i)||r===Te||n===`input`&&(i===`date`||r===ke)||n===`output`&&(r===De||r===k||r===O))}}),Je=(e,{variant:t,args:n,...i})=>{if(typeof e==`function`&&(e=e(...n)),e instanceof r.ZodType)return[{schema:e,...i}];if(Array.isArray(e)&&!e.length)throw new Fe(Error(`At least one ${t} response schema required.`));return(Array.isArray(e)?e:[e]).map(({schema:e,statusCode:t,mimeType:n})=>({schema:e,statusCodes:typeof t==`number`?[t]:t||i.statusCodes,mimeTypes:typeof n==`string`?[n]:n===void 0?i.mimeTypes:n}))},Ye=(e,t,{url:n},r)=>!e.expose&&t.error(`Server side error`,{error:e,url:n,payload:r}),A=e=>a(e)?e:i(e instanceof D?400:500,S(e),{cause:e.cause||e}),j=e=>Ce()&&!e.expose?i(e.statusCode).message:e.message,Xe=e=>Object.entries(e._zod.def.shape).reduce((e,[r,i])=>{let{examples:a=[]}=n.get(i)||{};return be(e,a.map(t.objOf(r)),([e,t])=>({...e,...t}))},[]),Ze=({error:e,logger:t,response:n})=>{t.error(`Result handler failure`,e);let r=j(i(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`\nOriginal error: ${e.handled.message}.`:``),{expose:a(e.cause)?e.cause.expose:!1}));n.status(500).type(`text/plain`).end(r)};var Qe=class{},M=class extends Qe{#e;#t;#n;constructor({input:e,security:t,handler:n}){super(),this.#e=e,this.#t=t,this.#n=n}get security(){return this.#t}get schema(){return this.#e}async execute({input:e,...t}){try{let n=await(this.#e||de).parseAsync(e);return this.#n({...t,input:n})}catch(e){throw e instanceof r.ZodError?new D(e):e}}},$e=class extends M{constructor(e,{provider:t=()=>({}),transformer:n=e=>e}={}){super({handler:async({request:r,response:i})=>new Promise((a,o)=>{let s=e=>{if(e&&e instanceof Error)return o(n(e));a(t(r,i))};e(r,i,s)?.catch(s)})})}},et=class{nest(e){return Object.assign(e,{"":this})}},tt=class extends et{},nt=class i extends tt{#e;#t=t.once(()=>{if(n.get(this.#e.outputSchema)?.examples?.length||!C(this.#e.outputSchema,`object`))return;let e=Xe(this.#e.outputSchema);if(!e.length)return;let t=this.#e.outputSchema.meta();n.remove(this.#e.outputSchema).add(this.#e.outputSchema,{...t,examples:e})});constructor(e){super(),this.#e=e}#n(e){return new i({...this.#e,...e})}deprecated(){return this.#n({deprecated:!0})}get isDeprecated(){return this.#e.deprecated||!1}get description(){return this.#e.description}get shortDescription(){return this.#e.shortDescription}get methods(){return Object.freeze(this.#e.methods)}get inputSchema(){return this.#e.inputSchema}get outputSchema(){return this.#t(),this.#e.outputSchema}get requestType(){let t=Ge(this.#e.inputSchema);if(t){let n=e(t);if(n===O)return`upload`;if(n===k)return`raw`;if(n===Le)return`form`}return`json`}getResponses(e){return e===`positive`&&this.#t(),Object.freeze(e===`negative`?this.#e.resultHandler.getNegativeResponse():this.#e.resultHandler.getPositiveResponse(this.#e.outputSchema))}get security(){let e=t.pluck(`security`,this.#e.middlewares||[]);return t.reject(t.isNil,e)}get scopes(){return Object.freeze(this.#e.scopes||[])}get tags(){return Object.freeze(this.#e.tags||[])}getOperationId(e){return this.#e.getOperationId?.(e)}async#r(e){try{return await this.#e.outputSchema.parseAsync(e)}catch(e){throw e instanceof r.ZodError?new Pe(e):e}}async#i({method:e,logger:t,options:n,response:r,...i}){for(let a of this.#e.middlewares||[])if(!(e===`options`&&!(a instanceof $e))&&(Object.assign(n,await a.execute({...i,options:n,response:r,logger:t})),r.writableEnded)){t.warn(`A middleware has closed the stream. Accumulated options:`,n);break}}async#a({input:e,...t}){let n;try{n=await this.#e.inputSchema.parseAsync(e)}catch(e){throw e instanceof r.ZodError?new D(e):e}return this.#e.handler({...t,input:n})}async#o(e){try{await this.#e.resultHandler.execute(e)}catch(t){Ze({...e,error:new Fe(x(t),e.error||void 0)})}}async execute({request:e,response:t,logger:n,config:r}){let i=_e(e),a={},o={output:{},error:null},s=ye(e,r.inputSources);try{if(await this.#i({method:i,input:s,request:e,response:t,logger:n,options:a}),t.writableEnded)return;if(i===`options`)return void t.status(200).end();o={output:await this.#r(await this.#a({input:s,logger:n,options:a})),error:null}}catch(e){o={output:null,error:x(e)}}await this.#o({...o,input:s,request:e,response:t,logger:n,options:a})}};const rt=(e,t)=>e&&t?e.and(t):e||t,it=(e,t)=>e?e.and(t):t,N={positive:200,negative:400},at=Object.keys(N);var ot=class{#e;constructor(e){this.#e=e}execute(...e){return this.#e(...e)}},P=class extends ot{#e;#t;constructor(e){super(e.handler),this.#e=e.positive,this.#t=e.negative}getPositiveResponse(e){return Je(this.#e,{variant:`positive`,args:[e],statusCodes:[N.positive],mimeTypes:[y.json]})}getNegativeResponse(){return Je(this.#t,{variant:`negative`,args:[],statusCodes:[N.negative],mimeTypes:[y.json]})}};const st=r.object({status:r.literal(`error`),error:r.object({message:r.string()})});n.add(st,{examples:[{status:`error`,error:{message:`Sample error message`}}]});const F=new P({positive:e=>{let t=r.object({status:r.literal(`success`),data:e}),{examples:i}=n.get(e)||{};return i?.length&&n.add(t,{examples:i.map(e=>({status:`success`,data:e}))}),t},negative:st,handler:({error:e,input:t,output:n,request:r,response:i,logger:a})=>{if(e){let n=A(e);Ye(n,a,r,t),i.status(n.statusCode).set(n.headers).json({status:`error`,error:{message:j(n)}});return}i.status(N.positive).json({status:`success`,data:n})}}),ct=r.string();n.add(ct,{examples:[`Sample error message`]});const lt=new P({positive:e=>{let t=e instanceof r.ZodObject&&`items`in e.shape&&e.shape.items instanceof r.ZodArray?e.shape.items:r.array(r.any());if(n.get(t)?.examples?.length)return t;let i=n.get(e)?.examples?.filter(e=>T(e)&&`items`in e&&Array.isArray(e.items)).map(e=>e.items);if(i?.length){let e=t.meta();n.remove(t).add(t,{...e,examples:i})}return t},negative:{schema:ct,mimeType:`text/plain`},handler:({response:e,output:t,error:n,logger:r,request:i,input:a})=>{if(n){let t=A(n);Ye(t,r,i,a),e.status(t.statusCode).type(`text/plain`).send(j(t));return}if(`items`in t&&Array.isArray(t.items)){e.status(N.positive).json(t.items);return}throw Error(`Property 'items' is missing in the endpoint output`)}});var ut=class e{schema=void 0;middlewares=[];constructor(e){this.resultHandler=e}#e(t){let n=new e(this.resultHandler);return n.middlewares=this.middlewares.concat(t),n.schema=rt(this.schema,t.schema),n}addMiddleware(e){return this.#e(e instanceof M?e:new M(e))}use=this.addExpressMiddleware;addExpressMiddleware(...e){return this.#e(new $e(...e))}addOptions(e){return this.#e(new M({handler:e}))}build({input:e=de,output:t,operationId:n,scope:r,tag:i,method:a,...o}){let{middlewares:s,resultHandler:c}=this,l=typeof a==`string`?[a]:a,u=typeof n==`function`?n:e=>n&&`${n}${e===`head`?`__HEAD`:``}`,d=typeof r==`string`?[r]:r||[],f=typeof i==`string`?[i]:i||[];return new nt({...o,middlewares:s,outputSchema:t,resultHandler:c,scopes:d,tags:f,methods:l,getOperationId:u,inputSchema:it(this.schema,e)})}buildVoid({handler:e,...t}){return this.build({...t,output:de,handler:async t=>(await e(t),{})})}};const dt=new ut(F),ft=new ut(lt),pt={debug:s,info:u,warn:d(`#FFA500`),error:p,ctx:c},mt={debug:10,info:20,warn:30,error:40},ht=e=>T(e)&&Object.keys(mt).some(t=>t in e),gt=e=>e in mt,_t=(e,t)=>mt[e]<mt[t],I=t.memoizeWith((e,t)=>`${e}${t}`,(e,t=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:t,style:`unit`,unitDisplay:`long`,unit:e})),vt=e=>e<1e-6?I(`nanosecond`,3).format(e/1e-6):e<.001?I(`nanosecond`).format(e/1e-6):e<1?I(`microsecond`).format(e/.001):e<1e3?I(`millisecond`).format(e):e<6e4?I(`second`,2).format(e/1e3):I(`minute`,2).format(e/6e4);var yt=class e{config;constructor({color:e=o.isSupported(),level:t=Ce()?`warn`:`debug`,depth:n=2,ctx:r={}}={}){this.config={color:e,level:t,depth:n,ctx:r}}format(e){let{depth:t,color:n,level:r}=this.config;return ee(e,{depth:t,colors:n,breakLength:r===`debug`?80:1/0,compact:r===`debug`?3:!0})}print(e,t,n){let{level:r,ctx:{requestId:i,...a},color:o}=this.config;if(r===`silent`||_t(e,r))return;let s=[new Date().toISOString()];i&&s.push(o?pt.ctx(i):i),s.push(o?`${pt[e](e)}:`:`${e}:`,t),n!==void 0&&s.push(this.format(n)),Object.keys(a).length>0&&s.push(this.format(a)),console.log(s.join(` `))}debug(e,t){this.print(`debug`,e,t)}info(e,t){this.print(`info`,e,t)}warn(e,t){this.print(`warn`,e,t)}error(e,t){this.print(`error`,e,t)}child(t){return new e({...this.config,ctx:t})}get ctx(){return this.config.ctx}profile(e){let t=h.now();return()=>{let n=h.now()-t,{message:r,severity:i=`debug`,formatter:a=vt}=typeof e==`object`?e:{message:e};this.print(typeof i==`function`?i(n):i,r,a(n))}}},bt=class e extends et{#e;constructor(e){super(),this.#e=e}get entries(){let e=t.filter(e=>!!e[1],Object.entries(this.#e));return Object.freeze(e)}deprecated(){return new e(Object.entries(this.#e).reduce((e,[t,n])=>Object.assign(e,{[t]:n.deprecated()}),{}))}},xt=class{#e;constructor(...e){this.#e=e}apply(e,t){return t(e,g.static(...this.#e))}};const St=async(e,t=`default`)=>{try{return(await import(e))[t]}catch{}throw new Ie(e)},Ct=e=>e.type===`object`,wt=t.mergeDeepWith((e,n)=>{if(Array.isArray(e)&&Array.isArray(n))return t.concat(e,n);if(e===n)return n;throw Error(`Can not flatten properties`,{cause:{a:e,b:n}})}),Tt=t.pipe(Object.keys,t.without([`type`,`properties`,`required`,`examples`,`description`,`additionalProperties`]),t.isEmpty),Et=t.pair(!0),Dt=(e,n=`coerce`)=>{let r=[t.pair(!1,e)],i={type:`object`,properties:{}},a=[];for(;r.length;){let[e,o]=r.shift();if(o.description&&(i.description??=o.description),o.allOf&&r.push(...o.allOf.map(r=>{if(n===`throw`&&!(r.type===`object`&&Tt(r)))throw Error(`Can not merge`);return t.pair(e,r)})),o.anyOf&&r.push(...t.map(Et,o.anyOf)),o.oneOf&&r.push(...t.map(Et,o.oneOf)),o.examples?.length&&(e?i.examples=t.concat(i.examples||[],o.examples):i.examples=be(i.examples?.filter(T)||[],o.examples.filter(T),([e,n])=>t.mergeDeepRight(e,n))),Ct(o)&&(r.push([e,{examples:Ot(o)}]),o.properties&&(i.properties=(n===`throw`?wt:t.mergeDeepRight)(i.properties,o.properties),!e&&o.required&&a.push(...o.required)),T(o.propertyNames))){let t=[];typeof o.propertyNames.const==`string`&&t.push(o.propertyNames.const),o.propertyNames.enum&&t.push(...o.propertyNames.enum.filter(e=>typeof e==`string`));let n={...Object(o.additionalProperties)};for(let e of t)i.properties[e]??=n;e||a.push(...t)}}return a.length&&(i.required=[...new Set(a)]),i},Ot=e=>Object.entries(e.properties||{}).reduce((e,[n,r])=>{let{examples:i=[]}=T(r)?r:{};return be(e,i.map(t.objOf(n)),([e,t])=>({...e,...t}))},[]);var kt=class{#e=new WeakSet;#t=new WeakMap;constructor(e){this.logger=e}checkSchema(e,t){if(!this.#e.has(e)){for(let n of[`input`,`output`]){let i=[r.toJSONSchema(e[`${n}Schema`],{unrepresentable:`any`})];for(;i.length>0;){let e=i.shift();e.type&&e.type!==`object`&&this.logger.warn(`Endpoint ${n} schema is not object-based`,t);for(let t of[`allOf`,`oneOf`,`anyOf`])e[t]&&i.push(...e[t])}}if(e.requestType===`json`){let n=qe(e.inputSchema,`input`);n&&this.logger.warn(`The final input schema of the endpoint contains an unsupported JSON payload type.`,Object.assign(t,{reason:n}))}for(let n of at)for(let{mimeTypes:r,schema:i}of e.getResponses(n)){if(!r?.includes(y.json))continue;let e=qe(i,`output`);e&&this.logger.warn(`The final ${n} response schema of the endpoint contains an unsupported JSON payload type.`,Object.assign(t,{reason:e}))}this.#e.add(e)}}checkPathParams(e,t,n){let i=this.#t.get(t);if(i?.paths.includes(e))return;let a=pe(e);if(a.length===0)return;let o=i?.flat||Dt(r.toJSONSchema(t.inputSchema,{unrepresentable:`any`,io:`input`}));for(let t of a)t in o.properties||this.logger.warn(`The input schema of the endpoint is most likely missing the parameter of the path it's assigned to.`,Object.assign(n,{path:e,param:t}));i?i.paths.push(e):this.#t.set(t,{flat:o,paths:[e]})}};const At=e=>(t,...n)=>{e(t,...n),t===`get`&&e(`head`,...n)},jt=e=>{let[t,n]=e.trim().split(/ (.+)/,2);return n&&b(t)?[n,t]:[e]},Mt=e=>e.trim().split(`/`).filter(Boolean).join(`/`),Nt=(e,t)=>Object.entries(e).map(([e,n])=>{let[r,i]=jt(e);return[[t||``].concat(Mt(r)||[]).join(`/`),n,i]}),Pt=(e,t)=>{throw new je(`Route with explicit method can only be assigned with Endpoint`,e,t)},Ft=(e,t,n)=>{if(!(!n||n.includes(e)))throw new je(`Method ${e} is not supported by the assigned Endpoint.`,e,t)},It=(e,t,n)=>{let r=`${e} ${t}`;if(n.has(r))throw new je(`Route has a duplicate`,e,t);n.add(r)},Lt=({routing:e,onEndpoint:t,onStatic:n})=>{let r=Nt(e),i=new Set;for(;r.length;){let[e,a,o]=r.shift();if(a instanceof tt)if(o)It(o,e,i),Ft(o,e,a.methods),t(o,e,a);else{let{methods:n=[`get`]}=a;for(let r of n)It(r,e,i),t(r,e,a)}else if(o&&Pt(o,e),a instanceof xt)n&&a.apply(e,n);else if(a instanceof bt)for(let[n,r]of a.entries){let{methods:a}=r;It(n,e,i),Ft(n,e,a),t(n,e,r)}else r.unshift(...Nt(a,e))}},Rt=e=>e.sort((e,t)=>b(t)-+b(e)||e.localeCompare(t)).join(`, `).toUpperCase(),zt=e=>({method:t},n,r)=>{let a=Rt(e);n.set({Allow:a}),r(i(405,`${t} is not allowed`,{headers:{Allow:a}}))},Bt=e=>({"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":Rt(e),"Access-Control-Allow-Headers":`content-type`}),Vt=({app:e,getLogger:n,config:r,routing:i,parsers:a})=>{let o=Ce()?void 0:new kt(n()),s=new Map;return Lt({routing:i,onEndpoint:(e,n,i)=>{o?.checkSchema(i,{path:n,method:e}),o?.checkPathParams(n,i,{method:e});let c=a?.[i.requestType]||[],l=t.pair(c,i);s.has(n)||s.set(n,new Map(r.cors?[[`options`,l]]:[])),s.get(n)?.set(e,l)},onStatic:e.use.bind(e)}),s},Ht=({app:e,config:t,getLogger:n,...r})=>{let i=Vt({app:e,getLogger:n,config:t,...r}),a=new Map;for(let[r,o]of i){let i=Array.from(o.keys());i.includes(`get`)&&i.push(`head`);for(let[a,[s,c]]of o){let o=s.slice().concat(async(e,r)=>{let i=n(e);return c.execute({request:e,response:r,logger:i,config:t})});t.cors&&o.unshift(async(e,r,a)=>{let o=n(e),s=Bt(i),l=typeof t.cors==`function`?await t.cors({request:e,endpoint:c,logger:o,defaultHeaders:s}):s;r.set(l),a()}),e[a](r,...o)}t.wrongMethodBehavior!==404&&a.set(r,zt(i))}for(let[t,n]of a)e.all(t,n)},Ut=e=>`_httpMessage`in e&&typeof e._httpMessage==`object`&&e._httpMessage!==null&&`headersSent`in e._httpMessage&&typeof e._httpMessage.headersSent==`boolean`&&`setHeader`in e._httpMessage&&typeof e._httpMessage.setHeader==`function`,Wt=e=>`server`in e&&typeof e.server==`object`&&e.server!==null&&`close`in e.server&&typeof e.server.close==`function`,Gt=e=>`encrypted`in e&&typeof e.encrypted==`boolean`&&e.encrypted,Kt=({},e)=>void(!e.headersSent&&e.setHeader(`connection`,`close`)),qt=e=>new Promise((t,n)=>void e.close(e=>e?n(e):t())),Jt=(e,{timeout:t=1e3,logger:n}={})=>{let r,i=new Set,a=e=>void i.delete(e.destroy()),o=e=>void(Ut(e)?!e._httpMessage.headersSent&&e._httpMessage.setHeader(`connection`,`close`):a(e)),s=e=>void(r?e.destroy():i.add(e.once(`close`,()=>void i.delete(e))));for(let t of e)for(let e of[`connection`,`secureConnection`])t.on(e,s);let c=async()=>{for(let t of e)t.on(`request`,Kt);n?.info(`Graceful shutdown`,{sockets:i.size,timeout:t});for(let e of i)(Gt(e)||Wt(e))&&o(e);for await(let e of re(10,Date.now()))if(i.size===0||Date.now()-e>=t)break;for(let e of i)a(e);return Promise.allSettled(e.map(qt))};return{sockets:i,shutdown:()=>r??=c()}},Yt=Symbol.for(`express-zod-api`),Xt=({errorHandler:e,getLogger:t})=>async(n,r,i,a)=>n?e.execute({error:x(n),request:r,response:i,input:null,output:null,options:{},logger:t(r)}):a(),Zt=({errorHandler:e,getLogger:t})=>async(n,r)=>{let a=i(404,`Can not ${n.method} ${n.path}`),o=t(n);try{await e.execute({request:n,response:r,logger:o,error:a,input:null,output:null,options:{}})}catch(e){Ze({response:r,logger:o,error:new Fe(x(e),a)})}},Qt=e=>(t,{},n)=>{if(Object.values(t?.files||[]).flat().find(({truncated:e})=>e))return n(e);n()},$t=e=>({log:e.debug.bind(e)}),en=async({getLogger:e,config:t})=>{let n=await St(`express-fileupload`),{limitError:r,beforeUpload:i,...a}={...typeof t.upload==`object`&&t.upload},o=[];return o.push(async(t,r,o)=>{let s=e(t);return await i?.({request:t,logger:s}),n({debug:!0,...a,abortOnLimit:!1,parseNested:!0,logger:$t(s)})(t,r,o)}),r&&o.push(Qt(r)),o},tn=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},nn=({logger:e,config:{childLoggerProvider:t,accessLogger:n=({method:e,path:t},n)=>n.debug(`${e}: ${t}`)}})=>async(r,i,a)=>{let o=await t?.({request:r,parent:e})||e;n?.(r,o),r.res&&(r.res.locals[Yt]={logger:o}),a()},rn=e=>t=>t?.res?.locals[Yt]?.logger||e,an=e=>process.on(`deprecation`,({message:t,namespace:n,name:r,stack:i})=>e.warn(`${r} (${n}): ${t}`,i.split(`
|
|
2
2
|
`).slice(1))),on=({servers:e,logger:t,options:{timeout:n,beforeExit:r,events:i=[`SIGINT`,`SIGTERM`]}})=>{let a=Jt(e,{logger:t,timeout:n}),o=async()=>{await a.shutdown(),await r?.(),process.exit()};for(let e of i)process.on(e,o)},sn=e=>{if(e.columns<132)return;let t=f(`Proudly supports transgender community.`.padStart(109)),n=f(`Start your API server with I/O schema validation and custom middlewares in minutes.`.padStart(109)),r=f(`Thank you for choosing Express Zod API for your project.`.padStart(132)),i=f(`for Sara`.padEnd(20)),a=d(`#F5A9B8`),o=d(`#5BCEFA`),s=Array(14).fill(o,1,3).fill(a,3,5).fill(m,5,7).fill(a,7,9).fill(o,9,12).fill(l,12,13),c=`
|
|
3
3
|
8888888888 8888888888P 888 d8888 8888888b. 8888888
|
|
4
4
|
888 d88P 888 d88888 888 Y88b 888
|
|
@@ -14,8 +14,8 @@ ${i}888${n}
|
|
|
14
14
|
${r}
|
|
15
15
|
`;e.write(c.split(`
|
|
16
16
|
`).map((e,t)=>s[t]?s[t](e):e).join(`
|
|
17
|
-
`))},cn=e=>{e.startupLogo!==!1&&sn(process.stdout);let t=e.errorHandler||F,n=ht(e.logger)?e.logger:new yt(e.logger);n.debug(`Running`,{build:`v25.5.3`,env:process.env.NODE_ENV||`development`}),an(n);let r=nn({logger:n,config:e}),i={getLogger:rn(n),errorHandler:t},a=Zt(i),o=Xt(i);return{...i,logger:n,notFoundHandler:a,catcher:o,loggingMiddleware:r}},ln=(e,t)=>{let{logger:n,getLogger:r,notFoundHandler:i,loggingMiddleware:a}=cn(e);return Ht({app:e.app.use(a),routing:t,getLogger:r,config:e}),{notFoundHandler:i,logger:n}},un=async(e,t)=>{let{logger:n,getLogger:r,notFoundHandler:i,catcher:a,loggingMiddleware:o}=cn(e),s=g().disable(`x-powered-by`).set(`query parser`,e.queryParser??`simple`).use(o);if(e.compression){let t=await St(`compression`);s.use(t(typeof e.compression==`object`?e.compression:void 0))}await e.beforeRouting?.({app:s,getLogger:r});let c={json:[e.jsonParser||g.json()],raw:[e.rawParser||g.raw(),tn],form:[e.formParser||g.urlencoded()],upload:e.upload?await en({config:e,getLogger:r}):[]};Ht({app:s,routing:t,getLogger:r,config:e,parsers:c}),s.use(a,i);let l=[],u=(e,t)=>()=>e.listen(t,()=>n.info(`Listening`,t)),d=[];if(e.http){let t=te.createServer(s);l.push(t),d.push(u(t,e.http.listen))}if(e.https){let t=ne.createServer(e.https.options,s);l.push(t),d.push(u(t,e.https.listen))}return l.length||n.warn(`No servers configured.`),e.gracefulShutdown&&on({logger:n,servers:l,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:s,logger:n,servers:d.map(e=>e())}},dn=e=>T(e)&&`or`in e,fn=e=>T(e)&&`and`in e,pn=e=>!fn(e)&&!dn(e),mn=e=>{let n=t.filter(pn,e),r=t.chain(t.prop(`and`),t.filter(fn,e)),[i,a]=t.partition(pn,r),o=t.concat(n,i),s=t.filter(dn,e);return t.map(t.prop(`or`),t.concat(s,a)).reduce((e,n)=>be(e,t.map(e=>pn(e)?[e]:e.and,n),([e,n])=>t.concat(e,n)),t.reject(t.isEmpty,[o]))};var hn=`a-im.accept.accept-additions.accept-ch.accept-charset.accept-datetime.accept-encoding.accept-features.accept-language.accept-signature.access-control.access-control-request-headers.access-control-request-method.alpn.alt-used.alternates.amp-cache-transform.apply-to-redirect-ref.authentication-control.authentication-info.authorization.available-dictionary.c-ext.c-man.c-opt.c-pep.c-pep-info.cache-control.cal-managed-id.caldav-timezones.capsule-protocol.cert-not-after.cert-not-before.client-cert.client-cert-chain.close.cmcd-object.cmcd-request.cmcd-session.cmcd-status.cmsd-dynamic.cmsd-static.concealed-auth-export.configuration-context.connection.content-digest.content-disposition.content-encoding.content-id.content-language.content-length.content-location.content-md5.content-range.content-script-type.content-type.cookie.cookie2.cross-origin-embedder-policy.cross-origin-embedder-policy-report-only.cross-origin-opener-policy.cross-origin-opener-policy-report-only.cross-origin-resource-policy.cta-common-access-token.dasl.date.dav.default-style.delta-base.deprecation.depth.derived-from.destination.detached-jws.differential-id.dictionary-id.digest.dpop.dpop-nonce.early-data.ediint-features.expect.expect-ct.ext.forwarded.from.getprofile.hobareg.host.http2-settings.if.if-match.if-modified-since.if-none-match.if-range.if-schedule-tag-match.if-unmodified-since.im.include-referred-token-binding-id.isolation.keep-alive.label.last-event-id.link.link-template.lock-token.man.max-forwards.memento-datetime.meter.method-check.method-check-expires.mime-version.negotiate.nel.odata-entityid.odata-isolation.odata-maxversion.odata-version.opt.ordering-type.origin.origin-agent-cluster.oscore.oslc-core-version.overwrite.p3p.pep.pep-info.permissions-policy.pics-label.ping-from.ping-to.position.pragma.prefer.preference-applied.priority.profileobject.protocol.protocol-info.protocol-query.protocol-request.proxy-authorization.proxy-features.proxy-instruction.public.public-key-pins.public-key-pins-report-only.range.redirect-ref.referer.referer-root.referrer-policy.repeatability-client-id.repeatability-first-sent.repeatability-request-id.repeatability-result.replay-nonce.reporting-endpoints.repr-digest.safe.schedule-reply.schedule-tag.sec-fetch-storage-access.sec-gpc.sec-purpose.sec-token-binding.sec-websocket-extensions.sec-websocket-key.sec-websocket-protocol.sec-websocket-version.security-scheme.setprofile.signature.signature-input.slug.soapaction.status-uri.sunset.surrogate-capability.tcn.te.timeout.topic.traceparent.tracestate.trailer.transfer-encoding.ttl.upgrade.urgency.uri.use-as-dictionary.user-agent.variant-vary.via.want-content-digest.want-digest.want-repr-digest.warning.x-content-type-options.x-frame-options`.split(`.`);const gn=`https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString`,_n={integer:0,number:0,string:``,boolean:!1,object:{},null:null,array:[]},vn=e=>e.replace(fe,e=>`{${e.slice(1)}}`),yn=({},e)=>{if(e.isResponse)throw new E(`Please use ez.upload() only for input.`,e);return{type:`string`,format:`binary`}},bn=({jsonSchema:e})=>({...e,externalDocs:{description:`raw binary data`,url:`https://swagger.io/specification/#working-with-binary-data`}}),xn=({zodSchema:e,jsonSchema:t})=>{if(!C(e,`union`)||!(`discriminator`in e._zod.def))return t;let n=e._zod.def.discriminator;return{...t,discriminator:t.discriminator??{propertyName:n}}},Sn=t.tryCatch(({jsonSchema:e})=>{if(!e.allOf)throw`no allOf`;return Dt(e,`throw`)},(e,{jsonSchema:t})=>t),Cn=({jsonSchema:e})=>{if(!e.anyOf)return e;let t=e.anyOf[0];return Object.assign(t,{type:kn(t.type)})},L=e=>e,wn=({jsonSchema:{examples:e,description:t}},n)=>{if(n.isResponse)throw new E(`Please use ez.dateOut() for output.`,n);let r={description:t||`YYYY-MM-DDTHH:mm:ss.sssZ`,type:`string`,format:`date-time`,pattern:`^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?Z?$`,externalDocs:{url:gn}};return e?.length&&(r.examples=e),r},Tn=({jsonSchema:{examples:e,description:t}},n)=>{if(!n.isResponse)throw new E(`Please use ez.dateIn() for input.`,n);let r={description:t||`YYYY-MM-DDTHH:mm:ss.sssZ`,type:`string`,format:`date-time`,externalDocs:{url:gn}};return e?.length&&(r.examples=e),r},En=()=>({type:`string`,format:`bigint`,pattern:`^-?\\d+$`}),Dn=({zodSchema:e,jsonSchema:t})=>e._zod.def.rest===null?{...t,items:{not:{}}}:t,On=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return _n?.[t]},kn=e=>e===`null`?e:typeof e==`string`?[e,`null`]:e&&[...new Set(e).add(`null`)],An=({zodSchema:e,jsonSchema:t},n)=>{let r=e._zod.def[n.isResponse?`out`:`in`],i=e._zod.def[n.isResponse?`in`:`out`];if(!C(r,`transform`))return t;let a=L(Ln(i,{ctx:n}));if(_(a))if(n.isResponse){let e=Se(r,On(a));if(e&&[`number`,`string`,`boolean`].includes(e))return{...t,type:e}}else{let{type:e,...t}=a;return{...t,format:`${t.format||e} (preprocessed)`}}return t},jn=({jsonSchema:e})=>{if(e.type!==`object`)return e;let t=e;return!t.properties||!(`raw`in t.properties)||!T(t.properties.raw)?e:t.properties.raw},Mn=e=>e.length?t.fromPairs(t.zip(t.times(e=>`example${e+1}`,e.length),t.map(t.objOf(`value`),e))):void 0,Nn=(e,t)=>t?.includes(e)||e.startsWith(`x-`)||hn.includes(e),Pn=({path:e,method:n,request:r,inputSources:i,makeRef:a,composition:o,isHeader:s,security:c,description:l=`${n.toUpperCase()} ${e} Parameter`})=>{let u=Dt(r),d=pe(e),f=i.includes(`query`),p=i.includes(`params`),m=i.includes(`headers`),ee=e=>p&&d.includes(e),h=t.chain(t.filter(e=>e.type===`header`),c??[]).map(({name:e})=>e),g=t=>m&&(s?.(t,n,e)??Nn(t,h));return Object.entries(u.properties).reduce((e,[n,r])=>{if(!T(r))return e;let i=ee(n)?`path`:g(n)?`header`:f?`query`:void 0;if(!i)return e;let s=L(r),c=o===`components`?a(r.id||JSON.stringify(r),s,w(l,n)):s;return e.concat({name:n,in:i,deprecated:r.deprecated,required:u.required?.includes(n)||!1,description:s.description||l,schema:c,examples:Mn(_(s)&&s.examples?.length?s.examples:t.pluck(n,u.examples?.filter(t.both(T,t.has(n)))||[]))})},[])},Fn={nullable:Cn,union:xn,bigint:En,intersection:Sn,tuple:Dn,pipe:An,[De]:wn,[ke]:Tn,[O]:yn,[k]:jn,[Te]:bn},In=(e,n,r)=>{let i=[e,n];for(;i.length;){let e=i.shift();if(t.is(Object,e)){if(ae(e)&&!e.$ref.startsWith(`#/components`)){let t=e.$ref.split(`/`).pop(),i=n[t];i&&(e.$ref=r.makeRef(i.id||i,L(i)).$ref);continue}i.push(...t.values(e))}t.is(Array,e)&&i.push(...t.values(e))}return e},Ln=(t,{ctx:n,rules:i=Fn})=>{let{$defs:a={},properties:o={}}=r.toJSONSchema(r.object({subject:t}),{unrepresentable:`any`,io:n.isResponse?`output`:`input`,override:t=>{let r=e(t.zodSchema),a=i[r&&r in i?r:t.zodSchema._zod.def.type];if(a){let e={...a(t,n)};for(let e in t.jsonSchema)delete t.jsonSchema[e];Object.assign(t.jsonSchema,e)}}});return In(T(o.subject)?o.subject:{},a,n)},Rn=(e,n)=>{if(ae(e))return[e,!1];let r=!1,i=t.map(e=>{let[t,i]=Rn(e,n);return r||=i,t}),a=t.omit(n),o={properties:a,examples:t.map(a),required:t.without(n),allOf:i,oneOf:i,anyOf:i},s=t.evolve(o,e);return[s,r||!!s.required?.length]},zn=({method:e,path:n,schema:r,mimeTypes:i,variant:a,makeRef:o,composition:s,hasMultipleStatusCodes:c,statusCode:l,brandHandling:u,description:d=`${e.toUpperCase()} ${n} ${xe(a)} response ${c?l:``}`.trim()})=>{if(!we(e,i))return{description:d};let f=L(Ln(r,{rules:{...u,...Fn},ctx:{isResponse:!0,makeRef:o,path:n,method:e}})),p=[];_(f)&&f.examples&&(p.push(...f.examples),delete f.examples);let m={schema:s===`components`?o(r,f,w(d)):f,examples:Mn(p)};return{description:d,content:t.fromPairs(t.xprod(i,[m]))}},Bn=({format:e})=>{let t={type:`http`,scheme:`bearer`};return e&&(t.bearerFormat=e),t},Vn=({name:e},t)=>{let n={type:`apiKey`,in:`query`,name:e};return t?.includes(`body`)&&(t?.includes(`query`)?(n[`x-in-alternative`]=`body`,n.description=`${e} CAN also be supplied within the request body`):(n[`x-in-actual`]=`body`,n.description=`${e} MUST be supplied within the request body instead of query`)),n},Hn=({name:e})=>({type:`apiKey`,in:`header`,name:e}),Un=({name:e})=>({type:`apiKey`,in:`cookie`,name:e}),Wn=({url:e})=>({type:`openIdConnect`,openIdConnectUrl:e}),Gn=({flows:e={}})=>({type:`oauth2`,flows:t.map(e=>({...e,scopes:e.scopes||{}}),t.reject(t.isNil,e))}),Kn=(e,t=[])=>{let n=e=>e.type===`basic`?{type:`http`,scheme:`basic`}:e.type===`bearer`?Bn(e):e.type===`input`?Vn(e,t):e.type===`header`?Hn(e):e.type===`cookie`?Un(e):e.type===`openid`?Wn(e):Gn(e);return e.map(e=>e.map(n))},qn=(e,t,n)=>e.map(e=>e.reduce((e,r)=>{let i=n(r),a=[`oauth2`,`openIdConnect`].includes(r.type);return Object.assign(e,{[i]:a?t:[]})},{})),Jn=({schema:e,brandHandling:t,makeRef:n,path:r,method:i})=>Ln(e,{rules:{...t,...Fn},ctx:{isResponse:!1,makeRef:n,path:r,method:i}}),Yn=({method:e,path:n,schema:r,request:i,mimeType:a,makeRef:o,composition:s,paramNames:c,description:l=`${e.toUpperCase()} ${n} Request body`})=>{let[u,d]=Rn(L(i),c),f=[];_(u)&&u.examples&&(f.push(...u.examples),delete u.examples);let p={schema:s===`components`?o(r,u,w(l)):u,examples:Mn(f.length?f:Dt(i).examples?.filter(e=>T(e)&&!Array.isArray(e)).map(t.omit(c))||[])},m={description:l,content:{[a]:p}};return(d||a===y.raw)&&(m.required=!0),m},Xn=e=>Object.entries(e).reduce((e,[t,n])=>{if(!n)return e;let r={name:t,description:typeof n==`string`?n:n.description};return typeof n==`object`&&n.url&&(r.externalDocs={url:n.url}),e.concat(r)},[]),Zn=e=>e.length<=50?e:e.slice(0,49)+`…`,Qn=e=>e.length?e.slice():void 0;var $n=class extends ie{#lastSecuritySchemaIds=new Map;#lastOperationIdSuffixes=new Map;#references=new Map;#makeRef(e,t,n=this.#references.get(e)){return n||(n=`Schema${this.#references.size+1}`,this.#references.set(e,n)),this.addSchema(n,t),{$ref:`#/components/schemas/${n}`}}#ensureUniqOperationId(e,t,n){let r=n||w(t,e),i=this.#lastOperationIdSuffixes.get(r);if(i===void 0)return this.#lastOperationIdSuffixes.set(r,1),r;if(n)throw new E(`Duplicated operationId: "${n}"`,{method:t,isResponse:!1,path:e});return i++,this.#lastOperationIdSuffixes.set(r,i),`${r}${i}`}#ensureUniqSecuritySchemaName(e){let t=JSON.stringify(e);for(let e in this.rootDoc.components?.securitySchemes||{})if(t===JSON.stringify(this.rootDoc.components?.securitySchemes?.[e]))return e;let n=(this.#lastSecuritySchemaIds.get(e.type)||0)+1;return this.#lastSecuritySchemaIds.set(e.type,n),`${e.type.toUpperCase()}_${n}`}constructor({routing:e,config:n,title:r,version:i,serverUrl:a,descriptions:o,brandHandling:s,tags:c,isHeader:l,hasSummaryFromDescription:u=!0,hasHeadMethod:d=!0,composition:f=`inline`}){super(),this.addInfo({title:r,version:i});for(let e of typeof a==`string`?[a]:a)this.addServer({url:e});let p=(e,r,i)=>{let a={path:r,method:e,endpoint:i,composition:f,brandHandling:s,makeRef:this.#makeRef.bind(this)},{description:c,shortDescription:d,scopes:p,inputSchema:m}=i,ee=d?Zn(d):u&&c?Zn(c):void 0,h=ve(e,n.inputSources),g=this.#ensureUniqOperationId(r,e,i.getOperationId(e)),te=Jn({...a,schema:m}),ne=mn(i.security),re=Pn({...a,inputSources:h,isHeader:l,security:ne,request:te,description:o?.requestParameter?.call(null,{method:e,path:r,operationId:g})}),ie={};for(let t of at){let n=i.getResponses(t);for(let{mimeTypes:i,schema:s,statusCodes:c}of n)for(let l of c)ie[l]=zn({...a,variant:t,schema:s,mimeTypes:i,statusCode:l,hasMultipleStatusCodes:n.length>1||c.length>1,description:o?.[`${t}Response`]?.call(null,{method:e,path:r,operationId:g,statusCode:l})})}let ae=h.includes(`body`)?Yn({...a,request:te,paramNames:t.pluck(`name`,re),schema:m,mimeType:y[i.requestType],description:o?.requestBody?.call(null,{method:e,path:r,operationId:g})}):void 0,_=qn(Kn(ne,h),p,e=>{let t=this.#ensureUniqSecuritySchemaName(e);return this.addSecurityScheme(t,e),t}),oe={operationId:g,summary:ee,description:c,deprecated:i.isDeprecated||void 0,tags:Qn(i.tags),parameters:Qn(re),requestBody:ae,security:Qn(_),responses:ie};this.addPath(vn(r),{[e]:oe})};Lt({routing:e,onEndpoint:d?At(p):p}),c&&(this.rootDoc.tags=Xn(c))}};const er=e=>oe({...e,headers:{"content-type":y.json,...e?.headers}}),tr=e=>se(e),nr=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(e,n,r){return n===`_getLogs`?()=>t:gt(n)?(...e)=>t[n].push(e):Reflect.get(e,n,r)}})},rr=({requestProps:e,responseOptions:t,configProps:n,loggerProps:r})=>{let i=er(e),a=tr({req:i,...t});a.req=t?.req||i,i.res=a;let o=nr(r),s={cors:!1,logger:o,...n};return{requestMock:i,responseMock:a,loggerMock:o,configMock:s}},ir=async({endpoint:e,...t})=>{let{requestMock:n,responseMock:r,loggerMock:i,configMock:a}=rr(t);return await e.execute({request:n,response:r,config:a,logger:i}),{requestMock:n,responseMock:r,loggerMock:i}},ar=async({middleware:e,options:t={},...n})=>{let{requestMock:r,responseMock:i,loggerMock:a,configMock:{inputSources:o,errorHandler:s=F}}=rr(n),c=ye(r,o),l={request:r,response:i,logger:a,input:c,options:t};try{let t=await e.execute(l);return{requestMock:r,responseMock:i,loggerMock:a,output:t}}catch(e){return await s.execute({...l,error:x(e),output:null}),{requestMock:r,responseMock:i,loggerMock:a,output:{}}}},R=v.factory,or=[R.createModifier(v.SyntaxKind.ExportKeyword)],sr=[R.createModifier(v.SyntaxKind.AsyncKeyword)],cr={public:[R.createModifier(v.SyntaxKind.PublicKeyword)],protectedReadonly:[R.createModifier(v.SyntaxKind.ProtectedKeyword),R.createModifier(v.SyntaxKind.ReadonlyKeyword)]},lr=(e,t)=>v.addSyntheticLeadingComment(e,v.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),ur=(e,t)=>{let n=v.createSourceFile(`print.ts`,``,v.ScriptTarget.Latest,!1,v.ScriptKind.TS);return v.createPrinter(t).printNode(v.EmitHint.Unspecified,e,n)},dr=/^[A-Za-z_$][A-Za-z0-9_$]*$/,fr=e=>typeof e==`string`&&dr.test(e)?R.createIdentifier(e):Y(e),pr=(e,...t)=>R.createTemplateExpression(R.createTemplateHead(e),t.map(([e,n=``],r)=>R.createTemplateSpan(e,r===t.length-1?R.createTemplateTail(n):R.createTemplateMiddle(n)))),mr=(e,{type:t,mod:n,init:r,optional:i}={})=>R.createParameterDeclaration(n,void 0,e,i?R.createToken(v.SyntaxKind.QuestionToken):void 0,t?B(t):void 0,r),z=e=>Object.entries(e).map(([e,t])=>mr(e,typeof t==`string`||typeof t==`number`||typeof t==`object`&&`kind`in t?{type:t}:t)),hr=(e,t=[])=>R.createConstructorDeclaration(cr.public,e,R.createBlock(t)),B=(e,n)=>typeof e==`number`?R.createKeywordTypeNode(e):typeof e==`string`||v.isIdentifier(e)?R.createTypeReferenceNode(e,n&&t.map(B,n)):e,gr=B(`Record`,[v.SyntaxKind.StringKeyword,v.SyntaxKind.AnyKeyword]),V=e=>{let t=new Map;for(let n of e)t.set(Pr(n)?n.kind:n,n);return R.createUnionTypeNode(Array.from(t.values()))},_r=(e,n,{isOptional:r,isDeprecated:i,comment:a}={})=>{let o=B(n),s=R.createPropertySignature(void 0,fr(e),r?R.createToken(v.SyntaxKind.QuestionToken):void 0,r?V([o,B(v.SyntaxKind.UndefinedKeyword)]):o),c=t.reject(t.isNil,[i?`@deprecated`:void 0,a]);return c.length?lr(s,c.join(` `)):s},vr=e=>v.setEmitFlags(e,v.EmitFlags.SingleLine),yr=(...e)=>R.createArrayBindingPattern(e.map(e=>R.createBindingElement(void 0,void 0,e))),H=(e,t,{type:n,expose:r}={})=>R.createVariableStatement(r&&or,R.createVariableDeclarationList([R.createVariableDeclaration(e,void 0,n?B(n):void 0,t)],v.NodeFlags.Const)),br=(e,n)=>U(e,V(t.map(X,n)),{expose:!0}),U=(e,t,{expose:n,comment:r,params:i}={})=>{let a=R.createTypeAliasDeclaration(n?or:void 0,e,i&&Dr(i),t);return r?lr(a,r):a},xr=(e,t)=>R.createPropertyDeclaration(cr.public,e,void 0,B(t),void 0),Sr=(e,t,n,{typeParams:r,returns:i}={})=>R.createMethodDeclaration(cr.public,void 0,e,void 0,r&&Dr(r),t,i,R.createBlock(n)),Cr=(e,t,{typeParams:n}={})=>R.createClassDeclaration(or,e,n&&Dr(n),void 0,t),wr=e=>R.createTypeOperatorNode(v.SyntaxKind.KeyOfKeyword,B(e)),Tr=e=>B(Promise.name,[e]),Er=(e,t,{expose:n,comment:r}={})=>{let i=R.createInterfaceDeclaration(n?or:void 0,e,void 0,void 0,t);return r?lr(i,r):i},Dr=e=>(Array.isArray(e)?e.map(e=>t.pair(e,void 0)):Object.entries(e)).map(([e,t])=>{let{type:n,init:r}=typeof t==`object`&&`init`in t?t:{type:t};return R.createTypeParameterDeclaration([],e,n?B(n):void 0,r?B(r):void 0)}),W=(e,n,{isAsync:r}={})=>R.createArrowFunction(r?sr:void 0,void 0,Array.isArray(e)?t.map(mr,e):z(e),void 0,void 0,n),G=e=>e,Or=(e,t,n)=>R.createConditionalExpression(e,R.createToken(v.SyntaxKind.QuestionToken),t,R.createToken(v.SyntaxKind.ColonToken),n),K=(e,...t)=>(...n)=>R.createCallExpression(t.reduce((e,t)=>typeof t==`string`||v.isIdentifier(t)?R.createPropertyAccessExpression(e,t):R.createElementAccessExpression(e,t),typeof e==`string`?R.createIdentifier(e):e),void 0,n),q=(e,...t)=>R.createNewExpression(R.createIdentifier(e),void 0,t),kr=(e,t)=>B(`Extract`,[e,t]),Ar=(e,t)=>R.createExpressionStatement(R.createBinaryExpression(e,R.createToken(v.SyntaxKind.EqualsToken),t)),J=(e,t)=>R.createIndexedAccessTypeNode(B(e),B(t)),jr=e=>V([B(e),Tr(e)]),Mr=(e,t)=>R.createFunctionTypeNode(void 0,z(e),B(t)),Y=e=>typeof e==`number`?R.createNumericLiteral(e):typeof e==`bigint`?R.createBigIntLiteral(e.toString()):typeof e==`boolean`?e?R.createTrue():R.createFalse():e===null?R.createNull():R.createStringLiteral(e),X=e=>R.createLiteralTypeNode(Y(e)),Nr=[v.SyntaxKind.AnyKeyword,v.SyntaxKind.BigIntKeyword,v.SyntaxKind.BooleanKeyword,v.SyntaxKind.NeverKeyword,v.SyntaxKind.NumberKeyword,v.SyntaxKind.ObjectKeyword,v.SyntaxKind.StringKeyword,v.SyntaxKind.SymbolKeyword,v.SyntaxKind.UndefinedKeyword,v.SyntaxKind.UnknownKeyword,v.SyntaxKind.VoidKeyword],Pr=e=>Nr.includes(e.kind);var Fr=class{paths=new Set;tags=new Map;registry=new Map;#ids={pathType:R.createIdentifier(`Path`),implementationType:R.createIdentifier(`Implementation`),keyParameter:R.createIdentifier(`key`),pathParameter:R.createIdentifier(`path`),paramsArgument:R.createIdentifier(`params`),ctxArgument:R.createIdentifier(`ctx`),methodParameter:R.createIdentifier(`method`),requestParameter:R.createIdentifier(`request`),eventParameter:R.createIdentifier(`event`),dataParameter:R.createIdentifier(`data`),handlerParameter:R.createIdentifier(`handler`),msgParameter:R.createIdentifier(`msg`),parseRequestFn:R.createIdentifier(`parseRequest`),substituteFn:R.createIdentifier(`substitute`),provideMethod:R.createIdentifier(`provide`),onMethod:R.createIdentifier(`on`),implementationArgument:R.createIdentifier(`implementation`),hasBodyConst:R.createIdentifier(`hasBody`),undefinedValue:R.createIdentifier(`undefined`),responseConst:R.createIdentifier(`response`),restConst:R.createIdentifier(`rest`),searchParamsConst:R.createIdentifier(`searchParams`),defaultImplementationConst:R.createIdentifier(`defaultImplementation`),clientConst:R.createIdentifier(`client`),contentTypeConst:R.createIdentifier(`contentType`),isJsonConst:R.createIdentifier(`isJSON`),sourceProp:R.createIdentifier(`source`)};interfaces={input:R.createIdentifier(`Input`),positive:R.createIdentifier(`PositiveResponse`),negative:R.createIdentifier(`NegativeResponse`),encoded:R.createIdentifier(`EncodedResponse`),response:R.createIdentifier(`Response`)};methodType=br(`Method`,ue);someOfType=U(`SomeOf`,J(`T`,wr(`T`)),{params:[`T`]});requestType=U(`Request`,wr(this.interfaces.input),{expose:!0});constructor(e){this.serverUrl=e}someOf=({name:e})=>B(this.someOfType.name,[e]);makePathType=()=>br(this.#ids.pathType,Array.from(this.paths));makePublicInterfaces=()=>Object.keys(this.interfaces).map(e=>Er(this.interfaces[e],Array.from(this.registry).map(([t,{store:n,isDeprecated:r}])=>_r(t,n[e],{isDeprecated:r})),{expose:!0}));makeEndpointTags=()=>H(`endpointTags`,R.createObjectLiteralExpression(Array.from(this.tags).map(([e,n])=>R.createPropertyAssignment(fr(e),R.createArrayLiteralExpression(t.map(Y,n))))),{expose:!0});makeImplementationType=()=>U(this.#ids.implementationType,Mr({[this.#ids.methodParameter.text]:this.methodType.name,[this.#ids.pathParameter.text]:v.SyntaxKind.StringKeyword,[this.#ids.paramsArgument.text]:gr,[this.#ids.ctxArgument.text]:{optional:!0,type:`T`}},Tr(v.SyntaxKind.AnyKeyword)),{expose:!0,params:{T:{init:v.SyntaxKind.UnknownKeyword}}});makeParseRequestFn=()=>H(this.#ids.parseRequestFn,W({[this.#ids.requestParameter.text]:v.SyntaxKind.StringKeyword},R.createAsExpression(K(this.#ids.requestParameter,G(`split`))(R.createRegularExpressionLiteral(`/ (.+)/`),Y(2)),R.createTupleTypeNode([B(this.methodType.name),B(this.#ids.pathType)]))));makeSubstituteFn=()=>H(this.#ids.substituteFn,W({[this.#ids.pathParameter.text]:v.SyntaxKind.StringKeyword,[this.#ids.paramsArgument.text]:gr},R.createBlock([H(this.#ids.restConst,R.createObjectLiteralExpression([R.createSpreadAssignment(this.#ids.paramsArgument)])),R.createForInStatement(R.createVariableDeclarationList([R.createVariableDeclaration(this.#ids.keyParameter)],v.NodeFlags.Const),this.#ids.paramsArgument,R.createBlock([Ar(this.#ids.pathParameter,K(this.#ids.pathParameter,G(`replace`))(pr(`:`,[this.#ids.keyParameter]),W([],R.createBlock([R.createExpressionStatement(R.createDeleteExpression(R.createElementAccessExpression(this.#ids.restConst,this.#ids.keyParameter))),R.createReturnStatement(R.createElementAccessExpression(this.#ids.paramsArgument,this.#ids.keyParameter))]))))])),R.createReturnStatement(R.createAsExpression(R.createArrayLiteralExpression([this.#ids.pathParameter,this.#ids.restConst]),B(`const`)))])));#makeProvider=()=>Sr(this.#ids.provideMethod,z({[this.#ids.requestParameter.text]:`K`,[this.#ids.paramsArgument.text]:J(this.interfaces.input,`K`),[this.#ids.ctxArgument.text]:{optional:!0,type:`T`}}),[H(yr(this.#ids.methodParameter,this.#ids.pathParameter),K(this.#ids.parseRequestFn)(this.#ids.requestParameter)),R.createReturnStatement(K(R.createThis(),this.#ids.implementationArgument)(this.#ids.methodParameter,R.createSpreadElement(K(this.#ids.substituteFn)(this.#ids.pathParameter,this.#ids.paramsArgument)),this.#ids.ctxArgument))],{typeParams:{K:this.requestType.name},returns:Tr(J(this.interfaces.response,`K`))});makeClientClass=e=>Cr(e,[hr([mr(this.#ids.implementationArgument,{type:B(this.#ids.implementationType,[`T`]),mod:cr.protectedReadonly,init:this.#ids.defaultImplementationConst})]),this.#makeProvider()],{typeParams:[`T`]});#makeSearchParams=e=>pr(`?`,[q(URLSearchParams.name,e)]);#makeFetchURL=()=>q(URL.name,pr(``,[this.#ids.pathParameter],[this.#ids.searchParamsConst]),Y(this.serverUrl));makeDefaultImplementation=()=>{let e=R.createPropertyAssignment(G(`method`),K(this.#ids.methodParameter,G(`toUpperCase`))()),t=R.createPropertyAssignment(G(`headers`),Or(this.#ids.hasBodyConst,R.createObjectLiteralExpression([R.createPropertyAssignment(Y(`Content-Type`),Y(y.json))]),this.#ids.undefinedValue)),n=R.createPropertyAssignment(G(`body`),Or(this.#ids.hasBodyConst,K(JSON[Symbol.toStringTag],G(`stringify`))(this.#ids.paramsArgument),this.#ids.undefinedValue)),r=H(this.#ids.responseConst,R.createAwaitExpression(K(fetch.name)(this.#makeFetchURL(),R.createObjectLiteralExpression([e,t,n])))),i=H(this.#ids.hasBodyConst,R.createLogicalNot(K(R.createArrayLiteralExpression([Y(`get`),Y(`head`),Y(`delete`)]),G(`includes`))(this.#ids.methodParameter))),a=H(this.#ids.searchParamsConst,Or(this.#ids.hasBodyConst,Y(``),this.#makeSearchParams(this.#ids.paramsArgument))),o=H(this.#ids.contentTypeConst,K(this.#ids.responseConst,G(`headers`),G(`get`))(Y(`content-type`))),s=R.createIfStatement(R.createPrefixUnaryExpression(v.SyntaxKind.ExclamationToken,this.#ids.contentTypeConst),R.createReturnStatement()),c=H(this.#ids.isJsonConst,K(this.#ids.contentTypeConst,G(`startsWith`))(Y(y.json))),l=R.createReturnStatement(K(this.#ids.responseConst,Or(this.#ids.isJsonConst,Y(G(`json`)),Y(G(`text`))))());return H(this.#ids.defaultImplementationConst,W([this.#ids.methodParameter,this.#ids.pathParameter,this.#ids.paramsArgument],R.createBlock([i,a,r,o,s,c,l]),{isAsync:!0}),{type:this.#ids.implementationType})};#makeSubscriptionConstructor=()=>hr(z({request:`K`,params:J(this.interfaces.input,`K`)}),[H(yr(this.#ids.pathParameter,this.#ids.restConst),K(this.#ids.substituteFn)(R.createElementAccessExpression(K(this.#ids.parseRequestFn)(this.#ids.requestParameter),Y(1)),this.#ids.paramsArgument)),H(this.#ids.searchParamsConst,this.#makeSearchParams(this.#ids.restConst)),Ar(R.createPropertyAccessExpression(R.createThis(),this.#ids.sourceProp),q(`EventSource`,this.#makeFetchURL()))]);#makeEventNarrow=e=>R.createTypeLiteralNode([_r(G(`event`),e)]);#makeOnMethod=()=>Sr(this.#ids.onMethod,z({[this.#ids.eventParameter.text]:`E`,[this.#ids.handlerParameter.text]:Mr({[this.#ids.dataParameter.text]:J(kr(`R`,vr(this.#makeEventNarrow(`E`))),X(G(`data`)))},jr(v.SyntaxKind.VoidKeyword))}),[R.createExpressionStatement(K(R.createThis(),this.#ids.sourceProp,G(`addEventListener`))(this.#ids.eventParameter,W([this.#ids.msgParameter],K(this.#ids.handlerParameter)(K(JSON[Symbol.toStringTag],G(`parse`))(R.createPropertyAccessExpression(R.createParenthesizedExpression(R.createAsExpression(this.#ids.msgParameter,B(MessageEvent.name))),G(`data`))))))),R.createReturnStatement(R.createThis())],{typeParams:{E:J(`R`,X(G(`event`)))}});makeSubscriptionClass=e=>Cr(e,[xr(this.#ids.sourceProp,`EventSource`),this.#makeSubscriptionConstructor(),this.#makeOnMethod()],{typeParams:{K:kr(this.requestType.name,R.createTemplateLiteralType(R.createTemplateHead(`get `),[R.createTemplateLiteralTypeSpan(B(v.SyntaxKind.StringKeyword),R.createTemplateTail(``))])),R:kr(J(this.interfaces.positive,`K`),vr(this.#makeEventNarrow(v.SyntaxKind.StringKeyword)))}});makeUsageStatements=(e,t)=>[H(this.#ids.clientConst,q(e)),K(this.#ids.clientConst,this.#ids.provideMethod)(Y(`get /v1/user/retrieve`),R.createObjectLiteralExpression([R.createPropertyAssignment(`id`,Y(`10`))])),K(q(t,Y(`get /v1/events/stream`),R.createObjectLiteralExpression()),this.#ids.onMethod)(Y(`time`),W([`time`],R.createBlock([])))]};const Ir=(t,{onEach:n,rules:r,onMissing:i,ctx:a={}})=>{let o=e(t),s=o&&o in r?r[o]:r[t._zod.def.type],c=e=>Ir(e,{ctx:a,onEach:n,rules:r,onMissing:i}),l=s?s(t,{...a,next:c}):i(t,a),u=n&&n(t,{prev:l,...a});return u?{...l,...u}:l},{factory:Z}=v,Lr={[v.SyntaxKind.AnyKeyword]:``,[v.SyntaxKind.BigIntKeyword]:BigInt(0),[v.SyntaxKind.BooleanKeyword]:!1,[v.SyntaxKind.NumberKeyword]:0,[v.SyntaxKind.ObjectKeyword]:{},[v.SyntaxKind.StringKeyword]:``,[v.SyntaxKind.UndefinedKeyword]:void 0},Rr={name:t.path([`name`,`text`]),type:t.path([`type`]),optional:t.path([`questionToken`])},zr=({_zod:{def:e}})=>{let t=e.values.map(e=>e===void 0?B(v.SyntaxKind.UndefinedKeyword):X(e));return t.length===1?t[0]:V(t)},Br=({_zod:{def:e}},{next:t})=>{let n=[...e.parts],r=()=>{let e=``;for(;n.length;){let t=n.shift();if(C(t)){n.unshift(t);break}e+=t??``}return e},i=Z.createTemplateHead(r()),a=[];for(;n.length;){let e=t(n.shift()),i=r(),o=n.length?Z.createTemplateMiddle:Z.createTemplateTail;a.push(Z.createTemplateLiteralTypeSpan(e,o(i)))}return a.length?Z.createTemplateLiteralType(i,a):X(i.text)},Vr=(e,{isResponse:t,next:r,makeAlias:i})=>{let a=()=>{let i=Object.entries(e._zod.def.shape).map(([e,i])=>{let{description:a,deprecated:o}=n.get(i)||{};return _r(e,r(i),{comment:a,isDeprecated:o,isOptional:(t?i._zod.optout:i._zod.optin)===`optional`})});return Z.createTypeLiteralNode(i)};return We(e,{io:t?`output`:`input`})?i(e,a):a()},Hr=({_zod:{def:e}},{next:t})=>Z.createArrayTypeNode(t(e.element)),Ur=({_zod:{def:e}})=>V(Object.values(e.entries).map(X)),Wr=({_zod:{def:e}},{next:t})=>V(e.options.map(t)),Gr=e=>Lr?.[e.kind],Kr=({_zod:{def:e}},{next:t})=>V([t(e.innerType),X(null)]),qr=({_zod:{def:e}},{next:t})=>Z.createTupleTypeNode(e.items.map(t).concat(e.rest===null?[]:Z.createRestTypeNode(t(e.rest)))),Jr=({_zod:{def:e}},{next:t})=>B(`Record`,[e.keyType,e.valueType].map(t)),Yr=t.tryCatch(e=>{if(!e.every(v.isTypeLiteralNode))throw Error(`Not objects`);let n=t.chain(t.prop(`members`),e),r=t.uniqWith((...e)=>{if(!t.eqBy(Rr.name,...e))return!1;if(t.both(t.eqBy(Rr.type),t.eqBy(Rr.optional))(...e))return!0;throw Error(`Has conflicting prop`)},n);return Z.createTypeLiteralNode(r)},(e,t)=>Z.createIntersectionTypeNode(t)),Xr=({_zod:{def:e}},{next:t})=>Yr([e.left,e.right].map(t)),Q=e=>()=>B(e),$=({_zod:{def:e}},{next:t})=>t(e.innerType),Zr=e=>B(e?v.SyntaxKind.UnknownKeyword:v.SyntaxKind.AnyKeyword),Qr=({_zod:{def:e}},{next:t,isResponse:n})=>{let r=e[n?`out`:`in`],i=e[n?`in`:`out`];if(!C(r,`transform`))return t(r);let a=t(i),o=Se(r,Gr(a)),s={number:v.SyntaxKind.NumberKeyword,bigint:v.SyntaxKind.BigIntKeyword,boolean:v.SyntaxKind.BooleanKeyword,string:v.SyntaxKind.StringKeyword,undefined:v.SyntaxKind.UndefinedKeyword,object:v.SyntaxKind.ObjectKeyword};return B(o&&s[o]||Zr(n))},$r=()=>X(null),ei=({_zod:{def:e}},{makeAlias:t,next:n})=>t(e.getter,()=>n(e.getter())),ti=()=>B(`Buffer`),ni=(e,{next:t})=>t(e._zod.def.shape.raw),ri={string:Q(v.SyntaxKind.StringKeyword),number:Q(v.SyntaxKind.NumberKeyword),bigint:Q(v.SyntaxKind.BigIntKeyword),boolean:Q(v.SyntaxKind.BooleanKeyword),any:Q(v.SyntaxKind.AnyKeyword),undefined:Q(v.SyntaxKind.UndefinedKeyword),[De]:Q(v.SyntaxKind.StringKeyword),[ke]:Q(v.SyntaxKind.StringKeyword),never:Q(v.SyntaxKind.NeverKeyword),void:Q(v.SyntaxKind.UndefinedKeyword),unknown:Q(v.SyntaxKind.UnknownKeyword),null:$r,array:Hr,tuple:qr,record:Jr,object:Vr,literal:zr,template_literal:Br,intersection:Xr,union:Wr,default:$,enum:Ur,optional:$,nonoptional:$,nullable:Kr,catch:$,pipe:Qr,lazy:ei,readonly:$,[Te]:ti,[k]:ni},ii=(e,{brandHandling:t,ctx:n})=>Ir(e,{rules:{...t,...ri},onMissing:({},{isResponse:e})=>Zr(e),ctx:n});var ai=class extends Fr{#program=[this.someOfType];#aliases=new Map;#usage=[];#makeAlias(e,t){let n=this.#aliases.get(e)?.name?.text;if(!n){n=`Type${this.#aliases.size+1}`;let r=X(null);this.#aliases.set(e,U(n,r)),this.#aliases.set(e,U(n,t()))}return B(n)}constructor({routing:e,brandHandling:n,variant:i=`client`,clientClassName:a=`Client`,subscriptionClassName:o=`Subscription`,serverUrl:s=`https://example.com`,noContent:c=r.undefined(),hasHeadMethod:l=!0}){super(s);let u={makeAlias:this.#makeAlias.bind(this)},d={brandHandling:n,ctx:{...u,isResponse:!1}},f={brandHandling:n,ctx:{...u,isResponse:!0}},p=(e,n,r)=>{let i=w.bind(null,e,n),{isDeprecated:a,inputSchema:o,tags:s}=r,l=`${e} ${n}`,u=U(i(`input`),ii(o,d),{comment:l});this.#program.push(u);let p=at.reduce((n,a)=>{let o=r.getResponses(a),s=t.chain(([t,{schema:n,mimeTypes:r,statusCodes:o}])=>{let s=we(e,r),u=U(i(a,`variant`,`${t+1}`),ii(s?n:c,f),{comment:l});return this.#program.push(u),o.map(e=>_r(e,u.name))},Array.from(o.entries())),u=Er(i(a,`response`,`variants`),s,{comment:l});return this.#program.push(u),Object.assign(n,{[a]:u})},{});this.paths.add(n);let m=X(l),ee={input:B(u.name),positive:this.someOf(p.positive),negative:this.someOf(p.negative),response:V([J(this.interfaces.positive,m),J(this.interfaces.negative,m)]),encoded:R.createIntersectionTypeNode([B(p.positive.name),B(p.negative.name)])};this.registry.set(l,{isDeprecated:a,store:ee}),this.tags.set(l,s)};Lt({routing:e,onEndpoint:l?At(p):p}),this.#program.unshift(...this.#aliases.values()),this.#program.push(this.makePathType(),this.methodType,...this.makePublicInterfaces(),this.requestType),i!==`types`&&(this.#program.push(this.makeEndpointTags(),this.makeParseRequestFn(),this.makeSubstituteFn(),this.makeImplementationType(),this.makeDefaultImplementation(),this.makeClientClass(a),this.makeSubscriptionClass(o)),this.#usage.push(...this.makeUsageStatements(a,o)))}#printUsage(e){return this.#usage.length?this.#usage.map(t=>typeof t==`string`?t:ur(t,e)).join(`
|
|
18
|
-
`):void 0}print(e){let t=this.#
|
|
17
|
+
`))},cn=e=>{e.startupLogo!==!1&&sn(process.stdout);let t=e.errorHandler||F,n=ht(e.logger)?e.logger:new yt(e.logger);n.debug(`Running`,{build:`v25.6.1`,env:process.env.NODE_ENV||`development`}),an(n);let r=nn({logger:n,config:e}),i={getLogger:rn(n),errorHandler:t},a=Zt(i),o=Xt(i);return{...i,logger:n,notFoundHandler:a,catcher:o,loggingMiddleware:r}},ln=(e,t)=>{let{logger:n,getLogger:r,notFoundHandler:i,loggingMiddleware:a}=cn(e);return Ht({app:e.app.use(a),routing:t,getLogger:r,config:e}),{notFoundHandler:i,logger:n}},un=async(e,t)=>{let{logger:n,getLogger:r,notFoundHandler:i,catcher:a,loggingMiddleware:o}=cn(e),s=g().disable(`x-powered-by`).set(`query parser`,e.queryParser??`simple`).use(o);if(e.compression){let t=await St(`compression`);s.use(t(typeof e.compression==`object`?e.compression:void 0))}await e.beforeRouting?.({app:s,getLogger:r}),Ht({app:s,routing:t,getLogger:r,config:e,parsers:{json:[e.jsonParser||g.json()],raw:[e.rawParser||g.raw(),tn],form:[e.formParser||g.urlencoded()],upload:e.upload?await en({config:e,getLogger:r}):[]}}),await e.afterRouting?.({app:s,getLogger:r}),s.use(a,i);let c=[],l=(e,t)=>()=>e.listen(t,()=>n.info(`Listening`,t)),u=[];if(e.http){let t=te.createServer(s);c.push(t),u.push(l(t,e.http.listen))}if(e.https){let t=ne.createServer(e.https.options,s);c.push(t),u.push(l(t,e.https.listen))}return c.length||n.warn(`No servers configured.`),e.gracefulShutdown&&on({logger:n,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:s,logger:n,servers:u.map(e=>e())}},dn=e=>T(e)&&`or`in e,fn=e=>T(e)&&`and`in e,pn=e=>!fn(e)&&!dn(e),mn=e=>{let n=t.filter(pn,e),r=t.chain(t.prop(`and`),t.filter(fn,e)),[i,a]=t.partition(pn,r),o=t.concat(n,i),s=t.filter(dn,e);return t.map(t.prop(`or`),t.concat(s,a)).reduce((e,n)=>be(e,t.map(e=>pn(e)?[e]:e.and,n),([e,n])=>t.concat(e,n)),t.reject(t.isEmpty,[o]))};var hn=`a-im.accept.accept-additions.accept-ch.accept-charset.accept-datetime.accept-encoding.accept-features.accept-language.accept-signature.access-control.access-control-request-headers.access-control-request-method.alpn.alt-used.alternates.amp-cache-transform.apply-to-redirect-ref.authentication-control.authentication-info.authorization.available-dictionary.c-ext.c-man.c-opt.c-pep.c-pep-info.cache-control.cal-managed-id.caldav-timezones.capsule-protocol.cert-not-after.cert-not-before.client-cert.client-cert-chain.close.cmcd-object.cmcd-request.cmcd-session.cmcd-status.cmsd-dynamic.cmsd-static.concealed-auth-export.configuration-context.connection.content-digest.content-disposition.content-encoding.content-id.content-language.content-length.content-location.content-md5.content-range.content-script-type.content-type.cookie.cookie2.cross-origin-embedder-policy.cross-origin-embedder-policy-report-only.cross-origin-opener-policy.cross-origin-opener-policy-report-only.cross-origin-resource-policy.cta-common-access-token.dasl.date.dav.default-style.delta-base.deprecation.depth.derived-from.destination.detached-jws.differential-id.dictionary-id.digest.dpop.dpop-nonce.early-data.ediint-features.expect.expect-ct.ext.forwarded.from.getprofile.hobareg.host.http2-settings.if.if-match.if-modified-since.if-none-match.if-range.if-schedule-tag-match.if-unmodified-since.im.include-referred-token-binding-id.isolation.keep-alive.label.last-event-id.link.link-template.lock-token.man.max-forwards.memento-datetime.meter.method-check.method-check-expires.mime-version.negotiate.nel.odata-entityid.odata-isolation.odata-maxversion.odata-version.opt.ordering-type.origin.origin-agent-cluster.oscore.oslc-core-version.overwrite.p3p.pep.pep-info.permissions-policy.pics-label.ping-from.ping-to.position.pragma.prefer.preference-applied.priority.profileobject.protocol.protocol-info.protocol-query.protocol-request.proxy-authorization.proxy-features.proxy-instruction.public.public-key-pins.public-key-pins-report-only.range.redirect-ref.referer.referer-root.referrer-policy.repeatability-client-id.repeatability-first-sent.repeatability-request-id.repeatability-result.replay-nonce.reporting-endpoints.repr-digest.safe.schedule-reply.schedule-tag.sec-fetch-storage-access.sec-gpc.sec-purpose.sec-token-binding.sec-websocket-extensions.sec-websocket-key.sec-websocket-protocol.sec-websocket-version.security-scheme.setprofile.signature.signature-input.slug.soapaction.status-uri.sunset.surrogate-capability.tcn.te.timeout.topic.traceparent.tracestate.trailer.transfer-encoding.ttl.upgrade.urgency.uri.use-as-dictionary.user-agent.variant-vary.via.want-content-digest.want-digest.want-repr-digest.warning.x-content-type-options.x-frame-options`.split(`.`);const gn=`https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString`,_n={integer:0,number:0,string:``,boolean:!1,object:{},null:null,array:[]},vn=e=>e.replace(fe,e=>`{${e.slice(1)}}`),yn=({},e)=>{if(e.isResponse)throw new E(`Please use ez.upload() only for input.`,e);return{type:`string`,format:`binary`}},bn=({jsonSchema:e})=>({...e,externalDocs:{description:`raw binary data`,url:`https://swagger.io/specification/#working-with-binary-data`}}),xn=({zodSchema:e,jsonSchema:t})=>{if(!C(e,`union`)||!(`discriminator`in e._zod.def))return t;let n=e._zod.def.discriminator;return{...t,discriminator:t.discriminator??{propertyName:n}}},Sn=t.tryCatch(({jsonSchema:e})=>{if(!e.allOf)throw`no allOf`;return Dt(e,`throw`)},(e,{jsonSchema:t})=>t),Cn=({jsonSchema:e})=>{if(!e.anyOf)return e;let t=e.anyOf[0];return Object.assign(t,{type:kn(t.type)})},L=e=>e,wn=({jsonSchema:{examples:e,description:t}},n)=>{if(n.isResponse)throw new E(`Please use ez.dateOut() for output.`,n);let r={description:t||`YYYY-MM-DDTHH:mm:ss.sssZ`,type:`string`,format:`date-time`,pattern:`^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?Z?$`,externalDocs:{url:gn}};return e?.length&&(r.examples=e),r},Tn=({jsonSchema:{examples:e,description:t}},n)=>{if(!n.isResponse)throw new E(`Please use ez.dateIn() for input.`,n);let r={description:t||`YYYY-MM-DDTHH:mm:ss.sssZ`,type:`string`,format:`date-time`,externalDocs:{url:gn}};return e?.length&&(r.examples=e),r},En=()=>({type:`string`,format:`bigint`,pattern:`^-?\\d+$`}),Dn=({zodSchema:e,jsonSchema:t})=>e._zod.def.rest===null?{...t,items:{not:{}}}:t,On=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return _n?.[t]},kn=e=>e===`null`?e:typeof e==`string`?[e,`null`]:e&&[...new Set(e).add(`null`)],An=({zodSchema:e,jsonSchema:t},n)=>{let r=e._zod.def[n.isResponse?`out`:`in`],i=e._zod.def[n.isResponse?`in`:`out`];if(!C(r,`transform`))return t;let a=L(Ln(i,{ctx:n}));if(_(a))if(n.isResponse){let e=Se(r,On(a));if(e&&[`number`,`string`,`boolean`].includes(e))return{...t,type:e}}else{let{type:e,...t}=a;return{...t,format:`${t.format||e} (preprocessed)`}}return t},jn=({jsonSchema:e})=>{if(e.type!==`object`)return e;let t=e;return!t.properties||!(`raw`in t.properties)||!T(t.properties.raw)?e:t.properties.raw},Mn=e=>e.length?t.fromPairs(t.zip(t.times(e=>`example${e+1}`,e.length),t.map(t.objOf(`value`),e))):void 0,Nn=(e,t)=>t?.includes(e)||e.startsWith(`x-`)||hn.includes(e),Pn=({path:e,method:n,request:r,inputSources:i,makeRef:a,composition:o,isHeader:s,security:c,description:l=`${n.toUpperCase()} ${e} Parameter`})=>{let u=Dt(r),d=pe(e),f=i.includes(`query`),p=i.includes(`params`),m=i.includes(`headers`),ee=e=>p&&d.includes(e),h=t.chain(t.filter(e=>e.type===`header`),c??[]).map(({name:e})=>e),g=t=>m&&(s?.(t,n,e)??Nn(t,h));return Object.entries(u.properties).reduce((e,[n,r])=>{if(!T(r))return e;let i=ee(n)?`path`:g(n)?`header`:f?`query`:void 0;if(!i)return e;let s=L(r),c=o===`components`?a(r.id||JSON.stringify(r),s,w(l,n)):s;return e.concat({name:n,in:i,deprecated:r.deprecated,required:u.required?.includes(n)||!1,description:s.description||l,schema:c,examples:Mn(_(s)&&s.examples?.length?s.examples:t.pluck(n,u.examples?.filter(t.both(T,t.has(n)))||[]))})},[])},Fn={nullable:Cn,union:xn,bigint:En,intersection:Sn,tuple:Dn,pipe:An,[De]:wn,[ke]:Tn,[O]:yn,[k]:jn,[Te]:bn},In=(e,n,r)=>{let i=[e,n];for(;i.length;){let e=i.shift();if(t.is(Object,e)){if(ae(e)&&!e.$ref.startsWith(`#/components`)){let t=n[e.$ref.split(`/`).pop()];t&&(e.$ref=r.makeRef(t.id||t,L(t)).$ref);continue}i.push(...t.values(e))}t.is(Array,e)&&i.push(...t.values(e))}return e},Ln=(t,{ctx:n,rules:i=Fn})=>{let{$defs:a={},properties:o={}}=r.toJSONSchema(r.object({subject:t}),{unrepresentable:`any`,io:n.isResponse?`output`:`input`,override:t=>{let r=e(t.zodSchema),a=i[r&&r in i?r:t.zodSchema._zod.def.type];if(a){let e={...a(t,n)};for(let e in t.jsonSchema)delete t.jsonSchema[e];Object.assign(t.jsonSchema,e)}}});return In(T(o.subject)?o.subject:{},a,n)},Rn=(e,n)=>{if(ae(e))return[e,!1];let r=!1,i=t.map(e=>{let[t,i]=Rn(e,n);return r||=i,t}),a=t.omit(n),o={properties:a,examples:t.map(a),required:t.without(n),allOf:i,oneOf:i,anyOf:i},s=t.evolve(o,e);return[s,r||!!s.required?.length]},zn=({method:e,path:n,schema:r,mimeTypes:i,variant:a,makeRef:o,composition:s,hasMultipleStatusCodes:c,statusCode:l,brandHandling:u,description:d=`${e.toUpperCase()} ${n} ${xe(a)} response ${c?l:``}`.trim()})=>{if(!we(e,i))return{description:d};let f=L(Ln(r,{rules:{...u,...Fn},ctx:{isResponse:!0,makeRef:o,path:n,method:e}})),p=[];_(f)&&f.examples&&(p.push(...f.examples),delete f.examples);let m={schema:s===`components`?o(r,f,w(d)):f,examples:Mn(p)};return{description:d,content:t.fromPairs(t.xprod(i,[m]))}},Bn=({format:e})=>{let t={type:`http`,scheme:`bearer`};return e&&(t.bearerFormat=e),t},Vn=({name:e},t)=>{let n={type:`apiKey`,in:`query`,name:e};return t?.includes(`body`)&&(t?.includes(`query`)?(n[`x-in-alternative`]=`body`,n.description=`${e} CAN also be supplied within the request body`):(n[`x-in-actual`]=`body`,n.description=`${e} MUST be supplied within the request body instead of query`)),n},Hn=({name:e})=>({type:`apiKey`,in:`header`,name:e}),Un=({name:e})=>({type:`apiKey`,in:`cookie`,name:e}),Wn=({url:e})=>({type:`openIdConnect`,openIdConnectUrl:e}),Gn=({flows:e={}})=>({type:`oauth2`,flows:t.map(e=>({...e,scopes:e.scopes||{}}),t.reject(t.isNil,e))}),Kn=(e,t=[])=>{let n=e=>e.type===`basic`?{type:`http`,scheme:`basic`}:e.type===`bearer`?Bn(e):e.type===`input`?Vn(e,t):e.type===`header`?Hn(e):e.type===`cookie`?Un(e):e.type===`openid`?Wn(e):Gn(e);return e.map(e=>e.map(n))},qn=(e,t,n)=>e.map(e=>e.reduce((e,r)=>{let i=n(r),a=[`oauth2`,`openIdConnect`].includes(r.type);return Object.assign(e,{[i]:a?t:[]})},{})),Jn=({schema:e,brandHandling:t,makeRef:n,path:r,method:i})=>Ln(e,{rules:{...t,...Fn},ctx:{isResponse:!1,makeRef:n,path:r,method:i}}),Yn=({method:e,path:n,schema:r,request:i,mimeType:a,makeRef:o,composition:s,paramNames:c,description:l=`${e.toUpperCase()} ${n} Request body`})=>{let[u,d]=Rn(L(i),c),f=[];_(u)&&u.examples&&(f.push(...u.examples),delete u.examples);let p={schema:s===`components`?o(r,u,w(l)):u,examples:Mn(f.length?f:Dt(i).examples?.filter(e=>T(e)&&!Array.isArray(e)).map(t.omit(c))||[])},m={description:l,content:{[a]:p}};return(d||a===y.raw)&&(m.required=!0),m},Xn=e=>Object.entries(e).reduce((e,[t,n])=>{if(!n)return e;let r={name:t,description:typeof n==`string`?n:n.description};return typeof n==`object`&&n.url&&(r.externalDocs={url:n.url}),e.concat(r)},[]),Zn=e=>e.length<=50?e:e.slice(0,49)+`…`,Qn=e=>e.length?e.slice():void 0;var $n=class extends ie{#e=new Map;#t=new Map;#n=new Map;#r(e,t,n=this.#n.get(e)){return n||(n=`Schema${this.#n.size+1}`,this.#n.set(e,n)),this.addSchema(n,t),{$ref:`#/components/schemas/${n}`}}#i(e,t,n){let r=n||w(t,e),i=this.#t.get(r);if(i===void 0)return this.#t.set(r,1),r;if(n)throw new E(`Duplicated operationId: "${n}"`,{method:t,isResponse:!1,path:e});return i++,this.#t.set(r,i),`${r}${i}`}#a(e){let t=JSON.stringify(e);for(let e in this.rootDoc.components?.securitySchemes||{})if(t===JSON.stringify(this.rootDoc.components?.securitySchemes?.[e]))return e;let n=(this.#e.get(e.type)||0)+1;return this.#e.set(e.type,n),`${e.type.toUpperCase()}_${n}`}constructor({routing:e,config:n,title:r,version:i,serverUrl:a,descriptions:o,brandHandling:s,tags:c,isHeader:l,hasSummaryFromDescription:u=!0,hasHeadMethod:d=!0,composition:f=`inline`}){super(),this.addInfo({title:r,version:i});for(let e of typeof a==`string`?[a]:a)this.addServer({url:e});let p=(e,r,i)=>{let a={path:r,method:e,endpoint:i,composition:f,brandHandling:s,makeRef:this.#r.bind(this)},{description:c,shortDescription:d,scopes:p,inputSchema:m}=i,ee=d?Zn(d):u&&c?Zn(c):void 0,h=ve(e,n.inputSources),g=this.#i(r,e,i.getOperationId(e)),te=Jn({...a,schema:m}),ne=mn(i.security),re=Pn({...a,inputSources:h,isHeader:l,security:ne,request:te,description:o?.requestParameter?.call(null,{method:e,path:r,operationId:g})}),ie={};for(let t of at){let n=i.getResponses(t);for(let{mimeTypes:i,schema:s,statusCodes:c}of n)for(let l of c)ie[l]=zn({...a,variant:t,schema:s,mimeTypes:i,statusCode:l,hasMultipleStatusCodes:n.length>1||c.length>1,description:o?.[`${t}Response`]?.call(null,{method:e,path:r,operationId:g,statusCode:l})})}let ae=h.includes(`body`)?Yn({...a,request:te,paramNames:t.pluck(`name`,re),schema:m,mimeType:y[i.requestType],description:o?.requestBody?.call(null,{method:e,path:r,operationId:g})}):void 0,_=qn(Kn(ne,h),p,e=>{let t=this.#a(e);return this.addSecurityScheme(t,e),t}),oe={operationId:g,summary:ee,description:c,deprecated:i.isDeprecated||void 0,tags:Qn(i.tags),parameters:Qn(re),requestBody:ae,security:Qn(_),responses:ie};this.addPath(vn(r),{[e]:oe})};Lt({routing:e,onEndpoint:d?At(p):p}),c&&(this.rootDoc.tags=Xn(c))}};const er=e=>oe({...e,headers:{"content-type":y.json,...e?.headers}}),tr=e=>se(e),nr=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(e,n,r){return n===`_getLogs`?()=>t:gt(n)?(...e)=>t[n].push(e):Reflect.get(e,n,r)}})},rr=({requestProps:e,responseOptions:t,configProps:n,loggerProps:r})=>{let i=er(e),a=tr({req:i,...t});a.req=t?.req||i,i.res=a;let o=nr(r);return{requestMock:i,responseMock:a,loggerMock:o,configMock:{cors:!1,logger:o,...n}}},ir=async({endpoint:e,...t})=>{let{requestMock:n,responseMock:r,loggerMock:i,configMock:a}=rr(t);return await e.execute({request:n,response:r,config:a,logger:i}),{requestMock:n,responseMock:r,loggerMock:i}},ar=async({middleware:e,options:t={},...n})=>{let{requestMock:r,responseMock:i,loggerMock:a,configMock:{inputSources:o,errorHandler:s=F}}=rr(n),c={request:r,response:i,logger:a,input:ye(r,o),options:t};try{return{requestMock:r,responseMock:i,loggerMock:a,output:await e.execute(c)}}catch(e){return await s.execute({...c,error:x(e),output:null}),{requestMock:r,responseMock:i,loggerMock:a,output:{}}}},R=v.factory,or=[R.createModifier(v.SyntaxKind.ExportKeyword)],sr=[R.createModifier(v.SyntaxKind.AsyncKeyword)],cr={public:[R.createModifier(v.SyntaxKind.PublicKeyword)],protectedReadonly:[R.createModifier(v.SyntaxKind.ProtectedKeyword),R.createModifier(v.SyntaxKind.ReadonlyKeyword)]},lr=(e,t)=>v.addSyntheticLeadingComment(e,v.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),ur=(e,t)=>{let n=v.createSourceFile(`print.ts`,``,v.ScriptTarget.Latest,!1,v.ScriptKind.TS);return v.createPrinter(t).printNode(v.EmitHint.Unspecified,e,n)},dr=/^[A-Za-z_$][A-Za-z0-9_$]*$/,fr=e=>typeof e==`string`&&dr.test(e)?R.createIdentifier(e):Y(e),pr=(e,...t)=>R.createTemplateExpression(R.createTemplateHead(e),t.map(([e,n=``],r)=>R.createTemplateSpan(e,r===t.length-1?R.createTemplateTail(n):R.createTemplateMiddle(n)))),mr=(e,{type:t,mod:n,init:r,optional:i}={})=>R.createParameterDeclaration(n,void 0,e,i?R.createToken(v.SyntaxKind.QuestionToken):void 0,t?B(t):void 0,r),z=e=>Object.entries(e).map(([e,t])=>mr(e,typeof t==`string`||typeof t==`number`||typeof t==`object`&&`kind`in t?{type:t}:t)),hr=(e,t=[])=>R.createConstructorDeclaration(cr.public,e,R.createBlock(t)),B=(e,n)=>typeof e==`number`?R.createKeywordTypeNode(e):typeof e==`string`||v.isIdentifier(e)?R.createTypeReferenceNode(e,n&&t.map(B,n)):e,gr=B(`Record`,[v.SyntaxKind.StringKeyword,v.SyntaxKind.AnyKeyword]),V=e=>{let t=new Map;for(let n of e)t.set(Pr(n)?n.kind:n,n);return R.createUnionTypeNode(Array.from(t.values()))},_r=(e,n,{isOptional:r,isDeprecated:i,comment:a}={})=>{let o=B(n),s=R.createPropertySignature(void 0,fr(e),r?R.createToken(v.SyntaxKind.QuestionToken):void 0,r?V([o,B(v.SyntaxKind.UndefinedKeyword)]):o),c=t.reject(t.isNil,[i?`@deprecated`:void 0,a]);return c.length?lr(s,c.join(` `)):s},vr=e=>v.setEmitFlags(e,v.EmitFlags.SingleLine),yr=(...e)=>R.createArrayBindingPattern(e.map(e=>R.createBindingElement(void 0,void 0,e))),H=(e,t,{type:n,expose:r}={})=>R.createVariableStatement(r&&or,R.createVariableDeclarationList([R.createVariableDeclaration(e,void 0,n?B(n):void 0,t)],v.NodeFlags.Const)),br=(e,n)=>U(e,V(t.map(X,n)),{expose:!0}),U=(e,t,{expose:n,comment:r,params:i}={})=>{let a=R.createTypeAliasDeclaration(n?or:void 0,e,i&&Dr(i),t);return r?lr(a,r):a},xr=(e,t)=>R.createPropertyDeclaration(cr.public,e,void 0,B(t),void 0),Sr=(e,t,n,{typeParams:r,returns:i}={})=>R.createMethodDeclaration(cr.public,void 0,e,void 0,r&&Dr(r),t,i,R.createBlock(n)),Cr=(e,t,{typeParams:n}={})=>R.createClassDeclaration(or,e,n&&Dr(n),void 0,t),wr=e=>R.createTypeOperatorNode(v.SyntaxKind.KeyOfKeyword,B(e)),Tr=e=>B(Promise.name,[e]),Er=(e,t,{expose:n,comment:r}={})=>{let i=R.createInterfaceDeclaration(n?or:void 0,e,void 0,void 0,t);return r?lr(i,r):i},Dr=e=>(Array.isArray(e)?e.map(e=>t.pair(e,void 0)):Object.entries(e)).map(([e,t])=>{let{type:n,init:r}=typeof t==`object`&&`init`in t?t:{type:t};return R.createTypeParameterDeclaration([],e,n?B(n):void 0,r?B(r):void 0)}),W=(e,n,{isAsync:r}={})=>R.createArrowFunction(r?sr:void 0,void 0,Array.isArray(e)?t.map(mr,e):z(e),void 0,void 0,n),G=e=>e,Or=(e,t,n)=>R.createConditionalExpression(e,R.createToken(v.SyntaxKind.QuestionToken),t,R.createToken(v.SyntaxKind.ColonToken),n),K=(e,...t)=>(...n)=>R.createCallExpression(t.reduce((e,t)=>typeof t==`string`||v.isIdentifier(t)?R.createPropertyAccessExpression(e,t):R.createElementAccessExpression(e,t),typeof e==`string`?R.createIdentifier(e):e),void 0,n),q=(e,...t)=>R.createNewExpression(R.createIdentifier(e),void 0,t),kr=(e,t)=>B(`Extract`,[e,t]),Ar=(e,t)=>R.createExpressionStatement(R.createBinaryExpression(e,R.createToken(v.SyntaxKind.EqualsToken),t)),J=(e,t)=>R.createIndexedAccessTypeNode(B(e),B(t)),jr=e=>V([B(e),Tr(e)]),Mr=(e,t)=>R.createFunctionTypeNode(void 0,z(e),B(t)),Y=e=>typeof e==`number`?R.createNumericLiteral(e):typeof e==`bigint`?R.createBigIntLiteral(e.toString()):typeof e==`boolean`?e?R.createTrue():R.createFalse():e===null?R.createNull():R.createStringLiteral(e),X=e=>R.createLiteralTypeNode(Y(e)),Nr=[v.SyntaxKind.AnyKeyword,v.SyntaxKind.BigIntKeyword,v.SyntaxKind.BooleanKeyword,v.SyntaxKind.NeverKeyword,v.SyntaxKind.NumberKeyword,v.SyntaxKind.ObjectKeyword,v.SyntaxKind.StringKeyword,v.SyntaxKind.SymbolKeyword,v.SyntaxKind.UndefinedKeyword,v.SyntaxKind.UnknownKeyword,v.SyntaxKind.VoidKeyword],Pr=e=>Nr.includes(e.kind);var Fr=class{paths=new Set;tags=new Map;registry=new Map;#e={pathType:R.createIdentifier(`Path`),implementationType:R.createIdentifier(`Implementation`),keyParameter:R.createIdentifier(`key`),pathParameter:R.createIdentifier(`path`),paramsArgument:R.createIdentifier(`params`),ctxArgument:R.createIdentifier(`ctx`),methodParameter:R.createIdentifier(`method`),requestParameter:R.createIdentifier(`request`),eventParameter:R.createIdentifier(`event`),dataParameter:R.createIdentifier(`data`),handlerParameter:R.createIdentifier(`handler`),msgParameter:R.createIdentifier(`msg`),parseRequestFn:R.createIdentifier(`parseRequest`),substituteFn:R.createIdentifier(`substitute`),provideMethod:R.createIdentifier(`provide`),onMethod:R.createIdentifier(`on`),implementationArgument:R.createIdentifier(`implementation`),hasBodyConst:R.createIdentifier(`hasBody`),undefinedValue:R.createIdentifier(`undefined`),responseConst:R.createIdentifier(`response`),restConst:R.createIdentifier(`rest`),searchParamsConst:R.createIdentifier(`searchParams`),defaultImplementationConst:R.createIdentifier(`defaultImplementation`),clientConst:R.createIdentifier(`client`),contentTypeConst:R.createIdentifier(`contentType`),isJsonConst:R.createIdentifier(`isJSON`),sourceProp:R.createIdentifier(`source`)};interfaces={input:R.createIdentifier(`Input`),positive:R.createIdentifier(`PositiveResponse`),negative:R.createIdentifier(`NegativeResponse`),encoded:R.createIdentifier(`EncodedResponse`),response:R.createIdentifier(`Response`)};methodType=br(`Method`,ue);someOfType=U(`SomeOf`,J(`T`,wr(`T`)),{params:[`T`]});requestType=U(`Request`,wr(this.interfaces.input),{expose:!0});constructor(e){this.serverUrl=e}someOf=({name:e})=>B(this.someOfType.name,[e]);makePathType=()=>br(this.#e.pathType,Array.from(this.paths));makePublicInterfaces=()=>Object.keys(this.interfaces).map(e=>Er(this.interfaces[e],Array.from(this.registry).map(([t,{store:n,isDeprecated:r}])=>_r(t,n[e],{isDeprecated:r})),{expose:!0}));makeEndpointTags=()=>H(`endpointTags`,R.createObjectLiteralExpression(Array.from(this.tags).map(([e,n])=>R.createPropertyAssignment(fr(e),R.createArrayLiteralExpression(t.map(Y,n))))),{expose:!0});makeImplementationType=()=>U(this.#e.implementationType,Mr({[this.#e.methodParameter.text]:this.methodType.name,[this.#e.pathParameter.text]:v.SyntaxKind.StringKeyword,[this.#e.paramsArgument.text]:gr,[this.#e.ctxArgument.text]:{optional:!0,type:`T`}},Tr(v.SyntaxKind.AnyKeyword)),{expose:!0,params:{T:{init:v.SyntaxKind.UnknownKeyword}}});makeParseRequestFn=()=>H(this.#e.parseRequestFn,W({[this.#e.requestParameter.text]:v.SyntaxKind.StringKeyword},R.createAsExpression(K(this.#e.requestParameter,G(`split`))(R.createRegularExpressionLiteral(`/ (.+)/`),Y(2)),R.createTupleTypeNode([B(this.methodType.name),B(this.#e.pathType)]))));makeSubstituteFn=()=>H(this.#e.substituteFn,W({[this.#e.pathParameter.text]:v.SyntaxKind.StringKeyword,[this.#e.paramsArgument.text]:gr},R.createBlock([H(this.#e.restConst,R.createObjectLiteralExpression([R.createSpreadAssignment(this.#e.paramsArgument)])),R.createForInStatement(R.createVariableDeclarationList([R.createVariableDeclaration(this.#e.keyParameter)],v.NodeFlags.Const),this.#e.paramsArgument,R.createBlock([Ar(this.#e.pathParameter,K(this.#e.pathParameter,G(`replace`))(pr(`:`,[this.#e.keyParameter]),W([],R.createBlock([R.createExpressionStatement(R.createDeleteExpression(R.createElementAccessExpression(this.#e.restConst,this.#e.keyParameter))),R.createReturnStatement(R.createElementAccessExpression(this.#e.paramsArgument,this.#e.keyParameter))]))))])),R.createReturnStatement(R.createAsExpression(R.createArrayLiteralExpression([this.#e.pathParameter,this.#e.restConst]),B(`const`)))])));#t=()=>Sr(this.#e.provideMethod,z({[this.#e.requestParameter.text]:`K`,[this.#e.paramsArgument.text]:J(this.interfaces.input,`K`),[this.#e.ctxArgument.text]:{optional:!0,type:`T`}}),[H(yr(this.#e.methodParameter,this.#e.pathParameter),K(this.#e.parseRequestFn)(this.#e.requestParameter)),R.createReturnStatement(K(R.createThis(),this.#e.implementationArgument)(this.#e.methodParameter,R.createSpreadElement(K(this.#e.substituteFn)(this.#e.pathParameter,this.#e.paramsArgument)),this.#e.ctxArgument))],{typeParams:{K:this.requestType.name},returns:Tr(J(this.interfaces.response,`K`))});makeClientClass=e=>Cr(e,[hr([mr(this.#e.implementationArgument,{type:B(this.#e.implementationType,[`T`]),mod:cr.protectedReadonly,init:this.#e.defaultImplementationConst})]),this.#t()],{typeParams:[`T`]});#n=e=>pr(`?`,[q(URLSearchParams.name,e)]);#r=()=>q(URL.name,pr(``,[this.#e.pathParameter],[this.#e.searchParamsConst]),Y(this.serverUrl));makeDefaultImplementation=()=>{let e=R.createPropertyAssignment(G(`method`),K(this.#e.methodParameter,G(`toUpperCase`))()),t=R.createPropertyAssignment(G(`headers`),Or(this.#e.hasBodyConst,R.createObjectLiteralExpression([R.createPropertyAssignment(Y(`Content-Type`),Y(y.json))]),this.#e.undefinedValue)),n=R.createPropertyAssignment(G(`body`),Or(this.#e.hasBodyConst,K(JSON[Symbol.toStringTag],G(`stringify`))(this.#e.paramsArgument),this.#e.undefinedValue)),r=H(this.#e.responseConst,R.createAwaitExpression(K(fetch.name)(this.#r(),R.createObjectLiteralExpression([e,t,n])))),i=H(this.#e.hasBodyConst,R.createLogicalNot(K(R.createArrayLiteralExpression([Y(`get`),Y(`head`),Y(`delete`)]),G(`includes`))(this.#e.methodParameter))),a=H(this.#e.searchParamsConst,Or(this.#e.hasBodyConst,Y(``),this.#n(this.#e.paramsArgument))),o=H(this.#e.contentTypeConst,K(this.#e.responseConst,G(`headers`),G(`get`))(Y(`content-type`))),s=R.createIfStatement(R.createPrefixUnaryExpression(v.SyntaxKind.ExclamationToken,this.#e.contentTypeConst),R.createReturnStatement()),c=H(this.#e.isJsonConst,K(this.#e.contentTypeConst,G(`startsWith`))(Y(y.json))),l=R.createReturnStatement(K(this.#e.responseConst,Or(this.#e.isJsonConst,Y(G(`json`)),Y(G(`text`))))());return H(this.#e.defaultImplementationConst,W([this.#e.methodParameter,this.#e.pathParameter,this.#e.paramsArgument],R.createBlock([i,a,r,o,s,c,l]),{isAsync:!0}),{type:this.#e.implementationType})};#i=()=>hr(z({request:`K`,params:J(this.interfaces.input,`K`)}),[H(yr(this.#e.pathParameter,this.#e.restConst),K(this.#e.substituteFn)(R.createElementAccessExpression(K(this.#e.parseRequestFn)(this.#e.requestParameter),Y(1)),this.#e.paramsArgument)),H(this.#e.searchParamsConst,this.#n(this.#e.restConst)),Ar(R.createPropertyAccessExpression(R.createThis(),this.#e.sourceProp),q(`EventSource`,this.#r()))]);#a=e=>R.createTypeLiteralNode([_r(G(`event`),e)]);#o=()=>Sr(this.#e.onMethod,z({[this.#e.eventParameter.text]:`E`,[this.#e.handlerParameter.text]:Mr({[this.#e.dataParameter.text]:J(kr(`R`,vr(this.#a(`E`))),X(G(`data`)))},jr(v.SyntaxKind.VoidKeyword))}),[R.createExpressionStatement(K(R.createThis(),this.#e.sourceProp,G(`addEventListener`))(this.#e.eventParameter,W([this.#e.msgParameter],K(this.#e.handlerParameter)(K(JSON[Symbol.toStringTag],G(`parse`))(R.createPropertyAccessExpression(R.createParenthesizedExpression(R.createAsExpression(this.#e.msgParameter,B(MessageEvent.name))),G(`data`))))))),R.createReturnStatement(R.createThis())],{typeParams:{E:J(`R`,X(G(`event`)))}});makeSubscriptionClass=e=>Cr(e,[xr(this.#e.sourceProp,`EventSource`),this.#i(),this.#o()],{typeParams:{K:kr(this.requestType.name,R.createTemplateLiteralType(R.createTemplateHead(`get `),[R.createTemplateLiteralTypeSpan(B(v.SyntaxKind.StringKeyword),R.createTemplateTail(``))])),R:kr(J(this.interfaces.positive,`K`),vr(this.#a(v.SyntaxKind.StringKeyword)))}});makeUsageStatements=(e,t)=>[H(this.#e.clientConst,q(e)),K(this.#e.clientConst,this.#e.provideMethod)(Y(`get /v1/user/retrieve`),R.createObjectLiteralExpression([R.createPropertyAssignment(`id`,Y(`10`))])),K(q(t,Y(`get /v1/events/stream`),R.createObjectLiteralExpression()),this.#e.onMethod)(Y(`time`),W([`time`],R.createBlock([])))]};const Ir=(t,{onEach:n,rules:r,onMissing:i,ctx:a={}})=>{let o=e(t),s=o&&o in r?r[o]:r[t._zod.def.type],c=e=>Ir(e,{ctx:a,onEach:n,rules:r,onMissing:i}),l=s?s(t,{...a,next:c}):i(t,a),u=n&&n(t,{prev:l,...a});return u?{...l,...u}:l},{factory:Z}=v,Lr={[v.SyntaxKind.AnyKeyword]:``,[v.SyntaxKind.BigIntKeyword]:BigInt(0),[v.SyntaxKind.BooleanKeyword]:!1,[v.SyntaxKind.NumberKeyword]:0,[v.SyntaxKind.ObjectKeyword]:{},[v.SyntaxKind.StringKeyword]:``,[v.SyntaxKind.UndefinedKeyword]:void 0},Rr={name:t.path([`name`,`text`]),type:t.path([`type`]),optional:t.path([`questionToken`])},zr=({_zod:{def:e}})=>{let t=e.values.map(e=>e===void 0?B(v.SyntaxKind.UndefinedKeyword):X(e));return t.length===1?t[0]:V(t)},Br=({_zod:{def:e}},{next:t})=>{let n=[...e.parts],r=()=>{let e=``;for(;n.length;){let t=n.shift();if(C(t)){n.unshift(t);break}e+=t??``}return e},i=Z.createTemplateHead(r()),a=[];for(;n.length;){let e=t(n.shift()),i=r(),o=n.length?Z.createTemplateMiddle:Z.createTemplateTail;a.push(Z.createTemplateLiteralTypeSpan(e,o(i)))}return a.length?Z.createTemplateLiteralType(i,a):X(i.text)},Vr=(e,{isResponse:t,next:r,makeAlias:i})=>{let a=()=>{let i=Object.entries(e._zod.def.shape).map(([e,i])=>{let{description:a,deprecated:o}=n.get(i)||{};return _r(e,r(i),{comment:a,isDeprecated:o,isOptional:(t?i._zod.optout:i._zod.optin)===`optional`})});return Z.createTypeLiteralNode(i)};return We(e,{io:t?`output`:`input`})?i(e,a):a()},Hr=({_zod:{def:e}},{next:t})=>Z.createArrayTypeNode(t(e.element)),Ur=({_zod:{def:e}})=>V(Object.values(e.entries).map(X)),Wr=({_zod:{def:e}},{next:t})=>V(e.options.map(t)),Gr=e=>Lr?.[e.kind],Kr=({_zod:{def:e}},{next:t})=>V([t(e.innerType),X(null)]),qr=({_zod:{def:e}},{next:t})=>Z.createTupleTypeNode(e.items.map(t).concat(e.rest===null?[]:Z.createRestTypeNode(t(e.rest)))),Jr=({_zod:{def:e}},{next:t})=>B(`Record`,[e.keyType,e.valueType].map(t)),Yr=t.tryCatch(e=>{if(!e.every(v.isTypeLiteralNode))throw Error(`Not objects`);let n=t.chain(t.prop(`members`),e),r=t.uniqWith((...e)=>{if(!t.eqBy(Rr.name,...e))return!1;if(t.both(t.eqBy(Rr.type),t.eqBy(Rr.optional))(...e))return!0;throw Error(`Has conflicting prop`)},n);return Z.createTypeLiteralNode(r)},(e,t)=>Z.createIntersectionTypeNode(t)),Xr=({_zod:{def:e}},{next:t})=>Yr([e.left,e.right].map(t)),Q=e=>()=>B(e),$=({_zod:{def:e}},{next:t})=>t(e.innerType),Zr=e=>B(e?v.SyntaxKind.UnknownKeyword:v.SyntaxKind.AnyKeyword),Qr=({_zod:{def:e}},{next:t,isResponse:n})=>{let r=e[n?`out`:`in`],i=e[n?`in`:`out`];if(!C(r,`transform`))return t(r);let a=Se(r,Gr(t(i))),o={number:v.SyntaxKind.NumberKeyword,bigint:v.SyntaxKind.BigIntKeyword,boolean:v.SyntaxKind.BooleanKeyword,string:v.SyntaxKind.StringKeyword,undefined:v.SyntaxKind.UndefinedKeyword,object:v.SyntaxKind.ObjectKeyword};return B(a&&o[a]||Zr(n))},$r=()=>X(null),ei=({_zod:{def:e}},{makeAlias:t,next:n})=>t(e.getter,()=>n(e.getter())),ti=()=>B(`Buffer`),ni=(e,{next:t})=>t(e._zod.def.shape.raw),ri={string:Q(v.SyntaxKind.StringKeyword),number:Q(v.SyntaxKind.NumberKeyword),bigint:Q(v.SyntaxKind.BigIntKeyword),boolean:Q(v.SyntaxKind.BooleanKeyword),any:Q(v.SyntaxKind.AnyKeyword),undefined:Q(v.SyntaxKind.UndefinedKeyword),[De]:Q(v.SyntaxKind.StringKeyword),[ke]:Q(v.SyntaxKind.StringKeyword),never:Q(v.SyntaxKind.NeverKeyword),void:Q(v.SyntaxKind.UndefinedKeyword),unknown:Q(v.SyntaxKind.UnknownKeyword),null:$r,array:Hr,tuple:qr,record:Jr,object:Vr,literal:zr,template_literal:Br,intersection:Xr,union:Wr,default:$,enum:Ur,optional:$,nonoptional:$,nullable:Kr,catch:$,pipe:Qr,lazy:ei,readonly:$,[Te]:ti,[k]:ni},ii=(e,{brandHandling:t,ctx:n})=>Ir(e,{rules:{...t,...ri},onMissing:({},{isResponse:e})=>Zr(e),ctx:n});var ai=class extends Fr{#e=[this.someOfType];#t=new Map;#n=[];#r(e,t){let n=this.#t.get(e)?.name?.text;if(!n){n=`Type${this.#t.size+1}`;let r=X(null);this.#t.set(e,U(n,r)),this.#t.set(e,U(n,t()))}return B(n)}constructor({routing:e,brandHandling:n,variant:i=`client`,clientClassName:a=`Client`,subscriptionClassName:o=`Subscription`,serverUrl:s=`https://example.com`,noContent:c=r.undefined(),hasHeadMethod:l=!0}){super(s);let u={makeAlias:this.#r.bind(this)},d={brandHandling:n,ctx:{...u,isResponse:!1}},f={brandHandling:n,ctx:{...u,isResponse:!0}},p=(e,n,r)=>{let i=w.bind(null,e,n),{isDeprecated:a,inputSchema:o,tags:s}=r,l=`${e} ${n}`,u=U(i(`input`),ii(o,d),{comment:l});this.#e.push(u);let p=at.reduce((n,a)=>{let o=r.getResponses(a),s=t.chain(([t,{schema:n,mimeTypes:r,statusCodes:o}])=>{let s=we(e,r),u=U(i(a,`variant`,`${t+1}`),ii(s?n:c,f),{comment:l});return this.#e.push(u),o.map(e=>_r(e,u.name))},Array.from(o.entries())),u=Er(i(a,`response`,`variants`),s,{comment:l});return this.#e.push(u),Object.assign(n,{[a]:u})},{});this.paths.add(n);let m=X(l),ee={input:B(u.name),positive:this.someOf(p.positive),negative:this.someOf(p.negative),response:V([J(this.interfaces.positive,m),J(this.interfaces.negative,m)]),encoded:R.createIntersectionTypeNode([B(p.positive.name),B(p.negative.name)])};this.registry.set(l,{isDeprecated:a,store:ee}),this.tags.set(l,s)};Lt({routing:e,onEndpoint:l?At(p):p}),this.#e.unshift(...this.#t.values()),this.#e.push(this.makePathType(),this.methodType,...this.makePublicInterfaces(),this.requestType),i!==`types`&&(this.#e.push(this.makeEndpointTags(),this.makeParseRequestFn(),this.makeSubstituteFn(),this.makeImplementationType(),this.makeDefaultImplementation(),this.makeClientClass(a),this.makeSubscriptionClass(o)),this.#n.push(...this.makeUsageStatements(a,o)))}#i(e){return this.#n.length?this.#n.map(t=>typeof t==`string`?t:ur(t,e)).join(`
|
|
18
|
+
`):void 0}print(e){let t=this.#i(e),n=t&&v.addSyntheticLeadingComment(v.addSyntheticLeadingComment(R.createEmptyStatement(),v.SyntaxKind.SingleLineCommentTrivia,` Usage example:`),v.SyntaxKind.MultiLineCommentTrivia,`\n${t}`);return this.#e.concat(n||[]).map((t,n)=>ur(t,n<this.#e.length?e:{...e,omitTrailingSemicolon:!0})).join(`
|
|
19
19
|
|
|
20
|
-
`)}async printFormatted({printerOptions:e,format:t}={}){let n=t;if(!n)try{let e=(await St(`prettier`)).format;n=t=>e(t,{filepath:`client.ts`})}catch{}let r=this.#
|
|
20
|
+
`)}async printFormatted({printerOptions:e,format:t}={}){let n=t;if(!n)try{let e=(await St(`prettier`)).format;n=t=>e(t,{filepath:`client.ts`})}catch{}let r=this.#i(e);this.#n=r&&n?[await n(r)]:this.#n;let i=this.print(e);return n?n(i):i}};const oi=(e,t)=>r.object({data:t,event:r.literal(e),id:r.string().optional(),retry:r.int().positive().optional()}),si=(e,t,n)=>oi(String(t),e[t]).transform(e=>[`event: ${e.event}`,`data: ${JSON.stringify(e.data)}`,``,``].join(`
|
|
21
21
|
`)).parse({event:t,data:n}),ci=e=>e.headersSent||e.writeHead(200,{connection:`keep-alive`,"content-type":y.sse,"cache-control":`no-cache`}),li=e=>new M({handler:async({request:t,response:n})=>{let r=new AbortController;return t.once(`close`,()=>{r.abort()}),setTimeout(()=>ci(n),1e4),{isClosed:()=>n.writableEnded||n.closed,signal:r.signal,emit:(t,r)=>{ci(n),n.write(si(e,t,r),`utf-8`),n.flush?.()}}}}),ui=e=>new P({positive:()=>{let[t,...n]=Object.entries(e).map(([e,t])=>oi(e,t));return{mimeType:y.sse,schema:n.length?r.discriminatedUnion(`event`,[t,...n]):t}},negative:{mimeType:`text/plain`,schema:r.string()},handler:async({response:e,error:t,logger:n,request:r,input:i})=>{if(t){let a=A(t);Ye(a,n,r,i),e.headersSent||e.status(a.statusCode).type(`text/plain`).write(j(a),`utf-8`)}e.end()}});var di=class extends ut{constructor(e){super(ui(e)),this.middlewares=[li(e)]}};const fi={dateIn:Oe,dateOut:Ae,form:Re,upload:ze,raw:He,buffer:Ee};export{yt as BuiltinLogger,bt as DependsOnMethod,$n as Documentation,E as DocumentationError,ut as EndpointsFactory,di as EventStreamFactory,D as InputValidationError,ai as Integration,M as Middleware,Ie as MissingPeerError,Pe as OutputValidationError,P as ResultHandler,je as RoutingError,xt as ServeStatic,ft as arrayEndpointsFactory,lt as arrayResultHandler,ln as attachRouting,ce as createConfig,un as createServer,dt as defaultEndpointsFactory,F as defaultResultHandler,A as ensureHttpError,fi as ez,S as getMessageFromError,ir as testEndpoint,ar as testMiddleware};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "express-zod-api",
|
|
3
|
-
"version": "25.
|
|
3
|
+
"version": "25.6.1",
|
|
4
4
|
"description": "A Typescript framework to help you get an API server up and running with I/O schema validation and custom middlewares in minutes.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
"ansis": "^4.1.0",
|
|
38
38
|
"node-mocks-http": "^1.17.2",
|
|
39
39
|
"openapi3-ts": "^4.5.0",
|
|
40
|
-
"ramda": "^0.
|
|
41
|
-
"@express-zod-api/zod-plugin": "^2.
|
|
40
|
+
"ramda": "^0.32.0",
|
|
41
|
+
"@express-zod-api/zod-plugin": "^2.1.0"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"@types/compression": "^1.7.5",
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"express": "^5.1.0",
|
|
89
89
|
"express-fileupload": "^1.5.1",
|
|
90
90
|
"http-errors": "^2.0.0",
|
|
91
|
-
"node-forge": "^1.3.
|
|
91
|
+
"node-forge": "^1.3.2",
|
|
92
92
|
"snakify-ts": "^2.3.0",
|
|
93
93
|
"typescript": "^5.9.2",
|
|
94
94
|
"undici": "^7.10.0",
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
],
|
|
119
119
|
"scripts": {
|
|
120
120
|
"build": "tsdown",
|
|
121
|
-
"pretest": "tsc
|
|
121
|
+
"pretest": "tsc",
|
|
122
122
|
"test": "vitest run --coverage",
|
|
123
123
|
"bench": "vitest bench --run ./bench"
|
|
124
124
|
}
|