express-zod-api 11.6.0 → 12.0.0-beta2

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
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## Version 12
4
+
5
+ ### v12.0.0
6
+
7
+ - **Breaking changes**:
8
+ - `winston` becomes a peer dependency — you need to install it manually.
9
+ - Minimum Node versions supported: 18.0.0 and 20.1.0.
10
+ - Node versions 16 and 19 are EOL and no longer supported.
11
+ - Minimum Typescript version supported: 5.1.3.
12
+ - Minimum Jest version supported: 28 (optional peer dependency for testing endpoints).
13
+ - Other changes:
14
+ - The distribution now consists of 4 files in `dist` directory:
15
+ - for ESM: `index.mjs` and `index.d.mts`,
16
+ - for CJS: `index.js` and `index.d.ts`.
17
+ - Routes having URL params are no longer quoted in the generated documentation.
18
+ - This change is caused by a fix to the `yaml` dependency.
19
+
20
+ ```yaml
21
+ before:
22
+ "/v1/user/{id}":
23
+ after:
24
+ /v1/user/{id}:
25
+ ```
26
+
3
27
  ## Version 11
4
28
 
5
29
  ### v11.6.0
package/README.md CHANGED
@@ -47,8 +47,9 @@ Start your API server with I/O schema validation and custom middlewares in minut
47
47
  19. [Generating a Frontend Client](#generating-a-frontend-client)
48
48
  20. [Creating a documentation](#creating-a-documentation)
49
49
  21. [Tagging the endpoints](#tagging-the-endpoints)
50
- 5. [Additional hints](#additional-hints)
51
- 1. [How to test endpoints](#how-to-test-endpoints)
50
+ 22. [How to test endpoints](#how-to-test-endpoints)
51
+ 5. [Caveats](#caveats)
52
+ 1. [Coercive schema of Zod](#coercive-schema-of-zod)
52
53
  2. [Excessive properties in endpoint output](#excessive-properties-in-endpoint-output)
53
54
  6. [Your input to my output](#your-input-to-my-output)
54
55
 
@@ -106,9 +107,9 @@ Typescript is an optional dependency, however, it's required if you're going to
106
107
  [generate a frontend client](#generating-a-frontend-client) for your API.
107
108
 
108
109
  ```shell
109
- yarn add express-zod-api express zod typescript
110
+ yarn add express-zod-api express zod winston typescript
110
111
  # or
111
- npm install express-zod-api express zod typescript
112
+ npm install express-zod-api express zod winston typescript
112
113
  ```
113
114
 
114
115
  Add the following option to your `tsconfig.json` file in order to make it work as expected:
@@ -918,8 +919,6 @@ const exampleEndpoint = taggedEndpointsFactory.build({
918
919
  });
919
920
  ```
920
921
 
921
- # Additional hints
922
-
923
922
  ## How to test endpoints
924
923
 
925
924
  The way to test endpoints is to mock the request, response, and logger objects, invoke the `execute()` method, and
@@ -950,6 +949,21 @@ test("should respond successfully", async () => {
950
949
  _This method is optimized for the `defaultResultHandler`. With the flexibility to customize, you can add additional
951
950
  properties as needed._
952
951
 
952
+ # Caveats
953
+
954
+ There are some well-known issue and limitations, or third party bugs that cannot be fixed in the usual way, but you
955
+ should be aware of them.
956
+
957
+ ## Coercive schema of Zod
958
+
959
+ Despite being supported by the library, `z.coerce.*` schema
960
+ [does not work intuitively](https://github.com/RobinTail/express-zod-api/issues/759).
961
+ Please be aware that `z.coerce.number()` and `z.number({ coerce: true })` (being typed not well) still will NOT allow
962
+ you to assign anything but number. Moreover, coercive schemas are not fail-safe and their methods `.isOptional()` and
963
+ `.isNullable()` [are buggy](https://github.com/colinhacks/zod/issues/1911). If possible, try to avoid using this type
964
+ of schemas. This issue [will NOT be fixed](https://github.com/colinhacks/zod/issues/1760#issuecomment-1407816838) in
965
+ Zod version 3.x.
966
+
953
967
  ## Excessive properties in endpoint output
954
968
 
955
969
  The schema validator removes excessive properties by default. However, Typescript
package/SECURITY.md CHANGED
@@ -4,8 +4,9 @@
4
4
 
5
5
  | Version | Supported |
6
6
  | ------: | :----------------: |
7
+ | 12.x.x | :white_check_mark: |
7
8
  | 11.x.x | :white_check_mark: |
8
- | 10.x.x | :white_check_mark: |
9
+ | 10.x.x | :x: |
9
10
  | 9.x.x | :x: |
10
11
  | 8.x.x | :x: |
11
12
  | 7.x.x | :x: |
@@ -22,6 +23,6 @@
22
23
  Found a vulnerability or other security issue?
23
24
 
24
25
  Please urgently inform me privately by
25
- [email](https://github.com/RobinTail/express-zod-api/blob/master/package.json#L122).
26
+ [email](https://github.com/RobinTail/express-zod-api/blob/master/package.json#L133).
26
27
 
27
28
  I will try to fix it as soon as possible.
@@ -161,14 +161,7 @@ type MetaDef<T extends z.ZodTypeAny> = {
161
161
  };
162
162
  };
163
163
  type ExampleSetter<T extends z.ZodTypeAny> = (example: z.input<T>) => WithMeta<T>;
164
- /**
165
- * @desc fixes the incompatibility of the ZodObject.keyof() method introduced in v3.17.9
166
- * @todo remove it if/when it will be compatible
167
- */
168
- type MetaFixForStrippedObject<T> = T extends z.ZodObject<any> ? T & {
169
- keyof: z.ZodObject<any>["keyof"];
170
- } : T;
171
- type WithMeta<T extends z.ZodTypeAny> = MetaFixForStrippedObject<T> & {
164
+ type WithMeta<T extends z.ZodTypeAny> = T & {
172
165
  _def: T["_def"] & MetaDef<T>;
173
166
  example: ExampleSetter<T>;
174
167
  };
@@ -306,8 +299,6 @@ declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
306
299
  status: "success";
307
300
  data?: unknown;
308
301
  }> & {
309
- keyof: () => z.ZodEnum<never>;
310
- } & {
311
302
  _def: z.ZodObjectDef<{
312
303
  status: z.ZodLiteral<"success">;
313
304
  data: IOSchema;
@@ -333,9 +324,7 @@ declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
333
324
  }, {
334
325
  status: "success";
335
326
  data?: unknown;
336
- }> & {
337
- keyof: () => z.ZodEnum<never>;
338
- } & any;
327
+ }> & any;
339
328
  }, z.ZodObject<{
340
329
  status: z.ZodLiteral<"error">;
341
330
  error: z.ZodObject<{
@@ -356,8 +345,6 @@ declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
356
345
  message: string;
357
346
  };
358
347
  }> & {
359
- keyof: () => z.ZodEnum<never>;
360
- } & {
361
348
  _def: z.ZodObjectDef<{
362
349
  status: z.ZodLiteral<"error">;
363
350
  error: z.ZodObject<{
@@ -411,9 +398,7 @@ declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
411
398
  error: {
412
399
  message: string;
413
400
  };
414
- }> & {
415
- keyof: () => z.ZodEnum<never>;
416
- } & any;
401
+ }> & any;
417
402
  }>;
418
403
 
419
404
  type Handler<IN, OUT, OPT> = (params: {
@@ -593,8 +578,6 @@ declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
593
578
  status: "success";
594
579
  data?: unknown;
595
580
  }> & {
596
- keyof: () => z.ZodEnum<never>;
597
- } & {
598
581
  _def: z.ZodObjectDef<{
599
582
  status: z.ZodLiteral<"success">;
600
583
  data: IOSchema;
@@ -620,9 +603,7 @@ declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
620
603
  }, {
621
604
  status: "success";
622
605
  data?: unknown;
623
- }> & {
624
- keyof: () => z.ZodEnum<never>;
625
- } & any;
606
+ }> & any;
626
607
  }, z.ZodObject<{
627
608
  status: z.ZodLiteral<"error">;
628
609
  error: z.ZodObject<{
@@ -643,8 +624,6 @@ declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
643
624
  message: string;
644
625
  };
645
626
  }> & {
646
- keyof: () => z.ZodEnum<never>;
647
- } & {
648
627
  _def: z.ZodObjectDef<{
649
628
  status: z.ZodLiteral<"error">;
650
629
  error: z.ZodObject<{
@@ -698,9 +677,7 @@ declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
698
677
  error: {
699
678
  message: string;
700
679
  };
701
- }> & {
702
- keyof: () => z.ZodEnum<never>;
703
- } & any;
680
+ }> & any;
704
681
  }, null, {}, string, string>;
705
682
 
706
683
  declare function createLogger(loggerConfig: LoggerConfig): winston.Logger;
package/dist/index.d.ts CHANGED
@@ -161,14 +161,7 @@ type MetaDef<T extends z.ZodTypeAny> = {
161
161
  };
162
162
  };
163
163
  type ExampleSetter<T extends z.ZodTypeAny> = (example: z.input<T>) => WithMeta<T>;
164
- /**
165
- * @desc fixes the incompatibility of the ZodObject.keyof() method introduced in v3.17.9
166
- * @todo remove it if/when it will be compatible
167
- */
168
- type MetaFixForStrippedObject<T> = T extends z.ZodObject<any> ? T & {
169
- keyof: z.ZodObject<any>["keyof"];
170
- } : T;
171
- type WithMeta<T extends z.ZodTypeAny> = MetaFixForStrippedObject<T> & {
164
+ type WithMeta<T extends z.ZodTypeAny> = T & {
172
165
  _def: T["_def"] & MetaDef<T>;
173
166
  example: ExampleSetter<T>;
174
167
  };
@@ -306,8 +299,6 @@ declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
306
299
  status: "success";
307
300
  data?: unknown;
308
301
  }> & {
309
- keyof: () => z.ZodEnum<never>;
310
- } & {
311
302
  _def: z.ZodObjectDef<{
312
303
  status: z.ZodLiteral<"success">;
313
304
  data: IOSchema;
@@ -333,9 +324,7 @@ declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
333
324
  }, {
334
325
  status: "success";
335
326
  data?: unknown;
336
- }> & {
337
- keyof: () => z.ZodEnum<never>;
338
- } & any;
327
+ }> & any;
339
328
  }, z.ZodObject<{
340
329
  status: z.ZodLiteral<"error">;
341
330
  error: z.ZodObject<{
@@ -356,8 +345,6 @@ declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
356
345
  message: string;
357
346
  };
358
347
  }> & {
359
- keyof: () => z.ZodEnum<never>;
360
- } & {
361
348
  _def: z.ZodObjectDef<{
362
349
  status: z.ZodLiteral<"error">;
363
350
  error: z.ZodObject<{
@@ -411,9 +398,7 @@ declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
411
398
  error: {
412
399
  message: string;
413
400
  };
414
- }> & {
415
- keyof: () => z.ZodEnum<never>;
416
- } & any;
401
+ }> & any;
417
402
  }>;
418
403
 
419
404
  type Handler<IN, OUT, OPT> = (params: {
@@ -593,8 +578,6 @@ declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
593
578
  status: "success";
594
579
  data?: unknown;
595
580
  }> & {
596
- keyof: () => z.ZodEnum<never>;
597
- } & {
598
581
  _def: z.ZodObjectDef<{
599
582
  status: z.ZodLiteral<"success">;
600
583
  data: IOSchema;
@@ -620,9 +603,7 @@ declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
620
603
  }, {
621
604
  status: "success";
622
605
  data?: unknown;
623
- }> & {
624
- keyof: () => z.ZodEnum<never>;
625
- } & any;
606
+ }> & any;
626
607
  }, z.ZodObject<{
627
608
  status: z.ZodLiteral<"error">;
628
609
  error: z.ZodObject<{
@@ -643,8 +624,6 @@ declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
643
624
  message: string;
644
625
  };
645
626
  }> & {
646
- keyof: () => z.ZodEnum<never>;
647
- } & {
648
627
  _def: z.ZodObjectDef<{
649
628
  status: z.ZodLiteral<"error">;
650
629
  error: z.ZodObject<{
@@ -698,9 +677,7 @@ declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
698
677
  error: {
699
678
  message: string;
700
679
  };
701
- }> & {
702
- keyof: () => z.ZodEnum<never>;
703
- } & any;
680
+ }> & any;
704
681
  }, null, {}, string, string>;
705
682
 
706
683
  declare function createLogger(loggerConfig: LoggerConfig): winston.Logger;
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- "use strict";var Fr=Object.create;var Ce=Object.defineProperty;var $r=Object.getOwnPropertyDescriptor;var _r=Object.getOwnPropertyNames;var Gr=Object.getPrototypeOf,Vr=Object.prototype.hasOwnProperty;var Ft=(e,t)=>{for(var r in t)Ce(e,r,{get:t[r],enumerable:!0})},$t=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of _r(t))!Vr.call(e,n)&&n!==r&&Ce(e,n,{get:()=>t[n],enumerable:!(o=$r(t,n))||o.enumerable});return e};var R=(e,t,r)=>(r=e!=null?Fr(Gr(e)):{},$t(t||!e||!e.__esModule?Ce(r,"default",{value:e,enumerable:!0}):r,e)),qr=e=>$t(Ce({},"__esModule",{value:!0}),e);var Br=(e,t,r)=>{if(!t.has(e))throw TypeError("Cannot "+r)};var $=(e,t,r)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,r)};var w=(e,t,r)=>(Br(e,t,"access private method"),r);var In={};Ft(In,{AbstractEndpoint:()=>te,DependsOnMethod:()=>fe,DependsOnMethodError:()=>de,Documentation:()=>et,DocumentationError:()=>C,EndpointsFactory:()=>Pe,InputValidationError:()=>j,Integration:()=>it,OutputValidationError:()=>q,RoutingError:()=>W,ServeStatic:()=>ye,attachRouting:()=>fr,createConfig:()=>Gt,createHttpError:()=>Hr.default,createLogger:()=>Ee,createMiddleware:()=>qe,createResultHandler:()=>xt,createServer:()=>yr,defaultEndpointsFactory:()=>ir,defaultResultHandler:()=>ee,ez:()=>Ht,getExamples:()=>V,getMessageFromError:()=>G,getStatusCodeFromError:()=>ve,testEndpoint:()=>Ar,withMeta:()=>J});module.exports=qr(In);var _t={silent:!0,warn:!0,debug:!0},Gt=e=>e;var k=require("zod");var Yt=require("crypto"),Jt=require("http-errors"),b=require("zod");var Ne=require("ramda"),E="expressZodApiMeta",Yr=e=>{let t=e.constructor,r=(0,Ne.clone)(e._def);return r[E]=r[E]||{examples:[]},new t(r)},J=e=>{let t=Yr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=J(t);return o._def[E].examples.push(r),o}}}),t},Vt=e=>E in e._def?typeof e._def[E]=="object"&&e._def[E]!==null:!1;function qt(e,t){if(!Vt(e))return;let r=e._def;return t in r[E]?r[E][t]:void 0}var Me=(e,t)=>{if(!Vt(e))return t;let r=J(t),o=Se(r._def[E].examples,e._def[E].examples);if(r._def[E].examples=[],o.type==="single")r._def[E].examples=o.value;else for(let[n,s]of o.value)r._def[E].examples.push((0,Ne.mergeDeepRight)({...n},{...s}));return r};var Bt=R(require("mime")),Q=Bt.default.getType("json")||"application/json",Oe="multipart/form-data";var I=require("zod"),Jr="ZodUpload",Qr=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",we=class we extends I.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==I.ZodParsedType.object||!Qr(r.data)?((0,I.addIssueToContext)(r,{code:I.ZodIssueCode.custom,message:`Expected file upload, received ${r.parsedType}`}),I.INVALID):(0,I.OK)(r.data)}};we.create=()=>new we({typeName:Jr});var ie=we;var mt=/:([A-Za-z0-9_]+)/g;function Wr(e){let r=(e.header("content-type")||"").slice(0,Oe.length).toLowerCase()===Oe;return"files"in e&&r}var De={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Xr=["body","query","params"],ut=e=>e.method.toLowerCase();function Qt(e,t){let r=ut(e);if(r==="options")return{};let o=Xr;return r in De&&(o=De[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Wr(e):!0).reduce((n,s)=>({...n,...e[s]}),{})}function ft(e){return typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(_t).includes(e.level)&&typeof e.color=="boolean"}function ze(e){return!isNaN(e.getTime())}function ae(e){return e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`)}function G(e){return e instanceof b.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof q?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message}function ve(e){return e instanceof Jt.HttpError?e.statusCode:e instanceof j?400:500}var V=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=qt(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},Se=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}};function yt(e){let t=e.match(mt);return t?t.map(r=>r.slice(1)):[]}var be=e=>e.reduce((t,r)=>t||r,!1);function _(e){return e instanceof b.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof b.z.ZodUnion?be(e.options.map(_)):e instanceof b.z.ZodIntersection?be([e._def.left,e._def.right].map(_)):!1}function D(e){return e instanceof ie?!0:e instanceof b.z.ZodObject?be(Object.values(e.shape).map(D)):e instanceof b.z.ZodUnion?be(e.options.map(D)):e instanceof b.z.ZodIntersection?be([e._def.left,e._def.right].map(D)):e instanceof b.z.ZodOptional||e instanceof b.z.ZodNullable?D(e.unwrap()):e instanceof b.z.ZodEffects||e instanceof b.z.ZodTransformer?D(e._def.schema):e instanceof b.z.ZodRecord?D(e._def.valueType):e instanceof b.z.ZodArray?D(e._def.type):e instanceof b.z.ZodDefault?D(e._def.innerType):!1}var Re=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,v=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),je=e=>(0,Yt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Le=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},gt=e=>typeof e=="string"?{message:e}:e||{};var W=class extends Error{constructor(){super(...arguments);this.name="RoutingError"}},de=class extends W{constructor(){super(...arguments);this.name="DependsOnMethodError"}},C=class extends Error{constructor({message:r,method:o,path:n,isResponse:s}){let a=`${r}
2
- Caused by ${s?"response":"input"} schema of an Endpoint assigned to ${o.toUpperCase()} method of ${n} path.`;super(a);this.name="DocumentationError"}},B=class extends Error{constructor(){super(...arguments);this.name="IOSchemaError"}},q=class extends B{constructor(r){super(G(r));this.name="OutputValidationError";this.originalError=r}},j=class extends B{constructor(r){super(G(r));this.name="InputValidationError";this.originalError=r}},pe=class extends Error{constructor(r,o){super(r);this.name="ResultHandlerError";this.originalError=o||void 0}};var L=e=>typeof e=="object"&&e!==null,ke=e=>({and:e.reduce((t,r)=>t.concat(L(r)&&"and"in r?r.and:r),[])}),Ue=(e,t)=>{if(L(e)){if("and"in e)return{and:e.and.map(r=>L(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>L(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},ht=e=>e.and.reduce((t,r)=>{let o=Se(t.or,L(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(ke),t},{or:[]}),ce=(e,t)=>{if(L(e)){if("and"in e){if(L(t)){if("and"in t)return ke([e,t]);if("or"in t)return ce(ht(e),t)}return ke([e,t])}if("or"in e){if(L(t)){if("and"in t)return ce(t,e);if("or"in t){let r=Se(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(ke)}}}return ce(e,{and:[t]})}}return L(t)&&("and"in t||"or"in t)?ce(t,e):{and:[e,t]}};var X=require("zod");var le={positive:200,negative:400},xt=e=>e,ee=xt({getPositiveResponse:e=>{let t=V({schema:e}),r=J(X.z.object({status:X.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>J(X.z.object({status:X.z.literal("error"),error:X.z.object({message:X.z.string()})})).example({status:"error",error:{message:G(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(le.positive).json({status:"success",data:r});return}let a=ve(e);a===500&&s.error(`Internal server error
1
+ "use strict";var br=Object.create;var Pe=Object.defineProperty;var Rr=Object.getOwnPropertyDescriptor;var Pr=Object.getOwnPropertyNames;var Zr=Object.getPrototypeOf,Er=Object.prototype.hasOwnProperty;var At=(e,t)=>{for(var r in t)Pe(e,r,{get:t[r],enumerable:!0})},It=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Pr(t))!Er.call(e,n)&&n!==r&&Pe(e,n,{get:()=>t[n],enumerable:!(o=Rr(t,n))||o.enumerable});return e};var b=(e,t,r)=>(r=e!=null?br(Zr(e)):{},It(t||!e||!e.__esModule?Pe(r,"default",{value:e,enumerable:!0}):r,e)),Ar=e=>It(Pe({},"__esModule",{value:!0}),e);var an={};At(an,{AbstractEndpoint:()=>X,DependsOnMethod:()=>ce,DependsOnMethodError:()=>se,Documentation:()=>Ke,DocumentationError:()=>C,EndpointsFactory:()=>Se,InputValidationError:()=>v,Integration:()=>qe,OutputValidationError:()=>_,RoutingError:()=>J,ServeStatic:()=>le,attachRouting:()=>Bt,createConfig:()=>Nt,createHttpError:()=>Sr.default,createLogger:()=>be,createMiddleware:()=>je,createResultHandler:()=>ot,createServer:()=>Yt,defaultEndpointsFactory:()=>Ht,defaultResultHandler:()=>W,ez:()=>Zt,getExamples:()=>$,getMessageFromError:()=>F,getStatusCodeFromError:()=>Ce,testEndpoint:()=>ar,withMeta:()=>B});module.exports=Ar(an);var Ct={silent:!0,warn:!0,debug:!0},Nt=e=>e;var L=require("zod");var zt=require("crypto"),vt=require("http-errors"),O=require("zod");var Ze=require("ramda"),Z="expressZodApiMeta",Ir=e=>{let t=e.constructor,r=(0,Ze.clone)(e._def);return r[Z]=r[Z]||{examples:[]},new t(r)},B=e=>{let t=Ir(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=B(t);return o._def[Z].examples.push(r),o}}}),t},Mt=e=>Z in e._def?typeof e._def[Z]=="object"&&e._def[Z]!==null:!1;function wt(e,t){if(!Mt(e))return;let r=e._def;return t in r[Z]?r[Z][t]:void 0}var Ee=(e,t)=>{if(!Mt(e))return t;let r=B(t),o=ge(r._def[Z].examples,e._def[Z].examples);if(r._def[Z].examples=[],o.type==="single")r._def[Z].examples=o.value;else for(let[n,s]of o.value)r._def[Z].examples.push((0,Ze.mergeDeepRight)({...n},{...s}));return r};var Dt=b(require("mime")),Y=Dt.default.getType("json")||"application/json",he="multipart/form-data";var I=require("zod"),Cr="ZodUpload",Nr=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",oe=class e extends I.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==I.ZodParsedType.object||!Nr(r.data)?((0,I.addIssueToContext)(r,{code:I.ZodIssueCode.custom,message:`Expected file upload, received ${r.parsedType}`}),I.INVALID):(0,I.OK)(r.data)}static create=()=>new e({typeName:Cr})};var Qe=/:([A-Za-z0-9_]+)/g;function Mr(e){let r=(e.header("content-type")||"").slice(0,he.length).toLowerCase()===he;return"files"in e&&r}var Ae={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},wr=["body","query","params"],We=e=>e.method.toLowerCase();function jt(e,t){let r=We(e);if(r==="options")return{};let o=wr;return r in Ae&&(o=Ae[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Mr(e):!0).reduce((n,s)=>({...n,...e[s]}),{})}function Xe(e){return typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(Ct).includes(e.level)&&typeof e.color=="boolean"}function Ie(e){return!isNaN(e.getTime())}function ne(e){return e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`)}function F(e){return e instanceof O.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof _?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message}function Ce(e){return e instanceof vt.HttpError?e.statusCode:e instanceof v?400:500}var $=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=wt(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},ge=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}};function et(e){let t=e.match(Qe);return t?t.map(r=>r.slice(1)):[]}var xe=e=>e.reduce((t,r)=>t||r,!1);function K(e){return e instanceof O.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof O.z.ZodUnion?xe(e.options.map(K)):e instanceof O.z.ZodIntersection?xe([e._def.left,e._def.right].map(K)):!1}function w(e){return e instanceof oe?!0:e instanceof O.z.ZodObject?xe(Object.values(e.shape).map(w)):e instanceof O.z.ZodUnion?xe(e.options.map(w)):e instanceof O.z.ZodIntersection?xe([e._def.left,e._def.right].map(w)):e instanceof O.z.ZodOptional||e instanceof O.z.ZodNullable?w(e.unwrap()):e instanceof O.z.ZodEffects||e instanceof O.z.ZodTransformer?w(e._def.schema):e instanceof O.z.ZodRecord?w(e._def.valueType):e instanceof O.z.ZodArray?w(e._def.type):e instanceof O.z.ZodDefault?w(e._def.innerType):!1}var Te=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,z=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Ne=e=>(0,zt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Me=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},tt=e=>typeof e=="string"?{message:e}:e||{};var J=class extends Error{name="RoutingError"},se=class extends J{name="DependsOnMethodError"},C=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
2
+ Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},G=class extends Error{name="IOSchemaError"},_=class extends G{name="OutputValidationError";originalError;constructor(t){super(F(t)),this.originalError=t}},v=class extends G{name="InputValidationError";originalError;constructor(t){super(F(t)),this.originalError=t}},ie=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var j=e=>typeof e=="object"&&e!==null,we=e=>({and:e.reduce((t,r)=>t.concat(j(r)&&"and"in r?r.and:r),[])}),De=(e,t)=>{if(j(e)){if("and"in e)return{and:e.and.map(r=>j(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>j(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},rt=e=>e.and.reduce((t,r)=>{let o=ge(t.or,j(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(we),t},{or:[]}),ae=(e,t)=>{if(j(e)){if("and"in e){if(j(t)){if("and"in t)return we([e,t]);if("or"in t)return ae(rt(e),t)}return we([e,t])}if("or"in e){if(j(t)){if("and"in t)return ae(t,e);if("or"in t){let r=ge(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(we)}}}return ae(e,{and:[t]})}}return j(t)&&("and"in t||"or"in t)?ae(t,e):{and:[e,t]}};var Q=require("zod");var de={positive:200,negative:400},ot=e=>e,W=ot({getPositiveResponse:e=>{let t=$({schema:e}),r=B(Q.z.object({status:Q.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>B(Q.z.object({status:Q.z.literal("error"),error:Q.z.object({message:Q.z.string()})})).example({status:"error",error:{message:F(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(de.positive).json({status:"success",data:r});return}let a=Ce(e);a===500&&s.error(`Internal server error
3
3
  ${e.stack}
4
- `,{url:o.url,payload:t}),n.status(a).json({status:"error",error:{message:G(e)}})}}),He=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
- Original error: ${e.originalError.message}.`:""))};var Wt=(e,t=[Q])=>{if(e instanceof k.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},te=class{},Fe,Xt,$e,er,_e,tr,Ge,rr,Ve,or,Ke=class extends te{constructor({middlewares:r,inputSchema:o,outputSchema:n,handler:s,resultHandler:a,description:d,shortDescription:c,...p}){super();$(this,Fe);$(this,$e);$(this,_e);$(this,Ge);$(this,Ve);this.methods=[];this.siblingMethods=[];this.middlewares=[];this.scopes=[];this.tags=[];[{name:"input schema",schema:o},{name:"output schema",schema:n}].forEach(({name:f,schema:x})=>{if(_(x))throw new B(`Using transformations on the top level of endpoint ${f} is not allowed.`)}),this.middlewares=r;let l={positive:a.getPositiveResponse(n),negative:a.getNegativeResponse()};this.mimeTypes={input:D(o)?[Oe]:[Q],positive:Wt(l.positive),negative:Wt(l.negative)},this.schemas={input:o,output:n,positive:l.positive instanceof k.z.ZodType?l.positive:l.positive.schema,negative:l.negative instanceof k.z.ZodType?l.negative:l.negative.schema},this.statusCodes={positive:l.positive instanceof k.z.ZodType?le.positive:l.positive.statusCode||le.positive,negative:l.negative instanceof k.z.ZodType?le.negative:l.negative.statusCode||le.negative},this.handler=s,this.resultHandler=a,this.descriptions={long:d,short:c},"scopes"in p&&p.scopes&&this.scopes.push(...p.scopes),"scope"in p&&p.scope&&this.scopes.push(p.scope),"tags"in p&&p.tags&&this.tags.push(...p.tags),"tag"in p&&p.tag&&this.tags.push(p.tag),"methods"in p?this.methods=p.methods:this.methods=[p.method]}_setSiblingMethods(r){this.siblingMethods=r}getDescription(r){return this.descriptions[r]}getMethods(){return this.methods}getSchema(r){return this.schemas[r]}getMimeTypes(r){return this.mimeTypes[r]}getStatusCode(r){return this.statusCodes[r]}getSecurity(){return this.middlewares.reduce((r,o)=>o.security?ce(r,o.security):r,{and:[]})}getScopes(){return this.scopes}getTags(){return this.tags}async execute({request:r,response:o,logger:n,config:s}){let a=ut(r),d,c=null;if(s.cors){let l=w(this,Fe,Xt).call(this);typeof s.cors=="function"&&(l=await s.cors({request:r,logger:n,endpoint:this,defaultHeaders:l}));for(let f in l)o.set(f,l[f])}let p=Qt(r,s.inputSources);try{let{options:l,isStreamClosed:f}=await w(this,_e,tr).call(this,{method:a,input:p,request:r,response:o,logger:n});if(f)return;if(a==="options"){o.status(200).end();return}d=await w(this,$e,er).call(this,await w(this,Ge,rr).call(this,{input:p,options:l,logger:n}))}catch(l){c=ae(l)}await w(this,Ve,or).call(this,{input:p,output:d,request:r,response:o,error:c,logger:n})}};Fe=new WeakSet,Xt=function(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.methods.concat(this.siblingMethods).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}},$e=new WeakSet,er=async function(r){try{return await this.schemas.output.parseAsync(r)}catch(o){throw o instanceof k.z.ZodError?new q(o):o}},_e=new WeakSet,tr=async function({method:r,input:o,request:n,response:s,logger:a}){let d={},c=!1;for(let p of this.middlewares){if(r==="options"&&p.type==="proprietary")continue;let l;try{l=await p.input.parseAsync(o)}catch(f){throw f instanceof k.z.ZodError?new j(f):f}if(Object.assign(d,await p.middleware({input:l,options:d,request:n,response:s,logger:a})),c="writableEnded"in s&&s.writableEnded,c){a.warn(`The middleware ${p.middleware.name} has closed the stream. Accumulated options:`,d);break}}return{options:d,isStreamClosed:c}},Ge=new WeakSet,rr=async function({input:r,options:o,logger:n}){let s;try{s=await this.schemas.input.parseAsync(r)}catch(a){throw a instanceof k.z.ZodError?new j(a):a}return this.handler({input:s,options:o,logger:n})},Ve=new WeakSet,or=async function({error:r,request:o,response:n,logger:s,input:a,output:d}){try{await this.resultHandler.handler({error:r,output:d,request:o,response:n,logger:s,input:a})}catch(c){He({logger:s,response:n,error:new pe(ae(c).message,r)})}};var nr=["get","post","put","delete","patch"];var Tt=require("zod");var sr=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Me(s,n),o)};var qe=e=>{if(_(e.input))throw new B("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var me,Be,re=class re{constructor(t){this.middlewares=[];this.use=this.addExpressMiddleware;this.resultHandler="resultHandler"in t?t.resultHandler:t}addMiddleware(t){var r;return w(r=re,me,Be).call(r,this.middlewares.concat(t),this.resultHandler)}addExpressMiddleware(t,r){var a;let o=r?.transformer||(d=>d),n=r?.provider||(()=>({})),s={type:"express",input:Tt.z.object({}),middleware:async({request:d,response:c})=>new Promise((p,l)=>{t(d,c,x=>{if(x&&x instanceof Error)return l(o(x));p(n(d,c))})})};return w(a=re,me,Be).call(a,this.middlewares.concat(s),this.resultHandler)}addOptions(t){var r;return w(r=re,me,Be).call(r,this.middlewares.concat(qe({input:Tt.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new Ke({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:sr(s,t),...n})}};me=new WeakSet,Be=function(t,r){let o=new re(r);return o.middlewares=t,o},$(re,me);var Pe=re,ir=new Pe(ee);var ar=require("util"),ue=require("triple-beam"),Ze=R(require("winston")),{combine:eo,colorize:to,timestamp:ro,printf:oo}=Ze.default.format;function Ee(e){let t=s=>{let{[ue.LEVEL]:a,[ue.MESSAGE]:d,[ue.SPLAT]:c,...p}=s;return(0,ar.inspect)(p,!1,1,e.color)},r=s=>oo(({timestamp:a,message:d,level:c,durationMs:p,...l})=>(typeof d=="object"&&(l={...l,...d},d="[No message]"),`${a} ${c}: ${d}`+(p===void 0?"":` duration: ${p}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[ro()],n={handleExceptions:!0};switch(e.color&&o.push(to()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=eo(...o),Ze.default.createLogger({silent:e.level==="silent",levels:Ze.default.config.npm.levels,transports:[new Ze.default.transports.Console(n)],exitOnError:!1})}var fe=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new de(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
4
+ `,{url:o.url,payload:t}),n.status(a).json({status:"error",error:{message:F(e)}})}}),ze=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
+ Original error: ${e.originalError.message}.`:""))};var Lt=(e,t=[Y])=>{if(e instanceof L.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},X=class{},ve=class extends X{descriptions;methods=[];siblingMethods=[];middlewares=[];mimeTypes;statusCodes;handler;resultHandler;schemas;scopes=[];tags=[];constructor({middlewares:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,description:a,shortDescription:p,...d}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:l,schema:h})=>{if(K(h))throw new G(`Using transformations on the top level of endpoint ${l} is not allowed.`)}),this.middlewares=t;let c={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.mimeTypes={input:w(r)?[he]:[Y],positive:Lt(c.positive),negative:Lt(c.negative)},this.schemas={input:r,output:o,positive:c.positive instanceof L.z.ZodType?c.positive:c.positive.schema,negative:c.negative instanceof L.z.ZodType?c.negative:c.negative.schema},this.statusCodes={positive:c.positive instanceof L.z.ZodType?de.positive:c.positive.statusCode||de.positive,negative:c.negative instanceof L.z.ZodType?de.negative:c.negative.statusCode||de.negative},this.handler=n,this.resultHandler=s,this.descriptions={long:a,short:p},"scopes"in d&&d.scopes&&this.scopes.push(...d.scopes),"scope"in d&&d.scope&&this.scopes.push(d.scope),"tags"in d&&d.tags&&this.tags.push(...d.tags),"tag"in d&&d.tag&&this.tags.push(d.tag),"methods"in d?this.methods=d.methods:this.methods=[d.method]}_setSiblingMethods(t){this.siblingMethods=t}getDescription(t){return this.descriptions[t]}getMethods(){return this.methods}getSchema(t){return this.schemas[t]}getMimeTypes(t){return this.mimeTypes[t]}getStatusCode(t){return this.statusCodes[t]}getSecurity(){return this.middlewares.reduce((t,r)=>r.security?ae(t,r.security):t,{and:[]})}getScopes(){return this.scopes}getTags(){return this.tags}#e(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.methods.concat(this.siblingMethods).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#t(t){try{return await this.schemas.output.parseAsync(t)}catch(r){throw r instanceof L.z.ZodError?new _(r):r}}async#r({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.middlewares){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(l){throw l instanceof L.z.ZodError?new v(l):l}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#o({input:t,options:r,logger:o}){let n;try{n=await this.schemas.input.parseAsync(t)}catch(s){throw s instanceof L.z.ZodError?new v(s):s}return this.handler({input:n,options:r,logger:o})}async#n({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.resultHandler.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){ze({logger:n,response:o,error:new ie(ne(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=We(t),a,p=null;if(n.cors){let c=this.#e();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let l in c)r.set(l,c[l])}let d=jt(t,n.inputSources);try{let{options:c,isStreamClosed:l}=await this.#r({method:s,input:d,request:t,response:r,logger:o});if(l)return;if(s==="options"){r.status(200).end();return}a=await this.#t(await this.#o({input:d,options:c,logger:o}))}catch(c){p=ne(c)}await this.#n({input:d,output:a,request:t,response:r,error:p,logger:o})}};var kt=["get","post","put","delete","patch"];var nt=require("zod");var Ut=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Ee(s,n),o)};var je=e=>{if(K(e.input))throw new G("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var Se=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:nt.z.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,h=>{if(h&&h instanceof Error)return c(o(h));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(je({input:nt.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new ve({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:Ut(s,t),...n})}},Ht=new Se(W);var Kt=require("util"),pe=require("triple-beam"),Oe=b(require("winston")),{combine:Dr,colorize:zr,timestamp:vr,printf:jr}=Oe.default.format;function be(e){let t=s=>{let{[pe.LEVEL]:a,[pe.MESSAGE]:p,[pe.SPLAT]:d,...c}=s;return(0,Kt.inspect)(c,!1,1,e.color)},r=s=>jr(({timestamp:a,message:p,level:d,durationMs:c,...l})=>(typeof p=="object"&&(l={...l,...p},p="[No message]"),`${a} ${d}: ${p}`+(c===void 0?"":` duration: ${c}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[vr()],n={handleExceptions:!0};switch(e.color&&o.push(zr()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=Dr(...o),Oe.default.createLogger({silent:e.level==="silent",levels:Oe.default.config.npm.levels,transports:[new Oe.default.transports.Console(n)],exitOnError:!1})}var ce=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new se(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
6
6
  This error should prevent mistakes during the development process.
7
7
  Example:
8
8
 
@@ -13,8 +13,8 @@ new ${this.constructor.name}({
13
13
  ...
14
14
  })
15
15
  });
16
- `)})}};var dr=R(require("express")),ye=class{constructor(...t){this.params=t}apply(t,r){return r(t,dr.default.static(...this.params))}};var oe=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new W(`Routing elements should not contain '/' character.
17
- The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let d=`${o||""}${s?`/${s}`:""}`;if(a instanceof te){let c=a.getMethods().slice();n&&c.push("options"),c.forEach(p=>{t(a,d,p)})}else if(a instanceof ye)r&&a.apply(d,r);else if(a instanceof fe){if(Object.entries(a.methods).forEach(([c,p])=>{t(p,d,c)}),n&&Object.keys(a.methods).length>0){let[c,...p]=Object.keys(a.methods),l=a.methods[c];l._setSiblingMethods(p),t(l,d,"options")}}else oe({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:d})})};var pr=()=>`
16
+ `)})}};var Ft=b(require("express")),le=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Ft.default.static(...this.params))}};var ee=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new J(`Routing elements should not contain '/' character.
17
+ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof X){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof le)r&&a.apply(p,r);else if(a instanceof ce){if(Object.entries(a.methods).forEach(([d,c])=>{t(c,p,d)}),n&&Object.keys(a.methods).length>0){let[d,...c]=Object.keys(a.methods),l=a.methods[d];l._setSiblingMethods(c),t(l,p,"options")}}else ee({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var $t=()=>`
18
18
  \x1B[94m\x1B[39m
19
19
  \x1B[94m\x1B[39m
20
20
  \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
@@ -27,11 +27,11 @@ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let
27
27
  \x1B[95m8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P' d8888888888 "Y88P" "Y88888 d88P 888 888 8888888\x1B[39m\x1B[94m\x1B[39m
28
28
  \x1B[94m 888\x1B[39m
29
29
  \x1B[94m 888\x1B[3m Proudly supports transgender community.\x1B[23m\x1B[39m
30
- \x1B[94m\x1B[3mfor trans sisters \x1B[23m888\x1B[3m Start your API server with I/O schema validation and custom middlewares in minutes.\x1B[23m\x1B[39m\x1B[90m\x1B[39m
30
+ \x1B[94m\x1B[3mfor Adriana \x1B[23m888\x1B[3m Start your API server with I/O schema validation and custom middlewares in minutes.\x1B[23m\x1B[39m\x1B[90m\x1B[39m
31
31
  \x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
32
32
  \x1B[0m\x1B[0m
33
33
  \x1B[0m\x1B[0m
34
- `.trim();var St=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(pr()),oe({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(d,c)=>{t.info(`${d.method}: ${s}`),await n.execute({request:d,response:c,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var Ye=R(require("express")),cr=R(require("compression")),lr=R(require("express-fileupload")),mr=R(require("https"));var Ot=R(require("http-errors")),no=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,Ot.default)(400,ae(r).message),request:o,response:n,logger:t,input:o.body,output:null})},ur=(e,t)=>(r,o)=>{let n=(0,Ot.default)(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){He({response:o,logger:t,error:new pe(ae(s).message,n)})}};function fr(e,t){let r=ft(e.logger)?Ee(e.logger):e.logger;St({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||ee;return{notFoundHandler:ur(o,r),logger:r}}function yr(e,t){let r=ft(e.logger)?Ee(e.logger):e.logger,o=(0,Ye.default)();o.disable("x-powered-by");let n=e.errorHandler||ee,s=e.server.compression?(0,cr.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,Ye.json)(),d=e.server.upload?(0,lr.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,c=[].concat(s||[]).concat(a).concat(d||[]);o.use(c),o.use(no(n,r)),St({app:o,routing:t,logger:r,config:e}),o.use(ur(n,r));let p=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=mr.default.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:p,httpsServer:l,logger:r}}var Er=require("openapi3-ts/oas30");var U=require("openapi3-ts/oas30"),ge=require("ramda"),T=require("zod");var S=require("zod");var bt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,so="ZodDateIn",Qe=class Qe extends S.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==S.ZodParsedType.string)return(0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_type,expected:S.ZodParsedType.string,received:o.parsedType}),S.INVALID;bt.test(o.data)||((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return ze(n)?{status:r.value,value:n}:((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_date}),S.INVALID)}};Qe.create=()=>new Qe({typeName:so});var Je=Qe;var ne=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,d=s?s({schema:e,...n,next:p=>ne({...p,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),c=t&&t({schema:e,prev:d,...n});return c?{...d,...c}:d};var gr=50,xr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",io={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Tr=e=>e.replace(mt,t=>`{${t.slice(1)}}`),ao=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),po=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),co=()=>({format:"any"}),lo=e=>{if(e.isResponse)throw new C({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},mo=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new C({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},uo=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),fo=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),yo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),go=({schema:e,next:t})=>t({schema:e.unwrap()}),ho=({schema:e,next:t})=>t({schema:e._def.innerType}),xo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),hr=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),To=({schema:{value:e}})=>({type:typeof e,enum:[e]}),So=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Re(s)?s instanceof T.z.ZodOptional:s.isOptional())});return{type:"object",properties:We({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},Oo=()=>({type:"string",nullable:!0,format:"null"}),bo=e=>{if(e.isResponse)throw new C({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:bt.source,externalDocs:{url:xr}}},Ro=e=>{if(!e.isResponse)throw new C({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:xr}}},Po=e=>{throw new C({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},Zo=()=>({type:"boolean"}),Eo=()=>({type:"integer",format:"bigint"}),Ao=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof T.z.ZodEnum||e instanceof T.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:We({schema:T.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.z.ZodLiteral)return{type:"object",properties:We({schema:T.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.z.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof T.z.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:We({schema:T.z.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},Io=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),Co=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${(0,U.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},No=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:c,isEmoji:p,isDatetime:l,_def:{checks:f}}})=>{let x=f.find(h=>h.kind==="regex"),g=f.find(h=>h.kind==="datetime"),O=x?x.regex:g?g.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...d&&{format:"ulid"},...c&&{format:"ip"},...p&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...O&&{pattern:`/${O.source}/${O.flags}`}}},Mo=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},We=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),wo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return io?.[t]},Do=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,U.isSchemaObject)(o)){let s=Le({effect:n,sample:wo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:T.z.any()})}if(!t&&n.type==="preprocess"&&(0,U.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},zo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),vo=({schema:e,next:t})=>t({schema:e.unwrap()}),jo=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},Sr=(e,t,r=[])=>{let o=V({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:(0,ge.omit)(r,s)}}),{})}},Lo=(e,t,r)=>{let o=V({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function Ae(e,t){if(e instanceof T.z.ZodObject)return e;let r;if(e instanceof T.z.ZodUnion||e instanceof T.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Ae(o,t)).reduce((o,n)=>o.merge(n.partial()),T.z.object({}));else if(e instanceof T.z.ZodEffects){if(_(e))throw new C({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Ae(e._def.schema,t)}else r=Ae(e._def.left,t).merge(Ae(e._def.right,t));return Me(e,r)}var Or=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="parameter"})=>{let p=r.getSchema("input"),l=Ae(p,{path:e,method:t,isResponse:!1}).shape,f=yt(e),x=o.includes("query"),g=o.includes("params"),O=h=>g&&f.includes(h);return Object.keys(l).filter(h=>x||O(h)).map(h=>{let Z=ne({schema:l[h],isResponse:!1,rules:Pt,onEach:Zt,onMissing:Et,serializer:n,getRef:s,makeRef:a,path:e,method:t}),y=d==="components"?a(v(e,t,`${c} ${h}`),Z):Z;return{name:h,in:O(h)?"path":"query",required:!l[h].isOptional(),description:(0,U.isSchemaObject)(Z)&&Z.description||`${t.toUpperCase()} ${e} ${c}`,schema:y,...Lo(p,!1,h)}})},Pt={ZodString:No,ZodNumber:Mo,ZodBigInt:Eo,ZodBoolean:Zo,ZodDateIn:bo,ZodDateOut:Ro,ZodNull:Oo,ZodArray:Io,ZodTuple:Co,ZodRecord:Ao,ZodObject:So,ZodLiteral:To,ZodIntersection:yo,ZodUnion:uo,ZodFile:mo,ZodUpload:lo,ZodAny:co,ZodDefault:ao,ZodEnum:hr,ZodNativeEnum:hr,ZodEffects:Do,ZodOptional:go,ZodNullable:xo,ZodDiscriminatedUnion:fo,ZodBranded:vo,ZodDate:Po,ZodCatch:po,ZodPipeline:zo,ZodLazy:jo,ZodReadonly:ho},Zt=({schema:e,isResponse:t,prev:r})=>{if((0,U.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof T.z.ZodLazy,s=r.type!==void 0,a=t&&Re(e),d=!n&&s&&!a&&e.isNullable(),c=n?[]:V({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...c.length>0&&{example:c[0]}}},Et=({schema:e,...t})=>{throw new C({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},Rt=(e,t)=>{if((0,U.isReferenceObject)(e))return e;let r=e.properties?(0,ge.omit)(t,e.properties):void 0,o=e.example?(0,ge.omit)(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>Rt(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>Rt(d,t)):void 0;return(0,ge.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},d])=>d===void 0).map(([d])=>d),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},br=e=>(0,U.isSchemaObject)(e)?(0,ge.omit)(["example"],e):e,At=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="response"})=>{let p=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),f=br(ne({schema:p,isResponse:!0,rules:Pt,onEach:Zt,onMissing:Et,serializer:n,getRef:s,makeRef:a,path:t,method:e})),x=Sr(p,!0),g=d==="components"?a(v(t,e,c),f):f;return{description:`${e.toUpperCase()} ${t} ${c}`,content:l.reduce((O,h)=>({...O,[h]:{schema:g,...x}}),{})}},ko=()=>({type:"http",scheme:"basic"}),Uo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Ho=({name:e})=>({type:"apiKey",in:"query",name:e}),Ko=({name:e})=>({type:"apiKey",in:"header",name:e}),Fo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),$o=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),_o=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),Rr=e=>{let t={basic:ko,bearer:Uo,input:Ho,header:Ko,cookie:Fo,openid:$o,oauth2:_o};return Ue(e,r=>t[r.type](r))},Xe=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Xe(ht(e))}return Xe({or:[e]})},Pr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let c=yt(t),p=br(Rt(ne({schema:r.getSchema("input"),isResponse:!1,rules:Pt,onEach:Zt,onMissing:Et,serializer:o,getRef:n,makeRef:s,path:t,method:e}),c)),l=Sr(r.getSchema("input"),!1,c),f=a==="components"?s(v(t,e,d),p):p;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((x,g)=>({...x,[g]:{schema:f,...l}}),{})}},Zr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),It=e=>e.length<=gr?e:e.slice(0,gr-1)+"\u2026";var et=class extends Er.OpenApiBuilder{constructor({routing:r,config:o,title:n,version:s,serverUrl:a,successfulResponseDescription:d="Successful response",errorResponseDescription:c="Error response",hasSummaryFromDescription:p=!0,composition:l="inline",serializer:f=je}){super();this.lastSecuritySchemaIds={};this.lastOperationIdSuffixes={};this.addInfo({title:n,version:s}).addServer({url:a}),oe({routing:r,onEndpoint:(g,O,h)=>{let Z=h,y={path:O,method:Z,endpoint:g,composition:l,serializer:f,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[M,F]=["short","long"].map(g.getDescription.bind(g)),xe=o.inputSources?.[Z]||De[Z],Te=Or({...y,inputSources:xe}),N={operationId:this.ensureUniqOperationId(O,Z),responses:{[g.getStatusCode("positive")]:At({...y,clue:d,isPositive:!0}),[g.getStatusCode("negative")]:At({...y,clue:c,isPositive:!1})}};F&&(N.description=F,p&&M===void 0&&(N.summary=It(F))),M&&(N.summary=It(M)),g.getTags().length>0&&(N.tags=g.getTags()),Te.length>0&&(N.parameters=Te),xe.includes("body")&&(N.requestBody=Pr(y));let Ie=Xe(Ue(Rr(g.getSecurity()),lt=>{let Kt=this.ensureUniqSecuritySchemaName(lt),Kr=["oauth2","openIdConnect"].includes(lt.type)?g.getScopes():[];return this.addSecurityScheme(Kt,lt),{name:Kt,scopes:Kr}}));Ie.length>0&&(N.security=Ie);let ct=Tr(O);this.addPath(ct,{[Z]:N})}}),this.rootDoc.tags=o.tags?Zr(o.tags):[]}makeRef(r,o){return this.addSchema(r,o),this.getRef(r)}getRef(r){return r in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${r}`}:void 0}ensureUniqOperationId(r,o){let n=v(r,o);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(r){let o=JSON.stringify(r);for(let n in this.rootDoc.components?.securitySchemes||{})if(o===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;return this.lastSecuritySchemaIds[r.type]=(this.lastSecuritySchemaIds?.[r.type]||0)+1,`${r.type.toUpperCase()}_${this.lastSecuritySchemaIds[r.type]}`}};var Ct=R(require("http"));var Go=e=>({method:"GET",header:jest.fn(()=>Q),...e}),Vo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:Ct.default.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=Ct.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},Ar=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=Go(t),d=Vo(r),c={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},p={cors:!1,logger:c,...o};return await e.execute({request:a,response:d,config:p,logger:c}),{requestMock:a,responseMock:d,loggerMock:c}};var K=R(require("typescript"));var z=R(require("typescript")),i=z.default.factory,se=[i.createModifier(z.default.SyntaxKind.ExportKeyword)],qo=[i.createModifier(z.default.SyntaxKind.AsyncKeyword)],Bo=[i.createModifier(z.default.SyntaxKind.PublicKeyword),i.createModifier(z.default.SyntaxKind.ReadonlyKeyword)],Ir=[i.createModifier(z.default.SyntaxKind.ProtectedKeyword),i.createModifier(z.default.SyntaxKind.ReadonlyKeyword)],Yo=i.createTemplateHead(""),Jo=i.createTemplateTail(""),Qo=i.createTemplateMiddle(" "),Nt=e=>i.createTemplateLiteralType(Yo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Jo:Qo))),Mt=Nt(["M","P"]),tt=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t),rt=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(tt(o,e[o],t)),[]),wt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),Cr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),Dt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),zt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],z.default.NodeFlags.Const),vt=(e,t)=>i.createTypeAliasDeclaration(se,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),ot=(e,t)=>i.createTypeAliasDeclaration(se,e,void 0,t),Nr=(e,t,r)=>i.createPropertyDeclaration(Bo,e,void 0,t,r),Mr=(e,t,r=[])=>i.createClassDeclaration(se,e,void 0,void 0,[t,...r]),wr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),Dr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(z.default.SyntaxKind.AnyKeyword)]),jt=(e,t,r)=>i.createInterfaceDeclaration(se,e,void 0,t,r),zr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),vr=(e,t)=>i.createArrowFunction(qo,void 0,e.map(r=>tt(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Lt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,rt({acc:void 0,key:void 0}),void 0,void 0,t),r]);var u=R(require("typescript")),Ur=require("zod");var H=R(require("typescript")),{factory:nt}=H.default,kt=(e,t)=>{H.default.addSyntheticLeadingComment(e,H.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},st=(e,t,r)=>{let o=nt.createTypeAliasDeclaration(void 0,nt.createIdentifier(t),void 0,e);return r&&kt(o,r),o},jr=(e,t)=>{let r=H.default.createSourceFile("print.ts","",H.default.ScriptTarget.Latest,!1,H.default.ScriptKind.TS);return H.default.createPrinter(t).printNode(H.default.EmitHint.Unspecified,e,r)},Wo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Lr=e=>Wo.test(e)?nt.createIdentifier(e):nt.createStringLiteral(e);var{factory:m}=u.default,Xo={[u.default.SyntaxKind.AnyKeyword]:"",[u.default.SyntaxKind.BigIntKeyword]:BigInt(0),[u.default.SyntaxKind.BooleanKeyword]:!1,[u.default.SyntaxKind.NumberKeyword]:0,[u.default.SyntaxKind.ObjectKeyword]:{},[u.default.SyntaxKind.StringKeyword]:"",[u.default.SyntaxKind.UndefinedKeyword]:void 0},en=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),tn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&Re(a)?a instanceof Ur.z.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,Lr(s),d&&o?m.createToken(u.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&kt(c,a.description),c});return m.createTypeLiteralNode(n)},rn=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),on=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),kr=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),nn=e=>Xo?.[e.kind],sn=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Le({effect:n,sample:nn(o)}),a={number:u.default.SyntaxKind.NumberKeyword,bigint:u.default.SyntaxKind.BigIntKeyword,boolean:u.default.SyntaxKind.BooleanKeyword,string:u.default.SyntaxKind.StringKeyword,undefined:u.default.SyntaxKind.UndefinedKeyword,object:u.default.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||u.default.SyntaxKind.AnyKeyword)}return o},an=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),dn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.default.SyntaxKind.UndefinedKeyword)]):o},pn=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),cn=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),ln=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),mn=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),un=({next:e,schema:t})=>e({schema:t._def.innerType}),Y=e=>()=>m.createKeywordTypeNode(e),fn=({next:e,schema:t})=>e({schema:t.unwrap()}),yn=({next:e,schema:t})=>e({schema:t._def.innerType}),gn=({next:e,schema:t})=>e({schema:t._def.innerType}),hn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),xn=()=>m.createLiteralTypeNode(m.createNull()),Tn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,m.createLiteralTypeNode(m.createNull())),t(s,r({schema:n.schema}))))()},Sn={ZodString:Y(u.default.SyntaxKind.StringKeyword),ZodNumber:Y(u.default.SyntaxKind.NumberKeyword),ZodBigInt:Y(u.default.SyntaxKind.BigIntKeyword),ZodBoolean:Y(u.default.SyntaxKind.BooleanKeyword),ZodDateIn:Y(u.default.SyntaxKind.StringKeyword),ZodDateOut:Y(u.default.SyntaxKind.StringKeyword),ZodNull:xn,ZodArray:rn,ZodTuple:cn,ZodRecord:ln,ZodObject:tn,ZodLiteral:en,ZodIntersection:mn,ZodUnion:kr,ZodFile:Y(u.default.SyntaxKind.StringKeyword),ZodAny:Y(u.default.SyntaxKind.AnyKeyword),ZodDefault:un,ZodEnum:on,ZodNativeEnum:an,ZodEffects:sn,ZodOptional:dn,ZodNullable:pn,ZodDiscriminatedUnion:kr,ZodBranded:fn,ZodCatch:gn,ZodPipeline:hn,ZodLazy:Tn,ZodReadonly:yn},Ut=({schema:e,...t})=>ne({schema:e,rules:Sn,onMissing:()=>m.createKeywordTypeNode(u.default.SyntaxKind.AnyKeyword),...t});var it=class{constructor({routing:t,variant:r="client",serializer:o=je,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){this.agg=[];this.registry={};this.paths=[];this.aliases={};oe({routing:t,onEndpoint:(y,M,F)=>{let xe=v(M,F,"input"),Te=v(M,F,"response"),N={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Ie=Ut({...N,schema:y.getSchema("input"),isResponse:!1}),ct=Ut({...N,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(st(Ie,xe),st(ct,Te)),F!=="options"&&(this.paths.push(M),this.registry[`${F} ${M}`]={in:xe,out:Te,isJson:y.getMimeTypes("positive").includes(Q),tags:y.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=vt("Path",this.paths),a=vt("Method",nr),d=ot("MethodPath",Nt([a.name,s.name])),c=[i.createHeritageClause(K.default.SyntaxKind.ExtendsKeyword,[wt(d.name,K.default.SyntaxKind.AnyKeyword)])],p=jt("Input",c,Object.keys(this.registry).map(y=>Dt(y,this.registry[y].in))),l=jt("Response",c,Object.keys(this.registry).map(y=>Dt(y,this.registry[y].out)));if(this.agg.push(s,a,d,p,l),r==="types")return;let f=i.createVariableStatement(se,zt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),x=i.createVariableStatement(se,zt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(y=>i.createPropertyAssignment(`"${y}"`,i.createArrayLiteralExpression(this.registry[y].tags.map(M=>i.createStringLiteral(M)))))))),g=ot("Provider",i.createFunctionTypeNode(zr({M:a.name,P:s.name}),rt({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(p.name),Mt)}),wr(l.name,Mt))),O=ot("Implementation",i.createFunctionTypeNode(void 0,rt({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(K.default.SyntaxKind.StringKeyword),params:wt(K.default.SyntaxKind.StringKeyword,K.default.SyntaxKind.AnyKeyword)}),Dr())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),Z=Mr("ExpressZodAPIClient",Cr([tt("implementation",i.createTypeReferenceNode(O.name),Ir)]),[Nr("provide",i.createTypeReferenceNode(g.name),vr(["method","path","params"],[i.createIdentifier("method"),Lt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Lt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),K.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment("[key]",i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);K.default.addSyntheticLeadingComment(Z,K.default.SyntaxKind.MultiLineCommentTrivia,`
34
+ `.trim();var st=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log($t()),ee({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var Le=b(require("express")),_t=b(require("compression")),Gt=b(require("express-fileupload")),Vt=b(require("https"));var it=b(require("http-errors")),Lr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,it.default)(400,ne(r).message),request:o,response:n,logger:t,input:o.body,output:null})},qt=(e,t)=>(r,o)=>{let n=(0,it.default)(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){ze({response:o,logger:t,error:new ie(ne(s).message,n)})}};function Bt(e,t){let r=Xe(e.logger)?be(e.logger):e.logger;st({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||W;return{notFoundHandler:qt(o,r),logger:r}}function Yt(e,t){let r=Xe(e.logger)?be(e.logger):e.logger,o=(0,Le.default)();o.disable("x-powered-by");let n=e.errorHandler||W,s=e.server.compression?(0,_t.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,Le.json)(),p=e.server.upload?(0,Gt.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use(Lr(n,r)),st({app:o,routing:t,logger:r,config:e}),o.use(qt(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=Vt.default.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}}var ir=require("openapi3-ts/oas30");var k=require("openapi3-ts/oas30"),me=require("ramda"),x=require("zod");var T=require("zod");var at=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,kr="ZodDateIn",ke=class e extends T.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==T.ZodParsedType.string)return(0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_type,expected:T.ZodParsedType.string,received:o.parsedType}),T.INVALID;at.test(o.data)||((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ie(n)?{status:r.value,value:n}:((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_date}),T.INVALID)}static create=()=>new e({typeName:kr})};var te=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>te({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var Jt=50,Wt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Ur={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Xt=e=>e.replace(Qe,t=>`{${t.slice(1)}}`),Hr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Kr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Fr=()=>({format:"any"}),$r=e=>{if(e.isResponse)throw new C({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},_r=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new C({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},Gr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Vr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),qr=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Br=({schema:e,next:t})=>t({schema:e.unwrap()}),Yr=({schema:e,next:t})=>t({schema:e._def.innerType}),Jr=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Qt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),Qr=({schema:{value:e}})=>({type:typeof e,enum:[e]}),Wr=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Te(s)?s instanceof x.z.ZodOptional:s.isOptional())});return{type:"object",properties:Ue({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},Xr=()=>({type:"string",nullable:!0,format:"null"}),eo=e=>{if(e.isResponse)throw new C({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:at.source,externalDocs:{url:Wt}}},to=e=>{if(!e.isResponse)throw new C({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Wt}}},ro=e=>{throw new C({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},oo=()=>({type:"boolean"}),no=()=>({type:"integer",format:"bigint"}),so=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.z.ZodEnum||e instanceof x.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ue({schema:x.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.z.ZodLiteral)return{type:"object",properties:Ue({schema:x.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.z.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.z.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ue({schema:x.z.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},io=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),ao=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${(0,k.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},po=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:h}}})=>{let g=h.find(f=>f.kind==="regex"),S=h.find(f=>f.kind==="datetime"),P=g?g.regex:S?S.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...P&&{pattern:`/${P.source}/${P.flags}`}}},co=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ue=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),lo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Ur?.[t]},mo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,k.isSchemaObject)(o)){let s=Me({effect:n,sample:lo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.z.any()})}if(!t&&n.type==="preprocess"&&(0,k.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},uo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),fo=({schema:e,next:t})=>t({schema:e.unwrap()}),yo=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},er=(e,t,r=[])=>{let o=$({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:(0,me.omit)(r,s)}}),{})}},go=(e,t,r)=>{let o=$({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function Re(e,t){if(e instanceof x.z.ZodObject)return e;let r;if(e instanceof x.z.ZodUnion||e instanceof x.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Re(o,t)).reduce((o,n)=>o.merge(n.partial()),x.z.object({}));else if(e instanceof x.z.ZodEffects){if(K(e))throw new C({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Re(e._def.schema,t)}else r=Re(e._def.left,t).merge(Re(e._def.right,t));return Ee(e,r)}var tr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=Re(c,{path:e,method:t,isResponse:!1}).shape,h=et(e),g=o.includes("query"),S=o.includes("params"),P=f=>S&&h.includes(f);return Object.keys(l).filter(f=>g||P(f)).map(f=>{let A=te({schema:l[f],isResponse:!1,rules:pt,onEach:ct,onMissing:lt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),y=p==="components"?a(z(e,t,`${d} ${f}`),A):A;return{name:f,in:P(f)?"path":"query",required:!l[f].isOptional(),description:(0,k.isSchemaObject)(A)&&A.description||`${t.toUpperCase()} ${e} ${d}`,schema:y,...go(c,!1,f)}})},pt={ZodString:po,ZodNumber:co,ZodBigInt:no,ZodBoolean:oo,ZodDateIn:eo,ZodDateOut:to,ZodNull:Xr,ZodArray:io,ZodTuple:ao,ZodRecord:so,ZodObject:Wr,ZodLiteral:Qr,ZodIntersection:qr,ZodUnion:Gr,ZodFile:_r,ZodUpload:$r,ZodAny:Fr,ZodDefault:Hr,ZodEnum:Qt,ZodNativeEnum:Qt,ZodEffects:mo,ZodOptional:Br,ZodNullable:Jr,ZodDiscriminatedUnion:Vr,ZodBranded:fo,ZodDate:ro,ZodCatch:Kr,ZodPipeline:uo,ZodLazy:yo,ZodReadonly:Yr},ct=({schema:e,isResponse:t,prev:r})=>{if((0,k.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof x.z.ZodLazy,s=r.type!==void 0,a=t&&Te(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:$({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},lt=({schema:e,...t})=>{throw new C({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},dt=(e,t)=>{if((0,k.isReferenceObject)(e))return e;let r=e.properties?(0,me.omit)(t,e.properties):void 0,o=e.example?(0,me.omit)(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>dt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>dt(p,t)):void 0;return(0,me.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},rr=e=>(0,k.isSchemaObject)(e)?(0,me.omit)(["example"],e):e,mt=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),h=rr(te({schema:c,isResponse:!0,rules:pt,onEach:ct,onMissing:lt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),g=er(c,!0),S=p==="components"?a(z(t,e,d),h):h;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((P,f)=>({...P,[f]:{schema:S,...g}}),{})}},ho=()=>({type:"http",scheme:"basic"}),xo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),To=({name:e})=>({type:"apiKey",in:"query",name:e}),So=({name:e})=>({type:"apiKey",in:"header",name:e}),Oo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),bo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Ro=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),or=e=>{let t={basic:ho,bearer:xo,input:To,header:So,cookie:Oo,openid:bo,oauth2:Ro};return De(e,r=>t[r.type](r))},He=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return He(rt(e))}return He({or:[e]})},nr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=et(t),c=rr(dt(te({schema:r.getSchema("input"),isResponse:!1,rules:pt,onEach:ct,onMissing:lt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=er(r.getSchema("input"),!1,d),h=a==="components"?s(z(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((g,S)=>({...g,[S]:{schema:h,...l}}),{})}},sr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),ut=e=>e.length<=Jt?e:e.slice(0,Jt-1)+"\u2026";var Ke=class extends ir.OpenApiBuilder{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r){let o=z(t,r);return o in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[o]++,`${o}${this.lastOperationIdSuffixes[o]}`):(this.lastOperationIdSuffixes[o]=1,o)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Ne}){super(),this.addInfo({title:o,version:n}).addServer({url:s}),ee({routing:t,onEndpoint:(g,S,P)=>{let f=P,A={path:S,method:f,endpoint:g,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[y,M]=["short","long"].map(g.getDescription.bind(g)),q=r.inputSources?.[f]||Ae[f],ue=tr({...A,inputSources:q}),N={operationId:this.ensureUniqOperationId(S,f),responses:{[g.getStatusCode("positive")]:mt({...A,clue:a,isPositive:!0}),[g.getStatusCode("negative")]:mt({...A,clue:p,isPositive:!1})}};M&&(N.description=M,d&&y===void 0&&(N.summary=ut(M))),y&&(N.summary=ut(y)),g.getTags().length>0&&(N.tags=g.getTags()),ue.length>0&&(N.parameters=ue),q.includes("body")&&(N.requestBody=nr(A));let fe=He(De(or(g.getSecurity()),ye=>{let Et=this.ensureUniqSecuritySchemaName(ye),Or=["oauth2","openIdConnect"].includes(ye.type)?g.getScopes():[];return this.addSecurityScheme(Et,ye),{name:Et,scopes:Or}}));fe.length>0&&(N.security=fe);let Je=Xt(S);this.addPath(Je,{[f]:N})}}),this.rootDoc.tags=r.tags?sr(r.tags):[]}};var ft=b(require("http"));var Po=e=>({method:"GET",header:jest.fn(()=>Y),...e}),Zo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:ft.default.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=ft.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},ar=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=Po(t),p=Zo(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};var H=b(require("typescript"));var D=b(require("typescript")),i=D.default.factory,re=[i.createModifier(D.default.SyntaxKind.ExportKeyword)],Eo=[i.createModifier(D.default.SyntaxKind.AsyncKeyword)],Ao=[i.createModifier(D.default.SyntaxKind.PublicKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],dr=[i.createModifier(D.default.SyntaxKind.ProtectedKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],Io=i.createTemplateHead(""),Co=i.createTemplateTail(""),No=i.createTemplateMiddle(" "),yt=e=>i.createTemplateLiteralType(Io,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Co:No))),gt=yt(["M","P"]),Fe=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),$e=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Fe(o,e[o],t)),[]),ht=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),pr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),xt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),Tt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],D.default.NodeFlags.Const),St=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),_e=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,t),cr=(e,t,r)=>i.createPropertyDeclaration(Ao,e,void 0,t,r),lr=(e,t,r=[])=>i.createClassDeclaration(re,e,void 0,void 0,[t,...r]),mr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),ur=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(D.default.SyntaxKind.AnyKeyword)]),Ot=(e,t,r)=>i.createInterfaceDeclaration(re,e,void 0,t,r),fr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),yr=(e,t)=>i.createArrowFunction(Eo,void 0,e.map(r=>Fe(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),bt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,$e({acc:void 0,key:void 0}),void 0,void 0,t),r]);var u=b(require("typescript")),Tr=require("zod");var U=b(require("typescript")),{factory:Ge}=U.default,Rt=(e,t)=>{U.default.addSyntheticLeadingComment(e,U.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ve=(e,t,r)=>{let o=Ge.createTypeAliasDeclaration(void 0,Ge.createIdentifier(t),void 0,e);return r&&Rt(o,r),o},gr=(e,t)=>{let r=U.default.createSourceFile("print.ts","",U.default.ScriptTarget.Latest,!1,U.default.ScriptKind.TS);return U.default.createPrinter(t).printNode(U.default.EmitHint.Unspecified,e,r)},Mo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,hr=e=>Mo.test(e)?Ge.createIdentifier(e):Ge.createStringLiteral(e);var{factory:m}=u.default,wo={[u.default.SyntaxKind.AnyKeyword]:"",[u.default.SyntaxKind.BigIntKeyword]:BigInt(0),[u.default.SyntaxKind.BooleanKeyword]:!1,[u.default.SyntaxKind.NumberKeyword]:0,[u.default.SyntaxKind.ObjectKeyword]:{},[u.default.SyntaxKind.StringKeyword]:"",[u.default.SyntaxKind.UndefinedKeyword]:void 0},Do=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),zo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Te(a)?a instanceof Tr.z.ZodOptional:a.isOptional(),d=m.createPropertySignature(void 0,hr(s),p&&o?m.createToken(u.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Rt(d,a.description),d});return m.createTypeLiteralNode(n)},vo=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),jo=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),xr=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),Lo=e=>wo?.[e.kind],ko=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Me({effect:n,sample:Lo(o)}),a={number:u.default.SyntaxKind.NumberKeyword,bigint:u.default.SyntaxKind.BigIntKeyword,boolean:u.default.SyntaxKind.BooleanKeyword,string:u.default.SyntaxKind.StringKeyword,undefined:u.default.SyntaxKind.UndefinedKeyword,object:u.default.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||u.default.SyntaxKind.AnyKeyword)}return o},Uo=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),Ho=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.default.SyntaxKind.UndefinedKeyword)]):o},Ko=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),Fo=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),$o=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),_o=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Go=({next:e,schema:t})=>e({schema:t._def.innerType}),V=e=>()=>m.createKeywordTypeNode(e),Vo=({next:e,schema:t})=>e({schema:t.unwrap()}),qo=({next:e,schema:t})=>e({schema:t._def.innerType}),Bo=({next:e,schema:t})=>e({schema:t._def.innerType}),Yo=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),Jo=()=>m.createLiteralTypeNode(m.createNull()),Qo=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,m.createLiteralTypeNode(m.createNull())),t(s,r({schema:n.schema}))))()},Wo={ZodString:V(u.default.SyntaxKind.StringKeyword),ZodNumber:V(u.default.SyntaxKind.NumberKeyword),ZodBigInt:V(u.default.SyntaxKind.BigIntKeyword),ZodBoolean:V(u.default.SyntaxKind.BooleanKeyword),ZodDateIn:V(u.default.SyntaxKind.StringKeyword),ZodDateOut:V(u.default.SyntaxKind.StringKeyword),ZodNull:Jo,ZodArray:vo,ZodTuple:Fo,ZodRecord:$o,ZodObject:zo,ZodLiteral:Do,ZodIntersection:_o,ZodUnion:xr,ZodFile:V(u.default.SyntaxKind.StringKeyword),ZodAny:V(u.default.SyntaxKind.AnyKeyword),ZodDefault:Go,ZodEnum:jo,ZodNativeEnum:Uo,ZodEffects:ko,ZodOptional:Ho,ZodNullable:Ko,ZodDiscriminatedUnion:xr,ZodBranded:Vo,ZodCatch:Bo,ZodPipeline:Yo,ZodLazy:Qo,ZodReadonly:qo},Pt=({schema:e,...t})=>te({schema:e,rules:Wo,onMissing:()=>m.createKeywordTypeNode(u.default.SyntaxKind.AnyKeyword),...t});var qe=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=Ve(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ne,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(y,M,q)=>{let ue=z(M,q,"input"),N=z(M,q,"response"),fe={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Je=Pt({...fe,schema:y.getSchema("input"),isResponse:!1}),ye=Pt({...fe,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(Ve(Je,ue),Ve(ye,N)),q!=="options"&&(this.paths.push(M),this.registry[`${q} ${M}`]={in:ue,out:N,isJson:y.getMimeTypes("positive").includes(Y),tags:y.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=St("Path",this.paths),a=St("Method",kt),p=_e("MethodPath",yt([a.name,s.name])),d=[i.createHeritageClause(H.default.SyntaxKind.ExtendsKeyword,[ht(p.name,H.default.SyntaxKind.AnyKeyword)])],c=Ot("Input",d,Object.keys(this.registry).map(y=>xt(y,this.registry[y].in))),l=Ot("Response",d,Object.keys(this.registry).map(y=>xt(y,this.registry[y].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let h=i.createVariableStatement(re,Tt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),g=i.createVariableStatement(re,Tt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(y=>i.createPropertyAssignment(`"${y}"`,i.createArrayLiteralExpression(this.registry[y].tags.map(M=>i.createStringLiteral(M)))))))),S=_e("Provider",i.createFunctionTypeNode(fr({M:a.name,P:s.name}),$e({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),gt)}),mr(l.name,gt))),P=_e("Implementation",i.createFunctionTypeNode(void 0,$e({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(H.default.SyntaxKind.StringKeyword),params:ht(H.default.SyntaxKind.StringKeyword,H.default.SyntaxKind.AnyKeyword)}),ur())),f=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),A=lr("ExpressZodAPIClient",pr([Fe("implementation",i.createTypeReferenceNode(P.name),dr)]),[cr("provide",i.createTypeReferenceNode(S.name),yr(["method","path","params"],[i.createIdentifier("method"),bt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[f,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),bt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[f]),H.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);H.default.addSyntheticLeadingComment(A,H.default.SyntaxKind.MultiLineCommentTrivia,`
35
35
  export const exampleImplementation: Implementation = async (
36
36
  method,
37
37
  path,
@@ -52,6 +52,6 @@ export const exampleImplementation: Implementation = async (
52
52
 
53
53
  const client = new ExpressZodAPIClient(exampleImplementation);
54
54
  client.provide("get", "/v1/user/retrieve", { id: "10" });
55
- `,!0),this.agg.push(f,x,g,O,Z)}getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=st(r,t),this.getAlias(t)}print(t){return this.agg.map(r=>jr(r,t)).join(`
55
+ `,!0),this.agg.push(h,g,S,P,A)}print(t){return this.agg.map(r=>gr(r,t)).join(`
56
56
 
57
- `)}};var Ht={};Ft(Ht,{dateIn:()=>En,dateOut:()=>An,file:()=>Pn,upload:()=>Zn});var P=require("zod");var On="ZodDateOut",dt=class dt extends P.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==P.ZodParsedType.date?((0,P.addIssueToContext)(o,{code:P.ZodIssueCode.invalid_type,expected:P.ZodParsedType.date,received:o.parsedType}),P.INVALID):ze(o.data)?{status:r.value,value:o.data.toISOString()}:((0,P.addIssueToContext)(o,{code:P.ZodIssueCode.invalid_date}),P.INVALID)}};dt.create=()=>new dt({typeName:On});var at=dt;var A=require("zod");var bn="ZodFile",Rn=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,he=class he extends A.ZodType{constructor(){super(...arguments);this.binary=r=>new he({...this._def,checks:[...this._def.checks,{kind:"binary",...gt(r)}]});this.base64=r=>new he({...this._def,checks:[...this._def.checks,{kind:"base64",...gt(r)}]})}_parse(r){let{status:o,ctx:n}=this._processInputParams(r);if(n.parsedType!==A.ZodParsedType.string)return(0,A.addIssueToContext)(n,{code:A.ZodIssueCode.invalid_type,expected:A.ZodParsedType.string,received:n.parsedType}),A.INVALID;for(let s of this._def.checks)s.kind==="base64"&&(Rn.test(n.data)||((0,A.addIssueToContext)(n,{code:A.ZodIssueCode.custom,message:s.message}),o.dirty()));return{status:o.value,value:n.data}}get isBinary(){return!!this._def.checks.find(r=>r.kind==="binary")}get isBase64(){return!!this._def.checks.find(r=>r.kind==="base64")}};he.create=()=>new he({checks:[],typeName:bn});var pt=he;var Pn=pt.create,Zn=ie.create,En=Je.create,An=at.create;var Hr=R(require("http-errors"));0&&(module.exports={AbstractEndpoint,DependsOnMethod,DependsOnMethodError,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,OutputValidationError,RoutingError,ServeStatic,attachRouting,createConfig,createHttpError,createLogger,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});
57
+ `)}};var Zt={};At(Zt,{dateIn:()=>nn,dateOut:()=>sn,file:()=>rn,upload:()=>on});var R=require("zod");var Xo="ZodDateOut",Be=class e extends R.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==R.ZodParsedType.date?((0,R.addIssueToContext)(o,{code:R.ZodIssueCode.invalid_type,expected:R.ZodParsedType.date,received:o.parsedType}),R.INVALID):Ie(o.data)?{status:r.value,value:o.data.toISOString()}:((0,R.addIssueToContext)(o,{code:R.ZodIssueCode.invalid_date}),R.INVALID)}static create=()=>new e({typeName:Xo})};var E=require("zod");var en="ZodFile",tn=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Ye=class e extends E.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==E.ZodParsedType.string)return(0,E.addIssueToContext)(o,{code:E.ZodIssueCode.invalid_type,expected:E.ZodParsedType.string,received:o.parsedType}),E.INVALID;for(let n of this._def.checks)n.kind==="base64"&&(tn.test(o.data)||((0,E.addIssueToContext)(o,{code:E.ZodIssueCode.custom,message:n.message}),r.dirty()));return{status:r.value,value:o.data}}binary=t=>new e({...this._def,checks:[...this._def.checks,{kind:"binary",...tt(t)}]});base64=t=>new e({...this._def,checks:[...this._def.checks,{kind:"base64",...tt(t)}]});get isBinary(){return!!this._def.checks.find(t=>t.kind==="binary")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}static create=()=>new e({checks:[],typeName:en})};var rn=Ye.create,on=oe.create,nn=ke.create,sn=Be.create;var Sr=b(require("http-errors"));0&&(module.exports={AbstractEndpoint,DependsOnMethod,DependsOnMethodError,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,OutputValidationError,RoutingError,ServeStatic,attachRouting,createConfig,createHttpError,createLogger,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});
package/dist/index.mjs ADDED
@@ -0,0 +1,57 @@
1
+ var ar=Object.defineProperty;var dr=(e,t)=>{for(var r in t)ar(e,r,{get:t[r],enumerable:!0})};var yt={silent:!0,warn:!0,debug:!0},pr=e=>e;import{z}from"zod";import{createHash as br}from"crypto";import{HttpError as Rr}from"http-errors";import{z as S}from"zod";import{clone as cr,mergeDeepRight as lr}from"ramda";var b="expressZodApiMeta",mr=e=>{let t=e.constructor,r=cr(e._def);return r[b]=r[b]||{examples:[]},new t(r)},V=e=>{let t=mr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=V(t);return o._def[b].examples.push(r),o}}}),t},gt=e=>b in e._def?typeof e._def[b]=="object"&&e._def[b]!==null:!1;function ht(e,t){if(!gt(e))return;let r=e._def;return t in r[b]?r[b][t]:void 0}var ye=(e,t)=>{if(!gt(e))return t;let r=V(t),o=se(r._def[b].examples,e._def[b].examples);if(r._def[b].examples=[],o.type==="single")r._def[b].examples=o.value;else for(let[n,s]of o.value)r._def[b].examples.push(lr({...n},{...s}));return r};import ur from"mime";var U=ur.getType("json")||"application/json",ie="multipart/form-data";import{INVALID as fr,OK as yr,ZodIssueCode as gr,ZodParsedType as hr,ZodType as xr,addIssueToContext as Tr}from"zod";var Sr="ZodUpload",Or=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",q=class e extends xr{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==hr.object||!Or(r.data)?(Tr(r,{code:gr.custom,message:`Expected file upload, received ${r.parsedType}`}),fr):yr(r.data)}static create=()=>new e({typeName:Sr})};var ke=/:([A-Za-z0-9_]+)/g;function Pr(e){let r=(e.header("content-type")||"").slice(0,ie.length).toLowerCase()===ie;return"files"in e&&r}var ge={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Zr=["body","query","params"],Ue=e=>e.method.toLowerCase();function xt(e,t){let r=Ue(e);if(r==="options")return{};let o=Zr;return r in ge&&(o=ge[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Pr(e):!0).reduce((n,s)=>({...n,...e[s]}),{})}function He(e){return typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(yt).includes(e.level)&&typeof e.color=="boolean"}function he(e){return!isNaN(e.getTime())}function B(e){return e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`)}function H(e){return e instanceof S.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof F?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message}function Ke(e){return e instanceof Rr?e.statusCode:e instanceof w?400:500}var K=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=ht(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},se=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}};function Fe(e){let t=e.match(ke);return t?t.map(r=>r.slice(1)):[]}var ae=e=>e.reduce((t,r)=>t||r,!1);function M(e){return e instanceof S.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof S.ZodUnion?ae(e.options.map(M)):e instanceof S.ZodIntersection?ae([e._def.left,e._def.right].map(M)):!1}function A(e){return e instanceof q?!0:e instanceof S.ZodObject?ae(Object.values(e.shape).map(A)):e instanceof S.ZodUnion?ae(e.options.map(A)):e instanceof S.ZodIntersection?ae([e._def.left,e._def.right].map(A)):e instanceof S.ZodOptional||e instanceof S.ZodNullable?A(e.unwrap()):e instanceof S.ZodEffects||e instanceof S.ZodTransformer?A(e._def.schema):e instanceof S.ZodRecord?A(e._def.valueType):e instanceof S.ZodArray?A(e._def.type):e instanceof S.ZodDefault?A(e._def.innerType):!1}var de=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,I=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),xe=e=>br("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Te=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},$e=e=>typeof e=="string"?{message:e}:e||{};var Y=class extends Error{name="RoutingError"},pe=class extends Y{name="DependsOnMethodError"},Z=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
2
+ Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},D=class extends Error{name="IOSchemaError"},F=class extends D{name="OutputValidationError";originalError;constructor(t){super(H(t)),this.originalError=t}},w=class extends D{name="InputValidationError";originalError;constructor(t){super(H(t)),this.originalError=t}},J=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var C=e=>typeof e=="object"&&e!==null,Se=e=>({and:e.reduce((t,r)=>t.concat(C(r)&&"and"in r?r.and:r),[])}),Oe=(e,t)=>{if(C(e)){if("and"in e)return{and:e.and.map(r=>C(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>C(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},_e=e=>e.and.reduce((t,r)=>{let o=se(t.or,C(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(Se),t},{or:[]}),Q=(e,t)=>{if(C(e)){if("and"in e){if(C(t)){if("and"in t)return Se([e,t]);if("or"in t)return Q(_e(e),t)}return Se([e,t])}if("or"in e){if(C(t)){if("and"in t)return Q(t,e);if("or"in t){let r=se(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(Se)}}}return Q(e,{and:[t]})}}return C(t)&&("and"in t||"or"in t)?Q(t,e):{and:[e,t]}};import{z as W}from"zod";var X={positive:200,negative:400},Tt=e=>e,ee=Tt({getPositiveResponse:e=>{let t=K({schema:e}),r=V(W.object({status:W.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>V(W.object({status:W.literal("error"),error:W.object({message:W.string()})})).example({status:"error",error:{message:H(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(X.positive).json({status:"success",data:r});return}let a=Ke(e);a===500&&s.error(`Internal server error
3
+ ${e.stack}
4
+ `,{url:o.url,payload:t}),n.status(a).json({status:"error",error:{message:H(e)}})}}),be=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
+ Original error: ${e.originalError.message}.`:""))};var St=(e,t=[U])=>{if(e instanceof z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},te=class{},Re=class extends te{descriptions;methods=[];siblingMethods=[];middlewares=[];mimeTypes;statusCodes;handler;resultHandler;schemas;scopes=[];tags=[];constructor({middlewares:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,description:a,shortDescription:p,...d}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:l,schema:h})=>{if(M(h))throw new D(`Using transformations on the top level of endpoint ${l} is not allowed.`)}),this.middlewares=t;let c={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.mimeTypes={input:A(r)?[ie]:[U],positive:St(c.positive),negative:St(c.negative)},this.schemas={input:r,output:o,positive:c.positive instanceof z.ZodType?c.positive:c.positive.schema,negative:c.negative instanceof z.ZodType?c.negative:c.negative.schema},this.statusCodes={positive:c.positive instanceof z.ZodType?X.positive:c.positive.statusCode||X.positive,negative:c.negative instanceof z.ZodType?X.negative:c.negative.statusCode||X.negative},this.handler=n,this.resultHandler=s,this.descriptions={long:a,short:p},"scopes"in d&&d.scopes&&this.scopes.push(...d.scopes),"scope"in d&&d.scope&&this.scopes.push(d.scope),"tags"in d&&d.tags&&this.tags.push(...d.tags),"tag"in d&&d.tag&&this.tags.push(d.tag),"methods"in d?this.methods=d.methods:this.methods=[d.method]}_setSiblingMethods(t){this.siblingMethods=t}getDescription(t){return this.descriptions[t]}getMethods(){return this.methods}getSchema(t){return this.schemas[t]}getMimeTypes(t){return this.mimeTypes[t]}getStatusCode(t){return this.statusCodes[t]}getSecurity(){return this.middlewares.reduce((t,r)=>r.security?Q(t,r.security):t,{and:[]})}getScopes(){return this.scopes}getTags(){return this.tags}#e(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.methods.concat(this.siblingMethods).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#t(t){try{return await this.schemas.output.parseAsync(t)}catch(r){throw r instanceof z.ZodError?new F(r):r}}async#r({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.middlewares){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(l){throw l instanceof z.ZodError?new w(l):l}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#o({input:t,options:r,logger:o}){let n;try{n=await this.schemas.input.parseAsync(t)}catch(s){throw s instanceof z.ZodError?new w(s):s}return this.handler({input:n,options:r,logger:o})}async#n({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.resultHandler.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){be({logger:n,response:o,error:new J(B(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=Ue(t),a,p=null;if(n.cors){let c=this.#e();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let l in c)r.set(l,c[l])}let d=xt(t,n.inputSources);try{let{options:c,isStreamClosed:l}=await this.#r({method:s,input:d,request:t,response:r,logger:o});if(l)return;if(s==="options"){r.status(200).end();return}a=await this.#t(await this.#o({input:d,options:c,logger:o}))}catch(c){p=B(c)}await this.#n({input:d,output:a,request:t,response:r,error:p,logger:o})}};var Ot=["get","post","put","delete","patch"];import{z as Rt}from"zod";var bt=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>ye(s,n),o)};var Ge=e=>{if(M(e.input))throw new D("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var Pe=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:Rt.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,h=>{if(h&&h instanceof Error)return c(o(h));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(Ge({input:Rt.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new Re({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:bt(s,t),...n})}},Er=new Pe(ee);import{inspect as Ar}from"util";import{LEVEL as Ir,MESSAGE as Cr,SPLAT as Nr}from"triple-beam";import Ze from"winston";var{combine:Mr,colorize:wr,timestamp:Dr,printf:zr}=Ze.format;function Ee(e){let t=s=>{let{[Ir]:a,[Cr]:p,[Nr]:d,...c}=s;return Ar(c,!1,1,e.color)},r=s=>zr(({timestamp:a,message:p,level:d,durationMs:c,...l})=>(typeof p=="object"&&(l={...l,...p},p="[No message]"),`${a} ${d}: ${p}`+(c===void 0?"":` duration: ${c}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[Dr()],n={handleExceptions:!0};switch(e.color&&o.push(wr()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=Mr(...o),Ze.createLogger({silent:e.level==="silent",levels:Ze.config.npm.levels,transports:[new Ze.transports.Console(n)],exitOnError:!1})}var ce=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new pe(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
6
+ This error should prevent mistakes during the development process.
7
+ Example:
8
+
9
+ new ${this.constructor.name}({
10
+ ${r}: endpointsFactory.build({
11
+ methods: ['${r}', `+((t[r]?.getMethods()||[]).map(n=>`'${n}'`).join(", ")||"...")+`]
12
+ // or method: '${r}'
13
+ ...
14
+ })
15
+ });
16
+ `)})}};import vr from"express";var le=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,vr.static(...this.params))}};var $=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new Y(`Routing elements should not contain '/' character.
17
+ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof te){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof le)r&&a.apply(p,r);else if(a instanceof ce){if(Object.entries(a.methods).forEach(([d,c])=>{t(c,p,d)}),n&&Object.keys(a.methods).length>0){let[d,...c]=Object.keys(a.methods),l=a.methods[d];l._setSiblingMethods(c),t(l,p,"options")}}else $({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var Pt=()=>`
18
+ \x1B[94m\x1B[39m
19
+ \x1B[94m\x1B[39m
20
+ \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
21
+ \x1B[94m888 d88P 888 d88888 888 Y88b 888\x1B[39m\x1B[95m\x1B[39m
22
+ \x1B[95m888 d88P 888 d88P888 888 888 888\x1B[39m
23
+ \x1B[95m8888888 888 888 88888b. 888d888 .d88b. .d8888b .d8888b d88P .d88b. .d88888 d88P 888 888 d88P 888\x1B[39m\x1B[97m\x1B[39m
24
+ \x1B[97m888 \`Y8bd8P' 888 "88b 888P" d8P Y8b 88K 88K d88P d88""88b d88" 888 d88P 888 8888888P" 888 \x1B[39m
25
+ \x1B[97m888 X88K 888 888 888 88888888 "Y8888b. "Y8888b. d88P 888 888 888 888 d88P 888 888 888\x1B[39m\x1B[95m\x1B[39m
26
+ \x1B[95m888 .d8""8b. 888 d88P 888 Y8b. X88 X88 d88P Y88..88P Y88b 888 d8888888888 888 888 \x1B[39m
27
+ \x1B[95m8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P' d8888888888 "Y88P" "Y88888 d88P 888 888 8888888\x1B[39m\x1B[94m\x1B[39m
28
+ \x1B[94m 888\x1B[39m
29
+ \x1B[94m 888\x1B[3m Proudly supports transgender community.\x1B[23m\x1B[39m
30
+ \x1B[94m\x1B[3mfor Adriana \x1B[23m888\x1B[3m Start your API server with I/O schema validation and custom middlewares in minutes.\x1B[23m\x1B[39m\x1B[90m\x1B[39m
31
+ \x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
32
+ \x1B[0m\x1B[0m
33
+ \x1B[0m\x1B[0m
34
+ `.trim();var Ve=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Pt()),$({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};import jr,{json as Lr}from"express";import kr from"compression";import Ur from"express-fileupload";import Hr from"https";import Zt from"http-errors";var Kr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:Zt(400,B(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Et=(e,t)=>(r,o)=>{let n=Zt(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){be({response:o,logger:t,error:new J(B(s).message,n)})}};function Fr(e,t){let r=He(e.logger)?Ee(e.logger):e.logger;Ve({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||ee;return{notFoundHandler:Et(o,r),logger:r}}function $r(e,t){let r=He(e.logger)?Ee(e.logger):e.logger,o=jr();o.disable("x-powered-by");let n=e.errorHandler||ee,s=e.server.compression?kr({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||Lr(),p=e.server.upload?Ur({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use(Kr(n,r)),Ve({app:o,routing:t,logger:r,config:e}),o.use(Et(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=Hr.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}}import{OpenApiBuilder as Mo}from"openapi3-ts/oas30";import{isReferenceObject as Mt,isSchemaObject as fe}from"openapi3-ts/oas30";import{omit as ue}from"ramda";import{z as x}from"zod";import{INVALID as At,ZodIssueCode as qe,ZodParsedType as It,ZodType as _r,addIssueToContext as Be}from"zod";var Ye=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Gr="ZodDateIn",Ae=class e extends _r{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==It.string)return Be(o,{code:qe.invalid_type,expected:It.string,received:o.parsedType}),At;Ye.test(o.data)||(Be(o,{code:qe.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return he(n)?{status:r.value,value:n}:(Be(o,{code:qe.invalid_date}),At)}static create=()=>new e({typeName:Gr})};var _=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>_({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var Ct=50,wt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Vr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Dt=e=>e.replace(ke,t=>`{${t.slice(1)}}`),qr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Br=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Yr=()=>({format:"any"}),Jr=e=>{if(e.isResponse)throw new Z({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Qr=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new Z({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},Wr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Xr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),eo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),to=({schema:e,next:t})=>t({schema:e.unwrap()}),ro=({schema:e,next:t})=>t({schema:e._def.innerType}),oo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Nt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),no=({schema:{value:e}})=>({type:typeof e,enum:[e]}),so=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&de(s)?s instanceof x.ZodOptional:s.isOptional())});return{type:"object",properties:Ie({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},io=()=>({type:"string",nullable:!0,format:"null"}),ao=e=>{if(e.isResponse)throw new Z({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:Ye.source,externalDocs:{url:wt}}},po=e=>{if(!e.isResponse)throw new Z({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:wt}}},co=e=>{throw new Z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},lo=()=>({type:"boolean"}),mo=()=>({type:"integer",format:"bigint"}),uo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.ZodEnum||e instanceof x.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ie({schema:x.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.ZodLiteral)return{type:"object",properties:Ie({schema:x.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ie({schema:x.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},fo=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),yo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${fe(o)?o.type:o.$ref}`).join(", ")}}}},go=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:h}}})=>{let g=h.find(f=>f.kind==="regex"),T=h.find(f=>f.kind==="datetime"),O=g?g.regex:T?T.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...O&&{pattern:`/${O.source}/${O.flags}`}}},ho=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ie=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),xo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Vr?.[t]},To=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&fe(o)){let s=Te({effect:n,sample:xo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.any()})}if(!t&&n.type==="preprocess"&&fe(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},So=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Oo=({schema:e,next:t})=>t({schema:e.unwrap()}),bo=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},zt=(e,t,r=[])=>{let o=K({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:ue(r,s)}}),{})}},Ro=(e,t,r)=>{let o=K({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function me(e,t){if(e instanceof x.ZodObject)return e;let r;if(e instanceof x.ZodUnion||e instanceof x.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>me(o,t)).reduce((o,n)=>o.merge(n.partial()),x.object({}));else if(e instanceof x.ZodEffects){if(M(e))throw new Z({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=me(e._def.schema,t)}else r=me(e._def.left,t).merge(me(e._def.right,t));return ye(e,r)}var vt=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=me(c,{path:e,method:t,isResponse:!1}).shape,h=Fe(e),g=o.includes("query"),T=o.includes("params"),O=f=>T&&h.includes(f);return Object.keys(l).filter(f=>g||O(f)).map(f=>{let R=_({schema:l[f],isResponse:!1,rules:Qe,onEach:We,onMissing:Xe,serializer:n,getRef:s,makeRef:a,path:e,method:t}),y=p==="components"?a(I(e,t,`${d} ${f}`),R):R;return{name:f,in:O(f)?"path":"query",required:!l[f].isOptional(),description:fe(R)&&R.description||`${t.toUpperCase()} ${e} ${d}`,schema:y,...Ro(c,!1,f)}})},Qe={ZodString:go,ZodNumber:ho,ZodBigInt:mo,ZodBoolean:lo,ZodDateIn:ao,ZodDateOut:po,ZodNull:io,ZodArray:fo,ZodTuple:yo,ZodRecord:uo,ZodObject:so,ZodLiteral:no,ZodIntersection:eo,ZodUnion:Wr,ZodFile:Qr,ZodUpload:Jr,ZodAny:Yr,ZodDefault:qr,ZodEnum:Nt,ZodNativeEnum:Nt,ZodEffects:To,ZodOptional:to,ZodNullable:oo,ZodDiscriminatedUnion:Xr,ZodBranded:Oo,ZodDate:co,ZodCatch:Br,ZodPipeline:So,ZodLazy:bo,ZodReadonly:ro},We=({schema:e,isResponse:t,prev:r})=>{if(Mt(r))return{};let{description:o}=e,n=e instanceof x.ZodLazy,s=r.type!==void 0,a=t&&de(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:K({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},Xe=({schema:e,...t})=>{throw new Z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},Je=(e,t)=>{if(Mt(e))return e;let r=e.properties?ue(t,e.properties):void 0,o=e.example?ue(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>Je(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>Je(p,t)):void 0;return ue(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},jt=e=>fe(e)?ue(["example"],e):e,et=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),h=jt(_({schema:c,isResponse:!0,rules:Qe,onEach:We,onMissing:Xe,serializer:n,getRef:s,makeRef:a,path:t,method:e})),g=zt(c,!0),T=p==="components"?a(I(t,e,d),h):h;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((O,f)=>({...O,[f]:{schema:T,...g}}),{})}},Po=()=>({type:"http",scheme:"basic"}),Zo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Eo=({name:e})=>({type:"apiKey",in:"query",name:e}),Ao=({name:e})=>({type:"apiKey",in:"header",name:e}),Io=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Co=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),No=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),Lt=e=>{let t={basic:Po,bearer:Zo,input:Eo,header:Ao,cookie:Io,openid:Co,oauth2:No};return Oe(e,r=>t[r.type](r))},Ce=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Ce(_e(e))}return Ce({or:[e]})},kt=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=Fe(t),c=jt(Je(_({schema:r.getSchema("input"),isResponse:!1,rules:Qe,onEach:We,onMissing:Xe,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=zt(r.getSchema("input"),!1,d),h=a==="components"?s(I(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((g,T)=>({...g,[T]:{schema:h,...l}}),{})}},Ut=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),tt=e=>e.length<=Ct?e:e.slice(0,Ct-1)+"\u2026";var rt=class extends Mo{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r){let o=I(t,r);return o in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[o]++,`${o}${this.lastOperationIdSuffixes[o]}`):(this.lastOperationIdSuffixes[o]=1,o)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=xe}){super(),this.addInfo({title:o,version:n}).addServer({url:s}),$({routing:t,onEndpoint:(g,T,O)=>{let f=O,R={path:T,method:f,endpoint:g,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[y,E]=["short","long"].map(g.getDescription.bind(g)),k=r.inputSources?.[f]||ge[f],re=vt({...R,inputSources:k}),P={operationId:this.ensureUniqOperationId(T,f),responses:{[g.getStatusCode("positive")]:et({...R,clue:a,isPositive:!0}),[g.getStatusCode("negative")]:et({...R,clue:p,isPositive:!1})}};E&&(P.description=E,d&&y===void 0&&(P.summary=tt(E))),y&&(P.summary=tt(y)),g.getTags().length>0&&(P.tags=g.getTags()),re.length>0&&(P.parameters=re),k.includes("body")&&(P.requestBody=kt(R));let oe=Ce(Oe(Lt(g.getSecurity()),ne=>{let ft=this.ensureUniqSecuritySchemaName(ne),ir=["oauth2","openIdConnect"].includes(ne.type)?g.getScopes():[];return this.addSecurityScheme(ft,ne),{name:ft,scopes:ir}}));oe.length>0&&(P.security=oe);let Le=Dt(T);this.addPath(Le,{[f]:P})}}),this.rootDoc.tags=r.tags?Ut(r.tags):[]}};import Ht from"http";var wo=e=>({method:"GET",header:jest.fn(()=>U),...e}),Do=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:Ht.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=Ht.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},zo=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=wo(t),p=Do(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};import L from"typescript";import N from"typescript";var i=N.factory,G=[i.createModifier(N.SyntaxKind.ExportKeyword)],vo=[i.createModifier(N.SyntaxKind.AsyncKeyword)],jo=[i.createModifier(N.SyntaxKind.PublicKeyword),i.createModifier(N.SyntaxKind.ReadonlyKeyword)],Kt=[i.createModifier(N.SyntaxKind.ProtectedKeyword),i.createModifier(N.SyntaxKind.ReadonlyKeyword)],Lo=i.createTemplateHead(""),ko=i.createTemplateTail(""),Uo=i.createTemplateMiddle(" "),ot=e=>i.createTemplateLiteralType(Lo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?ko:Uo))),nt=ot(["M","P"]),Ne=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Me=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Ne(o,e[o],t)),[]),st=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),Ft=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),it=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),at=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],N.NodeFlags.Const),dt=(e,t)=>i.createTypeAliasDeclaration(G,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),we=(e,t)=>i.createTypeAliasDeclaration(G,e,void 0,t),$t=(e,t,r)=>i.createPropertyDeclaration(jo,e,void 0,t,r),_t=(e,t,r=[])=>i.createClassDeclaration(G,e,void 0,void 0,[t,...r]),Gt=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),Vt=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(N.SyntaxKind.AnyKeyword)]),pt=(e,t,r)=>i.createInterfaceDeclaration(G,e,void 0,t,r),qt=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Bt=(e,t)=>i.createArrowFunction(vo,void 0,e.map(r=>Ne(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),ct=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,Me({acc:void 0,key:void 0}),void 0,void 0,t),r]);import u from"typescript";import{z as Ko}from"zod";import v from"typescript";var{factory:De}=v,lt=(e,t)=>{v.addSyntheticLeadingComment(e,v.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ze=(e,t,r)=>{let o=De.createTypeAliasDeclaration(void 0,De.createIdentifier(t),void 0,e);return r&&lt(o,r),o},Yt=(e,t)=>{let r=v.createSourceFile("print.ts","",v.ScriptTarget.Latest,!1,v.ScriptKind.TS);return v.createPrinter(t).printNode(v.EmitHint.Unspecified,e,r)},Ho=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Jt=e=>Ho.test(e)?De.createIdentifier(e):De.createStringLiteral(e);var{factory:m}=u,Fo={[u.SyntaxKind.AnyKeyword]:"",[u.SyntaxKind.BigIntKeyword]:BigInt(0),[u.SyntaxKind.BooleanKeyword]:!1,[u.SyntaxKind.NumberKeyword]:0,[u.SyntaxKind.ObjectKeyword]:{},[u.SyntaxKind.StringKeyword]:"",[u.SyntaxKind.UndefinedKeyword]:void 0},$o=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),_o=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&de(a)?a instanceof Ko.ZodOptional:a.isOptional(),d=m.createPropertySignature(void 0,Jt(s),p&&o?m.createToken(u.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&lt(d,a.description),d});return m.createTypeLiteralNode(n)},Go=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),Vo=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),Qt=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),qo=e=>Fo?.[e.kind],Bo=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Te({effect:n,sample:qo(o)}),a={number:u.SyntaxKind.NumberKeyword,bigint:u.SyntaxKind.BigIntKeyword,boolean:u.SyntaxKind.BooleanKeyword,string:u.SyntaxKind.StringKeyword,undefined:u.SyntaxKind.UndefinedKeyword,object:u.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||u.SyntaxKind.AnyKeyword)}return o},Yo=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),Jo=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.SyntaxKind.UndefinedKeyword)]):o},Qo=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),Wo=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),Xo=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),en=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),tn=({next:e,schema:t})=>e({schema:t._def.innerType}),j=e=>()=>m.createKeywordTypeNode(e),rn=({next:e,schema:t})=>e({schema:t.unwrap()}),on=({next:e,schema:t})=>e({schema:t._def.innerType}),nn=({next:e,schema:t})=>e({schema:t._def.innerType}),sn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),an=()=>m.createLiteralTypeNode(m.createNull()),dn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,m.createLiteralTypeNode(m.createNull())),t(s,r({schema:n.schema}))))()},pn={ZodString:j(u.SyntaxKind.StringKeyword),ZodNumber:j(u.SyntaxKind.NumberKeyword),ZodBigInt:j(u.SyntaxKind.BigIntKeyword),ZodBoolean:j(u.SyntaxKind.BooleanKeyword),ZodDateIn:j(u.SyntaxKind.StringKeyword),ZodDateOut:j(u.SyntaxKind.StringKeyword),ZodNull:an,ZodArray:Go,ZodTuple:Wo,ZodRecord:Xo,ZodObject:_o,ZodLiteral:$o,ZodIntersection:en,ZodUnion:Qt,ZodFile:j(u.SyntaxKind.StringKeyword),ZodAny:j(u.SyntaxKind.AnyKeyword),ZodDefault:tn,ZodEnum:Vo,ZodNativeEnum:Yo,ZodEffects:Bo,ZodOptional:Jo,ZodNullable:Qo,ZodDiscriminatedUnion:Qt,ZodBranded:rn,ZodCatch:nn,ZodPipeline:sn,ZodLazy:dn,ZodReadonly:on},mt=({schema:e,...t})=>_({schema:e,rules:pn,onMissing:()=>m.createKeywordTypeNode(u.SyntaxKind.AnyKeyword),...t});var ut=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=ze(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=xe,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){$({routing:t,onEndpoint:(y,E,k)=>{let re=I(E,k,"input"),P=I(E,k,"response"),oe={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Le=mt({...oe,schema:y.getSchema("input"),isResponse:!1}),ne=mt({...oe,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(ze(Le,re),ze(ne,P)),k!=="options"&&(this.paths.push(E),this.registry[`${k} ${E}`]={in:re,out:P,isJson:y.getMimeTypes("positive").includes(U),tags:y.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=dt("Path",this.paths),a=dt("Method",Ot),p=we("MethodPath",ot([a.name,s.name])),d=[i.createHeritageClause(L.SyntaxKind.ExtendsKeyword,[st(p.name,L.SyntaxKind.AnyKeyword)])],c=pt("Input",d,Object.keys(this.registry).map(y=>it(y,this.registry[y].in))),l=pt("Response",d,Object.keys(this.registry).map(y=>it(y,this.registry[y].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let h=i.createVariableStatement(G,at("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),g=i.createVariableStatement(G,at("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(y=>i.createPropertyAssignment(`"${y}"`,i.createArrayLiteralExpression(this.registry[y].tags.map(E=>i.createStringLiteral(E)))))))),T=we("Provider",i.createFunctionTypeNode(qt({M:a.name,P:s.name}),Me({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),nt)}),Gt(l.name,nt))),O=we("Implementation",i.createFunctionTypeNode(void 0,Me({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(L.SyntaxKind.StringKeyword),params:st(L.SyntaxKind.StringKeyword,L.SyntaxKind.AnyKeyword)}),Vt())),f=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),R=_t("ExpressZodAPIClient",Ft([Ne("implementation",i.createTypeReferenceNode(O.name),Kt)]),[$t("provide",i.createTypeReferenceNode(T.name),Bt(["method","path","params"],[i.createIdentifier("method"),ct("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[f,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),ct("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[f]),L.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);L.addSyntheticLeadingComment(R,L.SyntaxKind.MultiLineCommentTrivia,`
35
+ export const exampleImplementation: Implementation = async (
36
+ method,
37
+ path,
38
+ params
39
+ ) => {
40
+ const hasBody = !["get", "delete"].includes(method);
41
+ const searchParams = hasBody ? "" : \`?\${new URLSearchParams(params)}\`;
42
+ const response = await fetch(\`https://example.com\${path}\${searchParams}\`, {
43
+ method: method.toUpperCase(),
44
+ headers: hasBody ? { "Content-Type": "application/json" } : undefined,
45
+ body: hasBody ? JSON.stringify(params) : undefined,
46
+ });
47
+ if (\`\${method} \${path}\` in jsonEndpoints) {
48
+ return response.json();
49
+ }
50
+ return response.text();
51
+ };
52
+
53
+ const client = new ExpressZodAPIClient(exampleImplementation);
54
+ client.provide("get", "/v1/user/retrieve", { id: "10" });
55
+ `,!0),this.agg.push(h,g,T,O,R)}print(t){return this.agg.map(r=>Yt(r,t)).join(`
56
+
57
+ `)}};var sr={};dr(sr,{dateIn:()=>xn,dateOut:()=>Tn,file:()=>gn,upload:()=>hn});import{INVALID as Wt,ZodIssueCode as Xt,ZodParsedType as er,ZodType as cn,addIssueToContext as tr}from"zod";var ln="ZodDateOut",ve=class e extends cn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==er.date?(tr(o,{code:Xt.invalid_type,expected:er.date,received:o.parsedType}),Wt):he(o.data)?{status:r.value,value:o.data.toISOString()}:(tr(o,{code:Xt.invalid_date}),Wt)}static create=()=>new e({typeName:ln})};import{INVALID as mn,ZodIssueCode as rr,ZodParsedType as or,ZodType as un,addIssueToContext as nr}from"zod";var fn="ZodFile",yn=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,je=class e extends un{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==or.string)return nr(o,{code:rr.invalid_type,expected:or.string,received:o.parsedType}),mn;for(let n of this._def.checks)n.kind==="base64"&&(yn.test(o.data)||(nr(o,{code:rr.custom,message:n.message}),r.dirty()));return{status:r.value,value:o.data}}binary=t=>new e({...this._def,checks:[...this._def.checks,{kind:"binary",...$e(t)}]});base64=t=>new e({...this._def,checks:[...this._def.checks,{kind:"base64",...$e(t)}]});get isBinary(){return!!this._def.checks.find(t=>t.kind==="binary")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}static create=()=>new e({checks:[],typeName:fn})};var gn=je.create,hn=q.create,xn=Ae.create,Tn=ve.create;import Va from"http-errors";export{te as AbstractEndpoint,ce as DependsOnMethod,pe as DependsOnMethodError,rt as Documentation,Z as DocumentationError,Pe as EndpointsFactory,w as InputValidationError,ut as Integration,F as OutputValidationError,Y as RoutingError,le as ServeStatic,Fr as attachRouting,pr as createConfig,Va as createHttpError,Ee as createLogger,Ge as createMiddleware,Tt as createResultHandler,$r as createServer,Er as defaultEndpointsFactory,ee as defaultResultHandler,sr as ez,K as getExamples,H as getMessageFromError,Ke as getStatusCodeFromError,zo as testEndpoint,V as withMeta};
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "11.6.0",
3
+ "version": "12.0.0-beta2",
4
4
  "description": "A Typescript library to help you get an API server up and running with I/O schema validation and custom middlewares in minutes.",
5
5
  "license": "MIT",
6
6
  "scripts": {
7
7
  "start": "ts-node example/index.ts",
8
8
  "build": "yarn build:compile && yarn build:tests && yarn build:assets",
9
- "build:compile": "tsup && mv dist/index.d.mts dist/esm/index.d.ts",
10
- "build:tests": "yarn build:intTest && yarn build:esmTest",
11
- "build:intTest": "ts-node tools/integration-test.ts && yarn install --cwd ./tests/integration && ts-node tools/int-test-package.ts",
12
- "build:esmTest": "ts-node tools/esm-test.ts && yarn install --cwd ./tests/esm && ts-node tools/esm-test-package.ts",
9
+ "build:compile": "tsup && attw --pack",
10
+ "build:tests": "yarn build:int && yarn build:esm",
11
+ "build:int": "ts-node tools/integration-test.ts && yarn install --cwd ./tests/integration",
12
+ "build:esm": "ts-node tools/esm-test.ts && yarn install --cwd ./tests/esm",
13
13
  "build:assets": "yarn build:swagger && yarn build:client && yarn build:license",
14
14
  "build:swagger": "ts-node example/generate-open-api-schema.ts > example/example.swagger.yaml",
15
15
  "build:client": "ts-node example/generate-client.ts > example/example.client.ts && yarn prettier example/example.client.ts --write",
@@ -30,12 +30,12 @@
30
30
  },
31
31
  "main": "dist/index.js",
32
32
  "types": "dist/index.d.ts",
33
- "module": "dist/esm/index.js",
33
+ "module": "dist/index.mjs",
34
34
  "exports": {
35
35
  ".": {
36
36
  "import": {
37
- "types": "./dist/esm/index.d.ts",
38
- "default": "./dist/esm/index.js"
37
+ "types": "./dist/index.d.mts",
38
+ "default": "./dist/index.mjs"
39
39
  },
40
40
  "require": {
41
41
  "types": "./dist/index.d.ts",
@@ -45,8 +45,8 @@
45
45
  },
46
46
  "dependencies": {
47
47
  "@types/compression": "^1.7.2",
48
- "@types/express-fileupload": "^1.2.2",
49
- "@types/http-errors": "^2.0.0",
48
+ "@types/express-fileupload": "^1.4.1",
49
+ "@types/http-errors": "^2.0.1",
50
50
  "@types/node": "*",
51
51
  "compression": "1.7.4",
52
52
  "express-fileupload": "1.4.0",
@@ -54,15 +54,15 @@
54
54
  "mime": "3.0.0",
55
55
  "openapi3-ts": "^4.1.2",
56
56
  "ramda": "0.29.0",
57
- "triple-beam": "1.4.1",
58
- "winston": "3.10.0"
57
+ "triple-beam": "^1.4.1"
59
58
  },
60
59
  "peerDependencies": {
61
60
  "@types/express": "^4.17.13",
62
61
  "@types/jest": "*",
63
62
  "express": "^4.18.2",
64
- "jest": ">=25 <30",
65
- "typescript": "^4.9.3 || ^5.0.2",
63
+ "jest": ">=28 <30",
64
+ "typescript": "^5.1.3",
65
+ "winston": "^3.10.0",
66
66
  "zod": "^3.21.4"
67
67
  },
68
68
  "peerDependenciesMeta": {
@@ -80,46 +80,47 @@
80
80
  }
81
81
  },
82
82
  "devDependencies": {
83
- "@swc/core": "^1.3.39",
84
- "@swc/jest": "^0.2.24",
85
- "@tsconfig/node16": "^16.1.0",
86
- "@types/cors": "^2.8.12",
87
- "@types/express": "^4.17.13",
83
+ "@arethetypeswrong/cli": "^0.7.1",
84
+ "@swc/core": "^1.3.78",
85
+ "@swc/jest": "^0.2.29",
86
+ "@tsconfig/node18": "^18.2.1",
87
+ "@types/cors": "^2.8.13",
88
+ "@types/express": "^4.17.17",
88
89
  "@types/has-ansi": "^5.0.0",
89
- "@types/jest": "^29.0.0",
90
+ "@types/jest": "^29.5.4",
90
91
  "@types/mime": "^3.0.1",
91
92
  "@types/node-fetch": "^2.6.4",
92
- "@types/ramda": "^0.29.0",
93
+ "@types/ramda": "^0.29.3",
93
94
  "@types/triple-beam": "^1.3.2",
94
- "@typescript-eslint/eslint-plugin": "^6.0.0",
95
- "@typescript-eslint/parser": "^6.0.0",
95
+ "@typescript-eslint/eslint-plugin": "^6.4.1",
96
+ "@typescript-eslint/parser": "^6.4.1",
96
97
  "chalk": "^4.1.2",
97
98
  "cors": "^2.8.5",
98
- "eslint": "^8.23.0",
99
+ "eslint": "^8.47.0",
99
100
  "eslint-config-airbnb-base": "^15.0.0",
100
101
  "eslint-config-airbnb-typescript": "^17.1.0",
101
102
  "eslint-config-prettier": "^9.0.0",
102
- "eslint-plugin-import": "^2.26.0",
103
+ "eslint-plugin-import": "^2.28.1",
103
104
  "eslint-plugin-prettier": "^5.0.0",
104
- "eslint-plugin-unicorn": "^48.0.0",
105
+ "eslint-plugin-unicorn": "^48.0.1",
105
106
  "express": "^4.18.2",
106
107
  "form-data": "^4.0.0",
107
108
  "has-ansi": "^4.0.1",
108
- "husky": "^8.0.1",
109
- "jest": "^29.0.2",
109
+ "husky": "^8.0.3",
110
+ "jest": "^29.6.4",
110
111
  "make-coverage-badge": "^1.2.0",
111
112
  "mockdate": "^3.0.5",
112
- "node-fetch": "^2.6.11",
113
- "prettier": "3.0.2",
113
+ "prettier": "3.0.3",
114
114
  "strip-ansi": "^6.0.1",
115
115
  "ts-node": "^10.9.1",
116
- "tsd": "^0.28.0",
117
- "tsup": "^7.0.0",
118
- "typescript": "^5.0.2",
119
- "zod": "^3.21.4"
116
+ "tsd": "^0.28.1",
117
+ "tsup": "^7.2.0",
118
+ "typescript": "^5.2.2",
119
+ "winston": "^3.10.0",
120
+ "zod": "^3.22.2"
120
121
  },
121
122
  "engines": {
122
- "node": "^16.14.0 || ^18.0.0 || ^19.0.0 || ^20.1.0"
123
+ "node": "^18.0.0 || ^20.1.0"
123
124
  },
124
125
  "repository": {
125
126
  "type": "git",
package/dist/esm/index.js DELETED
@@ -1,57 +0,0 @@
1
- var Ar=Object.defineProperty;var Ir=(e,t)=>{for(var r in t)Ar(e,r,{get:t[r],enumerable:!0})};var Cr=(e,t,r)=>{if(!t.has(e))throw TypeError("Cannot "+r)};var D=(e,t,r)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,r)};var A=(e,t,r)=>(Cr(e,t,"access private method"),r);var Nt={silent:!0,warn:!0,debug:!0},Nr=e=>e;import{z as L}from"zod";import{createHash as $r}from"crypto";import{HttpError as _r}from"http-errors";import{z as O}from"zod";import{clone as Mr,mergeDeepRight as wr}from"ramda";var R="expressZodApiMeta",Dr=e=>{let t=e.constructor,r=Mr(e._def);return r[R]=r[R]||{examples:[]},new t(r)},Y=e=>{let t=Dr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=Y(t);return o._def[R].examples.push(r),o}}}),t},Mt=e=>R in e._def?typeof e._def[R]=="object"&&e._def[R]!==null:!1;function wt(e,t){if(!Mt(e))return;let r=e._def;return t in r[R]?r[R][t]:void 0}var Se=(e,t)=>{if(!Mt(e))return t;let r=Y(t),o=pe(r._def[R].examples,e._def[R].examples);if(r._def[R].examples=[],o.type==="single")r._def[R].examples=o.value;else for(let[n,s]of o.value)r._def[R].examples.push(wr({...n},{...s}));return r};import zr from"mime";var K=zr.getType("json")||"application/json",ce="multipart/form-data";import{INVALID as vr,OK as jr,ZodIssueCode as Lr,ZodParsedType as kr,ZodType as Ur,addIssueToContext as Hr}from"zod";var Kr="ZodUpload",Fr=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",Oe=class Oe extends Ur{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==kr.object||!Fr(r.data)?(Hr(r,{code:Lr.custom,message:`Expected file upload, received ${r.parsedType}`}),vr):jr(r.data)}};Oe.create=()=>new Oe({typeName:Kr});var J=Oe;var Xe=/:([A-Za-z0-9_]+)/g;function Gr(e){let r=(e.header("content-type")||"").slice(0,ce.length).toLowerCase()===ce;return"files"in e&&r}var be={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Vr=["body","query","params"],et=e=>e.method.toLowerCase();function Dt(e,t){let r=et(e);if(r==="options")return{};let o=Vr;return r in be&&(o=be[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Gr(e):!0).reduce((n,s)=>({...n,...e[s]}),{})}function tt(e){return typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(Nt).includes(e.level)&&typeof e.color=="boolean"}function Re(e){return!isNaN(e.getTime())}function Q(e){return e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`)}function F(e){return e instanceof O.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof _?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message}function rt(e){return e instanceof _r?e.statusCode:e instanceof v?400:500}var $=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=wt(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},pe=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}};function ot(e){let t=e.match(Xe);return t?t.map(r=>r.slice(1)):[]}var le=e=>e.reduce((t,r)=>t||r,!1);function z(e){return e instanceof O.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof O.ZodUnion?le(e.options.map(z)):e instanceof O.ZodIntersection?le([e._def.left,e._def.right].map(z)):!1}function I(e){return e instanceof J?!0:e instanceof O.ZodObject?le(Object.values(e.shape).map(I)):e instanceof O.ZodUnion?le(e.options.map(I)):e instanceof O.ZodIntersection?le([e._def.left,e._def.right].map(I)):e instanceof O.ZodOptional||e instanceof O.ZodNullable?I(e.unwrap()):e instanceof O.ZodEffects||e instanceof O.ZodTransformer?I(e._def.schema):e instanceof O.ZodRecord?I(e._def.valueType):e instanceof O.ZodArray?I(e._def.type):e instanceof O.ZodDefault?I(e._def.innerType):!1}var me=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,C=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Pe=e=>$r("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ze=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},nt=e=>typeof e=="string"?{message:e}:e||{};var W=class extends Error{constructor(){super(...arguments);this.name="RoutingError"}},ue=class extends W{constructor(){super(...arguments);this.name="DependsOnMethodError"}},Z=class extends Error{constructor({message:r,method:o,path:n,isResponse:s}){let a=`${r}
2
- Caused by ${s?"response":"input"} schema of an Endpoint assigned to ${o.toUpperCase()} method of ${n} path.`;super(a);this.name="DocumentationError"}},j=class extends Error{constructor(){super(...arguments);this.name="IOSchemaError"}},_=class extends j{constructor(r){super(F(r));this.name="OutputValidationError";this.originalError=r}},v=class extends j{constructor(r){super(F(r));this.name="InputValidationError";this.originalError=r}},X=class extends Error{constructor(r,o){super(r);this.name="ResultHandlerError";this.originalError=o||void 0}};var N=e=>typeof e=="object"&&e!==null,Ee=e=>({and:e.reduce((t,r)=>t.concat(N(r)&&"and"in r?r.and:r),[])}),Ae=(e,t)=>{if(N(e)){if("and"in e)return{and:e.and.map(r=>N(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>N(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},st=e=>e.and.reduce((t,r)=>{let o=pe(t.or,N(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(Ee),t},{or:[]}),ee=(e,t)=>{if(N(e)){if("and"in e){if(N(t)){if("and"in t)return Ee([e,t]);if("or"in t)return ee(st(e),t)}return Ee([e,t])}if("or"in e){if(N(t)){if("and"in t)return ee(t,e);if("or"in t){let r=pe(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(Ee)}}}return ee(e,{and:[t]})}}return N(t)&&("and"in t||"or"in t)?ee(t,e):{and:[e,t]}};import{z as te}from"zod";var re={positive:200,negative:400},zt=e=>e,oe=zt({getPositiveResponse:e=>{let t=$({schema:e}),r=Y(te.object({status:te.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>Y(te.object({status:te.literal("error"),error:te.object({message:te.string()})})).example({status:"error",error:{message:F(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(re.positive).json({status:"success",data:r});return}let a=rt(e);a===500&&s.error(`Internal server error
3
- ${e.stack}
4
- `,{url:o.url,payload:t}),n.status(a).json({status:"error",error:{message:F(e)}})}}),Ie=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
- Original error: ${e.originalError.message}.`:""))};var vt=(e,t=[K])=>{if(e instanceof L.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},ne=class{},Ne,jt,Me,Lt,we,kt,De,Ut,ze,Ht,Ce=class extends ne{constructor({middlewares:r,inputSchema:o,outputSchema:n,handler:s,resultHandler:a,description:d,shortDescription:c,...p}){super();D(this,Ne);D(this,Me);D(this,we);D(this,De);D(this,ze);this.methods=[];this.siblingMethods=[];this.middlewares=[];this.scopes=[];this.tags=[];[{name:"input schema",schema:o},{name:"output schema",schema:n}].forEach(({name:f,schema:x})=>{if(z(x))throw new j(`Using transformations on the top level of endpoint ${f} is not allowed.`)}),this.middlewares=r;let l={positive:a.getPositiveResponse(n),negative:a.getNegativeResponse()};this.mimeTypes={input:I(o)?[ce]:[K],positive:vt(l.positive),negative:vt(l.negative)},this.schemas={input:o,output:n,positive:l.positive instanceof L.ZodType?l.positive:l.positive.schema,negative:l.negative instanceof L.ZodType?l.negative:l.negative.schema},this.statusCodes={positive:l.positive instanceof L.ZodType?re.positive:l.positive.statusCode||re.positive,negative:l.negative instanceof L.ZodType?re.negative:l.negative.statusCode||re.negative},this.handler=s,this.resultHandler=a,this.descriptions={long:d,short:c},"scopes"in p&&p.scopes&&this.scopes.push(...p.scopes),"scope"in p&&p.scope&&this.scopes.push(p.scope),"tags"in p&&p.tags&&this.tags.push(...p.tags),"tag"in p&&p.tag&&this.tags.push(p.tag),"methods"in p?this.methods=p.methods:this.methods=[p.method]}_setSiblingMethods(r){this.siblingMethods=r}getDescription(r){return this.descriptions[r]}getMethods(){return this.methods}getSchema(r){return this.schemas[r]}getMimeTypes(r){return this.mimeTypes[r]}getStatusCode(r){return this.statusCodes[r]}getSecurity(){return this.middlewares.reduce((r,o)=>o.security?ee(r,o.security):r,{and:[]})}getScopes(){return this.scopes}getTags(){return this.tags}async execute({request:r,response:o,logger:n,config:s}){let a=et(r),d,c=null;if(s.cors){let l=A(this,Ne,jt).call(this);typeof s.cors=="function"&&(l=await s.cors({request:r,logger:n,endpoint:this,defaultHeaders:l}));for(let f in l)o.set(f,l[f])}let p=Dt(r,s.inputSources);try{let{options:l,isStreamClosed:f}=await A(this,we,kt).call(this,{method:a,input:p,request:r,response:o,logger:n});if(f)return;if(a==="options"){o.status(200).end();return}d=await A(this,Me,Lt).call(this,await A(this,De,Ut).call(this,{input:p,options:l,logger:n}))}catch(l){c=Q(l)}await A(this,ze,Ht).call(this,{input:p,output:d,request:r,response:o,error:c,logger:n})}};Ne=new WeakSet,jt=function(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.methods.concat(this.siblingMethods).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}},Me=new WeakSet,Lt=async function(r){try{return await this.schemas.output.parseAsync(r)}catch(o){throw o instanceof L.ZodError?new _(o):o}},we=new WeakSet,kt=async function({method:r,input:o,request:n,response:s,logger:a}){let d={},c=!1;for(let p of this.middlewares){if(r==="options"&&p.type==="proprietary")continue;let l;try{l=await p.input.parseAsync(o)}catch(f){throw f instanceof L.ZodError?new v(f):f}if(Object.assign(d,await p.middleware({input:l,options:d,request:n,response:s,logger:a})),c="writableEnded"in s&&s.writableEnded,c){a.warn(`The middleware ${p.middleware.name} has closed the stream. Accumulated options:`,d);break}}return{options:d,isStreamClosed:c}},De=new WeakSet,Ut=async function({input:r,options:o,logger:n}){let s;try{s=await this.schemas.input.parseAsync(r)}catch(a){throw a instanceof L.ZodError?new v(a):a}return this.handler({input:s,options:o,logger:n})},ze=new WeakSet,Ht=async function({error:r,request:o,response:n,logger:s,input:a,output:d}){try{await this.resultHandler.handler({error:r,output:d,request:o,response:n,logger:s,input:a})}catch(c){Ie({logger:s,response:n,error:new X(Q(c).message,r)})}};var Kt=["get","post","put","delete","patch"];import{z as $t}from"zod";var Ft=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Se(s,n),o)};var it=e=>{if(z(e.input))throw new j("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var se,ve,G=class G{constructor(t){this.middlewares=[];this.use=this.addExpressMiddleware;this.resultHandler="resultHandler"in t?t.resultHandler:t}addMiddleware(t){var r;return A(r=G,se,ve).call(r,this.middlewares.concat(t),this.resultHandler)}addExpressMiddleware(t,r){var a;let o=r?.transformer||(d=>d),n=r?.provider||(()=>({})),s={type:"express",input:$t.object({}),middleware:async({request:d,response:c})=>new Promise((p,l)=>{t(d,c,x=>{if(x&&x instanceof Error)return l(o(x));p(n(d,c))})})};return A(a=G,se,ve).call(a,this.middlewares.concat(s),this.resultHandler)}addOptions(t){var r;return A(r=G,se,ve).call(r,this.middlewares.concat(it({input:$t.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new Ce({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:Ft(s,t),...n})}};se=new WeakSet,ve=function(t,r){let o=new G(r);return o.middlewares=t,o},D(G,se);var je=G,qr=new je(oe);import{inspect as Br}from"util";import{LEVEL as Yr,MESSAGE as Jr,SPLAT as Qr}from"triple-beam";import Le from"winston";var{combine:Wr,colorize:Xr,timestamp:eo,printf:to}=Le.format;function ke(e){let t=s=>{let{[Yr]:a,[Jr]:d,[Qr]:c,...p}=s;return Br(p,!1,1,e.color)},r=s=>to(({timestamp:a,message:d,level:c,durationMs:p,...l})=>(typeof d=="object"&&(l={...l,...d},d="[No message]"),`${a} ${c}: ${d}`+(p===void 0?"":` duration: ${p}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[eo()],n={handleExceptions:!0};switch(e.color&&o.push(Xr()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=Wr(...o),Le.createLogger({silent:e.level==="silent",levels:Le.config.npm.levels,transports:[new Le.transports.Console(n)],exitOnError:!1})}var fe=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new ue(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
6
- This error should prevent mistakes during the development process.
7
- Example:
8
-
9
- new ${this.constructor.name}({
10
- ${r}: endpointsFactory.build({
11
- methods: ['${r}', `+((t[r]?.getMethods()||[]).map(n=>`'${n}'`).join(", ")||"...")+`]
12
- // or method: '${r}'
13
- ...
14
- })
15
- });
16
- `)})}};import ro from"express";var ye=class{constructor(...t){this.params=t}apply(t,r){return r(t,ro.static(...this.params))}};var V=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new W(`Routing elements should not contain '/' character.
17
- The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let d=`${o||""}${s?`/${s}`:""}`;if(a instanceof ne){let c=a.getMethods().slice();n&&c.push("options"),c.forEach(p=>{t(a,d,p)})}else if(a instanceof ye)r&&a.apply(d,r);else if(a instanceof fe){if(Object.entries(a.methods).forEach(([c,p])=>{t(p,d,c)}),n&&Object.keys(a.methods).length>0){let[c,...p]=Object.keys(a.methods),l=a.methods[c];l._setSiblingMethods(p),t(l,d,"options")}}else V({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:d})})};var _t=()=>`
18
- \x1B[94m\x1B[39m
19
- \x1B[94m\x1B[39m
20
- \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
21
- \x1B[94m888 d88P 888 d88888 888 Y88b 888\x1B[39m\x1B[95m\x1B[39m
22
- \x1B[95m888 d88P 888 d88P888 888 888 888\x1B[39m
23
- \x1B[95m8888888 888 888 88888b. 888d888 .d88b. .d8888b .d8888b d88P .d88b. .d88888 d88P 888 888 d88P 888\x1B[39m\x1B[97m\x1B[39m
24
- \x1B[97m888 \`Y8bd8P' 888 "88b 888P" d8P Y8b 88K 88K d88P d88""88b d88" 888 d88P 888 8888888P" 888 \x1B[39m
25
- \x1B[97m888 X88K 888 888 888 88888888 "Y8888b. "Y8888b. d88P 888 888 888 888 d88P 888 888 888\x1B[39m\x1B[95m\x1B[39m
26
- \x1B[95m888 .d8""8b. 888 d88P 888 Y8b. X88 X88 d88P Y88..88P Y88b 888 d8888888888 888 888 \x1B[39m
27
- \x1B[95m8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P' d8888888888 "Y88P" "Y88888 d88P 888 888 8888888\x1B[39m\x1B[94m\x1B[39m
28
- \x1B[94m 888\x1B[39m
29
- \x1B[94m 888\x1B[3m Proudly supports transgender community.\x1B[23m\x1B[39m
30
- \x1B[94m\x1B[3mfor trans sisters \x1B[23m888\x1B[3m Start your API server with I/O schema validation and custom middlewares in minutes.\x1B[23m\x1B[39m\x1B[90m\x1B[39m
31
- \x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
32
- \x1B[0m\x1B[0m
33
- \x1B[0m\x1B[0m
34
- `.trim();var at=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(_t()),V({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(d,c)=>{t.info(`${d.method}: ${s}`),await n.execute({request:d,response:c,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};import oo,{json as no}from"express";import so from"compression";import io from"express-fileupload";import ao from"https";import Gt from"http-errors";var po=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:Gt(400,Q(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Vt=(e,t)=>(r,o)=>{let n=Gt(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Ie({response:o,logger:t,error:new X(Q(s).message,n)})}};function co(e,t){let r=tt(e.logger)?ke(e.logger):e.logger;at({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||oe;return{notFoundHandler:Vt(o,r),logger:r}}function lo(e,t){let r=tt(e.logger)?ke(e.logger):e.logger,o=oo();o.disable("x-powered-by");let n=e.errorHandler||oe,s=e.server.compression?so({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||no(),d=e.server.upload?io({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,c=[].concat(s||[]).concat(a).concat(d||[]);o.use(c),o.use(po(n,r)),at({app:o,routing:t,logger:r,config:e}),o.use(Vt(n,r));let p=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=ao.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:p,httpsServer:l,logger:r}}import{OpenApiBuilder as Wo}from"openapi3-ts/oas30";import{isReferenceObject as Qt,isSchemaObject as xe}from"openapi3-ts/oas30";import{omit as he}from"ramda";import{z as T}from"zod";import{INVALID as qt,ZodIssueCode as dt,ZodParsedType as Bt,ZodType as mo,addIssueToContext as pt}from"zod";var ct=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,uo="ZodDateIn",He=class He extends mo{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==Bt.string)return pt(o,{code:dt.invalid_type,expected:Bt.string,received:o.parsedType}),qt;ct.test(o.data)||(pt(o,{code:dt.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Re(n)?{status:r.value,value:n}:(pt(o,{code:dt.invalid_date}),qt)}};He.create=()=>new He({typeName:uo});var Ue=He;var q=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,d=s?s({schema:e,...n,next:p=>q({...p,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),c=t&&t({schema:e,prev:d,...n});return c?{...d,...c}:d};var Yt=50,Wt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",fo={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Xt=e=>e.replace(Xe,t=>`{${t.slice(1)}}`),yo=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),go=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),ho=()=>({format:"any"}),xo=e=>{if(e.isResponse)throw new Z({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},To=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new Z({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},So=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Oo=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),bo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Ro=({schema:e,next:t})=>t({schema:e.unwrap()}),Po=({schema:e,next:t})=>t({schema:e._def.innerType}),Zo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Jt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),Eo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),Ao=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&me(s)?s instanceof T.ZodOptional:s.isOptional())});return{type:"object",properties:Ke({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},Io=()=>({type:"string",nullable:!0,format:"null"}),Co=e=>{if(e.isResponse)throw new Z({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:ct.source,externalDocs:{url:Wt}}},No=e=>{if(!e.isResponse)throw new Z({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Wt}}},Mo=e=>{throw new Z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},wo=()=>({type:"boolean"}),Do=()=>({type:"integer",format:"bigint"}),zo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof T.ZodEnum||e instanceof T.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ke({schema:T.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.ZodLiteral)return{type:"object",properties:Ke({schema:T.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof T.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ke({schema:T.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},vo=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),jo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${xe(o)?o.type:o.$ref}`).join(", ")}}}},Lo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:c,isEmoji:p,isDatetime:l,_def:{checks:f}}})=>{let x=f.find(h=>h.kind==="regex"),g=f.find(h=>h.kind==="datetime"),S=x?x.regex:g?g.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...d&&{format:"ulid"},...c&&{format:"ip"},...p&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...S&&{pattern:`/${S.source}/${S.flags}`}}},ko=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ke=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Uo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return fo?.[t]},Ho=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&xe(o)){let s=Ze({effect:n,sample:Uo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:T.any()})}if(!t&&n.type==="preprocess"&&xe(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Ko=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Fo=({schema:e,next:t})=>t({schema:e.unwrap()}),$o=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},er=(e,t,r=[])=>{let o=$({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:he(r,s)}}),{})}},_o=(e,t,r)=>{let o=$({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function ge(e,t){if(e instanceof T.ZodObject)return e;let r;if(e instanceof T.ZodUnion||e instanceof T.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>ge(o,t)).reduce((o,n)=>o.merge(n.partial()),T.object({}));else if(e instanceof T.ZodEffects){if(z(e))throw new Z({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=ge(e._def.schema,t)}else r=ge(e._def.left,t).merge(ge(e._def.right,t));return Se(e,r)}var tr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="parameter"})=>{let p=r.getSchema("input"),l=ge(p,{path:e,method:t,isResponse:!1}).shape,f=ot(e),x=o.includes("query"),g=o.includes("params"),S=h=>g&&f.includes(h);return Object.keys(l).filter(h=>x||S(h)).map(h=>{let b=q({schema:l[h],isResponse:!1,rules:mt,onEach:ut,onMissing:ft,serializer:n,getRef:s,makeRef:a,path:e,method:t}),y=d==="components"?a(C(e,t,`${c} ${h}`),b):b;return{name:h,in:S(h)?"path":"query",required:!l[h].isOptional(),description:xe(b)&&b.description||`${t.toUpperCase()} ${e} ${c}`,schema:y,..._o(p,!1,h)}})},mt={ZodString:Lo,ZodNumber:ko,ZodBigInt:Do,ZodBoolean:wo,ZodDateIn:Co,ZodDateOut:No,ZodNull:Io,ZodArray:vo,ZodTuple:jo,ZodRecord:zo,ZodObject:Ao,ZodLiteral:Eo,ZodIntersection:bo,ZodUnion:So,ZodFile:To,ZodUpload:xo,ZodAny:ho,ZodDefault:yo,ZodEnum:Jt,ZodNativeEnum:Jt,ZodEffects:Ho,ZodOptional:Ro,ZodNullable:Zo,ZodDiscriminatedUnion:Oo,ZodBranded:Fo,ZodDate:Mo,ZodCatch:go,ZodPipeline:Ko,ZodLazy:$o,ZodReadonly:Po},ut=({schema:e,isResponse:t,prev:r})=>{if(Qt(r))return{};let{description:o}=e,n=e instanceof T.ZodLazy,s=r.type!==void 0,a=t&&me(e),d=!n&&s&&!a&&e.isNullable(),c=n?[]:$({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...c.length>0&&{example:c[0]}}},ft=({schema:e,...t})=>{throw new Z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},lt=(e,t)=>{if(Qt(e))return e;let r=e.properties?he(t,e.properties):void 0,o=e.example?he(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>lt(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>lt(d,t)):void 0;return he(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},d])=>d===void 0).map(([d])=>d),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},rr=e=>xe(e)?he(["example"],e):e,yt=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="response"})=>{let p=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),f=rr(q({schema:p,isResponse:!0,rules:mt,onEach:ut,onMissing:ft,serializer:n,getRef:s,makeRef:a,path:t,method:e})),x=er(p,!0),g=d==="components"?a(C(t,e,c),f):f;return{description:`${e.toUpperCase()} ${t} ${c}`,content:l.reduce((S,h)=>({...S,[h]:{schema:g,...x}}),{})}},Go=()=>({type:"http",scheme:"basic"}),Vo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),qo=({name:e})=>({type:"apiKey",in:"query",name:e}),Bo=({name:e})=>({type:"apiKey",in:"header",name:e}),Yo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Jo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Qo=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),or=e=>{let t={basic:Go,bearer:Vo,input:qo,header:Bo,cookie:Yo,openid:Jo,oauth2:Qo};return Ae(e,r=>t[r.type](r))},Fe=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Fe(st(e))}return Fe({or:[e]})},nr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let c=ot(t),p=rr(lt(q({schema:r.getSchema("input"),isResponse:!1,rules:mt,onEach:ut,onMissing:ft,serializer:o,getRef:n,makeRef:s,path:t,method:e}),c)),l=er(r.getSchema("input"),!1,c),f=a==="components"?s(C(t,e,d),p):p;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((x,g)=>({...x,[g]:{schema:f,...l}}),{})}},sr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),gt=e=>e.length<=Yt?e:e.slice(0,Yt-1)+"\u2026";var ht=class extends Wo{constructor({routing:r,config:o,title:n,version:s,serverUrl:a,successfulResponseDescription:d="Successful response",errorResponseDescription:c="Error response",hasSummaryFromDescription:p=!0,composition:l="inline",serializer:f=Pe}){super();this.lastSecuritySchemaIds={};this.lastOperationIdSuffixes={};this.addInfo({title:n,version:s}).addServer({url:a}),V({routing:r,onEndpoint:(g,S,h)=>{let b=h,y={path:S,method:b,endpoint:g,composition:l,serializer:f,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[E,w]=["short","long"].map(g.getDescription.bind(g)),ae=o.inputSources?.[b]||be[b],de=tr({...y,inputSources:ae}),P={operationId:this.ensureUniqOperationId(S,b),responses:{[g.getStatusCode("positive")]:yt({...y,clue:d,isPositive:!0}),[g.getStatusCode("negative")]:yt({...y,clue:c,isPositive:!1})}};w&&(P.description=w,p&&E===void 0&&(P.summary=gt(w))),E&&(P.summary=gt(E)),g.getTags().length>0&&(P.tags=g.getTags()),de.length>0&&(P.parameters=de),ae.includes("body")&&(P.requestBody=nr(y));let Te=Fe(Ae(or(g.getSecurity()),We=>{let Ct=this.ensureUniqSecuritySchemaName(We),Er=["oauth2","openIdConnect"].includes(We.type)?g.getScopes():[];return this.addSecurityScheme(Ct,We),{name:Ct,scopes:Er}}));Te.length>0&&(P.security=Te);let Qe=Xt(S);this.addPath(Qe,{[b]:P})}}),this.rootDoc.tags=o.tags?sr(o.tags):[]}makeRef(r,o){return this.addSchema(r,o),this.getRef(r)}getRef(r){return r in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${r}`}:void 0}ensureUniqOperationId(r,o){let n=C(r,o);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(r){let o=JSON.stringify(r);for(let n in this.rootDoc.components?.securitySchemes||{})if(o===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;return this.lastSecuritySchemaIds[r.type]=(this.lastSecuritySchemaIds?.[r.type]||0)+1,`${r.type.toUpperCase()}_${this.lastSecuritySchemaIds[r.type]}`}};import ir from"http";var Xo=e=>({method:"GET",header:jest.fn(()=>K),...e}),en=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:ir.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=ir.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},tn=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=Xo(t),d=en(r),c={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},p={cors:!1,logger:c,...o};return await e.execute({request:a,response:d,config:p,logger:c}),{requestMock:a,responseMock:d,loggerMock:c}};import H from"typescript";import M from"typescript";var i=M.factory,B=[i.createModifier(M.SyntaxKind.ExportKeyword)],rn=[i.createModifier(M.SyntaxKind.AsyncKeyword)],on=[i.createModifier(M.SyntaxKind.PublicKeyword),i.createModifier(M.SyntaxKind.ReadonlyKeyword)],ar=[i.createModifier(M.SyntaxKind.ProtectedKeyword),i.createModifier(M.SyntaxKind.ReadonlyKeyword)],nn=i.createTemplateHead(""),sn=i.createTemplateTail(""),an=i.createTemplateMiddle(" "),xt=e=>i.createTemplateLiteralType(nn,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?sn:an))),Tt=xt(["M","P"]),$e=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t),_e=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat($e(o,e[o],t)),[]),St=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),dr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),Ot=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),bt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],M.NodeFlags.Const),Rt=(e,t)=>i.createTypeAliasDeclaration(B,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Ge=(e,t)=>i.createTypeAliasDeclaration(B,e,void 0,t),pr=(e,t,r)=>i.createPropertyDeclaration(on,e,void 0,t,r),cr=(e,t,r=[])=>i.createClassDeclaration(B,e,void 0,void 0,[t,...r]),lr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),mr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(M.SyntaxKind.AnyKeyword)]),Pt=(e,t,r)=>i.createInterfaceDeclaration(B,e,void 0,t,r),ur=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),fr=(e,t)=>i.createArrowFunction(rn,void 0,e.map(r=>$e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Zt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,_e({acc:void 0,key:void 0}),void 0,void 0,t),r]);import u from"typescript";import{z as pn}from"zod";import k from"typescript";var{factory:Ve}=k,Et=(e,t)=>{k.addSyntheticLeadingComment(e,k.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},qe=(e,t,r)=>{let o=Ve.createTypeAliasDeclaration(void 0,Ve.createIdentifier(t),void 0,e);return r&&Et(o,r),o},yr=(e,t)=>{let r=k.createSourceFile("print.ts","",k.ScriptTarget.Latest,!1,k.ScriptKind.TS);return k.createPrinter(t).printNode(k.EmitHint.Unspecified,e,r)},dn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,gr=e=>dn.test(e)?Ve.createIdentifier(e):Ve.createStringLiteral(e);var{factory:m}=u,cn={[u.SyntaxKind.AnyKeyword]:"",[u.SyntaxKind.BigIntKeyword]:BigInt(0),[u.SyntaxKind.BooleanKeyword]:!1,[u.SyntaxKind.NumberKeyword]:0,[u.SyntaxKind.ObjectKeyword]:{},[u.SyntaxKind.StringKeyword]:"",[u.SyntaxKind.UndefinedKeyword]:void 0},ln=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),mn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&me(a)?a instanceof pn.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,gr(s),d&&o?m.createToken(u.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Et(c,a.description),c});return m.createTypeLiteralNode(n)},un=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),fn=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),hr=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),yn=e=>cn?.[e.kind],gn=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ze({effect:n,sample:yn(o)}),a={number:u.SyntaxKind.NumberKeyword,bigint:u.SyntaxKind.BigIntKeyword,boolean:u.SyntaxKind.BooleanKeyword,string:u.SyntaxKind.StringKeyword,undefined:u.SyntaxKind.UndefinedKeyword,object:u.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||u.SyntaxKind.AnyKeyword)}return o},hn=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),xn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.SyntaxKind.UndefinedKeyword)]):o},Tn=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),Sn=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),On=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),bn=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Rn=({next:e,schema:t})=>e({schema:t._def.innerType}),U=e=>()=>m.createKeywordTypeNode(e),Pn=({next:e,schema:t})=>e({schema:t.unwrap()}),Zn=({next:e,schema:t})=>e({schema:t._def.innerType}),En=({next:e,schema:t})=>e({schema:t._def.innerType}),An=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),In=()=>m.createLiteralTypeNode(m.createNull()),Cn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,m.createLiteralTypeNode(m.createNull())),t(s,r({schema:n.schema}))))()},Nn={ZodString:U(u.SyntaxKind.StringKeyword),ZodNumber:U(u.SyntaxKind.NumberKeyword),ZodBigInt:U(u.SyntaxKind.BigIntKeyword),ZodBoolean:U(u.SyntaxKind.BooleanKeyword),ZodDateIn:U(u.SyntaxKind.StringKeyword),ZodDateOut:U(u.SyntaxKind.StringKeyword),ZodNull:In,ZodArray:un,ZodTuple:Sn,ZodRecord:On,ZodObject:mn,ZodLiteral:ln,ZodIntersection:bn,ZodUnion:hr,ZodFile:U(u.SyntaxKind.StringKeyword),ZodAny:U(u.SyntaxKind.AnyKeyword),ZodDefault:Rn,ZodEnum:fn,ZodNativeEnum:hn,ZodEffects:gn,ZodOptional:xn,ZodNullable:Tn,ZodDiscriminatedUnion:hr,ZodBranded:Pn,ZodCatch:En,ZodPipeline:An,ZodLazy:Cn,ZodReadonly:Zn},At=({schema:e,...t})=>q({schema:e,rules:Nn,onMissing:()=>m.createKeywordTypeNode(u.SyntaxKind.AnyKeyword),...t});var It=class{constructor({routing:t,variant:r="client",serializer:o=Pe,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){this.agg=[];this.registry={};this.paths=[];this.aliases={};V({routing:t,onEndpoint:(y,E,w)=>{let ae=C(E,w,"input"),de=C(E,w,"response"),P={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Te=At({...P,schema:y.getSchema("input"),isResponse:!1}),Qe=At({...P,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(qe(Te,ae),qe(Qe,de)),w!=="options"&&(this.paths.push(E),this.registry[`${w} ${E}`]={in:ae,out:de,isJson:y.getMimeTypes("positive").includes(K),tags:y.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Rt("Path",this.paths),a=Rt("Method",Kt),d=Ge("MethodPath",xt([a.name,s.name])),c=[i.createHeritageClause(H.SyntaxKind.ExtendsKeyword,[St(d.name,H.SyntaxKind.AnyKeyword)])],p=Pt("Input",c,Object.keys(this.registry).map(y=>Ot(y,this.registry[y].in))),l=Pt("Response",c,Object.keys(this.registry).map(y=>Ot(y,this.registry[y].out)));if(this.agg.push(s,a,d,p,l),r==="types")return;let f=i.createVariableStatement(B,bt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),x=i.createVariableStatement(B,bt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(y=>i.createPropertyAssignment(`"${y}"`,i.createArrayLiteralExpression(this.registry[y].tags.map(E=>i.createStringLiteral(E)))))))),g=Ge("Provider",i.createFunctionTypeNode(ur({M:a.name,P:s.name}),_e({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(p.name),Tt)}),lr(l.name,Tt))),S=Ge("Implementation",i.createFunctionTypeNode(void 0,_e({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(H.SyntaxKind.StringKeyword),params:St(H.SyntaxKind.StringKeyword,H.SyntaxKind.AnyKeyword)}),mr())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),b=cr("ExpressZodAPIClient",dr([$e("implementation",i.createTypeReferenceNode(S.name),ar)]),[pr("provide",i.createTypeReferenceNode(g.name),fr(["method","path","params"],[i.createIdentifier("method"),Zt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Zt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),H.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment("[key]",i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);H.addSyntheticLeadingComment(b,H.SyntaxKind.MultiLineCommentTrivia,`
35
- export const exampleImplementation: Implementation = async (
36
- method,
37
- path,
38
- params
39
- ) => {
40
- const hasBody = !["get", "delete"].includes(method);
41
- const searchParams = hasBody ? "" : \`?\${new URLSearchParams(params)}\`;
42
- const response = await fetch(\`https://example.com\${path}\${searchParams}\`, {
43
- method: method.toUpperCase(),
44
- headers: hasBody ? { "Content-Type": "application/json" } : undefined,
45
- body: hasBody ? JSON.stringify(params) : undefined,
46
- });
47
- if (\`\${method} \${path}\` in jsonEndpoints) {
48
- return response.json();
49
- }
50
- return response.text();
51
- };
52
-
53
- const client = new ExpressZodAPIClient(exampleImplementation);
54
- client.provide("get", "/v1/user/retrieve", { id: "10" });
55
- `,!0),this.agg.push(f,x,g,S,b)}getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=qe(r,t),this.getAlias(t)}print(t){return this.agg.map(r=>yr(r,t)).join(`
56
-
57
- `)}};var Zr={};Ir(Zr,{dateIn:()=>Un,dateOut:()=>Hn,file:()=>Ln,upload:()=>kn});import{INVALID as xr,ZodIssueCode as Tr,ZodParsedType as Sr,ZodType as Mn,addIssueToContext as Or}from"zod";var wn="ZodDateOut",Ye=class Ye extends Mn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==Sr.date?(Or(o,{code:Tr.invalid_type,expected:Sr.date,received:o.parsedType}),xr):Re(o.data)?{status:r.value,value:o.data.toISOString()}:(Or(o,{code:Tr.invalid_date}),xr)}};Ye.create=()=>new Ye({typeName:wn});var Be=Ye;import{INVALID as Dn,ZodIssueCode as br,ZodParsedType as Rr,ZodType as zn,addIssueToContext as Pr}from"zod";var vn="ZodFile",jn=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,ie=class ie extends zn{constructor(){super(...arguments);this.binary=r=>new ie({...this._def,checks:[...this._def.checks,{kind:"binary",...nt(r)}]});this.base64=r=>new ie({...this._def,checks:[...this._def.checks,{kind:"base64",...nt(r)}]})}_parse(r){let{status:o,ctx:n}=this._processInputParams(r);if(n.parsedType!==Rr.string)return Pr(n,{code:br.invalid_type,expected:Rr.string,received:n.parsedType}),Dn;for(let s of this._def.checks)s.kind==="base64"&&(jn.test(n.data)||(Pr(n,{code:br.custom,message:s.message}),o.dirty()));return{status:o.value,value:n.data}}get isBinary(){return!!this._def.checks.find(r=>r.kind==="binary")}get isBase64(){return!!this._def.checks.find(r=>r.kind==="base64")}};ie.create=()=>new ie({checks:[],typeName:vn});var Je=ie;var Ln=Je.create,kn=J.create,Un=Ue.create,Hn=Be.create;import yd from"http-errors";export{ne as AbstractEndpoint,fe as DependsOnMethod,ue as DependsOnMethodError,ht as Documentation,Z as DocumentationError,je as EndpointsFactory,v as InputValidationError,It as Integration,_ as OutputValidationError,W as RoutingError,ye as ServeStatic,co as attachRouting,Nr as createConfig,yd as createHttpError,ke as createLogger,it as createMiddleware,zt as createResultHandler,lo as createServer,qr as defaultEndpointsFactory,oe as defaultResultHandler,Zr as ez,$ as getExamples,F as getMessageFromError,rt as getStatusCodeFromError,tn as testEndpoint,Y as withMeta};
@@ -1 +0,0 @@
1
- {"type":"module","version":"11.6.0"}