express-zod-api 28.5.0 → 28.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
  ## Version 28
4
4
 
5
+ ### v28.7.0
6
+
7
+ - Added rate limiting support:
8
+ - Requires `express-rate-limit` — new optional peer dependency;
9
+ - Added the `createRateLimitMiddleware()` method and `EndpointsFactory::useRateLimit()` shorthand;
10
+ - When the limit is exceeded, the Middleware throws a `429` HTTP error, handled by your ResultHandler;
11
+ - The middleware provides `rateLimit` property to the context with the current rate limit info (`limit`, `used`,
12
+ `remaining`, `resetTime`) and the limiter API (`getKey()` and `resetKey()` methods) for programmatic management.
13
+
14
+ ### v28.6.0
15
+
16
+ - Changes to the `Integration` generator:
17
+ - The `typescript` option is no longer required for constructor;
18
+ - `Integration.create()` is now deprecated — use `new Integration()` instead;
19
+ - This is possible thanks to the `require(ESM)` feature, available on all supported Node.js versions;
20
+
5
21
  ### v28.5.0
6
22
 
7
23
  - Changes to the proprietary `Date` handling schemas:
package/README.md CHANGED
@@ -37,16 +37,17 @@ Start your API server with I/O schema validation and custom middlewares in minut
37
37
  2. [Headers as an input source](#headers-as-an-input-source)
38
38
  3. [Cookies](#cookies)
39
39
  4. [Caching](#caching)
40
- 5. [Response customization](#response-customization)
41
- 6. [Empty response](#empty-response)
42
- 7. [Non-JSON response](#non-json-response) including file downloads
43
- 8. [Error handling](#error-handling)
44
- 9. [Production mode](#production-mode)
45
- 10. [HTML Forms (URL encoded)](#html-forms-url-encoded)
46
- 11. [File uploads](#file-uploads)
47
- 12. [Connect to your own express app](#connect-to-your-own-express-app)
48
- 13. [Testing endpoints](#testing-endpoints)
49
- 14. [Testing middlewares](#testing-middlewares)
40
+ 5. [Rate limiting](#rate-limiting)
41
+ 6. [Response customization](#response-customization)
42
+ 7. [Empty response](#empty-response)
43
+ 8. [Non-JSON response](#non-json-response) including file downloads
44
+ 9. [Error handling](#error-handling)
45
+ 10. [Production mode](#production-mode)
46
+ 11. [HTML Forms (URL encoded)](#html-forms-url-encoded)
47
+ 12. [File uploads](#file-uploads)
48
+ 13. [Connect to your own express app](#connect-to-your-own-express-app)
49
+ 14. [Testing endpoints](#testing-endpoints)
50
+ 15. [Testing middlewares](#testing-middlewares)
50
51
  6. [Integration and Documentation](#integration-and-documentation)
51
52
  1. [Zod Plugin](#zod-plugin)
52
53
  2. [End-to-End Type Safety](#end-to-end-type-safety)
@@ -841,7 +842,7 @@ Consider `createCookieMiddleware()` that makes a Middleware providing `setCookie
841
842
  as well as `getCookie()` — alternative to the cookies as an input source:
842
843
 
843
844
  ```ts
844
- import { createCookieMiddleware, Middleware } from "express-zod-api";
845
+ import { Middleware } from "express-zod-api";
845
846
 
846
847
  const cookieDrivenFactory = factory
847
848
  .useCookies({ httpOnly: true, sameSite: "lax", path: "/" }) // shorthand, recommended base options
@@ -868,8 +869,6 @@ Consider the `createCacheMiddleware()` that provides helpers for HTTP caching fo
868
869
  It covers all standard `Cache-Control` directives, conditional request handling, and the "Not Modified" (304) flow:
869
870
 
870
871
  ```ts
871
- import { createCacheMiddleware } from "express-zod-api";
872
-
873
872
  const avatarEndpoint = factory
874
873
  .useCache({ maxAge: 3600, scope: "public" }) // shorthand, the policy applies to every response
875
874
  .build({
@@ -886,6 +885,21 @@ const avatarEndpoint = factory
886
885
  });
887
886
  ```
888
887
 
888
+ ## Rate limiting
889
+
890
+ Install `express-rate-limit`. Consider the `createRateLimitMiddleware()` to enable and configure rate limit on a certain
891
+ `EndpointsFactory`. When the limit is exceeded, the Middleware throws a `429` HTTP error, handled by your ResultHandler.
892
+
893
+ ```ts
894
+ const endpoint = factory
895
+ .useRateLimit({ windowMs: 60000, max: 100 }) // shorthand, or .addMiddleware(createRateLimitMiddleware())
896
+ .buildVoid({
897
+ handler: async ({ ctx: { rateLimit, logger } }) => {
898
+ logger.debug("Features", rateLimit); // { limit, used, remaining, resetTime, getKey, resetKey }
899
+ },
900
+ });
901
+ ```
902
+
889
903
  ## Response customization
890
904
 
891
905
  `ResultHandler` is responsible for transmitting consistent responses containing the endpoint output or an error.
@@ -1190,11 +1204,9 @@ safety between your API and frontend. Make sure you have `typescript` installed.
1190
1204
  and using the async `printFormatted()` method.
1191
1205
 
1192
1206
  ```ts
1193
- import typescript from "typescript";
1194
1207
  import { Integration } from "express-zod-api";
1195
1208
 
1196
1209
  const client = new Integration({
1197
- typescript, // or await Integration.create() to delegate importing
1198
1210
  routing,
1199
1211
  config,
1200
1212
  variant: "client", // <— optional, see also "types" for a DIY solution
package/dist/index.d.ts CHANGED
@@ -1,22 +1,16 @@
1
- import * as _$zod from "zod";
2
1
  import { z } from "zod";
3
2
  import { HttpError } from "http-errors";
4
- import * as _$express from "express";
5
3
  import express, { CookieOptions, IRouter, NextFunction, Request, RequestHandler, Response } from "express";
6
4
  import http from "node:http";
7
5
  import https, { ServerOptions } from "node:https";
8
6
  import { OpenApiBuilder, ReferenceObject, SchemaObject, TagObject } from "openapi3-ts/oas31";
9
- import * as _$node_mocks_http0 from "node-mocks-http";
10
7
  import { RequestOptions, ResponseOptions } from "node-mocks-http";
11
8
  import compression from "compression";
12
- import * as _$express_fileupload0 from "express-fileupload";
13
9
  import fileUpload from "express-fileupload";
14
10
  import cookieParser from "cookie-parser";
15
11
  import { ListenOptions } from "node:net";
16
- import * as _$express_serve_static_core0 from "express-serve-static-core";
17
- import * as _$qs from "qs";
12
+ import { AugmentedRequest, Options, RateLimitInfo, RateLimitRequestHandler } from "express-rate-limit";
18
13
  import ts from "typescript";
19
- import * as _$zod_v4_core0 from "zod/v4/core";
20
14
  declare const methods: ("get" | "post" | "put" | "delete" | "patch")[];
21
15
  declare const clientMethods: ("get" | "post" | "put" | "delete" | "patch" | "head")[];
22
16
  /**
@@ -31,6 +25,11 @@ type Method = (typeof methods)[number];
31
25
  * @example Method | "head"
32
26
  * */
33
27
  type ClientMethod = (typeof clientMethods)[number];
28
+ declare const defaultStatusCodes: {
29
+ positive: number;
30
+ negative: number;
31
+ };
32
+ type ResponseVariant = keyof typeof defaultStatusCodes;
34
33
  /**
35
34
  * @desc A container for describing an API response: its schema, status code(s) and MIME type(s).
36
35
  * @see ResultHandler
@@ -600,6 +599,7 @@ interface GracefulOptions {
600
599
  /** @desc The hook to call after the server was closed, but before terminating the process. */
601
600
  beforeExit?: () => void | Promise<void>;
602
601
  }
602
+ /** @todo consider removing Promise to make createServer sync in next major */
603
603
  type ServerHook = (params: {
604
604
  app: IRouter;
605
605
  /** @desc Returns child logger for the given request (if configured) or the configured logger otherwise */
@@ -875,6 +875,19 @@ declare const createCookieMiddleware: (baseOptions?: CookieOptions) => Middlewar
875
875
  string,
876
876
  undefined
877
877
  >;
878
+ /**
879
+ * @desc Creates an ExpressMiddleware that enforces rate limits using express-rate-limit.
880
+ * @requires express-rate-limit
881
+ * @param options — Partial options passed to the express-rate-limit constructor.
882
+ * @example createRateLimitMiddleware({ windowMs: 60000, max: 100 })
883
+ */
884
+ declare const createRateLimitMiddleware: (options?: Partial<Options>) => ExpressMiddleware<
885
+ AugmentedRequest,
886
+ import("express-serve-static-core").Response<any, Record<string, any>, number>,
887
+ {
888
+ rateLimit: RateLimitInfo & Pick<RateLimitRequestHandler, "getKey" | "resetKey">;
889
+ }
890
+ >;
878
891
  interface BuildProps<
879
892
  IN extends IOSchema,
880
893
  OUT extends IOSchema | z.ZodVoid,
@@ -949,13 +962,21 @@ declare class EndpointsFactory<
949
962
  (CTX extends Record<string, never>
950
963
  ? {
951
964
  getCookie: (name: string) => z.core.util.JSONType | undefined;
952
- setCookie: (name: string, value: string | z.core.util.JSONType, overrides?: _$express.CookieOptions) => void;
953
- clearCookie: (name: string, overrides?: Omit<_$express.CookieOptions, "expires" | "maxAge">) => void;
965
+ setCookie: (
966
+ name: string,
967
+ value: string | z.core.util.JSONType,
968
+ overrides?: import("express").CookieOptions,
969
+ ) => void;
970
+ clearCookie: (name: string, overrides?: Omit<import("express").CookieOptions, "expires" | "maxAge">) => void;
954
971
  }
955
972
  : CTX) & {
956
973
  getCookie: (name: string) => z.core.util.JSONType | undefined;
957
- setCookie: (name: string, value: string | z.core.util.JSONType, overrides?: _$express.CookieOptions) => void;
958
- clearCookie: (name: string, overrides?: Omit<_$express.CookieOptions, "expires" | "maxAge">) => void;
974
+ setCookie: (
975
+ name: string,
976
+ value: string | z.core.util.JSONType,
977
+ overrides?: import("express").CookieOptions,
978
+ ) => void;
979
+ clearCookie: (name: string, overrides?: Omit<import("express").CookieOptions, "expires" | "maxAge">) => void;
959
980
  },
960
981
  SCO
961
982
  >;
@@ -989,12 +1010,26 @@ declare class EndpointsFactory<
989
1010
  },
990
1011
  SCO
991
1012
  >;
1013
+ /** @desc Shorthand for .addMiddleware(createRateLimitMiddleware()) */
1014
+ useRateLimit(...args: Parameters<typeof createRateLimitMiddleware>): EndpointsFactory<
1015
+ Extension<IN, undefined>,
1016
+ (CTX extends Record<string, never>
1017
+ ? {
1018
+ rateLimit: import("express-rate-limit").RateLimitInfo &
1019
+ Pick<import("express-rate-limit").RateLimitRequestHandler, "getKey" | "resetKey">;
1020
+ }
1021
+ : CTX) & {
1022
+ rateLimit: import("express-rate-limit").RateLimitInfo &
1023
+ Pick<import("express-rate-limit").RateLimitRequestHandler, "getKey" | "resetKey">;
1024
+ },
1025
+ SCO
1026
+ >;
992
1027
  /**
993
1028
  * @desc Shorthand for addExpressMiddleware(). Use it for wrapping native Express middlewares.
994
1029
  * @see addExpressMiddleware
995
1030
  * */
996
1031
  use: <R extends Request, S extends Response, AOUT extends FlatObject = Record<string, never>>(
997
- nativeMw: (request: R, response: S, next: _$express.NextFunction) => any,
1032
+ nativeMw: (request: R, response: S, next: import("express").NextFunction) => any,
998
1033
  params_1?:
999
1034
  | {
1000
1035
  provider?: ((request: R, response: S) => AOUT | Promise<AOUT>) | undefined;
@@ -1062,10 +1097,10 @@ declare const attachRouting: (
1062
1097
  routing: Routing,
1063
1098
  ) => {
1064
1099
  notFoundHandler: express.RequestHandler<
1065
- _$express_serve_static_core0.ParamsDictionary,
1100
+ import("express-serve-static-core").ParamsDictionary,
1066
1101
  any,
1067
1102
  any,
1068
- _$qs.ParsedQs,
1103
+ import("qs").ParsedQs,
1069
1104
  Record<string, any>
1070
1105
  >;
1071
1106
  logger: AbstractLogger | BuiltinLogger;
@@ -1074,7 +1109,7 @@ declare const createServer: (
1074
1109
  config: ServerConfig,
1075
1110
  routing: Routing,
1076
1111
  ) => Promise<{
1077
- app: _$express_serve_static_core0.Express;
1112
+ app: import("express-serve-static-core").Express;
1078
1113
  logger: AbstractLogger | BuiltinLogger;
1079
1114
  servers: http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>[];
1080
1115
  }>;
@@ -1110,7 +1145,7 @@ declare const depictTags: (
1110
1145
  ) => TagObject[];
1111
1146
  /** @desc Ensures the summary string does not exceed the limit */
1112
1147
  declare const trimSummary: (summary?: string, limit?: number) => string | undefined;
1113
- type Component = "positiveResponse" | "negativeResponse" | "requestParameter" | "requestBody";
1148
+ type Component = `${ResponseVariant}Response` | "requestParameter" | "requestBody";
1114
1149
  /** @desc user defined function that creates a component description from its properties */
1115
1150
  type Descriptor = (
1116
1151
  props: Record<"method" | "path" | "operationId", string> & {
@@ -1166,20 +1201,7 @@ interface DocumentationParams {
1166
1201
  tags?: Parameters<typeof depictTags>[0];
1167
1202
  }
1168
1203
  declare class Documentation extends OpenApiBuilder {
1169
- constructor({
1170
- routing,
1171
- config,
1172
- title,
1173
- version,
1174
- serverUrl,
1175
- descriptions,
1176
- brandHandling,
1177
- tags,
1178
- isHeader,
1179
- hasHeadMethod,
1180
- summarizer,
1181
- composition,
1182
- }: DocumentationParams);
1204
+ constructor({ hasHeadMethod, ...rest }: DocumentationParams);
1183
1205
  }
1184
1206
  /** @desc An error related to the wrong Routing declaration */
1185
1207
  declare class RoutingError extends Error {
@@ -1247,13 +1269,20 @@ declare const testEndpoint: <LOG extends FlatObject, REQ extends RequestOptions>
1247
1269
  /** @desc The endpoint to test */
1248
1270
  endpoint: AbstractEndpoint;
1249
1271
  }) => Promise<{
1250
- requestMock: _$node_mocks_http0.MockRequest<
1251
- Request<_$express_serve_static_core0.ParamsDictionary, any, any, _$qs.ParsedQs, Record<string, any>> & REQ
1272
+ requestMock: import("node-mocks-http").MockRequest<
1273
+ Request<
1274
+ import("express-serve-static-core").ParamsDictionary,
1275
+ any,
1276
+ any,
1277
+ import("qs").ParsedQs,
1278
+ Record<string, any>
1279
+ > &
1280
+ REQ
1252
1281
  >;
1253
- responseMock: _$node_mocks_http0.MockResponse<Response<any, Record<string, any>>>;
1282
+ responseMock: import("node-mocks-http").MockResponse<Response<any, Record<string, any>>>;
1254
1283
  loggerMock: AbstractLogger &
1255
1284
  LOG & {
1256
- _getLogs: () => Record<"error" | "debug" | "info" | "warn", unknown[]>;
1285
+ _getLogs: () => Record<"debug" | "info" | "warn" | "error", unknown[]>;
1257
1286
  };
1258
1287
  }>;
1259
1288
  interface MiddlewareLike<RET extends FlatObject> {
@@ -1270,13 +1299,20 @@ declare const testMiddleware: <LOG extends FlatObject, REQ extends RequestOption
1270
1299
  ctx?: FlatObject;
1271
1300
  }) => Promise<{
1272
1301
  output: Partial<RET>;
1273
- requestMock: _$node_mocks_http0.MockRequest<
1274
- Request<_$express_serve_static_core0.ParamsDictionary, any, any, _$qs.ParsedQs, Record<string, any>> & REQ
1302
+ requestMock: import("node-mocks-http").MockRequest<
1303
+ Request<
1304
+ import("express-serve-static-core").ParamsDictionary,
1305
+ any,
1306
+ any,
1307
+ import("qs").ParsedQs,
1308
+ Record<string, any>
1309
+ > &
1310
+ REQ
1275
1311
  >;
1276
- responseMock: _$node_mocks_http0.MockResponse<Response<any, Record<string, any>>>;
1312
+ responseMock: import("node-mocks-http").MockResponse<Response<any, Record<string, any>>>;
1277
1313
  loggerMock: AbstractLogger &
1278
1314
  LOG & {
1279
- _getLogs: () => Record<"error" | "debug" | "info" | "warn", unknown[]>;
1315
+ _getLogs: () => Record<"debug" | "info" | "warn" | "error", unknown[]>;
1280
1316
  };
1281
1317
  }>;
1282
1318
  declare abstract class IntegrationBase {
@@ -1299,7 +1335,8 @@ interface ZTSContext extends FlatObject {
1299
1335
  }
1300
1336
  type Producer = SchemaHandler<ts.TypeNode, ZTSContext>;
1301
1337
  interface IntegrationParams {
1302
- typescript: typeof ts;
1338
+ /** @default loadPeer("typescript") */
1339
+ typescript?: typeof ts;
1303
1340
  routing: Routing;
1304
1341
  config: CommonConfig;
1305
1342
  /**
@@ -1359,6 +1396,10 @@ declare class Integration extends IntegrationBase {
1359
1396
  noBodySchema,
1360
1397
  hasHeadMethod,
1361
1398
  }: IntegrationParams);
1399
+ /**
1400
+ * @deprecated use `new Integration()` without `typescript` option on its argument
1401
+ * @todo remove in the next major — no longer needed
1402
+ * */
1362
1403
  static create(params: Omit<IntegrationParams, "typescript">): Promise<Integration>;
1363
1404
  print(printerOptions?: ts.PrinterOptions): string;
1364
1405
  printFormatted({ printerOptions, format: userDefined }?: FormattedPrintingOptions): Promise<string>;
@@ -1522,17 +1563,28 @@ declare const ez: {
1522
1563
  dateIn: ({
1523
1564
  examples,
1524
1565
  ...rest
1525
- }?: DateInParams) => _$zod.ZodPipe<
1526
- _$zod.ZodPipe<_$zod.ZodUnion<readonly [_$zod.ZodISODate, _$zod.ZodISODateTime]>, _$zod.ZodTransform<Date, string>>,
1527
- _$zod.ZodDate
1566
+ }?: DateInParams) => import("zod").ZodPipe<
1567
+ import("zod").ZodPipe<
1568
+ import("zod").ZodUnion<readonly [import("zod").ZodISODate, import("zod").ZodISODateTime]>,
1569
+ import("zod").ZodTransform<Date, string>
1570
+ >,
1571
+ import("zod").ZodDate
1528
1572
  >;
1529
1573
  dateOut: (
1530
1574
  meta?: DateOutParams,
1531
- ) => _$zod.ZodPipe<_$zod.ZodPipe<_$zod.ZodDate, _$zod.ZodTransform<string, Date>>, _$zod.ZodISODateTime>;
1532
- form: <S extends _$zod_v4_core0.$ZodShape>(base: S | _$zod.ZodObject<S>) => _$zod.ZodObject<S, _$zod_v4_core0.$strip>;
1533
- upload: () => _$zod.ZodCustom<_$express_fileupload0.UploadedFile, _$express_fileupload0.UploadedFile>;
1575
+ ) => import("zod").ZodPipe<
1576
+ import("zod").ZodPipe<import("zod").ZodDate, import("zod").ZodTransform<string, Date>>,
1577
+ import("zod").ZodISODateTime
1578
+ >;
1579
+ form: <S extends import("zod/v4/core").$ZodShape>(
1580
+ base: S | import("zod").ZodObject<S>,
1581
+ ) => import("zod").ZodObject<S, import("zod/v4/core").$strip>;
1582
+ upload: () => import("zod").ZodCustom<
1583
+ import("express-fileupload").UploadedFile,
1584
+ import("express-fileupload").UploadedFile
1585
+ >;
1534
1586
  raw: typeof raw;
1535
- buffer: () => _$zod.ZodCustom<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>;
1587
+ buffer: () => import("zod").ZodCustom<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>;
1536
1588
  paginated: typeof paginated;
1537
1589
  };
1538
1590
  export {
@@ -1576,6 +1628,7 @@ export {
1576
1628
  createCacheMiddleware,
1577
1629
  createConfig,
1578
1630
  createCookieMiddleware,
1631
+ createRateLimitMiddleware,
1579
1632
  createServer,
1580
1633
  defaultEndpointsFactory,
1581
1634
  defaultResultHandler,
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import{globalRegistry as e,z as t}from"zod";import*as n from"ramda";import r,{isHttpError as i}from"http-errors";import{isPromise as a}from"node:util/types";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 h}from"node:util";import{performance as g}from"node:perf_hooks";import _ from"express";import ee from"node:http";import te from"node:https";import{setInterval as ne}from"node:timers/promises";import{OpenApiBuilder as re,isReferenceObject as ie,isSchemaObject as v}from"openapi3-ts/oas31";import{createRequest as ae,createResponse as oe}from"node-mocks-http";function se(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`},ce=[`get`,`post`,`put`,`delete`,`patch`],le=[...ce,`head`],b=e=>ce.includes(e),ue=t.object({}),de=/:([A-Za-z0-9_]+)/g,fe=e=>e.match(de)?.map(e=>e.slice(1))||[],pe=e=>{let t=(e.header(`content-type`)||``).toLowerCase().startsWith(y.upload);return`files`in e&&t},me={get:[`query`,`params`],post:[`body`,`params`,`files`],put:[`body`,`params`],patch:[`body`,`params`],delete:[`query`,`params`]},he=[`body`,`query`,`params`],ge=e=>e.method.toLowerCase(),_e=(e,t={})=>{if(e===`options`)return[];let n=e===`head`?`get`:b(e)?e:void 0;return(n?t[n]||me[n]:void 0)||he},ve=(e,t={})=>_e(ge(e),t).filter(t=>t===`files`?pe(e):!0).reduce((t,n)=>Object.assign(t,e[n]),{}),x=e=>e instanceof Error?e:e instanceof t.ZodError?new t.ZodRealError(e.issues):Error(String(e)),S=e=>e instanceof t.ZodError?e.issues.map(({path:e,message:n})=>`${e.length?`${t.core.toDotPath(e)}: `:``}${n}`).join(`; `):e.message,C=(e,t)=>E(e)&&`_zod`in e&&(t?n.path([`_zod`,`def`,`type`],e)===t:!0),w=(e,t,r)=>e.length&&t.length?n.xprod(e,t).map(r):e.concat(t),ye=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),T=(...e)=>{let t=n.chain(e=>e.split(/[^A-Z0-9]/gi),e);return n.chain(e=>e.replaceAll(/[A-Z]+/g,e=>`/${e}`).split(`/`),t).map(ye).join(``)},be=n.tryCatch((e,n)=>typeof t.parse(e,n),n.always(void 0)),E=e=>typeof e==`object`&&!!e,xe=n.memoizeWith(()=>`static`,()=>process.env.NODE_ENV===`production`),Se=(e,t)=>!!t&&e!==`head`,D=`x-brand`,O=t=>{let{[D]:n}=e.get(t)||{};if(typeof n==`symbol`||typeof n==`string`||typeof n==`number`)return n},k=t=>{let{examples:n}=e.get(t)||{};return Array.isArray(n)?n:[]},A=Symbol(`Buffer`),Ce=()=>t.custom(e=>Buffer.isBuffer(e),{error:`Expected Buffer`}).meta({[D]:A}),j=Symbol(`DateIn`),we=({examples:e,...n}={})=>t.union([t.iso.date(),t.iso.datetime({local:!0,offset:!0})]).meta({examples:e}).transform(e=>new Date(e)).pipe(t.date()).meta({...n,[D]:j}),M=Symbol(`DateOut`),Te=(e={})=>t.date().transform(e=>e.toISOString()).pipe(t.iso.datetime()).meta({...e,[D]:M});var N=class extends Error{name=`RoutingError`;cause;constructor(e,t,n){super(e),this.cause={method:t,path:n}}},P=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.`}},Ee=class extends Error{name=`IOSchemaError`},De=class extends Ee{cause;name=`DeepCheckError`;constructor(e){super(`Found`,{cause:e}),this.cause=e}},Oe=class extends Ee{cause;name=`OutputValidationError`;constructor(e){let n=new t.ZodError(e.issues.map(({path:e,...t})=>({...t,path:[`output`,...e]})));super(S(n),{cause:e}),this.cause=e}},F=class extends Ee{cause;name=`InputValidationError`;constructor(e){super(S(e),{cause:e}),this.cause=e}},I=class extends Error{cause;handled;name=`ResultHandlerError`;constructor(e,t){super(S(e),{cause:e}),this.cause=e,this.handled=t}},ke=class extends Error{name=`MissingPeerError`;constructor(e){super(`Missing peer dependency: ${e}. Please install it to use the feature.`)}};const Ae=Symbol(`Form`),je=e=>(e instanceof t.ZodObject?e:t.object(e)).meta({[D]:Ae}),L=Symbol(`Upload`),Me=e=>E(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,Ne=()=>t.custom(e=>Me(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}`})}).meta({[D]:L}),R=Symbol(`Raw`),Pe=t.object({raw:Ce()}),Fe=e=>Pe.extend(e).meta({[D]:R});function Ie(e){return e?Fe(e):Pe.meta({[D]:R})}const Le=(e,{io:r,condition:i})=>n.tryCatch(()=>void t.toJSONSchema(e,{io:r,unrepresentable:`any`,override:({zodSchema:e})=>{if(i(e))throw new De(e)}}),e=>e.cause)(),Re=(e,{io:r})=>{let i=[t.toJSONSchema(e,{io:r,unrepresentable:`any`})];for(let e=0;e<i.length;e++){let t=i[e];if(n.is(Object,t)){if(t.$ref===`#`)return!0;i.push(...n.values(t))}n.is(Array,t)&&i.push(...n.values(t))}return!1},ze=e=>Le(e,{condition:e=>{let t=O(e);return typeof t==`symbol`&&[L,R,Ae].includes(t)},io:`input`}),Be=[`nan`,`symbol`,`map`,`set`,`bigint`,`void`,`promise`,`never`,`function`],Ve=(e,t)=>Le(e,{io:t,condition:e=>{let n=O(e),{type:r}=e._zod.def;return!!(Be.includes(r)||n===A||t===`input`&&(r===`date`||n===M)||t===`output`&&(n===j||n===R||n===L))}}),He=(e,{variant:n,args:r,...i})=>{if(typeof e==`function`&&(e=e(...r)),e instanceof t.ZodType)return[{schema:e,...i}];if(Array.isArray(e)&&!e.length)throw new I(Error(`At least one ${n} 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}))},Ue=(e,t,{url:n},r)=>!e.expose&&t.error(`Server side error`,{error:e,url:n,payload:r}),z=e=>i(e)?e:r(e instanceof F?400:500,S(e),{cause:e.cause||e}),B=e=>xe()&&!e.expose?r(e.statusCode).message:e.message,We=e=>Object.entries(e._zod.def.shape).reduce((e,[t,r])=>w(e,k(r).map(n.objOf(t)),([e,t])=>({...e,...t})),[]),Ge=({error:e,logger:t,response:n})=>{t.error(`Result handler failure`,e);let a=B(r(500,`An error occurred while serving the result: ${e.message}.`+(e.handled?`\nOriginal error: ${e.handled.message}.`:``),{expose:i(e.cause)?e.cause.expose:!1}));n.status(500).type(`text/plain`).end(a)};var Ke=class{},V=class extends Ke{#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,...n}){try{let t=await(this.#e||ue).parseAsync(e);return this.#n({...n,input:t})}catch(e){throw e instanceof t.ZodError?new F(e):e}}},qe=class extends V{constructor(e,{provider:t=()=>({}),transformer:n=e=>e}={}){super({handler:async({request:r,response:i})=>{let{promise:o,resolve:s,reject:c}=Promise.withResolvers(),l=e=>{if(e&&e instanceof Error)return c(n(e));s(t(r,i))},u=e(r,i,l);return a(u)&&u.catch(l),o}})}},Je=class{nest(e){return{...e,"":this}}},Ye=class r extends Je{#e;#t=n.once(()=>{if(k(this.#e.outputSchema).length||!C(this.#e.outputSchema,`object`))return;let t=We(this.#e.outputSchema);if(!t.length)return;let n=this.#e.outputSchema.meta();e.remove(this.#e.outputSchema).add(this.#e.outputSchema,{...n,examples:t})});constructor(e){super(),this.#e=e}#n(e){return new r({...this.#e,...e})}deprecated(){return this.#n({deprecated:!0})}get isDeprecated(){return this.#e.deprecated||!1}get description(){return this.#e.description}get summary(){return this.#e.summary}get methods(){return Object.freeze(this.#e.methods)}get inputSchema(){return this.#e.inputSchema}get outputSchema(){return this.#e.outputSchema}get requestType(){let e=ze(this.#e.inputSchema);if(e){let t=O(e);if(t===L)return`upload`;if(t===R)return`raw`;if(t===Ae)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=n.pluck(`security`,this.#e.middlewares||[]);return n.reject(n.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 t.ZodError?new Oe(e):e}}async#i({method:e,logger:t,ctx:n,response:r,...i}){for(let a of this.#e.middlewares||[])if(!(e===`options`&&!(a instanceof qe))&&(Object.assign(n,await a.execute({...i,ctx:n,response:r,logger:t})),r.writableEnded)){t.warn(`A middleware has closed the stream. Accumulated context:`,n);break}}async#a({input:e,...n}){let r;try{r=await this.#e.inputSchema.parseAsync(e)}catch(e){throw e instanceof t.ZodError?new F(e):e}return this.#e.handler({...n,input:r})}async#o(e){try{await this.#e.resultHandler.execute(e)}catch(t){Ge({...e,error:new I(x(t),e.error||void 0)})}}async execute({request:e,response:t,logger:n,config:r}){let i=ge(e),a={},o,s=ve(e,r.inputSources);try{if(await this.#i({method:i,input:s,request:e,response:t,logger:n,ctx:a}),t.writableEnded)return;if(i===`options`)return void t.status(200).end();let r=await this.#a({input:s,logger:n,ctx:a});if(t.writableEnded)return;o={output:await this.#r(r),error:null}}catch(e){o={output:null,error:x(e)}}await this.#o({...o,input:s,request:e,response:t,logger:n,ctx:a})}};const Xe=(e,t)=>e&&t?e.and(t):e||t,Ze=(e,t)=>e?e.and(t):t,H={positive:200,negative:400},Qe=Object.keys(H);var $e=class{#e;constructor(e){this.#e=e}execute(...e){return this.#e(...e)}},U=class extends $e{#e;#t;constructor(e){super(e.handler),this.#e=e.positive,this.#t=e.negative}getPositiveResponse(e){return He(this.#e,{variant:`positive`,args:[e],statusCodes:[H.positive],mimeTypes:[y.json]})}getNegativeResponse(){return He(this.#t,{variant:`negative`,args:[],statusCodes:[H.negative],mimeTypes:[y.json]})}};const et=t.object({status:t.literal(`error`),error:t.object({message:t.string()})});e.add(et,{examples:[{status:`error`,error:{message:`Sample error message`}}]});const W=new U({positive:n=>{let r=t.object({status:t.literal(`success`),data:n}),i=k(n);return i.length&&e.add(r,{examples:i.map(e=>({status:`success`,data:e}))}),r},negative:et,handler:({error:e,input:t,output:n,request:r,response:i,logger:a})=>{if(e){let n=z(e);Ue(n,a,r,t),i.status(n.statusCode).set(n.headers).json({status:`error`,error:{message:B(n)}});return}i.status(H.positive).json({status:`success`,data:n})}}),tt=t.string();e.add(tt,{examples:[`Sample error message`]});const nt=new U({positive:n=>{let r=n instanceof t.ZodObject&&`items`in n.shape&&n.shape.items instanceof t.ZodArray?n.shape.items:t.array(t.any());if(k(r).length)return r;let i=k(n).filter(e=>E(e)&&`items`in e&&Array.isArray(e.items)).map(e=>e.items);if(i?.length){let t=r.meta();e.remove(r).add(r,{...t,examples:i})}return r},negative:{schema:tt,mimeType:`text/plain`},handler:({response:e,output:t,error:n,logger:r,request:i,input:a})=>{if(n){let t=z(n);Ue(t,r,i,a),e.status(t.statusCode).type(`text/plain`).send(B(t));return}if(`items`in t&&Array.isArray(t.items)){e.status(H.positive).json(t.items);return}throw Error(`Property 'items' is missing in the endpoint output`)}}),rt=e=>{let t=[];return e.scope&&t.push(e.scope),e.noStore&&t.push(`no-store`),e.noCache&&t.push(`no-cache`),e.maxAge!==void 0&&t.push(`max-age=${e.maxAge}`),e.sMaxAge!==void 0&&t.push(`s-maxage=${e.sMaxAge}`),e.mustRevalidate&&t.push(`must-revalidate`),e.proxyRevalidate&&t.push(`proxy-revalidate`),e.mustUnderstand&&t.push(`must-understand`),e.immutable&&t.push(`immutable`),e.noTransform&&t.push(`no-transform`),e.staleWhileRevalidate!==void 0&&t.push(`stale-while-revalidate=${e.staleWhileRevalidate}`),e.staleIfError!==void 0&&t.push(`stale-if-error=${e.staleIfError}`),t.join(`, `)},it={"max-age":`maxAge`,"max-stale":`maxStale`,"min-fresh":`minFresh`,"stale-if-error":`staleIfError`},at={"no-cache":`noCache`,"no-store":`noStore`,"no-transform":`noTransform`,"only-if-cached":`onlyIfCached`},ot=e=>{if(!e)return;let t={};for(let n of e.toLowerCase().split(`,`)){let[e,r]=n.split(`=`),i=it[e.trim()];if(i){let e=parseInt(r?.trim()??``,10);isNaN(e)||(t[i]=e);continue}let a=at[e.trim()];a&&(t[a]=!0)}return t},st=e=>new V({handler:async({request:t,response:n})=>(e&&n.setHeader(`Cache-Control`,rt(e)),{get ifNoneMatch(){let e=t.headers[`if-none-match`];if(!e)return;let n=e.trim();return n===`*`?n:n.split(`,`).map(e=>e.trim().replace(/^(?:W\/)?"/,``).replace(/"$/,``))},get ifModifiedSince(){let e=t.headers[`if-modified-since`];if(!e)return;let n=new Date(e);return isNaN(n.getTime())?void 0:n},get cacheControl(){return ot(t.headers[`cache-control`])},addCachePolicy:t=>{n.setHeader(`Cache-Control`,rt({...e,...t}))},setETag:e=>{n.setHeader(`ETag`,e.startsWith(`"`)?e:`"${e}"`)},setLastModified:e=>{n.setHeader(`Last-Modified`,e.toUTCString())},setVary:(...e)=>{n.setHeader(`Vary`,e.join(`, `))},setExpires:e=>{n.setHeader(`Expires`,e.toUTCString())},clearSiteData:()=>{n.setHeader(`Clear-Site-Data`,`"cache"`)},notModified:()=>{n.status(304).end()}})}),ct=e=>new V({handler:async({request:t,response:n})=>({getCookie:e=>t.signedCookies?.[e]??t.cookies?.[e],setCookie:(t,r,i)=>{n.cookie(t,r,{...e,...i})},clearCookie:(t,r)=>{n.clearCookie(t,{...e,...r})}})});var G=class e{resultHandler;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=Xe(this.schema,t.schema),n}addMiddleware(e){return this.#e(e instanceof V?e:new V(e))}useCookies(...e){return this.#e(ct(...e))}useCache(...e){return this.#e(st(...e))}use=this.addExpressMiddleware;addExpressMiddleware(...e){return this.#e(new qe(...e))}addContext(e){return this.#e(new V({handler:({ctx:t})=>e(t)}))}build({input:e=ue,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 Ye({...o,middlewares:s,outputSchema:t,resultHandler:c,scopes:d,tags:f,methods:l,getOperationId:u,inputSchema:Ze(this.schema,e)})}buildVoid({handler:e,...t}){return this.build({...t,output:ue,handler:async t=>(await e(t),{})})}};const lt=new G(W),ut=new G(nt),dt={debug:s,info:u,warn:d(`#FFA500`),error:p,ctx:c},K={debug:10,info:20,warn:30,error:40},ft=e=>E(e)&&Object.keys(K).some(t=>t in e),pt=e=>e in K,mt=(e,t)=>K[e]<K[t],q=n.memoizeWith((e,t)=>`${e}${t}`,(e,t=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:t,style:`unit`,unitDisplay:`long`,unit:e})),ht=e=>e<1e-6?q(`nanosecond`,3).format(e/1e-6):e<.001?q(`nanosecond`).format(e/1e-6):e<1?q(`microsecond`).format(e/.001):e<1e3?q(`millisecond`).format(e):e<6e4?q(`second`,2).format(e/1e3):q(`minute`,2).format(e/6e4);var gt=class e{config;constructor({color:e=o.isSupported(),level:t=xe()?`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 h(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`||mt(e,r))return;let s=[new Date().toISOString()];i&&s.push(o?dt.ctx(i):i),s.push(o?`${dt[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=g.now();return()=>{let n=g.now()-t,{message:r,severity:i=`debug`,formatter:a=ht}=typeof e==`object`?e:{message:e};this.print(typeof i==`function`?i(n):i,r,a(n))}}},_t=class{#e;constructor(...e){this.#e=e}apply(e,t){return t(e,_.static(...this.#e))}};const J=async(e,t=`default`)=>{try{return(await import(e))[t]}catch{}throw new ke(e)},vt=e=>e.type===`object`,yt=n.mergeDeepWith((e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return n.concat(e,t);if(e===t)return t;throw Error(`Can not flatten properties`,{cause:{a:e,b:t}})}),bt=new Set([`type`,`properties`,`required`,`examples`,`description`,`additionalProperties`]),xt=e=>{for(let t of Object.keys(e))if(!bt.has(t))return!1;return!0},St=n.pair(!0),Ct=(e,t,r)=>!(`allOf`in e)||!e.allOf?[]:e.allOf.map(e=>{if(t===`throw`&&!(e.type===`object`&&xt(e)))throw Error(`Can not merge`);return n.pair(r,e)}),wt=e=>{let t=[];return e.anyOf&&t.push(...n.map(St,e.anyOf)),e.oneOf&&t.push(...n.map(St,e.oneOf)),t},Tt=(e,t,n,r)=>{if(!E(e.propertyNames))return;let i=[];typeof e.propertyNames.const==`string`&&i.push(e.propertyNames.const),e.propertyNames.enum&&i.push(...e.propertyNames.enum.filter(e=>typeof e==`string`));let a={...Object(e.additionalProperties)};for(let e of i)t.properties[e]??=a;r||n.push(...i)},Et=(e,t,r)=>{t.examples?.length&&(r?e.examples=n.concat(e.examples||[],t.examples):e.examples=w(e.examples?.filter(E)||[],t.examples.filter(E),([e,t])=>n.mergeDeepRight(e,t)))},Y=(e,t=`coerce`)=>{let r=[n.pair(!1,e)],i={type:`object`,properties:{}},a=[];for(let[e,o]of r)o.description&&(i.description??=o.description),r.push(...Ct(o,t,e)),r.push(...wt(o)),Et(i,o,e),vt(o)&&(r.push([e,{examples:Dt(o)}]),o.properties&&(i.properties=(t===`throw`?yt:n.mergeDeepRight)(i.properties,o.properties),!e&&o.required&&a.push(...o.required)),Tt(o,i,a,e));return a.length&&(i.required=[...new Set(a)]),i},Dt=e=>Object.entries(e.properties||{}).reduce((e,[t,r])=>{let{examples:i=[]}=E(r)?r:{};return w(e,i.map(n.objOf(t)),([e,t])=>({...e,...t}))},[]);var Ot=class{logger;#e=new WeakMap;constructor(e){this.logger=e}#t(e,n,r){if(!e.isSchemaChecked){for(let e of[`input`,`output`]){let i=[t.toJSONSchema(n[`${e}Schema`],{unrepresentable:`any`})];for(let t of i){t.type&&t.type!==`object`&&this.logger.warn(`Endpoint ${e} schema is not object-based`,r);for(let e of[`allOf`,`oneOf`,`anyOf`])t[e]&&i.push(...t[e])}}if(n.requestType===`json`){let e=Ve(n.inputSchema,`input`);e&&this.logger.warn(`The final input schema of the endpoint contains an unsupported JSON payload type.`,{...r,reason:e})}for(let e of Qe)for(let{mimeTypes:t,schema:i}of n.getResponses(e)){if(!t?.includes(y.json))continue;let n=Ve(i,`output`);n&&this.logger.warn(`The final ${e} response schema of the endpoint contains an unsupported JSON payload type.`,{...r,reason:n})}e.isSchemaChecked=!0}}#n(e,n,r,i){if(e.paths.has(r))return;let a=fe(r);if(a.length!==0){e.flat??=Y(t.toJSONSchema(n.inputSchema,{unrepresentable:`any`,io:`input`}));for(let t of a)t in e.flat.properties||this.logger.warn(`The input schema of the endpoint is most likely missing the parameter of the path it's assigned to.`,{...i,path:r,param:t});e.paths.add(r)}}check=(e,t,n)=>{let r=this.#e.get(n);r||(r={isSchemaChecked:!1,paths:new Set},this.#e.set(n,r)),this.#t(r,n,{method:e,path:t}),this.#n(r,n,t,{method:e})}};const kt=e=>(t,...n)=>{e(t,...n),t===`get`&&e(`head`,...n)},At=e=>{let[t,n]=e.trim().split(/ (.+)/,2);return n&&b(t)?[n,t]:[e]},jt=e=>e.trim().split(`/`).filter(Boolean).join(`/`),Mt=({recognizeMethodDependentRoutes:e=!0},t,n)=>Object.entries(t).map(([t,r])=>{let[i,a]=e&&b(t)&&r instanceof Je?[`/`,t]:At(t);return[[n||``].concat(jt(i)||[]).join(`/`),r,a]}),Nt=(e,t)=>{throw new N(`Route with explicit method can only be assigned with Endpoint`,e,t)},Pt=(e,t,n)=>{if(!(!n||n.includes(e)))throw new N(`Method ${e} is not supported by the assigned Endpoint.`,e,t)},Ft=(e,t,n)=>{let r=`${e} ${t}`;if(n.has(r))throw new N(`Route has a duplicate`,e,t);n.add(r)},It=({routing:e,config:t,onEndpoint:n,onStatic:r})=>{let i=Mt(t,e),a=new Set;for(let e=0;e<i.length;e++){let[o,s,c]=i[e];if(s instanceof Je)if(c)Ft(c,o,a),Pt(c,o,s.methods),n(c,o,s);else{let{methods:e=[`get`]}=s;for(let t of e)Ft(t,o,a),n(t,o,s)}else c&&Nt(c,o),s instanceof _t?r&&s.apply(o,r):i.splice(e+1,0,...Mt(t,s,o))}},Lt=e=>e.sort((e,t)=>b(t)-+b(e)||e.localeCompare(t)).join(`, `).toUpperCase(),Rt=e=>({method:t},n,i)=>{let a=Lt(e);n.set({Allow:a}),i(r(405,`${t} is not allowed`,{headers:{Allow:a}}))},zt=e=>({"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":Lt(e),"Access-Control-Allow-Headers":`content-type`}),Bt=({app:e,getLogger:t,config:r,routing:i,parsers:a})=>{let o=xe()?void 0:new Ot(t()),s=new Map;return It({routing:i,config:r,onEndpoint:(e,t,i)=>{o?.check(e,t,i);let c=a?.[i.requestType]||[],l=n.pair(c,i);s.has(t)||s.set(t,new Map(r.cors?[[`options`,l]]:[])),s.get(t)?.set(e,l)},onStatic:e.use.bind(e)}),s},Vt=({app:e,config:t,getLogger:n,...r})=>{let i=Bt({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=[];t.cors&&o.push(async(e,r,a)=>{let o=n(e),s=zt(i),l=typeof t.cors==`function`?await t.cors({request:e,endpoint:c,logger:o,defaultHeaders:s}):s;r.set(l),a()}),o.push(...s,async(e,r)=>{let i=n(e);return c.execute({request:e,response:r,logger:i,config:t})}),e[a](r,...o)}t.hintAllowedMethods!==!1&&a.set(r,Rt(i))}for(let[t,n]of a)e.all(t,n)},Ht=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`,Ut=e=>`server`in e&&typeof e.server==`object`&&e.server!==null&&`close`in e.server&&typeof e.server.close==`function`,Wt=e=>`encrypted`in e&&typeof e.encrypted==`boolean`&&e.encrypted,Gt=({},e)=>void(!e.headersSent&&e.setHeader(`connection`,`close`)),Kt=e=>{let{promise:t,resolve:n,reject:r}=Promise.withResolvers();return e.close(e=>e?r(e):n()),t},qt=(e,{timeout:t=1e3,logger:n}={})=>{let r,i=new Set,a=e=>void i.delete(e.destroy()),o=e=>void(Ht(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`,Gt);n?.info(`Graceful shutdown`,{sockets:i.size,timeout:t});for(let e of i)(Wt(e)||Ut(e))&&o(e);for await(let e of ne(10,Date.now()))if(i.size===0||Date.now()-e>=t)break;for(let e of i)a(e);return Promise.allSettled(e.map(Kt))};return{sockets:i,shutdown:()=>r??=c()}},Jt=Symbol.for(`express-zod-api`),Yt=({errorHandler:e,getLogger:t})=>async(n,r,i,a)=>n?e.execute({error:x(n),request:r,response:i,input:null,output:null,ctx:{},logger:t(r)}):a(),Xt=({errorHandler:e,getLogger:t})=>async(n,i)=>{let a=r(404,`Can not ${n.method} ${n.path}`),o=t(n);try{await e.execute({request:n,response:i,logger:o,error:a,input:null,output:null,ctx:{}})}catch(e){Ge({response:i,logger:o,error:new I(x(e),a)})}},Zt=e=>(t,{},n)=>{if(Object.values(t?.files||[]).flat().find(({truncated:e})=>e))return n(e);n()},Qt=async({config:e})=>{let t=await J(`cookie-parser`),{secret:n,...r}={...typeof e.cookies==`object`&&e.cookies};return t(n,Object.keys(r).length?r:void 0)},$t=e=>({log:e.debug.bind(e)}),en=async({getLogger:e,config:t})=>{let n=await J(`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(Zt(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[Jt]={logger:o}),a()},rn=e=>t=>t?.res?.locals[Jt]?.logger||e,an=e=>process.on(`deprecation`,({message:t,namespace:n,name:r,stack:i})=>e.warn(`${r} (${n}): ${t}`,i.split(`
2
- `).slice(1))),on=({servers:e,logger:t,options:{timeout:n,beforeExit:r,events:i=[`SIGINT`,`SIGTERM`]}})=>{let a=qt(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 Koko`.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=`
1
+ import{createRequire as e}from"node:module";import{globalRegistry as t,z as n}from"zod";import*as r from"ramda";import i,{isHttpError as a}from"http-errors";import{isPromise as o}from"node:util/types";import s,{blue as c,cyanBright as l,gray as u,green as d,hex as f,italic as p,red as m,whiteBright as h}from"ansis";import{inspect as g}from"node:util";import{performance as _}from"node:perf_hooks";import v from"express";import ee from"node:http";import te from"node:https";import{setInterval as ne}from"node:timers/promises";import{OpenApiBuilder as re,isReferenceObject as ie,isSchemaObject as ae}from"openapi3-ts/oas31";import{createRequest as oe,createResponse as se}from"node-mocks-http";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=n.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 n.ZodError?new n.ZodRealError(e.issues):Error(String(e)),S=e=>e instanceof n.ZodError?e.issues.map(({path:e,message:t})=>`${e.length?`${n.core.toDotPath(e)}: `:``}${t}`).join(`; `):e.message,C=(e,t)=>E(e)&&`_zod`in e&&(t?r.path([`_zod`,`def`,`type`],e)===t:!0),w=(e,t,n)=>e.length&&t.length?r.xprod(e,t).map(n):e.concat(t),be=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),T=(...e)=>{let t=r.chain(e=>e.split(/[^A-Z0-9]/gi),e);return r.chain(e=>e.replaceAll(/[A-Z]+/g,e=>`/${e}`).split(`/`),t).map(be).join(``)},xe=r.tryCatch((e,t)=>typeof n.parse(e,t),r.always(void 0)),E=e=>typeof e==`object`&&!!e,Se=r.memoizeWith(()=>`static`,()=>process.env.NODE_ENV===`production`),Ce=(e,t)=>!!t&&e!==`head`,D=`x-brand`,O=e=>{let{[D]:n}=t.get(e)||{};if(typeof n==`symbol`||typeof n==`string`||typeof n==`number`)return n},k=e=>{let{examples:n}=t.get(e)||{};return Array.isArray(n)?n:[]},A=Symbol(`Buffer`),we=()=>n.custom(e=>Buffer.isBuffer(e),{error:`Expected Buffer`}).meta({[D]:A}),j=Symbol(`DateIn`),Te=({examples:e,...t}={})=>n.union([n.iso.date(),n.iso.datetime({local:!0,offset:!0})]).meta({examples:e}).transform(e=>new Date(e)).pipe(n.date()).meta({...t,[D]:j}),M=Symbol(`DateOut`),Ee=(e={})=>n.date().transform(e=>e.toISOString()).pipe(n.iso.datetime()).meta({...e,[D]:M});var N=class extends Error{name=`RoutingError`;cause;constructor(e,t,n){super(e),this.cause={method:t,path:n}}},P=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.`}},De=class extends Error{name=`IOSchemaError`},Oe=class extends De{cause;name=`DeepCheckError`;constructor(e){super(`Found`,{cause:e}),this.cause=e}},ke=class extends De{cause;name=`OutputValidationError`;constructor(e){let t=new n.ZodError(e.issues.map(({path:e,...t})=>({...t,path:[`output`,...e]})));super(S(t),{cause:e}),this.cause=e}},F=class extends De{cause;name=`InputValidationError`;constructor(e){super(S(e),{cause:e}),this.cause=e}},I=class extends Error{cause;handled;name=`ResultHandlerError`;constructor(e,t){super(S(e),{cause:e}),this.cause=e,this.handled=t}},Ae=class extends Error{name=`MissingPeerError`;constructor(e){super(`Missing peer dependency: ${e}. Please install it to use the feature.`)}};const je=Symbol(`Form`),Me=e=>(e instanceof n.ZodObject?e:n.object(e)).meta({[D]:je}),L=Symbol(`Upload`),Ne=e=>E(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,Pe=()=>n.custom(e=>Ne(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}`})}).meta({[D]:L}),R=Symbol(`Raw`),Fe=n.object({raw:we()}),Ie=e=>Fe.extend(e).meta({[D]:R});function Le(e){return e?Ie(e):Fe.meta({[D]:R})}const Re=(e,{io:t,condition:i})=>r.tryCatch(()=>void n.toJSONSchema(e,{io:t,unrepresentable:`any`,override:({zodSchema:e})=>{if(i(e))throw new Oe(e)}}),e=>e.cause)(),ze=(e,{io:t})=>{let i=[n.toJSONSchema(e,{io:t,unrepresentable:`any`})];for(let e=0;e<i.length;e++){let t=i[e];if(r.is(Object,t)){if(t.$ref===`#`)return!0;i.push(...r.values(t))}r.is(Array,t)&&i.push(...r.values(t))}return!1},Be=e=>Re(e,{condition:e=>{let t=O(e);return typeof t==`symbol`&&[L,R,je].includes(t)},io:`input`}),Ve=[`nan`,`symbol`,`map`,`set`,`bigint`,`void`,`promise`,`never`,`function`],He=(e,t)=>Re(e,{io:t,condition:e=>{let n=O(e),{type:r}=e._zod.def;return!!(Ve.includes(r)||n===A||t===`input`&&(r===`date`||n===M)||t===`output`&&(n===j||n===R||n===L))}}),Ue=(e,{variant:t,args:r,...i})=>{if(typeof e==`function`&&(e=e(...r)),e instanceof n.ZodType)return[{schema:e,...i}];if(Array.isArray(e)&&!e.length)throw new I(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}))},We=(e,t,{url:n},r)=>!e.expose&&t.error(`Server side error`,{error:e,url:n,payload:r}),z=e=>a(e)?e:i(e instanceof F?400:500,S(e),{cause:e.cause||e}),B=e=>Se()&&!e.expose?i(e.statusCode).message:e.message,Ge=e=>Object.entries(e._zod.def.shape).reduce((e,[t,n])=>w(e,k(n).map(r.objOf(t)),([e,t])=>({...e,...t})),[]),Ke=({error:e,logger:t,response:n})=>{t.error(`Result handler failure`,e);let r=B(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{},V=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 n.ZodError?new F(e):e}}},Je=class extends V{constructor(e,{provider:t=()=>({}),transformer:n=e=>e}={}){super({handler:async({request:r,response:i})=>{let{promise:a,resolve:s,reject:c}=Promise.withResolvers(),l=e=>{if(e&&e instanceof Error)return c(n(e));s(t(r,i))},u=e(r,i,l);return o(u)&&u.catch(l),a}})}},Ye=class{nest(e){return{...e,"":this}}},Xe=class e extends Ye{#e;#t=r.once(()=>{if(k(this.#e.outputSchema).length||!C(this.#e.outputSchema,`object`))return;let e=Ge(this.#e.outputSchema);if(!e.length)return;let n=this.#e.outputSchema.meta();t.remove(this.#e.outputSchema).add(this.#e.outputSchema,{...n,examples:e})});constructor(e){super(),this.#e=e}#n(t){return new e({...this.#e,...t})}deprecated(){return this.#n({deprecated:!0})}get isDeprecated(){return this.#e.deprecated||!1}get description(){return this.#e.description}get summary(){return this.#e.summary}get methods(){return Object.freeze(this.#e.methods)}get inputSchema(){return this.#e.inputSchema}get outputSchema(){return this.#e.outputSchema}get requestType(){let e=Be(this.#e.inputSchema);if(e){let t=O(e);if(t===L)return`upload`;if(t===R)return`raw`;if(t===je)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=r.pluck(`security`,this.#e.middlewares||[]);return r.reject(r.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 n.ZodError?new ke(e):e}}async#i({method:e,logger:t,ctx:n,response:r,...i}){for(let a of this.#e.middlewares||[])if(!(e===`options`&&!(a instanceof Je))&&(Object.assign(n,await a.execute({...i,ctx:n,response:r,logger:t})),r.writableEnded)){t.warn(`A middleware has closed the stream. Accumulated context:`,n);break}}async#a({input:e,...t}){let r;try{r=await this.#e.inputSchema.parseAsync(e)}catch(e){throw e instanceof n.ZodError?new F(e):e}return this.#e.handler({...t,input:r})}async#o(e){try{await this.#e.resultHandler.execute(e)}catch(t){Ke({...e,error:new I(x(t),e.error||void 0)})}}async execute({request:e,response:t,logger:n,config:r}){let i=_e(e),a={},o,s=ye(e,r.inputSources);try{if(await this.#i({method:i,input:s,request:e,response:t,logger:n,ctx:a}),t.writableEnded)return;if(i===`options`)return void t.status(200).end();let r=await this.#a({input:s,logger:n,ctx:a});if(t.writableEnded)return;o={output:await this.#r(r),error:null}}catch(e){o={output:null,error:x(e)}}await this.#o({...o,input:s,request:e,response:t,logger:n,ctx:a})}};const Ze=(e,t)=>e&&t?e.and(t):e||t,Qe=(e,t)=>e?e.and(t):t,H={positive:200,negative:400},$e=Object.keys(H);var et=class{#e;constructor(e){this.#e=e}execute(...e){return this.#e(...e)}},U=class extends et{#e;#t;constructor(e){super(e.handler),this.#e=e.positive,this.#t=e.negative}getPositiveResponse(e){return Ue(this.#e,{variant:`positive`,args:[e],statusCodes:[H.positive],mimeTypes:[y.json]})}getNegativeResponse(){return Ue(this.#t,{variant:`negative`,args:[],statusCodes:[H.negative],mimeTypes:[y.json]})}};const tt=n.object({status:n.literal(`error`),error:n.object({message:n.string()})});t.add(tt,{examples:[{status:`error`,error:{message:`Sample error message`}}]});const W=new U({positive:e=>{let r=n.object({status:n.literal(`success`),data:e}),i=k(e);return i.length&&t.add(r,{examples:i.map(e=>({status:`success`,data:e}))}),r},negative:tt,handler:({error:e,input:t,output:n,request:r,response:i,logger:a})=>{if(e){let n=z(e);We(n,a,r,t),i.status(n.statusCode).set(n.headers).json({status:`error`,error:{message:B(n)}});return}i.status(H.positive).json({status:`success`,data:n})}}),nt=n.string();t.add(nt,{examples:[`Sample error message`]});const rt=new U({positive:e=>{let r=e instanceof n.ZodObject&&`items`in e.shape&&e.shape.items instanceof n.ZodArray?e.shape.items:n.array(n.any());if(k(r).length)return r;let i=k(e).filter(e=>E(e)&&`items`in e&&Array.isArray(e.items)).map(e=>e.items);if(i?.length){let e=r.meta();t.remove(r).add(r,{...e,examples:i})}return r},negative:{schema:nt,mimeType:`text/plain`},handler:({response:e,output:t,error:n,logger:r,request:i,input:a})=>{if(n){let t=z(n);We(t,r,i,a),e.status(t.statusCode).type(`text/plain`).send(B(t));return}if(`items`in t&&Array.isArray(t.items)){e.status(H.positive).json(t.items);return}throw Error(`Property 'items' is missing in the endpoint output`)}}),it=e=>{let t=[];return e.scope&&t.push(e.scope),e.noStore&&t.push(`no-store`),e.noCache&&t.push(`no-cache`),e.maxAge!==void 0&&t.push(`max-age=${e.maxAge}`),e.sMaxAge!==void 0&&t.push(`s-maxage=${e.sMaxAge}`),e.mustRevalidate&&t.push(`must-revalidate`),e.proxyRevalidate&&t.push(`proxy-revalidate`),e.mustUnderstand&&t.push(`must-understand`),e.immutable&&t.push(`immutable`),e.noTransform&&t.push(`no-transform`),e.staleWhileRevalidate!==void 0&&t.push(`stale-while-revalidate=${e.staleWhileRevalidate}`),e.staleIfError!==void 0&&t.push(`stale-if-error=${e.staleIfError}`),t.join(`, `)},at={"max-age":`maxAge`,"max-stale":`maxStale`,"min-fresh":`minFresh`,"stale-if-error":`staleIfError`},ot={"no-cache":`noCache`,"no-store":`noStore`,"no-transform":`noTransform`,"only-if-cached":`onlyIfCached`},st=e=>{if(!e)return;let t={};for(let n of e.toLowerCase().split(`,`)){let[e,r]=n.split(`=`),i=at[e.trim()];if(i){let e=parseInt(r?.trim()??``,10);isNaN(e)||(t[i]=e);continue}let a=ot[e.trim()];a&&(t[a]=!0)}return t},ct=e=>new V({handler:async({request:t,response:n})=>(e&&n.setHeader(`Cache-Control`,it(e)),{get ifNoneMatch(){let e=t.headers[`if-none-match`];if(!e)return;let n=e.trim();return n===`*`?n:n.split(`,`).map(e=>e.trim().replace(/^(?:W\/)?"/,``).replace(/"$/,``))},get ifModifiedSince(){let e=t.headers[`if-modified-since`];if(!e)return;let n=new Date(e);return isNaN(n.getTime())?void 0:n},get cacheControl(){return st(t.headers[`cache-control`])},addCachePolicy:t=>{n.setHeader(`Cache-Control`,it({...e,...t}))},setETag:e=>{n.setHeader(`ETag`,e.startsWith(`"`)?e:`"${e}"`)},setLastModified:e=>{n.setHeader(`Last-Modified`,e.toUTCString())},setVary:(...e)=>{n.setHeader(`Vary`,e.join(`, `))},setExpires:e=>{n.setHeader(`Expires`,e.toUTCString())},clearSiteData:()=>{n.setHeader(`Clear-Site-Data`,`"cache"`)},notModified:()=>{n.status(304).end()}})}),lt=e=>new V({handler:async({request:t,response:n})=>({getCookie:e=>t.signedCookies?.[e]??t.cookies?.[e],setCookie:(t,r,i)=>{n.cookie(t,r,{...e,...i})},clearCookie:(t,r)=>{n.clearCookie(t,{...e,...r})}})});let ut;const G=(t,n=`default`)=>{try{let r=(ut??=e(import.meta.url))(t);return n==="default"?r.default===void 0?r:r.default:r[n]}catch{throw new Ae(t)}},dt=e=>{let t=G(`express-rate-limit`)({...e,handler:(e,t,n,r)=>{n(i(429,r.message))}}),{getKey:n,resetKey:r}=t,a={getKey:n,resetKey:r};return new Je(t,{provider:t=>({rateLimit:{...a,...t[e?.requestPropertyName??`rateLimit`]}})})};var K=class e{resultHandler;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=Ze(this.schema,t.schema),n}addMiddleware(e){return this.#e(e instanceof V?e:new V(e))}useCookies(...e){return this.#e(lt(...e))}useCache(...e){return this.#e(ct(...e))}useRateLimit(...e){return this.#e(dt(...e))}use=this.addExpressMiddleware;addExpressMiddleware(...e){return this.#e(new Je(...e))}addContext(e){return this.#e(new V({handler:({ctx:t})=>e(t)}))}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 Xe({...o,middlewares:s,outputSchema:t,resultHandler:c,scopes:d,tags:f,methods:l,getOperationId:u,inputSchema:Qe(this.schema,e)})}buildVoid({handler:e,...t}){return this.build({...t,output:de,handler:async t=>(await e(t),{})})}};const ft=new K(W),pt=new K(rt),mt={debug:c,info:d,warn:f(`#FFA500`),error:m,ctx:l},q={debug:10,info:20,warn:30,error:40},ht=e=>E(e)&&Object.keys(q).some(t=>t in e),gt=e=>e in q,_t=(e,t)=>q[e]<q[t],J=r.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?J(`nanosecond`,3).format(e/1e-6):e<.001?J(`nanosecond`).format(e/1e-6):e<1?J(`microsecond`).format(e/.001):e<1e3?J(`millisecond`).format(e):e<6e4?J(`second`,2).format(e/1e3):J(`minute`,2).format(e/6e4);var yt=class e{config;constructor({color:e=s.isSupported(),level:t=Se()?`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 g(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?mt.ctx(i):i),s.push(o?`${mt[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=_.now();return()=>{let n=_.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;constructor(...e){this.#e=e}apply(e,t){return t(e,v.static(...this.#e))}};const xt=e=>e.type===`object`,St=r.mergeDeepWith((e,t)=>{if(Array.isArray(e)&&Array.isArray(t))return r.concat(e,t);if(e===t)return t;throw Error(`Can not flatten properties`,{cause:{a:e,b:t}})}),Ct=new Set([`type`,`properties`,`required`,`examples`,`description`,`additionalProperties`]),wt=e=>{for(let t of Object.keys(e))if(!Ct.has(t))return!1;return!0},Tt=r.pair(!0),Et=(e,t,n)=>!(`allOf`in e)||!e.allOf?[]:e.allOf.map(e=>{if(t===`throw`&&!(e.type===`object`&&wt(e)))throw Error(`Can not merge`);return r.pair(n,e)}),Dt=e=>{let t=[];return e.anyOf&&t.push(...r.map(Tt,e.anyOf)),e.oneOf&&t.push(...r.map(Tt,e.oneOf)),t},Ot=(e,t,n,r)=>{if(!E(e.propertyNames))return;let i=[];typeof e.propertyNames.const==`string`&&i.push(e.propertyNames.const),e.propertyNames.enum&&i.push(...e.propertyNames.enum.filter(e=>typeof e==`string`));let a={...Object(e.additionalProperties)};for(let e of i)t.properties[e]??=a;r||n.push(...i)},kt=(e,t,n)=>{t.examples?.length&&(n?e.examples=r.concat(e.examples||[],t.examples):e.examples=w(e.examples?.filter(E)||[],t.examples.filter(E),([e,t])=>r.mergeDeepRight(e,t)))},Y=(e,t=`coerce`)=>{let n=[r.pair(!1,e)],i={type:`object`,properties:{}},a=[];for(let[e,o]of n)o.description&&(i.description??=o.description),n.push(...Et(o,t,e)),n.push(...Dt(o)),kt(i,o,e),xt(o)&&(n.push([e,{examples:At(o)}]),o.properties&&(i.properties=(t===`throw`?St:r.mergeDeepRight)(i.properties,o.properties),!e&&o.required&&a.push(...o.required)),Ot(o,i,a,e));return a.length&&(i.required=[...new Set(a)]),i},At=e=>Object.entries(e.properties||{}).reduce((e,[t,n])=>{let{examples:i=[]}=E(n)?n:{};return w(e,i.map(r.objOf(t)),([e,t])=>({...e,...t}))},[]);var jt=class{logger;#e=new WeakMap;constructor(e){this.logger=e}#t(e,t,r){if(!e.isSchemaChecked){for(let e of[`input`,`output`]){let i=[n.toJSONSchema(t[`${e}Schema`],{unrepresentable:`any`})];for(let t of i){t.type&&t.type!==`object`&&this.logger.warn(`Endpoint ${e} schema is not object-based`,r);for(let e of[`allOf`,`oneOf`,`anyOf`])t[e]&&i.push(...t[e])}}if(t.requestType===`json`){let e=He(t.inputSchema,`input`);e&&this.logger.warn(`The final input schema of the endpoint contains an unsupported JSON payload type.`,{...r,reason:e})}for(let e of $e)for(let{mimeTypes:n,schema:i}of t.getResponses(e)){if(!n?.includes(y.json))continue;let t=He(i,`output`);t&&this.logger.warn(`The final ${e} response schema of the endpoint contains an unsupported JSON payload type.`,{...r,reason:t})}e.isSchemaChecked=!0}}#n(e,t,r,i){if(e.paths.has(r))return;let a=pe(r);if(a.length!==0){e.flat??=Y(n.toJSONSchema(t.inputSchema,{unrepresentable:`any`,io:`input`}));for(let t of a)t in e.flat.properties||this.logger.warn(`The input schema of the endpoint is most likely missing the parameter of the path it's assigned to.`,{...i,path:r,param:t});e.paths.add(r)}}check=(e,t,n)=>{let r=this.#e.get(n);r||(r={isSchemaChecked:!1,paths:new Set},this.#e.set(n,r)),this.#t(r,n,{method:e,path:t}),this.#n(r,n,t,{method:e})}};const Mt=e=>(t,...n)=>{e(t,...n),t===`get`&&e(`head`,...n)},Nt=e=>{let[t,n]=e.trim().split(/ (.+)/,2);return n&&b(t)?[n,t]:[e]},Pt=e=>e.trim().split(`/`).filter(Boolean).join(`/`),Ft=({recognizeMethodDependentRoutes:e=!0},t,n)=>Object.entries(t).map(([t,r])=>{let[i,a]=e&&b(t)&&r instanceof Ye?[`/`,t]:Nt(t);return[[n||``].concat(Pt(i)||[]).join(`/`),r,a]}),It=(e,t)=>{throw new N(`Route with explicit method can only be assigned with Endpoint`,e,t)},Lt=(e,t,n)=>{if(!(!n||n.includes(e)))throw new N(`Method ${e} is not supported by the assigned Endpoint.`,e,t)},Rt=(e,t,n)=>{let r=`${e} ${t}`;if(n.has(r))throw new N(`Route has a duplicate`,e,t);n.add(r)},zt=({routing:e,config:t,onEndpoint:n,onStatic:r})=>{let i=Ft(t,e),a=new Set;for(let e=0;e<i.length;e++){let[o,s,c]=i[e];if(s instanceof Ye)if(c)Rt(c,o,a),Lt(c,o,s.methods),n(c,o,s);else{let{methods:e=[`get`]}=s;for(let t of e)Rt(t,o,a),n(t,o,s)}else c&&It(c,o),s instanceof bt?r&&s.apply(o,r):i.splice(e+1,0,...Ft(t,s,o))}},Bt=e=>e.sort((e,t)=>b(t)-+b(e)||e.localeCompare(t)).join(`, `).toUpperCase(),Vt=e=>({method:t},n,r)=>{let a=Bt(e);n.set({Allow:a}),r(i(405,`${t} is not allowed`,{headers:{Allow:a}}))},Ht=e=>({"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":Bt(e),"Access-Control-Allow-Headers":`content-type`}),Ut=({app:e,getLogger:t,config:n,routing:i,parsers:a})=>{let o=Se()?void 0:new jt(t()),s=new Map;return zt({routing:i,config:n,onEndpoint:(e,t,i)=>{o?.check(e,t,i);let c=a?.[i.requestType]||[],l=r.pair(c,i);s.has(t)||s.set(t,new Map(n.cors?[[`options`,l]]:[])),s.get(t)?.set(e,l)},onStatic:e.use.bind(e)}),s},Wt=({app:e,config:t,getLogger:n,...r})=>{let i=Ut({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=[];t.cors&&o.push(async(e,r,a)=>{let o=n(e),s=Ht(i),l=typeof t.cors==`function`?await t.cors({request:e,endpoint:c,logger:o,defaultHeaders:s}):s;r.set(l),a()}),o.push(...s,async(e,r)=>{let i=n(e);return c.execute({request:e,response:r,logger:i,config:t})}),e[a](r,...o)}t.hintAllowedMethods!==!1&&a.set(r,Vt(i))}for(let[t,n]of a)e.all(t,n)},Gt=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`,Kt=e=>`server`in e&&typeof e.server==`object`&&e.server!==null&&`close`in e.server&&typeof e.server.close==`function`,qt=e=>`encrypted`in e&&typeof e.encrypted==`boolean`&&e.encrypted,Jt=({},e)=>void(!e.headersSent&&e.setHeader(`connection`,`close`)),Yt=e=>{let{promise:t,resolve:n,reject:r}=Promise.withResolvers();return e.close(e=>e?r(e):n()),t},Xt=(e,{timeout:t=1e3,logger:n}={})=>{let r,i=new Set,a=e=>void i.delete(e.destroy()),o=e=>void(Gt(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`,Jt);n?.info(`Graceful shutdown`,{sockets:i.size,timeout:t});for(let e of i)(qt(e)||Kt(e))&&o(e);for await(let e of ne(10,Date.now()))if(i.size===0||Date.now()-e>=t)break;for(let e of i)a(e);return Promise.allSettled(e.map(Yt))};return{sockets:i,shutdown:()=>r??=c()}},Zt=Symbol.for(`express-zod-api`),Qt=({errorHandler:e,getLogger:t})=>async(n,r,i,a)=>n?e.execute({error:x(n),request:r,response:i,input:null,output:null,ctx:{},logger:t(r)}):a(),$t=({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,ctx:{}})}catch(e){Ke({response:r,logger:o,error:new I(x(e),a)})}},en=e=>(t,{},n)=>{if(Object.values(t?.files||[]).flat().find(({truncated:e})=>e))return n(e);n()},tn=({config:e})=>{let t=G(`cookie-parser`),{secret:n,...r}={...typeof e.cookies==`object`&&e.cookies};return t(n,Object.keys(r).length?r:void 0)},nn=e=>({log:e.debug.bind(e)}),rn=({getLogger:e,config:t})=>{let n=G(`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:nn(s)})(t,r,o)}),r&&o.push(en(r)),o},an=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},on=({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[Zt]={logger:o}),a()},sn=e=>t=>t?.res?.locals[Zt]?.logger||e,cn=e=>process.on(`deprecation`,({message:t,namespace:n,name:r,stack:i})=>e.warn(`${r} (${n}): ${t}`,i.split(`
2
+ `).slice(1))),ln=({servers:e,logger:t,options:{timeout:n,beforeExit:r,events:i=[`SIGINT`,`SIGTERM`]}})=>{let a=Xt(e,{logger:t,timeout:n}),o=async()=>{await a.shutdown(),await r?.(),process.exit()};for(let e of i)process.on(e,o)},un=e=>{if(e.columns<132)return;let t=p(`Proudly supports transgender community.`.padStart(109)),n=p(`Start your API server with I/O schema validation and custom middlewares in minutes.`.padStart(109)),r=p(`Thank you for choosing Express Zod API for your project.`.padStart(132)),i=p(`for Koko`.padEnd(20)),a=f(`#F5A9B8`),o=f(`#5BCEFA`),s=Array(14).fill(o,1,3).fill(a,3,5).fill(h,5,7).fill(a,7,9).fill(o,9,12).fill(u,12,13),c=`
3
3
  8888888888 8888888888P 888 d8888 8888888b. 8888888
4
4
  888 d88P 888 d88888 888 Y88b 888
5
5
  888 d88P 888 d88P888 888 888 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||W,n=ft(e.logger)?e.logger:new gt(e.logger);n.debug(`Running`,{build:`v28.5.0`,env:process.env.NODE_ENV||`development`}),an(n);let r=nn({logger:n,config:e}),i={getLogger:rn(n),errorHandler:t},a=Xt(i),o=Yt(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 Vt({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=_().disable(`x-powered-by`).set(`query parser`,e.queryParser??`simple`).use(o);if(e.compression){let t=await J(`compression`);s.use(t(typeof e.compression==`object`?e.compression:void 0))}e.cookies&&s.use(await Qt({config:e})),await e.beforeRouting?.({app:s,getLogger:r}),Vt({app:s,routing:t,getLogger:r,config:e,parsers:{json:[e.jsonParser||_.json()],raw:[e.rawParser||_.raw(),tn],form:[e.formParser||_.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=ee.createServer(s);c.push(t),u.push(l(t,e.http.listen))}if(e.https){let t=te.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=>E(e)&&`or`in e,fn=e=>E(e)&&`and`in e,pn=e=>!fn(e)&&!dn(e),mn=e=>{let t=n.filter(pn,e),r=n.chain(n.prop(`and`),n.filter(fn,e)),[i,a]=n.partition(pn,r),o=n.concat(t,i),s=n.filter(dn,e);return n.map(n.prop(`or`),n.concat(s,a)).reduce((e,t)=>w(e,n.map(e=>pn(e)?[e]:e.and,t),([e,t])=>n.concat(e,t)),n.reject(n.isEmpty,[o]))},hn=(e,t)=>fn(e)?n.chain(e=>hn(e,t),e.and):dn(e)?n.chain(e=>hn(e,t),e.or):e.type===t?[e.name]:[],gn=(e,t)=>new Set(n.chain(e=>hn(e,t),e));let _n;const vn=()=>_n??=new Set(`a-im.accept.accept-additions.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.amp-cache-transform.apply-to-redirect-ref.authorization.available-dictionary.c-ext.c-man.c-opt.c-pep.c-pep-info.cache-control.cal-managed-id.caldav-timezones.capsule-protocol.cdn-loop.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.cta-common-access-token.dasl.date.dav.default-style.delta-base.deprecation.depth.derived-from.destination.detached-jws.dictionary-id.differential-id.digest.dpop.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.incremental.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.odata-entityid.odata-isolation.odata-maxversion.odata-version.opt.ordering-type.origin.origin-agent-cluster.oscore.oslc-core-version.overwrite.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.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.signature.signature-input.slug.soapaction.status-uri.sunset.surrogate-capability.tcn.te.timeout.topic.traceparent.tracestate.trailer.transfer-encoding.ttl.upgrade.urgency.uri.user-agent.variant-vary.via.want-content-digest.want-digest.want-repr-digest.warning.x-content-type-options.x-frame-options`.split(`.`)),yn={integer:0,number:0,string:``,boolean:!1,object:{},null:null,array:[]},bn=e=>e.replace(de,e=>`{${e.slice(1)}}`),xn=({},e)=>{if(e.isResponse)throw new P(`Please use ez.upload() only for input.`,e);return{type:`string`,format:`binary`}},Sn=({jsonSchema:e})=>({...e,externalDocs:{description:`raw binary data`,url:`https://swagger.io/specification/#working-with-binary-data`}}),Cn=({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}}},wn=n.tryCatch(({jsonSchema:e})=>{if(!e.allOf)throw`no allOf`;return Y(e,`throw`)},(e,{jsonSchema:t})=>t),Tn=({jsonSchema:e})=>{if(!e.anyOf||!e.anyOf.length)return e;let t=e.anyOf[0];return Object.assign(t,{type:jn(t.type)})},X=e=>e,En=({jsonSchema:e},t)=>{if(t.isResponse)throw new P(`Please use ez.dateOut() for output.`,t);return e},Dn=({jsonSchema:e},t)=>{if(!t.isResponse)throw new P(`Please use ez.dateIn() for input.`,t);return e},On=()=>({type:`string`,format:`bigint`,pattern:`^-?\\d+$`}),kn=({zodSchema:e,jsonSchema:t})=>e._zod.def.rest===null?{...t,items:{not:{}}}:t,An=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return yn?.[t]},jn=e=>e===`null`?e:typeof e==`string`?[e,`null`]:e&&[...new Set(e).add(`null`)],Mn=({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=X(zn(i,{ctx:n}));if(v(a))if(n.isResponse){let e=be(r,An(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},Nn=({jsonSchema:e})=>{if(e.type!==`object`)return e;let t=e;return!t.properties||!(`raw`in t.properties)||!E(t.properties.raw)?e:t.properties.raw},Pn=e=>e.length?n.fromPairs(n.zip(n.times(e=>`example${e+1}`,e.length),n.map(n.objOf(`value`),e))):void 0,Fn=(e,t)=>t?.has(e)||e.startsWith(`x-`)||vn().has(e),In=({path:e,method:t,request:r,inputSources:i,makeRef:a,composition:o,isHeader:s,securityHeaders:c,securityCookies:l,description:u=`${t.toUpperCase()} ${e} Parameter`})=>{let d=Y(r),f=fe(e),p=i.includes(`query`),m=i.includes(`params`),h=i.includes(`headers`),g=i.includes(`cookies`)||i.includes(`signedCookies`),_=n=>{if(m&&f.includes(n))return`path`;if(g&&l?.has(n))return`cookie`;if(h&&(s?.(n,t,e)??Fn(n,c)))return`header`;if(p)return`query`};return Object.entries(d.properties).reduce((e,[t,r])=>{if(!E(r))return e;let i=_(t);if(!i)return e;let s=X(r),c=o===`components`?a(r.id||JSON.stringify(r),s,r.id||T(u,t)):s;return e.concat({name:t,in:i,deprecated:r.deprecated,required:d.required?.includes(t)||!1,description:s.description||u,schema:c,examples:Pn(v(s)&&s.examples?.length?s.examples:n.pluck(t,d.examples?.filter(n.both(E,n.has(t)))||[]))})},[])},Ln={nullable:Tn,union:Cn,bigint:On,intersection:wn,tuple:kn,pipe:Mn,[j]:En,[M]:Dn,[L]:xn,[R]:Nn,[A]:Sn},Rn=(e,t,r)=>{let i=[e,t],a=e=>/schema\d+$/.test(e)?void 0:e;for(let e=0;e<i.length;e++){let o=i[e];if(n.is(Object,o)){if(ie(o)&&!o.$ref.startsWith(`#/components`)){let e=o.$ref.split(`/`).pop(),n=t[e];n&&(o.$ref=r.makeRef(n.id||n,X(n),n.id||a(e)).$ref);continue}i.push(...n.values(o))}n.is(Array,o)&&i.push(...n.values(o))}return e},zn=(e,{ctx:n,rules:r=Ln})=>{let{$defs:i={},properties:a={}}=t.toJSONSchema(t.object({subject:e}),{unrepresentable:`any`,io:n.isResponse?`output`:`input`,override:e=>{let t=O(e.zodSchema),i=r[t&&t in r?t:e.zodSchema._zod.def.type];if(i){let t={...i(e,n)};for(let t in e.jsonSchema)delete e.jsonSchema[t];Object.assign(e.jsonSchema,t)}}});return Rn(E(a.subject)?a.subject:{},i,n)},Bn=(e,t)=>{if(ie(e))return[e,!1];let r=!1,i=n.map(e=>{let[n,i]=Bn(e,t);return r||=i,n}),a=n.omit(t),o={properties:a,examples:n.map(a),required:n.without(t),allOf:i,oneOf:i,anyOf:i},s=n.evolve(o,e);return[s,r||!!s.required?.length]},Vn=({method:e,path:t,schema:r,mimeTypes:i,variant:a,makeRef:o,composition:s,hasMultipleStatusCodes:c,statusCode:l,brandHandling:u,description:d=`${e.toUpperCase()} ${t} ${ye(a)} response ${c?l:``}`.trim()})=>{if(!Se(e,i))return{description:d};let f=X(zn(r,{rules:{...u,...Ln},ctx:{isResponse:!0,makeRef:o,path:t,method:e}})),p=[];v(f)&&f.examples&&(p.push(...f.examples),delete f.examples);let m={schema:s===`components`?o(r,f,T(d)):f,examples:Pn(p)};return{description:d,content:n.fromPairs(n.xprod(i,[m]))}},Hn=({format:e})=>{let t={type:`http`,scheme:`bearer`};return e&&(t.bearerFormat=e),t},Un=({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},Wn=({name:e})=>({type:`apiKey`,in:`header`,name:e}),Gn=({name:e})=>({type:`apiKey`,in:`cookie`,name:e}),Kn=({url:e})=>({type:`openIdConnect`,openIdConnectUrl:e}),qn=({flows:e={}})=>({type:`oauth2`,flows:n.map(e=>({...e,scopes:e.scopes||{}}),n.reject(n.isNil,e))}),Jn=(e,t=[])=>{let n=e=>e.type===`basic`?{type:`http`,scheme:`basic`}:e.type===`bearer`?Hn(e):e.type===`input`?Un(e,t):e.type===`header`?Wn(e):e.type===`cookie`?Gn(e):e.type===`openid`?Kn(e):qn(e);return e.map(e=>e.map(n))},Yn=(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:[]})},{})),Xn=({schema:e,brandHandling:t,makeRef:n,path:r,method:i})=>zn(e,{rules:{...t,...Ln},ctx:{isResponse:!1,makeRef:n,path:r,method:i}}),Zn=({method:e,path:t,schema:r,request:i,mimeType:a,makeRef:o,composition:s,paramNames:c,description:l=`${e.toUpperCase()} ${t} Request body`})=>{let[u,d]=Bn(i,c),f=X(u),p=[];v(f)&&f.examples&&(p.push(...f.examples),delete f.examples);let m={schema:s===`components`?o(r,f,T(l)):f,examples:Pn(p.length?p:Y(i).examples?.filter(e=>E(e)&&!Array.isArray(e)).map(n.omit(c))||[])},h={description:l,content:{[a]:m}};return(d||a===y.raw)&&(h.required=!0),h},Qn=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)},[]),$n=(e,t=50)=>!e||e.length<=t?e:e.slice(0,Math.max(1,t||0)-1)+`…`,er=e=>e.length?e.slice():void 0,tr=({description:e,summary:t=e,trim:n})=>n(t);var nr=class extends re{#e=new Map;#t=new Map;#n=new Map;#r(e,t,n){let r=this.#n.get(e);if(!r){let t=+!n;do r=`${n??`Schema`}${t?this.#n.size+t:``}`,t++;while(this.rootDoc.components?.schemas?.[r]);this.#n.set(e,r)}return this.addSchema(r,t),{$ref:`#/components/schemas/${r}`}}#i(e,t,n){let r=n||T(t,e),i=this.#t.get(r);if(i===void 0)return this.#t.set(r,1),r;if(n)throw new P(`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:t,title:r,version:i,serverUrl:a,descriptions:o,brandHandling:s,tags:c,isHeader:l,hasHeadMethod:u=!0,summarizer:d=tr,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,summary:u,scopes:p,inputSchema:m}=i,h=_e(e,t.inputSources),g=this.#i(r,e,i.getOperationId(e)),_=Xn({...a,schema:m}),ee=In({...a,inputSources:h,isHeader:l,securityHeaders:gn(i.security,`header`),securityCookies:gn(i.security,`cookie`),request:_,description:o?.requestParameter?.({method:e,path:r,operationId:g})}),te={};for(let t of Qe){let n=i.getResponses(t);for(let{mimeTypes:i,schema:s,statusCodes:c}of n)for(let l of c)te[l]=Vn({...a,variant:t,schema:s,mimeTypes:i,statusCode:l,hasMultipleStatusCodes:n.length>1||c.length>1,description:o?.[`${t}Response`]?.({method:e,path:r,operationId:g,statusCode:l})})}let ne=h.includes(`body`)?Zn({...a,request:_,paramNames:n.pluck(`name`,ee),schema:m,mimeType:y[i.requestType],description:o?.requestBody?.({method:e,path:r,operationId:g})}):void 0,re=Yn(Jn(mn(i.security),h),p,e=>{let t=this.#a(e);return this.addSecurityScheme(t,e),t}),ie={operationId:g,summary:d({summary:u,description:c,trim:$n}),description:c,deprecated:i.isDeprecated||void 0,tags:er(i.tags),parameters:er(ee),requestBody:ne,security:er(re),responses:te};this.addPath(bn(r),{[e]:ie})};It({routing:e,config:t,onEndpoint:u?kt(p):p}),c&&(this.rootDoc.tags=Qn(c))}};const rr=e=>ae({...e,headers:{"content-type":y.json,...e?.headers}}),ir=e=>oe(e),ar=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(e,n,r){return n===`_getLogs`?()=>t:pt(n)?(...e)=>t[n].push(e):Reflect.get(e,n,r)}})},or=({requestProps:e,responseOptions:t,configProps:n,loggerProps:r})=>{let i=rr(e),a=ir({req:i,...t});a.req=t?.req||i,i.res=a;let o=ar(r);return{requestMock:i,responseMock:a,loggerMock:o,configMock:{cors:!1,logger:o,...n}}},sr=async({endpoint:e,...t})=>{let{requestMock:n,responseMock:r,loggerMock:i,configMock:a}=or(t);return await e.execute({request:n,response:r,config:a,logger:i}),{requestMock:n,responseMock:r,loggerMock:i}},cr=async({middleware:e,ctx:t={},...n})=>{let{configMock:{inputSources:r,errorHandler:i=W},...a}=or(n),o=ve(a.requestMock,r),s={request:a.requestMock,response:a.responseMock,logger:a.loggerMock,input:o,ctx:t};try{let t=await e.execute(s);return{...a,output:t}}catch(e){return await i.execute({...s,error:x(e),output:null}),{...a,output:{}}}};var lr=class e{ts;f;exportModifier;asyncModifier;accessModifiers;#e;static#t=/^[A-Za-z_$][A-Za-z0-9_$]*$/;constructor(e){this.ts=e,this.f=this.ts.factory,this.exportModifier=[this.f.createModifier(this.ts.SyntaxKind.ExportKeyword)],this.asyncModifier=[this.f.createModifier(this.ts.SyntaxKind.AsyncKeyword)],this.accessModifiers={public:[this.f.createModifier(this.ts.SyntaxKind.PublicKeyword)],publicStatic:[this.f.createModifier(this.ts.SyntaxKind.PublicKeyword),this.f.createModifier(this.ts.SyntaxKind.StaticKeyword)],protectedReadonly:[this.f.createModifier(this.ts.SyntaxKind.ProtectedKeyword),this.f.createModifier(this.ts.SyntaxKind.ReadonlyKeyword)]},this.#e=[this.ts.SyntaxKind.AnyKeyword,this.ts.SyntaxKind.BigIntKeyword,this.ts.SyntaxKind.BooleanKeyword,this.ts.SyntaxKind.NeverKeyword,this.ts.SyntaxKind.NumberKeyword,this.ts.SyntaxKind.ObjectKeyword,this.ts.SyntaxKind.StringKeyword,this.ts.SyntaxKind.SymbolKeyword,this.ts.SyntaxKind.UndefinedKeyword,this.ts.SyntaxKind.UnknownKeyword,this.ts.SyntaxKind.VoidKeyword]}addJsDoc=(e,t)=>this.ts.addSyntheticLeadingComment(e,this.ts.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0);printNode=(e,t)=>{let n=this.ts.createSourceFile(`print.ts`,``,this.ts.ScriptTarget.Latest,!1,this.ts.ScriptKind.TS);return this.ts.createPrinter(t).printNode(this.ts.EmitHint.Unspecified,e,n)};makeId=e=>this.f.createIdentifier(e);makePropertyIdentifier=t=>typeof t==`string`&&e.#t.test(t)?this.makeId(t):this.literally(t);makeTemplate=(e,...t)=>this.f.createTemplateExpression(this.f.createTemplateHead(e),t.map(([e,n=``],r)=>this.f.createTemplateSpan(typeof e==`string`?this.makeId(e):e,r===t.length-1?this.f.createTemplateTail(n):this.f.createTemplateMiddle(n))));makeParam=(e,{type:t,mod:n,initId:r,optional:i}={})=>this.f.createParameterDeclaration(n,void 0,e,i?this.f.createToken(this.ts.SyntaxKind.QuestionToken):void 0,t?this.ensureTypeNode(t):void 0,r?this.makeId(r):void 0);makeParams=e=>Object.entries(e).map(([e,t])=>this.makeParam(e,typeof t==`string`||typeof t==`number`||typeof t==`object`&&`kind`in t?{type:t}:t));makePublicConstructor=(e,t=[])=>this.f.createConstructorDeclaration(this.accessModifiers.public,e,this.f.createBlock(t));ensureTypeNode=(e,t)=>typeof e==`number`?this.f.createKeywordTypeNode(e):typeof e==`string`||this.ts.isIdentifier(e)?this.f.createTypeReferenceNode(e,t&&n.map(this.ensureTypeNode,t)):e;makeRecordStringAny=()=>this.ensureTypeNode(`Record`,[this.ts.SyntaxKind.StringKeyword,this.ts.SyntaxKind.AnyKeyword]);makeUnion=e=>{let t=new Map;for(let n of e)t.set(this.isPrimitive(n)?n.kind:n,n);return this.f.createUnionTypeNode(Array.from(t.values()))};makeInterfaceProp=(e,t,{isOptional:r,hasUndefined:i=r,isDeprecated:a,comment:o}={})=>{let s=this.ensureTypeNode(t),c=this.f.createPropertySignature(void 0,this.makePropertyIdentifier(e),r?this.f.createToken(this.ts.SyntaxKind.QuestionToken):void 0,i?this.makeUnion([s,this.ensureTypeNode(this.ts.SyntaxKind.UndefinedKeyword)]):s),l=n.reject(n.isNil,[a?`@deprecated`:void 0,o]);return l.length?this.addJsDoc(c,l.join(` `)):c};makeOneLine=e=>this.ts.setEmitFlags(e,this.ts.EmitFlags.SingleLine);makeDeconstruction=(...e)=>this.f.createArrayBindingPattern(e.map(e=>this.f.createBindingElement(void 0,void 0,e)));makeConst=(e,t,{type:n,expose:r}={})=>this.f.createVariableStatement(r&&this.exportModifier,this.f.createVariableDeclarationList([this.f.createVariableDeclaration(e,void 0,n?this.ensureTypeNode(n):void 0,t)],this.ts.NodeFlags.Const));makePublicLiteralType=(e,t)=>this.makeType(e,this.makeUnion(n.map(this.makeLiteralType,t)),{expose:!0});makeType=(e,t,{expose:n,comment:r,params:i}={})=>{let a=this.f.createTypeAliasDeclaration(n?this.exportModifier:void 0,e,i&&this.makeTypeParams(i),t);return r?this.addJsDoc(a,r):a};makePublicProperty=(e,t)=>this.f.createPropertyDeclaration(this.accessModifiers.public,e,void 0,this.ensureTypeNode(t),void 0);makePublicMethod=(e,t,n,{typeParams:r,returns:i,isStatic:a}={})=>this.f.createMethodDeclaration(a?this.accessModifiers.publicStatic:this.accessModifiers.public,void 0,e,void 0,r&&this.makeTypeParams(r),t,i,this.f.createBlock(n));makePublicClass=(e,t,{typeParams:n}={})=>this.f.createClassDeclaration(this.exportModifier,e,n&&this.makeTypeParams(n),void 0,t);makeKeyOf=e=>this.f.createTypeOperatorNode(this.ts.SyntaxKind.KeyOfKeyword,this.ensureTypeNode(e));makePromise=e=>this.ensureTypeNode(Promise.name,[e]);makeInterface=(e,t,{expose:n,comment:r}={})=>{let i=this.f.createInterfaceDeclaration(n?this.exportModifier:void 0,e,void 0,void 0,t);return r?this.addJsDoc(i,r):i};makeTypeParams=e=>(Array.isArray(e)?e.map(e=>n.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 this.f.createTypeParameterDeclaration([],e,n?this.ensureTypeNode(n):void 0,r?this.ensureTypeNode(r):void 0)});makeArrowFn=(e,t,{isAsync:r}={})=>this.f.createArrowFunction(r?this.asyncModifier:void 0,void 0,Array.isArray(e)?n.map(this.makeParam,e):this.makeParams(e),void 0,void 0,t);makeTernary=(...e)=>{let[t,n,r]=e.map(e=>typeof e==`string`?this.makeId(e):e);return this.f.createConditionalExpression(t,this.f.createToken(this.ts.SyntaxKind.QuestionToken),n,this.f.createToken(this.ts.SyntaxKind.ColonToken),r)};makeCall=(e,...t)=>(...n)=>this.f.createCallExpression(t.reduce((e,t)=>typeof t==`string`||this.ts.isIdentifier(t)?this.f.createPropertyAccessExpression(e,t):this.f.createElementAccessExpression(e,t),typeof e==`string`?this.makeId(e):e),void 0,n.map(e=>typeof e==`string`?this.makeId(e):e));makeNew=(e,...t)=>this.f.createNewExpression(this.makeId(e),void 0,t);makeExtract=(e,t)=>this.ensureTypeNode(`Extract`,[e,t]);makeAssignment=(e,t)=>this.f.createExpressionStatement(this.f.createBinaryExpression(typeof e==`string`?this.makeId(e):e,this.f.createToken(this.ts.SyntaxKind.EqualsToken),t));makeIndexed=(e,t)=>this.f.createIndexedAccessTypeNode(this.ensureTypeNode(e),this.ensureTypeNode(t));makeMaybeAsync=e=>this.makeUnion([this.ensureTypeNode(e),this.makePromise(e)]);makeFnType=(e,t)=>this.f.createFunctionTypeNode(void 0,this.makeParams(e),this.ensureTypeNode(t));literally=e=>typeof e==`number`?this.f.createNumericLiteral(e):typeof e==`bigint`?this.f.createBigIntLiteral(e.toString()):typeof e==`boolean`?e?this.f.createTrue():this.f.createFalse():e===null?this.f.createNull():this.f.createStringLiteral(e);makeLiteralType=e=>this.f.createLiteralTypeNode(this.literally(e));isPrimitive=e=>this.#e.includes(e.kind)};const Z=e=>e;var ur=class{serverUrl;api;paths=new Set;tags=new Map;registry=new Map;constructor(e,t){this.serverUrl=t,this.api=new lr(e)}#e={pathType:`Path`,implementationType:`Implementation`,keyParameter:`key`,pathParameter:`path`,paramsArgument:`params`,ctxArgument:`ctx`,methodParameter:`method`,requestParameter:`request`,eventParameter:`event`,dataParameter:`data`,handlerParameter:`handler`,msgParameter:`msg`,parseRequestFn:`parseRequest`,substituteFn:`substitute`,provideMethod:`provide`,onMethod:`on`,implementationArgument:`implementation`,hasBodyConst:`hasBody`,undefinedValue:`undefined`,responseConst:`response`,restConst:`rest`,searchParamsConst:`searchParams`,defaultImplementationConst:`defaultImplementation`,clientConst:`client`,contentTypeConst:`contentType`,isJsonConst:`isJSON`,sourceProp:`source`,methodType:`Method`,someOfType:`SomeOf`,requestType:`Request`,paginationType:`Pagination`};interfaces={input:`Input`,positive:`PositiveResponse`,negative:`NegativeResponse`,encoded:`EncodedResponse`,response:`Response`};makeMethodType=()=>this.api.makePublicLiteralType(this.#e.methodType,le);makeSomeOfType=()=>this.api.makeType(this.#e.someOfType,this.api.makeIndexed(`T`,this.api.makeKeyOf(`T`)),{params:[`T`]});makeRequestType=()=>this.api.makeType(this.#e.requestType,this.api.makeKeyOf(this.interfaces.input),{expose:!0});someOf=({name:e})=>this.api.ensureTypeNode(this.#e.someOfType,[e]);makePathType=()=>this.api.makePublicLiteralType(this.#e.pathType,Array.from(this.paths));makePublicInterfaces=()=>Object.keys(this.interfaces).map(e=>this.api.makeInterface(this.interfaces[e],Array.from(this.registry).map(([t,{store:n,isDeprecated:r}])=>this.api.makeInterfaceProp(t,n[e],{isDeprecated:r})),{expose:!0}));makeEndpointTags=()=>this.api.makeConst(`endpointTags`,this.api.f.createObjectLiteralExpression(Array.from(this.tags).map(([e,t])=>this.api.f.createPropertyAssignment(this.api.makePropertyIdentifier(e),this.api.f.createArrayLiteralExpression(n.map(this.api.literally,t))))),{expose:!0});makeImplementationType=()=>this.api.makeType(this.#e.implementationType,this.api.makeFnType({[this.#e.methodParameter]:this.#e.methodType,[this.#e.pathParameter]:this.api.ts.SyntaxKind.StringKeyword,[this.#e.paramsArgument]:this.api.makeRecordStringAny(),[this.#e.ctxArgument]:{optional:!0,type:`T`}},this.api.makePromise(this.api.ts.SyntaxKind.AnyKeyword)),{expose:!0,params:{T:{init:this.api.ts.SyntaxKind.UnknownKeyword}}});makeParseRequestFn=()=>this.api.makeConst(this.#e.parseRequestFn,this.api.makeArrowFn({[this.#e.requestParameter]:this.api.ts.SyntaxKind.StringKeyword},this.api.f.createAsExpression(this.api.makeCall(this.#e.requestParameter,Z(`split`))(this.api.f.createRegularExpressionLiteral(`/ (.+)/`),this.api.literally(2)),this.api.f.createTupleTypeNode([this.api.ensureTypeNode(this.#e.methodType),this.api.ensureTypeNode(this.#e.pathType)]))));makeSubstituteFn=()=>this.api.makeConst(this.#e.substituteFn,this.api.makeArrowFn({[this.#e.pathParameter]:this.api.ts.SyntaxKind.StringKeyword,[this.#e.paramsArgument]:this.api.makeRecordStringAny()},this.api.f.createBlock([this.api.makeConst(this.#e.restConst,this.api.f.createObjectLiteralExpression([this.api.f.createSpreadAssignment(this.api.makeId(this.#e.paramsArgument))])),this.api.f.createForInStatement(this.api.f.createVariableDeclarationList([this.api.f.createVariableDeclaration(this.#e.keyParameter)],this.api.ts.NodeFlags.Const),this.api.makeId(this.#e.paramsArgument),this.api.f.createBlock([this.api.makeAssignment(this.#e.pathParameter,this.api.makeCall(this.#e.pathParameter,Z(`replace`))(this.api.makeTemplate(`:`,[this.#e.keyParameter]),this.api.makeArrowFn([],this.api.f.createBlock([this.api.f.createExpressionStatement(this.api.f.createDeleteExpression(this.api.f.createElementAccessExpression(this.api.makeId(this.#e.restConst),this.api.makeId(this.#e.keyParameter)))),this.api.f.createReturnStatement(this.api.f.createElementAccessExpression(this.api.makeId(this.#e.paramsArgument),this.api.makeId(this.#e.keyParameter)))]))))])),this.api.f.createReturnStatement(this.api.f.createAsExpression(this.api.f.createArrayLiteralExpression([this.api.makeId(this.#e.pathParameter),this.api.makeId(this.#e.restConst)]),this.api.ensureTypeNode(`const`)))])));makePaginationType=()=>{let e=Z(`nextCursor`),t=Z(`total`),n=Z(`limit`),r=Z(`offset`),i=this.api.f.createTypeLiteralNode([this.api.makeInterfaceProp(e,this.api.makeUnion([this.api.ensureTypeNode(this.api.ts.SyntaxKind.StringKeyword),this.api.makeLiteralType(null)]))]),a=this.api.f.createTypeLiteralNode([t,n,r].map(e=>this.api.makeInterfaceProp(e,this.api.ts.SyntaxKind.NumberKeyword)));return this.api.makeType(this.#e.paginationType,this.api.makeUnion([i,a]))};#t=()=>{let e=this.api.makeId(this.#e.responseConst),t=Z(`nextCursor`),n=Z(`total`),r=Z(`limit`),i=Z(`offset`),a=this.api.f.createBinaryExpression(this.api.literally(t),this.api.ts.SyntaxKind.InKeyword,e),o=this.api.f.createReturnStatement(this.api.f.createBinaryExpression(this.api.f.createPropertyAccessExpression(e,t),this.api.ts.SyntaxKind.ExclamationEqualsEqualsToken,this.api.literally(null))),s=this.api.f.createBinaryExpression(this.api.f.createPropertyAccessExpression(e,i),this.api.ts.SyntaxKind.PlusToken,this.api.f.createPropertyAccessExpression(e,r)),c=this.api.f.createReturnStatement(this.api.f.createBinaryExpression(s,this.api.ts.SyntaxKind.LessThanToken,this.api.f.createPropertyAccessExpression(e,n)));return this.api.makePublicMethod(`hasMore`,[this.api.makeParam(e,{type:this.#e.paginationType})],[this.api.f.createIfStatement(a,o),c],{returns:this.api.ensureTypeNode(this.api.ts.SyntaxKind.BooleanKeyword),isStatic:!0})};#n=()=>this.api.makePublicMethod(this.#e.provideMethod,this.api.makeParams({[this.#e.requestParameter]:`K`,[this.#e.paramsArgument]:this.api.makeIndexed(this.interfaces.input,`K`),[this.#e.ctxArgument]:{optional:!0,type:`T`}}),[this.api.makeConst(this.api.makeDeconstruction(this.#e.methodParameter,this.#e.pathParameter),this.api.makeCall(this.#e.parseRequestFn)(this.#e.requestParameter)),this.api.f.createReturnStatement(this.api.makeCall(this.api.f.createThis(),this.#e.implementationArgument)(this.#e.methodParameter,this.api.f.createSpreadElement(this.api.makeCall(this.#e.substituteFn)(this.#e.pathParameter,this.#e.paramsArgument)),this.#e.ctxArgument))],{typeParams:{K:this.#e.requestType},returns:this.api.makePromise(this.api.makeIndexed(this.interfaces.response,`K`))});makeClientClass=e=>this.api.makePublicClass(e,[this.api.makePublicConstructor([this.api.makeParam(this.#e.implementationArgument,{type:this.api.ensureTypeNode(this.#e.implementationType,[`T`]),mod:this.api.accessModifiers.protectedReadonly,initId:this.#e.defaultImplementationConst})]),this.#n(),this.#t()],{typeParams:[`T`]});#r=e=>this.api.makeTemplate(`?`,[this.api.makeNew(URLSearchParams.name,this.api.makeId(e))]);#i=()=>this.api.makeNew(URL.name,this.api.makeTemplate(``,[this.#e.pathParameter],[this.#e.searchParamsConst]),this.api.literally(this.serverUrl));makeDefaultImplementation=()=>{let e=this.api.f.createPropertyAssignment(Z(`method`),this.api.makeCall(this.#e.methodParameter,Z(`toUpperCase`))()),t=this.api.f.createPropertyAssignment(Z(`headers`),this.api.makeTernary(this.#e.hasBodyConst,this.api.f.createObjectLiteralExpression([this.api.f.createPropertyAssignment(this.api.literally(`Content-Type`),this.api.literally(y.json))]),this.#e.undefinedValue)),n=this.api.f.createPropertyAssignment(Z(`body`),this.api.makeTernary(this.#e.hasBodyConst,this.api.makeCall(JSON[Symbol.toStringTag],Z(`stringify`))(this.#e.paramsArgument),this.#e.undefinedValue)),r=this.api.makeConst(this.#e.responseConst,this.api.f.createAwaitExpression(this.api.makeCall(fetch.name)(this.#i(),this.api.f.createObjectLiteralExpression([e,t,n])))),i=this.api.makeConst(this.#e.hasBodyConst,this.api.f.createLogicalNot(this.api.makeCall(this.api.f.createArrayLiteralExpression([this.api.literally(`get`),this.api.literally(`head`),this.api.literally(`delete`)]),Z(`includes`))(this.#e.methodParameter))),a=this.api.makeConst(this.#e.searchParamsConst,this.api.makeTernary(this.#e.hasBodyConst,this.api.literally(``),this.#r(this.#e.paramsArgument))),o=this.api.makeConst(this.#e.contentTypeConst,this.api.makeCall(this.#e.responseConst,Z(`headers`),Z(`get`))(this.api.literally(`content-type`))),s=this.api.f.createIfStatement(this.api.f.createPrefixUnaryExpression(this.api.ts.SyntaxKind.ExclamationToken,this.api.makeId(this.#e.contentTypeConst)),this.api.f.createReturnStatement()),c=this.api.makeConst(this.#e.isJsonConst,this.api.makeCall(this.#e.contentTypeConst,Z(`startsWith`))(this.api.literally(y.json))),l=this.api.f.createReturnStatement(this.api.makeCall(this.#e.responseConst,this.api.makeTernary(this.#e.isJsonConst,this.api.literally(Z(`json`)),this.api.literally(Z(`text`))))());return this.api.makeConst(this.#e.defaultImplementationConst,this.api.makeArrowFn([this.#e.methodParameter,this.#e.pathParameter,this.#e.paramsArgument],this.api.f.createBlock([i,a,r,o,s,c,l]),{isAsync:!0}),{type:this.#e.implementationType})};#a=()=>this.api.makePublicConstructor(this.api.makeParams({request:`K`,params:this.api.makeIndexed(this.interfaces.input,`K`)}),[this.api.makeConst(this.api.makeDeconstruction(this.#e.pathParameter,this.#e.restConst),this.api.makeCall(this.#e.substituteFn)(this.api.f.createElementAccessExpression(this.api.makeCall(this.#e.parseRequestFn)(this.#e.requestParameter),this.api.literally(1)),this.#e.paramsArgument)),this.api.makeConst(this.#e.searchParamsConst,this.#r(this.#e.restConst)),this.api.makeAssignment(this.api.f.createPropertyAccessExpression(this.api.f.createThis(),this.#e.sourceProp),this.api.makeNew(`EventSource`,this.#i()))]);#o=e=>this.api.f.createTypeLiteralNode([this.api.makeInterfaceProp(Z(`event`),e)]);#s=()=>this.api.makePublicMethod(this.#e.onMethod,this.api.makeParams({[this.#e.eventParameter]:`E`,[this.#e.handlerParameter]:this.api.makeFnType({[this.#e.dataParameter]:this.api.makeIndexed(this.api.makeExtract(`R`,this.api.makeOneLine(this.#o(`E`))),this.api.makeLiteralType(Z(`data`)))},this.api.makeMaybeAsync(this.api.ts.SyntaxKind.VoidKeyword))}),[this.api.f.createExpressionStatement(this.api.makeCall(this.api.f.createThis(),this.#e.sourceProp,Z(`addEventListener`))(this.#e.eventParameter,this.api.makeArrowFn([this.#e.msgParameter],this.api.makeCall(this.#e.handlerParameter)(this.api.makeCall(JSON[Symbol.toStringTag],Z(`parse`))(this.api.f.createPropertyAccessExpression(this.api.f.createParenthesizedExpression(this.api.f.createAsExpression(this.api.makeId(this.#e.msgParameter),this.api.ensureTypeNode(MessageEvent.name))),Z(`data`))))))),this.api.f.createReturnStatement(this.api.f.createThis())],{typeParams:{E:this.api.makeIndexed(`R`,this.api.makeLiteralType(Z(`event`)))}});makeSubscriptionClass=e=>this.api.makePublicClass(e,[this.api.makePublicProperty(this.#e.sourceProp,`EventSource`),this.#a(),this.#s()],{typeParams:{K:this.api.makeExtract(this.#e.requestType,this.api.f.createTemplateLiteralType(this.api.f.createTemplateHead(`get `),[this.api.f.createTemplateLiteralTypeSpan(this.api.ensureTypeNode(this.api.ts.SyntaxKind.StringKeyword),this.api.f.createTemplateTail(``))])),R:this.api.makeExtract(this.api.makeIndexed(this.interfaces.positive,`K`),this.api.makeOneLine(this.#o(this.api.ts.SyntaxKind.StringKeyword)))}});makeUsageStatements=(e,t)=>[this.api.makeConst(this.#e.clientConst,this.api.makeNew(e)),this.api.makeCall(this.#e.clientConst,this.#e.provideMethod)(this.api.literally(`get /v1/user/retrieve`),this.api.f.createObjectLiteralExpression([this.api.f.createPropertyAssignment(`id`,this.api.literally(`10`))])),this.api.makeCall(this.api.makeNew(t,this.api.literally(`get /v1/events/stream`),this.api.f.createObjectLiteralExpression()),this.#e.onMethod)(this.api.literally(`time`),this.api.makeArrowFn([`time`],this.api.f.createBlock([])))]};const dr=(e,{rules:t,onMissing:n,ctx:r={}})=>{let i=O(e),a=i&&i in t?t[i]:t[e._zod.def.type],o=e=>dr(e,{ctx:r,rules:t,onMissing:n});return a?a(e,{...r,next:o}):n(e,r)},fr={name:n.path([`name`,`text`]),type:n.path([`type`]),optional:n.path([`questionToken`])},pr=({_zod:{def:e}},{api:t})=>{let n=e.values.map(e=>e===void 0?t.ensureTypeNode(t.ts.SyntaxKind.UndefinedKeyword):t.makeLiteralType(e));return n.length===1?n[0]:t.makeUnion(n)},mr=({_zod:{def:e}},{next:t,api:n})=>{let{parts:r}=e,i=0,a=()=>{let e=``;for(;i<r.length;){let t=r[i];if(C(t))break;i++,e+=t??``}return e},o=n.f.createTemplateHead(a()),s=[];for(;i<r.length;){let e=t(r[i++]),o=a(),c=i<r.length?n.f.createTemplateMiddle:n.f.createTemplateTail;s.push(n.f.createTemplateLiteralTypeSpan(e,c(o)))}return s.length?n.f.createTemplateLiteralType(o,s):n.makeLiteralType(o.text)},hr=(n,{isResponse:r,next:i,makeAlias:a,api:o})=>{let s=()=>{let a=Object.entries(n._zod.def.shape).map(([n,a])=>{let{description:s,deprecated:c}=e.get(a)||{},l=(r?a._zod.optout:a._zod.optin)===`optional`,u=l&&!(a instanceof t.core.$ZodExactOptional);return o.makeInterfaceProp(n,i(a),{comment:s,isDeprecated:c,isOptional:l,hasUndefined:u})});return o.f.createTypeLiteralNode(a)};return Re(n,{io:r?`output`:`input`})?a(n,s):s()},gr=({_zod:{def:e}},{next:t,api:n})=>n.f.createArrayTypeNode(t(e.element)),_r=({_zod:{def:e}},{api:t})=>t.makeUnion(n.map(t.makeLiteralType,Object.values(e.entries))),vr=({_zod:{def:e}},{next:t,api:n})=>n.makeUnion(e.options.map(t)),yr=({_zod:{def:e}},{next:t,api:n})=>n.makeUnion([t(e.innerType),n.makeLiteralType(null)]),br=({_zod:{def:e}},{next:t,api:n})=>n.f.createTupleTypeNode(e.items.map(t).concat(e.rest===null?[]:n.f.createRestTypeNode(t(e.rest)))),xr=({_zod:{def:e}},{next:t,api:n})=>{let[r,i]=[e.keyType,e.valueType].map(t),a=n.ensureTypeNode(`Record`,[r,i]);return e.mode===`loose`?n.f.createIntersectionTypeNode([a,n.ensureTypeNode(`Record`,[`PropertyKey`,i])]):a},Sr=n.tryCatch((e,t)=>{if(!t.every(e.ts.isTypeLiteralNode))throw Error(`Not objects`);let r=n.chain(n.prop(`members`),t),i=n.uniqWith((...e)=>{if(!n.eqBy(fr.name,...e))return!1;if(n.both(n.eqBy(fr.type),n.eqBy(fr.optional))(...e))return!0;throw Error(`Has conflicting prop`)},r);return e.f.createTypeLiteralNode(i)},(e,t,n)=>t.f.createIntersectionTypeNode(n)),Cr=({_zod:{def:e}},{next:t,api:n})=>Sr(n,[e.left,e.right].map(t)),Q=e=>({},{api:t})=>t.ensureTypeNode(t.ts.SyntaxKind[e]),$=({_zod:{def:e}},{next:t})=>t(e.innerType),wr=(e,t)=>e.ensureTypeNode(t?e.ts.SyntaxKind.UnknownKeyword:e.ts.SyntaxKind.AnyKeyword),Tr=({_zod:{def:e}},{next:t,isResponse:n,api:r})=>{let i=e[n?`out`:`in`],a=e[n?`in`:`out`];if(!C(i,`transform`))return t(i);let o=t(a),s={[r.ts.SyntaxKind.AnyKeyword]:``,[r.ts.SyntaxKind.BigIntKeyword]:BigInt(0),[r.ts.SyntaxKind.BooleanKeyword]:!1,[r.ts.SyntaxKind.NumberKeyword]:0,[r.ts.SyntaxKind.ObjectKeyword]:{},[r.ts.SyntaxKind.StringKeyword]:``,[r.ts.SyntaxKind.UndefinedKeyword]:void 0}[o.kind],c=be(i,s),l={number:r.ts.SyntaxKind.NumberKeyword,bigint:r.ts.SyntaxKind.BigIntKeyword,boolean:r.ts.SyntaxKind.BooleanKeyword,string:r.ts.SyntaxKind.StringKeyword,undefined:r.ts.SyntaxKind.UndefinedKeyword,object:r.ts.SyntaxKind.ObjectKeyword};return r.ensureTypeNode(c&&l[c]||wr(r,n))},Er=({},{api:e})=>e.makeLiteralType(null),Dr=({_zod:{def:e}},{makeAlias:t,next:n})=>t(e.getter,()=>n(e.getter())),Or=({},{api:e})=>e.ensureTypeNode(`Buffer`),kr=(e,{next:t})=>t(e._zod.def.shape.raw),Ar={string:Q(`StringKeyword`),number:Q(`NumberKeyword`),bigint:Q(`BigIntKeyword`),boolean:Q(`BooleanKeyword`),any:Q(`AnyKeyword`),undefined:Q(`UndefinedKeyword`),[j]:Q(`StringKeyword`),[M]:Q(`StringKeyword`),never:Q(`NeverKeyword`),void:Q(`UndefinedKeyword`),unknown:Q(`UnknownKeyword`),null:Er,array:gr,tuple:br,record:xr,object:hr,literal:pr,template_literal:mr,intersection:Cr,union:vr,default:$,enum:_r,optional:$,nonoptional:$,nullable:yr,catch:$,pipe:Tr,lazy:Dr,readonly:$,[A]:Or,[R]:kr},jr=(e,{brandHandling:t,ctx:n})=>dr(e,{rules:{...t,...Ar},onMissing:({},{isResponse:e,api:t})=>wr(t,e),ctx:n});var Mr=class e extends ur{#e=[this.makeSomeOfType()];#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=this.api.makeLiteralType(null);this.#t.set(e,this.api.makeType(n,r)),this.#t.set(e,this.api.makeType(n,t()))}return this.api.ensureTypeNode(n)}constructor({typescript:e,routing:r,config:i,brandHandling:a,variant:o=`client`,clientClassName:s=`Client`,subscriptionClassName:c=`Subscription`,serverUrl:l=`https://example.com`,noBodySchema:u=t.undefined(),hasHeadMethod:d=!0}){super(e,l);let f={makeAlias:this.#r.bind(this),api:this.api},p={brandHandling:a,ctx:{...f,isResponse:!1}},m={brandHandling:a,ctx:{...f,isResponse:!0}},h=(e,t,r)=>{let i=T.bind(null,e,t),{isDeprecated:a,inputSchema:o,tags:s}=r,c=`${e} ${t}`,l=this.api.makeType(i(`input`),jr(o,p),{comment:c});this.#e.push(l);let d=Qe.reduce((t,a)=>{let o=r.getResponses(a),s=n.chain(([t,{schema:n,mimeTypes:r,statusCodes:o}])=>{let s=Se(e,r),l=this.api.makeType(i(a,`variant`,`${t+1}`),jr(s?n:u,m),{comment:c});return this.#e.push(l),o.map(e=>this.api.makeInterfaceProp(e,l.name))},Array.from(o.entries())),l=this.api.makeInterface(i(a,`response`,`variants`),s,{comment:c});return this.#e.push(l),Object.assign(t,{[a]:l})},{});this.paths.add(t);let f=this.api.makeLiteralType(c),h={input:this.api.ensureTypeNode(l.name),positive:this.someOf(d.positive),negative:this.someOf(d.negative),response:this.api.makeUnion([this.api.makeIndexed(this.interfaces.positive,f),this.api.makeIndexed(this.interfaces.negative,f)]),encoded:this.api.f.createIntersectionTypeNode([this.api.ensureTypeNode(d.positive.name),this.api.ensureTypeNode(d.negative.name)])};this.registry.set(c,{isDeprecated:a,store:h}),this.tags.set(c,s)};It({routing:r,config:i,onEndpoint:d?kt(h):h}),this.#e.unshift(...this.#t.values()),this.#e.push(this.makePathType(),this.makeMethodType(),...this.makePublicInterfaces(),this.makeRequestType()),o!==`types`&&(this.#e.push(this.makeEndpointTags(),this.makeParseRequestFn(),this.makeSubstituteFn(),this.makeImplementationType(),this.makePaginationType(),this.makeDefaultImplementation(),this.makeClientClass(s),this.makeSubscriptionClass(c)),this.#n.push(...this.makeUsageStatements(s,c)))}static async create(t){return new e({...t,typescript:await J(`typescript`)})}#i(e){return this.#n.length?this.#n.map(t=>typeof t==`string`?t:this.api.printNode(t,e)).join(`
17
+ `))},dn=e=>{e.startupLogo!==!1&&un(process.stdout);let t=e.errorHandler||W,n=ht(e.logger)?e.logger:new yt(e.logger);n.debug(`Running`,{build:`v28.7.0`,env:process.env.NODE_ENV||`development`}),cn(n);let r=on({logger:n,config:e}),i={getLogger:sn(n),errorHandler:t},a=$t(i),o=Qt(i);return{...i,logger:n,notFoundHandler:a,catcher:o,loggingMiddleware:r}},fn=(e,t)=>{let{logger:n,getLogger:r,notFoundHandler:i,loggingMiddleware:a}=dn(e);return Wt({app:e.app.use(a),routing:t,getLogger:r,config:e}),{notFoundHandler:i,logger:n}},pn=async(e,t)=>{let{logger:n,getLogger:r,notFoundHandler:i,catcher:a,loggingMiddleware:o}=dn(e),s=v().disable(`x-powered-by`).set(`query parser`,e.queryParser??`simple`).use(o);if(e.compression){let t=G(`compression`);s.use(t(typeof e.compression==`object`?e.compression:void 0))}e.cookies&&s.use(tn({config:e})),await e.beforeRouting?.({app:s,getLogger:r}),Wt({app:s,routing:t,getLogger:r,config:e,parsers:{json:[e.jsonParser||v.json()],raw:[e.rawParser||v.raw(),an],form:[e.formParser||v.urlencoded()],upload:e.upload?rn({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=ee.createServer(s);c.push(t),u.push(l(t,e.http.listen))}if(e.https){let t=te.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&&ln({logger:n,servers:c,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:s,logger:n,servers:u.map(e=>e())}},mn=e=>E(e)&&`or`in e,hn=e=>E(e)&&`and`in e,gn=e=>!hn(e)&&!mn(e),_n=e=>{let t=r.filter(gn,e),n=r.chain(r.prop(`and`),r.filter(hn,e)),[i,a]=r.partition(gn,n),o=r.concat(t,i),s=r.filter(mn,e);return r.map(r.prop(`or`),r.concat(s,a)).reduce((e,t)=>w(e,r.map(e=>gn(e)?[e]:e.and,t),([e,t])=>r.concat(e,t)),r.reject(r.isEmpty,[o]))},vn=(e,t)=>hn(e)?r.chain(e=>vn(e,t),e.and):mn(e)?r.chain(e=>vn(e,t),e.or):e.type===t?[e.name]:[],yn=(e,t)=>new Set(r.chain(e=>vn(e,t),e));let bn;const xn=()=>bn??=new Set(`a-im.accept.accept-additions.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.amp-cache-transform.apply-to-redirect-ref.authorization.available-dictionary.c-ext.c-man.c-opt.c-pep.c-pep-info.cache-control.cal-managed-id.caldav-timezones.capsule-protocol.cdn-loop.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.cta-common-access-token.dasl.date.dav.default-style.delta-base.deprecation.depth.derived-from.destination.detached-jws.dictionary-id.differential-id.digest.dpop.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.incremental.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.odata-entityid.odata-isolation.odata-maxversion.odata-version.opt.ordering-type.origin.origin-agent-cluster.oscore.oslc-core-version.overwrite.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.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.signature.signature-input.slug.soapaction.status-uri.sunset.surrogate-capability.tcn.te.timeout.topic.traceparent.tracestate.trailer.transfer-encoding.ttl.upgrade.urgency.uri.user-agent.variant-vary.via.want-content-digest.want-digest.want-repr-digest.warning.x-content-type-options.x-frame-options`.split(`.`)),Sn={integer:0,number:0,string:``,boolean:!1,object:{},null:null,array:[]},Cn=e=>e.replace(fe,e=>`{${e.slice(1)}}`),wn=({},e)=>{if(e.isResponse)throw new P(`Please use ez.upload() only for input.`,e);return{type:`string`,format:`binary`}},Tn=({jsonSchema:e})=>({...e,externalDocs:{description:`raw binary data`,url:`https://swagger.io/specification/#working-with-binary-data`}}),En=({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}}},Dn=r.tryCatch(({jsonSchema:e})=>{if(!e.allOf)throw`no allOf`;return Y(e,`throw`)},(e,{jsonSchema:t})=>t),On=({jsonSchema:e})=>{if(!e.anyOf||!e.anyOf.length)return e;let t=e.anyOf[0];return Object.assign(t,{type:Pn(t.type)})},X=e=>e,kn=({jsonSchema:e},t)=>{if(t.isResponse)throw new P(`Please use ez.dateOut() for output.`,t);return e},An=({jsonSchema:e},t)=>{if(!t.isResponse)throw new P(`Please use ez.dateIn() for input.`,t);return e},jn=()=>({type:`string`,format:`bigint`,pattern:`^-?\\d+$`}),Mn=({zodSchema:e,jsonSchema:t})=>e._zod.def.rest===null?{...t,items:{not:{}}}:t,Nn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Sn?.[t]},Pn=e=>e===`null`?e:typeof e==`string`?[e,`null`]:e&&[...new Set(e).add(`null`)],Fn=({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=X(Hn(i,{ctx:n}));if(ae(a))if(n.isResponse){let e=xe(r,Nn(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},In=({jsonSchema:e})=>{if(e.type!==`object`)return e;let t=e;return!t.properties||!(`raw`in t.properties)||!E(t.properties.raw)?e:t.properties.raw},Ln=e=>e.length?r.fromPairs(r.zip(r.times(e=>`example${e+1}`,e.length),r.map(r.objOf(`value`),e))):void 0,Rn=(e,t)=>t?.has(e)||e.startsWith(`x-`)||xn().has(e),zn=({path:e,method:t,request:n,inputSources:i,makeRef:a,composition:o,isHeader:s,securityHeaders:c,securityCookies:l,description:u=`${t.toUpperCase()} ${e} Parameter`})=>{let d=Y(n),f=pe(e),p=i.includes(`query`),m=i.includes(`params`),h=i.includes(`headers`),g=i.includes(`cookies`)||i.includes(`signedCookies`),_=n=>{if(m&&f.includes(n))return`path`;if(g&&l?.has(n))return`cookie`;if(h&&(s?.(n,t,e)??Rn(n,c)))return`header`;if(p)return`query`};return Object.entries(d.properties).reduce((e,[t,n])=>{if(!E(n))return e;let i=_(t);if(!i)return e;let s=X(n),c=o===`components`?a(n.id||JSON.stringify(n),s,n.id||T(u,t)):s;return e.concat({name:t,in:i,deprecated:n.deprecated,required:d.required?.includes(t)||!1,description:s.description||u,schema:c,examples:Ln(ae(s)&&s.examples?.length?s.examples:r.pluck(t,d.examples?.filter(r.both(E,r.has(t)))||[]))})},[])},Bn={nullable:On,union:En,bigint:jn,intersection:Dn,tuple:Mn,pipe:Fn,[j]:kn,[M]:An,[L]:wn,[R]:In,[A]:Tn},Vn=(e,t,n)=>{let i=[e,t],a=e=>/schema\d+$/.test(e)?void 0:e;for(let e=0;e<i.length;e++){let o=i[e];if(r.is(Object,o)){if(ie(o)&&!o.$ref.startsWith(`#/components`)){let e=o.$ref.split(`/`).pop(),r=t[e];r&&(o.$ref=n.makeRef(r.id||r,X(r),r.id||a(e)).$ref);continue}i.push(...r.values(o))}r.is(Array,o)&&i.push(...r.values(o))}return e},Hn=(e,{ctx:t,rules:r=Bn})=>{let{$defs:i={},properties:a={}}=n.toJSONSchema(n.object({subject:e}),{unrepresentable:`any`,io:t.isResponse?`output`:`input`,override:e=>{let n=O(e.zodSchema),i=r[n&&n in r?n:e.zodSchema._zod.def.type];if(i){let n={...i(e,t)};for(let t in e.jsonSchema)delete e.jsonSchema[t];Object.assign(e.jsonSchema,n)}}});return Vn(E(a.subject)?a.subject:{},i,t)},Un=(e,t)=>{if(ie(e))return[e,!1];let n=!1,i=r.map(e=>{let[r,i]=Un(e,t);return n||=i,r}),a=r.omit(t),o={properties:a,examples:r.map(a),required:r.without(t),allOf:i,oneOf:i,anyOf:i},s=r.evolve(o,e);return[s,n||!!s.required?.length]},Wn=({method:e,path:t,schema:n,mimeTypes:i,variant:a,makeRef:o,composition:s,hasMultipleStatusCodes:c,statusCode:l,brandHandling:u,description:d=`${e.toUpperCase()} ${t} ${be(a)} response ${c?l:``}`.trim()})=>{if(!Ce(e,i))return{description:d};let f=X(Hn(n,{rules:{...u,...Bn},ctx:{isResponse:!0,makeRef:o,path:t,method:e}})),p=[];ae(f)&&f.examples&&(p.push(...f.examples),delete f.examples);let m={schema:s===`components`?o(n,f,T(d)):f,examples:Ln(p)};return{description:d,content:r.fromPairs(r.xprod(i,[m]))}},Gn=({format:e})=>{let t={type:`http`,scheme:`bearer`};return e&&(t.bearerFormat=e),t},Kn=({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},qn=({name:e})=>({type:`apiKey`,in:`header`,name:e}),Jn=({name:e})=>({type:`apiKey`,in:`cookie`,name:e}),Yn=({url:e})=>({type:`openIdConnect`,openIdConnectUrl:e}),Xn=({flows:e={}})=>({type:`oauth2`,flows:r.map(e=>({...e,scopes:e.scopes||{}}),r.reject(r.isNil,e))}),Zn=(e,t=[])=>{let n=e=>e.type===`basic`?{type:`http`,scheme:`basic`}:e.type===`bearer`?Gn(e):e.type===`input`?Kn(e,t):e.type===`header`?qn(e):e.type===`cookie`?Jn(e):e.type===`openid`?Yn(e):Xn(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:[]})},{})),$n=({schema:e,brandHandling:t,makeRef:n,path:r,method:i})=>Hn(e,{rules:{...t,...Bn},ctx:{isResponse:!1,makeRef:n,path:r,method:i}}),er=({method:e,path:t,schema:n,request:i,mimeType:a,makeRef:o,composition:s,paramNames:c,description:l=`${e.toUpperCase()} ${t} Request body`})=>{let[u,d]=Un(i,c),f=X(u),p=[];ae(f)&&f.examples&&(p.push(...f.examples),delete f.examples);let m={schema:s===`components`?o(n,f,T(l)):f,examples:Ln(p.length?p:Y(i).examples?.filter(e=>E(e)&&!Array.isArray(e)).map(r.omit(c))||[])},h={description:l,content:{[a]:m}};return(d||a===y.raw)&&(h.required=!0),h},tr=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)},[]),nr=(e,t=50)=>!e||e.length<=t?e:e.slice(0,Math.max(1,t||0)-1)+`…`,rr=e=>e.length?e.slice():void 0,ir=({description:e,summary:t=e,trim:n})=>n(t);var ar=class extends re{#e=new Map;#t=new Map;#n=new Map;#r(e,t,n){let r=this.#n.get(e);if(!r){let t=+!n;do r=`${n??`Schema`}${t?this.#n.size+t:``}`,t++;while(this.rootDoc.components?.schemas?.[r]);this.#n.set(e,r)}return this.addSchema(r,t),{$ref:`#/components/schemas/${r}`}}#i(e,t,n){let r=n||T(t,e),i=this.#t.get(r);if(i===void 0)return this.#t.set(r,1),r;if(n)throw new P(`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}`}#o({title:e,version:t,serverUrl:n,tags:r}){this.addInfo({title:e,version:t});for(let e of typeof n==`string`?[n]:n)this.addServer({url:e});r&&(this.rootDoc.tags=tr(r))}#s({config:e,descriptions:t,brandHandling:n,isHeader:i,summarizer:a=ir,composition:o=`inline`}){return(s,c,l)=>{let u={path:c,method:s,endpoint:l,composition:o,brandHandling:n,makeRef:this.#r.bind(this)},{description:d,summary:f,scopes:p,inputSchema:m}=l,h=ve(s,e.inputSources),g=this.#i(c,s,l.getOperationId(s)),_=$n({...u,schema:m}),v=zn({...u,inputSources:h,isHeader:i,securityHeaders:yn(l.security,`header`),securityCookies:yn(l.security,`cookie`),request:_,description:t?.requestParameter?.({method:s,path:c,operationId:g})}),ee={};for(let e of $e){let n=l.getResponses(e);for(let{mimeTypes:r,schema:i,statusCodes:a}of n)for(let o of a)ee[o]=Wn({...u,variant:e,schema:i,mimeTypes:r,statusCode:o,hasMultipleStatusCodes:n.length>1||a.length>1,description:t?.[`${e}Response`]?.({method:s,path:c,operationId:g,statusCode:o})})}let te=h.includes(`body`)?er({...u,request:_,paramNames:r.pluck(`name`,v),schema:m,mimeType:y[l.requestType],description:t?.requestBody?.({method:s,path:c,operationId:g})}):void 0,ne=Qn(Zn(_n(l.security),h),p,e=>{let t=this.#a(e);return this.addSecurityScheme(t,e),t}),re={operationId:g,summary:a({summary:f,description:d,trim:nr}),description:d,deprecated:l.isDeprecated||void 0,tags:rr(l.tags),parameters:rr(v),requestBody:te,security:rr(ne),responses:ee};this.addPath(Cn(c),{[s]:re})}}constructor({hasHeadMethod:e=!0,...t}){super(),this.#o(t);let n=this.#s(t),r=e?Mt(n):n;zt({...t,onEndpoint:r})}};const or=e=>oe({...e,headers:{"content-type":y.json,...e?.headers}}),sr=e=>se(e),cr=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)}})},lr=({requestProps:e,responseOptions:t,configProps:n,loggerProps:r})=>{let i=or(e),a=sr({req:i,...t});a.req=t?.req||i,i.res=a;let o=cr(r);return{requestMock:i,responseMock:a,loggerMock:o,configMock:{cors:!1,logger:o,...n}}},ur=async({endpoint:e,...t})=>{let{requestMock:n,responseMock:r,loggerMock:i,configMock:a}=lr(t);return await e.execute({request:n,response:r,config:a,logger:i}),{requestMock:n,responseMock:r,loggerMock:i}},dr=async({middleware:e,ctx:t={},...n})=>{let{configMock:{inputSources:r,errorHandler:i=W},...a}=lr(n),o=ye(a.requestMock,r),s={request:a.requestMock,response:a.responseMock,logger:a.loggerMock,input:o,ctx:t};try{let t=await e.execute(s);return{...a,output:t}}catch(e){return await i.execute({...s,error:x(e),output:null}),{...a,output:{}}}};var fr=class e{ts;f;exportModifier;asyncModifier;accessModifiers;#e;static#t=/^[A-Za-z_$][A-Za-z0-9_$]*$/;constructor(e){this.ts=e,this.f=this.ts.factory,this.exportModifier=[this.f.createModifier(this.ts.SyntaxKind.ExportKeyword)],this.asyncModifier=[this.f.createModifier(this.ts.SyntaxKind.AsyncKeyword)],this.accessModifiers={public:[this.f.createModifier(this.ts.SyntaxKind.PublicKeyword)],publicStatic:[this.f.createModifier(this.ts.SyntaxKind.PublicKeyword),this.f.createModifier(this.ts.SyntaxKind.StaticKeyword)],protectedReadonly:[this.f.createModifier(this.ts.SyntaxKind.ProtectedKeyword),this.f.createModifier(this.ts.SyntaxKind.ReadonlyKeyword)]},this.#e=[this.ts.SyntaxKind.AnyKeyword,this.ts.SyntaxKind.BigIntKeyword,this.ts.SyntaxKind.BooleanKeyword,this.ts.SyntaxKind.NeverKeyword,this.ts.SyntaxKind.NumberKeyword,this.ts.SyntaxKind.ObjectKeyword,this.ts.SyntaxKind.StringKeyword,this.ts.SyntaxKind.SymbolKeyword,this.ts.SyntaxKind.UndefinedKeyword,this.ts.SyntaxKind.UnknownKeyword,this.ts.SyntaxKind.VoidKeyword]}addJsDoc=(e,t)=>this.ts.addSyntheticLeadingComment(e,this.ts.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0);printNode=(e,t)=>{let n=this.ts.createSourceFile(`print.ts`,``,this.ts.ScriptTarget.Latest,!1,this.ts.ScriptKind.TS);return this.ts.createPrinter(t).printNode(this.ts.EmitHint.Unspecified,e,n)};makeId=e=>this.f.createIdentifier(e);makePropertyIdentifier=t=>typeof t==`string`&&e.#t.test(t)?this.makeId(t):this.literally(t);makeTemplate=(e,...t)=>this.f.createTemplateExpression(this.f.createTemplateHead(e),t.map(([e,n=``],r)=>this.f.createTemplateSpan(typeof e==`string`?this.makeId(e):e,r===t.length-1?this.f.createTemplateTail(n):this.f.createTemplateMiddle(n))));makeParam=(e,{type:t,mod:n,initId:r,optional:i}={})=>this.f.createParameterDeclaration(n,void 0,e,i?this.f.createToken(this.ts.SyntaxKind.QuestionToken):void 0,t?this.ensureTypeNode(t):void 0,r?this.makeId(r):void 0);makeParams=e=>Object.entries(e).map(([e,t])=>this.makeParam(e,typeof t==`string`||typeof t==`number`||typeof t==`object`&&`kind`in t?{type:t}:t));makePublicConstructor=(e,t=[])=>this.f.createConstructorDeclaration(this.accessModifiers.public,e,this.f.createBlock(t));ensureTypeNode=(e,t)=>typeof e==`number`?this.f.createKeywordTypeNode(e):typeof e==`string`||this.ts.isIdentifier(e)?this.f.createTypeReferenceNode(e,t&&r.map(this.ensureTypeNode,t)):e;makeRecordStringAny=()=>this.ensureTypeNode(`Record`,[this.ts.SyntaxKind.StringKeyword,this.ts.SyntaxKind.AnyKeyword]);makeUnion=e=>{let t=new Map;for(let n of e)t.set(this.isPrimitive(n)?n.kind:n,n);return this.f.createUnionTypeNode(Array.from(t.values()))};makeInterfaceProp=(e,t,{isOptional:n,hasUndefined:i=n,isDeprecated:a,comment:o}={})=>{let s=this.ensureTypeNode(t),c=this.f.createPropertySignature(void 0,this.makePropertyIdentifier(e),n?this.f.createToken(this.ts.SyntaxKind.QuestionToken):void 0,i?this.makeUnion([s,this.ensureTypeNode(this.ts.SyntaxKind.UndefinedKeyword)]):s),l=r.reject(r.isNil,[a?`@deprecated`:void 0,o]);return l.length?this.addJsDoc(c,l.join(` `)):c};makeOneLine=e=>this.ts.setEmitFlags(e,this.ts.EmitFlags.SingleLine);makeDeconstruction=(...e)=>this.f.createArrayBindingPattern(e.map(e=>this.f.createBindingElement(void 0,void 0,e)));makeConst=(e,t,{type:n,expose:r}={})=>this.f.createVariableStatement(r&&this.exportModifier,this.f.createVariableDeclarationList([this.f.createVariableDeclaration(e,void 0,n?this.ensureTypeNode(n):void 0,t)],this.ts.NodeFlags.Const));makePublicLiteralType=(e,t)=>this.makeType(e,this.makeUnion(r.map(this.makeLiteralType,t)),{expose:!0});makeType=(e,t,{expose:n,comment:r,params:i}={})=>{let a=this.f.createTypeAliasDeclaration(n?this.exportModifier:void 0,e,i&&this.makeTypeParams(i),t);return r?this.addJsDoc(a,r):a};makePublicProperty=(e,t)=>this.f.createPropertyDeclaration(this.accessModifiers.public,e,void 0,this.ensureTypeNode(t),void 0);makePublicMethod=(e,t,n,{typeParams:r,returns:i,isStatic:a}={})=>this.f.createMethodDeclaration(a?this.accessModifiers.publicStatic:this.accessModifiers.public,void 0,e,void 0,r&&this.makeTypeParams(r),t,i,this.f.createBlock(n));makePublicClass=(e,t,{typeParams:n}={})=>this.f.createClassDeclaration(this.exportModifier,e,n&&this.makeTypeParams(n),void 0,t);makeKeyOf=e=>this.f.createTypeOperatorNode(this.ts.SyntaxKind.KeyOfKeyword,this.ensureTypeNode(e));makePromise=e=>this.ensureTypeNode(Promise.name,[e]);makeInterface=(e,t,{expose:n,comment:r}={})=>{let i=this.f.createInterfaceDeclaration(n?this.exportModifier:void 0,e,void 0,void 0,t);return r?this.addJsDoc(i,r):i};makeTypeParams=e=>(Array.isArray(e)?e.map(e=>r.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 this.f.createTypeParameterDeclaration([],e,n?this.ensureTypeNode(n):void 0,r?this.ensureTypeNode(r):void 0)});makeArrowFn=(e,t,{isAsync:n}={})=>this.f.createArrowFunction(n?this.asyncModifier:void 0,void 0,Array.isArray(e)?r.map(this.makeParam,e):this.makeParams(e),void 0,void 0,t);makeTernary=(...e)=>{let[t,n,r]=e.map(e=>typeof e==`string`?this.makeId(e):e);return this.f.createConditionalExpression(t,this.f.createToken(this.ts.SyntaxKind.QuestionToken),n,this.f.createToken(this.ts.SyntaxKind.ColonToken),r)};makeCall=(e,...t)=>(...n)=>this.f.createCallExpression(t.reduce((e,t)=>typeof t==`string`||this.ts.isIdentifier(t)?this.f.createPropertyAccessExpression(e,t):this.f.createElementAccessExpression(e,t),typeof e==`string`?this.makeId(e):e),void 0,n.map(e=>typeof e==`string`?this.makeId(e):e));makeNew=(e,...t)=>this.f.createNewExpression(this.makeId(e),void 0,t);makeExtract=(e,t)=>this.ensureTypeNode(`Extract`,[e,t]);makeAssignment=(e,t)=>this.f.createExpressionStatement(this.f.createBinaryExpression(typeof e==`string`?this.makeId(e):e,this.f.createToken(this.ts.SyntaxKind.EqualsToken),t));makeIndexed=(e,t)=>this.f.createIndexedAccessTypeNode(this.ensureTypeNode(e),this.ensureTypeNode(t));makeMaybeAsync=e=>this.makeUnion([this.ensureTypeNode(e),this.makePromise(e)]);makeFnType=(e,t)=>this.f.createFunctionTypeNode(void 0,this.makeParams(e),this.ensureTypeNode(t));literally=e=>typeof e==`number`?this.f.createNumericLiteral(e):typeof e==`bigint`?this.f.createBigIntLiteral(e.toString()):typeof e==`boolean`?e?this.f.createTrue():this.f.createFalse():e===null?this.f.createNull():this.f.createStringLiteral(e);makeLiteralType=e=>this.f.createLiteralTypeNode(this.literally(e));isPrimitive=e=>this.#e.includes(e.kind)};const Z=e=>e;var pr=class{serverUrl;api;paths=new Set;tags=new Map;registry=new Map;constructor(e,t){this.serverUrl=t,this.api=new fr(e)}#e={pathType:`Path`,implementationType:`Implementation`,keyParameter:`key`,pathParameter:`path`,paramsArgument:`params`,ctxArgument:`ctx`,methodParameter:`method`,requestParameter:`request`,eventParameter:`event`,dataParameter:`data`,handlerParameter:`handler`,msgParameter:`msg`,parseRequestFn:`parseRequest`,substituteFn:`substitute`,provideMethod:`provide`,onMethod:`on`,implementationArgument:`implementation`,hasBodyConst:`hasBody`,undefinedValue:`undefined`,responseConst:`response`,restConst:`rest`,searchParamsConst:`searchParams`,defaultImplementationConst:`defaultImplementation`,clientConst:`client`,contentTypeConst:`contentType`,isJsonConst:`isJSON`,sourceProp:`source`,methodType:`Method`,someOfType:`SomeOf`,requestType:`Request`,paginationType:`Pagination`};interfaces={input:`Input`,positive:`PositiveResponse`,negative:`NegativeResponse`,encoded:`EncodedResponse`,response:`Response`};makeMethodType=()=>this.api.makePublicLiteralType(this.#e.methodType,ue);makeSomeOfType=()=>this.api.makeType(this.#e.someOfType,this.api.makeIndexed(`T`,this.api.makeKeyOf(`T`)),{params:[`T`]});makeRequestType=()=>this.api.makeType(this.#e.requestType,this.api.makeKeyOf(this.interfaces.input),{expose:!0});someOf=({name:e})=>this.api.ensureTypeNode(this.#e.someOfType,[e]);makePathType=()=>this.api.makePublicLiteralType(this.#e.pathType,Array.from(this.paths));makePublicInterfaces=()=>Object.keys(this.interfaces).map(e=>this.api.makeInterface(this.interfaces[e],Array.from(this.registry).map(([t,{store:n,isDeprecated:r}])=>this.api.makeInterfaceProp(t,n[e],{isDeprecated:r})),{expose:!0}));makeEndpointTags=()=>this.api.makeConst(`endpointTags`,this.api.f.createObjectLiteralExpression(Array.from(this.tags).map(([e,t])=>this.api.f.createPropertyAssignment(this.api.makePropertyIdentifier(e),this.api.f.createArrayLiteralExpression(r.map(this.api.literally,t))))),{expose:!0});makeImplementationType=()=>this.api.makeType(this.#e.implementationType,this.api.makeFnType({[this.#e.methodParameter]:this.#e.methodType,[this.#e.pathParameter]:this.api.ts.SyntaxKind.StringKeyword,[this.#e.paramsArgument]:this.api.makeRecordStringAny(),[this.#e.ctxArgument]:{optional:!0,type:`T`}},this.api.makePromise(this.api.ts.SyntaxKind.AnyKeyword)),{expose:!0,params:{T:{init:this.api.ts.SyntaxKind.UnknownKeyword}}});makeParseRequestFn=()=>this.api.makeConst(this.#e.parseRequestFn,this.api.makeArrowFn({[this.#e.requestParameter]:this.api.ts.SyntaxKind.StringKeyword},this.api.f.createAsExpression(this.api.makeCall(this.#e.requestParameter,Z(`split`))(this.api.f.createRegularExpressionLiteral(`/ (.+)/`),this.api.literally(2)),this.api.f.createTupleTypeNode([this.api.ensureTypeNode(this.#e.methodType),this.api.ensureTypeNode(this.#e.pathType)]))));makeSubstituteFn=()=>this.api.makeConst(this.#e.substituteFn,this.api.makeArrowFn({[this.#e.pathParameter]:this.api.ts.SyntaxKind.StringKeyword,[this.#e.paramsArgument]:this.api.makeRecordStringAny()},this.api.f.createBlock([this.api.makeConst(this.#e.restConst,this.api.f.createObjectLiteralExpression([this.api.f.createSpreadAssignment(this.api.makeId(this.#e.paramsArgument))])),this.api.f.createForInStatement(this.api.f.createVariableDeclarationList([this.api.f.createVariableDeclaration(this.#e.keyParameter)],this.api.ts.NodeFlags.Const),this.api.makeId(this.#e.paramsArgument),this.api.f.createBlock([this.api.makeAssignment(this.#e.pathParameter,this.api.makeCall(this.#e.pathParameter,Z(`replace`))(this.api.makeTemplate(`:`,[this.#e.keyParameter]),this.api.makeArrowFn([],this.api.f.createBlock([this.api.f.createExpressionStatement(this.api.f.createDeleteExpression(this.api.f.createElementAccessExpression(this.api.makeId(this.#e.restConst),this.api.makeId(this.#e.keyParameter)))),this.api.f.createReturnStatement(this.api.f.createElementAccessExpression(this.api.makeId(this.#e.paramsArgument),this.api.makeId(this.#e.keyParameter)))]))))])),this.api.f.createReturnStatement(this.api.f.createAsExpression(this.api.f.createArrayLiteralExpression([this.api.makeId(this.#e.pathParameter),this.api.makeId(this.#e.restConst)]),this.api.ensureTypeNode(`const`)))])));makePaginationType=()=>{let e=Z(`nextCursor`),t=Z(`total`),n=Z(`limit`),r=Z(`offset`),i=this.api.f.createTypeLiteralNode([this.api.makeInterfaceProp(e,this.api.makeUnion([this.api.ensureTypeNode(this.api.ts.SyntaxKind.StringKeyword),this.api.makeLiteralType(null)]))]),a=this.api.f.createTypeLiteralNode([t,n,r].map(e=>this.api.makeInterfaceProp(e,this.api.ts.SyntaxKind.NumberKeyword)));return this.api.makeType(this.#e.paginationType,this.api.makeUnion([i,a]))};#t=()=>{let e=this.api.makeId(this.#e.responseConst),t=Z(`nextCursor`),n=Z(`total`),r=Z(`limit`),i=Z(`offset`),a=this.api.f.createBinaryExpression(this.api.literally(t),this.api.ts.SyntaxKind.InKeyword,e),o=this.api.f.createReturnStatement(this.api.f.createBinaryExpression(this.api.f.createPropertyAccessExpression(e,t),this.api.ts.SyntaxKind.ExclamationEqualsEqualsToken,this.api.literally(null))),s=this.api.f.createBinaryExpression(this.api.f.createPropertyAccessExpression(e,i),this.api.ts.SyntaxKind.PlusToken,this.api.f.createPropertyAccessExpression(e,r)),c=this.api.f.createReturnStatement(this.api.f.createBinaryExpression(s,this.api.ts.SyntaxKind.LessThanToken,this.api.f.createPropertyAccessExpression(e,n)));return this.api.makePublicMethod(`hasMore`,[this.api.makeParam(e,{type:this.#e.paginationType})],[this.api.f.createIfStatement(a,o),c],{returns:this.api.ensureTypeNode(this.api.ts.SyntaxKind.BooleanKeyword),isStatic:!0})};#n=()=>this.api.makePublicMethod(this.#e.provideMethod,this.api.makeParams({[this.#e.requestParameter]:`K`,[this.#e.paramsArgument]:this.api.makeIndexed(this.interfaces.input,`K`),[this.#e.ctxArgument]:{optional:!0,type:`T`}}),[this.api.makeConst(this.api.makeDeconstruction(this.#e.methodParameter,this.#e.pathParameter),this.api.makeCall(this.#e.parseRequestFn)(this.#e.requestParameter)),this.api.f.createReturnStatement(this.api.makeCall(this.api.f.createThis(),this.#e.implementationArgument)(this.#e.methodParameter,this.api.f.createSpreadElement(this.api.makeCall(this.#e.substituteFn)(this.#e.pathParameter,this.#e.paramsArgument)),this.#e.ctxArgument))],{typeParams:{K:this.#e.requestType},returns:this.api.makePromise(this.api.makeIndexed(this.interfaces.response,`K`))});makeClientClass=e=>this.api.makePublicClass(e,[this.api.makePublicConstructor([this.api.makeParam(this.#e.implementationArgument,{type:this.api.ensureTypeNode(this.#e.implementationType,[`T`]),mod:this.api.accessModifiers.protectedReadonly,initId:this.#e.defaultImplementationConst})]),this.#n(),this.#t()],{typeParams:[`T`]});#r=e=>this.api.makeTemplate(`?`,[this.api.makeNew(URLSearchParams.name,this.api.makeId(e))]);#i=()=>this.api.makeNew(URL.name,this.api.makeTemplate(``,[this.#e.pathParameter],[this.#e.searchParamsConst]),this.api.literally(this.serverUrl));makeDefaultImplementation=()=>{let e=this.api.f.createPropertyAssignment(Z(`method`),this.api.makeCall(this.#e.methodParameter,Z(`toUpperCase`))()),t=this.api.f.createPropertyAssignment(Z(`headers`),this.api.makeTernary(this.#e.hasBodyConst,this.api.f.createObjectLiteralExpression([this.api.f.createPropertyAssignment(this.api.literally(`Content-Type`),this.api.literally(y.json))]),this.#e.undefinedValue)),n=this.api.f.createPropertyAssignment(Z(`body`),this.api.makeTernary(this.#e.hasBodyConst,this.api.makeCall(JSON[Symbol.toStringTag],Z(`stringify`))(this.#e.paramsArgument),this.#e.undefinedValue)),r=this.api.makeConst(this.#e.responseConst,this.api.f.createAwaitExpression(this.api.makeCall(fetch.name)(this.#i(),this.api.f.createObjectLiteralExpression([e,t,n])))),i=this.api.makeConst(this.#e.hasBodyConst,this.api.f.createLogicalNot(this.api.makeCall(this.api.f.createArrayLiteralExpression([this.api.literally(`get`),this.api.literally(`head`),this.api.literally(`delete`)]),Z(`includes`))(this.#e.methodParameter))),a=this.api.makeConst(this.#e.searchParamsConst,this.api.makeTernary(this.#e.hasBodyConst,this.api.literally(``),this.#r(this.#e.paramsArgument))),o=this.api.makeConst(this.#e.contentTypeConst,this.api.makeCall(this.#e.responseConst,Z(`headers`),Z(`get`))(this.api.literally(`content-type`))),s=this.api.f.createIfStatement(this.api.f.createPrefixUnaryExpression(this.api.ts.SyntaxKind.ExclamationToken,this.api.makeId(this.#e.contentTypeConst)),this.api.f.createReturnStatement()),c=this.api.makeConst(this.#e.isJsonConst,this.api.makeCall(this.#e.contentTypeConst,Z(`startsWith`))(this.api.literally(y.json))),l=this.api.f.createReturnStatement(this.api.makeCall(this.#e.responseConst,this.api.makeTernary(this.#e.isJsonConst,this.api.literally(Z(`json`)),this.api.literally(Z(`text`))))());return this.api.makeConst(this.#e.defaultImplementationConst,this.api.makeArrowFn([this.#e.methodParameter,this.#e.pathParameter,this.#e.paramsArgument],this.api.f.createBlock([i,a,r,o,s,c,l]),{isAsync:!0}),{type:this.#e.implementationType})};#a=()=>this.api.makePublicConstructor(this.api.makeParams({request:`K`,params:this.api.makeIndexed(this.interfaces.input,`K`)}),[this.api.makeConst(this.api.makeDeconstruction(this.#e.pathParameter,this.#e.restConst),this.api.makeCall(this.#e.substituteFn)(this.api.f.createElementAccessExpression(this.api.makeCall(this.#e.parseRequestFn)(this.#e.requestParameter),this.api.literally(1)),this.#e.paramsArgument)),this.api.makeConst(this.#e.searchParamsConst,this.#r(this.#e.restConst)),this.api.makeAssignment(this.api.f.createPropertyAccessExpression(this.api.f.createThis(),this.#e.sourceProp),this.api.makeNew(`EventSource`,this.#i()))]);#o=e=>this.api.f.createTypeLiteralNode([this.api.makeInterfaceProp(Z(`event`),e)]);#s=()=>this.api.makePublicMethod(this.#e.onMethod,this.api.makeParams({[this.#e.eventParameter]:`E`,[this.#e.handlerParameter]:this.api.makeFnType({[this.#e.dataParameter]:this.api.makeIndexed(this.api.makeExtract(`R`,this.api.makeOneLine(this.#o(`E`))),this.api.makeLiteralType(Z(`data`)))},this.api.makeMaybeAsync(this.api.ts.SyntaxKind.VoidKeyword))}),[this.api.f.createExpressionStatement(this.api.makeCall(this.api.f.createThis(),this.#e.sourceProp,Z(`addEventListener`))(this.#e.eventParameter,this.api.makeArrowFn([this.#e.msgParameter],this.api.makeCall(this.#e.handlerParameter)(this.api.makeCall(JSON[Symbol.toStringTag],Z(`parse`))(this.api.f.createPropertyAccessExpression(this.api.f.createParenthesizedExpression(this.api.f.createAsExpression(this.api.makeId(this.#e.msgParameter),this.api.ensureTypeNode(MessageEvent.name))),Z(`data`))))))),this.api.f.createReturnStatement(this.api.f.createThis())],{typeParams:{E:this.api.makeIndexed(`R`,this.api.makeLiteralType(Z(`event`)))}});makeSubscriptionClass=e=>this.api.makePublicClass(e,[this.api.makePublicProperty(this.#e.sourceProp,`EventSource`),this.#a(),this.#s()],{typeParams:{K:this.api.makeExtract(this.#e.requestType,this.api.f.createTemplateLiteralType(this.api.f.createTemplateHead(`get `),[this.api.f.createTemplateLiteralTypeSpan(this.api.ensureTypeNode(this.api.ts.SyntaxKind.StringKeyword),this.api.f.createTemplateTail(``))])),R:this.api.makeExtract(this.api.makeIndexed(this.interfaces.positive,`K`),this.api.makeOneLine(this.#o(this.api.ts.SyntaxKind.StringKeyword)))}});makeUsageStatements=(e,t)=>[this.api.makeConst(this.#e.clientConst,this.api.makeNew(e)),this.api.makeCall(this.#e.clientConst,this.#e.provideMethod)(this.api.literally(`get /v1/user/retrieve`),this.api.f.createObjectLiteralExpression([this.api.f.createPropertyAssignment(`id`,this.api.literally(`10`))])),this.api.makeCall(this.api.makeNew(t,this.api.literally(`get /v1/events/stream`),this.api.f.createObjectLiteralExpression()),this.#e.onMethod)(this.api.literally(`time`),this.api.makeArrowFn([`time`],this.api.f.createBlock([])))]};const mr=(e,{rules:t,onMissing:n,ctx:r={}})=>{let i=O(e),a=i&&i in t?t[i]:t[e._zod.def.type],o=e=>mr(e,{ctx:r,rules:t,onMissing:n});return a?a(e,{...r,next:o}):n(e,r)},hr={name:r.path([`name`,`text`]),type:r.path([`type`]),optional:r.path([`questionToken`])},gr=({_zod:{def:e}},{api:t})=>{let n=e.values.map(e=>e===void 0?t.ensureTypeNode(t.ts.SyntaxKind.UndefinedKeyword):t.makeLiteralType(e));return n.length===1?n[0]:t.makeUnion(n)},_r=({_zod:{def:e}},{next:t,api:n})=>{let{parts:r}=e,i=0,a=()=>{let e=``;for(;i<r.length;){let t=r[i];if(C(t))break;i++,e+=t??``}return e},o=n.f.createTemplateHead(a()),s=[];for(;i<r.length;){let e=t(r[i++]),o=a(),c=i<r.length?n.f.createTemplateMiddle:n.f.createTemplateTail;s.push(n.f.createTemplateLiteralTypeSpan(e,c(o)))}return s.length?n.f.createTemplateLiteralType(o,s):n.makeLiteralType(o.text)},vr=(e,{isResponse:r,next:i,makeAlias:a,api:o})=>{let s=()=>{let a=Object.entries(e._zod.def.shape).map(([e,a])=>{let{description:s,deprecated:c}=t.get(a)||{},l=(r?a._zod.optout:a._zod.optin)===`optional`,u=l&&!(a instanceof n.core.$ZodExactOptional);return o.makeInterfaceProp(e,i(a),{comment:s,isDeprecated:c,isOptional:l,hasUndefined:u})});return o.f.createTypeLiteralNode(a)};return ze(e,{io:r?`output`:`input`})?a(e,s):s()},yr=({_zod:{def:e}},{next:t,api:n})=>n.f.createArrayTypeNode(t(e.element)),br=({_zod:{def:e}},{api:t})=>t.makeUnion(r.map(t.makeLiteralType,Object.values(e.entries))),xr=({_zod:{def:e}},{next:t,api:n})=>n.makeUnion(e.options.map(t)),Sr=({_zod:{def:e}},{next:t,api:n})=>n.makeUnion([t(e.innerType),n.makeLiteralType(null)]),Cr=({_zod:{def:e}},{next:t,api:n})=>n.f.createTupleTypeNode(e.items.map(t).concat(e.rest===null?[]:n.f.createRestTypeNode(t(e.rest)))),wr=({_zod:{def:e}},{next:t,api:n})=>{let[r,i]=[e.keyType,e.valueType].map(t),a=n.ensureTypeNode(`Record`,[r,i]);return e.mode===`loose`?n.f.createIntersectionTypeNode([a,n.ensureTypeNode(`Record`,[`PropertyKey`,i])]):a},Tr=r.tryCatch((e,t)=>{if(!t.every(e.ts.isTypeLiteralNode))throw Error(`Not objects`);let n=r.chain(r.prop(`members`),t),i=r.uniqWith((...e)=>{if(!r.eqBy(hr.name,...e))return!1;if(r.both(r.eqBy(hr.type),r.eqBy(hr.optional))(...e))return!0;throw Error(`Has conflicting prop`)},n);return e.f.createTypeLiteralNode(i)},(e,t,n)=>t.f.createIntersectionTypeNode(n)),Er=({_zod:{def:e}},{next:t,api:n})=>Tr(n,[e.left,e.right].map(t)),Q=e=>({},{api:t})=>t.ensureTypeNode(t.ts.SyntaxKind[e]),$=({_zod:{def:e}},{next:t})=>t(e.innerType),Dr=(e,t)=>e.ensureTypeNode(t?e.ts.SyntaxKind.UnknownKeyword:e.ts.SyntaxKind.AnyKeyword),Or=({_zod:{def:e}},{next:t,isResponse:n,api:r})=>{let i=e[n?`out`:`in`],a=e[n?`in`:`out`];if(!C(i,`transform`))return t(i);let o=t(a),s={[r.ts.SyntaxKind.AnyKeyword]:``,[r.ts.SyntaxKind.BigIntKeyword]:BigInt(0),[r.ts.SyntaxKind.BooleanKeyword]:!1,[r.ts.SyntaxKind.NumberKeyword]:0,[r.ts.SyntaxKind.ObjectKeyword]:{},[r.ts.SyntaxKind.StringKeyword]:``,[r.ts.SyntaxKind.UndefinedKeyword]:void 0}[o.kind],c=xe(i,s),l={number:r.ts.SyntaxKind.NumberKeyword,bigint:r.ts.SyntaxKind.BigIntKeyword,boolean:r.ts.SyntaxKind.BooleanKeyword,string:r.ts.SyntaxKind.StringKeyword,undefined:r.ts.SyntaxKind.UndefinedKeyword,object:r.ts.SyntaxKind.ObjectKeyword};return r.ensureTypeNode(c&&l[c]||Dr(r,n))},kr=({},{api:e})=>e.makeLiteralType(null),Ar=({_zod:{def:e}},{makeAlias:t,next:n})=>t(e.getter,()=>n(e.getter())),jr=({},{api:e})=>e.ensureTypeNode(`Buffer`),Mr=(e,{next:t})=>t(e._zod.def.shape.raw),Nr={string:Q(`StringKeyword`),number:Q(`NumberKeyword`),bigint:Q(`BigIntKeyword`),boolean:Q(`BooleanKeyword`),any:Q(`AnyKeyword`),undefined:Q(`UndefinedKeyword`),[j]:Q(`StringKeyword`),[M]:Q(`StringKeyword`),never:Q(`NeverKeyword`),void:Q(`UndefinedKeyword`),unknown:Q(`UnknownKeyword`),null:kr,array:yr,tuple:Cr,record:wr,object:vr,literal:gr,template_literal:_r,intersection:Er,union:xr,default:$,enum:br,optional:$,nonoptional:$,nullable:Sr,catch:$,pipe:Or,lazy:Ar,readonly:$,[A]:jr,[R]:Mr},Pr=(e,{brandHandling:t,ctx:n})=>mr(e,{rules:{...t,...Nr},onMissing:({},{isResponse:e,api:t})=>Dr(t,e),ctx:n});var Fr=class e extends pr{#e=[this.makeSomeOfType()];#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=this.api.makeLiteralType(null);this.#t.set(e,this.api.makeType(n,r)),this.#t.set(e,this.api.makeType(n,t()))}return this.api.ensureTypeNode(n)}constructor({typescript:e=G(`typescript`),routing:t,config:i,brandHandling:a,variant:o=`client`,clientClassName:s=`Client`,subscriptionClassName:c=`Subscription`,serverUrl:l=`https://example.com`,noBodySchema:u=n.undefined(),hasHeadMethod:d=!0}){super(e,l);let f={makeAlias:this.#r.bind(this),api:this.api},p={brandHandling:a,ctx:{...f,isResponse:!1}},m={brandHandling:a,ctx:{...f,isResponse:!0}},h=(e,t,n)=>{let i=T.bind(null,e,t),{isDeprecated:a,inputSchema:o,tags:s}=n,c=`${e} ${t}`,l=this.api.makeType(i(`input`),Pr(o,p),{comment:c});this.#e.push(l);let d=$e.reduce((t,a)=>{let o=n.getResponses(a),s=r.chain(([t,{schema:n,mimeTypes:r,statusCodes:o}])=>{let s=Ce(e,r),l=this.api.makeType(i(a,`variant`,`${t+1}`),Pr(s?n:u,m),{comment:c});return this.#e.push(l),o.map(e=>this.api.makeInterfaceProp(e,l.name))},Array.from(o.entries())),l=this.api.makeInterface(i(a,`response`,`variants`),s,{comment:c});return this.#e.push(l),Object.assign(t,{[a]:l})},{});this.paths.add(t);let f=this.api.makeLiteralType(c),h={input:this.api.ensureTypeNode(l.name),positive:this.someOf(d.positive),negative:this.someOf(d.negative),response:this.api.makeUnion([this.api.makeIndexed(this.interfaces.positive,f),this.api.makeIndexed(this.interfaces.negative,f)]),encoded:this.api.f.createIntersectionTypeNode([this.api.ensureTypeNode(d.positive.name),this.api.ensureTypeNode(d.negative.name)])};this.registry.set(c,{isDeprecated:a,store:h}),this.tags.set(c,s)};zt({routing:t,config:i,onEndpoint:d?Mt(h):h}),this.#e.unshift(...this.#t.values()),this.#e.push(this.makePathType(),this.makeMethodType(),...this.makePublicInterfaces(),this.makeRequestType()),o!==`types`&&(this.#e.push(this.makeEndpointTags(),this.makeParseRequestFn(),this.makeSubstituteFn(),this.makeImplementationType(),this.makePaginationType(),this.makeDefaultImplementation(),this.makeClientClass(s),this.makeSubscriptionClass(c)),this.#n.push(...this.makeUsageStatements(s,c)))}static async create(t){return new e({...t,typescript:G(`typescript`)})}#i(e){return this.#n.length?this.#n.map(t=>typeof t==`string`?t:this.api.printNode(t,e)).join(`
18
18
  `):void 0}print(e){let t=this.#i(e),n=t&&this.api.ts.addSyntheticLeadingComment(this.api.ts.addSyntheticLeadingComment(this.api.f.createEmptyStatement(),this.api.ts.SyntaxKind.SingleLineCommentTrivia,` Usage example:`),this.api.ts.SyntaxKind.MultiLineCommentTrivia,`\n${t}`);return this.#e.concat(n||[]).map((t,n)=>this.api.printNode(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 J(`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 Nr=(e,n)=>t.object({data:n,event:t.literal(e),id:t.string().optional(),retry:t.int().positive().optional()}),Pr=(e,t,n)=>Nr(String(t),e[t]).transform(e=>[`event: ${e.event}`,`data: ${JSON.stringify(e.data)}`,``,``].join(`
21
- `)).parse({event:t,data:n}),Fr=e=>e.headersSent||e.writeHead(200,{connection:`keep-alive`,"content-type":y.sse,"cache-control":`no-cache`}),Ir=e=>new V({handler:async({request:t,response:n})=>{let r=new AbortController;return t.once(`close`,()=>{r.abort()}),setTimeout(()=>Fr(n),1e4),{isClosed:()=>n.writableEnded||n.closed,signal:r.signal,emit:(t,r)=>{Fr(n),n.write(Pr(e,t,r),`utf-8`),n.flush?.()}}}}),Lr=e=>new U({positive:()=>{let[n,...r]=Object.entries(e).map(([e,t])=>Nr(e,t));if(!n)throw new I(Error(`At least one SSE event is required.`));return{mimeType:y.sse,schema:r.length?t.discriminatedUnion(`event`,[n,...r]):n}},negative:{mimeType:`text/plain`,schema:t.string()},handler:async({response:e,error:t,logger:n,request:r,input:i})=>{if(t){let a=z(t);Ue(a,n,r,i),e.headersSent||e.status(a.statusCode).type(`text/plain`).write(B(a),`utf-8`)}e.end()}});var Rr=class extends G{constructor(e){super(Lr(e)),this.middlewares=[Ir(e)]}};const zr=[`total`,`limit`,`offset`],Br=[`nextCursor`,`limit`];function Vr({style:e,itemSchema:n,itemsName:r=`items`,maxLimit:i=100,defaultLimit:a=20}){if(!Number.isInteger(i)||i<1)throw Error(`ez.paginated: maxLimit must be a positive integer`);if(!Number.isInteger(a)||a<1)throw Error(`ez.paginated: defaultLimit must be a positive integer`);if(a>i)throw Error(`ez.paginated: defaultLimit must not be greater than maxLimit`);if(e===`offset`&&zr.includes(r))throw Error(`ez.paginated: itemsName must not match reserved keys for offset output (${zr.join(`, `)})`);if(e===`cursor`&&Br.includes(r))throw Error(`ez.paginated: itemsName must not match reserved keys for cursor output (${Br.join(`, `)})`);let o=t.coerce.number().int().min(1).max(i).default(a).describe(`Page size (number of ${r} per page)`);if(e===`offset`){let e=t.coerce.number().int().min(0).default(0).describe(`Number of ${r} to skip`);return{input:t.object({limit:o,offset:e}),output:t.object({[r]:t.array(n).describe(`Page of ${r}`),total:t.number().int().min(0).describe(`Total number of ${r}`),limit:t.number().int().min(1).describe(`Page size used`),offset:t.number().int().min(0).describe(`Offset used`)})}}let s=t.string().optional().describe(`Cursor for the next page; omit for first page`);return{input:t.object({cursor:s,limit:o}),output:t.object({[r]:t.array(n).describe(`Page of ${r}`),nextCursor:t.string().nullable().describe(`Cursor for the next page, or null if no more pages`),limit:t.number().int().min(1).describe(`Page size used`)})}}const Hr={dateIn:we,dateOut:Te,form:je,upload:Ne,raw:Ie,buffer:Ce,paginated:Vr};export{gt as BuiltinLogger,nr as Documentation,P as DocumentationError,G as EndpointsFactory,Rr as EventStreamFactory,F as InputValidationError,Mr as Integration,V as Middleware,ke as MissingPeerError,Oe as OutputValidationError,U as ResultHandler,N as RoutingError,_t as ServeStatic,ut as arrayEndpointsFactory,nt as arrayResultHandler,ln as attachRouting,st as createCacheMiddleware,se as createConfig,ct as createCookieMiddleware,un as createServer,lt as defaultEndpointsFactory,W as defaultResultHandler,z as ensureHttpError,Hr as ez,S as getMessageFromError,sr as testEndpoint,cr as testMiddleware};
20
+ `)}async printFormatted({printerOptions:e,format:t}={}){let n=t;if(!n)try{let e=G(`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 Ir=(e,t)=>n.object({data:t,event:n.literal(e),id:n.string().optional(),retry:n.int().positive().optional()}),Lr=(e,t,n)=>Ir(String(t),e[t]).transform(e=>[`event: ${e.event}`,`data: ${JSON.stringify(e.data)}`,``,``].join(`
21
+ `)).parse({event:t,data:n}),Rr=e=>e.headersSent||e.writeHead(200,{connection:`keep-alive`,"content-type":y.sse,"cache-control":`no-cache`}),zr=e=>new V({handler:async({request:t,response:n})=>{let r=new AbortController;return t.once(`close`,()=>{r.abort()}),setTimeout(()=>Rr(n),1e4),{isClosed:()=>n.writableEnded||n.closed,signal:r.signal,emit:(t,r)=>{Rr(n),n.write(Lr(e,t,r),`utf-8`),n.flush?.()}}}}),Br=e=>new U({positive:()=>{let[t,...r]=Object.entries(e).map(([e,t])=>Ir(e,t));if(!t)throw new I(Error(`At least one SSE event is required.`));return{mimeType:y.sse,schema:r.length?n.discriminatedUnion(`event`,[t,...r]):t}},negative:{mimeType:`text/plain`,schema:n.string()},handler:async({response:e,error:t,logger:n,request:r,input:i})=>{if(t){let a=z(t);We(a,n,r,i),e.headersSent||e.status(a.statusCode).type(`text/plain`).write(B(a),`utf-8`)}e.end()}});var Vr=class extends K{constructor(e){super(Br(e)),this.middlewares=[zr(e)]}};const Hr=[`total`,`limit`,`offset`],Ur=[`nextCursor`,`limit`];function Wr({style:e,itemSchema:t,itemsName:r=`items`,maxLimit:i=100,defaultLimit:a=20}){if(!Number.isInteger(i)||i<1)throw Error(`ez.paginated: maxLimit must be a positive integer`);if(!Number.isInteger(a)||a<1)throw Error(`ez.paginated: defaultLimit must be a positive integer`);if(a>i)throw Error(`ez.paginated: defaultLimit must not be greater than maxLimit`);if(e===`offset`&&Hr.includes(r))throw Error(`ez.paginated: itemsName must not match reserved keys for offset output (${Hr.join(`, `)})`);if(e===`cursor`&&Ur.includes(r))throw Error(`ez.paginated: itemsName must not match reserved keys for cursor output (${Ur.join(`, `)})`);let o=n.coerce.number().int().min(1).max(i).default(a).describe(`Page size (number of ${r} per page)`);if(e===`offset`){let e=n.coerce.number().int().min(0).default(0).describe(`Number of ${r} to skip`);return{input:n.object({limit:o,offset:e}),output:n.object({[r]:n.array(t).describe(`Page of ${r}`),total:n.number().int().min(0).describe(`Total number of ${r}`),limit:n.number().int().min(1).describe(`Page size used`),offset:n.number().int().min(0).describe(`Offset used`)})}}let s=n.string().optional().describe(`Cursor for the next page; omit for first page`);return{input:n.object({cursor:s,limit:o}),output:n.object({[r]:n.array(t).describe(`Page of ${r}`),nextCursor:n.string().nullable().describe(`Cursor for the next page, or null if no more pages`),limit:n.number().int().min(1).describe(`Page size used`)})}}const Gr={dateIn:Te,dateOut:Ee,form:Me,upload:Pe,raw:Le,buffer:we,paginated:Wr};export{yt as BuiltinLogger,ar as Documentation,P as DocumentationError,K as EndpointsFactory,Vr as EventStreamFactory,F as InputValidationError,Fr as Integration,V as Middleware,Ae as MissingPeerError,ke as OutputValidationError,U as ResultHandler,N as RoutingError,bt as ServeStatic,pt as arrayEndpointsFactory,rt as arrayResultHandler,fn as attachRouting,ct as createCacheMiddleware,ce as createConfig,lt as createCookieMiddleware,dt as createRateLimitMiddleware,pn as createServer,ft as defaultEndpointsFactory,W as defaultResultHandler,z as ensureHttpError,Gr as ez,S as getMessageFromError,ur as testEndpoint,dr as testMiddleware};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "28.5.0",
3
+ "version": "28.7.0",
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": {
@@ -48,6 +48,7 @@
48
48
  "cookie-parser": "^1.4.7",
49
49
  "express": "^5.1.0",
50
50
  "express-fileupload": "^1.5.0",
51
+ "express-rate-limit": "^7.5.1",
51
52
  "http-errors": "^2.0.1",
52
53
  "typescript": "^5.1.3 || ^6.0.2",
53
54
  "zod": "^4.3.4",
@@ -81,6 +82,9 @@
81
82
  "express-fileupload": {
82
83
  "optional": true
83
84
  },
85
+ "express-rate-limit": {
86
+ "optional": true
87
+ },
84
88
  "typescript": {
85
89
  "optional": true
86
90
  }
@@ -102,6 +106,7 @@
102
106
  "depd": "^2.0.0",
103
107
  "express": "^5.2.1",
104
108
  "express-fileupload": "^1.5.2",
109
+ "express-rate-limit": "^7.5.1",
105
110
  "http-errors": "^2.0.1",
106
111
  "node-forge": "^1.3.3",
107
112
  "snakify-ts": "^2.3.0",