express-zod-api 15.1.0 → 16.0.0-beta1

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,7 +1,51 @@
1
1
  # Changelog
2
2
 
3
+ ## Version 16
4
+
5
+ ### 16.0.0
6
+
7
+ - Potentially breaking changes:
8
+ - Some methods and properties of the `Documentation` class (which extends the OpenAPI builder) might be changed.
9
+ - Features:
10
+ - Switching to [OpenAPI 3.1](https://swagger.io/specification/) for generating better Documentation for your API.
11
+ - Consider [the new UI](https://editor-next.swagger.io/) for exploring the produced documentation.
12
+ - Ability to generate formatted typescript client using the new async method `printFormatted` of the `Integration`
13
+ class when the `prettier` package is installed (detects automatically).
14
+ - Ability to supply your own typescript formatting function into that new method.
15
+ - How to migrate:
16
+ - If you do not modify the generated documentation and only using its `getSpecAsYaml` or `getSpecAsJson` methods:
17
+ - No action required.
18
+ - If you're using any properties or other methods of the `Documentation` class:
19
+ - Please refer to the [specification](https://swagger.io/specification/) and the
20
+ [OpenAPI migration guide](https://www.openapis.org/blog/2021/02/16/migrating-from-openapi-3-0-to-3-1-0) in order
21
+ to adjust your implementation accordingly.
22
+
23
+ ```ts
24
+ import { Integration } from "express-zod-api";
25
+ // unformatted:
26
+ new Integration(/*...*/).print();
27
+ // featuring, detects prettier automatically:
28
+ await new Integration(/*...*/).printFormatted();
29
+ ```
30
+
3
31
  ## Version 15
4
32
 
33
+ ### 15.2.0
34
+
35
+ - Supporting Node 20 starting from version 20.0.0 (previously it was 20.1.0).
36
+ - Debug message informing on the package build version on startup.
37
+ - It will also tell you whether a CJS or ESM build is running.
38
+ - Improved words recognition for automatically generated identifiers in `Integration` and `Documentation`.
39
+ - Thanks to [@shawncarr](https://github.com/shawncarr) for the contribution.
40
+
41
+ ```yaml
42
+ method: GET
43
+ path: /companies/:companyId/users/:userId
44
+ operationId:
45
+ before: GetCompaniesCompanyidUsersUserid
46
+ after: GetCompaniesCompanyIdUsersUserId
47
+ ```
48
+
5
49
  ### 15.1.0
6
50
 
7
51
  - The distribution becomes ESM first, while remaining dual (CJS support remains).
@@ -60,7 +60,7 @@ representative at an online or offline event.
60
60
 
61
61
  Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
62
  reported to the community leaders responsible for enforcement by
63
- [email](https://github.com/RobinTail/express-zod-api/blob/master/package.json#L116).
63
+ [email](https://github.com/RobinTail/express-zod-api/blob/master/package.json#L14).
64
64
  All complaints will be reviewed and investigated promptly and fairly.
65
65
 
66
66
  All community leaders are obligated to respect the privacy and security of the
@@ -0,0 +1,35 @@
1
+ ## Contributing guidelines
2
+
3
+ Please be aware of the [Code of conduct](CODE_OF_CONDUCT.md).
4
+
5
+ ### You have a question or idea
6
+
7
+ Your feedback is highly appreciated in [Discussions section](https://github.com/RobinTail/express-zod-api/discussions).
8
+
9
+ ### You found a bug
10
+
11
+ Please [create a bug issue](https://github.com/RobinTail/express-zod-api/issues/new/choose).
12
+
13
+ ### You found a vulnerability or other security issue
14
+
15
+ Please refer to [Security policy](SECURITY.md).
16
+
17
+ ### You wanna make it yourself
18
+
19
+ Which is highly appreciated as well. Consider these steps:
20
+
21
+ - Fork the repo,
22
+ - Create a new branch in your fork of the repo (don't change `master`),
23
+ - Install the dependencies using `yarn`,
24
+ - Install the pre-commit hooks using `yarn install_hooks`,
25
+ - Make changes,
26
+ - Run the tests using `yarn test`,
27
+ - In case you wanna run integration tests, run `yarn build` first.
28
+ - Commit everything,
29
+ - Push your branch into your fork,
30
+ - Create a PR between the forks:
31
+ - Make sure to allow edits by maintainer,
32
+ - Describe the changes (why those changes are required?):
33
+ - If you're fixing something, please create the bug issue first and make a reference "Fixes #...";
34
+ - If you're improving something, please make sure your solution is generic.
35
+ - If I didn't notice your PR in a week, please mention me in a comment to your PR.
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  ![logo](https://raw.githubusercontent.com/RobinTail/express-zod-api/master/logo.svg)
4
4
 
5
5
  ![CI](https://github.com/RobinTail/express-zod-api/actions/workflows/node.js.yml/badge.svg)
6
- ![Swagger Validator](https://img.shields.io/swagger/valid/3.0?specUrl=https%3A%2F%2Fraw.githubusercontent.com%2FRobinTail%2Fexpress-zod-api%2Fmaster%2Fexample%2Fexample.swagger.yaml)
6
+ ![OpenAPI](https://img.shields.io/swagger/valid/3.0?specUrl=https%3A%2F%2Fraw.githubusercontent.com%2FRobinTail%2Fexpress-zod-api%2Fmaster%2Fexample%2Fexample.documentation.yaml)
7
7
  [![coverage](https://coveralls.io/repos/github/RobinTail/express-zod-api/badge.svg)](https://coveralls.io/github/RobinTail/express-zod-api)
8
8
 
9
9
  ![downloads](https://img.shields.io/npm/dw/express-zod-api.svg)
@@ -76,7 +76,7 @@ Therefore, many basic tasks can be accomplished faster and easier, in particular
76
76
  - All of your endpoints can respond in a consistent way.
77
77
  - The expected endpoint input and response types can be exported to the frontend, so you don't get confused about the
78
78
  field names when you implement the client for your API.
79
- - You can generate your API documentation in a Swagger / OpenAPI compatible format.
79
+ - You can generate your API documentation in OpenAPI 3.1 and JSON Schema compatible format.
80
80
 
81
81
  # How it works
82
82
 
@@ -88,7 +88,7 @@ Therefore, many basic tasks can be accomplished faster and easier, in particular
88
88
  - Supports any logger having `info()`, `debug()`, `error()` and `warn()` methods;
89
89
  - [Winston](https://github.com/winstonjs/winston) is default.
90
90
  - Generators:
91
- - Documentation — [OpenAPI 3.x](https://github.com/metadevpro/openapi3-ts) (Swagger Specification);
91
+ - Documentation — [OpenAPI 3.1](https://github.com/metadevpro/openapi3-ts) (former Swagger);
92
92
  - Client side types — inspired by [zod-to-ts](https://github.com/sachinraja/zod-to-ts).
93
93
  - File uploads — [Express-FileUpload](https://github.com/richardgirges/express-fileupload)
94
94
  (based on [Busboy](https://github.com/mscdex/busboy)).
@@ -892,32 +892,30 @@ const rawAcceptingEndpoint = defaultEndpointsFactory.build({
892
892
 
893
893
  ## Generating a Frontend Client
894
894
 
895
- There is a new way of informing the frontend about the I/O types of your endpoints starting the version 6.1.0.
896
- The new approach offers automatic generation of a client based on routing to a typescript file.
897
- The generated client is flexibly configurable on the frontend side using an implementation function that
898
- directly makes requests to an endpoint using the libraries and methods of your choice.
899
- The client asserts the type of request parameters and response.
900
- Consuming the generated client requires Typescript version 4.1 or higher.
895
+ You can generate a Typescript file containing the IO types of your API and a client for it.
896
+ Consider installing `prettier` and using the async `printFormatted()` method.
901
897
 
902
898
  ```typescript
903
- // example client-generator.ts
904
- import { writeFileSync } from "node:fs";
905
899
  import { Integration } from "express-zod-api";
906
900
 
907
- writeFileSync(
908
- "./frontend/client.ts",
909
- new Integration({
910
- routing,
911
- variant: "client", // <— optional, see also "types" for a DIY solution
912
- optionalPropStyle: { withQuestionMark: true, withUndefined: true }, // optional
913
- }).print(),
914
- "utf-8",
915
- );
901
+ const client = new Integration({
902
+ routing,
903
+ variant: "client", // <— optional, see also "types" for a DIY solution
904
+ optionalPropStyle: { withQuestionMark: true, withUndefined: true }, // optional
905
+ });
906
+
907
+ const prettierFormattedTypescriptCode = await client.printFormatted(); // or just .print() for unformatted
916
908
  ```
917
909
 
910
+ Alternatively, you can supply your own `format` function into that method or use a regular `print()` method instead.
911
+ The generated client is flexibly configurable on the frontend side using an implementation function that
912
+ directly makes requests to an endpoint using the libraries and methods of your choice.
913
+ The client asserts the type of request parameters and response.
914
+ Consuming the generated client requires Typescript version 4.1 or higher.
915
+
918
916
  ```typescript
919
917
  // example frontend, simple implementation based on fetch()
920
- import { ExpressZodAPIClient } from "./client.ts";
918
+ import { ExpressZodAPIClient } from "./client.ts"; // the generated file
921
919
 
922
920
  const client = new ExpressZodAPIClient(async (method, path, params) => {
923
921
  const hasBody = !["get", "delete"].includes(method);
@@ -972,7 +970,7 @@ const exampleEndpoint = defaultEndpointsFactory.build({
972
970
  ```
973
971
 
974
972
  _See the example of the generated documentation
975
- [here](https://github.com/RobinTail/express-zod-api/blob/master/example/example.swagger.yaml)_
973
+ [here](https://github.com/RobinTail/express-zod-api/blob/master/example/example.documentation.yaml)_
976
974
 
977
975
  ## Tagging the endpoints
978
976
 
@@ -1093,11 +1091,5 @@ endpointsFactory.build({
1093
1091
 
1094
1092
  # Your input to my output
1095
1093
 
1096
- Do you have a question or idea?
1097
- Your feedback is highly appreciated in [Discussions section](https://github.com/RobinTail/express-zod-api/discussions).
1098
-
1099
- Found a bug?
1100
- Please let me know in [Issues section](https://github.com/RobinTail/express-zod-api/issues).
1101
-
1102
- Found a vulnerability or other security issue?
1103
- Please refer to [Security policy](https://github.com/RobinTail/express-zod-api/blob/master/SECURITY.md).
1094
+ If you have a question or idea, or you found a bug, or vulnerability, or security issue, or want to make a PR:
1095
+ please refer to [Contributing Guidelines](CONTRIBUTING.md).
package/SECURITY.md CHANGED
@@ -4,6 +4,7 @@
4
4
 
5
5
  | Version | Release | Supported |
6
6
  | ------: | :------ | :----------------: |
7
+ | 16.x.x | 01.2024 | :white_check_mark: |
7
8
  | 15.x.x | 12.2023 | :white_check_mark: |
8
9
  | 14.x.x | 10.2023 | :white_check_mark: |
9
10
  | 12.x.x | 09.2023 | :white_check_mark: |
package/dist/index.cjs CHANGED
@@ -1,45 +1,22 @@
1
- "use strict";var Dr=Object.create;var Ce=Object.defineProperty;var zr=Object.getOwnPropertyDescriptor;var jr=Object.getOwnPropertyNames;var kr=Object.getPrototypeOf,Lr=Object.prototype.hasOwnProperty;var Nt=(e,t)=>{for(var r in t)Ce(e,r,{get:t[r],enumerable:!0})},vt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of jr(t))!Lr.call(e,n)&&n!==r&&Ce(e,n,{get:()=>t[n],enumerable:!(o=zr(t,n))||o.enumerable});return e};var P=(e,t,r)=>(r=e!=null?Dr(kr(e)):{},vt(t||!e||!e.__esModule?Ce(r,"default",{value:e,enumerable:!0}):r,e)),Ur=e=>vt(Ce({},"__esModule",{value:!0}),e);var On={};Nt(On,{AbstractEndpoint:()=>te,DependsOnMethod:()=>ge,Documentation:()=>qe,DocumentationError:()=>N,EndpointsFactory:()=>ye,InputValidationError:()=>K,Integration:()=>Xe,MissingPeerError:()=>Q,OutputValidationError:()=>V,RoutingError:()=>J,ServeStatic:()=>he,arrayEndpointsFactory:()=>qt,arrayResultHandler:()=>Ue,attachRouting:()=>rr,createConfig:()=>Mt,createLogger:()=>$e,createMiddleware:()=>Fe,createResultHandler:()=>Le,createServer:()=>or,defaultEndpointsFactory:()=>Gt,defaultResultHandler:()=>fe,ez:()=>Ct,getExamples:()=>U,getMessageFromError:()=>L,getStatusCodeFromError:()=>Pe,testEndpoint:()=>xr,withMeta:()=>k});module.exports=Ur(On);function Mt(e){return e}var $t=P(require("assert/strict"),1),F=require("zod");var kt=require("http-errors"),Lt=require("crypto"),Z=require("zod");var b=require("zod");var Hr="ZodFile",Kr=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,M=class e extends b.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t),n=o.parsedType===b.ZodParsedType.string&&typeof o.data=="string";if(this.isString&&!n)return(0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_type,expected:b.ZodParsedType.string,received:o.parsedType}),b.INVALID;let s=o.parsedType===b.ZodParsedType.object&&Buffer.isBuffer(o.data);return this.isBuffer&&!s?((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.invalid_type,expected:b.ZodParsedType.object,received:o.parsedType,message:"Expected Buffer"}),b.INVALID):(n&&this.isBase64&&!Kr.test(o.data)&&((0,b.addIssueToContext)(o,{code:b.ZodIssueCode.custom,message:this._def.message||"Does not match base64 encoding"}),r.dirty()),{status:r.value,value:o.data})}string=t=>new e({...this._def,...Oe(t),type:""});buffer=t=>new e({...this._def,...Oe(t),type:Buffer.from([])});binary=t=>new e({...this._def,...Oe(t),encoding:"binary"});base64=t=>new e({...this._def,...Oe(t),encoding:"base64"});get isBinary(){return this._def.encoding==="binary"}get isBase64(){return this._def.encoding==="base64"}get isString(){return typeof this._def.type=="string"}get isBuffer(){return Buffer.isBuffer(this._def.type)}static create=()=>new e({typeName:Hr,type:""})};var we=require("ramda"),w="expressZodApiMeta",Fr=e=>{let t=e.constructor,r=(0,we.clone)(e._def);return r[w]=r[w]||{examples:[]},new t(r)},k=e=>{let t=Fr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=k(t);return o._def[w].examples.push(r),o}}}),t},Dt=e=>w in e._def?typeof e._def[w]=="object"&&e._def[w]!==null:!1,zt=(e,t)=>{if(!Dt(e))return;let r=e._def;return t in r[w]?r[w][t]:void 0},Ne=(e,t)=>{if(!Dt(e))return t;let r=k(t),o=Se(r._def[w].examples,e._def[w].examples);if(r._def[w].examples=[],o.type==="single")r._def[w].examples=o.value;else for(let[n,s]of o.value)r._def[w].examples.push((0,we.mergeDeepRight)({...n},{...s}));return r};var Y="application/json",Ae="multipart/form-data",jt="application/octet-stream";var v=require("zod"),$r="ZodUpload",Br=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",pe=class e extends v.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==v.ZodParsedType.object||!Br(r.data)?((0,v.addIssueToContext)(r,{code:v.ZodIssueCode.custom,message:`Expected file upload, received ${r.parsedType}`}),v.INVALID):(0,v.OK)(r.data)}static create=()=>new e({typeName:$r})};var _r=e=>{let r=(e.header("content-type")||"").slice(0,Ae.length).toLowerCase()===Ae;return"files"in e&&r},ve={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Gr=["body","query","params"],rt=e=>e.method.toLowerCase(),ot=e=>e.startsWith("x-"),qr=e=>Object.entries(e.headers).reduce((t,[r,o])=>ot(r)?{...t,[r]:o}:t,{}),Ut=(e,t)=>{let r=rt(e);if(r==="options")return{};let o=Gr;return r in ve&&(o=ve[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?_r(e):!0).reduce((n,s)=>({...n,...s==="headers"?qr(e):e[s]}),{})},Me=e=>!isNaN(e.getTime()),de=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),L=e=>e instanceof Z.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof V?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Pe=e=>(0,kt.isHttpError)(e)?e.statusCode:e instanceof K?400:500,nt=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
1
+ "use strict";var Yr=Object.create;var ze=Object.defineProperty;var Jr=Object.getOwnPropertyDescriptor;var Qr=Object.getOwnPropertyNames;var Xr=Object.getPrototypeOf,eo=Object.prototype.hasOwnProperty;var $t=(e,t)=>{for(var r in t)ze(e,r,{get:t[r],enumerable:!0})},_t=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Qr(t))!eo.call(e,s)&&s!==r&&ze(e,s,{get:()=>t[s],enumerable:!(o=Jr(t,s))||o.enumerable});return e};var R=(e,t,r)=>(r=e!=null?Yr(Xr(e)):{},_t(t||!e||!e.__esModule?ze(r,"default",{value:e,enumerable:!0}):r,e)),to=e=>_t(ze({},"__esModule",{value:!0}),e);var Dn={};$t(Dn,{AbstractEndpoint:()=>ne,DependsOnMethod:()=>Te,Documentation:()=>Xe,DocumentationError:()=>w,EndpointsFactory:()=>xe,InputValidationError:()=>B,Integration:()=>st,MissingPeerError:()=>te,OutputValidationError:()=>q,RoutingError:()=>ee,ServeStatic:()=>be,arrayEndpointsFactory:()=>ir,arrayResultHandler:()=>_e,attachRouting:()=>yr,createConfig:()=>Vt,createLogger:()=>We,createMiddleware:()=>qe,createResultHandler:()=>$e,createServer:()=>gr,defaultEndpointsFactory:()=>sr,defaultResultHandler:()=>he,ez:()=>Ut,getExamples:()=>K,getMessageFromError:()=>H,getStatusCodeFromError:()=>Ce,testEndpoint:()=>Mr,withMeta:()=>U});module.exports=to(Dn);function Vt(e){return e}var rr=R(require("assert/strict"),1),$=require("zod");var Yt=require("http-errors"),Jt=require("crypto"),E=require("zod");var S=require("zod");var ro="ZodFile",oo=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,z=class e extends S.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t),s=o.parsedType===S.ZodParsedType.string&&typeof o.data=="string";if(this.isString&&!s)return(0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_type,expected:S.ZodParsedType.string,received:o.parsedType}),S.INVALID;let i=o.parsedType===S.ZodParsedType.object&&Buffer.isBuffer(o.data);return this.isBuffer&&!i?((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_type,expected:S.ZodParsedType.object,received:o.parsedType,message:"Expected Buffer"}),S.INVALID):(s&&this.isBase64&&!oo.test(o.data)&&((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.custom,message:this._def.message||"Does not match base64 encoding"}),r.dirty()),{status:r.value,value:o.data})}string=t=>new e({...this._def,...Re(t),type:""});buffer=t=>new e({...this._def,...Re(t),type:Buffer.from([])});binary=t=>new e({...this._def,...Re(t),encoding:"binary"});base64=t=>new e({...this._def,...Re(t),encoding:"base64"});get isBinary(){return this._def.encoding==="binary"}get isBase64(){return this._def.encoding==="base64"}get isString(){return typeof this._def.type=="string"}get isBuffer(){return Buffer.isBuffer(this._def.type)}static create=()=>new e({typeName:ro,type:""})};var je=require("ramda"),C="expressZodApiMeta",no=e=>{let t=e.constructor,r=(0,je.clone)(e._def);return r[C]=r[C]||{examples:[]},new t(r)},U=e=>{let t=no(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=U(t);return o._def[C].examples.push(r),o}}}),t},Gt=e=>C in e._def?typeof e._def[C]=="object"&&e._def[C]!==null:!1,qt=(e,t)=>{if(!Gt(e))return;let r=e._def;return t in r[C]?r[C][t]:void 0},Le=(e,t)=>{if(!Gt(e))return t;let r=U(t),o=Ee(r._def[C].examples,e._def[C].examples);if(r._def[C].examples=[],o.type==="single")r._def[C].examples=o.value;else for(let[s,i]of o.value)r._def[C].examples.push((0,je.mergeDeepRight)({...s},{...i}));return r};var V="application/json",Ie="multipart/form-data",Wt="application/octet-stream";var M=require("zod"),so="ZodUpload",io=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",me=class e extends M.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==M.ZodParsedType.object||!io(r.data)?((0,M.addIssueToContext)(r,{code:M.ZodIssueCode.custom,message:`Expected file upload, received ${r.parsedType}`}),M.INVALID):(0,M.OK)(r.data)}static create=()=>new e({typeName:so})};var ao=e=>{let r=(e.header("content-type")||"").slice(0,Ie.length).toLowerCase()===Ie;return"files"in e&&r},ke={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},po=["body","query","params"],dt=e=>e.method.toLowerCase(),ct=e=>e.startsWith("x-"),co=e=>Object.entries(e.headers).reduce((t,[r,o])=>ct(r)?{...t,[r]:o}:t,{}),Qt=(e,t)=>{let r=dt(e);if(r==="options")return{};let o=po;return r in ke&&(o=ke[r]),t&&r in t&&(o=t[r]||o),o.filter(s=>s==="files"?ao(e):!0).reduce((s,i)=>({...s,...i==="headers"?co(e):e[i]}),{})},Ue=e=>!isNaN(e.getTime()),le=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),H=e=>e instanceof E.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,Ce=e=>(0,Yt.isHttpError)(e)?e.statusCode:e instanceof B?400:500,mt=({logger:e,request:t,input:r,error:o,statusCode:s})=>{s===500&&e.error(`Internal server error
2
2
  ${o.stack}
3
- `,{url:t.url,payload:r})},U=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=zt(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}},Re=e=>e.reduce((t,r)=>t||r,!1),q=e=>e instanceof Z.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof Z.z.ZodUnion?Re(e.options.map(q)):e instanceof Z.z.ZodIntersection?Re([e._def.left,e._def.right].map(q)):!1,z=({subject:e,condition:t,maxDepth:r,depth:o=1})=>{if(t(e))return!0;if(r!==void 0&&o>=r)return!1;let n={condition:t,maxDepth:r,depth:o+1};return e instanceof Z.z.ZodObject?Re(Object.values(e.shape).map(s=>z({subject:s,...n}))):e instanceof Z.z.ZodUnion?Re(e.options.map(s=>z({subject:s,...n}))):e instanceof Z.z.ZodIntersection?Re([e._def.left,e._def.right].map(s=>z({subject:s,...n}))):e instanceof Z.z.ZodOptional||e instanceof Z.z.ZodNullable?z({subject:e.unwrap(),...n}):e instanceof Z.z.ZodEffects||e instanceof Z.z.ZodTransformer?z({subject:e.innerType(),...n}):e instanceof Z.z.ZodRecord?z({subject:e.valueSchema,...n}):e instanceof Z.z.ZodArray?z({subject:e.element,...n}):e instanceof Z.z.ZodDefault?z({subject:e._def.innerType,...n}):!1},Ht=e=>z({subject:e,condition:t=>t instanceof pe}),ce=e=>z({subject:e,condition:t=>t instanceof M,maxDepth:3}),Ze=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,H=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),De=e=>(0,Lt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),ze=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},Oe=e=>typeof e=="string"?{message:e}:e||{};var J=class extends Error{name="RoutingError"},N=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
- Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},W=class extends Error{name="IOSchemaError"},V=class extends W{name="OutputValidationError";originalError;constructor(t){super(L(t)),this.originalError=t}},K=class extends W{name="InputValidationError";originalError;constructor(t){super(L(t)),this.originalError=t}},le=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},Q=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var Kt=e=>typeof e=="object"&&e!==null,X=e=>Kt(e)&&"or"in e,ee=e=>Kt(e)&&"and"in e,je=e=>({and:e.reduce((t,r)=>t.concat(ee(r)?r.and:r),[])}),ke=(e,t)=>ee(e)?{and:e.and.map(r=>X(r)?{or:r.or.map(t)}:t(r))}:X(e)?{or:e.or.map(r=>ee(r)?{and:r.and.map(t)}:t(r))}:t(e),st=e=>e.and.reduce((t,r)=>{let o=Se(t.or,X(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(je),t},{or:[]}),me=(e,t)=>{if(ee(e))return ee(t)?je([e,t]):X(t)?me(st(e),t):je([e,t]);if(X(e)){if(ee(t))return me(t,e);if(X(t)){let{type:r,value:o}=Se(e.or,t.or);return{or:r==="single"?o:o.map(je)}}return me(e,{and:[t]})}return ee(t)||X(t)?me(t,e):{and:[e,t]}};var D=require("zod");var ue={positive:200,negative:400},Le=e=>e,fe=Le({getPositiveResponse:e=>{let t=U({schema:e}),r=k(D.z.object({status:D.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>k(D.z.object({status:D.z.literal("error"),error:D.z.object({message:D.z.string()})})).example({status:"error",error:{message:L(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(ue.positive).json({status:"success",data:r});return}let a=Pe(e);nt({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:L(e)}})}}),Ue=Le({getPositiveResponse:e=>{let t=U({schema:e}),r=k("shape"in e&&"items"in e.shape&&e.shape.items instanceof D.z.ZodArray?e.shape.items:D.z.array(D.z.any()));return t.reduce((o,n)=>typeof n=="object"&&n!==null&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},getNegativeResponse:()=>k(D.z.string()).example(L(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Pe(r);nt({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),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 Ft=(e,t=[Y])=>{if(e instanceof F.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},te=class{},Ke=class extends te{#e;#r;#o;#n;#s;#i;#a;#t;#p;#d;#c;#l=[];constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:u,shortDescription:g}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:h,schema:x})=>{(0,$t.default)(!q(x),new W(`Using transformations on the top level of endpoint ${h} is not allowed.`))}),this.#i=n,this.#a=s,this.#o=d,this.#c=a,this.#r=t,this.#p=p,this.#d=c,this.#e={long:u,short:g};let l={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#n={input:Ht(r)?[Ae]:ce(r)?[jt]:[Y],positive:Ft(l.positive),negative:Ft(l.negative)},this.#t={input:r,output:o,positive:l.positive instanceof F.z.ZodType?l.positive:l.positive.schema,negative:l.negative instanceof F.z.ZodType?l.negative:l.negative.schema},this.#s={positive:l.positive instanceof F.z.ZodType?ue.positive:l.positive.statusCode||ue.positive,negative:l.negative instanceof F.z.ZodType?ue.negative:l.negative.statusCode||ue.negative}}_setSiblingMethods(t){this.#l=t}getDescription(t){return this.#e[t]}getMethods(){return this.#r}getSchema(t){return this.#t[t]}getMimeTypes(t){return this.#n[t]}getStatusCode(t){return this.#s[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?me(t,r.security):t,{and:[]})}getScopes(){return this.#p}getTags(){return this.#d}getOperationId(t){return this.#c(t)}#m(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#r.concat(this.#l).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#t.output.parseAsync(t)}catch(r){throw r instanceof F.z.ZodError?new V(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.#o){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(u){throw u instanceof F.z.ZodError?new K(u):u}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#t.input.parseAsync(t)}catch(s){throw s instanceof F.z.ZodError?new K(s):s}return this.#i({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.#a.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){He({logger:n,response:o,error:new le(de(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=rt(t),a=null,p=null;if(n.cors){let c=this.#m();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let u in c)r.set(u,c[u])}let d=Ut(t,n.inputSources);try{let{options:c,isStreamClosed:u}=await this.#f({method:s,input:d,request:t,response:r,logger:o});if(u)return;if(s==="options"){r.status(200).end();return}a=await this.#u(await this.#y({input:d,options:c,logger:o}))}catch(c){p=de(c)}await this.#g({input:d,output:a,request:t,response:r,error:p,logger:o})}};var it=require("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)=>Ne(s,n),o)};var _t=P(require("assert/strict"),1),Fe=e=>((0,_t.default)(!q(e.input),new W("Using transformations on the top level of middleware input schema is not allowed.")),{...e,type:"proprietary"});var ye=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:it.z.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,g=>{if(g&&g instanceof Error)return c(o(g));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(Fe({input:it.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,u="methods"in p?p.methods:[p.method],g=typeof a=="function"?a:()=>a,l="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],h="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Ke({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:l,tags:h,methods:u,getOperationId:g,description:n,shortDescription:s,inputSchema:Bt(d,t)})}},Gt=new ye(fe),qt=new ye(Ue);var Vt=require("util"),Wt=e=>typeof e=="object"&&e!==null&&"level"in e&&("color"in e?typeof e.color=="boolean":!0)&&typeof e.level=="string"&&["silent","warn","debug"].includes(e.level),$e=({winston:{createLogger:e,transports:t,format:{printf:r,timestamp:o,colorize:n,combine:s},config:{npm:a}},...p})=>{let d=l=>{let{[Symbol.for("level")]:h,[Symbol.for("message")]:x,[Symbol.for("splat")]:T,...E}=l;return(0,Vt.inspect)(E,!1,1,p.color)},c=l=>r(({timestamp:h,message:x,level:T,durationMs:E,...m})=>{typeof x=="object"&&(m={...m,...x},x="[No message]");let O=Object.keys(m).length>0,I=[];E&&I.push("duration:",`${E}ms`);let G=l?d:JSON.stringify;if(O)I.push(G(m));else{let ae=m?.[Symbol.for("splat")];Array.isArray(ae)&&I.push(...ae.map(R=>typeof R=="object"?G(R):R))}return[h,`${T}:`,x,...I].join(" ")}),u=[o()],g={handleExceptions:!0};switch(p.color&&u.push(n()),p.level){case"debug":g.level="debug",u.push(c(!0));break;case"silent":case"warn":default:g.level="warn",u.push(c())}return g.format=s(...u),e({silent:p.level==="silent",levels:a.levels,transports:[new t.Console(g)],exitOnError:!1})};var ge=class{constructor(t){this.endpoints=t}};var Yt=P(require("express"),1),he=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Yt.default.static(...this.params))}};var dt=P(require("express"),1),Xt=P(require("http"),1),er=P(require("https"),1);var Ee=async(e,t="default")=>{try{return(await import(e))[t]}catch{}try{return await Promise.resolve().then(()=>require(e)[t])}catch{}throw new Q(e)},Jt=async e=>{for(let{moduleName:t,moduleExport:r}of e)try{return await Ee(t,r)}catch{}throw new Q(e.map(({moduleName:t})=>t))};var at=P(require("assert/strict"),1);var re=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{s=s.trim(),at.default.doesNotMatch(s,/\//,new J(`The entry '${s}' must avoid having slashes \u2014 use nesting instead.`));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 he)r&&a.apply(p,r);else if(a instanceof ge){if(Object.entries(a.endpoints).forEach(([d,c])=>{(0,at.default)(c.getMethods().includes(d),new J(`Endpoint assigned to ${d} method of ${p} must support ${d} method.`)),t(c,p,d)}),n&&Object.keys(a.endpoints).length>0){let[d,...c]=Object.keys(a.endpoints),u=a.endpoints[d];u._setSiblingMethods(c),t(u,p,"options")}}else re({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var Qt=()=>`
6
- \x1B[94m\x1B[39m
7
- \x1B[94m\x1B[39m
3
+ `,{url:t.url,payload:r})},K=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=qt(e,"examples")||[];if(!r&&t==="original")return o;let s=[];for(let i of o){let a=e.safeParse(i);a.success&&s.push(t==="parsed"?a.data:i)}return s},Ee=(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 s of t)r.push([o,s]);return{type:"tuple",value:r}},Ze=e=>e.reduce((t,r)=>t||r,!1),G=e=>e instanceof E.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof E.z.ZodUnion?Ze(e.options.map(G)):e instanceof E.z.ZodIntersection?Ze([e._def.left,e._def.right].map(G)):!1,L=({subject:e,condition:t,maxDepth:r,depth:o=1})=>{if(t(e))return!0;if(r!==void 0&&o>=r)return!1;let s={condition:t,maxDepth:r,depth:o+1};return e instanceof E.z.ZodObject?Ze(Object.values(e.shape).map(i=>L({subject:i,...s}))):e instanceof E.z.ZodUnion?Ze(e.options.map(i=>L({subject:i,...s}))):e instanceof E.z.ZodIntersection?Ze([e._def.left,e._def.right].map(i=>L({subject:i,...s}))):e instanceof E.z.ZodOptional||e instanceof E.z.ZodNullable?L({subject:e.unwrap(),...s}):e instanceof E.z.ZodEffects||e instanceof E.z.ZodTransformer?L({subject:e.innerType(),...s}):e instanceof E.z.ZodRecord?L({subject:e.valueSchema,...s}):e instanceof E.z.ZodArray?L({subject:e.element,...s}):e instanceof E.z.ZodDefault?L({subject:e._def.innerType,...s}):!1},Xt=e=>L({subject:e,condition:t=>t instanceof me}),ue=e=>L({subject:e,condition:t=>t instanceof z,maxDepth:3}),we=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,F=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).flatMap(o=>o.replaceAll(/[A-Z]+/g,s=>`/${s}`).split("/")).map(o=>o.charAt(0).toUpperCase()+o.slice(1).toLowerCase()).join(""),He=e=>(0,Jt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ke=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},Re=e=>typeof e=="string"?{message:e}:e||{};var ee=class extends Error{name="RoutingError"},w=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:s}){let i=`${t}
4
+ Caused by ${s?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(i)}},W=class extends Error{name="IOSchemaError"},q=class extends W{name="OutputValidationError";originalError;constructor(t){super(H(t)),this.originalError=t}},B=class extends W{name="InputValidationError";originalError;constructor(t){super(H(t)),this.originalError=t}},fe=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},te=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var er=e=>typeof e=="object"&&e!==null,re=e=>er(e)&&"or"in e,oe=e=>er(e)&&"and"in e,Fe=e=>({and:e.reduce((t,r)=>t.concat(oe(r)?r.and:r),[])}),Be=(e,t)=>oe(e)?{and:e.and.map(r=>re(r)?{or:r.or.map(t)}:t(r))}:re(e)?{or:e.or.map(r=>oe(r)?{and:r.and.map(t)}:t(r))}:t(e),lt=e=>e.and.reduce((t,r)=>{let o=Ee(t.or,re(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(Fe),t},{or:[]}),ye=(e,t)=>{if(oe(e))return oe(t)?Fe([e,t]):re(t)?ye(lt(e),t):Fe([e,t]);if(re(e)){if(oe(t))return ye(t,e);if(re(t)){let{type:r,value:o}=Ee(e.or,t.or);return{or:r==="single"?o:o.map(Fe)}}return ye(e,{and:[t]})}return oe(t)||re(t)?ye(t,e):{and:[e,t]}};var j=require("zod");var ge={positive:200,negative:400},$e=e=>e,he=$e({getPositiveResponse:e=>{let t=K({schema:e}),r=U(j.z.object({status:j.z.literal("success"),data:e}));return t.reduce((o,s)=>o.example({status:"success",data:s}),r)},getNegativeResponse:()=>U(j.z.object({status:j.z.literal("error"),error:j.z.object({message:j.z.string()})})).example({status:"error",error:{message:H(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:s,logger:i})=>{if(!e){s.status(ge.positive).json({status:"success",data:r});return}let a=Ce(e);mt({logger:i,statusCode:a,request:o,error:e,input:t}),s.status(a).json({status:"error",error:{message:H(e)}})}}),_e=$e({getPositiveResponse:e=>{let t=K({schema:e}),r=U("shape"in e&&"items"in e.shape&&e.shape.items instanceof j.z.ZodArray?e.shape.items:j.z.array(j.z.any()));return t.reduce((o,s)=>typeof s=="object"&&s!==null&&"items"in s&&Array.isArray(s.items)?o.example(s.items):o,r)},getNegativeResponse:()=>U(j.z.string()).example(H(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:s,input:i})=>{if(r){let a=Ce(r);mt({logger:o,statusCode:a,request:s,error:r,input:i}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),Ve=({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 tr=(e,t=[V])=>{if(e instanceof $.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},ne=class{},Ge=class extends ne{#e;#r;#o;#n;#s;#i;#a;#t;#p;#d;#c;#m=[];constructor({methods:t,inputSchema:r,outputSchema:o,handler:s,resultHandler:i,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:l,shortDescription:g}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:x,schema:T})=>{(0,rr.default)(!G(T),new W(`Using transformations on the top level of endpoint ${x} is not allowed.`))}),this.#i=s,this.#a=i,this.#o=d,this.#c=a,this.#r=t,this.#p=p,this.#d=c,this.#e={long:l,short:g};let m={positive:i.getPositiveResponse(o),negative:i.getNegativeResponse()};this.#n={input:Xt(r)?[Ie]:ue(r)?[Wt]:[V],positive:tr(m.positive),negative:tr(m.negative)},this.#t={input:r,output:o,positive:m.positive instanceof $.z.ZodType?m.positive:m.positive.schema,negative:m.negative instanceof $.z.ZodType?m.negative:m.negative.schema},this.#s={positive:m.positive instanceof $.z.ZodType?ge.positive:m.positive.statusCode||ge.positive,negative:m.negative instanceof $.z.ZodType?ge.negative:m.negative.statusCode||ge.negative}}_setSiblingMethods(t){this.#m=t}getDescription(t){return this.#e[t]}getMethods(){return this.#r}getSchema(t){return this.#t[t]}getMimeTypes(t){return this.#n[t]}getStatusCode(t){return this.#s[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?ye(t,r.security):t,{and:[]})}getScopes(){return this.#p}getTags(){return this.#d}getOperationId(t){return this.#c(t)}#l(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#r.concat(this.#m).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#t.output.parseAsync(t)}catch(r){throw r instanceof $.z.ZodError?new q(r):r}}async#f({method:t,input:r,request:o,response:s,logger:i}){let a={},p=!1;for(let d of this.#o){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(l){throw l instanceof $.z.ZodError?new B(l):l}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:s,logger:i})),p="writableEnded"in s&&s.writableEnded,p){i.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#y({input:t,options:r,logger:o}){let s;try{s=await this.#t.input.parseAsync(t)}catch(i){throw i instanceof $.z.ZodError?new B(i):i}return this.#i({input:s,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:s,input:i,output:a}){try{await this.#a.handler({error:t,output:a,request:r,response:o,logger:s,input:i})}catch(p){Ve({logger:s,response:o,error:new fe(le(p).message,t)})}}async execute({request:t,response:r,logger:o,config:s}){let i=dt(t),a=null,p=null;if(s.cors){let c=this.#l();typeof s.cors=="function"&&(c=await s.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let l in c)r.set(l,c[l])}let d=Qt(t,s.inputSources);try{let{options:c,isStreamClosed:l}=await this.#f({method:i,input:d,request:t,response:r,logger:o});if(l)return;if(i==="options"){r.status(200).end();return}a=await this.#u(await this.#y({input:d,options:c,logger:o}))}catch(c){p=le(c)}await this.#g({input:d,output:a,request:t,response:r,error:p,logger:o})}};var ut=require("zod");var or=(e,t)=>{let r=e.map(({input:s})=>s).concat(t),o=r.reduce((s,i)=>s.and(i));return r.reduce((s,i)=>Le(i,s),o)};var nr=R(require("assert/strict"),1),qe=e=>((0,nr.default)(!G(e.input),new W("Using transformations on the top level of middleware input schema is not allowed.")),{...e,type:"proprietary"});var xe=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),s=r?.provider||(()=>({})),i={type:"express",input:ut.z.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,g=>{if(g&&g instanceof Error)return c(o(g));d(s(a,p))})})};return e.#e(this.middlewares.concat(i),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(qe({input:ut.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,description:s,shortDescription:i,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,l="methods"in p?p.methods:[p.method],g=typeof a=="function"?a:()=>a,m="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],x="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Ge({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:m,tags:x,methods:l,getOperationId:g,description:s,shortDescription:i,inputSchema:or(d,t)})}},sr=new xe(he),ir=new xe(_e);var ar=require("util"),pr=e=>typeof e=="object"&&e!==null&&"level"in e&&("color"in e?typeof e.color=="boolean":!0)&&typeof e.level=="string"&&["silent","warn","debug"].includes(e.level),We=({winston:{createLogger:e,transports:t,format:{printf:r,timestamp:o,colorize:s,combine:i},config:{npm:a}},...p})=>{let d=m=>{let{[Symbol.for("level")]:x,[Symbol.for("message")]:T,[Symbol.for("splat")]:h,...A}=m;return(0,ar.inspect)(A,!1,1,p.color)},c=m=>r(({timestamp:x,message:T,level:h,durationMs:A,...f})=>{typeof T=="object"&&(f={...f,...T},T="[No message]");let v=Object.keys(f).length>0,D=[];A&&D.push("duration:",`${A}ms`);let X=m?d:JSON.stringify;if(v)D.push(X(f));else{let Ae=f?.[Symbol.for("splat")];Array.isArray(Ae)&&D.push(...Ae.map(I=>typeof I=="object"?X(I):I))}return[x,`${h}:`,T,...D].join(" ")}),l=[o()],g={handleExceptions:!0};switch(p.color&&l.push(s()),p.level){case"debug":g.level="debug",l.push(c(!0));break;case"silent":case"warn":default:g.level="warn",l.push(c())}return g.format=i(...l),e({silent:p.level==="silent",levels:a.levels,transports:[new t.Console(g)],exitOnError:!1})};var Te=class{constructor(t){this.endpoints=t}};var dr=R(require("express"),1),be=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,dr.default.static(...this.params))}};var gt=R(require("express"),1),lr=R(require("http"),1),ur=R(require("https"),1);var se=async(e,t="default")=>{try{return(await import(e))[t]}catch{}try{return await Promise.resolve().then(()=>require(e)[t])}catch{}throw new te(e)},cr=async e=>{for(let{moduleName:t,moduleExport:r}of e)try{return await se(t,r)}catch{}throw new te(e.map(({moduleName:t})=>t))};var ft=R(require("assert/strict"),1);var ie=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:s})=>{Object.entries(e).forEach(([i,a])=>{i=i.trim(),ft.default.doesNotMatch(i,/\//,new ee(`The entry '${i}' must avoid having slashes \u2014 use nesting instead.`));let p=`${o||""}${i?`/${i}`:""}`;if(a instanceof ne){let d=a.getMethods().slice();s&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof be)r&&a.apply(p,r);else if(a instanceof Te){if(Object.entries(a.endpoints).forEach(([d,c])=>{(0,ft.default)(c.getMethods().includes(d),new ee(`Endpoint assigned to ${d} method of ${p} must support ${d} method.`)),t(c,p,d)}),s&&Object.keys(a.endpoints).length>0){let[d,...c]=Object.keys(a.endpoints),l=a.endpoints[d];l._setSiblingMethods(c),t(l,p,"options")}}else ie({onEndpoint:t,onStatic:r,hasCors:s,routing:a,parentPath:p})})};var mr=()=>`
8
6
  \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
9
- \x1B[94m888 d88P 888 d88888 888 Y88b 888\x1B[39m\x1B[95m\x1B[39m
7
+ \x1B[94m888 d88P 888 d88888 888 Y88b 888\x1B[39m
10
8
  \x1B[95m888 d88P 888 d88P888 888 888 888\x1B[39m
11
- \x1B[95m8888888 888 888 88888b. 888d888 .d88b. .d8888b .d8888b d88P .d88b. .d88888 d88P 888 888 d88P 888\x1B[39m\x1B[97m\x1B[39m
12
- \x1B[97m888 \`Y8bd8P' 888 "88b 888P" d8P Y8b 88K 88K d88P d88""88b d88" 888 d88P 888 8888888P" 888 \x1B[39m
13
- \x1B[97m888 X88K 888 888 888 88888888 "Y8888b. "Y8888b. d88P 888 888 888 888 d88P 888 888 888\x1B[39m\x1B[95m\x1B[39m
14
- \x1B[95m888 .d8""8b. 888 d88P 888 Y8b. X88 X88 d88P Y88..88P Y88b 888 d8888888888 888 888 \x1B[39m
15
- \x1B[95m8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P' d8888888888 "Y88P" "Y88888 d88P 888 888 8888888\x1B[39m\x1B[94m\x1B[39m
9
+ \x1B[95m8888888 888 888 88888b. 888d888 .d88b. .d8888b .d8888b d88P .d88b. .d88888 d88P 888 888 d88P 888\x1B[39m
10
+ \x1B[97m888 \u1FEFY8bd8P' 888 "88b 888P" d8P Y8b 88K 88K d88P d88""88b d88" 888 d88P 888 8888888P" 888 \x1B[39m
11
+ \x1B[97m888 X88K 888 888 888 88888888 "Y8888b. "Y8888b. d88P 888 888 888 888 d88P 888 888 888\x1B[39m
12
+ \x1B[95m888 .d8""8b. 888 d88P 888 Y8b. X88 X88 d88P Y88..88P Y88b 888 d8888888888 888 888\x1B[39m
13
+ \x1B[95m8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P' d8888888888 "Y88P" "Y88888 d88P 888 888 8888888\x1B[39m
16
14
  \x1B[94m 888\x1B[39m
17
15
  \x1B[94m 888\x1B[3m Proudly supports transgender community.\x1B[23m\x1B[39m
18
- \x1B[94m\x1B[3mfor Vika \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
19
- \x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
20
- \x1B[0m\x1B[0m
21
- \x1B[0m\x1B[0m
22
- `.trim();var pt=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Qt()),re({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 ct=P(require("http-errors"),1),Vr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,ct.default)(400,de(r).message),request:o,response:n,logger:t,input:null,output:null})},Wr=(e,t)=>(r,o)=>{let n=(0,ct.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 le(de(s).message,n)})}},tr=async e=>{let t=Wt(e.logger)?$e({...e.logger,winston:await Ee("winston")}):e.logger,r=e.errorHandler||fe,o=Wr(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},rr=async(e,t)=>{let{logger:r,notFoundHandler:o}=await tr(e);return pt({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},or=async(e,t)=>{let r=(0,dt.default)().disable("x-powered-by");if(e.server.compression){let d=await Ee("compression");r.use(d(typeof e.server.compression=="object"?e.server.compression:void 0))}if(r.use(e.server.jsonParser||dt.default.json()),e.server.upload){let d=await Ee("express-fileupload");r.use(d({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}))}e.server.rawParser&&(r.use(e.server.rawParser),r.use((d,{},c)=>{Buffer.isBuffer(d.body)&&(d.body={raw:d.body}),c()}));let{logger:o,errorHandler:n,notFoundHandler:s}=await tr(e);r.use(Vr(n,o)),pt({app:r,routing:t,logger:o,config:e}),r.use(s);let a=(d,c)=>d.listen(c,()=>{o.info("Listening",c)}),p={httpServer:a(Xt.default.createServer(r),e.server.listen),httpsServer:e.https?a(er.default.createServer(e.https.options,r),e.https.listen):void 0};return{app:r,...p,logger:o}};var gr=P(require("assert/strict"),1),hr=require("openapi3-ts/oas30");var ne=P(require("assert/strict"),1),$=require("openapi3-ts/oas30"),xe=require("ramda"),S=require("zod");var A=require("zod");var lt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Yr="ZodDateIn",Be=class e extends A.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==A.ZodParsedType.string)return(0,A.addIssueToContext)(o,{code:A.ZodIssueCode.invalid_type,expected:A.ZodParsedType.string,received:o.parsedType}),A.INVALID;lt.test(o.data)||((0,A.addIssueToContext)(o,{code:A.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Me(n)?{status:r.value,value:n}:((0,A.addIssueToContext)(o,{code:A.ZodIssueCode.invalid_date}),A.INVALID)}static create=()=>new e({typeName:Yr})};var oe=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,a=n,d=s?s({schema:e,...a,next:u=>oe({...u,...a,onEach:t,rules:r,onMissing:o})}):o({schema:e,...a}),c=t&&t({schema:e,prev:d,...a});return c?{...d,...c}:d};var nr=50,ir="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Jr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},ar=/:([A-Za-z0-9_]+)/g,pr=e=>{let t=e.match(ar);return t?t.map(r=>r.slice(1)):[]},dr=e=>e.replace(ar,t=>`{${t.slice(1)}}`),Qr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Xr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),eo=()=>({format:"any"}),to=e=>((0,ne.default)(!e.isResponse,new N({message:"Please use z.upload() only for input.",...e})),{type:"string",format:"binary"}),ro=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||e?"binary":t?"byte":"file"}),oo=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),no=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),so=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),io=({schema:e,next:t})=>t({schema:e.unwrap()}),ao=({schema:e,next:t})=>t({schema:e._def.innerType}),po=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),sr=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),co=({schema:{value:e}})=>({type:typeof e,enum:[e]}),lo=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Ze(s)?s instanceof S.z.ZodOptional:s.isOptional())});return{type:"object",properties:_e({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},mo=()=>({type:"string",nullable:!0,format:"null"}),uo=e=>((0,ne.default)(!e.isResponse,new N({message:"Please use z.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:lt.source,externalDocs:{url:ir}}),fo=e=>((0,ne.default)(e.isResponse,new N({message:"Please use z.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:ir}}),yo=e=>ne.default.fail(new N({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})),go=()=>({type:"boolean"}),ho=()=>({type:"integer",format:"bigint"}),xo=e=>e.reduce((t,r)=>t&&r instanceof S.z.ZodLiteral,!0),To=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof S.z.ZodEnum||e instanceof S.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:_e({schema:S.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof S.z.ZodLiteral)return{type:"object",properties:_e({schema:S.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof S.z.ZodUnion&&xo(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:_e({schema:S.z.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},bo=({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}}),Oo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${(0,$.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},So=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:g}}})=>{let l=g.find(T=>T.kind==="regex"),h=g.find(T=>T.kind==="datetime"),x=l?l.regex:h?h.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...u&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...x&&{pattern:`/${x.source}/${x.flags}`}}},Ao=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},_e=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Ro=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Jr?.[t]},Po=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,$.isSchemaObject)(o)){let s=ze({effect:n,sample:Ro(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:S.z.any()})}if(!t&&n.type==="preprocess"&&(0,$.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"]}),Eo=({schema:e,next:t})=>t({schema:e.unwrap()}),Io=({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})))},cr=(e,t,r=[])=>{let o=U({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?(0,xe.omit)(r,s):s}}),{})}},Co=(e,t,r)=>{let o=U({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}},Ie=(e,t)=>{if(e instanceof S.z.ZodObject)return e;let r;return e instanceof S.z.ZodUnion||e instanceof S.z.ZodDiscriminatedUnion?r=Array.from(e.options.values()).map(o=>Ie(o,t)).reduce((o,n)=>o.merge(n.partial()),S.z.object({})):e instanceof S.z.ZodEffects?((0,ne.default)(!q(e),new N({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t})),r=Ie(e._def.schema,t)):r=Ie(e._def.left,t).merge(Ie(e._def.right,t)),Ne(e,r)},lr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),u=Ie(c,{path:e,method:t,isResponse:!1}).shape,g=pr(e),l=o.includes("query"),h=o.includes("params"),x=o.includes("headers"),T=m=>h&&g.includes(m),E=m=>x&&ot(m);return Object.keys(u).filter(m=>l||T(m)).map(m=>{let O=oe({schema:u[m],isResponse:!1,rules:ut,onEach:ft,onMissing:yt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),I=p==="components"?a(H(e,t,`${d} ${m}`),O):O;return{name:m,in:T(m)?"path":E(m)?"header":"query",required:!u[m].isOptional(),description:(0,$.isSchemaObject)(O)&&O.description||`${t.toUpperCase()} ${e} ${d}`,schema:I,...Co(c,!1,m)}})},ut={ZodString:So,ZodNumber:Ao,ZodBigInt:ho,ZodBoolean:go,ZodDateIn:uo,ZodDateOut:fo,ZodNull:mo,ZodArray:bo,ZodTuple:Oo,ZodRecord:To,ZodObject:lo,ZodLiteral:co,ZodIntersection:so,ZodUnion:oo,ZodFile:ro,ZodUpload:to,ZodAny:eo,ZodDefault:Qr,ZodEnum:sr,ZodNativeEnum:sr,ZodEffects:Po,ZodOptional:io,ZodNullable:po,ZodDiscriminatedUnion:no,ZodBranded:Eo,ZodDate:yo,ZodCatch:Xr,ZodPipeline:Zo,ZodLazy:Io,ZodReadonly:ao},ft=({schema:e,isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof S.z.ZodLazy,s=r.type!==void 0,a=t&&Ze(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:U({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},yt=({schema:e,...t})=>ne.default.fail(new N({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),mt=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r=e.properties?(0,xe.omit)(t,e.properties):void 0,o=e.example?(0,xe.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=>mt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>mt(p,t)):void 0;return(0,xe.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})},mr=e=>(0,$.isSchemaObject)(e)?(0,xe.omit)(["example"],e):e,gt=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),u=r.getMimeTypes(o?"positive":"negative"),g=mr(oe({schema:c,isResponse:!0,rules:ut,onEach:ft,onMissing:yt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),l=cr(c,!0),h=p==="components"?a(H(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:u.reduce((x,T)=>({...x,[T]:{schema:h,...l}}),{})}},wo=()=>({type:"http",scheme:"basic"}),No=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),vo=({name:e})=>({type:"apiKey",in:"query",name:e}),Mo=({name:e})=>({type:"apiKey",in:"header",name:e}),Do=({name:e})=>({type:"apiKey",in:"cookie",name:e}),zo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),jo=({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}}},{})}),ur=e=>{let t={basic:wo,bearer:No,input:vo,header:Mo,cookie:Do,openid:zo,oauth2:jo};return ke(e,r=>t[r.type](r))},Ge=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 Ge(st(e))}return Ge({or:[e]})},fr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=pr(t),c=r.getSchema("input"),u=mr(mt(oe({schema:ce(c)?M.create().buffer():c,isResponse:!1,rules:ut,onEach:ft,onMissing:yt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),g=cr(r.getSchema("input"),!1,d),l=a==="components"?s(H(t,e,p),u):u;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((h,x)=>({...h,[x]:{schema:l,...g}}),{})}},yr=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}}}}),ht=e=>e.length<=nr?e:e.slice(0,nr-1)+"\u2026";var qe=class extends hr.OpenApiBuilder{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o)return(0,gr.default)(!(o in this.lastOperationIdSuffixes),new N({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),this.lastOperationIdSuffixes[o]=1,o;let n=H(t,r);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:u=De}){super(),this.addInfo({title:o,version:n});for(let l of typeof s=="string"?[s]:s)this.addServer({url:l});re({routing:t,onEndpoint:(l,h,x)=>{let T=x,E={path:h,method:T,endpoint:l,composition:c,serializer:u,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,O]=["short","long"].map(l.getDescription.bind(l)),I=r.inputSources?.[T]||ve[T],G=lr({...E,inputSources:I}),R={operationId:this.ensureUniqOperationId(h,T,l.getOperationId(T)),responses:{[l.getStatusCode("positive")]:gt({...E,clue:a,isPositive:!0}),[l.getStatusCode("negative")]:gt({...E,clue:p,isPositive:!1})}};O&&(R.description=O,d&&m===void 0&&(R.summary=ht(O))),m&&(R.summary=ht(m)),l.getTags().length>0&&(R.tags=l.getTags()),G.length>0&&(R.parameters=G),I.includes("body")&&(R.requestBody=fr(E));let Te=Ge(ke(ur(l.getSecurity()),be=>{let wt=this.ensureUniqSecuritySchemaName(be),Mr=["oauth2","openIdConnect"].includes(be.type)?l.getScopes():[];return this.addSecurityScheme(wt,be),{name:wt,scopes:Mr}}));Te.length>0&&(R.security=Te);let tt=dr(h);this.addPath(tt,{[T]:R})}}),this.rootDoc.tags=r.tags?yr(r.tags):[]}};var xt=P(require("http"),1);var ko=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>Y),...t}),Lo=({fnMethod:e,responseProps:t})=>{let r={writableEnded:!1,statusCode:200,statusMessage:xt.default.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=xt.default.STATUS_CODES[o],r)),json:e(()=>r),send:e(()=>r),end:e(()=>(r.writableEnded=!0,r)),...t};return r},Uo=({fnMethod:e,loggerProps:t})=>({info:e(),warn:e(),error:e(),debug:e(),...t}),xr=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,fnMethod:s})=>{let a=s||(await Jt([{moduleName:"vitest",moduleExport:"vi"},{moduleName:"@jest/globals",moduleExport:"jest"}])).fn,p=ko({fnMethod:a,requestProps:t}),d=Lo({fnMethod:a,responseProps:r}),c=Uo({fnMethod:a,loggerProps:n}),u={cors:!1,logger:c,...o};return await e.execute({request:p,response:d,config:u,logger:c}),{requestMock:p,responseMock:d,loggerMock:c}};var _=P(require("typescript"),1);var j=P(require("typescript"),1),i=j.default.factory,se=[i.createModifier(j.default.SyntaxKind.ExportKeyword)],Ho=[i.createModifier(j.default.SyntaxKind.AsyncKeyword)],Ko=[i.createModifier(j.default.SyntaxKind.PublicKeyword),i.createModifier(j.default.SyntaxKind.ReadonlyKeyword)],Tr=[i.createModifier(j.default.SyntaxKind.ProtectedKeyword),i.createModifier(j.default.SyntaxKind.ReadonlyKeyword)],Fo=i.createTemplateHead(""),$o=i.createTemplateTail(""),Bo=i.createTemplateMiddle(" "),Tt=e=>i.createTemplateLiteralType(Fo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?$o:Bo))),bt=Tt(["M","P"]),Ve=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),We=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Ve(o,e[o],t)),[]),Ot=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),br=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),St=(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)],j.default.NodeFlags.Const),Rt=(e,t)=>i.createTypeAliasDeclaration(se,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Ye=(e,t)=>i.createTypeAliasDeclaration(se,e,void 0,t),Or=(e,t,r)=>i.createPropertyDeclaration(Ko,e,void 0,t,r),Sr=(e,t,r=[])=>i.createClassDeclaration(se,e,void 0,void 0,[t,...r]),Ar=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),Rr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(j.default.SyntaxKind.AnyKeyword)]),Pt=(e,t,r)=>i.createInterfaceDeclaration(se,e,void 0,t,r),Pr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Zr=(e,t)=>i.createArrowFunction(Ho,void 0,e.map(r=>Ve(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,We({acc:void 0,key:void 0}),void 0,void 0,t),r]);var Er=["get","post","put","delete","patch"];var y=P(require("typescript"),1),Nr=require("zod");var B=P(require("typescript"),1),{factory:Je}=B.default,Et=(e,t)=>{B.default.addSyntheticLeadingComment(e,B.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Qe=(e,t,r)=>{let o=Je.createTypeAliasDeclaration(void 0,Je.createIdentifier(t),void 0,e);return r&&Et(o,r),o},Ir=(e,t)=>{let r=B.default.createSourceFile("print.ts","",B.default.ScriptTarget.Latest,!1,B.default.ScriptKind.TS);return B.default.createPrinter(t).printNode(B.default.EmitHint.Unspecified,e,r)},_o=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Cr=e=>_o.test(e)?Je.createIdentifier(e):Je.createStringLiteral(e);var{factory:f}=y.default,Go={[y.default.SyntaxKind.AnyKeyword]:"",[y.default.SyntaxKind.BigIntKeyword]:BigInt(0),[y.default.SyntaxKind.BooleanKeyword]:!1,[y.default.SyntaxKind.NumberKeyword]:0,[y.default.SyntaxKind.ObjectKeyword]:{},[y.default.SyntaxKind.StringKeyword]:"",[y.default.SyntaxKind.UndefinedKeyword]:void 0},qo=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),Vo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Ze(a)?a instanceof Nr.z.ZodOptional:a.isOptional(),d=f.createPropertySignature(void 0,Cr(s),p&&o?f.createToken(y.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Et(d,a.description),d});return f.createTypeLiteralNode(n)},Wo=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),Yo=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),wr=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),Jo=e=>Go?.[e.kind],Qo=({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:Jo(o)}),a={number:y.default.SyntaxKind.NumberKeyword,bigint:y.default.SyntaxKind.BigIntKeyword,boolean:y.default.SyntaxKind.BooleanKeyword,string:y.default.SyntaxKind.StringKeyword,undefined:y.default.SyntaxKind.UndefinedKeyword,object:y.default.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(s&&a[s]||y.default.SyntaxKind.AnyKeyword)}return o},Xo=({schema:e})=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),en=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.default.SyntaxKind.UndefinedKeyword)]):o},tn=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),rn=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),on=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),nn=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),sn=({next:e,schema:t})=>e({schema:t._def.innerType}),ie=e=>()=>f.createKeywordTypeNode(e),an=({next:e,schema:t})=>e({schema:t.unwrap()}),pn=({next:e,schema:t})=>e({schema:t._def.innerType}),dn=({next:e,schema:t})=>e({schema:t._def.innerType}),cn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),ln=()=>f.createLiteralTypeNode(f.createNull()),mn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(t(s,f.createLiteralTypeNode(f.createNull())),t(s,r({schema:n.schema})))},un=({schema:{isBuffer:e}})=>e?f.createTypeReferenceNode("Buffer"):f.createKeywordTypeNode(y.default.SyntaxKind.StringKeyword),fn={ZodString:ie(y.default.SyntaxKind.StringKeyword),ZodNumber:ie(y.default.SyntaxKind.NumberKeyword),ZodBigInt:ie(y.default.SyntaxKind.BigIntKeyword),ZodBoolean:ie(y.default.SyntaxKind.BooleanKeyword),ZodDateIn:ie(y.default.SyntaxKind.StringKeyword),ZodDateOut:ie(y.default.SyntaxKind.StringKeyword),ZodNull:ln,ZodArray:Wo,ZodTuple:rn,ZodRecord:on,ZodObject:Vo,ZodLiteral:qo,ZodIntersection:nn,ZodUnion:wr,ZodFile:un,ZodAny:ie(y.default.SyntaxKind.AnyKeyword),ZodDefault:sn,ZodEnum:Yo,ZodNativeEnum:Xo,ZodEffects:Qo,ZodOptional:en,ZodNullable:tn,ZodDiscriminatedUnion:wr,ZodBranded:an,ZodCatch:dn,ZodPipeline:cn,ZodLazy:mn,ZodReadonly:pn},It=({schema:e,...t})=>oe({schema:e,rules:fn,onMissing:()=>f.createKeywordTypeNode(y.default.SyntaxKind.AnyKeyword),...t});var Xe=class{agg=[];registry={};paths=[];aliases={};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)}constructor({routing:t,variant:r="client",serializer:o=De,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){re({routing:t,onEndpoint:(m,O,I)=>{let G=H(O,I,"input"),ae=H(O,I,"response"),R={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Te=m.getSchema("input"),tt=It({...R,schema:ce(Te)?M.create().buffer():Te,isResponse:!1}),be=It({...R,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(Qe(tt,G),Qe(be,ae)),I!=="options"&&(this.paths.push(O),this.registry[`${I} ${O}`]={in:G,out:ae,isJson:m.getMimeTypes("positive").includes(Y),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Rt("Path",this.paths),a=Rt("Method",Er),p=Ye("MethodPath",Tt([a.name,s.name])),d=[i.createHeritageClause(_.default.SyntaxKind.ExtendsKeyword,[Ot(p.name,_.default.SyntaxKind.AnyKeyword)])],c=Pt("Input",d,Object.keys(this.registry).map(m=>St(m,this.registry[m].in))),u=Pt("Response",d,Object.keys(this.registry).map(m=>St(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,u),r==="types")return;let g=i.createVariableStatement(se,At("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),l=i.createVariableStatement(se,At("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(O=>i.createStringLiteral(O)))))))),h=Ye("Provider",i.createFunctionTypeNode(Pr({M:a.name,P:s.name}),We({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),bt)}),Ar(u.name,bt))),x=Ye("Implementation",i.createFunctionTypeNode(void 0,We({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(_.default.SyntaxKind.StringKeyword),params:Ot(_.default.SyntaxKind.StringKeyword,_.default.SyntaxKind.AnyKeyword)}),Rr())),T=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),E=Sr("ExpressZodAPIClient",br([Ve("implementation",i.createTypeReferenceNode(x.name),Tr)]),[Or("provide",i.createTypeReferenceNode(h.name),Zr(["method","path","params"],[i.createIdentifier("method"),Zt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[T,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,[T]),_.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);_.default.addSyntheticLeadingComment(E,_.default.SyntaxKind.MultiLineCommentTrivia,`
23
- export const exampleImplementation: Implementation = async (
24
- method,
25
- path,
26
- params
27
- ) => {
28
- const hasBody = !["get", "delete"].includes(method);
29
- const searchParams = hasBody ? "" : \`?\${new URLSearchParams(params)}\`;
30
- const response = await fetch(\`https://example.com\${path}\${searchParams}\`, {
31
- method: method.toUpperCase(),
32
- headers: hasBody ? { "Content-Type": "application/json" } : undefined,
33
- body: hasBody ? JSON.stringify(params) : undefined,
34
- });
35
- if (\`\${method} \${path}\` in jsonEndpoints) {
36
- return response.json();
37
- }
38
- return response.text();
39
- };
16
+ \x1B[94m\x1B[3mfor Nina \x1B[23m888\x1B[3m Start your API server with I/O schema validation and custom middlewares in minutes.\x1B[23m\x1B[39m
17
+ \x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m
18
+ `;var yt=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(mr()),t.debug("Running","v16.0.0-beta1 (CJS)"),ie({routing:o,hasCors:!!r.cors,onEndpoint:(s,i,a)=>{e[a](i,async(p,d)=>{t.info(`${p.method}: ${i}`),await s.execute({request:p,response:d,logger:t,config:r})})},onStatic:(s,i)=>{e.use(s,i)}})};var ht=R(require("http-errors"),1),mo=(e,t)=>(r,o,s,i)=>{if(!r)return i();e.handler({error:(0,ht.default)(400,le(r).message),request:o,response:s,logger:t,input:null,output:null})},lo=(e,t)=>(r,o)=>{let s=(0,ht.default)(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:s,input:null,output:null})}catch(i){Ve({response:o,logger:t,error:new fe(le(i).message,s)})}},fr=async e=>{let t=pr(e.logger)?We({...e.logger,winston:await se("winston")}):e.logger,r=e.errorHandler||he,o=lo(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},yr=async(e,t)=>{let{logger:r,notFoundHandler:o}=await fr(e);return yt({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},gr=async(e,t)=>{let r=(0,gt.default)().disable("x-powered-by");if(e.server.compression){let d=await se("compression");r.use(d(typeof e.server.compression=="object"?e.server.compression:void 0))}if(r.use(e.server.jsonParser||gt.default.json()),e.server.upload){let d=await se("express-fileupload");r.use(d({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}))}e.server.rawParser&&(r.use(e.server.rawParser),r.use((d,{},c)=>{Buffer.isBuffer(d.body)&&(d.body={raw:d.body}),c()}));let{logger:o,errorHandler:s,notFoundHandler:i}=await fr(e);r.use(mo(s,o)),yt({app:r,routing:t,logger:o,config:e}),r.use(i);let a=(d,c)=>d.listen(c,()=>{o.info("Listening",c)}),p={httpServer:a(lr.default.createServer(r),e.server.listen),httpsServer:e.https?a(ur.default.createServer(e.https.options,r),e.https.listen):void 0};return{app:r,...p,logger:o}};var wr=R(require("assert/strict"),1),vr=require("openapi3-ts/oas31");var pe=R(require("assert/strict"),1),Y=require("openapi3-ts/oas31"),Se=require("ramda"),O=require("zod");var P=require("zod");var xt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,uo="ZodDateIn",Ye=class e extends P.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==P.ZodParsedType.string)return(0,P.addIssueToContext)(o,{code:P.ZodIssueCode.invalid_type,expected:P.ZodParsedType.string,received:o.parsedType}),P.INVALID;xt.test(o.data)||((0,P.addIssueToContext)(o,{code:P.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let s=new Date(o.data);return Ue(s)?{status:r.value,value:s}:((0,P.addIssueToContext)(o,{code:P.ZodIssueCode.invalid_date}),P.INVALID)}static create=()=>new e({typeName:uo})};var ae=({schema:e,onEach:t,rules:r,onMissing:o,...s})=>{let i="typeName"in e._def?r[e._def.typeName]:void 0,a=s,d=i?i({schema:e,...a,next:l=>ae({...l,...a,onEach:t,rules:r,onMissing:o})}):o({schema:e,...a}),c=t&&t({schema:e,prev:d,...a});return c?{...d,...c}:d};var hr=50,Tr="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:[]},br=/:([A-Za-z0-9_]+)/g,Sr=e=>{let t=e.match(br);return t?t.map(r=>r.slice(1)):[]},Or=e=>e.replace(br,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=>((0,pe.default)(!e.isResponse,new w({message:"Please use z.upload() only for input.",...e})),{type:"string",format:"binary"}),To=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||e?"binary":t?"byte":"file"}),bo=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),So=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),Oo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Ao=({schema:e,next:t})=>t({schema:e.unwrap()}),Po=({schema:e,next:t})=>t({schema:e._def.innerType}),Ro=({schema:e,next:t})=>{let r=t({schema:e.unwrap()});return(0,Y.isReferenceObject)(r)||(r.type=Ar(r)),r},xr=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),Eo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),Io=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(i=>{let a=e.shape[i];return!(t&&we(a)?a instanceof O.z.ZodOptional:a.isOptional())}),s={type:"object",properties:Je({schema:e,isResponse:t,...r})};return o.length&&(s.required=o),s},Zo=()=>({type:"null"}),Co=e=>((0,pe.default)(!e.isResponse,new w({message:"Please use z.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:xt.source,externalDocs:{url:Tr}}),wo=e=>((0,pe.default)(e.isResponse,new w({message:"Please use z.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Tr}}),vo=e=>pe.default.fail(new w({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),Mo=()=>({type:"boolean"}),No=()=>({type:"integer",format:"bigint"}),Do=e=>e.reduce((t,r)=>t&&r instanceof O.z.ZodLiteral,!0),zo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof O.z.ZodEnum||e instanceof O.z.ZodNativeEnum){let o=Object.values(e.enum),s=o.reduce((a,p)=>({...a,[p]:t}),{}),i={type:"object",properties:Je({schema:O.z.object(s),...r})};return o.length&&(i.required=o),i}if(e instanceof O.z.ZodLiteral)return{type:"object",properties:Je({schema:O.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof O.z.ZodUnion&&Do(e.options)){let o=e.options.reduce((s,i)=>({...s,[`${i.value}`]:t}),{});return{type:"object",properties:Je({schema:O.z.object(o),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},jo=({schema:{_def:e,element:t},next:r})=>{let o={type:"array",items:r({schema:t})};return e.minLength&&(o.minItems=e.minLength.value),e.maxLength&&(o.maxItems=e.maxLength.value),o},Lo=({schema:{items:e},next:t})=>({type:"array",prefixItems:e.map(o=>t({schema:o}))}),ko=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:s,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:g}}})=>{let m=g.find(f=>f.kind==="regex"),x=g.find(f=>f.kind==="datetime"),T=m?m.regex:x?x.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,h={type:"string"},A={"date-time":l,email:e,url:t,uuid:s,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let f in A)if(A[f]){h.format=f;break}return r!==null&&(h.minLength=r),o!==null&&(h.maxLength=o),T&&(h.pattern=`/${T.source}/${T.flags}`),h},Uo=({schema:e})=>{let t=e._def.checks.find(({kind:d})=>d==="min"),r=e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,o=t?t.inclusive:!0,s=e._def.checks.find(({kind:d})=>d==="max"),i=e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,a=s?s.inclusive:!0,p={type:e.isInt?"integer":"number",format:e.isInt?"int64":"double"};return o?p.minimum=r:p.exclusiveMinimum=r,a?p.maximum=i:p.exclusiveMaximum=i,p},Je=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Ho=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return fo?.[t]},Ar=e=>["null"].concat(e.type||[]),Ko=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:s}=e._def;if(t&&s.type==="transform"&&!(0,Y.isReferenceObject)(o)){let i=Ke({effect:s,sample:Ho(o)});return i&&["number","string","boolean"].includes(i)?{type:i}:r({schema:O.z.any()})}if(!t&&s.type==="preprocess"&&!(0,Y.isReferenceObject)(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},Fo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Bo=({schema:e,next:t})=>t({schema:e.unwrap()}),$o=({next:e,schema:t,serializer:r,getRef:o,makeRef:s})=>{let i=r(t.schema);return o(i)||(s(i,{}),s(i,e({schema:t.schema})))},Pr=(e,t,r=[])=>{let o=K({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((s,i,a)=>({...s,[`example${a+1}`]:{value:typeof i=="object"&&!Array.isArray(i)?(0,Se.omit)(r,i):i}}),{})}},_o=(e,t,r)=>{let o=K({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((s,i,a)=>r in i?{...s,[`example${a+1}`]:{value:i[r]}}:s,{})}},ve=(e,t)=>{if(e instanceof O.z.ZodObject)return e;let r;return e instanceof O.z.ZodUnion||e instanceof O.z.ZodDiscriminatedUnion?r=Array.from(e.options.values()).map(o=>ve(o,t)).reduce((o,s)=>o.merge(s.partial()),O.z.object({})):e instanceof O.z.ZodEffects?((0,pe.default)(!G(e),new w({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t})),r=ve(e._def.schema,t)):r=ve(e._def.left,t).merge(ve(e._def.right,t)),Le(e,r)},Rr=({path:e,method:t,endpoint:r,inputSources:o,serializer:s,getRef:i,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=ve(c,{path:e,method:t,isResponse:!1}).shape,g=Sr(e),m=o.includes("query"),x=o.includes("params"),T=o.includes("headers"),h=f=>x&&g.includes(f),A=f=>T&&ct(f);return Object.keys(l).filter(f=>m||h(f)).map(f=>{let v=ae({schema:l[f],isResponse:!1,rules:bt,onEach:St,onMissing:Ot,serializer:s,getRef:i,makeRef:a,path:e,method:t}),D=p==="components"?a(F(e,t,`${d} ${f}`),v):v;return{name:f,in:h(f)?"path":A(f)?"header":"query",required:!l[f].isOptional(),description:!(0,Y.isReferenceObject)(v)&&v.description||`${t.toUpperCase()} ${e} ${d}`,schema:D,..._o(c,!1,f)}})},bt={ZodString:ko,ZodNumber:Uo,ZodBigInt:No,ZodBoolean:Mo,ZodDateIn:Co,ZodDateOut:wo,ZodNull:Zo,ZodArray:jo,ZodTuple:Lo,ZodRecord:zo,ZodObject:Io,ZodLiteral:Eo,ZodIntersection:Oo,ZodUnion:bo,ZodFile:To,ZodUpload:xo,ZodAny:ho,ZodDefault:yo,ZodEnum:xr,ZodNativeEnum:xr,ZodEffects:Ko,ZodOptional:Ao,ZodNullable:Ro,ZodDiscriminatedUnion:So,ZodBranded:Bo,ZodDate:vo,ZodCatch:go,ZodPipeline:Fo,ZodLazy:$o,ZodReadonly:Po},St=({schema:e,isResponse:t,prev:r})=>{if((0,Y.isReferenceObject)(r))return{};let{description:o}=e,s=e instanceof O.z.ZodLazy,i=r.type!==void 0,a=t&&we(e),p=!s&&i&&!a&&e.isNullable(),d=s?[]:K({schema:e,variant:t?"parsed":"original",validate:!0}),c={};return o&&(c.description=o),p&&(c.type=Ar(r)),d.length&&(c.examples=Array.from(d)),c},Ot=({schema:e,...t})=>pe.default.fail(new w({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Tt=(e,t)=>{if((0,Y.isReferenceObject)(e))return e;let r=e.properties?(0,Se.omit)(t,e.properties):void 0,o=e.example?(0,Se.omit)(t,e.example):void 0,s=e.required?e.required.filter(p=>!t.includes(p)):void 0,i=e.allOf?e.allOf.map(p=>Tt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>Tt(p,t)):void 0;return(0,Se.omit)(Object.entries({properties:r,required:s,example:o,allOf:i,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:s,example:o,allOf:i,oneOf:a})},Er=e=>(0,Y.isReferenceObject)(e)?e:(0,Se.omit)(["example"],e),At=({method:e,path:t,endpoint:r,isPositive:o,serializer:s,getRef:i,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),g=Er(ae({schema:c,isResponse:!0,rules:bt,onEach:St,onMissing:Ot,serializer:s,getRef:i,makeRef:a,path:t,method:e})),m=Pr(c,!0),x=p==="components"?a(F(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((T,h)=>({...T,[h]:{schema:x,...m}}),{})}},Vo=()=>({type:"http",scheme:"basic"}),Go=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},qo=({name:e})=>({type:"apiKey",in:"query",name:e}),Wo=({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:s={},...i}=o;return{...t,[r]:{...i,scopes:s}}},{})}),Ir=e=>{let t={basic:Vo,bearer:Go,input:qo,header:Wo,cookie:Yo,openid:Jo,oauth2:Qo};return Be(e,r=>t[r.type](r))},Qe=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:s})=>({...r,[o]:s}),{}));if("and"in e)return Qe(lt(e))}return Qe({or:[e]})},Zr=({method:e,path:t,endpoint:r,serializer:o,getRef:s,makeRef:i,composition:a,clue:p="request body"})=>{let d=Sr(t),c=r.getSchema("input"),l=Er(Tt(ae({schema:ue(c)?z.create().buffer():c,isResponse:!1,rules:bt,onEach:St,onMissing:Ot,serializer:o,getRef:s,makeRef:i,path:t,method:e}),d)),g=Pr(r.getSchema("input"),!1,d),m=a==="components"?i(F(t,e,p),l):l;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((x,T)=>({...x,[T]:{schema:m,...g}}),{})}},Cr=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),Pt=e=>e.length<=hr?e:e.slice(0,hr-1)+"\u2026";var Xe=class extends vr.OpenApiBuilder{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o)return(0,wr.default)(!(o in this.lastOperationIdSuffixes),new w({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),this.lastOperationIdSuffixes[o]=1,o;let s=F(t,r);return s in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[s]++,`${s}${this.lastOperationIdSuffixes[s]}`):(this.lastOperationIdSuffixes[s]=1,s)}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:s,serverUrl:i,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=He}){super(),this.addInfo({title:o,version:s});for(let m of typeof i=="string"?[i]:i)this.addServer({url:m});ie({routing:t,onEndpoint:(m,x,T)=>{let h=T,A={path:x,method:h,endpoint:m,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[f,v]=["short","long"].map(m.getDescription.bind(m)),D=r.inputSources?.[h]||ke[h],X=Rr({...A,inputSources:D}),I={operationId:this.ensureUniqOperationId(x,h,m.getOperationId(h)),responses:{[m.getStatusCode("positive")]:At({...A,clue:a,isPositive:!0}),[m.getStatusCode("negative")]:At({...A,clue:p,isPositive:!1})}};v&&(I.description=v,d&&f===void 0&&(I.summary=Pt(v))),f&&(I.summary=Pt(f)),m.getTags().length>0&&(I.tags=m.getTags()),X.length>0&&(I.parameters=X),D.includes("body")&&(I.requestBody=Zr(A));let Me=Qe(Be(Ir(m.getSecurity()),Pe=>{let Ne=this.ensureUniqSecuritySchemaName(Pe),pt=["oauth2","openIdConnect"].includes(Pe.type)?m.getScopes():[];return this.addSecurityScheme(Ne,Pe),{name:Ne,scopes:pt}}));Me.length>0&&(I.security=Me);let at=Or(x);this.addPath(at,{[h]:I})}}),this.rootDoc.tags=r.tags?Cr(r.tags):[]}};var Rt=R(require("http"),1);var Xo=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>V),...t}),en=({fnMethod:e,responseProps:t})=>{let r={writableEnded:!1,statusCode:200,statusMessage:Rt.default.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=Rt.default.STATUS_CODES[o],r)),json:e(()=>r),send:e(()=>r),end:e(()=>(r.writableEnded=!0,r)),...t};return r},tn=({fnMethod:e,loggerProps:t})=>({info:e(),warn:e(),error:e(),debug:e(),...t}),Mr=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:s,fnMethod:i})=>{let a=i||(await cr([{moduleName:"vitest",moduleExport:"vi"},{moduleName:"@jest/globals",moduleExport:"jest"}])).fn,p=Xo({fnMethod:a,requestProps:t}),d=en({fnMethod:a,responseProps:r}),c=tn({fnMethod:a,loggerProps:s}),l={cors:!1,logger:c,...o};return await e.execute({request:p,response:d,config:l,logger:c}),{requestMock:p,responseMock:d,loggerMock:c}};var N=R(require("typescript"),1);var k=R(require("typescript"),1),n=k.default.factory,J=[n.createModifier(k.default.SyntaxKind.ExportKeyword)],rn=[n.createModifier(k.default.SyntaxKind.AsyncKeyword)],on=[n.createModifier(k.default.SyntaxKind.PublicKeyword),n.createModifier(k.default.SyntaxKind.ReadonlyKeyword)],Nr=[n.createModifier(k.default.SyntaxKind.ProtectedKeyword),n.createModifier(k.default.SyntaxKind.ReadonlyKeyword)],Et=n.createTemplateHead(""),Oe=n.createTemplateTail(""),It=n.createTemplateMiddle(" "),Zt=e=>n.createTemplateLiteralType(Et,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?Oe:It))),Ct=Zt(["M","P"]),et=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),tt=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(et(n.createIdentifier(o),e[o],t)),[]),wt=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),Dr=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),vt=(e,t)=>n.createPropertySignature(void 0,`"${e}"`,void 0,n.createTypeReferenceNode(t)),Q=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],k.default.NodeFlags.Const),Mt=(e,t)=>n.createTypeAliasDeclaration(J,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),rt=(e,t)=>n.createTypeAliasDeclaration(J,e,void 0,t),zr=(e,t,r)=>n.createPropertyDeclaration(on,e,void 0,t,r),jr=(e,t,r=[])=>n.createClassDeclaration(J,e,void 0,void 0,[t,...r]),Lr=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),kr=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(k.default.SyntaxKind.AnyKeyword)]),Nt=(e,t,r)=>n.createInterfaceDeclaration(J,e,void 0,t,r),Ur=e=>Object.keys(e).reduce((t,r)=>t.concat(n.createTypeParameterDeclaration([],r,n.createTypeReferenceNode(e[r]))),[]),Dt=(e,t)=>n.createArrowFunction(rn,void 0,e.map(r=>et(r)),void 0,void 0,t),zt=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[n.createArrowFunction(void 0,void 0,tt({acc:void 0,key:void 0}),void 0,void 0,t),r]);var Hr=["get","post","put","delete","patch"];var y=R(require("typescript"),1),Br=require("zod");var _=R(require("typescript"),1),{factory:ot}=_.default,jt=(e,t)=>{_.default.addSyntheticLeadingComment(e,_.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},nt=(e,t,r)=>{let o=ot.createTypeAliasDeclaration(void 0,ot.createIdentifier(t),void 0,e);return r&&jt(o,r),o},Lt=(e,t)=>{let r=_.default.createSourceFile("print.ts","",_.default.ScriptTarget.Latest,!1,_.default.ScriptKind.TS);return _.default.createPrinter(t).printNode(_.default.EmitHint.Unspecified,e,r)},nn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Kr=e=>nn.test(e)?ot.createIdentifier(e):ot.createStringLiteral(e);var{factory:u}=y.default,sn={[y.default.SyntaxKind.AnyKeyword]:"",[y.default.SyntaxKind.BigIntKeyword]:BigInt(0),[y.default.SyntaxKind.BooleanKeyword]:!1,[y.default.SyntaxKind.NumberKeyword]:0,[y.default.SyntaxKind.ObjectKeyword]:{},[y.default.SyntaxKind.StringKeyword]:"",[y.default.SyntaxKind.UndefinedKeyword]:void 0},an=({schema:{value:e}})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),pn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let s=Object.entries(e).map(([i,a])=>{let p=t&&we(a)?a instanceof Br.z.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,Kr(i),p&&o?u.createToken(y.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&jt(d,a.description),d});return u.createTypeLiteralNode(s)},dn=({schema:{element:e},next:t})=>u.createArrayTypeNode(t({schema:e})),cn=({schema:{options:e}})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Fr=({schema:{options:e},next:t})=>u.createUnionTypeNode(e.map(r=>t({schema:r}))),mn=e=>sn?.[e.kind],ln=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),s=e._def.effect;if(r&&s.type==="transform"){let i=Ke({effect:s,sample:mn(o)}),a={number:y.default.SyntaxKind.NumberKeyword,bigint:y.default.SyntaxKind.BigIntKeyword,boolean:y.default.SyntaxKind.BooleanKeyword,string:y.default.SyntaxKind.StringKeyword,undefined:y.default.SyntaxKind.UndefinedKeyword,object:y.default.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(i&&a[i]||y.default.SyntaxKind.AnyKeyword)}return o},un=({schema:e})=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),fn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(y.default.SyntaxKind.UndefinedKeyword)]):o},yn=({next:e,schema:t})=>u.createUnionTypeNode([e({schema:t.unwrap()}),u.createLiteralTypeNode(u.createNull())]),gn=({next:e,schema:{items:t}})=>u.createTupleTypeNode(t.map(r=>e({schema:r}))),hn=({next:e,schema:{keySchema:t,valueSchema:r}})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),xn=({next:e,schema:t})=>u.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Tn=({next:e,schema:t})=>e({schema:t._def.innerType}),de=e=>()=>u.createKeywordTypeNode(e),bn=({next:e,schema:t})=>e({schema:t.unwrap()}),Sn=({next:e,schema:t})=>e({schema:t._def.innerType}),On=({next:e,schema:t})=>e({schema:t._def.innerType}),An=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),Pn=()=>u.createLiteralTypeNode(u.createNull()),Rn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:s})=>{let i=`Type${o(s.schema)}`;return e(i)||(t(i,u.createLiteralTypeNode(u.createNull())),t(i,r({schema:s.schema})))},En=({schema:{isBuffer:e}})=>e?u.createTypeReferenceNode("Buffer"):u.createKeywordTypeNode(y.default.SyntaxKind.StringKeyword),In={ZodString:de(y.default.SyntaxKind.StringKeyword),ZodNumber:de(y.default.SyntaxKind.NumberKeyword),ZodBigInt:de(y.default.SyntaxKind.BigIntKeyword),ZodBoolean:de(y.default.SyntaxKind.BooleanKeyword),ZodDateIn:de(y.default.SyntaxKind.StringKeyword),ZodDateOut:de(y.default.SyntaxKind.StringKeyword),ZodNull:Pn,ZodArray:dn,ZodTuple:gn,ZodRecord:hn,ZodObject:pn,ZodLiteral:an,ZodIntersection:xn,ZodUnion:Fr,ZodFile:En,ZodAny:de(y.default.SyntaxKind.AnyKeyword),ZodDefault:Tn,ZodEnum:cn,ZodNativeEnum:un,ZodEffects:ln,ZodOptional:fn,ZodNullable:yn,ZodDiscriminatedUnion:Fr,ZodBranded:bn,ZodCatch:On,ZodPipeline:An,ZodLazy:Rn,ZodReadonly:Sn},kt=({schema:e,...t})=>ae({schema:e,rules:In,onMissing:()=>u.createKeywordTypeNode(y.default.SyntaxKind.AnyKeyword),...t});var st=class{program=[];usage=[];registry={};paths=[];aliases={};ids={pathType:n.createIdentifier("Path"),methodType:n.createIdentifier("Method"),methodPathType:n.createIdentifier("MethodPath"),inputInterface:n.createIdentifier("Input"),responseInterface:n.createIdentifier("Response"),jsonEndpointsConst:n.createIdentifier("jsonEndpoints"),endpointTagsConst:n.createIdentifier("endpointTags"),providerType:n.createIdentifier("Provider"),implementationType:n.createIdentifier("Implementation"),clientClass:n.createIdentifier("ExpressZodAPIClient"),keyParameter:n.createIdentifier("key"),pathParameter:n.createIdentifier("path"),paramsArgument:n.createIdentifier("params"),methodParameter:n.createIdentifier("method"),accumulator:n.createIdentifier("acc"),provideMethod:n.createIdentifier("provide"),implementationArgument:n.createIdentifier("implementation"),headersProperty:n.createIdentifier("headers"),hasBodyConst:n.createIdentifier("hasBody"),undefinedValue:n.createIdentifier("undefined"),bodyProperty:n.createIdentifier("body"),responseConst:n.createIdentifier("response"),searchParamsConst:n.createIdentifier("searchParams"),exampleImplementationConst:n.createIdentifier("exampleImplementation"),clientConst:n.createIdentifier("client")};getAlias(t){return t in this.aliases?n.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=nt(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=He,optionalPropStyle:s={withQuestionMark:!0,withUndefined:!0}}){ie({routing:t,onEndpoint:(b,ce,De)=>{let Ht=F(ce,De,"input"),Kt=F(ce,De,"response"),Ft={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:s},Bt=b.getSchema("input"),qr=kt({...Ft,schema:ue(Bt)?z.create().buffer():Bt,isResponse:!1}),Wr=kt({...Ft,isResponse:!0,schema:b.getSchema("positive").or(b.getSchema("negative"))});this.program.push(nt(qr,Ht),nt(Wr,Kt)),De!=="options"&&(this.paths.push(ce),this.registry[`${De} ${ce}`]={in:Ht,out:Kt,isJson:b.getMimeTypes("positive").includes(V),tags:b.getTags()})}}),this.program.unshift(...Object.values(this.aliases));let i=Mt(this.ids.pathType,this.paths),a=Mt(this.ids.methodType,Hr),p=rt(this.ids.methodPathType,Zt([this.ids.methodType,this.ids.pathType])),d=[n.createHeritageClause(N.default.SyntaxKind.ExtendsKeyword,[wt(this.ids.methodPathType,N.default.SyntaxKind.AnyKeyword)])],c=Nt(this.ids.inputInterface,d,Object.keys(this.registry).map(b=>vt(b,this.registry[b].in))),l=Nt(this.ids.responseInterface,d,Object.keys(this.registry).map(b=>vt(b,this.registry[b].out)));if(this.program.push(i,a,p,c,l),r==="types")return;let g=n.createVariableStatement(J,Q(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(Object.keys(this.registry).filter(b=>this.registry[b].isJson).map(b=>n.createPropertyAssignment(`"${b}"`,n.createTrue()))))),m=n.createVariableStatement(J,Q(this.ids.endpointTagsConst,n.createObjectLiteralExpression(Object.keys(this.registry).map(b=>n.createPropertyAssignment(`"${b}"`,n.createArrayLiteralExpression(this.registry[b].tags.map(ce=>n.createStringLiteral(ce)))))))),x=rt(this.ids.providerType,n.createFunctionTypeNode(Ur({M:this.ids.methodType,P:this.ids.pathType}),tt({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),Ct)}),Lr(this.ids.responseInterface,Ct))),T=rt(this.ids.implementationType,n.createFunctionTypeNode(void 0,tt({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(N.default.SyntaxKind.StringKeyword),params:wt(N.default.SyntaxKind.StringKeyword,N.default.SyntaxKind.AnyKeyword)}),kr())),h=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,Oe)]),A=zt(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[h,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),f=zt(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[h]),N.default.SyntaxKind.GreaterThanEqualsToken,n.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,n.createObjectLiteralExpression([n.createSpreadAssignment(this.ids.accumulator),n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),n.createObjectLiteralExpression()),v=jr(this.ids.clientClass,Dr([et(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),Nr)]),[zr(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),Dt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,A,f])))]);this.program.push(g,m,x,T,v);let D=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),X=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(V))]),void 0,this.ids.undefinedValue)),Ae=n.createPropertyAssignment(this.ids.bodyProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),I=n.createVariableStatement(void 0,Q(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier("fetch"),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,Oe)]),n.createObjectLiteralExpression([D,X,Ae])])))),Me=n.createVariableStatement(void 0,Q(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),at=n.createVariableStatement(void 0,Q(this.ids.searchParamsConst,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createStringLiteral(""),void 0,n.createTemplateExpression(n.createTemplateHead("?"),[n.createTemplateSpan(n.createNewExpression(n.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),Oe)])))),[Pe,Ne]=["json","text"].map(b=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,b),void 0,void 0))),pt=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(Et,[n.createTemplateSpan(this.ids.methodParameter,It),n.createTemplateSpan(this.ids.pathParameter,Oe)]),N.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([Pe])),_r=n.createVariableStatement(J,Q(this.ids.exampleImplementationConst,Dt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([Me,at,I,pt,Ne])),n.createTypeReferenceNode(this.ids.implementationType))),Vr=n.createExpressionStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[n.createStringLiteral("get"),n.createStringLiteral("/v1/user/retrieve"),n.createObjectLiteralExpression([n.createPropertyAssignment("id",n.createStringLiteral("10"))])])),Gr=n.createVariableStatement(void 0,Q(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(_r,Gr,Vr)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Lt(r,t)).join(`
19
+ `):void 0}print(t){let r=this.printUsage(t),o=r&&N.default.addSyntheticLeadingComment(N.default.addSyntheticLeadingComment(n.createEmptyStatement(),N.default.SyntaxKind.SingleLineCommentTrivia," Usage example:"),N.default.SyntaxKind.MultiLineCommentTrivia,`
20
+ ${r}`);return this.program.concat(o||[]).map((s,i)=>Lt(s,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
40
21
 
41
- const client = new ExpressZodAPIClient(exampleImplementation);
42
- client.provide("get", "/v1/user/retrieve", { id: "10" });
43
- `,!0),this.agg.push(g,l,h,x,E)}print(t){return this.agg.map(r=>Ir(r,t)).join(`
44
-
45
- `)}};var Ct={};Nt(Ct,{dateIn:()=>xn,dateOut:()=>Tn,file:()=>gn,raw:()=>bn,upload:()=>hn});var vr=require("zod");var C=require("zod");var yn="ZodDateOut",et=class e extends C.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==C.ZodParsedType.date?((0,C.addIssueToContext)(o,{code:C.ZodIssueCode.invalid_type,expected:C.ZodParsedType.date,received:o.parsedType}),C.INVALID):Me(o.data)?{status:r.value,value:o.data.toISOString()}:((0,C.addIssueToContext)(o,{code:C.ZodIssueCode.invalid_date}),C.INVALID)}static create=()=>new e({typeName:yn})};var gn=M.create,hn=pe.create,xn=Be.create,Tn=et.create,bn=()=>vr.z.object({raw:M.create().buffer()});0&&(module.exports={AbstractEndpoint,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,MissingPeerError,OutputValidationError,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createLogger,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});
22
+ `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await se("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let s=this.printUsage(t);this.usage=s&&o?[await o(s)]:this.usage;let i=this.print(t);return o?o(i):i}};var Ut={};$t(Ut,{dateIn:()=>vn,dateOut:()=>Mn,file:()=>Cn,raw:()=>Nn,upload:()=>wn});var $r=require("zod");var Z=require("zod");var Zn="ZodDateOut",it=class e extends Z.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==Z.ZodParsedType.date?((0,Z.addIssueToContext)(o,{code:Z.ZodIssueCode.invalid_type,expected:Z.ZodParsedType.date,received:o.parsedType}),Z.INVALID):Ue(o.data)?{status:r.value,value:o.data.toISOString()}:((0,Z.addIssueToContext)(o,{code:Z.ZodIssueCode.invalid_date}),Z.INVALID)}static create=()=>new e({typeName:Zn})};var Cn=z.create,wn=me.create,vn=Ye.create,Mn=it.create,Nn=()=>$r.z.object({raw:z.create().buffer()});0&&(module.exports={AbstractEndpoint,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,MissingPeerError,OutputValidationError,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createLogger,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});
package/dist/index.d.cts CHANGED
@@ -9,7 +9,7 @@ import { ListenOptions } from 'node:net';
9
9
  import * as qs from 'qs';
10
10
  import * as express_serve_static_core from 'express-serve-static-core';
11
11
  import http from 'node:http';
12
- import { ReferenceObject, SchemaObject, OpenApiBuilder, SecuritySchemeType, SecuritySchemeObject } from 'openapi3-ts/oas30';
12
+ import { ReferenceObject, SchemaObject, OpenApiBuilder, SecuritySchemeType, SecuritySchemeObject } from 'openapi3-ts/oas31';
13
13
  import ts from 'typescript';
14
14
 
15
15
  type LogicalOr<T> = {
@@ -904,15 +904,54 @@ interface IntegrationParams {
904
904
  withUndefined?: boolean;
905
905
  };
906
906
  }
907
+ interface FormattedPrintingOptions {
908
+ /** @desc Typescript printer options */
909
+ printerOptions?: ts.PrinterOptions;
910
+ /**
911
+ * @desc Typescript code formatter
912
+ * @default prettier.format
913
+ * */
914
+ format?: (program: string) => Promise<string>;
915
+ }
907
916
  declare class Integration {
908
- protected agg: ts.Node[];
917
+ protected program: ts.Node[];
918
+ protected usage: Array<ts.Node | string>;
909
919
  protected registry: Registry;
910
920
  protected paths: string[];
911
921
  protected aliases: Record<string, ts.TypeAliasDeclaration>;
922
+ protected ids: {
923
+ pathType: ts.Identifier;
924
+ methodType: ts.Identifier;
925
+ methodPathType: ts.Identifier;
926
+ inputInterface: ts.Identifier;
927
+ responseInterface: ts.Identifier;
928
+ jsonEndpointsConst: ts.Identifier;
929
+ endpointTagsConst: ts.Identifier;
930
+ providerType: ts.Identifier;
931
+ implementationType: ts.Identifier;
932
+ clientClass: ts.Identifier;
933
+ keyParameter: ts.Identifier;
934
+ pathParameter: ts.Identifier;
935
+ paramsArgument: ts.Identifier;
936
+ methodParameter: ts.Identifier;
937
+ accumulator: ts.Identifier;
938
+ provideMethod: ts.Identifier;
939
+ implementationArgument: ts.Identifier;
940
+ headersProperty: ts.Identifier;
941
+ hasBodyConst: ts.Identifier;
942
+ undefinedValue: ts.Identifier;
943
+ bodyProperty: ts.Identifier;
944
+ responseConst: ts.Identifier;
945
+ searchParamsConst: ts.Identifier;
946
+ exampleImplementationConst: ts.Identifier;
947
+ clientConst: ts.Identifier;
948
+ };
912
949
  protected getAlias(name: string): ts.TypeReferenceNode | undefined;
913
950
  protected makeAlias(name: string, type: ts.TypeNode): ts.TypeReferenceNode;
914
951
  constructor({ routing, variant, serializer, optionalPropStyle, }: IntegrationParams);
952
+ protected printUsage(printerOptions?: ts.PrinterOptions): string | undefined;
915
953
  print(printerOptions?: ts.PrinterOptions): string;
954
+ printFormatted({ printerOptions, format: userDefined, }?: FormattedPrintingOptions): Promise<string>;
916
955
  }
917
956
 
918
957
  declare const file: () => ZodFile<string>;
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@ import { ListenOptions } from 'node:net';
9
9
  import * as qs from 'qs';
10
10
  import * as express_serve_static_core from 'express-serve-static-core';
11
11
  import http from 'node:http';
12
- import { ReferenceObject, SchemaObject, OpenApiBuilder, SecuritySchemeType, SecuritySchemeObject } from 'openapi3-ts/oas30';
12
+ import { ReferenceObject, SchemaObject, OpenApiBuilder, SecuritySchemeType, SecuritySchemeObject } from 'openapi3-ts/oas31';
13
13
  import ts from 'typescript';
14
14
 
15
15
  type LogicalOr<T> = {
@@ -904,15 +904,54 @@ interface IntegrationParams {
904
904
  withUndefined?: boolean;
905
905
  };
906
906
  }
907
+ interface FormattedPrintingOptions {
908
+ /** @desc Typescript printer options */
909
+ printerOptions?: ts.PrinterOptions;
910
+ /**
911
+ * @desc Typescript code formatter
912
+ * @default prettier.format
913
+ * */
914
+ format?: (program: string) => Promise<string>;
915
+ }
907
916
  declare class Integration {
908
- protected agg: ts.Node[];
917
+ protected program: ts.Node[];
918
+ protected usage: Array<ts.Node | string>;
909
919
  protected registry: Registry;
910
920
  protected paths: string[];
911
921
  protected aliases: Record<string, ts.TypeAliasDeclaration>;
922
+ protected ids: {
923
+ pathType: ts.Identifier;
924
+ methodType: ts.Identifier;
925
+ methodPathType: ts.Identifier;
926
+ inputInterface: ts.Identifier;
927
+ responseInterface: ts.Identifier;
928
+ jsonEndpointsConst: ts.Identifier;
929
+ endpointTagsConst: ts.Identifier;
930
+ providerType: ts.Identifier;
931
+ implementationType: ts.Identifier;
932
+ clientClass: ts.Identifier;
933
+ keyParameter: ts.Identifier;
934
+ pathParameter: ts.Identifier;
935
+ paramsArgument: ts.Identifier;
936
+ methodParameter: ts.Identifier;
937
+ accumulator: ts.Identifier;
938
+ provideMethod: ts.Identifier;
939
+ implementationArgument: ts.Identifier;
940
+ headersProperty: ts.Identifier;
941
+ hasBodyConst: ts.Identifier;
942
+ undefinedValue: ts.Identifier;
943
+ bodyProperty: ts.Identifier;
944
+ responseConst: ts.Identifier;
945
+ searchParamsConst: ts.Identifier;
946
+ exampleImplementationConst: ts.Identifier;
947
+ clientConst: ts.Identifier;
948
+ };
912
949
  protected getAlias(name: string): ts.TypeReferenceNode | undefined;
913
950
  protected makeAlias(name: string, type: ts.TypeNode): ts.TypeReferenceNode;
914
951
  constructor({ routing, variant, serializer, optionalPropStyle, }: IntegrationParams);
952
+ protected printUsage(printerOptions?: ts.PrinterOptions): string | undefined;
915
953
  print(printerOptions?: ts.PrinterOptions): string;
954
+ printFormatted({ printerOptions, format: userDefined, }?: FormattedPrintingOptions): Promise<string>;
916
955
  }
917
956
 
918
957
  declare const file: () => ZodFile<string>;
package/dist/index.js CHANGED
@@ -1,45 +1,22 @@
1
- var Or=Object.defineProperty;var At=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var Sr=(e,t)=>{for(var r in t)Or(e,r,{get:t[r],enumerable:!0})};function Ar(e){return e}import $r from"assert/strict";import{z as H}from"zod";import{isHttpError as Lr}from"http-errors";import{createHash as Ur}from"crypto";import{z as P}from"zod";import{INVALID as Rt,ZodIssueCode as Be,ZodParsedType as Ae,ZodType as Rr,addIssueToContext as _e}from"zod";var Pr="ZodFile",Zr=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,I=class e extends Rr{_parse(t){let{status:r,ctx:o}=this._processInputParams(t),n=o.parsedType===Ae.string&&typeof o.data=="string";if(this.isString&&!n)return _e(o,{code:Be.invalid_type,expected:Ae.string,received:o.parsedType}),Rt;let s=o.parsedType===Ae.object&&Buffer.isBuffer(o.data);return this.isBuffer&&!s?(_e(o,{code:Be.invalid_type,expected:Ae.object,received:o.parsedType,message:"Expected Buffer"}),Rt):(n&&this.isBase64&&!Zr.test(o.data)&&(_e(o,{code:Be.custom,message:this._def.message||"Does not match base64 encoding"}),r.dirty()),{status:r.value,value:o.data})}string=t=>new e({...this._def,...ce(t),type:""});buffer=t=>new e({...this._def,...ce(t),type:Buffer.from([])});binary=t=>new e({...this._def,...ce(t),encoding:"binary"});base64=t=>new e({...this._def,...ce(t),encoding:"base64"});get isBinary(){return this._def.encoding==="binary"}get isBase64(){return this._def.encoding==="base64"}get isString(){return typeof this._def.type=="string"}get isBuffer(){return Buffer.isBuffer(this._def.type)}static create=()=>new e({typeName:Pr,type:""})};import{clone as Er,mergeDeepRight as Ir}from"ramda";var Z="expressZodApiMeta",Cr=e=>{let t=e.constructor,r=Er(e._def);return r[Z]=r[Z]||{examples:[]},new t(r)},D=e=>{let t=Cr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=D(t);return o._def[Z].examples.push(r),o}}}),t},Pt=e=>Z in e._def?typeof e._def[Z]=="object"&&e._def[Z]!==null:!1,Zt=(e,t)=>{if(!Pt(e))return;let r=e._def;return t in r[Z]?r[Z][t]:void 0},Re=(e,t)=>{if(!Pt(e))return t;let r=D(t),o=le(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(Ir({...n},{...s}));return r};var $="application/json",me="multipart/form-data",Et="application/octet-stream";import{INVALID as wr,OK as Nr,ZodIssueCode as vr,ZodParsedType as Mr,ZodType as Dr,addIssueToContext as zr}from"zod";var jr="ZodUpload",kr=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 Dr{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==Mr.object||!kr(r.data)?(zr(r,{code:vr.custom,message:`Expected file upload, received ${r.parsedType}`}),wr):Nr(r.data)}static create=()=>new e({typeName:jr})};var Hr=e=>{let r=(e.header("content-type")||"").slice(0,me.length).toLowerCase()===me;return"files"in e&&r},Pe={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Kr=["body","query","params"],Ge=e=>e.method.toLowerCase(),qe=e=>e.startsWith("x-"),Fr=e=>Object.entries(e.headers).reduce((t,[r,o])=>qe(r)?{...t,[r]:o}:t,{}),It=(e,t)=>{let r=Ge(e);if(r==="options")return{};let o=Kr;return r in Pe&&(o=Pe[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Hr(e):!0).reduce((n,s)=>({...n,...s==="headers"?Fr(e):e[s]}),{})},Ze=e=>!isNaN(e.getTime()),X=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),j=e=>e instanceof P.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof B?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Ee=e=>Lr(e)?e.statusCode:e instanceof L?400:500,Ve=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
1
+ var jr=Object.defineProperty;var jt=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var Lr=(e,t)=>{for(var r in t)jr(e,r,{get:t[r],enumerable:!0})};function kr(e){return e}import no from"assert/strict";import{z as F}from"zod";import{isHttpError as Xr}from"http-errors";import{createHash as eo}from"crypto";import{z as P}from"zod";import{INVALID as Lt,ZodIssueCode as Je,ZodParsedType as Ce,ZodType as Ur,addIssueToContext as Qe}from"zod";var Hr="ZodFile",Kr=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,C=class e extends Ur{_parse(t){let{status:r,ctx:o}=this._processInputParams(t),s=o.parsedType===Ce.string&&typeof o.data=="string";if(this.isString&&!s)return Qe(o,{code:Je.invalid_type,expected:Ce.string,received:o.parsedType}),Lt;let i=o.parsedType===Ce.object&&Buffer.isBuffer(o.data);return this.isBuffer&&!i?(Qe(o,{code:Je.invalid_type,expected:Ce.object,received:o.parsedType,message:"Expected Buffer"}),Lt):(s&&this.isBase64&&!Kr.test(o.data)&&(Qe(o,{code:Je.custom,message:this._def.message||"Does not match base64 encoding"}),r.dirty()),{status:r.value,value:o.data})}string=t=>new e({...this._def,...ye(t),type:""});buffer=t=>new e({...this._def,...ye(t),type:Buffer.from([])});binary=t=>new e({...this._def,...ye(t),encoding:"binary"});base64=t=>new e({...this._def,...ye(t),encoding:"base64"});get isBinary(){return this._def.encoding==="binary"}get isBase64(){return this._def.encoding==="base64"}get isString(){return typeof this._def.type=="string"}get isBuffer(){return Buffer.isBuffer(this._def.type)}static create=()=>new e({typeName:Hr,type:""})};import{clone as Fr,mergeDeepRight as Br}from"ramda";var R="expressZodApiMeta",$r=e=>{let t=e.constructor,r=Fr(e._def);return r[R]=r[R]||{examples:[]},new t(r)},z=e=>{let t=$r(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=z(t);return o._def[R].examples.push(r),o}}}),t},kt=e=>R in e._def?typeof e._def[R]=="object"&&e._def[R]!==null:!1,Ut=(e,t)=>{if(!kt(e))return;let r=e._def;return t in r[R]?r[R][t]:void 0},we=(e,t)=>{if(!kt(e))return t;let r=z(t),o=ge(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[s,i]of o.value)r._def[R].examples.push(Br({...s},{...i}));return r};var j="application/json",he="multipart/form-data",Ht="application/octet-stream";import{INVALID as _r,OK as Vr,ZodIssueCode as Gr,ZodParsedType as qr,ZodType as Wr,addIssueToContext as Yr}from"zod";var 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",re=class e extends Wr{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==qr.object||!Qr(r.data)?(Yr(r,{code:Gr.custom,message:`Expected file upload, received ${r.parsedType}`}),_r):Vr(r.data)}static create=()=>new e({typeName:Jr})};var to=e=>{let r=(e.header("content-type")||"").slice(0,he.length).toLowerCase()===he;return"files"in e&&r},ve={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},ro=["body","query","params"],Xe=e=>e.method.toLowerCase(),et=e=>e.startsWith("x-"),oo=e=>Object.entries(e.headers).reduce((t,[r,o])=>et(r)?{...t,[r]:o}:t,{}),Kt=(e,t)=>{let r=Xe(e);if(r==="options")return{};let o=ro;return r in ve&&(o=ve[r]),t&&r in t&&(o=t[r]||o),o.filter(s=>s==="files"?to(e):!0).reduce((s,i)=>({...s,...i==="headers"?oo(e):e[i]}),{})},Me=e=>!isNaN(e.getTime()),oe=e=>e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`),k=e=>e instanceof P.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof G?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message,Ne=e=>Xr(e)?e.statusCode:e instanceof H?400:500,tt=({logger:e,request:t,input:r,error:o,statusCode:s})=>{s===500&&e.error(`Internal server error
2
2
  ${o.stack}
3
- `,{url:t.url,payload:r})},k=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=Zt(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},le=(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}},ue=e=>e.reduce((t,r)=>t||r,!1),z=e=>e instanceof P.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof P.ZodUnion?ue(e.options.map(z)):e instanceof P.ZodIntersection?ue([e._def.left,e._def.right].map(z)):!1,C=({subject:e,condition:t,maxDepth:r,depth:o=1})=>{if(t(e))return!0;if(r!==void 0&&o>=r)return!1;let n={condition:t,maxDepth:r,depth:o+1};return e instanceof P.ZodObject?ue(Object.values(e.shape).map(s=>C({subject:s,...n}))):e instanceof P.ZodUnion?ue(e.options.map(s=>C({subject:s,...n}))):e instanceof P.ZodIntersection?ue([e._def.left,e._def.right].map(s=>C({subject:s,...n}))):e instanceof P.ZodOptional||e instanceof P.ZodNullable?C({subject:e.unwrap(),...n}):e instanceof P.ZodEffects||e instanceof P.ZodTransformer?C({subject:e.innerType(),...n}):e instanceof P.ZodRecord?C({subject:e.valueSchema,...n}):e instanceof P.ZodArray?C({subject:e.element,...n}):e instanceof P.ZodDefault?C({subject:e._def.innerType,...n}):!1},Ct=e=>C({subject:e,condition:t=>t instanceof Q}),ee=e=>C({subject:e,condition:t=>t instanceof I,maxDepth:3}),fe=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,N=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Ie=e=>Ur("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ce=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},ce=e=>typeof e=="string"?{message:e}:e||{};var te=class extends Error{name="RoutingError"},E=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
- Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},U=class extends Error{name="IOSchemaError"},B=class extends U{name="OutputValidationError";originalError;constructor(t){super(j(t)),this.originalError=t}},L=class extends U{name="InputValidationError";originalError;constructor(t){super(j(t)),this.originalError=t}},re=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},oe=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var wt=e=>typeof e=="object"&&e!==null,_=e=>wt(e)&&"or"in e,G=e=>wt(e)&&"and"in e,we=e=>({and:e.reduce((t,r)=>t.concat(G(r)?r.and:r),[])}),Ne=(e,t)=>G(e)?{and:e.and.map(r=>_(r)?{or:r.or.map(t)}:t(r))}:_(e)?{or:e.or.map(r=>G(r)?{and:r.and.map(t)}:t(r))}:t(e),We=e=>e.and.reduce((t,r)=>{let o=le(t.or,_(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(we),t},{or:[]}),ne=(e,t)=>{if(G(e))return G(t)?we([e,t]):_(t)?ne(We(e),t):we([e,t]);if(_(e)){if(G(t))return ne(t,e);if(_(t)){let{type:r,value:o}=le(e.or,t.or);return{or:r==="single"?o:o.map(we)}}return ne(e,{and:[t]})}return G(t)||_(t)?ne(t,e):{and:[e,t]}};import{z as w}from"zod";var se={positive:200,negative:400},Ye=e=>e,ye=Ye({getPositiveResponse:e=>{let t=k({schema:e}),r=D(w.object({status:w.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>D(w.object({status:w.literal("error"),error:w.object({message:w.string()})})).example({status:"error",error:{message:j(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(se.positive).json({status:"success",data:r});return}let a=Ee(e);Ve({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:j(e)}})}}),Je=Ye({getPositiveResponse:e=>{let t=k({schema:e}),r=D("shape"in e&&"items"in e.shape&&e.shape.items instanceof w.ZodArray?e.shape.items:w.array(w.any()));return t.reduce((o,n)=>typeof n=="object"&&n!==null&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},getNegativeResponse:()=>D(w.string()).example(j(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Ee(r);Ve({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),ve=({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 Nt=(e,t=[$])=>{if(e instanceof H.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},ie=class{},Me=class extends ie{#e;#r;#o;#n;#s;#i;#a;#t;#p;#d;#c;#l=[];constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:u,shortDescription:g}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:h,schema:x})=>{$r(!z(x),new U(`Using transformations on the top level of endpoint ${h} is not allowed.`))}),this.#i=n,this.#a=s,this.#o=d,this.#c=a,this.#r=t,this.#p=p,this.#d=c,this.#e={long:u,short:g};let l={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.#n={input:Ct(r)?[me]:ee(r)?[Et]:[$],positive:Nt(l.positive),negative:Nt(l.negative)},this.#t={input:r,output:o,positive:l.positive instanceof H.ZodType?l.positive:l.positive.schema,negative:l.negative instanceof H.ZodType?l.negative:l.negative.schema},this.#s={positive:l.positive instanceof H.ZodType?se.positive:l.positive.statusCode||se.positive,negative:l.negative instanceof H.ZodType?se.negative:l.negative.statusCode||se.negative}}_setSiblingMethods(t){this.#l=t}getDescription(t){return this.#e[t]}getMethods(){return this.#r}getSchema(t){return this.#t[t]}getMimeTypes(t){return this.#n[t]}getStatusCode(t){return this.#s[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?ne(t,r.security):t,{and:[]})}getScopes(){return this.#p}getTags(){return this.#d}getOperationId(t){return this.#c(t)}#m(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#r.concat(this.#l).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#t.output.parseAsync(t)}catch(r){throw r instanceof H.ZodError?new B(r):r}}async#f({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.#o){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(u){throw u instanceof H.ZodError?new L(u):u}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#t.input.parseAsync(t)}catch(s){throw s instanceof H.ZodError?new L(s):s}return this.#i({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.#a.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){ve({logger:n,response:o,error:new re(X(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=Ge(t),a=null,p=null;if(n.cors){let c=this.#m();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let u in c)r.set(u,c[u])}let d=It(t,n.inputSources);try{let{options:c,isStreamClosed:u}=await this.#f({method:s,input:d,request:t,response:r,logger:o});if(u)return;if(s==="options"){r.status(200).end();return}a=await this.#u(await this.#y({input:d,options:c,logger:o}))}catch(c){p=X(c)}await this.#g({input:d,output:a,request:t,response:r,error:p,logger:o})}};import{z as Mt}from"zod";var vt=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Re(s,n),o)};import Br from"assert/strict";var Qe=e=>(Br(!z(e.input),new U("Using transformations on the top level of middleware input schema is not allowed.")),{...e,type:"proprietary"});var ge=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:Mt.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,g=>{if(g&&g instanceof Error)return c(o(g));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(Qe({input:Mt.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:s,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,u="methods"in p?p.methods:[p.method],g=typeof a=="function"?a:()=>a,l="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],h="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Me({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:l,tags:h,methods:u,getOperationId:g,description:n,shortDescription:s,inputSchema:vt(d,t)})}},_r=new ge(ye),Gr=new ge(Je);import{inspect as qr}from"util";var Dt=e=>typeof e=="object"&&e!==null&&"level"in e&&("color"in e?typeof e.color=="boolean":!0)&&typeof e.level=="string"&&["silent","warn","debug"].includes(e.level),Xe=({winston:{createLogger:e,transports:t,format:{printf:r,timestamp:o,colorize:n,combine:s},config:{npm:a}},...p})=>{let d=l=>{let{[Symbol.for("level")]:h,[Symbol.for("message")]:x,[Symbol.for("splat")]:T,...A}=l;return qr(A,!1,1,p.color)},c=l=>r(({timestamp:h,message:x,level:T,durationMs:A,...m})=>{typeof x=="object"&&(m={...m,...x},x="[No message]");let b=Object.keys(m).length>0,R=[];A&&R.push("duration:",`${A}ms`);let M=l?d:JSON.stringify;if(b)R.push(M(m));else{let J=m?.[Symbol.for("splat")];Array.isArray(J)&&R.push(...J.map(S=>typeof S=="object"?M(S):S))}return[h,`${T}:`,x,...R].join(" ")}),u=[o()],g={handleExceptions:!0};switch(p.color&&u.push(n()),p.level){case"debug":g.level="debug",u.push(c(!0));break;case"silent":case"warn":default:g.level="warn",u.push(c())}return g.format=s(...u),e({silent:p.level==="silent",levels:a.levels,transports:[new t.Console(g)],exitOnError:!1})};var he=class{constructor(t){this.endpoints=t}};import Vr from"express";var xe=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Vr.static(...this.params))}};import Lt from"express";import Wr from"http";import Yr from"https";var Te=async(e,t="default")=>{try{return(await import(e))[t]}catch{}try{return await Promise.resolve().then(()=>At(e)[t])}catch{}throw new oe(e)},zt=async e=>{for(let{moduleName:t,moduleExport:r}of e)try{return await Te(t,r)}catch{}throw new oe(e.map(({moduleName:t})=>t))};import jt from"assert/strict";var q=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{s=s.trim(),jt.doesNotMatch(s,/\//,new te(`The entry '${s}' must avoid having slashes \u2014 use nesting instead.`));let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof ie){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof xe)r&&a.apply(p,r);else if(a instanceof he){if(Object.entries(a.endpoints).forEach(([d,c])=>{jt(c.getMethods().includes(d),new te(`Endpoint assigned to ${d} method of ${p} must support ${d} method.`)),t(c,p,d)}),n&&Object.keys(a.endpoints).length>0){let[d,...c]=Object.keys(a.endpoints),u=a.endpoints[d];u._setSiblingMethods(c),t(u,p,"options")}}else q({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var kt=()=>`
6
- \x1B[94m\x1B[39m
7
- \x1B[94m\x1B[39m
3
+ `,{url:t.url,payload:r})},U=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=Ut(e,"examples")||[];if(!r&&t==="original")return o;let s=[];for(let i of o){let a=e.safeParse(i);a.success&&s.push(t==="parsed"?a.data:i)}return s},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 s of t)r.push([o,s]);return{type:"tuple",value:r}},xe=e=>e.reduce((t,r)=>t||r,!1),L=e=>e instanceof P.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof P.ZodUnion?xe(e.options.map(L)):e instanceof P.ZodIntersection?xe([e._def.left,e._def.right].map(L)):!1,v=({subject:e,condition:t,maxDepth:r,depth:o=1})=>{if(t(e))return!0;if(r!==void 0&&o>=r)return!1;let s={condition:t,maxDepth:r,depth:o+1};return e instanceof P.ZodObject?xe(Object.values(e.shape).map(i=>v({subject:i,...s}))):e instanceof P.ZodUnion?xe(e.options.map(i=>v({subject:i,...s}))):e instanceof P.ZodIntersection?xe([e._def.left,e._def.right].map(i=>v({subject:i,...s}))):e instanceof P.ZodOptional||e instanceof P.ZodNullable?v({subject:e.unwrap(),...s}):e instanceof P.ZodEffects||e instanceof P.ZodTransformer?v({subject:e.innerType(),...s}):e instanceof P.ZodRecord?v({subject:e.valueSchema,...s}):e instanceof P.ZodArray?v({subject:e.element,...s}):e instanceof P.ZodDefault?v({subject:e._def.innerType,...s}):!1},Ft=e=>v({subject:e,condition:t=>t instanceof re}),ne=e=>v({subject:e,condition:t=>t instanceof C,maxDepth:3}),Te=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,N=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).flatMap(o=>o.replaceAll(/[A-Z]+/g,s=>`/${s}`).split("/")).map(o=>o.charAt(0).toUpperCase()+o.slice(1).toLowerCase()).join(""),De=e=>eo("sha1").update(JSON.stringify(e),"utf8").digest("hex"),ze=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},ye=e=>typeof e=="string"?{message:e}:e||{};var se=class extends Error{name="RoutingError"},I=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:s}){let i=`${t}
4
+ Caused by ${s?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(i)}},K=class extends Error{name="IOSchemaError"},G=class extends K{name="OutputValidationError";originalError;constructor(t){super(k(t)),this.originalError=t}},H=class extends K{name="InputValidationError";originalError;constructor(t){super(k(t)),this.originalError=t}},ie=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}},ae=class extends Error{name="MissingPeerError";constructor(t){let r=Array.isArray(t);super(`Missing ${r?"one of the following peer dependencies":"peer dependency"}: ${r?t.join(" | "):t}. Please install it to use the feature.`)}};var Bt=e=>typeof e=="object"&&e!==null,q=e=>Bt(e)&&"or"in e,W=e=>Bt(e)&&"and"in e,je=e=>({and:e.reduce((t,r)=>t.concat(W(r)?r.and:r),[])}),Le=(e,t)=>W(e)?{and:e.and.map(r=>q(r)?{or:r.or.map(t)}:t(r))}:q(e)?{or:e.or.map(r=>W(r)?{and:r.and.map(t)}:t(r))}:t(e),rt=e=>e.and.reduce((t,r)=>{let o=ge(t.or,q(r)?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(je),t},{or:[]}),pe=(e,t)=>{if(W(e))return W(t)?je([e,t]):q(t)?pe(rt(e),t):je([e,t]);if(q(e)){if(W(t))return pe(t,e);if(q(t)){let{type:r,value:o}=ge(e.or,t.or);return{or:r==="single"?o:o.map(je)}}return pe(e,{and:[t]})}return W(t)||q(t)?pe(t,e):{and:[e,t]}};import{z as M}from"zod";var de={positive:200,negative:400},ot=e=>e,be=ot({getPositiveResponse:e=>{let t=U({schema:e}),r=z(M.object({status:M.literal("success"),data:e}));return t.reduce((o,s)=>o.example({status:"success",data:s}),r)},getNegativeResponse:()=>z(M.object({status:M.literal("error"),error:M.object({message:M.string()})})).example({status:"error",error:{message:k(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:s,logger:i})=>{if(!e){s.status(de.positive).json({status:"success",data:r});return}let a=Ne(e);tt({logger:i,statusCode:a,request:o,error:e,input:t}),s.status(a).json({status:"error",error:{message:k(e)}})}}),nt=ot({getPositiveResponse:e=>{let t=U({schema:e}),r=z("shape"in e&&"items"in e.shape&&e.shape.items instanceof M.ZodArray?e.shape.items:M.array(M.any()));return t.reduce((o,s)=>typeof s=="object"&&s!==null&&"items"in s&&Array.isArray(s.items)?o.example(s.items):o,r)},getNegativeResponse:()=>z(M.string()).example(k(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:s,input:i})=>{if(r){let a=Ne(r);tt({logger:o,statusCode:a,request:s,error:r,input:i}),e.status(a).send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),ke=({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 $t=(e,t=[j])=>{if(e instanceof F.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},ce=class{},Ue=class extends ce{#e;#r;#o;#n;#s;#i;#a;#t;#p;#d;#c;#m=[];constructor({methods:t,inputSchema:r,outputSchema:o,handler:s,resultHandler:i,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:l,shortDescription:g}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:x,schema:T})=>{no(!L(T),new K(`Using transformations on the top level of endpoint ${x} is not allowed.`))}),this.#i=s,this.#a=i,this.#o=d,this.#c=a,this.#r=t,this.#p=p,this.#d=c,this.#e={long:l,short:g};let m={positive:i.getPositiveResponse(o),negative:i.getNegativeResponse()};this.#n={input:Ft(r)?[he]:ne(r)?[Ht]:[j],positive:$t(m.positive),negative:$t(m.negative)},this.#t={input:r,output:o,positive:m.positive instanceof F.ZodType?m.positive:m.positive.schema,negative:m.negative instanceof F.ZodType?m.negative:m.negative.schema},this.#s={positive:m.positive instanceof F.ZodType?de.positive:m.positive.statusCode||de.positive,negative:m.negative instanceof F.ZodType?de.negative:m.negative.statusCode||de.negative}}_setSiblingMethods(t){this.#m=t}getDescription(t){return this.#e[t]}getMethods(){return this.#r}getSchema(t){return this.#t[t]}getMimeTypes(t){return this.#n[t]}getStatusCode(t){return this.#s[t]}getSecurity(){return this.#o.reduce((t,r)=>r.security?pe(t,r.security):t,{and:[]})}getScopes(){return this.#p}getTags(){return this.#d}getOperationId(t){return this.#c(t)}#l(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#r.concat(this.#m).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#t.output.parseAsync(t)}catch(r){throw r instanceof F.ZodError?new G(r):r}}async#f({method:t,input:r,request:o,response:s,logger:i}){let a={},p=!1;for(let d of this.#o){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(l){throw l instanceof F.ZodError?new H(l):l}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:s,logger:i})),p="writableEnded"in s&&s.writableEnded,p){i.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#y({input:t,options:r,logger:o}){let s;try{s=await this.#t.input.parseAsync(t)}catch(i){throw i instanceof F.ZodError?new H(i):i}return this.#i({input:s,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:s,input:i,output:a}){try{await this.#a.handler({error:t,output:a,request:r,response:o,logger:s,input:i})}catch(p){ke({logger:s,response:o,error:new ie(oe(p).message,t)})}}async execute({request:t,response:r,logger:o,config:s}){let i=Xe(t),a=null,p=null;if(s.cors){let c=this.#l();typeof s.cors=="function"&&(c=await s.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let l in c)r.set(l,c[l])}let d=Kt(t,s.inputSources);try{let{options:c,isStreamClosed:l}=await this.#f({method:i,input:d,request:t,response:r,logger:o});if(l)return;if(i==="options"){r.status(200).end();return}a=await this.#u(await this.#y({input:d,options:c,logger:o}))}catch(c){p=oe(c)}await this.#g({input:d,output:a,request:t,response:r,error:p,logger:o})}};import{z as Vt}from"zod";var _t=(e,t)=>{let r=e.map(({input:s})=>s).concat(t),o=r.reduce((s,i)=>s.and(i));return r.reduce((s,i)=>we(i,s),o)};import so from"assert/strict";var st=e=>(so(!L(e.input),new K("Using transformations on the top level of middleware input schema is not allowed.")),{...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),s=r?.provider||(()=>({})),i={type:"express",input:Vt.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,g=>{if(g&&g instanceof Error)return c(o(g));d(s(a,p))})})};return e.#e(this.middlewares.concat(i),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(st({input:Vt.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,description:s,shortDescription:i,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,l="methods"in p?p.methods:[p.method],g=typeof a=="function"?a:()=>a,m="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],x="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Ue({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:m,tags:x,methods:l,getOperationId:g,description:s,shortDescription:i,inputSchema:_t(d,t)})}},io=new Se(be),ao=new Se(nt);import{inspect as po}from"util";var Gt=e=>typeof e=="object"&&e!==null&&"level"in e&&("color"in e?typeof e.color=="boolean":!0)&&typeof e.level=="string"&&["silent","warn","debug"].includes(e.level),it=({winston:{createLogger:e,transports:t,format:{printf:r,timestamp:o,colorize:s,combine:i},config:{npm:a}},...p})=>{let d=m=>{let{[Symbol.for("level")]:x,[Symbol.for("message")]:T,[Symbol.for("splat")]:h,...S}=m;return po(S,!1,1,p.color)},c=m=>r(({timestamp:x,message:T,level:h,durationMs:S,...f})=>{typeof T=="object"&&(f={...f,...T},T="[No message]");let E=Object.keys(f).length>0,Z=[];S&&Z.push("duration:",`${S}ms`);let V=m?d:JSON.stringify;if(E)Z.push(V(f));else{let ue=f?.[Symbol.for("splat")];Array.isArray(ue)&&Z.push(...ue.map(A=>typeof A=="object"?V(A):A))}return[x,`${h}:`,T,...Z].join(" ")}),l=[o()],g={handleExceptions:!0};switch(p.color&&l.push(s()),p.level){case"debug":g.level="debug",l.push(c(!0));break;case"silent":case"warn":default:g.level="warn",l.push(c())}return g.format=i(...l),e({silent:p.level==="silent",levels:a.levels,transports:[new t.Console(g)],exitOnError:!1})};var Oe=class{constructor(t){this.endpoints=t}};import co from"express";var Ae=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,co.static(...this.params))}};import Jt from"express";import mo from"http";import lo from"https";var Y=async(e,t="default")=>{try{return(await import(e))[t]}catch{}try{return await Promise.resolve().then(()=>jt(e)[t])}catch{}throw new ae(e)},qt=async e=>{for(let{moduleName:t,moduleExport:r}of e)try{return await Y(t,r)}catch{}throw new ae(e.map(({moduleName:t})=>t))};import Wt from"assert/strict";var J=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:s})=>{Object.entries(e).forEach(([i,a])=>{i=i.trim(),Wt.doesNotMatch(i,/\//,new se(`The entry '${i}' must avoid having slashes \u2014 use nesting instead.`));let p=`${o||""}${i?`/${i}`:""}`;if(a instanceof ce){let d=a.getMethods().slice();s&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof Ae)r&&a.apply(p,r);else if(a instanceof Oe){if(Object.entries(a.endpoints).forEach(([d,c])=>{Wt(c.getMethods().includes(d),new se(`Endpoint assigned to ${d} method of ${p} must support ${d} method.`)),t(c,p,d)}),s&&Object.keys(a.endpoints).length>0){let[d,...c]=Object.keys(a.endpoints),l=a.endpoints[d];l._setSiblingMethods(c),t(l,p,"options")}}else J({onEndpoint:t,onStatic:r,hasCors:s,routing:a,parentPath:p})})};var Yt=()=>`
8
6
  \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
9
- \x1B[94m888 d88P 888 d88888 888 Y88b 888\x1B[39m\x1B[95m\x1B[39m
7
+ \x1B[94m888 d88P 888 d88888 888 Y88b 888\x1B[39m
10
8
  \x1B[95m888 d88P 888 d88P888 888 888 888\x1B[39m
11
- \x1B[95m8888888 888 888 88888b. 888d888 .d88b. .d8888b .d8888b d88P .d88b. .d88888 d88P 888 888 d88P 888\x1B[39m\x1B[97m\x1B[39m
12
- \x1B[97m888 \`Y8bd8P' 888 "88b 888P" d8P Y8b 88K 88K d88P d88""88b d88" 888 d88P 888 8888888P" 888 \x1B[39m
13
- \x1B[97m888 X88K 888 888 888 88888888 "Y8888b. "Y8888b. d88P 888 888 888 888 d88P 888 888 888\x1B[39m\x1B[95m\x1B[39m
14
- \x1B[95m888 .d8""8b. 888 d88P 888 Y8b. X88 X88 d88P Y88..88P Y88b 888 d8888888888 888 888 \x1B[39m
15
- \x1B[95m8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P' d8888888888 "Y88P" "Y88888 d88P 888 888 8888888\x1B[39m\x1B[94m\x1B[39m
9
+ \x1B[95m8888888 888 888 88888b. 888d888 .d88b. .d8888b .d8888b d88P .d88b. .d88888 d88P 888 888 d88P 888\x1B[39m
10
+ \x1B[97m888 \u1FEFY8bd8P' 888 "88b 888P" d8P Y8b 88K 88K d88P d88""88b d88" 888 d88P 888 8888888P" 888 \x1B[39m
11
+ \x1B[97m888 X88K 888 888 888 88888888 "Y8888b. "Y8888b. d88P 888 888 888 888 d88P 888 888 888\x1B[39m
12
+ \x1B[95m888 .d8""8b. 888 d88P 888 Y8b. X88 X88 d88P Y88..88P Y88b 888 d8888888888 888 888\x1B[39m
13
+ \x1B[95m8888888888 888 888 88888P" 888 "Y8888 88888P' 88888P' d8888888888 "Y88P" "Y88888 d88P 888 888 8888888\x1B[39m
16
14
  \x1B[94m 888\x1B[39m
17
15
  \x1B[94m 888\x1B[3m Proudly supports transgender community.\x1B[23m\x1B[39m
18
- \x1B[94m\x1B[3mfor Vika \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
19
- \x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
20
- \x1B[0m\x1B[0m
21
- \x1B[0m\x1B[0m
22
- `.trim();var et=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(kt()),q({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 Ut from"http-errors";var Jr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:Ut(400,X(r).message),request:o,response:n,logger:t,input:null,output:null})},Qr=(e,t)=>(r,o)=>{let n=Ut(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){ve({response:o,logger:t,error:new re(X(s).message,n)})}},Ht=async e=>{let t=Dt(e.logger)?Xe({...e.logger,winston:await Te("winston")}):e.logger,r=e.errorHandler||ye,o=Qr(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},Xr=async(e,t)=>{let{logger:r,notFoundHandler:o}=await Ht(e);return et({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},eo=async(e,t)=>{let r=Lt().disable("x-powered-by");if(e.server.compression){let d=await Te("compression");r.use(d(typeof e.server.compression=="object"?e.server.compression:void 0))}if(r.use(e.server.jsonParser||Lt.json()),e.server.upload){let d=await Te("express-fileupload");r.use(d({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}))}e.server.rawParser&&(r.use(e.server.rawParser),r.use((d,{},c)=>{Buffer.isBuffer(d.body)&&(d.body={raw:d.body}),c()}));let{logger:o,errorHandler:n,notFoundHandler:s}=await Ht(e);r.use(Jr(n,o)),et({app:r,routing:t,logger:o,config:e}),r.use(s);let a=(d,c)=>d.listen(c,()=>{o.info("Listening",c)}),p={httpServer:a(Wr.createServer(r),e.server.listen),httpsServer:e.https?a(Yr.createServer(e.https.options,r),e.https.listen):void 0};return{app:r,...p,logger:o}};import $o from"assert/strict";import{OpenApiBuilder as Bo}from"openapi3-ts/oas30";import ae from"assert/strict";import{isReferenceObject as _t,isSchemaObject as Se}from"openapi3-ts/oas30";import{omit as Oe}from"ramda";import{z as O}from"zod";import{INVALID as Kt,ZodIssueCode as tt,ZodParsedType as Ft,ZodType as to,addIssueToContext as rt}from"zod";var ot=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,ro="ZodDateIn",De=class e extends to{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==Ft.string)return rt(o,{code:tt.invalid_type,expected:Ft.string,received:o.parsedType}),Kt;ot.test(o.data)||(rt(o,{code:tt.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ze(n)?{status:r.value,value:n}:(rt(o,{code:tt.invalid_date}),Kt)}static create=()=>new e({typeName:ro})};var V=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,a=n,d=s?s({schema:e,...a,next:u=>V({...u,...a,onEach:t,rules:r,onMissing:o})}):o({schema:e,...a}),c=t&&t({schema:e,prev:d,...a});return c?{...d,...c}:d};var $t=50,Gt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",oo={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},qt=/:([A-Za-z0-9_]+)/g,Vt=e=>{let t=e.match(qt);return t?t.map(r=>r.slice(1)):[]},Wt=e=>e.replace(qt,t=>`{${t.slice(1)}}`),no=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),so=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),io=()=>({format:"any"}),ao=e=>(ae(!e.isResponse,new E({message:"Please use z.upload() only for input.",...e})),{type:"string",format:"binary"}),po=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||e?"binary":t?"byte":"file"}),co=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),lo=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),mo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),uo=({schema:e,next:t})=>t({schema:e.unwrap()}),fo=({schema:e,next:t})=>t({schema:e._def.innerType}),yo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Bt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),go=({schema:{value:e}})=>({type:typeof e,enum:[e]}),ho=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&fe(s)?s instanceof O.ZodOptional:s.isOptional())});return{type:"object",properties:ze({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},xo=()=>({type:"string",nullable:!0,format:"null"}),To=e=>(ae(!e.isResponse,new E({message:"Please use z.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:ot.source,externalDocs:{url:Gt}}),bo=e=>(ae(e.isResponse,new E({message:"Please use z.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Gt}}),Oo=e=>ae.fail(new E({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})),So=()=>({type:"boolean"}),Ao=()=>({type:"integer",format:"bigint"}),Ro=e=>e.reduce((t,r)=>t&&r instanceof O.ZodLiteral,!0),Po=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof O.ZodEnum||e instanceof O.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:ze({schema:O.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof O.ZodLiteral)return{type:"object",properties:ze({schema:O.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof O.ZodUnion&&Ro(e.options)){let o=e.options.reduce((n,s)=>({...n,[`${s.value}`]:t}),{});return{type:"object",properties:ze({schema:O.object(o),...r}),required:e.options.map(n=>n.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},Zo=({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}}),Eo=({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}: ${Se(o)?o.type:o.$ref}`).join(", ")}}}},Io=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:u,_def:{checks:g}}})=>{let l=g.find(T=>T.kind==="regex"),h=g.find(T=>T.kind==="datetime"),x=l?l.regex:h?h.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...u&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...x&&{pattern:`/${x.source}/${x.flags}`}}},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}},ze=({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 oo?.[t]},No=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&Se(o)){let s=Ce({effect:n,sample:wo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:O.any()})}if(!t&&n.type==="preprocess"&&Se(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},vo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Mo=({schema:e,next:t})=>t({schema:e.unwrap()}),Do=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(n(s,{}),n(s,e({schema:t.schema})))},Yt=(e,t,r=[])=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?Oe(r,s):s}}),{})}},zo=(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,{})}},be=(e,t)=>{if(e instanceof O.ZodObject)return e;let r;return e instanceof O.ZodUnion||e instanceof O.ZodDiscriminatedUnion?r=Array.from(e.options.values()).map(o=>be(o,t)).reduce((o,n)=>o.merge(n.partial()),O.object({})):e instanceof O.ZodEffects?(ae(!z(e),new E({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t})),r=be(e._def.schema,t)):r=be(e._def.left,t).merge(be(e._def.right,t)),Re(e,r)},Jt=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),u=be(c,{path:e,method:t,isResponse:!1}).shape,g=Vt(e),l=o.includes("query"),h=o.includes("params"),x=o.includes("headers"),T=m=>h&&g.includes(m),A=m=>x&&qe(m);return Object.keys(u).filter(m=>l||T(m)).map(m=>{let b=V({schema:u[m],isResponse:!1,rules:st,onEach:it,onMissing:at,serializer:n,getRef:s,makeRef:a,path:e,method:t}),R=p==="components"?a(N(e,t,`${d} ${m}`),b):b;return{name:m,in:T(m)?"path":A(m)?"header":"query",required:!u[m].isOptional(),description:Se(b)&&b.description||`${t.toUpperCase()} ${e} ${d}`,schema:R,...zo(c,!1,m)}})},st={ZodString:Io,ZodNumber:Co,ZodBigInt:Ao,ZodBoolean:So,ZodDateIn:To,ZodDateOut:bo,ZodNull:xo,ZodArray:Zo,ZodTuple:Eo,ZodRecord:Po,ZodObject:ho,ZodLiteral:go,ZodIntersection:mo,ZodUnion:co,ZodFile:po,ZodUpload:ao,ZodAny:io,ZodDefault:no,ZodEnum:Bt,ZodNativeEnum:Bt,ZodEffects:No,ZodOptional:uo,ZodNullable:yo,ZodDiscriminatedUnion:lo,ZodBranded:Mo,ZodDate:Oo,ZodCatch:so,ZodPipeline:vo,ZodLazy:Do,ZodReadonly:fo},it=({schema:e,isResponse:t,prev:r})=>{if(_t(r))return{};let{description:o}=e,n=e instanceof O.ZodLazy,s=r.type!==void 0,a=t&&fe(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]}}},at=({schema:e,...t})=>ae.fail(new E({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),nt=(e,t)=>{if(_t(e))return e;let r=e.properties?Oe(t,e.properties):void 0,o=e.example?Oe(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>nt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>nt(p,t)):void 0;return Oe(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},Qt=e=>Se(e)?Oe(["example"],e):e,pt=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),u=r.getMimeTypes(o?"positive":"negative"),g=Qt(V({schema:c,isResponse:!0,rules:st,onEach:it,onMissing:at,serializer:n,getRef:s,makeRef:a,path:t,method:e})),l=Yt(c,!0),h=p==="components"?a(N(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:u.reduce((x,T)=>({...x,[T]:{schema:h,...l}}),{})}},jo=()=>({type:"http",scheme:"basic"}),ko=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Lo=({name:e})=>({type:"apiKey",in:"query",name:e}),Uo=({name:e})=>({type:"apiKey",in:"header",name:e}),Ho=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Ko=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Fo=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),Xt=e=>{let t={basic:jo,bearer:ko,input:Lo,header:Uo,cookie:Ho,openid:Ko,oauth2:Fo};return Ne(e,r=>t[r.type](r))},je=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 je(We(e))}return je({or:[e]})},er=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=Vt(t),c=r.getSchema("input"),u=Qt(nt(V({schema:ee(c)?I.create().buffer():c,isResponse:!1,rules:st,onEach:it,onMissing:at,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),g=Yt(r.getSchema("input"),!1,d),l=a==="components"?s(N(t,e,p),u):u;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((h,x)=>({...h,[x]:{schema:l,...g}}),{})}},tr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),dt=e=>e.length<=$t?e:e.slice(0,$t-1)+"\u2026";var ct=class extends Bo{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o)return $o(!(o in this.lastOperationIdSuffixes),new E({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),this.lastOperationIdSuffixes[o]=1,o;let n=N(t,r);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:u=Ie}){super(),this.addInfo({title:o,version:n});for(let l of typeof s=="string"?[s]:s)this.addServer({url:l});q({routing:t,onEndpoint:(l,h,x)=>{let T=x,A={path:h,method:T,endpoint:l,composition:c,serializer:u,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[m,b]=["short","long"].map(l.getDescription.bind(l)),R=r.inputSources?.[T]||Pe[T],M=Jt({...A,inputSources:R}),S={operationId:this.ensureUniqOperationId(h,T,l.getOperationId(T)),responses:{[l.getStatusCode("positive")]:pt({...A,clue:a,isPositive:!0}),[l.getStatusCode("negative")]:pt({...A,clue:p,isPositive:!1})}};b&&(S.description=b,d&&m===void 0&&(S.summary=dt(b))),m&&(S.summary=dt(m)),l.getTags().length>0&&(S.tags=l.getTags()),M.length>0&&(S.parameters=M),R.includes("body")&&(S.requestBody=er(A));let pe=je(Ne(Xt(l.getSecurity()),de=>{let St=this.ensureUniqSecuritySchemaName(de),br=["oauth2","openIdConnect"].includes(de.type)?l.getScopes():[];return this.addSecurityScheme(St,de),{name:St,scopes:br}}));pe.length>0&&(S.security=pe);let $e=Wt(h);this.addPath($e,{[T]:S})}}),this.rootDoc.tags=r.tags?tr(r.tags):[]}};import rr from"http";var _o=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>$),...t}),Go=({fnMethod:e,responseProps:t})=>{let r={writableEnded:!1,statusCode:200,statusMessage:rr.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=rr.STATUS_CODES[o],r)),json:e(()=>r),send:e(()=>r),end:e(()=>(r.writableEnded=!0,r)),...t};return r},qo=({fnMethod:e,loggerProps:t})=>({info:e(),warn:e(),error:e(),debug:e(),...t}),Vo=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,fnMethod:s})=>{let a=s||(await zt([{moduleName:"vitest",moduleExport:"vi"},{moduleName:"@jest/globals",moduleExport:"jest"}])).fn,p=_o({fnMethod:a,requestProps:t}),d=Go({fnMethod:a,responseProps:r}),c=qo({fnMethod:a,loggerProps:n}),u={cors:!1,logger:c,...o};return await e.execute({request:p,response:d,config:u,logger:c}),{requestMock:p,responseMock:d,loggerMock:c}};import F from"typescript";import v from"typescript";var i=v.factory,W=[i.createModifier(v.SyntaxKind.ExportKeyword)],Wo=[i.createModifier(v.SyntaxKind.AsyncKeyword)],Yo=[i.createModifier(v.SyntaxKind.PublicKeyword),i.createModifier(v.SyntaxKind.ReadonlyKeyword)],or=[i.createModifier(v.SyntaxKind.ProtectedKeyword),i.createModifier(v.SyntaxKind.ReadonlyKeyword)],Jo=i.createTemplateHead(""),Qo=i.createTemplateTail(""),Xo=i.createTemplateMiddle(" "),lt=e=>i.createTemplateLiteralType(Jo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Qo:Xo))),mt=lt(["M","P"]),ke=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Le=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(ke(o,e[o],t)),[]),ut=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),nr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),ft=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),yt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],v.NodeFlags.Const),gt=(e,t)=>i.createTypeAliasDeclaration(W,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Ue=(e,t)=>i.createTypeAliasDeclaration(W,e,void 0,t),sr=(e,t,r)=>i.createPropertyDeclaration(Yo,e,void 0,t,r),ir=(e,t,r=[])=>i.createClassDeclaration(W,e,void 0,void 0,[t,...r]),ar=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),pr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(v.SyntaxKind.AnyKeyword)]),ht=(e,t,r)=>i.createInterfaceDeclaration(W,e,void 0,t,r),dr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),cr=(e,t)=>i.createArrowFunction(Wo,void 0,e.map(r=>ke(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),xt=(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,Le({acc:void 0,key:void 0}),void 0,void 0,t),r]);var lr=["get","post","put","delete","patch"];import y from"typescript";import{z as tn}from"zod";import K from"typescript";var{factory:He}=K,Tt=(e,t)=>{K.addSyntheticLeadingComment(e,K.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ke=(e,t,r)=>{let o=He.createTypeAliasDeclaration(void 0,He.createIdentifier(t),void 0,e);return r&&Tt(o,r),o},mr=(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)},en=/^[A-Za-z_$][A-Za-z0-9_$]*$/,ur=e=>en.test(e)?He.createIdentifier(e):He.createStringLiteral(e);var{factory:f}=y,rn={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},on=({schema:{value:e}})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),nn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&fe(a)?a instanceof tn.ZodOptional:a.isOptional(),d=f.createPropertySignature(void 0,ur(s),p&&o?f.createToken(y.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Tt(d,a.description),d});return f.createTypeLiteralNode(n)},sn=({schema:{element:e},next:t})=>f.createArrayTypeNode(t({schema:e})),an=({schema:{options:e}})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),fr=({schema:{options:e},next:t})=>f.createUnionTypeNode(e.map(r=>t({schema:r}))),pn=e=>rn?.[e.kind],dn=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ce({effect:n,sample:pn(o)}),a={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(s&&a[s]||y.SyntaxKind.AnyKeyword)}return o},cn=({schema:e})=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),ln=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},mn=({next:e,schema:t})=>f.createUnionTypeNode([e({schema:t.unwrap()}),f.createLiteralTypeNode(f.createNull())]),un=({next:e,schema:{items:t}})=>f.createTupleTypeNode(t.map(r=>e({schema:r}))),fn=({next:e,schema:{keySchema:t,valueSchema:r}})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),yn=({next:e,schema:t})=>f.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),gn=({next:e,schema:t})=>e({schema:t._def.innerType}),Y=e=>()=>f.createKeywordTypeNode(e),hn=({next:e,schema:t})=>e({schema:t.unwrap()}),xn=({next:e,schema:t})=>e({schema:t._def.innerType}),Tn=({next:e,schema:t})=>e({schema:t._def.innerType}),bn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),On=()=>f.createLiteralTypeNode(f.createNull()),Sn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(t(s,f.createLiteralTypeNode(f.createNull())),t(s,r({schema:n.schema})))},An=({schema:{isBuffer:e}})=>e?f.createTypeReferenceNode("Buffer"):f.createKeywordTypeNode(y.SyntaxKind.StringKeyword),Rn={ZodString:Y(y.SyntaxKind.StringKeyword),ZodNumber:Y(y.SyntaxKind.NumberKeyword),ZodBigInt:Y(y.SyntaxKind.BigIntKeyword),ZodBoolean:Y(y.SyntaxKind.BooleanKeyword),ZodDateIn:Y(y.SyntaxKind.StringKeyword),ZodDateOut:Y(y.SyntaxKind.StringKeyword),ZodNull:On,ZodArray:sn,ZodTuple:un,ZodRecord:fn,ZodObject:nn,ZodLiteral:on,ZodIntersection:yn,ZodUnion:fr,ZodFile:An,ZodAny:Y(y.SyntaxKind.AnyKeyword),ZodDefault:gn,ZodEnum:an,ZodNativeEnum:cn,ZodEffects:dn,ZodOptional:ln,ZodNullable:mn,ZodDiscriminatedUnion:fr,ZodBranded:hn,ZodCatch:Tn,ZodPipeline:bn,ZodLazy:Sn,ZodReadonly:xn},bt=({schema:e,...t})=>V({schema:e,rules:Rn,onMissing:()=>f.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),...t});var Ot=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=Ke(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ie,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){q({routing:t,onEndpoint:(m,b,R)=>{let M=N(b,R,"input"),J=N(b,R,"response"),S={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},pe=m.getSchema("input"),$e=bt({...S,schema:ee(pe)?I.create().buffer():pe,isResponse:!1}),de=bt({...S,isResponse:!0,schema:m.getSchema("positive").or(m.getSchema("negative"))});this.agg.push(Ke($e,M),Ke(de,J)),R!=="options"&&(this.paths.push(b),this.registry[`${R} ${b}`]={in:M,out:J,isJson:m.getMimeTypes("positive").includes($),tags:m.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=gt("Path",this.paths),a=gt("Method",lr),p=Ue("MethodPath",lt([a.name,s.name])),d=[i.createHeritageClause(F.SyntaxKind.ExtendsKeyword,[ut(p.name,F.SyntaxKind.AnyKeyword)])],c=ht("Input",d,Object.keys(this.registry).map(m=>ft(m,this.registry[m].in))),u=ht("Response",d,Object.keys(this.registry).map(m=>ft(m,this.registry[m].out)));if(this.agg.push(s,a,p,c,u),r==="types")return;let g=i.createVariableStatement(W,yt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(m=>this.registry[m].isJson).map(m=>i.createPropertyAssignment(`"${m}"`,i.createTrue()))))),l=i.createVariableStatement(W,yt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(m=>i.createPropertyAssignment(`"${m}"`,i.createArrayLiteralExpression(this.registry[m].tags.map(b=>i.createStringLiteral(b)))))))),h=Ue("Provider",i.createFunctionTypeNode(dr({M:a.name,P:s.name}),Le({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),mt)}),ar(u.name,mt))),x=Ue("Implementation",i.createFunctionTypeNode(void 0,Le({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(F.SyntaxKind.StringKeyword),params:ut(F.SyntaxKind.StringKeyword,F.SyntaxKind.AnyKeyword)}),pr())),T=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),A=ir("ExpressZodAPIClient",nr([ke("implementation",i.createTypeReferenceNode(x.name),or)]),[sr("provide",i.createTypeReferenceNode(h.name),cr(["method","path","params"],[i.createIdentifier("method"),xt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[T,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),xt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[T]),F.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())]))]);F.addSyntheticLeadingComment(A,F.SyntaxKind.MultiLineCommentTrivia,`
23
- export const exampleImplementation: Implementation = async (
24
- method,
25
- path,
26
- params
27
- ) => {
28
- const hasBody = !["get", "delete"].includes(method);
29
- const searchParams = hasBody ? "" : \`?\${new URLSearchParams(params)}\`;
30
- const response = await fetch(\`https://example.com\${path}\${searchParams}\`, {
31
- method: method.toUpperCase(),
32
- headers: hasBody ? { "Content-Type": "application/json" } : undefined,
33
- body: hasBody ? JSON.stringify(params) : undefined,
34
- });
35
- if (\`\${method} \${path}\` in jsonEndpoints) {
36
- return response.json();
37
- }
38
- return response.text();
39
- };
16
+ \x1B[94m\x1B[3mfor Nina \x1B[23m888\x1B[3m Start your API server with I/O schema validation and custom middlewares in minutes.\x1B[23m\x1B[39m
17
+ \x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m
18
+ `;var at=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Yt()),t.debug("Running","v16.0.0-beta1 (ESM)"),J({routing:o,hasCors:!!r.cors,onEndpoint:(s,i,a)=>{e[a](i,async(p,d)=>{t.info(`${p.method}: ${i}`),await s.execute({request:p,response:d,logger:t,config:r})})},onStatic:(s,i)=>{e.use(s,i)}})};import Qt from"http-errors";var uo=(e,t)=>(r,o,s,i)=>{if(!r)return i();e.handler({error:Qt(400,oe(r).message),request:o,response:s,logger:t,input:null,output:null})},fo=(e,t)=>(r,o)=>{let s=Qt(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:s,input:null,output:null})}catch(i){ke({response:o,logger:t,error:new ie(oe(i).message,s)})}},Xt=async e=>{let t=Gt(e.logger)?it({...e.logger,winston:await Y("winston")}):e.logger,r=e.errorHandler||be,o=fo(r,t);return{logger:t,errorHandler:r,notFoundHandler:o}},yo=async(e,t)=>{let{logger:r,notFoundHandler:o}=await Xt(e);return at({app:e.app,routing:t,logger:r,config:e}),{notFoundHandler:o,logger:r}},go=async(e,t)=>{let r=Jt().disable("x-powered-by");if(e.server.compression){let d=await Y("compression");r.use(d(typeof e.server.compression=="object"?e.server.compression:void 0))}if(r.use(e.server.jsonParser||Jt.json()),e.server.upload){let d=await Y("express-fileupload");r.use(d({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}))}e.server.rawParser&&(r.use(e.server.rawParser),r.use((d,{},c)=>{Buffer.isBuffer(d.body)&&(d.body={raw:d.body}),c()}));let{logger:o,errorHandler:s,notFoundHandler:i}=await Xt(e);r.use(uo(s,o)),at({app:r,routing:t,logger:o,config:e}),r.use(i);let a=(d,c)=>d.listen(c,()=>{o.info("Listening",c)}),p={httpServer:a(mo.createServer(r),e.server.listen),httpsServer:e.https?a(lo.createServer(e.https.options,r),e.https.listen):void 0};return{app:r,...p,logger:o}};import nn from"assert/strict";import{OpenApiBuilder as sn}from"openapi3-ts/oas31";import me from"assert/strict";import{isReferenceObject as X}from"openapi3-ts/oas31";import{omit as Re}from"ramda";import{z as O}from"zod";import{INVALID as er,ZodIssueCode as pt,ZodParsedType as tr,ZodType as ho,addIssueToContext as dt}from"zod";var ct=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,xo="ZodDateIn",He=class e extends ho{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==tr.string)return dt(o,{code:pt.invalid_type,expected:tr.string,received:o.parsedType}),er;ct.test(o.data)||(dt(o,{code:pt.invalid_string,validation:"regex"}),r.dirty());let s=new Date(o.data);return Me(s)?{status:r.value,value:s}:(dt(o,{code:pt.invalid_date}),er)}static create=()=>new e({typeName:xo})};var Q=({schema:e,onEach:t,rules:r,onMissing:o,...s})=>{let i="typeName"in e._def?r[e._def.typeName]:void 0,a=s,d=i?i({schema:e,...a,next:l=>Q({...l,...a,onEach:t,rules:r,onMissing:o})}):o({schema:e,...a}),c=t&&t({schema:e,prev:d,...a});return c?{...d,...c}:d};var rr=50,nr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",To={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},sr=/:([A-Za-z0-9_]+)/g,ir=e=>{let t=e.match(sr);return t?t.map(r=>r.slice(1)):[]},ar=e=>e.replace(sr,t=>`{${t.slice(1)}}`),bo=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),So=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Oo=()=>({format:"any"}),Ao=e=>(me(!e.isResponse,new I({message:"Please use z.upload() only for input.",...e})),{type:"string",format:"binary"}),Po=({schema:{isBinary:e,isBase64:t,isBuffer:r}})=>({type:"string",format:r||e?"binary":t?"byte":"file"}),Ro=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Eo=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),Io=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Zo=({schema:e,next:t})=>t({schema:e.unwrap()}),Co=({schema:e,next:t})=>t({schema:e._def.innerType}),wo=({schema:e,next:t})=>{let r=t({schema:e.unwrap()});return X(r)||(r.type=pr(r)),r},or=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),vo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),Mo=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(i=>{let a=e.shape[i];return!(t&&Te(a)?a instanceof O.ZodOptional:a.isOptional())}),s={type:"object",properties:Ke({schema:e,isResponse:t,...r})};return o.length&&(s.required=o),s},No=()=>({type:"null"}),Do=e=>(me(!e.isResponse,new I({message:"Please use z.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:ct.source,externalDocs:{url:nr}}),zo=e=>(me(e.isResponse,new I({message:"Please use z.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:nr}}),jo=e=>me.fail(new I({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),Lo=()=>({type:"boolean"}),ko=()=>({type:"integer",format:"bigint"}),Uo=e=>e.reduce((t,r)=>t&&r instanceof O.ZodLiteral,!0),Ho=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof O.ZodEnum||e instanceof O.ZodNativeEnum){let o=Object.values(e.enum),s=o.reduce((a,p)=>({...a,[p]:t}),{}),i={type:"object",properties:Ke({schema:O.object(s),...r})};return o.length&&(i.required=o),i}if(e instanceof O.ZodLiteral)return{type:"object",properties:Ke({schema:O.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof O.ZodUnion&&Uo(e.options)){let o=e.options.reduce((s,i)=>({...s,[`${i.value}`]:t}),{});return{type:"object",properties:Ke({schema:O.object(o),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},Ko=({schema:{_def:e,element:t},next:r})=>{let o={type:"array",items:r({schema:t})};return e.minLength&&(o.minItems=e.minLength.value),e.maxLength&&(o.maxItems=e.maxLength.value),o},Fo=({schema:{items:e},next:t})=>({type:"array",prefixItems:e.map(o=>t({schema:o}))}),Bo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:s,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:g}}})=>{let m=g.find(f=>f.kind==="regex"),x=g.find(f=>f.kind==="datetime"),T=m?m.regex:x?x.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,h={type:"string"},S={"date-time":l,email:e,url:t,uuid:s,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let f in S)if(S[f]){h.format=f;break}return r!==null&&(h.minLength=r),o!==null&&(h.maxLength=o),T&&(h.pattern=`/${T.source}/${T.flags}`),h},$o=({schema:e})=>{let t=e._def.checks.find(({kind:d})=>d==="min"),r=e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,o=t?t.inclusive:!0,s=e._def.checks.find(({kind:d})=>d==="max"),i=e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,a=s?s.inclusive:!0,p={type:e.isInt?"integer":"number",format:e.isInt?"int64":"double"};return o?p.minimum=r:p.exclusiveMinimum=r,a?p.maximum=i:p.exclusiveMaximum=i,p},Ke=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),_o=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return To?.[t]},pr=e=>["null"].concat(e.type||[]),Vo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:s}=e._def;if(t&&s.type==="transform"&&!X(o)){let i=ze({effect:s,sample:_o(o)});return i&&["number","string","boolean"].includes(i)?{type:i}:r({schema:O.any()})}if(!t&&s.type==="preprocess"&&!X(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},Go=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),qo=({schema:e,next:t})=>t({schema:e.unwrap()}),Wo=({next:e,schema:t,serializer:r,getRef:o,makeRef:s})=>{let i=r(t.schema);return o(i)||(s(i,{}),s(i,e({schema:t.schema})))},dr=(e,t,r=[])=>{let o=U({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((s,i,a)=>({...s,[`example${a+1}`]:{value:typeof i=="object"&&!Array.isArray(i)?Re(r,i):i}}),{})}},Yo=(e,t,r)=>{let o=U({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((s,i,a)=>r in i?{...s,[`example${a+1}`]:{value:i[r]}}:s,{})}},Pe=(e,t)=>{if(e instanceof O.ZodObject)return e;let r;return e instanceof O.ZodUnion||e instanceof O.ZodDiscriminatedUnion?r=Array.from(e.options.values()).map(o=>Pe(o,t)).reduce((o,s)=>o.merge(s.partial()),O.object({})):e instanceof O.ZodEffects?(me(!L(e),new I({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t})),r=Pe(e._def.schema,t)):r=Pe(e._def.left,t).merge(Pe(e._def.right,t)),we(e,r)},cr=({path:e,method:t,endpoint:r,inputSources:o,serializer:s,getRef:i,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=Pe(c,{path:e,method:t,isResponse:!1}).shape,g=ir(e),m=o.includes("query"),x=o.includes("params"),T=o.includes("headers"),h=f=>x&&g.includes(f),S=f=>T&&et(f);return Object.keys(l).filter(f=>m||h(f)).map(f=>{let E=Q({schema:l[f],isResponse:!1,rules:lt,onEach:ut,onMissing:ft,serializer:s,getRef:i,makeRef:a,path:e,method:t}),Z=p==="components"?a(N(e,t,`${d} ${f}`),E):E;return{name:f,in:h(f)?"path":S(f)?"header":"query",required:!l[f].isOptional(),description:!X(E)&&E.description||`${t.toUpperCase()} ${e} ${d}`,schema:Z,...Yo(c,!1,f)}})},lt={ZodString:Bo,ZodNumber:$o,ZodBigInt:ko,ZodBoolean:Lo,ZodDateIn:Do,ZodDateOut:zo,ZodNull:No,ZodArray:Ko,ZodTuple:Fo,ZodRecord:Ho,ZodObject:Mo,ZodLiteral:vo,ZodIntersection:Io,ZodUnion:Ro,ZodFile:Po,ZodUpload:Ao,ZodAny:Oo,ZodDefault:bo,ZodEnum:or,ZodNativeEnum:or,ZodEffects:Vo,ZodOptional:Zo,ZodNullable:wo,ZodDiscriminatedUnion:Eo,ZodBranded:qo,ZodDate:jo,ZodCatch:So,ZodPipeline:Go,ZodLazy:Wo,ZodReadonly:Co},ut=({schema:e,isResponse:t,prev:r})=>{if(X(r))return{};let{description:o}=e,s=e instanceof O.ZodLazy,i=r.type!==void 0,a=t&&Te(e),p=!s&&i&&!a&&e.isNullable(),d=s?[]:U({schema:e,variant:t?"parsed":"original",validate:!0}),c={};return o&&(c.description=o),p&&(c.type=pr(r)),d.length&&(c.examples=Array.from(d)),c},ft=({schema:e,...t})=>me.fail(new I({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),mt=(e,t)=>{if(X(e))return e;let r=e.properties?Re(t,e.properties):void 0,o=e.example?Re(t,e.example):void 0,s=e.required?e.required.filter(p=>!t.includes(p)):void 0,i=e.allOf?e.allOf.map(p=>mt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>mt(p,t)):void 0;return Re(Object.entries({properties:r,required:s,example:o,allOf:i,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:s,example:o,allOf:i,oneOf:a})},mr=e=>X(e)?e:Re(["example"],e),yt=({method:e,path:t,endpoint:r,isPositive:o,serializer:s,getRef:i,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),g=mr(Q({schema:c,isResponse:!0,rules:lt,onEach:ut,onMissing:ft,serializer:s,getRef:i,makeRef:a,path:t,method:e})),m=dr(c,!0),x=p==="components"?a(N(t,e,d),g):g;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((T,h)=>({...T,[h]:{schema:x,...m}}),{})}},Jo=()=>({type:"http",scheme:"basic"}),Qo=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Xo=({name:e})=>({type:"apiKey",in:"query",name:e}),en=({name:e})=>({type:"apiKey",in:"header",name:e}),tn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),rn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),on=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:s={},...i}=o;return{...t,[r]:{...i,scopes:s}}},{})}),lr=e=>{let t={basic:Jo,bearer:Qo,input:Xo,header:en,cookie:tn,openid:rn,oauth2:on};return Le(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:s})=>({...r,[o]:s}),{}));if("and"in e)return Fe(rt(e))}return Fe({or:[e]})},ur=({method:e,path:t,endpoint:r,serializer:o,getRef:s,makeRef:i,composition:a,clue:p="request body"})=>{let d=ir(t),c=r.getSchema("input"),l=mr(mt(Q({schema:ne(c)?C.create().buffer():c,isResponse:!1,rules:lt,onEach:ut,onMissing:ft,serializer:o,getRef:s,makeRef:i,path:t,method:e}),d)),g=dr(r.getSchema("input"),!1,d),m=a==="components"?i(N(t,e,p),l):l;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((x,T)=>({...x,[T]:{schema:m,...g}}),{})}},fr=e=>Object.keys(e).map(t=>{let r=e[t],o={name:t,description:typeof r=="string"?r:r.description};return typeof r=="object"&&r.url&&(o.externalDocs={url:r.url}),o}),gt=e=>e.length<=rr?e:e.slice(0,rr-1)+"\u2026";var ht=class extends sn{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r,o){if(o)return nn(!(o in this.lastOperationIdSuffixes),new I({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),this.lastOperationIdSuffixes[o]=1,o;let s=N(t,r);return s in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[s]++,`${s}${this.lastOperationIdSuffixes[s]}`):(this.lastOperationIdSuffixes[s]=1,s)}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:s,serverUrl:i,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=De}){super(),this.addInfo({title:o,version:s});for(let m of typeof i=="string"?[i]:i)this.addServer({url:m});J({routing:t,onEndpoint:(m,x,T)=>{let h=T,S={path:x,method:h,endpoint:m,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[f,E]=["short","long"].map(m.getDescription.bind(m)),Z=r.inputSources?.[h]||ve[h],V=cr({...S,inputSources:Z}),A={operationId:this.ensureUniqOperationId(x,h,m.getOperationId(h)),responses:{[m.getStatusCode("positive")]:yt({...S,clue:a,isPositive:!0}),[m.getStatusCode("negative")]:yt({...S,clue:p,isPositive:!1})}};E&&(A.description=E,d&&f===void 0&&(A.summary=gt(E))),f&&(A.summary=gt(f)),m.getTags().length>0&&(A.tags=m.getTags()),V.length>0&&(A.parameters=V),Z.includes("body")&&(A.requestBody=ur(S));let Ee=Fe(Le(lr(m.getSecurity()),fe=>{let Ie=this.ensureUniqSecuritySchemaName(fe),Ye=["oauth2","openIdConnect"].includes(fe.type)?m.getScopes():[];return this.addSecurityScheme(Ie,fe),{name:Ie,scopes:Ye}}));Ee.length>0&&(A.security=Ee);let We=ar(x);this.addPath(We,{[h]:A})}}),this.rootDoc.tags=r.tags?fr(r.tags):[]}};import yr from"http";var an=({fnMethod:e,requestProps:t})=>({method:"GET",header:e(()=>j),...t}),pn=({fnMethod:e,responseProps:t})=>{let r={writableEnded:!1,statusCode:200,statusMessage:yr.STATUS_CODES[200],set:e(()=>r),setHeader:e(()=>r),header:e(()=>r),status:e(o=>(r.statusCode=o,r.statusMessage=yr.STATUS_CODES[o],r)),json:e(()=>r),send:e(()=>r),end:e(()=>(r.writableEnded=!0,r)),...t};return r},dn=({fnMethod:e,loggerProps:t})=>({info:e(),warn:e(),error:e(),debug:e(),...t}),cn=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:s,fnMethod:i})=>{let a=i||(await qt([{moduleName:"vitest",moduleExport:"vi"},{moduleName:"@jest/globals",moduleExport:"jest"}])).fn,p=an({fnMethod:a,requestProps:t}),d=pn({fnMethod:a,responseProps:r}),c=dn({fnMethod:a,loggerProps:s}),l={cors:!1,logger:c,...o};return await e.execute({request:p,response:d,config:l,logger:c}),{requestMock:p,responseMock:d,loggerMock:c}};import w from"typescript";import D from"typescript";var n=D.factory,B=[n.createModifier(D.SyntaxKind.ExportKeyword)],mn=[n.createModifier(D.SyntaxKind.AsyncKeyword)],ln=[n.createModifier(D.SyntaxKind.PublicKeyword),n.createModifier(D.SyntaxKind.ReadonlyKeyword)],gr=[n.createModifier(D.SyntaxKind.ProtectedKeyword),n.createModifier(D.SyntaxKind.ReadonlyKeyword)],xt=n.createTemplateHead(""),le=n.createTemplateTail(""),Tt=n.createTemplateMiddle(" "),bt=e=>n.createTemplateLiteralType(xt,e.map((t,r)=>n.createTemplateLiteralTypeSpan(n.createTypeReferenceNode(t),r===e.length-1?le:Tt))),St=bt(["M","P"]),Be=(e,t,r)=>n.createParameterDeclaration(r,void 0,e,void 0,t,void 0),$e=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Be(n.createIdentifier(o),e[o],t)),[]),Ot=(e,t)=>n.createExpressionWithTypeArguments(n.createIdentifier("Record"),[typeof e=="number"?n.createKeywordTypeNode(e):n.createTypeReferenceNode(e),n.createKeywordTypeNode(t)]),hr=e=>n.createConstructorDeclaration(void 0,e,n.createBlock([])),At=(e,t)=>n.createPropertySignature(void 0,`"${e}"`,void 0,n.createTypeReferenceNode(t)),$=(e,t,r)=>n.createVariableDeclarationList([n.createVariableDeclaration(e,void 0,r,t)],D.NodeFlags.Const),Pt=(e,t)=>n.createTypeAliasDeclaration(B,e,void 0,n.createUnionTypeNode(t.map(r=>n.createLiteralTypeNode(n.createStringLiteral(r))))),_e=(e,t)=>n.createTypeAliasDeclaration(B,e,void 0,t),xr=(e,t,r)=>n.createPropertyDeclaration(ln,e,void 0,t,r),Tr=(e,t,r=[])=>n.createClassDeclaration(B,e,void 0,void 0,[t,...r]),br=(e,t)=>n.createTypeReferenceNode("Promise",[n.createIndexedAccessTypeNode(n.createTypeReferenceNode(e),t)]),Sr=()=>n.createTypeReferenceNode("Promise",[n.createKeywordTypeNode(D.SyntaxKind.AnyKeyword)]),Rt=(e,t,r)=>n.createInterfaceDeclaration(B,e,void 0,t,r),Or=e=>Object.keys(e).reduce((t,r)=>t.concat(n.createTypeParameterDeclaration([],r,n.createTypeReferenceNode(e[r]))),[]),Et=(e,t)=>n.createArrowFunction(mn,void 0,e.map(r=>Be(r)),void 0,void 0,t),It=(e,t,r)=>n.createCallExpression(n.createPropertyAccessExpression(n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[n.createArrowFunction(void 0,void 0,$e({acc:void 0,key:void 0}),void 0,void 0,t),r]);var Ar=["get","post","put","delete","patch"];import y from"typescript";import{z as fn}from"zod";import _ from"typescript";var{factory:Ve}=_,Zt=(e,t)=>{_.addSyntheticLeadingComment(e,_.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ge=(e,t,r)=>{let o=Ve.createTypeAliasDeclaration(void 0,Ve.createIdentifier(t),void 0,e);return r&&Zt(o,r),o},Ct=(e,t)=>{let r=_.createSourceFile("print.ts","",_.ScriptTarget.Latest,!1,_.ScriptKind.TS);return _.createPrinter(t).printNode(_.EmitHint.Unspecified,e,r)},un=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Pr=e=>un.test(e)?Ve.createIdentifier(e):Ve.createStringLiteral(e);var{factory:u}=y,yn={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},gn=({schema:{value:e}})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),hn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let s=Object.entries(e).map(([i,a])=>{let p=t&&Te(a)?a instanceof fn.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,Pr(i),p&&o?u.createToken(y.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Zt(d,a.description),d});return u.createTypeLiteralNode(s)},xn=({schema:{element:e},next:t})=>u.createArrayTypeNode(t({schema:e})),Tn=({schema:{options:e}})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),Rr=({schema:{options:e},next:t})=>u.createUnionTypeNode(e.map(r=>t({schema:r}))),bn=e=>yn?.[e.kind],Sn=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),s=e._def.effect;if(r&&s.type==="transform"){let i=ze({effect:s,sample:bn(o)}),a={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return u.createKeywordTypeNode(i&&a[i]||y.SyntaxKind.AnyKeyword)}return o},On=({schema:e})=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),An=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},Pn=({next:e,schema:t})=>u.createUnionTypeNode([e({schema:t.unwrap()}),u.createLiteralTypeNode(u.createNull())]),Rn=({next:e,schema:{items:t}})=>u.createTupleTypeNode(t.map(r=>e({schema:r}))),En=({next:e,schema:{keySchema:t,valueSchema:r}})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),In=({next:e,schema:t})=>u.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Zn=({next:e,schema:t})=>e({schema:t._def.innerType}),ee=e=>()=>u.createKeywordTypeNode(e),Cn=({next:e,schema:t})=>e({schema:t.unwrap()}),wn=({next:e,schema:t})=>e({schema:t._def.innerType}),vn=({next:e,schema:t})=>e({schema:t._def.innerType}),Mn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),Nn=()=>u.createLiteralTypeNode(u.createNull()),Dn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:s})=>{let i=`Type${o(s.schema)}`;return e(i)||(t(i,u.createLiteralTypeNode(u.createNull())),t(i,r({schema:s.schema})))},zn=({schema:{isBuffer:e}})=>e?u.createTypeReferenceNode("Buffer"):u.createKeywordTypeNode(y.SyntaxKind.StringKeyword),jn={ZodString:ee(y.SyntaxKind.StringKeyword),ZodNumber:ee(y.SyntaxKind.NumberKeyword),ZodBigInt:ee(y.SyntaxKind.BigIntKeyword),ZodBoolean:ee(y.SyntaxKind.BooleanKeyword),ZodDateIn:ee(y.SyntaxKind.StringKeyword),ZodDateOut:ee(y.SyntaxKind.StringKeyword),ZodNull:Nn,ZodArray:xn,ZodTuple:Rn,ZodRecord:En,ZodObject:hn,ZodLiteral:gn,ZodIntersection:In,ZodUnion:Rr,ZodFile:zn,ZodAny:ee(y.SyntaxKind.AnyKeyword),ZodDefault:Zn,ZodEnum:Tn,ZodNativeEnum:On,ZodEffects:Sn,ZodOptional:An,ZodNullable:Pn,ZodDiscriminatedUnion:Rr,ZodBranded:Cn,ZodCatch:vn,ZodPipeline:Mn,ZodLazy:Dn,ZodReadonly:wn},wt=({schema:e,...t})=>Q({schema:e,rules:jn,onMissing:()=>u.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),...t});var vt=class{program=[];usage=[];registry={};paths=[];aliases={};ids={pathType:n.createIdentifier("Path"),methodType:n.createIdentifier("Method"),methodPathType:n.createIdentifier("MethodPath"),inputInterface:n.createIdentifier("Input"),responseInterface:n.createIdentifier("Response"),jsonEndpointsConst:n.createIdentifier("jsonEndpoints"),endpointTagsConst:n.createIdentifier("endpointTags"),providerType:n.createIdentifier("Provider"),implementationType:n.createIdentifier("Implementation"),clientClass:n.createIdentifier("ExpressZodAPIClient"),keyParameter:n.createIdentifier("key"),pathParameter:n.createIdentifier("path"),paramsArgument:n.createIdentifier("params"),methodParameter:n.createIdentifier("method"),accumulator:n.createIdentifier("acc"),provideMethod:n.createIdentifier("provide"),implementationArgument:n.createIdentifier("implementation"),headersProperty:n.createIdentifier("headers"),hasBodyConst:n.createIdentifier("hasBody"),undefinedValue:n.createIdentifier("undefined"),bodyProperty:n.createIdentifier("body"),responseConst:n.createIdentifier("response"),searchParamsConst:n.createIdentifier("searchParams"),exampleImplementationConst:n.createIdentifier("exampleImplementation"),clientConst:n.createIdentifier("client")};getAlias(t){return t in this.aliases?n.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=Ge(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=De,optionalPropStyle:s={withQuestionMark:!0,withUndefined:!0}}){J({routing:t,onEndpoint:(b,te,Ze)=>{let Mt=N(te,Ze,"input"),Nt=N(te,Ze,"response"),Dt={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:s},zt=b.getSchema("input"),Dr=wt({...Dt,schema:ne(zt)?C.create().buffer():zt,isResponse:!1}),zr=wt({...Dt,isResponse:!0,schema:b.getSchema("positive").or(b.getSchema("negative"))});this.program.push(Ge(Dr,Mt),Ge(zr,Nt)),Ze!=="options"&&(this.paths.push(te),this.registry[`${Ze} ${te}`]={in:Mt,out:Nt,isJson:b.getMimeTypes("positive").includes(j),tags:b.getTags()})}}),this.program.unshift(...Object.values(this.aliases));let i=Pt(this.ids.pathType,this.paths),a=Pt(this.ids.methodType,Ar),p=_e(this.ids.methodPathType,bt([this.ids.methodType,this.ids.pathType])),d=[n.createHeritageClause(w.SyntaxKind.ExtendsKeyword,[Ot(this.ids.methodPathType,w.SyntaxKind.AnyKeyword)])],c=Rt(this.ids.inputInterface,d,Object.keys(this.registry).map(b=>At(b,this.registry[b].in))),l=Rt(this.ids.responseInterface,d,Object.keys(this.registry).map(b=>At(b,this.registry[b].out)));if(this.program.push(i,a,p,c,l),r==="types")return;let g=n.createVariableStatement(B,$(this.ids.jsonEndpointsConst,n.createObjectLiteralExpression(Object.keys(this.registry).filter(b=>this.registry[b].isJson).map(b=>n.createPropertyAssignment(`"${b}"`,n.createTrue()))))),m=n.createVariableStatement(B,$(this.ids.endpointTagsConst,n.createObjectLiteralExpression(Object.keys(this.registry).map(b=>n.createPropertyAssignment(`"${b}"`,n.createArrayLiteralExpression(this.registry[b].tags.map(te=>n.createStringLiteral(te)))))))),x=_e(this.ids.providerType,n.createFunctionTypeNode(Or({M:this.ids.methodType,P:this.ids.pathType}),$e({method:n.createTypeReferenceNode("M"),path:n.createTypeReferenceNode("P"),params:n.createIndexedAccessTypeNode(n.createTypeReferenceNode(this.ids.inputInterface),St)}),br(this.ids.responseInterface,St))),T=_e(this.ids.implementationType,n.createFunctionTypeNode(void 0,$e({method:n.createTypeReferenceNode(this.ids.methodType),path:n.createKeywordTypeNode(w.SyntaxKind.StringKeyword),params:Ot(w.SyntaxKind.StringKeyword,w.SyntaxKind.AnyKeyword)}),Sr())),h=n.createTemplateExpression(n.createTemplateHead(":"),[n.createTemplateSpan(this.ids.keyParameter,le)]),S=It(this.ids.paramsArgument,n.createCallExpression(n.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[h,n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),f=It(this.ids.paramsArgument,n.createConditionalExpression(n.createBinaryExpression(n.createCallExpression(n.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[h]),w.SyntaxKind.GreaterThanEqualsToken,n.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,n.createObjectLiteralExpression([n.createSpreadAssignment(this.ids.accumulator),n.createPropertyAssignment(n.createComputedPropertyName(this.ids.keyParameter),n.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),n.createObjectLiteralExpression()),E=Tr(this.ids.clientClass,hr([Be(this.ids.implementationArgument,n.createTypeReferenceNode(this.ids.implementationType),gr)]),[xr(this.ids.provideMethod,n.createTypeReferenceNode(this.ids.providerType),Et([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createCallExpression(n.createPropertyAccessExpression(n.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,S,f])))]);this.program.push(g,m,x,T,E);let Z=n.createPropertyAssignment(this.ids.methodParameter,n.createCallExpression(n.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),V=n.createPropertyAssignment(this.ids.headersProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createObjectLiteralExpression([n.createPropertyAssignment(n.createStringLiteral("Content-Type"),n.createStringLiteral(j))]),void 0,this.ids.undefinedValue)),ue=n.createPropertyAssignment(this.ids.bodyProperty,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createCallExpression(n.createPropertyAccessExpression(n.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),A=n.createVariableStatement(void 0,$(this.ids.responseConst,n.createAwaitExpression(n.createCallExpression(n.createIdentifier("fetch"),void 0,[n.createTemplateExpression(n.createTemplateHead("https://example.com"),[n.createTemplateSpan(this.ids.pathParameter,n.createTemplateMiddle("")),n.createTemplateSpan(this.ids.searchParamsConst,le)]),n.createObjectLiteralExpression([Z,V,ue])])))),Ee=n.createVariableStatement(void 0,$(this.ids.hasBodyConst,n.createLogicalNot(n.createCallExpression(n.createPropertyAccessExpression(n.createArrayLiteralExpression([n.createStringLiteral("get"),n.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),We=n.createVariableStatement(void 0,$(this.ids.searchParamsConst,n.createConditionalExpression(this.ids.hasBodyConst,void 0,n.createStringLiteral(""),void 0,n.createTemplateExpression(n.createTemplateHead("?"),[n.createTemplateSpan(n.createNewExpression(n.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),le)])))),[fe,Ie]=["json","text"].map(b=>n.createReturnStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.responseConst,b),void 0,void 0))),Ye=n.createIfStatement(n.createBinaryExpression(n.createTemplateExpression(xt,[n.createTemplateSpan(this.ids.methodParameter,Tt),n.createTemplateSpan(this.ids.pathParameter,le)]),w.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),n.createBlock([fe])),vr=n.createVariableStatement(B,$(this.ids.exampleImplementationConst,Et([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],n.createBlock([Ee,We,A,Ye,Ie])),n.createTypeReferenceNode(this.ids.implementationType))),Mr=n.createExpressionStatement(n.createCallExpression(n.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[n.createStringLiteral("get"),n.createStringLiteral("/v1/user/retrieve"),n.createObjectLiteralExpression([n.createPropertyAssignment("id",n.createStringLiteral("10"))])])),Nr=n.createVariableStatement(void 0,$(this.ids.clientConst,n.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(vr,Nr,Mr)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Ct(r,t)).join(`
19
+ `):void 0}print(t){let r=this.printUsage(t),o=r&&w.addSyntheticLeadingComment(w.addSyntheticLeadingComment(n.createEmptyStatement(),w.SyntaxKind.SingleLineCommentTrivia," Usage example:"),w.SyntaxKind.MultiLineCommentTrivia,`
20
+ ${r}`);return this.program.concat(o||[]).map((s,i)=>Ct(s,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
40
21
 
41
- const client = new ExpressZodAPIClient(exampleImplementation);
42
- client.provide("get", "/v1/user/retrieve", { id: "10" });
43
- `,!0),this.agg.push(g,l,h,x,A)}print(t){return this.agg.map(r=>mr(r,t)).join(`
44
-
45
- `)}};var Tr={};Sr(Tr,{dateIn:()=>wn,dateOut:()=>Nn,file:()=>In,raw:()=>vn,upload:()=>Cn});import{z as En}from"zod";import{INVALID as yr,ZodIssueCode as gr,ZodParsedType as hr,ZodType as Pn,addIssueToContext as xr}from"zod";var Zn="ZodDateOut",Fe=class e extends Pn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==hr.date?(xr(o,{code:gr.invalid_type,expected:hr.date,received:o.parsedType}),yr):Ze(o.data)?{status:r.value,value:o.data.toISOString()}:(xr(o,{code:gr.invalid_date}),yr)}static create=()=>new e({typeName:Zn})};var In=I.create,Cn=Q.create,wn=De.create,Nn=Fe.create,vn=()=>En.object({raw:I.create().buffer()});export{ie as AbstractEndpoint,he as DependsOnMethod,ct as Documentation,E as DocumentationError,ge as EndpointsFactory,L as InputValidationError,Ot as Integration,oe as MissingPeerError,B as OutputValidationError,te as RoutingError,xe as ServeStatic,Gr as arrayEndpointsFactory,Je as arrayResultHandler,Xr as attachRouting,Ar as createConfig,Xe as createLogger,Qe as createMiddleware,Ye as createResultHandler,eo as createServer,_r as defaultEndpointsFactory,ye as defaultResultHandler,Tr as ez,k as getExamples,j as getMessageFromError,Ee as getStatusCodeFromError,Vo as testEndpoint,D as withMeta};
22
+ `)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await Y("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let s=this.printUsage(t);this.usage=s&&o?[await o(s)]:this.usage;let i=this.print(t);return o?o(i):i}};var wr={};Lr(wr,{dateIn:()=>Fn,dateOut:()=>Bn,file:()=>Hn,raw:()=>$n,upload:()=>Kn});import{z as Un}from"zod";import{INVALID as Er,ZodIssueCode as Ir,ZodParsedType as Zr,ZodType as Ln,addIssueToContext as Cr}from"zod";var kn="ZodDateOut",qe=class e extends Ln{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==Zr.date?(Cr(o,{code:Ir.invalid_type,expected:Zr.date,received:o.parsedType}),Er):Me(o.data)?{status:r.value,value:o.data.toISOString()}:(Cr(o,{code:Ir.invalid_date}),Er)}static create=()=>new e({typeName:kn})};var Hn=C.create,Kn=re.create,Fn=He.create,Bn=qe.create,$n=()=>Un.object({raw:C.create().buffer()});export{ce as AbstractEndpoint,Oe as DependsOnMethod,ht as Documentation,I as DocumentationError,Se as EndpointsFactory,H as InputValidationError,vt as Integration,ae as MissingPeerError,G as OutputValidationError,se as RoutingError,Ae as ServeStatic,ao as arrayEndpointsFactory,nt as arrayResultHandler,yo as attachRouting,kr as createConfig,it as createLogger,st as createMiddleware,ot as createResultHandler,go as createServer,io as defaultEndpointsFactory,be as defaultResultHandler,wr as ez,U as getExamples,k as getMessageFromError,Ne as getStatusCodeFromError,cn as testEndpoint,z as withMeta};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "15.1.0",
3
+ "version": "16.0.0-beta1",
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
  "repository": {
@@ -21,9 +21,9 @@
21
21
  "build": "yarn build:compile && yarn build:tests && yarn build:assets",
22
22
  "build:compile": "tsup && attw --pack",
23
23
  "build:tests": "yarn cleanup && tsx tools/make-tests.ts",
24
- "build:assets": "yarn build:swagger && yarn build:client && yarn build:license",
25
- "build:swagger": "tsx example/generate-open-api-schema.ts",
26
- "build:client": "tsx example/generate-client.ts && yarn prettier example/example.client.ts --write",
24
+ "build:assets": "yarn build:docs && yarn build:client && yarn build:license",
25
+ "build:docs": "tsx example/generate-documentation.ts",
26
+ "build:client": "tsx example/generate-client.ts",
27
27
  "build:license": "tsx tools/license.ts",
28
28
  "build:logo": "tsx tools/startup-logo.ts",
29
29
  "test": "yarn test:types && yarn test:unit && yarn test:badge",
@@ -64,7 +64,7 @@
64
64
  "*.md"
65
65
  ],
66
66
  "engines": {
67
- "node": "^18.0.0 || ^20.1.0"
67
+ "node": "^18.0.0 || ^20.0.0"
68
68
  },
69
69
  "dependencies": {
70
70
  "openapi3-ts": "^4.1.2",
@@ -82,6 +82,7 @@
82
82
  "express-fileupload": "^1.4.3",
83
83
  "http-errors": "^2.0.0",
84
84
  "jest": ">=28 <30",
85
+ "prettier": "^3.1.0",
85
86
  "typescript": "^5.1.3",
86
87
  "vitest": ">=0.34.6 <2",
87
88
  "winston": "^3.10.0",
@@ -115,6 +116,9 @@
115
116
  "jest": {
116
117
  "optional": true
117
118
  },
119
+ "prettier": {
120
+ "optional": true
121
+ },
118
122
  "vitest": {
119
123
  "optional": true
120
124
  },
@@ -154,7 +158,7 @@
154
158
  "make-coverage-badge": "^1.2.0",
155
159
  "mockdate": "^3.0.5",
156
160
  "prettier": "3.1.1",
157
- "tsd": "^0.29.0",
161
+ "tsd": "^0.30.0",
158
162
  "tsup": "^8.0.0",
159
163
  "tsx": "^4.6.2",
160
164
  "typescript": "^5.2.2",