express-zod-api 20.12.0 → 20.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -10
- package/README.md +2 -2
- package/dist/index.cjs +8 -8
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +8 -8
- package/migration/index.cjs +1 -1
- package/migration/index.js +1 -1
- package/package.json +5 -7
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
## Version 20
|
|
4
4
|
|
|
5
|
+
### v20.14.1
|
|
6
|
+
|
|
7
|
+
- `node-mocks-http` version is `^1.16.1`:
|
|
8
|
+
- This deduplicates the `@types/express` dependency to the version installed in your project;
|
|
9
|
+
- This fix is an addition to the support of Express 5 (v20.10.0) and its types (v20.14.0).
|
|
10
|
+
|
|
11
|
+
### v20.14.0
|
|
12
|
+
|
|
13
|
+
- Enabling usage of recently released `@types/express@^5.0.0`:
|
|
14
|
+
- This is an addition to the support of Express 5 introduced in v20.10.0.
|
|
15
|
+
|
|
5
16
|
### v20.12.0
|
|
6
17
|
|
|
7
18
|
- Feat: Graceful Shutdown
|
|
@@ -52,7 +63,7 @@ createConfig({
|
|
|
52
63
|
|
|
53
64
|
### v20.9.0
|
|
54
65
|
|
|
55
|
-
- `openapi3-ts`
|
|
66
|
+
- `openapi3-ts` version is 4.4.0:
|
|
56
67
|
- Feat: `Documentation::getSpecAsYaml()` accepts the same options as `yaml.stringify`.
|
|
57
68
|
|
|
58
69
|
### v20.8.0
|
|
@@ -600,7 +611,7 @@ const resultHandlerWithCleanup = createResultHandler({
|
|
|
600
611
|
|
|
601
612
|
### v18.6.0
|
|
602
613
|
|
|
603
|
-
- Feat: Supporting async
|
|
614
|
+
- Feat: Supporting async function as an argument for `EndpointsFactory::addOptions()`:
|
|
604
615
|
- I realized that it does not make sense for `.addOptions` just to proxy the static data;
|
|
605
616
|
- In case your options are static you can just `import` the corresponding `const` instead;
|
|
606
617
|
- Static options are deprecated and its support will be removed in v19.
|
|
@@ -632,7 +643,7 @@ const endpointsFactory = defaultEndpointsFactory.addOptions(async () => {
|
|
|
632
643
|
- ~~`withMeta()`~~ was introduced in version 2.10.0, because I didn't want to alter Zod's prototypes;
|
|
633
644
|
- However, the [new information](https://github.com/colinhacks/zod/pull/3445#issuecomment-2091463120) arrived
|
|
634
645
|
recently from the author of Zod on that matter;
|
|
635
|
-
- It turned out that altering Zod's prototypes is
|
|
646
|
+
- It turned out that altering Zod's prototypes is exactly the recommended approach for extending its functionality;
|
|
636
647
|
- Therefore `express-zod-api` from now on acts as a plugin for Zod, adding the `.example()` and `.label()` methods to
|
|
637
648
|
its prototypes that were previously available only after wrapping the schema in ~~`withMeta()`~~.
|
|
638
649
|
|
|
@@ -965,7 +976,7 @@ export const config = createConfig({
|
|
|
965
976
|
- Refinment methods of `ez.file()` removed;
|
|
966
977
|
- Minimum version of `vitest` supported is 1.0.4.
|
|
967
978
|
- How to migrate confidently:
|
|
968
|
-
- If you're using
|
|
979
|
+
- If you're using refinement methods of `ez.file()`:
|
|
969
980
|
- Replace ~~`ez.file().string()`~~ to `ez.file("string")`;
|
|
970
981
|
- Replace ~~`ez.file().buffer()`~~ to `ez.file("buffer")`;
|
|
971
982
|
- Replace ~~`ez.file().base64()`~~ to `ez.file("base64")`;
|
|
@@ -1013,7 +1024,7 @@ after:
|
|
|
1013
1024
|
- This version relies on `inspect()` method of `node:util` instead, for serializing objects in all cases.
|
|
1014
1025
|
- When the `level` is set to `debug` the inspected objects will be pretty printed.
|
|
1015
1026
|
- When the `level` is set to `warn` the inspected objects will be serialized in one line.
|
|
1016
|
-
-
|
|
1027
|
+
- Additionally, new option `depth` added to `SimplifiedWinstonConfig` that can be `number | null` being `2` by default.
|
|
1017
1028
|
- The option controls how deeply the objects should be inspected, serialized and printed.
|
|
1018
1029
|
- It can be set to `null` or `Infinity` for unlimited depth.
|
|
1019
1030
|
|
|
@@ -1342,7 +1353,7 @@ securitySchemes:
|
|
|
1342
1353
|
- Switching to [OpenAPI 3.1](https://swagger.io/specification/) for generating better Documentation for your API.
|
|
1343
1354
|
- Consider [the new UI](https://editor-next.swagger.io/) for exploring the produced documentation.
|
|
1344
1355
|
- Improved way of configuring descriptions and naming of the generated documentation components:
|
|
1345
|
-
-
|
|
1356
|
+
- Introducing the new option `descriptions` holding several formatting functions.
|
|
1346
1357
|
- Ability to generate formatted typescript client using the new async method `printFormatted` of the `Integration`
|
|
1347
1358
|
class when the `prettier` package is installed (detects automatically).
|
|
1348
1359
|
- Ability to supply your own typescript formatting function into that new method.
|
|
@@ -1427,7 +1438,7 @@ operationId:
|
|
|
1427
1438
|
- Transitioned from an exclusive approach to the inclusive one:
|
|
1428
1439
|
- Introducing the list of `files` included into the distribution (instead of ignoring redundant ones).
|
|
1429
1440
|
- Stable testing environment:
|
|
1430
|
-
- Inclusive, stable and
|
|
1441
|
+
- Inclusive, stable and extensible `tsconfig.json` files;
|
|
1431
1442
|
- Stable `package.json` for integration, ESM and compatibility tests;
|
|
1432
1443
|
- Dedicated environment for Issue #952 test.
|
|
1433
1444
|
- Simplified development commands.
|
|
@@ -1521,7 +1532,7 @@ logger.info("Payload", {});
|
|
|
1521
1532
|
|
|
1522
1533
|
### v14.2.4
|
|
1523
1534
|
|
|
1524
|
-
- Fixed internal logging format when
|
|
1535
|
+
- Fixed internal logging format when primitive are supplied as a second argument to the logger methods.
|
|
1525
1536
|
|
|
1526
1537
|
```typescript
|
|
1527
1538
|
logger.info("Listening", 8090);
|
|
@@ -1685,7 +1696,7 @@ defaultEndpointsFactory.build({
|
|
|
1685
1696
|
- Featuring the ability to customize the `operationId` in the generated documentation.
|
|
1686
1697
|
- Using the new property of `EndpointsFactory::build()` method you can now override the value of the
|
|
1687
1698
|
corresponding `operationId` of the endpoint in generated documentation.
|
|
1688
|
-
- When using this feature, you must ensure the
|
|
1699
|
+
- When using this feature, you must ensure the uniqueness of the IDs you specified across your API endpoints.
|
|
1689
1700
|
- The feature is implemented by [@john-schmitz](https://github.com/john-schmitz).
|
|
1690
1701
|
|
|
1691
1702
|
```typescript
|
|
@@ -1736,7 +1747,7 @@ defaultEndpointsFactory.build({
|
|
|
1736
1747
|
- Instead of `MiddlewareDefinition` type use `createMiddleware()` method.
|
|
1737
1748
|
- Instead of `ResultHandlerDefinition` type use `createResultHandler()` method.
|
|
1738
1749
|
- Instead of the mentioned security types use the `security` property of the `createMiddleware()` argument.
|
|
1739
|
-
- The issue 1182 is the continuation of the issue 952 "
|
|
1750
|
+
- The issue 1182 is the continuation of the issue 952 "Insufficient exports" (for consumer's declaration).
|
|
1740
1751
|
- Found and reported by [@bobgubko](https://github.com/bobgubko)
|
|
1741
1752
|
|
|
1742
1753
|
### v12.0.2
|
package/README.md
CHANGED
|
@@ -443,7 +443,7 @@ enough for the `output` schema if you're also aiming to [generate a valid docume
|
|
|
443
443
|
because the transformations themselves do not contain schemas. Addressing this case, the library offers the `.remap()`
|
|
444
444
|
method of the object schema, a part of the [Zod plugin](#zod-plugin), which under the hood, in addition to the
|
|
445
445
|
transformation, also `.pipe()` the transformed object into a new object schema.
|
|
446
|
-
Here is a recommended solution: it is
|
|
446
|
+
Here is a recommended solution: it is important to use shallow transformations only.
|
|
447
447
|
|
|
448
448
|
```ts
|
|
449
449
|
import camelize from "camelize-ts";
|
|
@@ -465,7 +465,7 @@ const endpoint = endpointsFactory.build({
|
|
|
465
465
|
});
|
|
466
466
|
```
|
|
467
467
|
|
|
468
|
-
The `.remap()` method can also accept an object with an
|
|
468
|
+
The `.remap()` method can also accept an object with an explicitly defined naming of your choice. The original keys
|
|
469
469
|
missing in that object remain unchanged (partial mapping).
|
|
470
470
|
|
|
471
471
|
```ts
|
package/dist/index.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(i)}},Qe=class extends Error{name="IOSchemaError"},V=class extends Qe{constructor(r){super(F(r));this.originalError=r}name="OutputValidationError"},U=class extends Qe{constructor(r){super(F(r));this.originalError=r}name="InputValidationError"},_=class extends Error{constructor(r,o){super(r);this.originalError=o}name="ResultHandlerError"},ue=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var
|
|
1
|
+
"use strict";var Mo=Object.create;var Ye=Object.defineProperty;var Uo=Object.getOwnPropertyDescriptor;var Ho=Object.getOwnPropertyNames;var Do=Object.getPrototypeOf,Fo=Object.prototype.hasOwnProperty;var Ko=(e,t)=>{for(var r in t)Ye(e,r,{get:t[r],enumerable:!0})},nr=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ho(t))!Fo.call(e,n)&&n!==r&&Ye(e,n,{get:()=>t[n],enumerable:!(o=Uo(t,n))||o.enumerable});return e};var O=(e,t,r)=>(r=e!=null?Mo(Do(e)):{},nr(t||!e||!e.__esModule?Ye(r,"default",{value:e,enumerable:!0}):r,e)),Bo=e=>nr(Ye({},"__esModule",{value:!0}),e);var Rs={};Ko(Rs,{BuiltinLogger:()=>Oe,DependsOnMethod:()=>Re,Documentation:()=>ut,DocumentationError:()=>z,EndpointsFactory:()=>Se,InputValidationError:()=>U,Integration:()=>St,Middleware:()=>B,MissingPeerError:()=>ue,OutputValidationError:()=>V,ResultHandler:()=>xe,RoutingError:()=>te,ServeStatic:()=>Pe,arrayEndpointsFactory:()=>Pr,arrayResultHandler:()=>at,attachRouting:()=>Jr,createConfig:()=>cr,createServer:()=>Wr,defaultEndpointsFactory:()=>Ar,defaultResultHandler:()=>be,ez:()=>No,getExamples:()=>K,getMessageFromError:()=>F,getStatusCodeFromError:()=>Me,testEndpoint:()=>To});module.exports=Bo(Rs);var P=require("ramda"),ne=require("zod");var sr=require("http-errors"),ir=require("node:crypto"),Je=require("ramda"),ar=require("zod");var te=class extends Error{name="RoutingError"},z=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let i=`${t}
|
|
2
|
+
Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(i)}},Qe=class extends Error{name="IOSchemaError"},V=class extends Qe{constructor(r){super(F(r));this.originalError=r}name="OutputValidationError"},U=class extends Qe{constructor(r){super(F(r));this.originalError=r}name="InputValidationError"},_=class extends Error{constructor(r,o){super(r);this.originalError=o}name="ResultHandlerError"},ue=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var w={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var qo=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(w.upload);return"files"in e&&r},Ot={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},$o=["body","query","params"],Rt=e=>e.method.toLowerCase(),At=e=>e.startsWith("x-"),Go=e=>(0,Je.pickBy)((t,r)=>At(r),e),Pt=(e,t={})=>{let r=Rt(e);return r==="options"?{}:(t[r]||Ot[r]||$o).filter(o=>o==="files"?qo(e):!0).map(o=>o==="headers"?Go(e[o]):e[o]).reduce((o,n)=>({...o,...n}),{})},fe=e=>e instanceof Error?e:new Error(String(e)),F=e=>e instanceof ar.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,Me=e=>(0,sr.isHttpError)(e)?e.statusCode:e instanceof U?400:500,Ct=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
|
|
3
3
|
${o.stack}
|
|
4
|
-
`,{url:t.url,payload:r})},K=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[h]?.examples||[];if(!r&&t==="original")return o;let n=[];for(let i of o){let a=e.safeParse(i);a.success&&n.push(t==="parsed"?a.data:i)}return n},re=(e,t,r)=>e.length&&t.length?(0,Je.xprod)(e,t).map(r):e.concat(t),Ue=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,It=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),
|
|
5
|
-
Original error: ${e.originalError.message}.`:""))};var br=require("ramda");var ie=e=>oe(e)&&"or"in e,ge=e=>oe(e)&&"and"in e,wt=e=>({and:(0,br.chain)(t=>ge(t)?t.and:[t],e)}),nt=(e,t)=>ge(e)?{and:e.and.map(r=>ie(r)?{or:r.or.map(t)}:t(r))}:ie(e)?{or:e.or.map(r=>ge(r)?{and:r.and.map(t)}:t(r))}:t(e),Et=e=>e.and.reduce((t,r)=>({or:re(t.or,ie(r)?r.or:[r],wt)}),{or:[]}),ye=(e,t)=>ge(e)?ie(t)?ye(Et(e),t):wt([e,t]):ie(e)?ge(t)?ye(t,e):ie(t)?{or:re(e.or,t.or,wt)}:ye(e,{and:[t]}):ge(t)||ie(t)?ye(t,e):{and:[e,t]};var vt=require("zod");var Zt=class{},B=class extends Zt{#e;#t;#r;constructor({input:t,security:r,handler:o}){super(),this.#e=t,this.#t=r,this.#r=o}getSecurity(){return this.#t}getSchema(){return this.#e}async execute({input:t,...r}){try{let o=await this.#e.parseAsync(t);return this.#r({...r,input:o})}catch(o){throw o instanceof vt.z.ZodError?new U(o):o}}},he=class extends B{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({input:vt.z.object({}),handler:async({request:n,response:i})=>new Promise((a,p)=>{let l=c=>{if(c&&c instanceof Error)return p(o(c));a(r(n,i))};t(n,i,l)?.catch(l)})})}};var Fe=class{},st=class extends Fe{#e;#t;#r;#i;#o;#a;#p;#n;#c;#d;#l;#s;constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:i,getOperationId:a=()=>{},scopes:p=[],middlewares:l=[],tags:c=[],description:m,shortDescription:y}){super(),this.#a=n,this.#p=i,this.#r=l,this.#l=a,this.#t=Object.freeze(t),this.#c=Object.freeze(p),this.#d=Object.freeze(c),this.#e={long:m,short:y},this.#n={input:r,output:o},this.#o={positive:Object.freeze(i.getPositiveResponse(o)),negative:Object.freeze(i.getNegativeResponse())},this.#s=hr(r)?"upload":xr(r)?"raw":"json",this.#i={input:Object.freeze([Z[this.#s]]),positive:Object.freeze(this.#o.positive.flatMap(({mimeTypes:u})=>u)),negative:Object.freeze(this.#o.negative.flatMap(({mimeTypes:u})=>u))}}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return t==="input"||t==="output"?this.#n[t]:this.getResponses(t).map(({schema:r})=>r).reduce((r,o)=>r.or(o))}getMimeTypes(t){return this.#i[t]}getRequestType(){return this.#s}getResponses(t){return this.#o[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?ye(t,o):t},{and:[]})}getScopes(){return this.#c}getTags(){return this.#d}getOperationId(t){return this.#l(t)}#m(t){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#t.concat(t).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#n.output.parseAsync(t)}catch(r){throw r instanceof jt.z.ZodError?new V(r):r}}async#f({method:t,input:r,request:o,response:n,logger:i,options:a}){for(let p of this.#r)if(!(t==="options"&&!(p instanceof he))&&(Object.assign(a,await p.execute({input:r,options:a,request:o,response:n,logger:i})),n.writableEnded)){i.warn("A middleware has closed the stream. Accumulated options:",a);break}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#n.input.parseAsync(t)}catch(i){throw i instanceof jt.z.ZodError?new U(i):i}return this.#a({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:i,output:a,options:p}){try{await this.#p.execute({error:t,output:a,request:r,response:o,logger:n,input:i,options:p})}catch(l){ot({logger:n,response:o,error:new _(fe(l).message,t||void 0)})}}async execute({request:t,response:r,logger:o,config:n,siblingMethods:i=[]}){let a=Rt(t),p={},l=null,c=null;if(n.cors){let y=this.#m(i);typeof n.cors=="function"&&(y=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:y}));for(let u in y)r.set(u,y[u])}let m=Pt(t,n.inputSources);try{if(await this.#f({method:a,input:m,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}l=await this.#u(await this.#y({input:m,logger:o,options:p}))}catch(y){c=fe(y)}await this.#g({input:m,output:l,request:t,response:r,error:c,logger:o,options:p})}};var Sr=(e,t)=>{let r=e.map(n=>n.getSchema()).concat(t),o=r.reduce((n,i)=>n.and(i));return r.reduce((n,i)=>pr(i,n),o)};var M=require("zod");var Ke={positive:200,negative:400};var Tr=O(require("node:assert/strict"),1),Or=require("zod");var it=(e,t)=>typeof e=="function"?it(e(...t.arguments),t):e instanceof Or.z.ZodType?[{...t,schema:e}]:(Array.isArray(e)&&(0,Tr.default)(e.length,new _(`At least one ${t.variant} response schema required.`)),(Array.isArray(e)?e:[e]).map(({schema:r,statusCodes:o,statusCode:n,mimeTypes:i,mimeType:a})=>({schema:r,statusCodes:n?[n]:o||t.statusCodes,mimeTypes:a?[a]:i||t.mimeTypes})));var Lt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},xe=class extends Lt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return it(this.#e,{variant:"positive",arguments:[t],statusCodes:[Ke.positive],mimeTypes:[Z.json]})}getNegativeResponse(){return it(this.#t,{variant:"negative",arguments:[],statusCodes:[Ke.negative],mimeTypes:[Z.json]})}},be=new xe({positive:e=>{let t=K({schema:e}),r=M.z.object({status:M.z.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:M.z.object({status:M.z.literal("error"),error:M.z.object({message:M.z.string()})}).example({status:"error",error:{message:F(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:i})=>{if(!e){n.status(Ke.positive).json({status:"success",data:r});return}let a=Me(e);Ct({logger:i,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:F(e)}})}}),at=new xe({positive:e=>{let t=K({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof M.z.ZodArray?e.shape.items:M.z.array(M.z.any());return t.reduce((o,n)=>oe(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:M.z.string().example(F(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:i})=>{if(r){let a=Me(r);Ct({logger:o,statusCode:a,request:n,error:r,input:i}),e.status(a).type("text/plain").send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(Ke.positive).json(t.items):e.status(500).type("text/plain").send("Property 'items' is missing in the endpoint output")}});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 instanceof B?t:new B(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new he(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new B({input:Rr.z.object({}),handler:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:i,operationId:a,...p}){let{middlewares:l,resultHandler:c}=this,m="methods"in p?p.methods:[p.method],y=typeof a=="function"?a:()=>a,u="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 st({handler:r,middlewares:l,outputSchema:o,resultHandler:c,scopes:u,tags:x,methods:m,getOperationId:y,description:n,shortDescription:i,inputSchema:Sr(l,t)})}},Ar=new Se(be),Pr=new Se(at);var v=require("ansis"),Er=require("node:util"),Nt=require("node:perf_hooks");var Te={debug:10,info:20,warn:30,error:40},Ir=e=>oe(e)&&Object.keys(Te).some(t=>t in e),zr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),pt=zr(),Cr=zr(2),Xo=e=>e<1e-6?["picosecond",e/1e-9,pt]:e<.001?["nanosecond",e/1e-6,pt]:e<1?["microsecond",e/.001,pt]:e<1e3?["millisecond",e,pt]:e<6e4?["second",e/1e3,Cr]:["minute",e/6e4,Cr],wr=e=>{let[t,r,o]=Xo(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var Oe=class e{constructor(t){this.config=t;let{color:r=new v.Ansis().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:v.blue,info:v.green,warn:(0,v.hex)("#FFA500"),error:v.red};prettyPrint(t){let{depth:r=2}=this.config;return(0,Er.inspect)(t,{depth:r,colors:this.hasColor,breakLength:this.config.level==="debug"?80:1/0,compact:this.config.level==="debug"?3:!0})}print(t,r,o){if(this.config.level==="silent"||Te[t]<Te[this.config.level])return;let{requestId:n,...i}=this.config.ctx||{},a=[new Date().toISOString()];n&&a.push(this.hasColor?(0,v.cyanBright)(n):n),a.push(this.hasColor?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&a.push(this.prettyPrint(o)),Object.keys(i).length>0&&a.push(this.prettyPrint(i)),console.log(a.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}profile(t){let r=Nt.performance.now();return()=>{let o=Nt.performance.now()-r,{message:n,severity:i="debug",formatter:a=wr}=typeof t=="object"?t:{message:t};this.print(typeof i=="function"?i(o):i,n,a(o))}}};var Ae=require("ramda"),Re=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze((0,Ae.toPairs)(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=(0,Ae.head)(this.pairs)?.[1],this.siblingMethods=Object.freeze((0,Ae.tail)(this.pairs).map(([r])=>r))}};var Zr=O(require("express"),1),Pe=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Zr.default.static(...this.params))}};var ct=O(require("express"),1),Vr=O(require("node:http"),1),_r=O(require("node:https"),1);var Mr=require("node:timers/promises");var vr=e=>"_httpMessage"in e&&typeof e._httpMessage=="object"&&e._httpMessage!==null&&"headersSent"in e._httpMessage&&typeof e._httpMessage.headersSent=="boolean"&&"setHeader"in e._httpMessage&&typeof e._httpMessage.setHeader=="function",jr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Lr=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Nr=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),kr=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var Ur=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,i=c=>void n.delete(c.destroy()),a=c=>void(vr(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):i(c)),p=c=>void(o?c.destroy():n.add(c.once("close",()=>void n.delete(c))));for(let c of e)for(let m of["connection","secureConnection"])c.on(m,p);let l=async()=>{for(let c of e)c.on("request",Nr);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(Lr(c)||jr(c))&&a(c);for await(let c of(0,Mr.setInterval)(10,Date.now()))if(n.size===0||Date.now()-c>=t)break;for(let c of n)i(c);return Promise.allSettled(e.map(kr))};return{sockets:n,shutdown:()=>o??=l()}};var Ce=async(e,t="default")=>{try{return(await Promise.resolve().then(()=>O(require(e))))[t]}catch{}throw new ue(e)};var kt=O(require("node:assert/strict"),1);var ae=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{let i=Object.entries(e).map(([a,p])=>[a.trim(),p]);for(let[a,p]of i){kt.default.doesNotMatch(a,/\//,new te(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let l=`${o||""}${a?`/${a}`:""}`;if(p instanceof Fe){let c=p.getMethods().slice();n&&c.push("options");for(let m of c)t(p,l,m)}else if(p instanceof Pe)r&&p.apply(l,r);else if(p instanceof Re){for(let[c,m]of p.pairs)(0,kt.default)(m.getMethods().includes(c),new te(`Endpoint assigned to ${c} method of ${l} must support ${c} method.`)),t(m,l,c);n&&p.firstEndpoint&&t(p.firstEndpoint,l,"options",p.siblingMethods)}else ae({onEndpoint:t,onStatic:r,hasCors:n,routing:p,parentPath:l})}};var Mt=({app:e,getChildLogger:t,config:r,routing:o,parsers:n})=>ae({routing:o,hasCors:!!r.cors,onEndpoint:(i,a,p,l)=>{e[p](a,...n?.[i.getRequestType()]||[],async(c,m)=>i.execute({request:c,response:m,logger:t(c),config:r,siblingMethods:l}))},onStatic:(i,a)=>{e.use(i,a)}});var Be=O(require("http-errors"),1);var Hr=({errorHandler:e,getChildLogger:t})=>async(r,o,n,i)=>r?e.execute({error:(0,Be.isHttpError)(r)?r:(0,Be.default)(400,fe(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):i(),Dr=({errorHandler:e,getChildLogger:t})=>async(r,o)=>{let n=(0,Be.default)(404,`Can not ${r.method} ${r.path}`),i=t(r);try{e.execute({request:r,response:o,logger:i,error:n,input:null,output:null,options:{}})}catch(a){ot({response:o,logger:i,error:new _(fe(a).message,n)})}},en=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},tn=e=>({log:e.debug.bind(e)}),Fr=async({getChildLogger:e,config:t})=>{let r=await Ce("express-fileupload"),{limitError:o,beforeUpload:n,...i}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,l,c)=>{let m=e(p);try{await n?.({request:p,logger:m})}catch(y){return c(y)}return r({debug:!0,...i,abortOnLimit:!1,parseNested:!0,logger:tn(m)})(p,l,c)}),o&&a.push(en(o)),a},Kr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},Br=({rootLogger:e,config:t})=>async(r,o,n)=>{let i=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;i.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[h]={logger:i}),n()},qr=e=>t=>t.res?.locals[h]?.logger||e,$r=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
|
|
6
|
-
`).slice(1)));var
|
|
4
|
+
`,{url:t.url,payload:r})},K=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[h]?.examples||[];if(!r&&t==="original")return o;let n=[];for(let i of o){let a=e.safeParse(i);a.success&&n.push(t==="parsed"?a.data:i)}return n},re=(e,t,r)=>e.length&&t.length?(0,Je.xprod)(e,t).map(r):e.concat(t),Ue=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,It=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),N=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(It).join(""),We=e=>(0,ir.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Xe=(e,t)=>{try{return typeof e.parse(t)}catch{return}},oe=e=>typeof e=="object"&&e!==null;var et=require("ramda"),h=Symbol.for("express-zod-api"),tt=e=>{let t=e.describe(e.description);return t._def[h]=(0,et.clone)(t._def[h])||{examples:[]},t},pr=(e,t)=>{if(!(h in e._def))return t;let r=tt(t);return r._def[h].examples=re(r._def[h].examples,e._def[h].examples,([o,n])=>typeof o=="object"&&typeof n=="object"?(0,et.mergeDeepRight)({...o},{...n}):n),r};var Vo=function(e){let t=tt(this);return t._def[h].examples.push(e),t},_o=function(e){let t=tt(this);return t._def[h].defaultLabel=e,t},Yo=function(e){return new ne.z.ZodBranded({typeName:ne.z.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[h]:{examples:[],...(0,P.clone)(this._def[h]),brand:e}})},Qo=function(e){let t=typeof e=="function"?e:(0,P.pipe)(P.toPairs,(0,P.map)(([n,i])=>(0,P.pair)(e[String(n)]||n,i)),P.fromPairs),r=t((0,P.clone)(this.shape)),o=ne.z.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};h in globalThis||(globalThis[h]=!0,Object.defineProperties(ne.z.ZodType.prototype,{example:{get(){return Vo.bind(this)}},brand:{set(){},get(){return Yo.bind(this)}}}),Object.defineProperty(ne.z.ZodDefault.prototype,"label",{get(){return _o.bind(this)}}),Object.defineProperty(ne.z.ZodObject.prototype,"remap",{get(){return Qo.bind(this)}}));function cr(e){return e}var Rr=require("zod");var jt=require("zod");var lr=require("zod");var He=require("zod"),Y=Symbol("File"),dr=He.z.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),Jo={buffer:()=>dr.brand(Y),string:()=>He.z.string().brand(Y),binary:()=>dr.or(He.z.string()).brand(Y),base64:()=>He.z.string().base64().brand(Y)};function rt(e){return Jo[e||"string"]()}var se=Symbol("Raw"),mr=(e={})=>lr.z.object({raw:rt("buffer")}).extend(e).brand(se);var ur=require("zod"),De=Symbol("Upload"),fr=()=>ur.z.custom(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.encoding=="string"&&typeof e.mimetype=="string"&&Buffer.isBuffer(e.data)&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",e=>({message:`Expected file upload, received ${typeof e}`})).brand(De);var yr=(e,{next:t})=>e.options.some(t),Wo=({_def:e},{next:t})=>[e.left,e.right].some(t),gr=(e,{next:t})=>t(e.unwrap()),Xo={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:yr,ZodDiscriminatedUnion:yr,ZodIntersection:Wo,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:gr,ZodNullable:gr,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},zt=(e,{condition:t,rules:r=Xo,depth:o=1,maxDepth:n=Number.POSITIVE_INFINITY})=>{if(t(e))return!0;let i=o<n?r[e._def.typeName]:void 0;return i?i(e,{next:a=>zt(a,{condition:t,rules:r,maxDepth:n,depth:o+1})}):!1},hr=e=>zt(e,{condition:t=>t._def[h]?.brand===De}),xr=e=>zt(e,{condition:t=>t._def[h]?.brand===se,maxDepth:3});var ot=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).type("text/plain").end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
|
|
5
|
+
Original error: ${e.originalError.message}.`:""))};var br=require("ramda");var ie=e=>oe(e)&&"or"in e,ge=e=>oe(e)&&"and"in e,wt=e=>({and:(0,br.chain)(t=>ge(t)?t.and:[t],e)}),nt=(e,t)=>ge(e)?{and:e.and.map(r=>ie(r)?{or:r.or.map(t)}:t(r))}:ie(e)?{or:e.or.map(r=>ge(r)?{and:r.and.map(t)}:t(r))}:t(e),Et=e=>e.and.reduce((t,r)=>({or:re(t.or,ie(r)?r.or:[r],wt)}),{or:[]}),ye=(e,t)=>ge(e)?ie(t)?ye(Et(e),t):wt([e,t]):ie(e)?ge(t)?ye(t,e):ie(t)?{or:re(e.or,t.or,wt)}:ye(e,{and:[t]}):ge(t)||ie(t)?ye(t,e):{and:[e,t]};var vt=require("zod");var Zt=class{},B=class extends Zt{#e;#t;#r;constructor({input:t,security:r,handler:o}){super(),this.#e=t,this.#t=r,this.#r=o}getSecurity(){return this.#t}getSchema(){return this.#e}async execute({input:t,...r}){try{let o=await this.#e.parseAsync(t);return this.#r({...r,input:o})}catch(o){throw o instanceof vt.z.ZodError?new U(o):o}}},he=class extends B{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({input:vt.z.object({}),handler:async({request:n,response:i})=>new Promise((a,p)=>{let l=c=>{if(c&&c instanceof Error)return p(o(c));a(r(n,i))};t(n,i,l)?.catch(l)})})}};var Fe=class{},st=class extends Fe{#e;#t;#r;#i;#o;#a;#p;#n;#c;#d;#l;#s;constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:i,getOperationId:a=()=>{},scopes:p=[],middlewares:l=[],tags:c=[],description:m,shortDescription:y}){super(),this.#a=n,this.#p=i,this.#r=l,this.#l=a,this.#t=Object.freeze(t),this.#c=Object.freeze(p),this.#d=Object.freeze(c),this.#e={long:m,short:y},this.#n={input:r,output:o},this.#o={positive:Object.freeze(i.getPositiveResponse(o)),negative:Object.freeze(i.getNegativeResponse())},this.#s=hr(r)?"upload":xr(r)?"raw":"json",this.#i={input:Object.freeze([w[this.#s]]),positive:Object.freeze(this.#o.positive.flatMap(({mimeTypes:u})=>u)),negative:Object.freeze(this.#o.negative.flatMap(({mimeTypes:u})=>u))}}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return t==="input"||t==="output"?this.#n[t]:this.getResponses(t).map(({schema:r})=>r).reduce((r,o)=>r.or(o))}getMimeTypes(t){return this.#i[t]}getRequestType(){return this.#s}getResponses(t){return this.#o[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?ye(t,o):t},{and:[]})}getScopes(){return this.#c}getTags(){return this.#d}getOperationId(t){return this.#l(t)}#m(t){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#t.concat(t).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#n.output.parseAsync(t)}catch(r){throw r instanceof jt.z.ZodError?new V(r):r}}async#f({method:t,input:r,request:o,response:n,logger:i,options:a}){for(let p of this.#r)if(!(t==="options"&&!(p instanceof he))&&(Object.assign(a,await p.execute({input:r,options:a,request:o,response:n,logger:i})),n.writableEnded)){i.warn("A middleware has closed the stream. Accumulated options:",a);break}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#n.input.parseAsync(t)}catch(i){throw i instanceof jt.z.ZodError?new U(i):i}return this.#a({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:i,output:a,options:p}){try{await this.#p.execute({error:t,output:a,request:r,response:o,logger:n,input:i,options:p})}catch(l){ot({logger:n,response:o,error:new _(fe(l).message,t||void 0)})}}async execute({request:t,response:r,logger:o,config:n,siblingMethods:i=[]}){let a=Rt(t),p={},l=null,c=null;if(n.cors){let y=this.#m(i);typeof n.cors=="function"&&(y=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:y}));for(let u in y)r.set(u,y[u])}let m=Pt(t,n.inputSources);try{if(await this.#f({method:a,input:m,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}l=await this.#u(await this.#y({input:m,logger:o,options:p}))}catch(y){c=fe(y)}await this.#g({input:m,output:l,request:t,response:r,error:c,logger:o,options:p})}};var Sr=(e,t)=>{let r=e.map(n=>n.getSchema()).concat(t),o=r.reduce((n,i)=>n.and(i));return r.reduce((n,i)=>pr(i,n),o)};var k=require("zod");var Ke={positive:200,negative:400};var Tr=O(require("node:assert/strict"),1),Or=require("zod");var it=(e,t)=>typeof e=="function"?it(e(...t.arguments),t):e instanceof Or.z.ZodType?[{...t,schema:e}]:(Array.isArray(e)&&(0,Tr.default)(e.length,new _(`At least one ${t.variant} response schema required.`)),(Array.isArray(e)?e:[e]).map(({schema:r,statusCodes:o,statusCode:n,mimeTypes:i,mimeType:a})=>({schema:r,statusCodes:n?[n]:o||t.statusCodes,mimeTypes:a?[a]:i||t.mimeTypes})));var Lt=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},xe=class extends Lt{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return it(this.#e,{variant:"positive",arguments:[t],statusCodes:[Ke.positive],mimeTypes:[w.json]})}getNegativeResponse(){return it(this.#t,{variant:"negative",arguments:[],statusCodes:[Ke.negative],mimeTypes:[w.json]})}},be=new xe({positive:e=>{let t=K({schema:e}),r=k.z.object({status:k.z.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:k.z.object({status:k.z.literal("error"),error:k.z.object({message:k.z.string()})}).example({status:"error",error:{message:F(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:i})=>{if(!e){n.status(Ke.positive).json({status:"success",data:r});return}let a=Me(e);Ct({logger:i,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:F(e)}})}}),at=new xe({positive:e=>{let t=K({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof k.z.ZodArray?e.shape.items:k.z.array(k.z.any());return t.reduce((o,n)=>oe(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:k.z.string().example(F(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:i})=>{if(r){let a=Me(r);Ct({logger:o,statusCode:a,request:n,error:r,input:i}),e.status(a).type("text/plain").send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(Ke.positive).json(t.items):e.status(500).type("text/plain").send("Property 'items' is missing in the endpoint output")}});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 instanceof B?t:new B(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new he(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new B({input:Rr.z.object({}),handler:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:i,operationId:a,...p}){let{middlewares:l,resultHandler:c}=this,m="methods"in p?p.methods:[p.method],y=typeof a=="function"?a:()=>a,u="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 st({handler:r,middlewares:l,outputSchema:o,resultHandler:c,scopes:u,tags:x,methods:m,getOperationId:y,description:n,shortDescription:i,inputSchema:Sr(l,t)})}},Ar=new Se(be),Pr=new Se(at);var E=require("ansis"),Er=require("node:util"),Nt=require("node:perf_hooks");var Te={debug:10,info:20,warn:30,error:40},Ir=e=>oe(e)&&Object.keys(Te).some(t=>t in e),zr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),pt=zr(),Cr=zr(2),en=e=>e<1e-6?["picosecond",e/1e-9,pt]:e<.001?["nanosecond",e/1e-6,pt]:e<1?["microsecond",e/.001,pt]:e<1e3?["millisecond",e,pt]:e<6e4?["second",e/1e3,Cr]:["minute",e/6e4,Cr],wr=e=>{let[t,r,o]=en(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var Oe=class e{constructor(t){this.config=t;let{color:r=new E.Ansis().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:E.blue,info:E.green,warn:(0,E.hex)("#FFA500"),error:E.red};prettyPrint(t){let{depth:r=2}=this.config;return(0,Er.inspect)(t,{depth:r,colors:this.hasColor,breakLength:this.config.level==="debug"?80:1/0,compact:this.config.level==="debug"?3:!0})}print(t,r,o){if(this.config.level==="silent"||Te[t]<Te[this.config.level])return;let{requestId:n,...i}=this.config.ctx||{},a=[new Date().toISOString()];n&&a.push(this.hasColor?(0,E.cyanBright)(n):n),a.push(this.hasColor?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&a.push(this.prettyPrint(o)),Object.keys(i).length>0&&a.push(this.prettyPrint(i)),console.log(a.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}profile(t){let r=Nt.performance.now();return()=>{let o=Nt.performance.now()-r,{message:n,severity:i="debug",formatter:a=wr}=typeof t=="object"?t:{message:t};this.print(typeof i=="function"?i(o):i,n,a(o))}}};var Ae=require("ramda"),Re=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze((0,Ae.toPairs)(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=(0,Ae.head)(this.pairs)?.[1],this.siblingMethods=Object.freeze((0,Ae.tail)(this.pairs).map(([r])=>r))}};var Zr=O(require("express"),1),Pe=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Zr.default.static(...this.params))}};var ct=O(require("express"),1),_r=O(require("node:http"),1),Yr=O(require("node:https"),1);var Ce=async(e,t="default")=>{try{return(await Promise.resolve().then(()=>O(require(e))))[t]}catch{}throw new ue(e)};var kt=O(require("node:assert/strict"),1);var ae=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{let i=Object.entries(e).map(([a,p])=>[a.trim(),p]);for(let[a,p]of i){kt.default.doesNotMatch(a,/\//,new te(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let l=`${o||""}${a?`/${a}`:""}`;if(p instanceof Fe){let c=p.getMethods().slice();n&&c.push("options");for(let m of c)t(p,l,m)}else if(p instanceof Pe)r&&p.apply(l,r);else if(p instanceof Re){for(let[c,m]of p.pairs)(0,kt.default)(m.getMethods().includes(c),new te(`Endpoint assigned to ${c} method of ${l} must support ${c} method.`)),t(m,l,c);n&&p.firstEndpoint&&t(p.firstEndpoint,l,"options",p.siblingMethods)}else ae({onEndpoint:t,onStatic:r,hasCors:n,routing:p,parentPath:l})}};var Mt=({app:e,getChildLogger:t,config:r,routing:o,parsers:n})=>ae({routing:o,hasCors:!!r.cors,onEndpoint:(i,a,p,l)=>{e[p](a,...n?.[i.getRequestType()]||[],async(c,m)=>i.execute({request:c,response:m,logger:t(c),config:r,siblingMethods:l}))},onStatic:(i,a)=>{e.use(i,a)}});var Be=O(require("http-errors"),1);var Mr=require("node:timers/promises");var vr=e=>"_httpMessage"in e&&typeof e._httpMessage=="object"&&e._httpMessage!==null&&"headersSent"in e._httpMessage&&typeof e._httpMessage.headersSent=="boolean"&&"setHeader"in e._httpMessage&&typeof e._httpMessage.setHeader=="function",jr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",Lr=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,Nr=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),kr=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var Ur=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,i=c=>void n.delete(c.destroy()),a=c=>void(vr(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):i(c)),p=c=>void(o?c.destroy():n.add(c.once("close",()=>void n.delete(c))));for(let c of e)for(let m of["connection","secureConnection"])c.on(m,p);let l=async()=>{for(let c of e)c.on("request",Nr);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(Lr(c)||jr(c))&&a(c);for await(let c of(0,Mr.setInterval)(10,Date.now()))if(n.size===0||Date.now()-c>=t)break;for(let c of n)i(c);return Promise.allSettled(e.map(kr))};return{sockets:n,shutdown:()=>o??=l()}};var Hr=({errorHandler:e,getChildLogger:t})=>async(r,o,n,i)=>r?e.execute({error:(0,Be.isHttpError)(r)?r:(0,Be.default)(400,fe(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):i(),Dr=({errorHandler:e,getChildLogger:t})=>async(r,o)=>{let n=(0,Be.default)(404,`Can not ${r.method} ${r.path}`),i=t(r);try{e.execute({request:r,response:o,logger:i,error:n,input:null,output:null,options:{}})}catch(a){ot({response:o,logger:i,error:new _(fe(a).message,n)})}},tn=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},rn=e=>({log:e.debug.bind(e)}),Fr=async({getChildLogger:e,config:t})=>{let r=await Ce("express-fileupload"),{limitError:o,beforeUpload:n,...i}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,l,c)=>{let m=e(p);try{await n?.({request:p,logger:m})}catch(y){return c(y)}return r({debug:!0,...i,abortOnLimit:!1,parseNested:!0,logger:rn(m)})(p,l,c)}),o&&a.push(tn(o)),a},Kr=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},Br=({rootLogger:e,config:t})=>async(r,o,n)=>{let i=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;i.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[h]={logger:i}),n()},qr=e=>t=>t.res?.locals[h]?.logger||e,$r=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
|
|
6
|
+
`).slice(1))),Gr=({servers:e,logger:t,options:{timeout:r,events:o=["SIGINT","SIGTERM"]}})=>{let n=Ur(e,{logger:t,timeout:r}),i=()=>n.shutdown().then(()=>process.exit());for(let a of o)process.on(a,i)};var Z=require("ansis"),Vr=()=>{let e=(0,Z.italic)("Proudly supports transgender community.".padStart(109)),t=(0,Z.italic)("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=(0,Z.italic)("Thank you for choosing Express Zod API for your project.".padStart(132)),o=(0,Z.italic)("for Zoey".padEnd(20)),n=(0,Z.hex)("#F5A9B8"),i=(0,Z.hex)("#5BCEFA"),a=new Array(14).fill(i,1,3).fill(n,3,5).fill(Z.whiteBright,5,7).fill(n,7,9).fill(i,9,12).fill(Z.gray,12,13);return`
|
|
7
7
|
8888888888 8888888888P 888 d8888 8888888b. 8888888
|
|
8
8
|
888 d88P 888 d88888 888 Y88b 888
|
|
9
9
|
888 d88P 888 d88P888 888 888 888
|
|
@@ -18,8 +18,8 @@ ${o}888${t}
|
|
|
18
18
|
${r}
|
|
19
19
|
`.split(`
|
|
20
20
|
`).map((l,c)=>a[c]?a[c](l):l).join(`
|
|
21
|
-
`)};var Yr=e=>{e.startupLogo!==!1&&console.log(Gr());let t=e.errorHandler||be,r=Ir(e.logger)?e.logger:new Oe(e.logger);r.debug("Running","v20.12.0 (CJS)"),$r(r);let o=Br({rootLogger:r,config:e}),i={getChildLogger:qr(r),errorHandler:t},a=Dr(i),p=Hr(i);return{...i,rootLogger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},Qr=(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,loggingMiddleware:i}=Yr(e);return Mt({app:e.app.use(i),routing:t,getChildLogger:o,config:e}),{notFoundHandler:n,logger:r}},Jr=async(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=Yr(e),p=(0,ct.default)().disable("x-powered-by").use(a);if(e.server.compression){let u=await Ce("compression");p.use(u(typeof e.server.compression=="object"?e.server.compression:void 0))}let l={json:[e.server.jsonParser||ct.default.json()],raw:[e.server.rawParser||ct.default.raw(),Kr],upload:e.server.upload?await Fr({config:e,getChildLogger:o}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:p,logger:r,getChildLogger:o}),Mt({app:p,routing:t,getChildLogger:o,config:e,parsers:l}),p.use(i,n);let c=(u,x)=>u.listen(x,()=>r.info("Listening",x)),m=Vr.default.createServer(p),y=e.https&&_r.default.createServer(e.https.options,p);if(e.gracefulShutdown){let{events:u=["SIGINT","SIGTERM"],timeout:x}=typeof e.gracefulShutdown=="object"?e.gracefulShutdown:{},R=Ur([m].concat(y||[]),{logger:r,timeout:x}),b=()=>R.shutdown().then(()=>process.exit());for(let I of u)process.on(I,b)}return{app:p,logger:r,httpServer:c(m,e.server.listen),httpsServer:y&&c(y,e.https?.listen)}};var ho=O(require("node:assert/strict"),1),xo=require("openapi3-ts/oas31"),bo=require("ramda");var Q=O(require("node:assert/strict"),1),q=require("openapi3-ts/oas31"),d=require("ramda"),T=require("zod");var Ie=require("zod");var dt=e=>!isNaN(e.getTime());var qe=Symbol("DateIn"),Wr=()=>Ie.z.union([Ie.z.string().date(),Ie.z.string().datetime(),Ie.z.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Ie.z.date().refine(dt)).brand(qe);var Xr=require("zod");var $e=Symbol("DateOut"),eo=()=>Xr.z.date().refine(dt).transform(e=>e.toISOString()).brand($e);var pe=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[h]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>pe(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),l=t&&t(e,{prev:p,...n});return l?{...p,...l}:p};var to=50,oo="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",rn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},no=/:([A-Za-z0-9_]+)/g,on=e=>e.match(no)?.map(t=>t.slice(1))||[],so=e=>e.replace(no,t=>`{${t.slice(1)}}`),nn=({_def:e},{next:t})=>({...t(e.innerType),default:e[h]?.defaultLabel||e.defaultValue()}),sn=({_def:{innerType:e}},{next:t})=>t(e),an=()=>({format:"any"}),pn=({},e)=>((0,Q.default)(!e.isResponse,new E({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),cn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof T.z.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},dn=({options:e},{next:t})=>({oneOf:e.map(t)}),ln=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),mn=e=>{let[t,r]=e.filter(q.isSchemaObject).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));(0,Q.default)(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,d.mergeDeepWith)((n,i)=>Array.isArray(n)&&Array.isArray(i)?(0,d.concat)(n,i):n===i?i:Q.default.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,d.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=re(t.examples||[],r.examples||[],([n,i])=>(0,d.mergeDeepRight)(n,i))),o},un=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return mn(o)}catch{}return{allOf:o}},fn=(e,{next:t})=>t(e.unwrap()),yn=(e,{next:t})=>t(e.unwrap()),gn=(e,{next:t})=>{let r=t(e.unwrap());return(0,q.isSchemaObject)(r)&&(r.type=ao(r)),r},io=e=>{let t=(0,d.toLower)((0,d.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},ro=e=>({type:io(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),hn=({value:e})=>({type:io(e),const:e}),xn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Ue(p)?p instanceof T.z.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=lt(e,r)),i.length&&(a.required=i),a},bn=()=>({type:"null"}),Sn=({},e)=>((0,Q.default)(!e.isResponse,new E({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:oo}}),Tn=({},e)=>((0,Q.default)(e.isResponse,new E({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:oo}}),On=({},e)=>Q.default.fail(new E({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),Rn=()=>({type:"boolean"}),An=()=>({type:"integer",format:"bigint"}),Pn=e=>e.every(t=>t instanceof T.z.ZodLiteral),Cn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof T.z.ZodEnum||e instanceof T.z.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=lt(T.z.object((0,d.fromPairs)((0,d.xprod)(o,[t]))),r),n.required=o),n}if(e instanceof T.z.ZodLiteral)return{type:"object",properties:lt(T.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof T.z.ZodUnion&&Pn(e.options)){let o=(0,d.map)(i=>`${i.value}`,e.options),n=(0,d.fromPairs)((0,d.xprod)(o,[t]));return{type:"object",properties:lt(T.z.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},In=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},zn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),wn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:l,isEmoji:c,isDatetime:m,_def:{checks:y}})=>{let u=y.find(z=>z.kind==="regex"),x=y.find(z=>z.kind==="datetime"),R=u?u.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,b={type:"string"},I={"date-time":m,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:l,emoji:c};for(let z in I)if(I[z]){b.format=z;break}return r!==null&&(b.minLength=r),o!==null&&(b.maxLength=o),R&&(b.pattern=R.source),b},En=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(y=>y.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(y=>y.kind==="max"),l=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=i:m.exclusiveMinimum=i,c?m.maximum=l:m.exclusiveMaximum=l,m},lt=({shape:e},t)=>(0,d.map)(t,e),Zn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return rn?.[t]},ao=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},vn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,q.isSchemaObject)(o)){let i=Xe(e,Zn(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(T.z.any())}if(!t&&n.type==="preprocess"&&(0,q.isSchemaObject)(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},jn=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Ln=(e,{next:t})=>t(e.unwrap()),Nn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:n})=>{let i=r(e);return o(i)||(n(i,{}),n(i,t(e)))},kn=(e,{next:t})=>t(e.unwrap().shape.raw),po=e=>e.length?(0,d.fromPairs)((0,d.zip)((0,d.range)(1,e.length+1).map(t=>`example${t}`),(0,d.map)((0,d.objOf)("value"),e))):void 0,co=(e,t,r=[])=>(0,d.pipe)(K,(0,d.map)((0,d.when)(o=>(0,d.type)(o)==="Object",(0,d.omit)(r))),po)({schema:e,variant:t?"parsed":"original",validate:!0}),Mn=(e,t)=>(0,d.pipe)(K,(0,d.filter)((0,d.has)(t)),(0,d.pluck)(t),po)({schema:e,variant:"original",validate:!0}),ce=e=>e instanceof T.z.ZodObject?e:e instanceof T.z.ZodBranded?ce(e.unwrap()):e instanceof T.z.ZodUnion||e instanceof T.z.ZodDiscriminatedUnion?e.options.map(t=>ce(t)).reduce((t,r)=>t.merge(r.partial()),T.z.object({})):e instanceof T.z.ZodEffects?ce(e._def.schema):e instanceof T.z.ZodPipeline?ce(e._def.in):ce(e._def.left).merge(ce(e._def.right)),lo=({path:e,method:t,schema:r,inputSources:o,serializer:n,getRef:i,makeRef:a,composition:p,brandHandling:l,description:c=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:m}=ce(r),y=on(e),u=o.includes("query"),x=o.includes("params"),R=o.includes("headers"),b=S=>x&&y.includes(S),I=S=>R&&At(S);return Object.keys(m).map(S=>({name:S,location:b(S)?"path":I(S)?"header":u?"query":void 0})).filter(S=>S.location!==void 0).map(({name:S,location:Ze})=>{let G=pe(m[S],{rules:{...l,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!1,serializer:n,getRef:i,makeRef:a,path:e,method:t}}),X=p==="components"?a(k(c,S),G):G;return{name:S,in:Ze,required:!m[S].isOptional(),description:G.description||c,schema:X,examples:Mn(r,S)}})},Ht={ZodString:wn,ZodNumber:En,ZodBigInt:An,ZodBoolean:Rn,ZodNull:bn,ZodArray:In,ZodTuple:zn,ZodRecord:Cn,ZodObject:xn,ZodLiteral:hn,ZodIntersection:un,ZodUnion:dn,ZodAny:an,ZodDefault:nn,ZodEnum:ro,ZodNativeEnum:ro,ZodEffects:vn,ZodOptional:fn,ZodNullable:gn,ZodDiscriminatedUnion:ln,ZodBranded:Ln,ZodDate:On,ZodCatch:sn,ZodPipeline:jn,ZodLazy:Nn,ZodReadonly:yn,[Y]:cn,[De]:pn,[$e]:Tn,[qe]:Sn,[se]:kn},Dt=(e,{isResponse:t,prev:r})=>{if((0,q.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof T.z.ZodLazy,i=r.type!==void 0,a=t&&Ue(e),p=!n&&i&&!a&&e.isNullable(),l=n?[]:K({schema:e,variant:t?"parsed":"original",validate:!0}),c={};return o&&(c.description=o),p&&(c.type=ao(r)),l.length&&(c.examples=l.slice()),c},Ft=(e,t)=>Q.default.fail(new E({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Ut=(e,t)=>{if((0,q.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,d.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,d.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Ut(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Ut(o,t))),r},mo=e=>(0,q.isReferenceObject)(e)?e:(0,d.omit)(["examples"],e),uo=({method:e,path:t,schema:r,mimeTypes:o,variant:n,serializer:i,getRef:a,makeRef:p,composition:l,hasMultipleStatusCodes:c,statusCode:m,brandHandling:y,description:u=`${e.toUpperCase()} ${t} ${It(n)} response ${c?m:""}`.trim()})=>{let x=mo(pe(r,{rules:{...y,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!0,serializer:i,getRef:a,makeRef:p,path:t,method:e}})),R={schema:l==="components"?p(k(u),x):x,examples:co(r,!0)};return{description:u,content:(0,d.fromPairs)((0,d.xprod)(o,[R]))}},Un=()=>({type:"http",scheme:"basic"}),Hn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Dn=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},Fn=({name:e})=>({type:"apiKey",in:"header",name:e}),Kn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Bn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),qn=({flows:e={}})=>({type:"oauth2",flows:(0,d.map)(t=>({...t,scopes:t.scopes||{}}),(0,d.reject)(d.isNil,e))}),fo=(e,t)=>{let r={basic:Un,bearer:Hn,input:Dn,header:Fn,cookie:Kn,openid:Bn,oauth2:qn};return nt(e,o=>r[o.type](o,t))},mt=e=>"or"in e?e.or.map(t=>"and"in t?(0,d.mergeAll)((0,d.map)(({name:r,scopes:o})=>(0,d.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?mt(Et(e)):mt({or:[e]}),yo=({method:e,path:t,schema:r,mimeTypes:o,serializer:n,getRef:i,makeRef:a,composition:p,brandHandling:l,paramNames:c,description:m=`${e.toUpperCase()} ${t} Request body`})=>{let y=mo(Ut(pe(r,{rules:{...l,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!1,serializer:n,getRef:i,makeRef:a,path:t,method:e}}),c)),u={schema:p==="components"?a(k(m),y):y,examples:co(r,!1,c)};return{description:m,content:(0,d.fromPairs)((0,d.xprod)(o,[u]))}},go=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}),Kt=e=>e.length<=to?e:e.slice(0,to-1)+"\u2026";var ut=class extends xo.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;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){let n=o||k(r,t),i=this.lastOperationIdSuffixes.get(n);return i===void 0?(this.lastOperationIdSuffixes.set(n,1),n):(o&&ho.default.fail(new E({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:l=!0,composition:c="inline",serializer:m=We}){super(),this.addInfo({title:o,version:n});for(let u of typeof i=="string"?[i]:i)this.addServer({url:u});ae({routing:t,onEndpoint:(u,x,R)=>{let b=R,I={path:x,method:b,endpoint:u,composition:c,serializer:m,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[z,S]=["short","long"].map(u.getDescription.bind(u)),Ze=z?Kt(z):l&&S?Kt(S):void 0,G=u.getTags(),X=r.inputSources?.[b]||Ot[b],le=this.ensureUniqOperationId(x,b,u.getOperationId(b)),ve=lo({...I,inputSources:X,schema:u.getSchema("input"),description:a?.requestParameter?.call(null,{method:b,path:x,operationId:le})}),Ve={};for(let D of["positive","negative"]){let ee=u.getResponses(D);for(let{mimeTypes:je,schema:A,statusCodes:P}of ee)for(let w of P)Ve[w]=uo({...I,variant:D,schema:A,mimeTypes:je,statusCode:w,hasMultipleStatusCodes:ee.length>1||P.length>1,description:a?.[`${D}Response`]?.call(null,{method:b,path:x,operationId:le,statusCode:w})})}let Tt=X.includes("body")?yo({...I,paramNames:(0,bo.pluck)("name",ve),schema:u.getSchema("input"),mimeTypes:u.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:b,path:x,operationId:le})}):void 0,_e=mt(nt(fo(u.getSecurity(),X),D=>{let ee=this.ensureUniqSecuritySchemaName(D),je=["oauth2","openIdConnect"].includes(D.type)?u.getScopes().slice():[];return this.addSecurityScheme(ee,D),{name:ee,scopes:je}}));this.addPath(so(x),{[b]:{operationId:le,summary:Ze,description:S,tags:G.length>0?G:void 0,parameters:ve.length>0?ve:void 0,requestBody:Tt,security:_e.length>0?_e:void 0,responses:Ve}})}}),this.rootDoc.tags=r.tags?go(r.tags):[]}};var ft=require("node-mocks-http"),$n=e=>(0,ft.createRequest)({...e,headers:{"content-type":Z.json,...e?.headers}}),Gn=e=>(0,ft.createResponse)(e),Vn=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:o in Te?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},_n=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=$n(e),i=Gn({req:n,...t});i.req=t?.req||n,n.res=i;let a=Vn(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},So=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=_n(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}};var L=O(require("typescript"),1);var H=O(require("typescript"),1),ze=require("ramda"),s=H.default.factory,J=[s.createModifier(H.default.SyntaxKind.ExportKeyword)],Yn=[s.createModifier(H.default.SyntaxKind.AsyncKeyword)],Qn=[s.createModifier(H.default.SyntaxKind.PublicKeyword),s.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],To=[s.createModifier(H.default.SyntaxKind.ProtectedKeyword),s.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],Bt=s.createTemplateHead(""),we=s.createTemplateTail(""),qt=s.createTemplateMiddle(" "),$t=e=>s.createTemplateLiteralType(Bt,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?we:qt))),Gt=$t(["M","P"]),yt=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),gt=(e,t)=>(0,ze.chain)(([r,o])=>[yt(s.createIdentifier(r),o,t)],(0,ze.toPairs)(e)),Vt=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),Oo=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),Ro=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),W=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],H.default.NodeFlags.Const),_t=(e,t)=>s.createTypeAliasDeclaration(J,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),ht=(e,t)=>s.createTypeAliasDeclaration(J,e,void 0,t),Ao=(e,t,r)=>s.createPropertyDeclaration(Qn,e,void 0,t,r),Po=(e,t,r)=>s.createClassDeclaration(J,e,void 0,void 0,[t,...r]),Co=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),Io=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(H.default.SyntaxKind.AnyKeyword)]),zo=(e,t,r)=>s.createInterfaceDeclaration(J,e,void 0,t,r),Jn=(0,ze.chain)(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),wo=e=>Jn((0,ze.toPairs)(e)),Yt=(e,t,r)=>s.createArrowFunction(r?Yn:void 0,void 0,e.map(o=>yt(o)),void 0,void 0,t),Qt=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,gt({acc:void 0,key:void 0}),void 0,void 0,t),r]),Eo=(...e)=>`"${e.join(" ")}"`;var Zo=["get","post","put","delete","patch"];var g=O(require("typescript"),1),bt=require("zod");var $=O(require("typescript"),1),{factory:xt}=$.default,Jt=(e,t)=>{$.default.addSyntheticLeadingComment(e,$.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ee=(e,t,r)=>{let o=xt.createTypeAliasDeclaration(void 0,xt.createIdentifier(t),void 0,e);return r&&Jt(o,r),o},Wt=(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)},Wn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,vo=e=>Wn.test(e)?xt.createIdentifier(e):xt.createStringLiteral(e);var{factory:f}=g.default,Xn={[g.default.SyntaxKind.AnyKeyword]:"",[g.default.SyntaxKind.BigIntKeyword]:BigInt(0),[g.default.SyntaxKind.BooleanKeyword]:!1,[g.default.SyntaxKind.NumberKeyword]:0,[g.default.SyntaxKind.ObjectKeyword]:{},[g.default.SyntaxKind.StringKeyword]:"",[g.default.SyntaxKind.UndefinedKeyword]:void 0},es=({value:e})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),ts=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&Ue(a)?a instanceof bt.z.ZodOptional:a.isOptional(),l=f.createPropertySignature(void 0,vo(i),p&&o?f.createToken(g.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Jt(l,a.description),l});return f.createTypeLiteralNode(n)},rs=({element:e},{next:t})=>f.createArrayTypeNode(t(e)),os=({options:e})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),jo=({options:e},{next:t})=>f.createUnionTypeNode(e.map(t)),ns=e=>Xn?.[e.kind],ss=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Xe(e,ns(o)),i={number:g.default.SyntaxKind.NumberKeyword,bigint:g.default.SyntaxKind.BigIntKeyword,boolean:g.default.SyntaxKind.BooleanKeyword,string:g.default.SyntaxKind.StringKeyword,undefined:g.default.SyntaxKind.UndefinedKeyword,object:g.default.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(n&&i[n]||g.default.SyntaxKind.AnyKeyword)}return o},is=e=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),as=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(g.default.SyntaxKind.UndefinedKeyword)]):o},ps=(e,{next:t})=>f.createUnionTypeNode([t(e.unwrap()),f.createLiteralTypeNode(f.createNull())]),cs=({items:e,_def:{rest:t}},{next:r})=>f.createTupleTypeNode(e.map(r).concat(t===null?[]:f.createRestTypeNode(r(t)))),ds=({keySchema:e,valueSchema:t},{next:r})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e,t].map(r)),ls=({_def:e},{next:t})=>f.createIntersectionTypeNode([e.left,e.right].map(t)),ms=({_def:e},{next:t})=>t(e.innerType),de=e=>()=>f.createKeywordTypeNode(e),us=(e,{next:t})=>t(e.unwrap()),fs=(e,{next:t})=>t(e.unwrap()),ys=({_def:e},{next:t})=>t(e.innerType),gs=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),hs=()=>f.createLiteralTypeNode(f.createNull()),xs=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:n})=>{let i=`Type${n(e)}`;return t(i)||(r(i,f.createLiteralTypeNode(f.createNull())),r(i,o(e)))},bs=e=>{let t=e.unwrap(),r=f.createKeywordTypeNode(g.default.SyntaxKind.StringKeyword),o=f.createTypeReferenceNode("Buffer"),n=f.createUnionTypeNode([r,o]);return t instanceof bt.z.ZodString?r:t instanceof bt.z.ZodUnion?n:o},Ss=(e,{next:t})=>t(e.unwrap().shape.raw),Ts={ZodString:de(g.default.SyntaxKind.StringKeyword),ZodNumber:de(g.default.SyntaxKind.NumberKeyword),ZodBigInt:de(g.default.SyntaxKind.BigIntKeyword),ZodBoolean:de(g.default.SyntaxKind.BooleanKeyword),ZodAny:de(g.default.SyntaxKind.AnyKeyword),[qe]:de(g.default.SyntaxKind.StringKeyword),[$e]:de(g.default.SyntaxKind.StringKeyword),ZodNull:hs,ZodArray:rs,ZodTuple:cs,ZodRecord:ds,ZodObject:ts,ZodLiteral:es,ZodIntersection:ls,ZodUnion:jo,ZodDefault:ms,ZodEnum:os,ZodNativeEnum:is,ZodEffects:ss,ZodOptional:as,ZodNullable:ps,ZodDiscriminatedUnion:jo,ZodBranded:us,ZodCatch:ys,ZodPipeline:gs,ZodLazy:xs,ZodReadonly:fs,[Y]:bs,[se]:Ss},Ge=(e,{brandHandling:t,ctx:r})=>pe(e,{rules:{...t,...Ts},onMissing:()=>f.createKeywordTypeNode(g.default.SyntaxKind.AnyKeyword),ctx:r});var St=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?s.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,Ee(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:n=We,splitResponse:i=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){ae({routing:t,onEndpoint:(A,P,w)=>{let me={serializer:n,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},Le=k(w,P,"input"),Ne=Ge(A.getSchema("input"),{brandHandling:r,ctx:{...me,isResponse:!1}}),N=i?k(w,P,"positive.response"):void 0,Xt=A.getSchema("positive"),er=i?Ge(Xt,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,ke=i?k(w,P,"negative.response"):void 0,tr=A.getSchema("negative"),rr=i?Ge(tr,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,or=k(w,P,"response"),No=N&&ke?s.createUnionTypeNode([s.createTypeReferenceNode(N),s.createTypeReferenceNode(ke)]):Ge(Xt.or(tr),{brandHandling:r,ctx:{...me,isResponse:!0}});this.program.push(Ee(Ne,Le)),er&&N&&this.program.push(Ee(er,N)),rr&&ke&&this.program.push(Ee(rr,ke)),this.program.push(Ee(No,or)),w!=="options"&&(this.paths.push(P),this.registry.set({method:w,path:P},{input:Le,positive:N,negative:ke,response:or,isJson:A.getMimeTypes("positive").includes(Z.json),tags:A.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(_t(this.ids.pathType,this.paths)),this.program.push(_t(this.ids.methodType,Zo)),this.program.push(ht(this.ids.methodPathType,$t([this.ids.methodType,this.ids.pathType])));let p=[s.createHeritageClause(L.default.SyntaxKind.ExtendsKeyword,[Vt(this.ids.methodPathType,L.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),i&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let l=[],c=[];for(let[{method:A,path:P},{isJson:w,tags:me,...Le}]of this.registry){let Ne=Eo(A,P);for(let N of this.interfaces)N.kind in Le&&N.props.push(Ro(Ne,Le[N.kind]));o!=="types"&&(w&&l.push(s.createPropertyAssignment(Ne,s.createTrue())),c.push(s.createPropertyAssignment(Ne,s.createArrayLiteralExpression(me.map(N=>s.createStringLiteral(N))))))}for(let{id:A,props:P}of this.interfaces)this.program.push(zo(A,p,P));if(o==="types")return;let m=s.createVariableStatement(J,W(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(l))),y=s.createVariableStatement(J,W(this.ids.endpointTagsConst,s.createObjectLiteralExpression(c))),u=ht(this.ids.providerType,s.createFunctionTypeNode(wo({M:this.ids.methodType,P:this.ids.pathType}),gt({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Gt)}),Co(this.ids.responseInterface,Gt))),x=ht(this.ids.implementationType,s.createFunctionTypeNode(void 0,gt({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(L.default.SyntaxKind.StringKeyword),params:Vt(L.default.SyntaxKind.StringKeyword,L.default.SyntaxKind.AnyKeyword)}),Io())),R=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,we)]),b=Qt(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[R,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),I=Qt(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[R]),L.default.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),z=Po(this.ids.clientClass,Oo([yt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),To)]),[Ao(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),Yt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,b,I]),!0))]);this.program.push(m,y,u,x,z);let S=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),Ze=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(Z.json))]),void 0,this.ids.undefinedValue)),G=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),X=s.createVariableStatement(void 0,W(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,we)]),s.createObjectLiteralExpression([S,Ze,G])])))),le=s.createVariableStatement(void 0,W(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),ve=s.createVariableStatement(void 0,W(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),we)])))),[Ve,Tt]=["json","text"].map(A=>s.createReturnStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.responseConst,A),void 0,void 0))),_e=s.createIfStatement(s.createBinaryExpression(s.createTemplateExpression(Bt,[s.createTemplateSpan(this.ids.methodParameter,qt),s.createTemplateSpan(this.ids.pathParameter,we)]),L.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),s.createBlock([Ve])),D=s.createVariableStatement(J,W(this.ids.exampleImplementationConst,Yt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([le,ve,X,_e,Tt]),!0),s.createTypeReferenceNode(this.ids.implementationType))),ee=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),je=s.createVariableStatement(void 0,W(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(D,je,ee)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Wt(r,t)).join(`
|
|
22
|
-
`):void 0}print(t){let r=this.printUsage(t),o=r&&
|
|
21
|
+
`)};var Qr=e=>{e.startupLogo!==!1&&console.log(Vr());let t=e.errorHandler||be,r=Ir(e.logger)?e.logger:new Oe(e.logger);r.debug("Running","v20.14.1 (CJS)"),$r(r);let o=Br({rootLogger:r,config:e}),i={getChildLogger:qr(r),errorHandler:t},a=Dr(i),p=Hr(i);return{...i,rootLogger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},Jr=(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,loggingMiddleware:i}=Qr(e);return Mt({app:e.app.use(i),routing:t,getChildLogger:o,config:e}),{notFoundHandler:n,logger:r}},Wr=async(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=Qr(e),p=(0,ct.default)().disable("x-powered-by").use(a);if(e.server.compression){let u=await Ce("compression");p.use(u(typeof e.server.compression=="object"?e.server.compression:void 0))}let l={json:[e.server.jsonParser||ct.default.json()],raw:[e.server.rawParser||ct.default.raw(),Kr],upload:e.server.upload?await Fr({config:e,getChildLogger:o}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:p,logger:r,getChildLogger:o}),Mt({app:p,routing:t,getChildLogger:o,config:e,parsers:l}),p.use(i,n);let c=(u,x)=>u.listen(x,()=>r.info("Listening",x)),m=_r.default.createServer(p),y=e.https&&Yr.default.createServer(e.https.options,p);return e.gracefulShutdown&&Gr({servers:[m].concat(y||[]),logger:r,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,httpServer:c(m,e.server.listen),httpsServer:y&&c(y,e.https?.listen)}};var xo=O(require("node:assert/strict"),1),bo=require("openapi3-ts/oas31"),So=require("ramda");var Q=O(require("node:assert/strict"),1),q=require("openapi3-ts/oas31"),d=require("ramda"),S=require("zod");var Ie=require("zod");var dt=e=>!isNaN(e.getTime());var qe=Symbol("DateIn"),Xr=()=>Ie.z.union([Ie.z.string().date(),Ie.z.string().datetime(),Ie.z.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(Ie.z.date().refine(dt)).brand(qe);var eo=require("zod");var $e=Symbol("DateOut"),to=()=>eo.z.date().refine(dt).transform(e=>e.toISOString()).brand($e);var pe=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[h]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>pe(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),l=t&&t(e,{prev:p,...n});return l?{...p,...l}:p};var ro=50,no="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",on={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},so=/:([A-Za-z0-9_]+)/g,nn=e=>e.match(so)?.map(t=>t.slice(1))||[],io=e=>e.replace(so,t=>`{${t.slice(1)}}`),sn=({_def:e},{next:t})=>({...t(e.innerType),default:e[h]?.defaultLabel||e.defaultValue()}),an=({_def:{innerType:e}},{next:t})=>t(e),pn=()=>({format:"any"}),cn=({},e)=>((0,Q.default)(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),dn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof S.z.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},ln=({options:e},{next:t})=>({oneOf:e.map(t)}),mn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),un=e=>{let[t,r]=e.filter(q.isSchemaObject).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));(0,Q.default)(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=(0,d.mergeDeepWith)((n,i)=>Array.isArray(n)&&Array.isArray(i)?(0,d.concat)(n,i):n===i?i:Q.default.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=(0,d.union)(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=re(t.examples||[],r.examples||[],([n,i])=>(0,d.mergeDeepRight)(n,i))),o},fn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return un(o)}catch{}return{allOf:o}},yn=(e,{next:t})=>t(e.unwrap()),gn=(e,{next:t})=>t(e.unwrap()),hn=(e,{next:t})=>{let r=t(e.unwrap());return(0,q.isSchemaObject)(r)&&(r.type=po(r)),r},ao=e=>{let t=(0,d.toLower)((0,d.type)(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},oo=e=>({type:ao(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),xn=({value:e})=>({type:ao(e),const:e}),bn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Ue(p)?p instanceof S.z.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=lt(e,r)),i.length&&(a.required=i),a},Sn=()=>({type:"null"}),Tn=({},e)=>((0,Q.default)(!e.isResponse,new z({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:no}}),On=({},e)=>((0,Q.default)(e.isResponse,new z({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:no}}),Rn=({},e)=>Q.default.fail(new z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),An=()=>({type:"boolean"}),Pn=()=>({type:"integer",format:"bigint"}),Cn=e=>e.every(t=>t instanceof S.z.ZodLiteral),In=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof S.z.ZodEnum||e instanceof S.z.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=lt(S.z.object((0,d.fromPairs)((0,d.xprod)(o,[t]))),r),n.required=o),n}if(e instanceof S.z.ZodLiteral)return{type:"object",properties:lt(S.z.object({[e.value]:t}),r),required:[e.value]};if(e instanceof S.z.ZodUnion&&Cn(e.options)){let o=(0,d.map)(i=>`${i.value}`,e.options),n=(0,d.fromPairs)((0,d.xprod)(o,[t]));return{type:"object",properties:lt(S.z.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},zn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},wn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),En=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:l,isEmoji:c,isDatetime:m,_def:{checks:y}})=>{let u=y.find(C=>C.kind==="regex"),x=y.find(C=>C.kind==="datetime"),j=u?u.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,T={type:"string"},M={"date-time":m,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:l,emoji:c};for(let C in M)if(M[C]){T.format=C;break}return r!==null&&(T.minLength=r),o!==null&&(T.maxLength=o),j&&(T.pattern=j.source),T},Zn=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(y=>y.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(y=>y.kind==="max"),l=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,m={type:e?"integer":"number",format:e?"int64":"double"};return a?m.minimum=i:m.exclusiveMinimum=i,c?m.maximum=l:m.exclusiveMaximum=l,m},lt=({shape:e},t)=>(0,d.map)(t,e),vn=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return on?.[t]},po=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},jn=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,q.isSchemaObject)(o)){let i=Xe(e,vn(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(S.z.any())}if(!t&&n.type==="preprocess"&&(0,q.isSchemaObject)(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},Ln=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),Nn=(e,{next:t})=>t(e.unwrap()),kn=({schema:e},{next:t,serializer:r,getRef:o,makeRef:n})=>{let i=r(e);return o(i)||(n(i,{}),n(i,t(e)))},Mn=(e,{next:t})=>t(e.unwrap().shape.raw),co=e=>e.length?(0,d.fromPairs)((0,d.zip)((0,d.range)(1,e.length+1).map(t=>`example${t}`),(0,d.map)((0,d.objOf)("value"),e))):void 0,lo=(e,t,r=[])=>(0,d.pipe)(K,(0,d.map)((0,d.when)(o=>(0,d.type)(o)==="Object",(0,d.omit)(r))),co)({schema:e,variant:t?"parsed":"original",validate:!0}),Un=(e,t)=>(0,d.pipe)(K,(0,d.filter)((0,d.has)(t)),(0,d.pluck)(t),co)({schema:e,variant:"original",validate:!0}),ce=e=>e instanceof S.z.ZodObject?e:e instanceof S.z.ZodBranded?ce(e.unwrap()):e instanceof S.z.ZodUnion||e instanceof S.z.ZodDiscriminatedUnion?e.options.map(t=>ce(t)).reduce((t,r)=>t.merge(r.partial()),S.z.object({})):e instanceof S.z.ZodEffects?ce(e._def.schema):e instanceof S.z.ZodPipeline?ce(e._def.in):ce(e._def.left).merge(ce(e._def.right)),mo=({path:e,method:t,schema:r,inputSources:o,serializer:n,getRef:i,makeRef:a,composition:p,brandHandling:l,description:c=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:m}=ce(r),y=nn(e),u=o.includes("query"),x=o.includes("params"),j=o.includes("headers"),T=b=>x&&y.includes(b),M=b=>j&&At(b);return Object.keys(m).map(b=>({name:b,location:T(b)?"path":M(b)?"header":u?"query":void 0})).filter(b=>b.location!==void 0).map(({name:b,location:Ze})=>{let G=pe(m[b],{rules:{...l,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!1,serializer:n,getRef:i,makeRef:a,path:e,method:t}}),X=p==="components"?a(N(c,b),G):G;return{name:b,in:Ze,required:!m[b].isOptional(),description:G.description||c,schema:X,examples:Un(r,b)}})},Ht={ZodString:En,ZodNumber:Zn,ZodBigInt:Pn,ZodBoolean:An,ZodNull:Sn,ZodArray:zn,ZodTuple:wn,ZodRecord:In,ZodObject:bn,ZodLiteral:xn,ZodIntersection:fn,ZodUnion:ln,ZodAny:pn,ZodDefault:sn,ZodEnum:oo,ZodNativeEnum:oo,ZodEffects:jn,ZodOptional:yn,ZodNullable:hn,ZodDiscriminatedUnion:mn,ZodBranded:Nn,ZodDate:Rn,ZodCatch:an,ZodPipeline:Ln,ZodLazy:kn,ZodReadonly:gn,[Y]:dn,[De]:cn,[$e]:On,[qe]:Tn,[se]:Mn},Dt=(e,{isResponse:t,prev:r})=>{if((0,q.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof S.z.ZodLazy,i=r.type!==void 0,a=t&&Ue(e),p=!n&&i&&!a&&e.isNullable(),l=n?[]:K({schema:e,variant:t?"parsed":"original",validate:!0}),c={};return o&&(c.description=o),p&&(c.type=po(r)),l.length&&(c.examples=l.slice()),c},Ft=(e,t)=>Q.default.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),Ut=(e,t)=>{if((0,q.isReferenceObject)(e))return e;let r={...e};return r.properties&&(r.properties=(0,d.omit)(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>(0,d.omit)(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>Ut(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>Ut(o,t))),r},uo=e=>(0,q.isReferenceObject)(e)?e:(0,d.omit)(["examples"],e),fo=({method:e,path:t,schema:r,mimeTypes:o,variant:n,serializer:i,getRef:a,makeRef:p,composition:l,hasMultipleStatusCodes:c,statusCode:m,brandHandling:y,description:u=`${e.toUpperCase()} ${t} ${It(n)} response ${c?m:""}`.trim()})=>{let x=uo(pe(r,{rules:{...y,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!0,serializer:i,getRef:a,makeRef:p,path:t,method:e}})),j={schema:l==="components"?p(N(u),x):x,examples:lo(r,!0)};return{description:u,content:(0,d.fromPairs)((0,d.xprod)(o,[j]))}},Hn=()=>({type:"http",scheme:"basic"}),Dn=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},Fn=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},Kn=({name:e})=>({type:"apiKey",in:"header",name:e}),Bn=({name:e})=>({type:"apiKey",in:"cookie",name:e}),qn=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),$n=({flows:e={}})=>({type:"oauth2",flows:(0,d.map)(t=>({...t,scopes:t.scopes||{}}),(0,d.reject)(d.isNil,e))}),yo=(e,t)=>{let r={basic:Hn,bearer:Dn,input:Fn,header:Kn,cookie:Bn,openid:qn,oauth2:$n};return nt(e,o=>r[o.type](o,t))},mt=e=>"or"in e?e.or.map(t=>"and"in t?(0,d.mergeAll)((0,d.map)(({name:r,scopes:o})=>(0,d.objOf)(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?mt(Et(e)):mt({or:[e]}),go=({method:e,path:t,schema:r,mimeTypes:o,serializer:n,getRef:i,makeRef:a,composition:p,brandHandling:l,paramNames:c,description:m=`${e.toUpperCase()} ${t} Request body`})=>{let y=uo(Ut(pe(r,{rules:{...l,...Ht},onEach:Dt,onMissing:Ft,ctx:{isResponse:!1,serializer:n,getRef:i,makeRef:a,path:t,method:e}}),c)),u={schema:p==="components"?a(N(m),y):y,examples:lo(r,!1,c)};return{description:m,content:(0,d.fromPairs)((0,d.xprod)(o,[u]))}},ho=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}),Kt=e=>e.length<=ro?e:e.slice(0,ro-1)+"\u2026";var ut=class extends bo.OpenApiBuilder{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;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){let n=o||N(r,t),i=this.lastOperationIdSuffixes.get(n);return i===void 0?(this.lastOperationIdSuffixes.set(n,1),n):(o&&xo.default.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:l=!0,composition:c="inline",serializer:m=We}){super(),this.addInfo({title:o,version:n});for(let u of typeof i=="string"?[i]:i)this.addServer({url:u});ae({routing:t,onEndpoint:(u,x,j)=>{let T=j,M={path:x,method:T,endpoint:u,composition:c,serializer:m,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[C,b]=["short","long"].map(u.getDescription.bind(u)),Ze=C?Kt(C):l&&b?Kt(b):void 0,G=u.getTags(),X=r.inputSources?.[T]||Ot[T],le=this.ensureUniqOperationId(x,T,u.getOperationId(T)),ve=mo({...M,inputSources:X,schema:u.getSchema("input"),description:a?.requestParameter?.call(null,{method:T,path:x,operationId:le})}),Ve={};for(let D of["positive","negative"]){let ee=u.getResponses(D);for(let{mimeTypes:je,schema:R,statusCodes:A}of ee)for(let I of A)Ve[I]=fo({...M,variant:D,schema:R,mimeTypes:je,statusCode:I,hasMultipleStatusCodes:ee.length>1||A.length>1,description:a?.[`${D}Response`]?.call(null,{method:T,path:x,operationId:le,statusCode:I})})}let Tt=X.includes("body")?go({...M,paramNames:(0,So.pluck)("name",ve),schema:u.getSchema("input"),mimeTypes:u.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:T,path:x,operationId:le})}):void 0,_e=mt(nt(yo(u.getSecurity(),X),D=>{let ee=this.ensureUniqSecuritySchemaName(D),je=["oauth2","openIdConnect"].includes(D.type)?u.getScopes().slice():[];return this.addSecurityScheme(ee,D),{name:ee,scopes:je}}));this.addPath(io(x),{[T]:{operationId:le,summary:Ze,description:b,tags:G.length>0?G:void 0,parameters:ve.length>0?ve:void 0,requestBody:Tt,security:_e.length>0?_e:void 0,responses:Ve}})}}),this.rootDoc.tags=r.tags?ho(r.tags):[]}};var ft=require("node-mocks-http"),Gn=e=>(0,ft.createRequest)({...e,headers:{"content-type":w.json,...e?.headers}}),Vn=e=>(0,ft.createResponse)(e),_n=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:o in Te?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},Yn=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=Gn(e),i=Vn({req:n,...t});i.req=t?.req||n,n.res=i;let a=_n(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},To=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=Yn(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}};var v=O(require("typescript"),1);var H=O(require("typescript"),1),ze=require("ramda"),s=H.default.factory,J=[s.createModifier(H.default.SyntaxKind.ExportKeyword)],Qn=[s.createModifier(H.default.SyntaxKind.AsyncKeyword)],Jn=[s.createModifier(H.default.SyntaxKind.PublicKeyword),s.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],Oo=[s.createModifier(H.default.SyntaxKind.ProtectedKeyword),s.createModifier(H.default.SyntaxKind.ReadonlyKeyword)],Bt=s.createTemplateHead(""),we=s.createTemplateTail(""),qt=s.createTemplateMiddle(" "),$t=e=>s.createTemplateLiteralType(Bt,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?we:qt))),Gt=$t(["M","P"]),yt=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),gt=(e,t)=>(0,ze.chain)(([r,o])=>[yt(s.createIdentifier(r),o,t)],(0,ze.toPairs)(e)),Vt=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),Ro=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),Ao=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),W=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],H.default.NodeFlags.Const),_t=(e,t)=>s.createTypeAliasDeclaration(J,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),ht=(e,t)=>s.createTypeAliasDeclaration(J,e,void 0,t),Po=(e,t,r)=>s.createPropertyDeclaration(Jn,e,void 0,t,r),Co=(e,t,r)=>s.createClassDeclaration(J,e,void 0,void 0,[t,...r]),Io=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),zo=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(H.default.SyntaxKind.AnyKeyword)]),wo=(e,t,r)=>s.createInterfaceDeclaration(J,e,void 0,t,r),Wn=(0,ze.chain)(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),Eo=e=>Wn((0,ze.toPairs)(e)),Yt=(e,t,r)=>s.createArrowFunction(r?Qn:void 0,void 0,e.map(o=>yt(o)),void 0,void 0,t),Qt=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,gt({acc:void 0,key:void 0}),void 0,void 0,t),r]),Zo=(...e)=>`"${e.join(" ")}"`;var vo=["get","post","put","delete","patch"];var g=O(require("typescript"),1),bt=require("zod");var $=O(require("typescript"),1),{factory:xt}=$.default,Jt=(e,t)=>{$.default.addSyntheticLeadingComment(e,$.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ee=(e,t,r)=>{let o=xt.createTypeAliasDeclaration(void 0,xt.createIdentifier(t),void 0,e);return r&&Jt(o,r),o},Wt=(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)},Xn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,jo=e=>Xn.test(e)?xt.createIdentifier(e):xt.createStringLiteral(e);var{factory:f}=g.default,es={[g.default.SyntaxKind.AnyKeyword]:"",[g.default.SyntaxKind.BigIntKeyword]:BigInt(0),[g.default.SyntaxKind.BooleanKeyword]:!1,[g.default.SyntaxKind.NumberKeyword]:0,[g.default.SyntaxKind.ObjectKeyword]:{},[g.default.SyntaxKind.StringKeyword]:"",[g.default.SyntaxKind.UndefinedKeyword]:void 0},ts=({value:e})=>f.createLiteralTypeNode(typeof e=="number"?f.createNumericLiteral(e):typeof e=="boolean"?e?f.createTrue():f.createFalse():f.createStringLiteral(e)),rs=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&Ue(a)?a instanceof bt.z.ZodOptional:a.isOptional(),l=f.createPropertySignature(void 0,jo(i),p&&o?f.createToken(g.default.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Jt(l,a.description),l});return f.createTypeLiteralNode(n)},os=({element:e},{next:t})=>f.createArrayTypeNode(t(e)),ns=({options:e})=>f.createUnionTypeNode(e.map(t=>f.createLiteralTypeNode(f.createStringLiteral(t)))),Lo=({options:e},{next:t})=>f.createUnionTypeNode(e.map(t)),ss=e=>es?.[e.kind],is=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Xe(e,ss(o)),i={number:g.default.SyntaxKind.NumberKeyword,bigint:g.default.SyntaxKind.BigIntKeyword,boolean:g.default.SyntaxKind.BooleanKeyword,string:g.default.SyntaxKind.StringKeyword,undefined:g.default.SyntaxKind.UndefinedKeyword,object:g.default.SyntaxKind.ObjectKeyword};return f.createKeywordTypeNode(n&&i[n]||g.default.SyntaxKind.AnyKeyword)}return o},as=e=>f.createUnionTypeNode(Object.values(e.enum).map(t=>f.createLiteralTypeNode(typeof t=="number"?f.createNumericLiteral(t):f.createStringLiteral(t)))),ps=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?f.createUnionTypeNode([o,f.createKeywordTypeNode(g.default.SyntaxKind.UndefinedKeyword)]):o},cs=(e,{next:t})=>f.createUnionTypeNode([t(e.unwrap()),f.createLiteralTypeNode(f.createNull())]),ds=({items:e,_def:{rest:t}},{next:r})=>f.createTupleTypeNode(e.map(r).concat(t===null?[]:f.createRestTypeNode(r(t)))),ls=({keySchema:e,valueSchema:t},{next:r})=>f.createExpressionWithTypeArguments(f.createIdentifier("Record"),[e,t].map(r)),ms=({_def:e},{next:t})=>f.createIntersectionTypeNode([e.left,e.right].map(t)),us=({_def:e},{next:t})=>t(e.innerType),de=e=>()=>f.createKeywordTypeNode(e),fs=(e,{next:t})=>t(e.unwrap()),ys=(e,{next:t})=>t(e.unwrap()),gs=({_def:e},{next:t})=>t(e.innerType),hs=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),xs=()=>f.createLiteralTypeNode(f.createNull()),bs=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:n})=>{let i=`Type${n(e)}`;return t(i)||(r(i,f.createLiteralTypeNode(f.createNull())),r(i,o(e)))},Ss=e=>{let t=e.unwrap(),r=f.createKeywordTypeNode(g.default.SyntaxKind.StringKeyword),o=f.createTypeReferenceNode("Buffer"),n=f.createUnionTypeNode([r,o]);return t instanceof bt.z.ZodString?r:t instanceof bt.z.ZodUnion?n:o},Ts=(e,{next:t})=>t(e.unwrap().shape.raw),Os={ZodString:de(g.default.SyntaxKind.StringKeyword),ZodNumber:de(g.default.SyntaxKind.NumberKeyword),ZodBigInt:de(g.default.SyntaxKind.BigIntKeyword),ZodBoolean:de(g.default.SyntaxKind.BooleanKeyword),ZodAny:de(g.default.SyntaxKind.AnyKeyword),[qe]:de(g.default.SyntaxKind.StringKeyword),[$e]:de(g.default.SyntaxKind.StringKeyword),ZodNull:xs,ZodArray:os,ZodTuple:ds,ZodRecord:ls,ZodObject:rs,ZodLiteral:ts,ZodIntersection:ms,ZodUnion:Lo,ZodDefault:us,ZodEnum:ns,ZodNativeEnum:as,ZodEffects:is,ZodOptional:ps,ZodNullable:cs,ZodDiscriminatedUnion:Lo,ZodBranded:fs,ZodCatch:gs,ZodPipeline:hs,ZodLazy:bs,ZodReadonly:ys,[Y]:Ss,[se]:Ts},Ge=(e,{brandHandling:t,ctx:r})=>pe(e,{rules:{...t,...Os},onMissing:()=>f.createKeywordTypeNode(g.default.SyntaxKind.AnyKeyword),ctx:r});var St=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?s.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,Ee(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:n=We,splitResponse:i=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){ae({routing:t,onEndpoint:(R,A,I)=>{let me={serializer:n,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},Le=N(I,A,"input"),Ne=Ge(R.getSchema("input"),{brandHandling:r,ctx:{...me,isResponse:!1}}),L=i?N(I,A,"positive.response"):void 0,Xt=R.getSchema("positive"),er=i?Ge(Xt,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,ke=i?N(I,A,"negative.response"):void 0,tr=R.getSchema("negative"),rr=i?Ge(tr,{brandHandling:r,ctx:{...me,isResponse:!0}}):void 0,or=N(I,A,"response"),ko=L&&ke?s.createUnionTypeNode([s.createTypeReferenceNode(L),s.createTypeReferenceNode(ke)]):Ge(Xt.or(tr),{brandHandling:r,ctx:{...me,isResponse:!0}});this.program.push(Ee(Ne,Le)),er&&L&&this.program.push(Ee(er,L)),rr&&ke&&this.program.push(Ee(rr,ke)),this.program.push(Ee(ko,or)),I!=="options"&&(this.paths.push(A),this.registry.set({method:I,path:A},{input:Le,positive:L,negative:ke,response:or,isJson:R.getMimeTypes("positive").includes(w.json),tags:R.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(_t(this.ids.pathType,this.paths)),this.program.push(_t(this.ids.methodType,vo)),this.program.push(ht(this.ids.methodPathType,$t([this.ids.methodType,this.ids.pathType])));let p=[s.createHeritageClause(v.default.SyntaxKind.ExtendsKeyword,[Vt(this.ids.methodPathType,v.default.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),i&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let l=[],c=[];for(let[{method:R,path:A},{isJson:I,tags:me,...Le}]of this.registry){let Ne=Zo(R,A);for(let L of this.interfaces)L.kind in Le&&L.props.push(Ao(Ne,Le[L.kind]));o!=="types"&&(I&&l.push(s.createPropertyAssignment(Ne,s.createTrue())),c.push(s.createPropertyAssignment(Ne,s.createArrayLiteralExpression(me.map(L=>s.createStringLiteral(L))))))}for(let{id:R,props:A}of this.interfaces)this.program.push(wo(R,p,A));if(o==="types")return;let m=s.createVariableStatement(J,W(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(l))),y=s.createVariableStatement(J,W(this.ids.endpointTagsConst,s.createObjectLiteralExpression(c))),u=ht(this.ids.providerType,s.createFunctionTypeNode(Eo({M:this.ids.methodType,P:this.ids.pathType}),gt({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Gt)}),Io(this.ids.responseInterface,Gt))),x=ht(this.ids.implementationType,s.createFunctionTypeNode(void 0,gt({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(v.default.SyntaxKind.StringKeyword),params:Vt(v.default.SyntaxKind.StringKeyword,v.default.SyntaxKind.AnyKeyword)}),zo())),j=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,we)]),T=Qt(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[j,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),M=Qt(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[j]),v.default.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),C=Co(this.ids.clientClass,Ro([yt(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),Oo)]),[Po(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),Yt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,T,M]),!0))]);this.program.push(m,y,u,x,C);let b=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),Ze=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(w.json))]),void 0,this.ids.undefinedValue)),G=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),X=s.createVariableStatement(void 0,W(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,we)]),s.createObjectLiteralExpression([b,Ze,G])])))),le=s.createVariableStatement(void 0,W(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),ve=s.createVariableStatement(void 0,W(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),we)])))),[Ve,Tt]=["json","text"].map(R=>s.createReturnStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.responseConst,R),void 0,void 0))),_e=s.createIfStatement(s.createBinaryExpression(s.createTemplateExpression(Bt,[s.createTemplateSpan(this.ids.methodParameter,qt),s.createTemplateSpan(this.ids.pathParameter,we)]),v.default.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),s.createBlock([Ve])),D=s.createVariableStatement(J,W(this.ids.exampleImplementationConst,Yt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([le,ve,X,_e,Tt]),!0),s.createTypeReferenceNode(this.ids.implementationType))),ee=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),je=s.createVariableStatement(void 0,W(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(D,je,ee)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Wt(r,t)).join(`
|
|
22
|
+
`):void 0}print(t){let r=this.printUsage(t),o=r&&v.default.addSyntheticLeadingComment(v.default.addSyntheticLeadingComment(s.createEmptyStatement(),v.default.SyntaxKind.SingleLineCommentTrivia," Usage example:"),v.default.SyntaxKind.MultiLineCommentTrivia,`
|
|
23
23
|
${r}`);return this.program.concat(o||[]).map((n,i)=>Wt(n,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
|
|
24
24
|
|
|
25
|
-
`)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await Ce("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let n=this.printUsage(t);this.usage=n&&o?[await o(n)]:this.usage;let i=this.print(t);return o?o(i):i}};var
|
|
25
|
+
`)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await Ce("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let n=this.printUsage(t);this.usage=n&&o?[await o(n)]:this.usage;let i=this.print(t);return o?o(i):i}};var No={dateIn:Xr,dateOut:to,file:rt,upload:fr,raw:mr};0&&(module.exports={BuiltinLogger,DependsOnMethod,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,Middleware,MissingPeerError,OutputValidationError,ResultHandler,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint});
|
package/dist/index.d.cts
CHANGED
|
@@ -747,7 +747,7 @@ interface NextHandlerInc<U> {
|
|
|
747
747
|
interface PrevInc<U> {
|
|
748
748
|
prev: U;
|
|
749
749
|
}
|
|
750
|
-
type SchemaHandler<U, Context extends FlatObject = EmptyObject, Variant extends "regular" | "each" | "last" = "regular"> = (schema: any, // eslint-disable-line @typescript-eslint/no-explicit-any -- for
|
|
750
|
+
type SchemaHandler<U, Context extends FlatObject = EmptyObject, Variant extends "regular" | "each" | "last" = "regular"> = (schema: any, // eslint-disable-line @typescript-eslint/no-explicit-any -- for assignment compatibility
|
|
751
751
|
ctx: Context & (Variant extends "regular" ? NextHandlerInc<U> : Variant extends "each" ? PrevInc<U> : Context)) => U;
|
|
752
752
|
type HandlingRules<U, Context extends FlatObject = EmptyObject, K extends string | symbol = string | symbol> = Partial<Record<K, SchemaHandler<U, Context>>>;
|
|
753
753
|
|
|
@@ -908,7 +908,7 @@ interface IntegrationParams {
|
|
|
908
908
|
* */
|
|
909
909
|
variant?: "types" | "client";
|
|
910
910
|
/**
|
|
911
|
-
* @desc Declares positive and negative response types separately and provides them within additional
|
|
911
|
+
* @desc Declares positive and negative response types separately and provides them within additional dictionaries
|
|
912
912
|
* @default false
|
|
913
913
|
* */
|
|
914
914
|
splitResponse?: boolean;
|
package/dist/index.d.ts
CHANGED
|
@@ -747,7 +747,7 @@ interface NextHandlerInc<U> {
|
|
|
747
747
|
interface PrevInc<U> {
|
|
748
748
|
prev: U;
|
|
749
749
|
}
|
|
750
|
-
type SchemaHandler<U, Context extends FlatObject = EmptyObject, Variant extends "regular" | "each" | "last" = "regular"> = (schema: any, // eslint-disable-line @typescript-eslint/no-explicit-any -- for
|
|
750
|
+
type SchemaHandler<U, Context extends FlatObject = EmptyObject, Variant extends "regular" | "each" | "last" = "regular"> = (schema: any, // eslint-disable-line @typescript-eslint/no-explicit-any -- for assignment compatibility
|
|
751
751
|
ctx: Context & (Variant extends "regular" ? NextHandlerInc<U> : Variant extends "each" ? PrevInc<U> : Context)) => U;
|
|
752
752
|
type HandlingRules<U, Context extends FlatObject = EmptyObject, K extends string | symbol = string | symbol> = Partial<Record<K, SchemaHandler<U, Context>>>;
|
|
753
753
|
|
|
@@ -908,7 +908,7 @@ interface IntegrationParams {
|
|
|
908
908
|
* */
|
|
909
909
|
variant?: "types" | "client";
|
|
910
910
|
/**
|
|
911
|
-
* @desc Declares positive and negative response types separately and provides them within additional
|
|
911
|
+
* @desc Declares positive and negative response types separately and provides them within additional dictionaries
|
|
912
912
|
* @default false
|
|
913
913
|
* */
|
|
914
914
|
splitResponse?: boolean;
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import{clone as Yt,fromPairs as
|
|
2
|
-
Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(i)}},De=class extends Error{name="IOSchemaError"},V=class extends De{constructor(r){super(U(r));this.originalError=r}name="OutputValidationError"},L=class extends De{constructor(r){super(U(r));this.originalError=r}name="InputValidationError"},M=class extends Error{constructor(r,o){super(r);this.originalError=o}name="ResultHandlerError"},Oe=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var
|
|
1
|
+
import{clone as Yt,fromPairs as Ro,map as Ao,pipe as Po,toPairs as Co,pair as Io}from"ramda";import{z as ae}from"zod";import{isHttpError as uo}from"http-errors";import{createHash as fo}from"node:crypto";import{pickBy as yo,xprod as go}from"ramda";import{z as ho}from"zod";var se=class extends Error{name="RoutingError"},z=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let i=`${t}
|
|
2
|
+
Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(i)}},De=class extends Error{name="IOSchemaError"},V=class extends De{constructor(r){super(U(r));this.originalError=r}name="OutputValidationError"},L=class extends De{constructor(r){super(U(r));this.originalError=r}name="InputValidationError"},M=class extends Error{constructor(r,o){super(r);this.originalError=o}name="ResultHandlerError"},Oe=class extends Error{name="MissingPeerError";constructor(t){super(`Missing peer dependency: ${t}. Please install it to use the feature.`)}};var P={json:"application/json",upload:"multipart/form-data",raw:"application/octet-stream"};var xo=e=>{let r=(e.header("content-type")||"").toLowerCase().startsWith(P.upload);return"files"in e&&r},dt={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},bo=["body","query","params"],lt=e=>e.method.toLowerCase(),mt=e=>e.startsWith("x-"),So=e=>yo((t,r)=>mt(r),e),ut=(e,t={})=>{let r=lt(e);return r==="options"?{}:(t[r]||dt[r]||bo).filter(o=>o==="files"?xo(e):!0).map(o=>o==="headers"?So(e[o]):e[o]).reduce((o,n)=>({...o,...n}),{})},ie=e=>e instanceof Error?e:new Error(String(e)),U=e=>e instanceof ho.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,Fe=e=>uo(e)?e.statusCode:e instanceof L?400:500,ft=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
|
|
3
3
|
${o.stack}
|
|
4
|
-
`,{url:t.url,payload:r})},H=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[g]?.examples||[];if(!r&&t==="original")return o;let n=[];for(let i of o){let a=e.safeParse(i);a.success&&n.push(t==="parsed"?a.data:i)}return n},_=(e,t,r)=>e.length&&t.length?
|
|
5
|
-
Original error: ${e.originalError.message}.`:""))};import{chain as Mo}from"ramda";var J=e=>Y(e)&&"or"in e,ce=e=>Y(e)&&"and"in e,ht=e=>({and:Mo(t=>ce(t)?t.and:[t],e)}),_e=(e,t)=>ce(e)?{and:e.and.map(r=>J(r)?{or:r.or.map(t)}:t(r))}:J(e)?{or:e.or.map(r=>ce(r)?{and:r.and.map(t)}:t(r))}:t(e),xt=e=>e.and.reduce((t,r)=>({or:_(t.or,J(r)?r.or:[r],ht)}),{or:[]}),pe=(e,t)=>ce(e)?J(t)?pe(xt(e),t):ht([e,t]):J(e)?ce(t)?pe(t,e):J(t)?{or:_(e.or,t.or,ht)}:pe(e,{and:[t]}):ce(t)||J(t)?pe(t,e):{and:[e,t]};import{z as or}from"zod";var bt=class{},F=class extends bt{#e;#t;#r;constructor({input:t,security:r,handler:o}){super(),this.#e=t,this.#t=r,this.#r=o}getSecurity(){return this.#t}getSchema(){return this.#e}async execute({input:t,...r}){try{let o=await this.#e.parseAsync(t);return this.#r({...r,input:o})}catch(o){throw o instanceof or.ZodError?new L(o):o}}},de=class extends F{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({input:or.object({}),handler:async({request:n,response:i})=>new Promise((a,p)=>{let d=c=>{if(c&&c instanceof Error)return p(o(c));a(r(n,i))};t(n,i,d)?.catch(d)})})}};var Pe=class{},Ye=class extends Pe{#e;#t;#r;#i;#o;#a;#p;#n;#c;#d;#l;#s;constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:i,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:l,shortDescription:f}){super(),this.#a=n,this.#p=i,this.#r=d,this.#l=a,this.#t=Object.freeze(t),this.#c=Object.freeze(p),this.#d=Object.freeze(c),this.#e={long:l,short:f},this.#n={input:r,output:o},this.#o={positive:Object.freeze(i.getPositiveResponse(o)),negative:Object.freeze(i.getNegativeResponse())},this.#s=tr(r)?"upload":rr(r)?"raw":"json",this.#i={input:Object.freeze([I[this.#s]]),positive:Object.freeze(this.#o.positive.flatMap(({mimeTypes:m})=>m)),negative:Object.freeze(this.#o.negative.flatMap(({mimeTypes:m})=>m))}}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return t==="input"||t==="output"?this.#n[t]:this.getResponses(t).map(({schema:r})=>r).reduce((r,o)=>r.or(o))}getMimeTypes(t){return this.#i[t]}getRequestType(){return this.#s}getResponses(t){return this.#o[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?pe(t,o):t},{and:[]})}getScopes(){return this.#c}getTags(){return this.#d}getOperationId(t){return this.#l(t)}#m(t){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#t.concat(t).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#n.output.parseAsync(t)}catch(r){throw r instanceof nr.ZodError?new V(r):r}}async#f({method:t,input:r,request:o,response:n,logger:i,options:a}){for(let p of this.#r)if(!(t==="options"&&!(p instanceof de))&&(Object.assign(a,await p.execute({input:r,options:a,request:o,response:n,logger:i})),n.writableEnded)){i.warn("A middleware has closed the stream. Accumulated options:",a);break}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#n.input.parseAsync(t)}catch(i){throw i instanceof nr.ZodError?new L(i):i}return this.#a({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:i,output:a,options:p}){try{await this.#p.execute({error:t,output:a,request:r,response:o,logger:n,input:i,options:p})}catch(d){Ve({logger:n,response:o,error:new M(ie(d).message,t||void 0)})}}async execute({request:t,response:r,logger:o,config:n,siblingMethods:i=[]}){let a=lt(t),p={},d=null,c=null;if(n.cors){let f=this.#m(i);typeof n.cors=="function"&&(f=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:f}));for(let m in f)r.set(m,f[m])}let l=ut(t,n.inputSources);try{if(await this.#f({method:a,input:l,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}d=await this.#u(await this.#y({input:l,logger:o,options:p}))}catch(f){c=ie(f)}await this.#g({input:l,output:d,request:t,response:r,error:c,logger:o,options:p})}};var sr=(e,t)=>{let r=e.map(n=>n.getSchema()).concat(t),o=r.reduce((n,i)=>n.and(i));return r.reduce((n,i)=>_t(i,n),o)};import{z as v}from"zod";var Ce={positive:200,negative:400};import Uo from"node:assert/strict";import{z as Ho}from"zod";var Qe=(e,t)=>typeof e=="function"?Qe(e(...t.arguments),t):e instanceof Ho.ZodType?[{...t,schema:e}]:(Array.isArray(e)&&Uo(e.length,new M(`At least one ${t.variant} response schema required.`)),(Array.isArray(e)?e:[e]).map(({schema:r,statusCodes:o,statusCode:n,mimeTypes:i,mimeType:a})=>({schema:r,statusCodes:n?[n]:o||t.statusCodes,mimeTypes:a?[a]:i||t.mimeTypes})));var St=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},Ie=class extends St{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return Qe(this.#e,{variant:"positive",arguments:[t],statusCodes:[Ce.positive],mimeTypes:[I.json]})}getNegativeResponse(){return Qe(this.#t,{variant:"negative",arguments:[],statusCodes:[Ce.negative],mimeTypes:[I.json]})}},ze=new Ie({positive:e=>{let t=H({schema:e}),r=v.object({status:v.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:v.object({status:v.literal("error"),error:v.object({message:v.string()})}).example({status:"error",error:{message:U(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:i})=>{if(!e){n.status(Ce.positive).json({status:"success",data:r});return}let a=Fe(e);ft({logger:i,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:U(e)}})}}),Tt=new Ie({positive:e=>{let t=H({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof v.ZodArray?e.shape.items:v.array(v.any());return t.reduce((o,n)=>Y(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:v.string().example(U(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:i})=>{if(r){let a=Fe(r);ft({logger:o,statusCode:a,request:n,error:r,input:i}),e.status(a).type("text/plain").send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(Ce.positive).json(t.items):e.status(500).type("text/plain").send("Property 'items' is missing in the endpoint output")}});var we=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 instanceof F?t:new F(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new de(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new F({input:Do.object({}),handler:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:i,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,l="methods"in p?p.methods:[p.method],f=typeof a=="function"?a:()=>a,m="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],h="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Ye({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:m,tags:h,methods:l,getOperationId:f,description:n,shortDescription:i,inputSchema:sr(d,t)})}},Fo=new we(ze),Ko=new we(Tt);import{Ansis as qo,blue as $o,cyanBright as Go,green as Vo,hex as _o,red as Yo}from"ansis";import{inspect as Qo}from"node:util";import{performance as dr}from"node:perf_hooks";var le={debug:10,info:20,warn:30,error:40},ar=e=>Y(e)&&Object.keys(le).some(t=>t in e),pr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),Je=pr(),ir=pr(2),Bo=e=>e<1e-6?["picosecond",e/1e-9,Je]:e<.001?["nanosecond",e/1e-6,Je]:e<1?["microsecond",e/.001,Je]:e<1e3?["millisecond",e,Je]:e<6e4?["second",e/1e3,ir]:["minute",e/6e4,ir],cr=e=>{let[t,r,o]=Bo(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var Ee=class e{constructor(t){this.config=t;let{color:r=new qo().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:$o,info:Vo,warn:_o("#FFA500"),error:Yo};prettyPrint(t){let{depth:r=2}=this.config;return Qo(t,{depth:r,colors:this.hasColor,breakLength:this.config.level==="debug"?80:1/0,compact:this.config.level==="debug"?3:!0})}print(t,r,o){if(this.config.level==="silent"||le[t]<le[this.config.level])return;let{requestId:n,...i}=this.config.ctx||{},a=[new Date().toISOString()];n&&a.push(this.hasColor?Go(n):n),a.push(this.hasColor?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&a.push(this.prettyPrint(o)),Object.keys(i).length>0&&a.push(this.prettyPrint(i)),console.log(a.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}profile(t){let r=dr.now();return()=>{let o=dr.now()-r,{message:n,severity:i="debug",formatter:a=cr}=typeof t=="object"?t:{message:t};this.print(typeof i=="function"?i(o):i,n,a(o))}}};import{head as Jo,tail as Wo,toPairs as Xo}from"ramda";var Ze=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze(Xo(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=Jo(this.pairs)?.[1],this.siblingMethods=Object.freeze(Wo(this.pairs).map(([r])=>r))}};import en from"express";var ve=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,en.static(...this.params))}};import Rt from"express";import pn from"node:http";import cn from"node:https";import{setInterval as tn}from"node:timers/promises";var lr=e=>"_httpMessage"in e&&typeof e._httpMessage=="object"&&e._httpMessage!==null&&"headersSent"in e._httpMessage&&typeof e._httpMessage.headersSent=="boolean"&&"setHeader"in e._httpMessage&&typeof e._httpMessage.setHeader=="function",mr=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",ur=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,fr=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),yr=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var gr=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,i=c=>void n.delete(c.destroy()),a=c=>void(lr(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):i(c)),p=c=>void(o?c.destroy():n.add(c.once("close",()=>void n.delete(c))));for(let c of e)for(let l of["connection","secureConnection"])c.on(l,p);let d=async()=>{for(let c of e)c.on("request",fr);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(ur(c)||mr(c))&&a(c);for await(let c of tn(10,Date.now()))if(n.size===0||Date.now()-c>=t)break;for(let c of n)i(c);return Promise.allSettled(e.map(yr))};return{sockets:n,shutdown:()=>o??=d()}};var me=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new Oe(e)};import hr from"node:assert/strict";var W=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{let i=Object.entries(e).map(([a,p])=>[a.trim(),p]);for(let[a,p]of i){hr.doesNotMatch(a,/\//,new se(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let d=`${o||""}${a?`/${a}`:""}`;if(p instanceof Pe){let c=p.getMethods().slice();n&&c.push("options");for(let l of c)t(p,d,l)}else if(p instanceof ve)r&&p.apply(d,r);else if(p instanceof Ze){for(let[c,l]of p.pairs)hr(l.getMethods().includes(c),new se(`Endpoint assigned to ${c} method of ${d} must support ${c} method.`)),t(l,d,c);n&&p.firstEndpoint&&t(p.firstEndpoint,d,"options",p.siblingMethods)}else W({onEndpoint:t,onStatic:r,hasCors:n,routing:p,parentPath:d})}};var Ot=({app:e,getChildLogger:t,config:r,routing:o,parsers:n})=>W({routing:o,hasCors:!!r.cors,onEndpoint:(i,a,p,d)=>{e[p](a,...n?.[i.getRequestType()]||[],async(c,l)=>i.execute({request:c,response:l,logger:t(c),config:r,siblingMethods:d}))},onStatic:(i,a)=>{e.use(i,a)}});import xr,{isHttpError as rn}from"http-errors";var br=({errorHandler:e,getChildLogger:t})=>async(r,o,n,i)=>r?e.execute({error:rn(r)?r:xr(400,ie(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):i(),Sr=({errorHandler:e,getChildLogger:t})=>async(r,o)=>{let n=xr(404,`Can not ${r.method} ${r.path}`),i=t(r);try{e.execute({request:r,response:o,logger:i,error:n,input:null,output:null,options:{}})}catch(a){Ve({response:o,logger:i,error:new M(ie(a).message,n)})}},on=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},nn=e=>({log:e.debug.bind(e)}),Tr=async({getChildLogger:e,config:t})=>{let r=await me("express-fileupload"),{limitError:o,beforeUpload:n,...i}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,d,c)=>{let l=e(p);try{await n?.({request:p,logger:l})}catch(f){return c(f)}return r({debug:!0,...i,abortOnLimit:!1,parseNested:!0,logger:nn(l)})(p,d,c)}),o&&a.push(on(o)),a},Or=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},Rr=({rootLogger:e,config:t})=>async(r,o,n)=>{let i=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;i.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[g]={logger:i}),n()},Ar=e=>t=>t.res?.locals[g]?.logger||e,Pr=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
|
|
6
|
-
`).slice(1)));import{gray as
|
|
4
|
+
`,{url:t.url,payload:r})},H=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=e._def[g]?.examples||[];if(!r&&t==="original")return o;let n=[];for(let i of o){let a=e.safeParse(i);a.success&&n.push(t==="parsed"?a.data:i)}return n},_=(e,t,r)=>e.length&&t.length?go(e,t).map(r):e.concat(t),Re=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,yt=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),w=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,r=>`/${r}`).split("/")).map(yt).join(""),Ke=e=>fo("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Be=(e,t)=>{try{return typeof e.parse(t)}catch{return}},Y=e=>typeof e=="object"&&e!==null;import{clone as To,mergeDeepRight as Oo}from"ramda";var g=Symbol.for("express-zod-api"),qe=e=>{let t=e.describe(e.description);return t._def[g]=To(t._def[g])||{examples:[]},t},_t=(e,t)=>{if(!(g in e._def))return t;let r=qe(t);return r._def[g].examples=_(r._def[g].examples,e._def[g].examples,([o,n])=>typeof o=="object"&&typeof n=="object"?Oo({...o},{...n}):n),r};var zo=function(e){let t=qe(this);return t._def[g].examples.push(e),t},wo=function(e){let t=qe(this);return t._def[g].defaultLabel=e,t},Eo=function(e){return new ae.ZodBranded({typeName:ae.ZodFirstPartyTypeKind.ZodBranded,type:this,description:this._def.description,errorMap:this._def.errorMap,[g]:{examples:[],...Yt(this._def[g]),brand:e}})},Zo=function(e){let t=typeof e=="function"?e:Po(Co,Ao(([n,i])=>Io(e[String(n)]||n,i)),Ro),r=t(Yt(this.shape)),o=ae.object(r)[this._def.unknownKeys]();return this.transform(t).pipe(o)};g in globalThis||(globalThis[g]=!0,Object.defineProperties(ae.ZodType.prototype,{example:{get(){return zo.bind(this)}},brand:{set(){},get(){return Eo.bind(this)}}}),Object.defineProperty(ae.ZodDefault.prototype,"label",{get(){return wo.bind(this)}}),Object.defineProperty(ae.ZodObject.prototype,"remap",{get(){return Zo.bind(this)}}));function vo(e){return e}import{z as Fo}from"zod";import{z as nr}from"zod";import{z as Lo}from"zod";import{z as $e}from"zod";var D=Symbol("File"),Qt=$e.custom(e=>Buffer.isBuffer(e),{message:"Expected Buffer"}),jo={buffer:()=>Qt.brand(D),string:()=>$e.string().brand(D),binary:()=>Qt.or($e.string()).brand(D),base64:()=>$e.string().base64().brand(D)};function Ge(e){return jo[e||"string"]()}var Q=Symbol("Raw"),Jt=(e={})=>Lo.object({raw:Ge("buffer")}).extend(e).brand(Q);import{z as No}from"zod";var Ae=Symbol("Upload"),Wt=()=>No.custom(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.encoding=="string"&&typeof e.mimetype=="string"&&Buffer.isBuffer(e.data)&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",e=>({message:`Expected file upload, received ${typeof e}`})).brand(Ae);var Xt=(e,{next:t})=>e.options.some(t),ko=({_def:e},{next:t})=>[e.left,e.right].some(t),er=(e,{next:t})=>t(e.unwrap()),Mo={ZodObject:({shape:e},{next:t})=>Object.values(e).some(t),ZodUnion:Xt,ZodDiscriminatedUnion:Xt,ZodIntersection:ko,ZodEffects:(e,{next:t})=>t(e.innerType()),ZodOptional:er,ZodNullable:er,ZodRecord:({valueSchema:e},{next:t})=>t(e),ZodArray:({element:e},{next:t})=>t(e),ZodDefault:({_def:e},{next:t})=>t(e.innerType)},gt=(e,{condition:t,rules:r=Mo,depth:o=1,maxDepth:n=Number.POSITIVE_INFINITY})=>{if(t(e))return!0;let i=o<n?r[e._def.typeName]:void 0;return i?i(e,{next:a=>gt(a,{condition:t,rules:r,maxDepth:n,depth:o+1})}):!1},tr=e=>gt(e,{condition:t=>t._def[g]?.brand===Ae}),rr=e=>gt(e,{condition:t=>t._def[g]?.brand===Q,maxDepth:3});var Ve=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).type("text/plain").end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
|
|
5
|
+
Original error: ${e.originalError.message}.`:""))};import{chain as Uo}from"ramda";var J=e=>Y(e)&&"or"in e,ce=e=>Y(e)&&"and"in e,ht=e=>({and:Uo(t=>ce(t)?t.and:[t],e)}),_e=(e,t)=>ce(e)?{and:e.and.map(r=>J(r)?{or:r.or.map(t)}:t(r))}:J(e)?{or:e.or.map(r=>ce(r)?{and:r.and.map(t)}:t(r))}:t(e),xt=e=>e.and.reduce((t,r)=>({or:_(t.or,J(r)?r.or:[r],ht)}),{or:[]}),pe=(e,t)=>ce(e)?J(t)?pe(xt(e),t):ht([e,t]):J(e)?ce(t)?pe(t,e):J(t)?{or:_(e.or,t.or,ht)}:pe(e,{and:[t]}):ce(t)||J(t)?pe(t,e):{and:[e,t]};import{z as or}from"zod";var bt=class{},F=class extends bt{#e;#t;#r;constructor({input:t,security:r,handler:o}){super(),this.#e=t,this.#t=r,this.#r=o}getSecurity(){return this.#t}getSchema(){return this.#e}async execute({input:t,...r}){try{let o=await this.#e.parseAsync(t);return this.#r({...r,input:o})}catch(o){throw o instanceof or.ZodError?new L(o):o}}},de=class extends F{constructor(t,{provider:r=()=>({}),transformer:o=n=>n}={}){super({input:or.object({}),handler:async({request:n,response:i})=>new Promise((a,p)=>{let d=c=>{if(c&&c instanceof Error)return p(o(c));a(r(n,i))};t(n,i,d)?.catch(d)})})}};var Pe=class{},Ye=class extends Pe{#e;#t;#r;#i;#o;#a;#p;#n;#c;#d;#l;#s;constructor({methods:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:i,getOperationId:a=()=>{},scopes:p=[],middlewares:d=[],tags:c=[],description:l,shortDescription:f}){super(),this.#a=n,this.#p=i,this.#r=d,this.#l=a,this.#t=Object.freeze(t),this.#c=Object.freeze(p),this.#d=Object.freeze(c),this.#e={long:l,short:f},this.#n={input:r,output:o},this.#o={positive:Object.freeze(i.getPositiveResponse(o)),negative:Object.freeze(i.getNegativeResponse())},this.#s=tr(r)?"upload":rr(r)?"raw":"json",this.#i={input:Object.freeze([P[this.#s]]),positive:Object.freeze(this.#o.positive.flatMap(({mimeTypes:m})=>m)),negative:Object.freeze(this.#o.negative.flatMap(({mimeTypes:m})=>m))}}getDescription(t){return this.#e[t]}getMethods(){return this.#t}getSchema(t){return t==="input"||t==="output"?this.#n[t]:this.getResponses(t).map(({schema:r})=>r).reduce((r,o)=>r.or(o))}getMimeTypes(t){return this.#i[t]}getRequestType(){return this.#s}getResponses(t){return this.#o[t]}getSecurity(){return this.#r.reduce((t,r)=>{let o=r.getSecurity();return o?pe(t,o):t},{and:[]})}getScopes(){return this.#c}getTags(){return this.#d}getOperationId(t){return this.#l(t)}#m(t){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.#t.concat(t).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#u(t){try{return await this.#n.output.parseAsync(t)}catch(r){throw r instanceof nr.ZodError?new V(r):r}}async#f({method:t,input:r,request:o,response:n,logger:i,options:a}){for(let p of this.#r)if(!(t==="options"&&!(p instanceof de))&&(Object.assign(a,await p.execute({input:r,options:a,request:o,response:n,logger:i})),n.writableEnded)){i.warn("A middleware has closed the stream. Accumulated options:",a);break}}async#y({input:t,options:r,logger:o}){let n;try{n=await this.#n.input.parseAsync(t)}catch(i){throw i instanceof nr.ZodError?new L(i):i}return this.#a({input:n,options:r,logger:o})}async#g({error:t,request:r,response:o,logger:n,input:i,output:a,options:p}){try{await this.#p.execute({error:t,output:a,request:r,response:o,logger:n,input:i,options:p})}catch(d){Ve({logger:n,response:o,error:new M(ie(d).message,t||void 0)})}}async execute({request:t,response:r,logger:o,config:n,siblingMethods:i=[]}){let a=lt(t),p={},d=null,c=null;if(n.cors){let f=this.#m(i);typeof n.cors=="function"&&(f=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:f}));for(let m in f)r.set(m,f[m])}let l=ut(t,n.inputSources);try{if(await this.#f({method:a,input:l,request:t,response:r,logger:o,options:p}),r.writableEnded)return;if(a==="options"){r.status(200).end();return}d=await this.#u(await this.#y({input:l,logger:o,options:p}))}catch(f){c=ie(f)}await this.#g({input:l,output:d,request:t,response:r,error:c,logger:o,options:p})}};var sr=(e,t)=>{let r=e.map(n=>n.getSchema()).concat(t),o=r.reduce((n,i)=>n.and(i));return r.reduce((n,i)=>_t(i,n),o)};import{z as v}from"zod";var Ce={positive:200,negative:400};import Ho from"node:assert/strict";import{z as Do}from"zod";var Qe=(e,t)=>typeof e=="function"?Qe(e(...t.arguments),t):e instanceof Do.ZodType?[{...t,schema:e}]:(Array.isArray(e)&&Ho(e.length,new M(`At least one ${t.variant} response schema required.`)),(Array.isArray(e)?e:[e]).map(({schema:r,statusCodes:o,statusCode:n,mimeTypes:i,mimeType:a})=>({schema:r,statusCodes:n?[n]:o||t.statusCodes,mimeTypes:a?[a]:i||t.mimeTypes})));var St=class{#e;constructor(t){this.#e=t}execute(...t){return this.#e(...t)}},Ie=class extends St{#e;#t;constructor(t){super(t.handler),this.#e=t.positive,this.#t=t.negative}getPositiveResponse(t){return Qe(this.#e,{variant:"positive",arguments:[t],statusCodes:[Ce.positive],mimeTypes:[P.json]})}getNegativeResponse(){return Qe(this.#t,{variant:"negative",arguments:[],statusCodes:[Ce.negative],mimeTypes:[P.json]})}},ze=new Ie({positive:e=>{let t=H({schema:e}),r=v.object({status:v.literal("success"),data:e});return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},negative:v.object({status:v.literal("error"),error:v.object({message:v.string()})}).example({status:"error",error:{message:U(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:i})=>{if(!e){n.status(Ce.positive).json({status:"success",data:r});return}let a=Fe(e);ft({logger:i,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:U(e)}})}}),Tt=new Ie({positive:e=>{let t=H({schema:e}),r="shape"in e&&"items"in e.shape&&e.shape.items instanceof v.ZodArray?e.shape.items:v.array(v.any());return t.reduce((o,n)=>Y(n)&&"items"in n&&Array.isArray(n.items)?o.example(n.items):o,r)},negative:v.string().example(U(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:i})=>{if(r){let a=Fe(r);ft({logger:o,statusCode:a,request:n,error:r,input:i}),e.status(a).type("text/plain").send(r.message);return}t&&"items"in t&&Array.isArray(t.items)?e.status(Ce.positive).json(t.items):e.status(500).type("text/plain").send("Property 'items' is missing in the endpoint output")}});var we=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 instanceof F?t:new F(t)),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(...t){return e.#e(this.middlewares.concat(new de(...t)),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(new F({input:Fo.object({}),handler:t})),this.resultHandler)}build({input:t,handler:r,output:o,description:n,shortDescription:i,operationId:a,...p}){let{middlewares:d,resultHandler:c}=this,l="methods"in p?p.methods:[p.method],f=typeof a=="function"?a:()=>a,m="scopes"in p?p.scopes:"scope"in p&&p.scope?[p.scope]:[],h="tags"in p?p.tags:"tag"in p&&p.tag?[p.tag]:[];return new Ye({handler:r,middlewares:d,outputSchema:o,resultHandler:c,scopes:m,tags:h,methods:l,getOperationId:f,description:n,shortDescription:i,inputSchema:sr(d,t)})}},Ko=new we(ze),Bo=new we(Tt);import{Ansis as $o,blue as Go,cyanBright as Vo,green as _o,hex as Yo,red as Qo}from"ansis";import{inspect as Jo}from"node:util";import{performance as dr}from"node:perf_hooks";var le={debug:10,info:20,warn:30,error:40},ar=e=>Y(e)&&Object.keys(le).some(t=>t in e),pr=(e=0)=>Intl.NumberFormat(void 0,{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}),Je=pr(),ir=pr(2),qo=e=>e<1e-6?["picosecond",e/1e-9,Je]:e<.001?["nanosecond",e/1e-6,Je]:e<1?["microsecond",e/.001,Je]:e<1e3?["millisecond",e,Je]:e<6e4?["second",e/1e3,ir]:["minute",e/6e4,ir],cr=e=>{let[t,r,o]=qo(e);return`${o.format(r)} ${t}${r>1?"s":""}`};var Ee=class e{constructor(t){this.config=t;let{color:r=new $o().isSupported()}=t;this.hasColor=r}hasColor;styles={debug:Go,info:_o,warn:Yo("#FFA500"),error:Qo};prettyPrint(t){let{depth:r=2}=this.config;return Jo(t,{depth:r,colors:this.hasColor,breakLength:this.config.level==="debug"?80:1/0,compact:this.config.level==="debug"?3:!0})}print(t,r,o){if(this.config.level==="silent"||le[t]<le[this.config.level])return;let{requestId:n,...i}=this.config.ctx||{},a=[new Date().toISOString()];n&&a.push(this.hasColor?Vo(n):n),a.push(this.hasColor?`${this.styles[t](t)}:`:`${t}:`,r),o!==void 0&&a.push(this.prettyPrint(o)),Object.keys(i).length>0&&a.push(this.prettyPrint(i)),console.log(a.join(" "))}debug(t,r){this.print("debug",t,r)}info(t,r){this.print("info",t,r)}warn(t,r){this.print("warn",t,r)}error(t,r){this.print("error",t,r)}child(t){return new e({...this.config,ctx:t})}profile(t){let r=dr.now();return()=>{let o=dr.now()-r,{message:n,severity:i="debug",formatter:a=cr}=typeof t=="object"?t:{message:t};this.print(typeof i=="function"?i(o):i,n,a(o))}}};import{head as Wo,tail as Xo,toPairs as en}from"ramda";var Ze=class{pairs;firstEndpoint;siblingMethods;constructor(t){this.pairs=Object.freeze(en(t).filter(r=>r!==void 0&&r[1]!==void 0)),this.firstEndpoint=Wo(this.pairs)?.[1],this.siblingMethods=Object.freeze(Xo(this.pairs).map(([r])=>r))}};import tn from"express";var ve=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,tn.static(...this.params))}};import Rt from"express";import cn from"node:http";import dn from"node:https";var me=async(e,t="default")=>{try{return(await import(e))[t]}catch{}throw new Oe(e)};import lr from"node:assert/strict";var W=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{let i=Object.entries(e).map(([a,p])=>[a.trim(),p]);for(let[a,p]of i){lr.doesNotMatch(a,/\//,new se(`The entry '${a}' must avoid having slashes \u2014 use nesting instead.`));let d=`${o||""}${a?`/${a}`:""}`;if(p instanceof Pe){let c=p.getMethods().slice();n&&c.push("options");for(let l of c)t(p,d,l)}else if(p instanceof ve)r&&p.apply(d,r);else if(p instanceof Ze){for(let[c,l]of p.pairs)lr(l.getMethods().includes(c),new se(`Endpoint assigned to ${c} method of ${d} must support ${c} method.`)),t(l,d,c);n&&p.firstEndpoint&&t(p.firstEndpoint,d,"options",p.siblingMethods)}else W({onEndpoint:t,onStatic:r,hasCors:n,routing:p,parentPath:d})}};var Ot=({app:e,getChildLogger:t,config:r,routing:o,parsers:n})=>W({routing:o,hasCors:!!r.cors,onEndpoint:(i,a,p,d)=>{e[p](a,...n?.[i.getRequestType()]||[],async(c,l)=>i.execute({request:c,response:l,logger:t(c),config:r,siblingMethods:d}))},onStatic:(i,a)=>{e.use(i,a)}});import xr,{isHttpError as on}from"http-errors";import{setInterval as rn}from"node:timers/promises";var mr=e=>"_httpMessage"in e&&typeof e._httpMessage=="object"&&e._httpMessage!==null&&"headersSent"in e._httpMessage&&typeof e._httpMessage.headersSent=="boolean"&&"setHeader"in e._httpMessage&&typeof e._httpMessage.setHeader=="function",ur=e=>"server"in e&&typeof e.server=="object"&&e.server!==null&&"close"in e.server&&typeof e.server.close=="function",fr=e=>"encrypted"in e&&typeof e.encrypted=="boolean"&&e.encrypted,yr=({},e)=>void(!e.headersSent&&e.setHeader("connection","close")),gr=e=>new Promise((t,r)=>void e.close(o=>o?r(o):t()));var hr=(e,{timeout:t=1e3,logger:r}={})=>{let o,n=new Set,i=c=>void n.delete(c.destroy()),a=c=>void(mr(c)?!c._httpMessage.headersSent&&c._httpMessage.setHeader("connection","close"):i(c)),p=c=>void(o?c.destroy():n.add(c.once("close",()=>void n.delete(c))));for(let c of e)for(let l of["connection","secureConnection"])c.on(l,p);let d=async()=>{for(let c of e)c.on("request",yr);r?.info("Graceful shutdown",{sockets:n.size,timeout:t});for(let c of n)(fr(c)||ur(c))&&a(c);for await(let c of rn(10,Date.now()))if(n.size===0||Date.now()-c>=t)break;for(let c of n)i(c);return Promise.allSettled(e.map(gr))};return{sockets:n,shutdown:()=>o??=d()}};var br=({errorHandler:e,getChildLogger:t})=>async(r,o,n,i)=>r?e.execute({error:on(r)?r:xr(400,ie(r).message),request:o,response:n,input:null,output:null,options:{},logger:t(o)}):i(),Sr=({errorHandler:e,getChildLogger:t})=>async(r,o)=>{let n=xr(404,`Can not ${r.method} ${r.path}`),i=t(r);try{e.execute({request:r,response:o,logger:i,error:n,input:null,output:null,options:{}})}catch(a){Ve({response:o,logger:i,error:new M(ie(a).message,n)})}},nn=e=>(t,{},r)=>{if(Object.values(t?.files||[]).flat().find(({truncated:n})=>n))return r(e);r()},sn=e=>({log:e.debug.bind(e)}),Tr=async({getChildLogger:e,config:t})=>{let r=await me("express-fileupload"),{limitError:o,beforeUpload:n,...i}={...typeof t.server.upload=="object"&&t.server.upload},a=[];return a.push(async(p,d,c)=>{let l=e(p);try{await n?.({request:p,logger:l})}catch(f){return c(f)}return r({debug:!0,...i,abortOnLimit:!1,parseNested:!0,logger:sn(l)})(p,d,c)}),o&&a.push(nn(o)),a},Or=(e,{},t)=>{Buffer.isBuffer(e.body)&&(e.body={raw:e.body}),t()},Rr=({rootLogger:e,config:t})=>async(r,o,n)=>{let i=t.childLoggerProvider?await t.childLoggerProvider({request:r,parent:e}):e;i.debug(`${r.method}: ${r.path}`),r.res&&(r.res.locals[g]={logger:i}),n()},Ar=e=>t=>t.res?.locals[g]?.logger||e,Pr=e=>process.on("deprecation",({message:t,namespace:r,name:o,stack:n})=>e.warn(`${o} (${r}): ${t}`,n.split(`
|
|
6
|
+
`).slice(1))),Cr=({servers:e,logger:t,options:{timeout:r,events:o=["SIGINT","SIGTERM"]}})=>{let n=hr(e,{logger:t,timeout:r}),i=()=>n.shutdown().then(()=>process.exit());for(let a of o)process.on(a,i)};import{gray as an,hex as Ir,italic as We,whiteBright as pn}from"ansis";var zr=()=>{let e=We("Proudly supports transgender community.".padStart(109)),t=We("Start your API server with I/O schema validation and custom middlewares in minutes.".padStart(109)),r=We("Thank you for choosing Express Zod API for your project.".padStart(132)),o=We("for Zoey".padEnd(20)),n=Ir("#F5A9B8"),i=Ir("#5BCEFA"),a=new Array(14).fill(i,1,3).fill(n,3,5).fill(pn,5,7).fill(n,7,9).fill(i,9,12).fill(an,12,13);return`
|
|
7
7
|
8888888888 8888888888P 888 d8888 8888888b. 8888888
|
|
8
8
|
888 d88P 888 d88888 888 Y88b 888
|
|
9
9
|
888 d88P 888 d88P888 888 888 888
|
|
@@ -18,8 +18,8 @@ ${o}888${t}
|
|
|
18
18
|
${r}
|
|
19
19
|
`.split(`
|
|
20
20
|
`).map((d,c)=>a[c]?a[c](d):d).join(`
|
|
21
|
-
`)};var zr=e=>{e.startupLogo!==!1&&console.log(Ir());let t=e.errorHandler||ze,r=ar(e.logger)?e.logger:new Ee(e.logger);r.debug("Running","v20.12.0 (ESM)"),Pr(r);let o=Rr({rootLogger:r,config:e}),i={getChildLogger:Ar(r),errorHandler:t},a=Sr(i),p=br(i);return{...i,rootLogger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},dn=(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,loggingMiddleware:i}=zr(e);return Ot({app:e.app.use(i),routing:t,getChildLogger:o,config:e}),{notFoundHandler:n,logger:r}},ln=async(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=zr(e),p=Rt().disable("x-powered-by").use(a);if(e.server.compression){let m=await me("compression");p.use(m(typeof e.server.compression=="object"?e.server.compression:void 0))}let d={json:[e.server.jsonParser||Rt.json()],raw:[e.server.rawParser||Rt.raw(),Or],upload:e.server.upload?await Tr({config:e,getChildLogger:o}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:p,logger:r,getChildLogger:o}),Ot({app:p,routing:t,getChildLogger:o,config:e,parsers:d}),p.use(i,n);let c=(m,h)=>m.listen(h,()=>r.info("Listening",h)),l=pn.createServer(p),f=e.https&&cn.createServer(e.https.options,p);if(e.gracefulShutdown){let{events:m=["SIGINT","SIGTERM"],timeout:h}=typeof e.gracefulShutdown=="object"?e.gracefulShutdown:{},T=gr([l].concat(f||[]),{logger:r,timeout:h}),x=()=>T.shutdown().then(()=>process.exit());for(let A of m)process.on(A,x)}return{app:p,logger:r,httpServer:c(l,e.server.listen),httpsServer:f&&c(f,e.https?.listen)}};import ys from"node:assert/strict";import{OpenApiBuilder as gs}from"openapi3-ts/oas31";import{pluck as hs}from"ramda";import te from"node:assert/strict";import{isReferenceObject as Pt,isSchemaObject as tt}from"openapi3-ts/oas31";import{concat as un,type as jr,filter as fn,fromPairs as ke,has as yn,isNil as gn,map as ue,mergeAll as hn,mergeDeepRight as xn,mergeDeepWith as bn,objOf as Lr,omit as rt,pipe as Nr,pluck as Sn,range as Tn,reject as On,toLower as Rn,union as An,when as Pn,xprod as ot,zip as Cn}from"ramda";import{z as S}from"zod";import{z as je}from"zod";var Xe=e=>!isNaN(e.getTime());var Le=Symbol("DateIn"),wr=()=>je.union([je.string().date(),je.string().datetime(),je.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(je.date().refine(Xe)).brand(Le);import{z as mn}from"zod";var Ne=Symbol("DateOut"),Er=()=>mn.date().refine(Xe).transform(e=>e.toISOString()).brand(Ne);var X=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[g]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>X(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var Zr=50,kr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",In={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Mr=/:([A-Za-z0-9_]+)/g,zn=e=>e.match(Mr)?.map(t=>t.slice(1))||[],Ur=e=>e.replace(Mr,t=>`{${t.slice(1)}}`),wn=({_def:e},{next:t})=>({...t(e.innerType),default:e[g]?.defaultLabel||e.defaultValue()}),En=({_def:{innerType:e}},{next:t})=>t(e),Zn=()=>({format:"any"}),vn=({},e)=>(te(!e.isResponse,new w({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),jn=e=>{let t=e.unwrap();return{type:"string",format:t instanceof S.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Ln=({options:e},{next:t})=>({oneOf:e.map(t)}),Nn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),kn=e=>{let[t,r]=e.filter(tt).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));te(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=bn((n,i)=>Array.isArray(n)&&Array.isArray(i)?un(n,i):n===i?i:te.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=An(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=_(t.examples||[],r.examples||[],([n,i])=>xn(n,i))),o},Mn=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return kn(o)}catch{}return{allOf:o}},Un=(e,{next:t})=>t(e.unwrap()),Hn=(e,{next:t})=>t(e.unwrap()),Dn=(e,{next:t})=>{let r=t(e.unwrap());return tt(r)&&(r.type=Dr(r)),r},Hr=e=>{let t=Rn(jr(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},vr=e=>({type:Hr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Fn=({value:e})=>({type:Hr(e),const:e}),Kn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Re(p)?p instanceof S.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=et(e,r)),i.length&&(a.required=i),a},Bn=()=>({type:"null"}),qn=({},e)=>(te(!e.isResponse,new w({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:kr}}),$n=({},e)=>(te(e.isResponse,new w({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:kr}}),Gn=({},e)=>te.fail(new w({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),Vn=()=>({type:"boolean"}),_n=()=>({type:"integer",format:"bigint"}),Yn=e=>e.every(t=>t instanceof S.ZodLiteral),Qn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof S.ZodEnum||e instanceof S.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=et(S.object(ke(ot(o,[t]))),r),n.required=o),n}if(e instanceof S.ZodLiteral)return{type:"object",properties:et(S.object({[e.value]:t}),r),required:[e.value]};if(e instanceof S.ZodUnion&&Yn(e.options)){let o=ue(i=>`${i.value}`,e.options),n=ke(ot(o,[t]));return{type:"object",properties:et(S.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},Jn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},Wn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),Xn=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:f}})=>{let m=f.find(P=>P.kind==="regex"),h=f.find(P=>P.kind==="datetime"),T=m?m.regex:h?h.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,x={type:"string"},A={"date-time":l,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let P in A)if(A[P]){x.format=P;break}return r!==null&&(x.minLength=r),o!==null&&(x.maxLength=o),T&&(x.pattern=T.source),x},es=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(f=>f.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(f=>f.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,l={type:e?"integer":"number",format:e?"int64":"double"};return a?l.minimum=i:l.exclusiveMinimum=i,c?l.maximum=d:l.exclusiveMaximum=d,l},et=({shape:e},t)=>ue(t,e),ts=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return In?.[t]},Dr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},rs=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&tt(o)){let i=Be(e,ts(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(S.any())}if(!t&&n.type==="preprocess"&&tt(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},os=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),ns=(e,{next:t})=>t(e.unwrap()),ss=({schema:e},{next:t,serializer:r,getRef:o,makeRef:n})=>{let i=r(e);return o(i)||(n(i,{}),n(i,t(e)))},is=(e,{next:t})=>t(e.unwrap().shape.raw),Fr=e=>e.length?ke(Cn(Tn(1,e.length+1).map(t=>`example${t}`),ue(Lr("value"),e))):void 0,Kr=(e,t,r=[])=>Nr(H,ue(Pn(o=>jr(o)==="Object",rt(r))),Fr)({schema:e,variant:t?"parsed":"original",validate:!0}),as=(e,t)=>Nr(H,fn(yn(t)),Sn(t),Fr)({schema:e,variant:"original",validate:!0}),ee=e=>e instanceof S.ZodObject?e:e instanceof S.ZodBranded?ee(e.unwrap()):e instanceof S.ZodUnion||e instanceof S.ZodDiscriminatedUnion?e.options.map(t=>ee(t)).reduce((t,r)=>t.merge(r.partial()),S.object({})):e instanceof S.ZodEffects?ee(e._def.schema):e instanceof S.ZodPipeline?ee(e._def.in):ee(e._def.left).merge(ee(e._def.right)),Br=({path:e,method:t,schema:r,inputSources:o,serializer:n,getRef:i,makeRef:a,composition:p,brandHandling:d,description:c=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:l}=ee(r),f=zn(e),m=o.includes("query"),h=o.includes("params"),T=o.includes("headers"),x=b=>h&&f.includes(b),A=b=>T&&mt(b);return Object.keys(l).map(b=>({name:b,location:x(b)?"path":A(b)?"header":m?"query":void 0})).filter(b=>b.location!==void 0).map(({name:b,location:ge})=>{let k=X(l[b],{rules:{...d,...Ct},onEach:It,onMissing:zt,ctx:{isResponse:!1,serializer:n,getRef:i,makeRef:a,path:e,method:t}}),$=p==="components"?a(E(c,b),k):k;return{name:b,in:ge,required:!l[b].isOptional(),description:k.description||c,schema:$,examples:as(r,b)}})},Ct={ZodString:Xn,ZodNumber:es,ZodBigInt:_n,ZodBoolean:Vn,ZodNull:Bn,ZodArray:Jn,ZodTuple:Wn,ZodRecord:Qn,ZodObject:Kn,ZodLiteral:Fn,ZodIntersection:Mn,ZodUnion:Ln,ZodAny:Zn,ZodDefault:wn,ZodEnum:vr,ZodNativeEnum:vr,ZodEffects:rs,ZodOptional:Un,ZodNullable:Dn,ZodDiscriminatedUnion:Nn,ZodBranded:ns,ZodDate:Gn,ZodCatch:En,ZodPipeline:os,ZodLazy:ss,ZodReadonly:Hn,[D]:jn,[Ae]:vn,[Ne]:$n,[Le]:qn,[Q]:is},It=(e,{isResponse:t,prev:r})=>{if(Pt(r))return{};let{description:o}=e,n=e instanceof S.ZodLazy,i=r.type!==void 0,a=t&&Re(e),p=!n&&i&&!a&&e.isNullable(),d=n?[]:H({schema:e,variant:t?"parsed":"original",validate:!0}),c={};return o&&(c.description=o),p&&(c.type=Dr(r)),d.length&&(c.examples=d.slice()),c},zt=(e,t)=>te.fail(new w({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),At=(e,t)=>{if(Pt(e))return e;let r={...e};return r.properties&&(r.properties=rt(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>rt(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>At(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>At(o,t))),r},qr=e=>Pt(e)?e:rt(["examples"],e),$r=({method:e,path:t,schema:r,mimeTypes:o,variant:n,serializer:i,getRef:a,makeRef:p,composition:d,hasMultipleStatusCodes:c,statusCode:l,brandHandling:f,description:m=`${e.toUpperCase()} ${t} ${yt(n)} response ${c?l:""}`.trim()})=>{let h=qr(X(r,{rules:{...f,...Ct},onEach:It,onMissing:zt,ctx:{isResponse:!0,serializer:i,getRef:a,makeRef:p,path:t,method:e}})),T={schema:d==="components"?p(E(m),h):h,examples:Kr(r,!0)};return{description:m,content:ke(ot(o,[T]))}},ps=()=>({type:"http",scheme:"basic"}),cs=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},ds=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},ls=({name:e})=>({type:"apiKey",in:"header",name:e}),ms=({name:e})=>({type:"apiKey",in:"cookie",name:e}),us=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),fs=({flows:e={}})=>({type:"oauth2",flows:ue(t=>({...t,scopes:t.scopes||{}}),On(gn,e))}),Gr=(e,t)=>{let r={basic:ps,bearer:cs,input:ds,header:ls,cookie:ms,openid:us,oauth2:fs};return _e(e,o=>r[o.type](o,t))},nt=e=>"or"in e?e.or.map(t=>"and"in t?hn(ue(({name:r,scopes:o})=>Lr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?nt(xt(e)):nt({or:[e]}),Vr=({method:e,path:t,schema:r,mimeTypes:o,serializer:n,getRef:i,makeRef:a,composition:p,brandHandling:d,paramNames:c,description:l=`${e.toUpperCase()} ${t} Request body`})=>{let f=qr(At(X(r,{rules:{...d,...Ct},onEach:It,onMissing:zt,ctx:{isResponse:!1,serializer:n,getRef:i,makeRef:a,path:t,method:e}}),c)),m={schema:p==="components"?a(E(l),f):f,examples:Kr(r,!1,c)};return{description:l,content:ke(ot(o,[m]))}},_r=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}),wt=e=>e.length<=Zr?e:e.slice(0,Zr-1)+"\u2026";var Et=class extends gs{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;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){let n=o||E(r,t),i=this.lastOperationIdSuffixes.get(n);return i===void 0?(this.lastOperationIdSuffixes.set(n,1),n):(o&&ys.fail(new w({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Ke}){super(),this.addInfo({title:o,version:n});for(let m of typeof i=="string"?[i]:i)this.addServer({url:m});W({routing:t,onEndpoint:(m,h,T)=>{let x=T,A={path:h,method:x,endpoint:m,composition:c,serializer:l,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[P,b]=["short","long"].map(m.getDescription.bind(m)),ge=P?wt(P):d&&b?wt(b):void 0,k=m.getTags(),$=r.inputSources?.[x]||dt[x],oe=this.ensureUniqOperationId(h,x,m.getOperationId(x)),he=Br({...A,inputSources:$,schema:m.getSchema("input"),description:a?.requestParameter?.call(null,{method:x,path:h,operationId:oe})}),Ue={};for(let j of["positive","negative"]){let G=m.getResponses(j);for(let{mimeTypes:xe,schema:O,statusCodes:R}of G)for(let C of R)Ue[C]=$r({...A,variant:j,schema:O,mimeTypes:xe,statusCode:C,hasMultipleStatusCodes:G.length>1||R.length>1,description:a?.[`${j}Response`]?.call(null,{method:x,path:h,operationId:oe,statusCode:C})})}let ct=$.includes("body")?Vr({...A,paramNames:hs("name",he),schema:m.getSchema("input"),mimeTypes:m.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:x,path:h,operationId:oe})}):void 0,He=nt(_e(Gr(m.getSecurity(),$),j=>{let G=this.ensureUniqSecuritySchemaName(j),xe=["oauth2","openIdConnect"].includes(j.type)?m.getScopes().slice():[];return this.addSecurityScheme(G,j),{name:G,scopes:xe}}));this.addPath(Ur(h),{[x]:{operationId:oe,summary:ge,description:b,tags:k.length>0?k:void 0,parameters:he.length>0?he:void 0,requestBody:ct,security:He.length>0?He:void 0,responses:Ue}})}}),this.rootDoc.tags=r.tags?_r(r.tags):[]}};import{createRequest as xs,createResponse as bs}from"node-mocks-http";var Ss=e=>xs({...e,headers:{"content-type":I.json,...e?.headers}}),Ts=e=>bs(e),Os=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:o in le?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},Rs=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=Ss(e),i=Ts({req:n,...t});i.req=t?.req||n,n.res=i;let a=Os(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},As=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=Rs(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}};import Z from"typescript";import N from"typescript";import{chain as Yr,toPairs as Qr}from"ramda";var s=N.factory,K=[s.createModifier(N.SyntaxKind.ExportKeyword)],Ps=[s.createModifier(N.SyntaxKind.AsyncKeyword)],Cs=[s.createModifier(N.SyntaxKind.PublicKeyword),s.createModifier(N.SyntaxKind.ReadonlyKeyword)],Jr=[s.createModifier(N.SyntaxKind.ProtectedKeyword),s.createModifier(N.SyntaxKind.ReadonlyKeyword)],Zt=s.createTemplateHead(""),fe=s.createTemplateTail(""),vt=s.createTemplateMiddle(" "),jt=e=>s.createTemplateLiteralType(Zt,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?fe:vt))),Lt=jt(["M","P"]),st=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),it=(e,t)=>Yr(([r,o])=>[st(s.createIdentifier(r),o,t)],Qr(e)),Nt=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),Wr=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),Xr=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),B=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],N.NodeFlags.Const),kt=(e,t)=>s.createTypeAliasDeclaration(K,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),at=(e,t)=>s.createTypeAliasDeclaration(K,e,void 0,t),eo=(e,t,r)=>s.createPropertyDeclaration(Cs,e,void 0,t,r),to=(e,t,r)=>s.createClassDeclaration(K,e,void 0,void 0,[t,...r]),ro=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),oo=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(N.SyntaxKind.AnyKeyword)]),no=(e,t,r)=>s.createInterfaceDeclaration(K,e,void 0,t,r),Is=Yr(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),so=e=>Is(Qr(e)),Mt=(e,t,r)=>s.createArrowFunction(r?Ps:void 0,void 0,e.map(o=>st(o)),void 0,void 0,t),Ut=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,it({acc:void 0,key:void 0}),void 0,void 0,t),r]),io=(...e)=>`"${e.join(" ")}"`;var ao=["get","post","put","delete","patch"];import y from"typescript";import{z as Ft}from"zod";import q from"typescript";var{factory:pt}=q,Ht=(e,t)=>{q.addSyntheticLeadingComment(e,q.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ye=(e,t,r)=>{let o=pt.createTypeAliasDeclaration(void 0,pt.createIdentifier(t),void 0,e);return r&&Ht(o,r),o},Dt=(e,t)=>{let r=q.createSourceFile("print.ts","",q.ScriptTarget.Latest,!1,q.ScriptKind.TS);return q.createPrinter(t).printNode(q.EmitHint.Unspecified,e,r)},zs=/^[A-Za-z_$][A-Za-z0-9_$]*$/,po=e=>zs.test(e)?pt.createIdentifier(e):pt.createStringLiteral(e);var{factory:u}=y,ws={[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},Es=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),Zs=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&Re(a)?a instanceof Ft.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,po(i),p&&o?u.createToken(y.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Ht(d,a.description),d});return u.createTypeLiteralNode(n)},vs=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),js=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),co=({options:e},{next:t})=>u.createUnionTypeNode(e.map(t)),Ls=e=>ws?.[e.kind],Ns=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Be(e,Ls(o)),i={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(n&&i[n]||y.SyntaxKind.AnyKeyword)}return o},ks=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),Ms=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},Us=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),Hs=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),Ds=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),Fs=({_def:e},{next:t})=>u.createIntersectionTypeNode([e.left,e.right].map(t)),Ks=({_def:e},{next:t})=>t(e.innerType),re=e=>()=>u.createKeywordTypeNode(e),Bs=(e,{next:t})=>t(e.unwrap()),qs=(e,{next:t})=>t(e.unwrap()),$s=({_def:e},{next:t})=>t(e.innerType),Gs=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),Vs=()=>u.createLiteralTypeNode(u.createNull()),_s=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:n})=>{let i=`Type${n(e)}`;return t(i)||(r(i,u.createLiteralTypeNode(u.createNull())),r(i,o(e)))},Ys=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(y.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),n=u.createUnionTypeNode([r,o]);return t instanceof Ft.ZodString?r:t instanceof Ft.ZodUnion?n:o},Qs=(e,{next:t})=>t(e.unwrap().shape.raw),Js={ZodString:re(y.SyntaxKind.StringKeyword),ZodNumber:re(y.SyntaxKind.NumberKeyword),ZodBigInt:re(y.SyntaxKind.BigIntKeyword),ZodBoolean:re(y.SyntaxKind.BooleanKeyword),ZodAny:re(y.SyntaxKind.AnyKeyword),[Le]:re(y.SyntaxKind.StringKeyword),[Ne]:re(y.SyntaxKind.StringKeyword),ZodNull:Vs,ZodArray:vs,ZodTuple:Hs,ZodRecord:Ds,ZodObject:Zs,ZodLiteral:Es,ZodIntersection:Fs,ZodUnion:co,ZodDefault:Ks,ZodEnum:js,ZodNativeEnum:ks,ZodEffects:Ns,ZodOptional:Ms,ZodNullable:Us,ZodDiscriminatedUnion:co,ZodBranded:Bs,ZodCatch:$s,ZodPipeline:Gs,ZodLazy:_s,ZodReadonly:qs,[D]:Ys,[Q]:Qs},Me=(e,{brandHandling:t,ctx:r})=>X(e,{rules:{...t,...Js},onMissing:()=>u.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),ctx:r});var Kt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?s.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,ye(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:n=Ke,splitResponse:i=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){W({routing:t,onEndpoint:(O,R,C)=>{let ne={serializer:n,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},be=E(C,R,"input"),Se=Me(O.getSchema("input"),{brandHandling:r,ctx:{...ne,isResponse:!1}}),z=i?E(C,R,"positive.response"):void 0,Bt=O.getSchema("positive"),qt=i?Me(Bt,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Te=i?E(C,R,"negative.response"):void 0,$t=O.getSchema("negative"),Gt=i?Me($t,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Vt=E(C,R,"response"),lo=z&&Te?s.createUnionTypeNode([s.createTypeReferenceNode(z),s.createTypeReferenceNode(Te)]):Me(Bt.or($t),{brandHandling:r,ctx:{...ne,isResponse:!0}});this.program.push(ye(Se,be)),qt&&z&&this.program.push(ye(qt,z)),Gt&&Te&&this.program.push(ye(Gt,Te)),this.program.push(ye(lo,Vt)),C!=="options"&&(this.paths.push(R),this.registry.set({method:C,path:R},{input:be,positive:z,negative:Te,response:Vt,isJson:O.getMimeTypes("positive").includes(I.json),tags:O.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(kt(this.ids.pathType,this.paths)),this.program.push(kt(this.ids.methodType,ao)),this.program.push(at(this.ids.methodPathType,jt([this.ids.methodType,this.ids.pathType])));let p=[s.createHeritageClause(Z.SyntaxKind.ExtendsKeyword,[Nt(this.ids.methodPathType,Z.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),i&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let d=[],c=[];for(let[{method:O,path:R},{isJson:C,tags:ne,...be}]of this.registry){let Se=io(O,R);for(let z of this.interfaces)z.kind in be&&z.props.push(Xr(Se,be[z.kind]));o!=="types"&&(C&&d.push(s.createPropertyAssignment(Se,s.createTrue())),c.push(s.createPropertyAssignment(Se,s.createArrayLiteralExpression(ne.map(z=>s.createStringLiteral(z))))))}for(let{id:O,props:R}of this.interfaces)this.program.push(no(O,p,R));if(o==="types")return;let l=s.createVariableStatement(K,B(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(d))),f=s.createVariableStatement(K,B(this.ids.endpointTagsConst,s.createObjectLiteralExpression(c))),m=at(this.ids.providerType,s.createFunctionTypeNode(so({M:this.ids.methodType,P:this.ids.pathType}),it({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Lt)}),ro(this.ids.responseInterface,Lt))),h=at(this.ids.implementationType,s.createFunctionTypeNode(void 0,it({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(Z.SyntaxKind.StringKeyword),params:Nt(Z.SyntaxKind.StringKeyword,Z.SyntaxKind.AnyKeyword)}),oo())),T=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,fe)]),x=Ut(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[T,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),A=Ut(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[T]),Z.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),P=to(this.ids.clientClass,Wr([st(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),Jr)]),[eo(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),Mt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,x,A]),!0))]);this.program.push(l,f,m,h,P);let b=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),ge=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(I.json))]),void 0,this.ids.undefinedValue)),k=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),$=s.createVariableStatement(void 0,B(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,fe)]),s.createObjectLiteralExpression([b,ge,k])])))),oe=s.createVariableStatement(void 0,B(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),he=s.createVariableStatement(void 0,B(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),fe)])))),[Ue,ct]=["json","text"].map(O=>s.createReturnStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.responseConst,O),void 0,void 0))),He=s.createIfStatement(s.createBinaryExpression(s.createTemplateExpression(Zt,[s.createTemplateSpan(this.ids.methodParameter,vt),s.createTemplateSpan(this.ids.pathParameter,fe)]),Z.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),s.createBlock([Ue])),j=s.createVariableStatement(K,B(this.ids.exampleImplementationConst,Mt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([oe,he,$,He,ct]),!0),s.createTypeReferenceNode(this.ids.implementationType))),G=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),xe=s.createVariableStatement(void 0,B(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(j,xe,G)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Dt(r,t)).join(`
|
|
22
|
-
`):void 0}print(t){let r=this.printUsage(t),o=r&&
|
|
21
|
+
`)};var wr=e=>{e.startupLogo!==!1&&console.log(zr());let t=e.errorHandler||ze,r=ar(e.logger)?e.logger:new Ee(e.logger);r.debug("Running","v20.14.1 (ESM)"),Pr(r);let o=Rr({rootLogger:r,config:e}),i={getChildLogger:Ar(r),errorHandler:t},a=Sr(i),p=br(i);return{...i,rootLogger:r,notFoundHandler:a,parserFailureHandler:p,loggingMiddleware:o}},ln=(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,loggingMiddleware:i}=wr(e);return Ot({app:e.app.use(i),routing:t,getChildLogger:o,config:e}),{notFoundHandler:n,logger:r}},mn=async(e,t)=>{let{rootLogger:r,getChildLogger:o,notFoundHandler:n,parserFailureHandler:i,loggingMiddleware:a}=wr(e),p=Rt().disable("x-powered-by").use(a);if(e.server.compression){let m=await me("compression");p.use(m(typeof e.server.compression=="object"?e.server.compression:void 0))}let d={json:[e.server.jsonParser||Rt.json()],raw:[e.server.rawParser||Rt.raw(),Or],upload:e.server.upload?await Tr({config:e,getChildLogger:o}):[]};e.server.beforeRouting&&await e.server.beforeRouting({app:p,logger:r,getChildLogger:o}),Ot({app:p,routing:t,getChildLogger:o,config:e,parsers:d}),p.use(i,n);let c=(m,h)=>m.listen(h,()=>r.info("Listening",h)),l=cn.createServer(p),f=e.https&&dn.createServer(e.https.options,p);return e.gracefulShutdown&&Cr({servers:[l].concat(f||[]),logger:r,options:e.gracefulShutdown===!0?{}:e.gracefulShutdown}),{app:p,logger:r,httpServer:c(l,e.server.listen),httpsServer:f&&c(f,e.https?.listen)}};import gs from"node:assert/strict";import{OpenApiBuilder as hs}from"openapi3-ts/oas31";import{pluck as xs}from"ramda";import te from"node:assert/strict";import{isReferenceObject as Pt,isSchemaObject as tt}from"openapi3-ts/oas31";import{concat as fn,type as Lr,filter as yn,fromPairs as ke,has as gn,isNil as hn,map as ue,mergeAll as xn,mergeDeepRight as bn,mergeDeepWith as Sn,objOf as Nr,omit as rt,pipe as kr,pluck as Tn,range as On,reject as Rn,toLower as An,union as Pn,when as Cn,xprod as ot,zip as In}from"ramda";import{z as S}from"zod";import{z as je}from"zod";var Xe=e=>!isNaN(e.getTime());var Le=Symbol("DateIn"),Er=()=>je.union([je.string().date(),je.string().datetime(),je.string().datetime({local:!0})]).transform(t=>new Date(t)).pipe(je.date().refine(Xe)).brand(Le);import{z as un}from"zod";var Ne=Symbol("DateOut"),Zr=()=>un.date().refine(Xe).transform(e=>e.toISOString()).brand(Ne);var X=(e,{onEach:t,rules:r,onMissing:o,ctx:n={}})=>{let i=r[e._def[g]?.brand]||r[e._def.typeName],p=i?i(e,{...n,next:c=>X(c,{ctx:n,onEach:t,rules:r,onMissing:o})}):o(e,n),d=t&&t(e,{prev:p,...n});return d?{...p,...d}:p};var vr=50,Mr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",zn={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Ur=/:([A-Za-z0-9_]+)/g,wn=e=>e.match(Ur)?.map(t=>t.slice(1))||[],Hr=e=>e.replace(Ur,t=>`{${t.slice(1)}}`),En=({_def:e},{next:t})=>({...t(e.innerType),default:e[g]?.defaultLabel||e.defaultValue()}),Zn=({_def:{innerType:e}},{next:t})=>t(e),vn=()=>({format:"any"}),jn=({},e)=>(te(!e.isResponse,new z({message:"Please use ez.upload() only for input.",...e})),{type:"string",format:"binary"}),Ln=e=>{let t=e.unwrap();return{type:"string",format:t instanceof S.ZodString?t._def.checks.find(r=>r.kind==="base64")?"byte":"file":"binary"}},Nn=({options:e},{next:t})=>({oneOf:e.map(t)}),kn=({options:e,discriminator:t},{next:r})=>({discriminator:{propertyName:t},oneOf:e.map(r)}),Mn=e=>{let[t,r]=e.filter(tt).filter(n=>n.type==="object"&&Object.keys(n).every(i=>["type","properties","required","examples"].includes(i)));te(t&&r,"Can not flatten objects");let o={type:"object"};return(t.properties||r.properties)&&(o.properties=Sn((n,i)=>Array.isArray(n)&&Array.isArray(i)?fn(n,i):n===i?i:te.fail("Can not flatten properties"),t.properties||{},r.properties||{})),(t.required||r.required)&&(o.required=Pn(t.required||[],r.required||[])),(t.examples||r.examples)&&(o.examples=_(t.examples||[],r.examples||[],([n,i])=>bn(n,i))),o},Un=({_def:{left:e,right:t}},{next:r})=>{let o=[e,t].map(r);try{return Mn(o)}catch{}return{allOf:o}},Hn=(e,{next:t})=>t(e.unwrap()),Dn=(e,{next:t})=>t(e.unwrap()),Fn=(e,{next:t})=>{let r=t(e.unwrap());return tt(r)&&(r.type=Fr(r)),r},Dr=e=>{let t=An(Lr(e));return typeof e=="bigint"?"integer":t==="number"||t==="string"||t==="boolean"||t==="object"||t==="null"||t==="array"?t:void 0},jr=e=>({type:Dr(Object.values(e.enum)[0]),enum:Object.values(e.enum)}),Kn=({value:e})=>({type:Dr(e),const:e}),Bn=(e,{isResponse:t,next:r})=>{let o=Object.keys(e.shape),n=p=>t&&Re(p)?p instanceof S.ZodOptional:p.isOptional(),i=o.filter(p=>!n(e.shape[p])),a={type:"object"};return o.length&&(a.properties=et(e,r)),i.length&&(a.required=i),a},qn=()=>({type:"null"}),$n=({},e)=>(te(!e.isResponse,new z({message:"Please use ez.dateOut() for output.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/.source,externalDocs:{url:Mr}}),Gn=({},e)=>(te(e.isResponse,new z({message:"Please use ez.dateIn() for input.",...e})),{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Mr}}),Vn=({},e)=>te.fail(new z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use ez.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})),_n=()=>({type:"boolean"}),Yn=()=>({type:"integer",format:"bigint"}),Qn=e=>e.every(t=>t instanceof S.ZodLiteral),Jn=({keySchema:e,valueSchema:t},{next:r})=>{if(e instanceof S.ZodEnum||e instanceof S.ZodNativeEnum){let o=Object.values(e.enum),n={type:"object"};return o.length&&(n.properties=et(S.object(ke(ot(o,[t]))),r),n.required=o),n}if(e instanceof S.ZodLiteral)return{type:"object",properties:et(S.object({[e.value]:t}),r),required:[e.value]};if(e instanceof S.ZodUnion&&Qn(e.options)){let o=ue(i=>`${i.value}`,e.options),n=ke(ot(o,[t]));return{type:"object",properties:et(S.object(n),r),required:o}}return{type:"object",additionalProperties:r(t)}},Wn=({_def:{minLength:e,maxLength:t},element:r},{next:o})=>{let n={type:"array",items:o(r)};return e&&(n.minItems=e.value),t&&(n.maxItems=t.value),n},Xn=({items:e,_def:{rest:t}},{next:r})=>({type:"array",prefixItems:e.map(r),items:t===null?{not:{}}:r(t)}),es=({isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:i,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:f}})=>{let m=f.find(R=>R.kind==="regex"),h=f.find(R=>R.kind==="datetime"),C=m?m.regex:h?h.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0,b={type:"string"},Z={"date-time":l,email:e,url:t,uuid:n,cuid:i,cuid2:a,ulid:p,ip:d,emoji:c};for(let R in Z)if(Z[R]){b.format=R;break}return r!==null&&(b.minLength=r),o!==null&&(b.maxLength=o),C&&(b.pattern=C.source),b},ts=({isInt:e,maxValue:t,minValue:r,_def:{checks:o}})=>{let n=o.find(f=>f.kind==="min"),i=r===null?e?Number.MIN_SAFE_INTEGER:-Number.MAX_VALUE:r,a=n?n.inclusive:!0,p=o.find(f=>f.kind==="max"),d=t===null?e?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:t,c=p?p.inclusive:!0,l={type:e?"integer":"number",format:e?"int64":"double"};return a?l.minimum=i:l.exclusiveMinimum=i,c?l.maximum=d:l.exclusiveMaximum=d,l},et=({shape:e},t)=>ue(t,e),rs=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return zn?.[t]},Fr=e=>{let t=typeof e.type=="string"?[e.type]:e.type||[];return t.includes("null")?t:t.concat("null")},os=(e,{isResponse:t,next:r})=>{let o=r(e.innerType()),{effect:n}=e._def;if(t&&n.type==="transform"&&tt(o)){let i=Be(e,rs(o));return i&&["number","string","boolean"].includes(i)?{type:i}:r(S.any())}if(!t&&n.type==="preprocess"&&tt(o)){let{type:i,...a}=o;return{...a,format:`${a.format||i} (preprocessed)`}}return o},ns=({_def:e},{isResponse:t,next:r})=>r(e[t?"out":"in"]),ss=(e,{next:t})=>t(e.unwrap()),is=({schema:e},{next:t,serializer:r,getRef:o,makeRef:n})=>{let i=r(e);return o(i)||(n(i,{}),n(i,t(e)))},as=(e,{next:t})=>t(e.unwrap().shape.raw),Kr=e=>e.length?ke(In(On(1,e.length+1).map(t=>`example${t}`),ue(Nr("value"),e))):void 0,Br=(e,t,r=[])=>kr(H,ue(Cn(o=>Lr(o)==="Object",rt(r))),Kr)({schema:e,variant:t?"parsed":"original",validate:!0}),ps=(e,t)=>kr(H,yn(gn(t)),Tn(t),Kr)({schema:e,variant:"original",validate:!0}),ee=e=>e instanceof S.ZodObject?e:e instanceof S.ZodBranded?ee(e.unwrap()):e instanceof S.ZodUnion||e instanceof S.ZodDiscriminatedUnion?e.options.map(t=>ee(t)).reduce((t,r)=>t.merge(r.partial()),S.object({})):e instanceof S.ZodEffects?ee(e._def.schema):e instanceof S.ZodPipeline?ee(e._def.in):ee(e._def.left).merge(ee(e._def.right)),qr=({path:e,method:t,schema:r,inputSources:o,serializer:n,getRef:i,makeRef:a,composition:p,brandHandling:d,description:c=`${t.toUpperCase()} ${e} Parameter`})=>{let{shape:l}=ee(r),f=wn(e),m=o.includes("query"),h=o.includes("params"),C=o.includes("headers"),b=x=>h&&f.includes(x),Z=x=>C&&mt(x);return Object.keys(l).map(x=>({name:x,location:b(x)?"path":Z(x)?"header":m?"query":void 0})).filter(x=>x.location!==void 0).map(({name:x,location:ge})=>{let k=X(l[x],{rules:{...d,...Ct},onEach:It,onMissing:zt,ctx:{isResponse:!1,serializer:n,getRef:i,makeRef:a,path:e,method:t}}),$=p==="components"?a(w(c,x),k):k;return{name:x,in:ge,required:!l[x].isOptional(),description:k.description||c,schema:$,examples:ps(r,x)}})},Ct={ZodString:es,ZodNumber:ts,ZodBigInt:Yn,ZodBoolean:_n,ZodNull:qn,ZodArray:Wn,ZodTuple:Xn,ZodRecord:Jn,ZodObject:Bn,ZodLiteral:Kn,ZodIntersection:Un,ZodUnion:Nn,ZodAny:vn,ZodDefault:En,ZodEnum:jr,ZodNativeEnum:jr,ZodEffects:os,ZodOptional:Hn,ZodNullable:Fn,ZodDiscriminatedUnion:kn,ZodBranded:ss,ZodDate:Vn,ZodCatch:Zn,ZodPipeline:ns,ZodLazy:is,ZodReadonly:Dn,[D]:Ln,[Ae]:jn,[Ne]:Gn,[Le]:$n,[Q]:as},It=(e,{isResponse:t,prev:r})=>{if(Pt(r))return{};let{description:o}=e,n=e instanceof S.ZodLazy,i=r.type!==void 0,a=t&&Re(e),p=!n&&i&&!a&&e.isNullable(),d=n?[]:H({schema:e,variant:t?"parsed":"original",validate:!0}),c={};return o&&(c.description=o),p&&(c.type=Fr(r)),d.length&&(c.examples=d.slice()),c},zt=(e,t)=>te.fail(new z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})),At=(e,t)=>{if(Pt(e))return e;let r={...e};return r.properties&&(r.properties=rt(t,r.properties)),r.examples&&(r.examples=r.examples.map(o=>rt(t,o))),r.required&&(r.required=r.required.filter(o=>!t.includes(o))),r.allOf&&(r.allOf=r.allOf.map(o=>At(o,t))),r.oneOf&&(r.oneOf=r.oneOf.map(o=>At(o,t))),r},$r=e=>Pt(e)?e:rt(["examples"],e),Gr=({method:e,path:t,schema:r,mimeTypes:o,variant:n,serializer:i,getRef:a,makeRef:p,composition:d,hasMultipleStatusCodes:c,statusCode:l,brandHandling:f,description:m=`${e.toUpperCase()} ${t} ${yt(n)} response ${c?l:""}`.trim()})=>{let h=$r(X(r,{rules:{...f,...Ct},onEach:It,onMissing:zt,ctx:{isResponse:!0,serializer:i,getRef:a,makeRef:p,path:t,method:e}})),C={schema:d==="components"?p(w(m),h):h,examples:Br(r,!0)};return{description:m,content:ke(ot(o,[C]))}},cs=()=>({type:"http",scheme:"basic"}),ds=({format:e})=>{let t={type:"http",scheme:"bearer"};return e&&(t.bearerFormat=e),t},ls=({name:e},t)=>{let r={type:"apiKey",in:"query",name:e};return t?.includes("body")&&(t?.includes("query")?(r["x-in-alternative"]="body",r.description=`${e} CAN also be supplied within the request body`):(r["x-in-actual"]="body",r.description=`${e} MUST be supplied within the request body instead of query`)),r},ms=({name:e})=>({type:"apiKey",in:"header",name:e}),us=({name:e})=>({type:"apiKey",in:"cookie",name:e}),fs=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),ys=({flows:e={}})=>({type:"oauth2",flows:ue(t=>({...t,scopes:t.scopes||{}}),Rn(hn,e))}),Vr=(e,t)=>{let r={basic:cs,bearer:ds,input:ls,header:ms,cookie:us,openid:fs,oauth2:ys};return _e(e,o=>r[o.type](o,t))},nt=e=>"or"in e?e.or.map(t=>"and"in t?xn(ue(({name:r,scopes:o})=>Nr(r,o),t.and)):{[t.name]:t.scopes}):"and"in e?nt(xt(e)):nt({or:[e]}),_r=({method:e,path:t,schema:r,mimeTypes:o,serializer:n,getRef:i,makeRef:a,composition:p,brandHandling:d,paramNames:c,description:l=`${e.toUpperCase()} ${t} Request body`})=>{let f=$r(At(X(r,{rules:{...d,...Ct},onEach:It,onMissing:zt,ctx:{isResponse:!1,serializer:n,getRef:i,makeRef:a,path:t,method:e}}),c)),m={schema:p==="components"?a(w(l),f):f,examples:Br(r,!1,c)};return{description:l,content:ke(ot(o,[m]))}},Yr=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}),wt=e=>e.length<=vr?e:e.slice(0,vr-1)+"\u2026";var Et=class extends hs{lastSecuritySchemaIds=new Map;lastOperationIdSuffixes=new Map;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){let n=o||w(r,t),i=this.lastOperationIdSuffixes.get(n);return i===void 0?(this.lastOperationIdSuffixes.set(n,1),n):(o&&gs.fail(new z({message:`Duplicated operationId: "${o}"`,method:r,isResponse:!1,path:t})),i++,this.lastOperationIdSuffixes.set(n,i),`${n}${i}`)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;let o=(this.lastSecuritySchemaIds.get(t.type)||0)+1;return this.lastSecuritySchemaIds.set(t.type,o),`${t.type.toUpperCase()}_${o}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:i,descriptions:a,brandHandling:p,hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Ke}){super(),this.addInfo({title:o,version:n});for(let m of typeof i=="string"?[i]:i)this.addServer({url:m});W({routing:t,onEndpoint:(m,h,C)=>{let b=C,Z={path:h,method:b,endpoint:m,composition:c,serializer:l,brandHandling:p,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[R,x]=["short","long"].map(m.getDescription.bind(m)),ge=R?wt(R):d&&x?wt(x):void 0,k=m.getTags(),$=r.inputSources?.[b]||dt[b],oe=this.ensureUniqOperationId(h,b,m.getOperationId(b)),he=qr({...Z,inputSources:$,schema:m.getSchema("input"),description:a?.requestParameter?.call(null,{method:b,path:h,operationId:oe})}),Ue={};for(let j of["positive","negative"]){let G=m.getResponses(j);for(let{mimeTypes:xe,schema:T,statusCodes:O}of G)for(let A of O)Ue[A]=Gr({...Z,variant:j,schema:T,mimeTypes:xe,statusCode:A,hasMultipleStatusCodes:G.length>1||O.length>1,description:a?.[`${j}Response`]?.call(null,{method:b,path:h,operationId:oe,statusCode:A})})}let ct=$.includes("body")?_r({...Z,paramNames:xs("name",he),schema:m.getSchema("input"),mimeTypes:m.getMimeTypes("input"),description:a?.requestBody?.call(null,{method:b,path:h,operationId:oe})}):void 0,He=nt(_e(Vr(m.getSecurity(),$),j=>{let G=this.ensureUniqSecuritySchemaName(j),xe=["oauth2","openIdConnect"].includes(j.type)?m.getScopes().slice():[];return this.addSecurityScheme(G,j),{name:G,scopes:xe}}));this.addPath(Hr(h),{[b]:{operationId:oe,summary:ge,description:x,tags:k.length>0?k:void 0,parameters:he.length>0?he:void 0,requestBody:ct,security:He.length>0?He:void 0,responses:Ue}})}}),this.rootDoc.tags=r.tags?Yr(r.tags):[]}};import{createRequest as bs,createResponse as Ss}from"node-mocks-http";var Ts=e=>bs({...e,headers:{"content-type":P.json,...e?.headers}}),Os=e=>Ss(e),Rs=e=>{let t={warn:[],error:[],info:[],debug:[]};return new Proxy(e||{},{get(r,o,n){return o==="_getLogs"?()=>t:o in le?(...i)=>t[o].push(i):Reflect.get(r,o,n)}})},As=({requestProps:e,responseOptions:t,configProps:r,loggerProps:o})=>{let n=Ts(e),i=Os({req:n,...t});i.req=t?.req||n,n.res=i;let a=Rs(o),p={cors:!1,logger:a,...r};return{requestMock:n,responseMock:i,loggerMock:a,configMock:p}},Ps=async({endpoint:e,...t})=>{let{requestMock:r,responseMock:o,loggerMock:n,configMock:i}=As(t);return await e.execute({request:r,response:o,config:i,logger:n}),{requestMock:r,responseMock:o,loggerMock:n}};import E from"typescript";import N from"typescript";import{chain as Qr,toPairs as Jr}from"ramda";var s=N.factory,K=[s.createModifier(N.SyntaxKind.ExportKeyword)],Cs=[s.createModifier(N.SyntaxKind.AsyncKeyword)],Is=[s.createModifier(N.SyntaxKind.PublicKeyword),s.createModifier(N.SyntaxKind.ReadonlyKeyword)],Wr=[s.createModifier(N.SyntaxKind.ProtectedKeyword),s.createModifier(N.SyntaxKind.ReadonlyKeyword)],Zt=s.createTemplateHead(""),fe=s.createTemplateTail(""),vt=s.createTemplateMiddle(" "),jt=e=>s.createTemplateLiteralType(Zt,e.map((t,r)=>s.createTemplateLiteralTypeSpan(s.createTypeReferenceNode(t),r===e.length-1?fe:vt))),Lt=jt(["M","P"]),st=(e,t,r)=>s.createParameterDeclaration(r,void 0,e,void 0,t,void 0),it=(e,t)=>Qr(([r,o])=>[st(s.createIdentifier(r),o,t)],Jr(e)),Nt=(e,t)=>s.createExpressionWithTypeArguments(s.createIdentifier("Record"),[typeof e=="number"?s.createKeywordTypeNode(e):s.createTypeReferenceNode(e),s.createKeywordTypeNode(t)]),Xr=e=>s.createConstructorDeclaration(void 0,e,s.createBlock([])),eo=(e,t)=>s.createPropertySignature(void 0,e,void 0,s.createTypeReferenceNode(t)),B=(e,t,r)=>s.createVariableDeclarationList([s.createVariableDeclaration(e,void 0,r,t)],N.NodeFlags.Const),kt=(e,t)=>s.createTypeAliasDeclaration(K,e,void 0,s.createUnionTypeNode(t.map(r=>s.createLiteralTypeNode(s.createStringLiteral(r))))),at=(e,t)=>s.createTypeAliasDeclaration(K,e,void 0,t),to=(e,t,r)=>s.createPropertyDeclaration(Is,e,void 0,t,r),ro=(e,t,r)=>s.createClassDeclaration(K,e,void 0,void 0,[t,...r]),oo=(e,t)=>s.createTypeReferenceNode("Promise",[s.createIndexedAccessTypeNode(s.createTypeReferenceNode(e),t)]),no=()=>s.createTypeReferenceNode("Promise",[s.createKeywordTypeNode(N.SyntaxKind.AnyKeyword)]),so=(e,t,r)=>s.createInterfaceDeclaration(K,e,void 0,t,r),zs=Qr(([e,t])=>[s.createTypeParameterDeclaration([],e,s.createTypeReferenceNode(t))]),io=e=>zs(Jr(e)),Mt=(e,t,r)=>s.createArrowFunction(r?Cs:void 0,void 0,e.map(o=>st(o)),void 0,void 0,t),Ut=(e,t,r)=>s.createCallExpression(s.createPropertyAccessExpression(s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("Object"),"keys"),void 0,[e]),"reduce"),void 0,[s.createArrowFunction(void 0,void 0,it({acc:void 0,key:void 0}),void 0,void 0,t),r]),ao=(...e)=>`"${e.join(" ")}"`;var po=["get","post","put","delete","patch"];import y from"typescript";import{z as Ft}from"zod";import q from"typescript";var{factory:pt}=q,Ht=(e,t)=>{q.addSyntheticLeadingComment(e,q.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ye=(e,t,r)=>{let o=pt.createTypeAliasDeclaration(void 0,pt.createIdentifier(t),void 0,e);return r&&Ht(o,r),o},Dt=(e,t)=>{let r=q.createSourceFile("print.ts","",q.ScriptTarget.Latest,!1,q.ScriptKind.TS);return q.createPrinter(t).printNode(q.EmitHint.Unspecified,e,r)},ws=/^[A-Za-z_$][A-Za-z0-9_$]*$/,co=e=>ws.test(e)?pt.createIdentifier(e):pt.createStringLiteral(e);var{factory:u}=y,Es={[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},Zs=({value:e})=>u.createLiteralTypeNode(typeof e=="number"?u.createNumericLiteral(e):typeof e=="boolean"?e?u.createTrue():u.createFalse():u.createStringLiteral(e)),vs=({shape:e},{isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([i,a])=>{let p=t&&Re(a)?a instanceof Ft.ZodOptional:a.isOptional(),d=u.createPropertySignature(void 0,co(i),p&&o?u.createToken(y.SyntaxKind.QuestionToken):void 0,r(a));return a.description&&Ht(d,a.description),d});return u.createTypeLiteralNode(n)},js=({element:e},{next:t})=>u.createArrayTypeNode(t(e)),Ls=({options:e})=>u.createUnionTypeNode(e.map(t=>u.createLiteralTypeNode(u.createStringLiteral(t)))),lo=({options:e},{next:t})=>u.createUnionTypeNode(e.map(t)),Ns=e=>Es?.[e.kind],ks=(e,{next:t,isResponse:r})=>{let o=t(e.innerType());if(r&&e._def.effect.type==="transform"){let n=Be(e,Ns(o)),i={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(n&&i[n]||y.SyntaxKind.AnyKeyword)}return o},Ms=e=>u.createUnionTypeNode(Object.values(e.enum).map(t=>u.createLiteralTypeNode(typeof t=="number"?u.createNumericLiteral(t):u.createStringLiteral(t)))),Us=(e,{next:t,optionalPropStyle:{withUndefined:r}})=>{let o=t(e.unwrap());return r?u.createUnionTypeNode([o,u.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]):o},Hs=(e,{next:t})=>u.createUnionTypeNode([t(e.unwrap()),u.createLiteralTypeNode(u.createNull())]),Ds=({items:e,_def:{rest:t}},{next:r})=>u.createTupleTypeNode(e.map(r).concat(t===null?[]:u.createRestTypeNode(r(t)))),Fs=({keySchema:e,valueSchema:t},{next:r})=>u.createExpressionWithTypeArguments(u.createIdentifier("Record"),[e,t].map(r)),Ks=({_def:e},{next:t})=>u.createIntersectionTypeNode([e.left,e.right].map(t)),Bs=({_def:e},{next:t})=>t(e.innerType),re=e=>()=>u.createKeywordTypeNode(e),qs=(e,{next:t})=>t(e.unwrap()),$s=(e,{next:t})=>t(e.unwrap()),Gs=({_def:e},{next:t})=>t(e.innerType),Vs=({_def:e},{next:t,isResponse:r})=>t(e[r?"out":"in"]),_s=()=>u.createLiteralTypeNode(u.createNull()),Ys=({schema:e},{getAlias:t,makeAlias:r,next:o,serializer:n})=>{let i=`Type${n(e)}`;return t(i)||(r(i,u.createLiteralTypeNode(u.createNull())),r(i,o(e)))},Qs=e=>{let t=e.unwrap(),r=u.createKeywordTypeNode(y.SyntaxKind.StringKeyword),o=u.createTypeReferenceNode("Buffer"),n=u.createUnionTypeNode([r,o]);return t instanceof Ft.ZodString?r:t instanceof Ft.ZodUnion?n:o},Js=(e,{next:t})=>t(e.unwrap().shape.raw),Ws={ZodString:re(y.SyntaxKind.StringKeyword),ZodNumber:re(y.SyntaxKind.NumberKeyword),ZodBigInt:re(y.SyntaxKind.BigIntKeyword),ZodBoolean:re(y.SyntaxKind.BooleanKeyword),ZodAny:re(y.SyntaxKind.AnyKeyword),[Le]:re(y.SyntaxKind.StringKeyword),[Ne]:re(y.SyntaxKind.StringKeyword),ZodNull:_s,ZodArray:js,ZodTuple:Ds,ZodRecord:Fs,ZodObject:vs,ZodLiteral:Zs,ZodIntersection:Ks,ZodUnion:lo,ZodDefault:Bs,ZodEnum:Ls,ZodNativeEnum:Ms,ZodEffects:ks,ZodOptional:Us,ZodNullable:Hs,ZodDiscriminatedUnion:lo,ZodBranded:qs,ZodCatch:Gs,ZodPipeline:Vs,ZodLazy:Ys,ZodReadonly:$s,[D]:Qs,[Q]:Js},Me=(e,{brandHandling:t,ctx:r})=>X(e,{rules:{...t,...Ws},onMissing:()=>u.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),ctx:r});var Kt=class{program=[];usage=[];registry=new Map;paths=[];aliases=new Map;ids={pathType:s.createIdentifier("Path"),methodType:s.createIdentifier("Method"),methodPathType:s.createIdentifier("MethodPath"),inputInterface:s.createIdentifier("Input"),posResponseInterface:s.createIdentifier("PositiveResponse"),negResponseInterface:s.createIdentifier("NegativeResponse"),responseInterface:s.createIdentifier("Response"),jsonEndpointsConst:s.createIdentifier("jsonEndpoints"),endpointTagsConst:s.createIdentifier("endpointTags"),providerType:s.createIdentifier("Provider"),implementationType:s.createIdentifier("Implementation"),clientClass:s.createIdentifier("ExpressZodAPIClient"),keyParameter:s.createIdentifier("key"),pathParameter:s.createIdentifier("path"),paramsArgument:s.createIdentifier("params"),methodParameter:s.createIdentifier("method"),accumulator:s.createIdentifier("acc"),provideMethod:s.createIdentifier("provide"),implementationArgument:s.createIdentifier("implementation"),headersProperty:s.createIdentifier("headers"),hasBodyConst:s.createIdentifier("hasBody"),undefinedValue:s.createIdentifier("undefined"),bodyProperty:s.createIdentifier("body"),responseConst:s.createIdentifier("response"),searchParamsConst:s.createIdentifier("searchParams"),exampleImplementationConst:s.createIdentifier("exampleImplementation"),clientConst:s.createIdentifier("client")};interfaces=[];getAlias(t){return this.aliases.has(t)?s.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases.set(t,ye(r,t)),this.getAlias(t)}constructor({routing:t,brandHandling:r,variant:o="client",serializer:n=Ke,splitResponse:i=!1,optionalPropStyle:a={withQuestionMark:!0,withUndefined:!0}}){W({routing:t,onEndpoint:(T,O,A)=>{let ne={serializer:n,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:a},be=w(A,O,"input"),Se=Me(T.getSchema("input"),{brandHandling:r,ctx:{...ne,isResponse:!1}}),I=i?w(A,O,"positive.response"):void 0,Bt=T.getSchema("positive"),qt=i?Me(Bt,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Te=i?w(A,O,"negative.response"):void 0,$t=T.getSchema("negative"),Gt=i?Me($t,{brandHandling:r,ctx:{...ne,isResponse:!0}}):void 0,Vt=w(A,O,"response"),mo=I&&Te?s.createUnionTypeNode([s.createTypeReferenceNode(I),s.createTypeReferenceNode(Te)]):Me(Bt.or($t),{brandHandling:r,ctx:{...ne,isResponse:!0}});this.program.push(ye(Se,be)),qt&&I&&this.program.push(ye(qt,I)),Gt&&Te&&this.program.push(ye(Gt,Te)),this.program.push(ye(mo,Vt)),A!=="options"&&(this.paths.push(O),this.registry.set({method:A,path:O},{input:be,positive:I,negative:Te,response:Vt,isJson:T.getMimeTypes("positive").includes(P.json),tags:T.getTags()}))}}),this.program.unshift(...this.aliases.values()),this.program.push(kt(this.ids.pathType,this.paths)),this.program.push(kt(this.ids.methodType,po)),this.program.push(at(this.ids.methodPathType,jt([this.ids.methodType,this.ids.pathType])));let p=[s.createHeritageClause(E.SyntaxKind.ExtendsKeyword,[Nt(this.ids.methodPathType,E.SyntaxKind.AnyKeyword)])];this.interfaces.push({id:this.ids.inputInterface,kind:"input",props:[]}),i&&this.interfaces.push({id:this.ids.posResponseInterface,kind:"positive",props:[]},{id:this.ids.negResponseInterface,kind:"negative",props:[]}),this.interfaces.push({id:this.ids.responseInterface,kind:"response",props:[]});let d=[],c=[];for(let[{method:T,path:O},{isJson:A,tags:ne,...be}]of this.registry){let Se=ao(T,O);for(let I of this.interfaces)I.kind in be&&I.props.push(eo(Se,be[I.kind]));o!=="types"&&(A&&d.push(s.createPropertyAssignment(Se,s.createTrue())),c.push(s.createPropertyAssignment(Se,s.createArrayLiteralExpression(ne.map(I=>s.createStringLiteral(I))))))}for(let{id:T,props:O}of this.interfaces)this.program.push(so(T,p,O));if(o==="types")return;let l=s.createVariableStatement(K,B(this.ids.jsonEndpointsConst,s.createObjectLiteralExpression(d))),f=s.createVariableStatement(K,B(this.ids.endpointTagsConst,s.createObjectLiteralExpression(c))),m=at(this.ids.providerType,s.createFunctionTypeNode(io({M:this.ids.methodType,P:this.ids.pathType}),it({method:s.createTypeReferenceNode("M"),path:s.createTypeReferenceNode("P"),params:s.createIndexedAccessTypeNode(s.createTypeReferenceNode(this.ids.inputInterface),Lt)}),oo(this.ids.responseInterface,Lt))),h=at(this.ids.implementationType,s.createFunctionTypeNode(void 0,it({method:s.createTypeReferenceNode(this.ids.methodType),path:s.createKeywordTypeNode(E.SyntaxKind.StringKeyword),params:Nt(E.SyntaxKind.StringKeyword,E.SyntaxKind.AnyKeyword)}),no())),C=s.createTemplateExpression(s.createTemplateHead(":"),[s.createTemplateSpan(this.ids.keyParameter,fe)]),b=Ut(this.ids.paramsArgument,s.createCallExpression(s.createPropertyAccessExpression(this.ids.accumulator,"replace"),void 0,[C,s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter)]),this.ids.pathParameter),Z=Ut(this.ids.paramsArgument,s.createConditionalExpression(s.createBinaryExpression(s.createCallExpression(s.createPropertyAccessExpression(this.ids.pathParameter,"indexOf"),void 0,[C]),E.SyntaxKind.GreaterThanEqualsToken,s.createNumericLiteral(0)),void 0,this.ids.accumulator,void 0,s.createObjectLiteralExpression([s.createSpreadAssignment(this.ids.accumulator),s.createPropertyAssignment(s.createComputedPropertyName(this.ids.keyParameter),s.createElementAccessExpression(this.ids.paramsArgument,this.ids.keyParameter))])),s.createObjectLiteralExpression()),R=ro(this.ids.clientClass,Xr([st(this.ids.implementationArgument,s.createTypeReferenceNode(this.ids.implementationType),Wr)]),[to(this.ids.provideMethod,s.createTypeReferenceNode(this.ids.providerType),Mt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createCallExpression(s.createPropertyAccessExpression(s.createThis(),this.ids.implementationArgument),void 0,[this.ids.methodParameter,b,Z]),!0))]);this.program.push(l,f,m,h,R);let x=s.createPropertyAssignment(this.ids.methodParameter,s.createCallExpression(s.createPropertyAccessExpression(this.ids.methodParameter,"toUpperCase"),void 0,void 0)),ge=s.createPropertyAssignment(this.ids.headersProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createObjectLiteralExpression([s.createPropertyAssignment(s.createStringLiteral("Content-Type"),s.createStringLiteral(P.json))]),void 0,this.ids.undefinedValue)),k=s.createPropertyAssignment(this.ids.bodyProperty,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createCallExpression(s.createPropertyAccessExpression(s.createIdentifier("JSON"),"stringify"),void 0,[this.ids.paramsArgument]),void 0,this.ids.undefinedValue)),$=s.createVariableStatement(void 0,B(this.ids.responseConst,s.createAwaitExpression(s.createCallExpression(s.createIdentifier("fetch"),void 0,[s.createTemplateExpression(s.createTemplateHead("https://example.com"),[s.createTemplateSpan(this.ids.pathParameter,s.createTemplateMiddle("")),s.createTemplateSpan(this.ids.searchParamsConst,fe)]),s.createObjectLiteralExpression([x,ge,k])])))),oe=s.createVariableStatement(void 0,B(this.ids.hasBodyConst,s.createLogicalNot(s.createCallExpression(s.createPropertyAccessExpression(s.createArrayLiteralExpression([s.createStringLiteral("get"),s.createStringLiteral("delete")]),"includes"),void 0,[this.ids.methodParameter])))),he=s.createVariableStatement(void 0,B(this.ids.searchParamsConst,s.createConditionalExpression(this.ids.hasBodyConst,void 0,s.createStringLiteral(""),void 0,s.createTemplateExpression(s.createTemplateHead("?"),[s.createTemplateSpan(s.createNewExpression(s.createIdentifier("URLSearchParams"),void 0,[this.ids.paramsArgument]),fe)])))),[Ue,ct]=["json","text"].map(T=>s.createReturnStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.responseConst,T),void 0,void 0))),He=s.createIfStatement(s.createBinaryExpression(s.createTemplateExpression(Zt,[s.createTemplateSpan(this.ids.methodParameter,vt),s.createTemplateSpan(this.ids.pathParameter,fe)]),E.SyntaxKind.InKeyword,this.ids.jsonEndpointsConst),s.createBlock([Ue])),j=s.createVariableStatement(K,B(this.ids.exampleImplementationConst,Mt([this.ids.methodParameter,this.ids.pathParameter,this.ids.paramsArgument],s.createBlock([oe,he,$,He,ct]),!0),s.createTypeReferenceNode(this.ids.implementationType))),G=s.createExpressionStatement(s.createCallExpression(s.createPropertyAccessExpression(this.ids.clientConst,this.ids.provideMethod),void 0,[s.createStringLiteral("get"),s.createStringLiteral("/v1/user/retrieve"),s.createObjectLiteralExpression([s.createPropertyAssignment("id",s.createStringLiteral("10"))])])),xe=s.createVariableStatement(void 0,B(this.ids.clientConst,s.createNewExpression(this.ids.clientClass,void 0,[this.ids.exampleImplementationConst])));this.usage.push(j,xe,G)}printUsage(t){return this.usage.length?this.usage.map(r=>typeof r=="string"?r:Dt(r,t)).join(`
|
|
22
|
+
`):void 0}print(t){let r=this.printUsage(t),o=r&&E.addSyntheticLeadingComment(E.addSyntheticLeadingComment(s.createEmptyStatement(),E.SyntaxKind.SingleLineCommentTrivia," Usage example:"),E.SyntaxKind.MultiLineCommentTrivia,`
|
|
23
23
|
${r}`);return this.program.concat(o||[]).map((n,i)=>Dt(n,i<this.program.length?t:{...t,omitTrailingSemicolon:!0})).join(`
|
|
24
24
|
|
|
25
|
-
`)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await me("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let n=this.printUsage(t);this.usage=n&&o?[await o(n)]:this.usage;let i=this.print(t);return o?o(i):i}};var
|
|
25
|
+
`)}async printFormatted({printerOptions:t,format:r}={}){let o=r;if(!o)try{let a=(await me("prettier")).format;o=p=>a(p,{filepath:"client.ts"})}catch{}let n=this.printUsage(t);this.usage=n&&o?[await o(n)]:this.usage;let i=this.print(t);return o?o(i):i}};var Xs={dateIn:Er,dateOut:Zr,file:Ge,upload:Wt,raw:Jt};export{Ee as BuiltinLogger,Ze as DependsOnMethod,Et as Documentation,z as DocumentationError,we as EndpointsFactory,L as InputValidationError,Kt as Integration,F as Middleware,Oe as MissingPeerError,V as OutputValidationError,Ie as ResultHandler,se as RoutingError,ve as ServeStatic,Bo as arrayEndpointsFactory,Tt as arrayResultHandler,ln as attachRouting,vo as createConfig,mn as createServer,Ko as defaultEndpointsFactory,ze as defaultResultHandler,Xs as ez,H as getExamples,U as getMessageFromError,Fe as getStatusCodeFromError,Ps as testEndpoint};
|
package/migration/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var p=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var y=(s,t)=>{for(var e in t)p(s,e,{get:t[e],enumerable:!0})},g=(s,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of m(t))!u.call(s,i)&&i!==e&&p(s,i,{get:()=>t[i],enumerable:!(r=d(t,i))||r.enumerable});return s};var f=s=>g(p({},"__esModule",{value:!0}),s);var w={};y(w,{default:()=>k});module.exports=f(w);var c=require("@typescript-eslint/utils");var l="express-zod-api";var h="testEndpoint",n={createLogger:"BuiltinLogger",createResultHandler:"ResultHandler",createMiddleware:"Middleware"},o={getPositiveResponse:"positive",getNegativeResponse:"negative",responseProps:"responseOptions",middleware:"handler"},b={fnMethod:null},a=(s,t)=>typeof s=="string"&&s in t,v=c.ESLintUtils.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",remove:"Remove {{subject}} {{name}}."}},defaultOptions:[],create:s=>({ImportDeclaration:t=>{if(t.source.value===l){for(let e of t.specifiers)if(e.type==="ImportSpecifier"&&a(e.imported.name,n)){let r=n[e.imported.name];s.report({node:e.imported,messageId:"change",data:{subject:"import",from:e.imported.name,to:r},fix:i=>i.replaceText(e,r)})}}},CallExpression:t=>{if(t.callee.type==="Identifier"&&a(t.callee.name,n)){let e=`new ${n[t.callee.name]}`;s.report({node:t.callee,messageId:"change",data:{subject:"call",from:t.callee.name,to:e},fix:r=>r.replaceText(t.callee,e)})}if(t.callee.type==="Identifier"&&t.callee.name===h&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"){if(a(e.key.name,o)){let r=o[e.key.name];s.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:r},fix:i=>i.replaceText(e.key,r)})}a(e.key.name,b)&&s.report({node:e,messageId:"remove",data:{subject:"property",name:e.key.name},fix:r=>s.sourceCode.getTokenAfter(e)?.value===","&&e.range?r.removeRange([e.range[0],e.range[1]+1]):r.remove(e)})}}},NewExpression:t=>{if(t.callee.type==="Identifier"&&[n.createResultHandler,n.createMiddleware].includes(t.callee.name)&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"&&a(e.key.name,o)){let r=o[e.key.name];s.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:r},fix:i=>i.replaceText(e.key,r)})}}},Identifier:t=>{t.name==="MockOverrides"&&t.parent.type==="TSInterfaceDeclaration"&&s.report({node:t,messageId:"remove",data:{subject:"augmentation",name:t.name},fix:e=>e.remove(t.parent)})}})}),k={rules:{v20:v}};
|
package/migration/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ESLintUtils as c}from"@typescript-eslint/utils";var
|
|
1
|
+
import{ESLintUtils as c}from"@typescript-eslint/utils";var p="express-zod-api";var d="testEndpoint",i={createLogger:"BuiltinLogger",createResultHandler:"ResultHandler",createMiddleware:"Middleware"},o={getPositiveResponse:"positive",getNegativeResponse:"negative",responseProps:"responseOptions",middleware:"handler"},m={fnMethod:null},a=(r,t)=>typeof r=="string"&&r in t,u=c.RuleCreator.withoutDocs({meta:{type:"problem",fixable:"code",schema:[],messages:{change:"Change {{subject}} {{from}} to {{to}}.",remove:"Remove {{subject}} {{name}}."}},defaultOptions:[],create:r=>({ImportDeclaration:t=>{if(t.source.value===p){for(let e of t.specifiers)if(e.type==="ImportSpecifier"&&a(e.imported.name,i)){let s=i[e.imported.name];r.report({node:e.imported,messageId:"change",data:{subject:"import",from:e.imported.name,to:s},fix:n=>n.replaceText(e,s)})}}},CallExpression:t=>{if(t.callee.type==="Identifier"&&a(t.callee.name,i)){let e=`new ${i[t.callee.name]}`;r.report({node:t.callee,messageId:"change",data:{subject:"call",from:t.callee.name,to:e},fix:s=>s.replaceText(t.callee,e)})}if(t.callee.type==="Identifier"&&t.callee.name===d&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"){if(a(e.key.name,o)){let s=o[e.key.name];r.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:s},fix:n=>n.replaceText(e.key,s)})}a(e.key.name,m)&&r.report({node:e,messageId:"remove",data:{subject:"property",name:e.key.name},fix:s=>r.sourceCode.getTokenAfter(e)?.value===","&&e.range?s.removeRange([e.range[0],e.range[1]+1]):s.remove(e)})}}},NewExpression:t=>{if(t.callee.type==="Identifier"&&[i.createResultHandler,i.createMiddleware].includes(t.callee.name)&&t.arguments.length===1&&t.arguments[0].type==="ObjectExpression"){for(let e of t.arguments[0].properties)if(e.type==="Property"&&e.key.type==="Identifier"&&a(e.key.name,o)){let s=o[e.key.name];r.report({node:e,messageId:"change",data:{subject:"property",from:e.key.name,to:s},fix:n=>n.replaceText(e.key,s)})}}},Identifier:t=>{t.name==="MockOverrides"&&t.parent.type==="TSInterfaceDeclaration"&&r.report({node:t,messageId:"remove",data:{subject:"augmentation",name:t.name},fix:e=>e.remove(t.parent)})}})}),x={rules:{v20:u}};export{x as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "express-zod-api",
|
|
3
|
-
"version": "20.
|
|
3
|
+
"version": "20.14.1",
|
|
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": {
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
"url": "https://github.com/RobinTail/express-zod-api/issues"
|
|
18
18
|
},
|
|
19
19
|
"scripts": {
|
|
20
|
-
"postinstall": "npx patch-package",
|
|
21
20
|
"start": "tsx example/index.ts",
|
|
22
21
|
"build": "yarn build:compile && yarn build:tests && yarn build:assets",
|
|
23
22
|
"build:compile": "tsup && attw --pack",
|
|
@@ -79,13 +78,13 @@
|
|
|
79
78
|
},
|
|
80
79
|
"dependencies": {
|
|
81
80
|
"ansis": "^3.2.0",
|
|
82
|
-
"node-mocks-http": "^1.16.
|
|
81
|
+
"node-mocks-http": "^1.16.1",
|
|
83
82
|
"openapi3-ts": "^4.4.0",
|
|
84
83
|
"ramda": "^0.30.1"
|
|
85
84
|
},
|
|
86
85
|
"peerDependencies": {
|
|
87
86
|
"@types/compression": "^1.7.5",
|
|
88
|
-
"@types/express": "^4.17.13",
|
|
87
|
+
"@types/express": "^4.17.13 || ^5.0.0",
|
|
89
88
|
"@types/express-fileupload": "^1.5.0",
|
|
90
89
|
"@types/http-errors": "^2.0.2",
|
|
91
90
|
"compression": "^1.7.4",
|
|
@@ -123,7 +122,7 @@
|
|
|
123
122
|
"@types/cors": "^2.8.14",
|
|
124
123
|
"@types/depd": "^1.1.36",
|
|
125
124
|
"@types/eslint": "^9.6.0",
|
|
126
|
-
"@types/express": "^
|
|
125
|
+
"@types/express": "^5.0.0",
|
|
127
126
|
"@types/express-fileupload": "^1.5.0",
|
|
128
127
|
"@types/http-errors": "^2.0.2",
|
|
129
128
|
"@types/node": "^22.0.0",
|
|
@@ -131,7 +130,6 @@
|
|
|
131
130
|
"@types/ramda": "^0.30.0",
|
|
132
131
|
"@types/semver": "^7.5.8",
|
|
133
132
|
"@types/swagger-ui-express": "^4.1.6",
|
|
134
|
-
"@types/triple-beam": "^1.3.2",
|
|
135
133
|
"@typescript-eslint/rule-tester": "^8.0.1",
|
|
136
134
|
"@vitest/coverage-istanbul": "^2.0.3",
|
|
137
135
|
"camelize-ts": "^3.0.0",
|
|
@@ -141,7 +139,7 @@
|
|
|
141
139
|
"eslint-config-prettier": "^9.1.0",
|
|
142
140
|
"eslint-plugin-allowed-dependencies": "^1.0.0",
|
|
143
141
|
"eslint-plugin-prettier": "^5.1.3",
|
|
144
|
-
"eslint-plugin-unicorn": "^
|
|
142
|
+
"eslint-plugin-unicorn": "^56.0.0",
|
|
145
143
|
"express": "^5.0.0",
|
|
146
144
|
"express-fileupload": "^1.5.0",
|
|
147
145
|
"globals": "^15.3.0",
|