express-zod-api 11.6.0 → 11.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -0
- package/README.md +41 -16
- package/dist/esm/index.d.ts +19 -1
- package/dist/esm/index.js +10 -10
- package/dist/esm/package.json +1 -1
- package/dist/index.d.ts +19 -1
- package/dist/index.js +10 -10
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,52 @@
|
|
|
2
2
|
|
|
3
3
|
## Version 11
|
|
4
4
|
|
|
5
|
+
### v11.7.0
|
|
6
|
+
|
|
7
|
+
- Good news for array lovers and those struggling with migrating legacy APIs to use this library.
|
|
8
|
+
- New feature: `arrayResultHandler` (and corresponding `arrayEndpointsFactory`).
|
|
9
|
+
- Please avoid using them for new projects: responding with array is a bad practice keeping your endpoints from
|
|
10
|
+
evolving without breaking changes.
|
|
11
|
+
- This result handler expects your endpoint to have the property named `items` in its output schema.
|
|
12
|
+
- The `items` property should be the `ZodArray` schema.
|
|
13
|
+
- The value of that property is used as the response.
|
|
14
|
+
- Missing the `items` property will result in internal error (status code `500`).
|
|
15
|
+
- The negative response schema is `z.string()`, meaning that in case of error the response will be its plain message.
|
|
16
|
+
- The result handler also supports examples, as well as documentation and client generation.
|
|
17
|
+
- Check out the [example endpoint](/example/endpoints/list-users.ts) for details.
|
|
18
|
+
- This version also contains a corresponding fix:
|
|
19
|
+
- Fixed depicting the examples in case of `z.array()` and `z.string()` as response schemas in `ResultHandler`.
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
before:
|
|
23
|
+
examples:
|
|
24
|
+
arrayResponseExample:
|
|
25
|
+
value:
|
|
26
|
+
"0":
|
|
27
|
+
name: Hunter Schafer
|
|
28
|
+
"1":
|
|
29
|
+
name: Laverne Cox
|
|
30
|
+
"2":
|
|
31
|
+
name: Patti Harrison
|
|
32
|
+
stringResponseExample:
|
|
33
|
+
value:
|
|
34
|
+
"0": S
|
|
35
|
+
"1": a
|
|
36
|
+
"2": m
|
|
37
|
+
"3": p
|
|
38
|
+
"4": l
|
|
39
|
+
"5": e
|
|
40
|
+
after:
|
|
41
|
+
examples:
|
|
42
|
+
arrayResponseExample:
|
|
43
|
+
value:
|
|
44
|
+
- name: Hunter Schafer
|
|
45
|
+
- name: Laverne Cox
|
|
46
|
+
- name: Patti Harrison
|
|
47
|
+
stringResponseExample:
|
|
48
|
+
value: Sample
|
|
49
|
+
```
|
|
50
|
+
|
|
5
51
|
### v11.6.0
|
|
6
52
|
|
|
7
53
|
- The generated client is now equipped with the `endpointTags` constant that can be involved into your implementation.
|
package/README.md
CHANGED
|
@@ -35,20 +35,22 @@ Start your API server with I/O schema validation and custom middlewares in minut
|
|
|
35
35
|
7. [Route path params](#route-path-params)
|
|
36
36
|
8. [Response customization](#response-customization)
|
|
37
37
|
9. [Non-object response](#non-object-response) including file downloads
|
|
38
|
-
10. [
|
|
39
|
-
11. [
|
|
40
|
-
12. [
|
|
41
|
-
13. [
|
|
42
|
-
14. [
|
|
43
|
-
15. [
|
|
44
|
-
16. [
|
|
45
|
-
17. [
|
|
46
|
-
18. [Enabling
|
|
47
|
-
19. [
|
|
48
|
-
20. [
|
|
49
|
-
21. [
|
|
50
|
-
|
|
51
|
-
|
|
38
|
+
10. [Array response](#array-response) for migrating legacy APIs
|
|
39
|
+
11. [Using native express middlewares](#using-native-express-middlewares)
|
|
40
|
+
12. [File uploads](#file-uploads)
|
|
41
|
+
13. [Customizing logger](#customizing-logger)
|
|
42
|
+
14. [Connect to your own express app](#connect-to-your-own-express-app)
|
|
43
|
+
15. [Multiple schemas for one route](#multiple-schemas-for-one-route)
|
|
44
|
+
16. [Serving static files](#serving-static-files)
|
|
45
|
+
17. [Customizing input sources](#customizing-input-sources)
|
|
46
|
+
18. [Enabling compression](#enabling-compression)
|
|
47
|
+
19. [Enabling HTTPS](#enabling-https)
|
|
48
|
+
20. [Generating a Frontend Client](#generating-a-frontend-client)
|
|
49
|
+
21. [Creating a documentation](#creating-a-documentation)
|
|
50
|
+
22. [Tagging the endpoints](#tagging-the-endpoints)
|
|
51
|
+
23. [How to test endpoints](#how-to-test-endpoints)
|
|
52
|
+
5. [Caveats](#caveats)
|
|
53
|
+
1. [Coercive schema of Zod](#coercive-schema-of-zod)
|
|
52
54
|
2. [Excessive properties in endpoint output](#excessive-properties-in-endpoint-output)
|
|
53
55
|
6. [Your input to my output](#your-input-to-my-output)
|
|
54
56
|
|
|
@@ -581,6 +583,16 @@ const fileStreamingEndpointsFactory = new EndpointsFactory(
|
|
|
581
583
|
);
|
|
582
584
|
```
|
|
583
585
|
|
|
586
|
+
## Array response
|
|
587
|
+
|
|
588
|
+
Please avoid doing this in new projects: responding with array is a bad practice keeping your endpoints from evolving
|
|
589
|
+
in backward compatible way (without making breaking changes). Nevertheless, for the purpose of easier migration of
|
|
590
|
+
legacy APIs to this library consider using `arrayResultHandler` or `arrayEndpointsFactory` instead of default ones,
|
|
591
|
+
or implement your own ones in a similar way.
|
|
592
|
+
The `arrayResultHandler` expects your endpoint to have `items` property in the `output` object schema. The array
|
|
593
|
+
assigned to that property is used as the response. This approach also supports examples, as well as documentation and
|
|
594
|
+
client generation. Check out [the example endpoint](/example/endpoints/list-users.ts) for more details.
|
|
595
|
+
|
|
584
596
|
## Using native express middlewares
|
|
585
597
|
|
|
586
598
|
You can connect any native `express` middleware that can be supplied to `express` method `app.use()`.
|
|
@@ -918,8 +930,6 @@ const exampleEndpoint = taggedEndpointsFactory.build({
|
|
|
918
930
|
});
|
|
919
931
|
```
|
|
920
932
|
|
|
921
|
-
# Additional hints
|
|
922
|
-
|
|
923
933
|
## How to test endpoints
|
|
924
934
|
|
|
925
935
|
The way to test endpoints is to mock the request, response, and logger objects, invoke the `execute()` method, and
|
|
@@ -950,6 +960,21 @@ test("should respond successfully", async () => {
|
|
|
950
960
|
_This method is optimized for the `defaultResultHandler`. With the flexibility to customize, you can add additional
|
|
951
961
|
properties as needed._
|
|
952
962
|
|
|
963
|
+
# Caveats
|
|
964
|
+
|
|
965
|
+
There are some well-known issue and limitations, or third party bugs that cannot be fixed in the usual way, but you
|
|
966
|
+
should be aware of them.
|
|
967
|
+
|
|
968
|
+
## Coercive schema of Zod
|
|
969
|
+
|
|
970
|
+
Despite being supported by the library, `z.coerce.*` schema
|
|
971
|
+
[does not work intuitively](https://github.com/RobinTail/express-zod-api/issues/759).
|
|
972
|
+
Please be aware that `z.coerce.number()` and `z.number({ coerce: true })` (being typed not well) still will NOT allow
|
|
973
|
+
you to assign anything but number. Moreover, coercive schemas are not fail-safe and their methods `.isOptional()` and
|
|
974
|
+
`.isNullable()` [are buggy](https://github.com/colinhacks/zod/issues/1911). If possible, try to avoid using this type
|
|
975
|
+
of schemas. This issue [will NOT be fixed](https://github.com/colinhacks/zod/issues/1760#issuecomment-1407816838) in
|
|
976
|
+
Zod version 3.x.
|
|
977
|
+
|
|
953
978
|
## Excessive properties in endpoint output
|
|
954
979
|
|
|
955
980
|
The schema validator removes excessive properties by default. However, Typescript
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -415,6 +415,15 @@ declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
|
|
|
415
415
|
keyof: () => z.ZodEnum<never>;
|
|
416
416
|
} & any;
|
|
417
417
|
}>;
|
|
418
|
+
/**
|
|
419
|
+
* @deprecated Resist the urge of using it: this handler is designed only to simplify the migration of legacy APIs.
|
|
420
|
+
* @desc Responding with array is a bad practice keeping your endpoints from evolving without breaking changes.
|
|
421
|
+
* @desc This handler expects your endpoint to have the property 'items' in the output object schema
|
|
422
|
+
* */
|
|
423
|
+
declare const arrayResultHandler: ResultHandlerDefinition<any, z.ZodString & {
|
|
424
|
+
_def: z.ZodStringDef & MetaDef<z.ZodString>;
|
|
425
|
+
example: (example: string) => z.ZodString & any;
|
|
426
|
+
}>;
|
|
418
427
|
|
|
419
428
|
type Handler<IN, OUT, OPT> = (params: {
|
|
420
429
|
input: IN;
|
|
@@ -702,6 +711,15 @@ declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
|
|
|
702
711
|
keyof: () => z.ZodEnum<never>;
|
|
703
712
|
} & any;
|
|
704
713
|
}, null, {}, string, string>;
|
|
714
|
+
/**
|
|
715
|
+
* @deprecated Resist the urge of using it: this factory is designed only to simplify the migration of legacy APIs.
|
|
716
|
+
* @desc Responding with array is a bad practice keeping your endpoints from evolving without breaking changes.
|
|
717
|
+
* @desc The result handler of this factory expects your endpoint to have the property 'items' in the output schema
|
|
718
|
+
*/
|
|
719
|
+
declare const arrayEndpointsFactory: EndpointsFactory<any, z.ZodString & {
|
|
720
|
+
_def: z.ZodStringDef & MetaDef<z.ZodString>;
|
|
721
|
+
example: (example: string) => z.ZodString & any;
|
|
722
|
+
}, null, {}, string, string>;
|
|
705
723
|
|
|
706
724
|
declare function createLogger(loggerConfig: LoggerConfig): winston.Logger;
|
|
707
725
|
|
|
@@ -857,4 +875,4 @@ declare namespace proprietarySchemas {
|
|
|
857
875
|
};
|
|
858
876
|
}
|
|
859
877
|
|
|
860
|
-
export { AbstractEndpoint, DependsOnMethod, DependsOnMethodError, Documentation, DocumentationError, EndpointsFactory, FlatObject, IOSchema, InputValidationError, Integration, LoggerConfig, Method, OutputValidationError, Routing, RoutingError, ServeStatic, ZodDateInDef, ZodDateOutDef, ZodFileDef, ZodUploadDef, attachRouting, createConfig, createLogger, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
|
|
878
|
+
export { AbstractEndpoint, DependsOnMethod, DependsOnMethodError, Documentation, DocumentationError, EndpointsFactory, FlatObject, IOSchema, InputValidationError, Integration, LoggerConfig, Method, OutputValidationError, Routing, RoutingError, ServeStatic, ZodDateInDef, ZodDateOutDef, ZodFileDef, ZodUploadDef, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createLogger, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
|
package/dist/esm/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
var
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Original error: ${e.originalError.message}.`:""))};var
|
|
1
|
+
var Cr=Object.defineProperty;var Nr=(e,t)=>{for(var r in t)Cr(e,r,{get:t[r],enumerable:!0})};var Mr=(e,t,r)=>{if(!t.has(e))throw TypeError("Cannot "+r)};var z=(e,t,r)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,r)};var A=(e,t,r)=>(Mr(e,t,"access private method"),r);var Dt={silent:!0,warn:!0,debug:!0},wr=e=>e;import{z as K}from"zod";import{HttpError as Gr}from"http-errors";import{createHash as qr}from"crypto";import{z as O}from"zod";import{clone as Dr,mergeDeepRight as zr}from"ramda";var R="expressZodApiMeta",vr=e=>{let t=e.constructor,r=Dr(e._def);return r[R]=r[R]||{examples:[]},new t(r)},v=e=>{let t=vr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=v(t);return o._def[R].examples.push(r),o}}}),t},zt=e=>R in e._def?typeof e._def[R]=="object"&&e._def[R]!==null:!1;function vt(e,t){if(!zt(e))return;let r=e._def;return t in r[R]?r[R][t]:void 0}var Oe=(e,t)=>{if(!zt(e))return t;let r=v(t),o=pe(r._def[R].examples,e._def[R].examples);if(r._def[R].examples=[],o.type==="single")r._def[R].examples=o.value;else for(let[n,s]of o.value)r._def[R].examples.push(zr({...n},{...s}));return r};import jr from"mime";var G=jr.getType("json")||"application/json",ce="multipart/form-data";import{INVALID as Lr,OK as kr,ZodIssueCode as Ur,ZodParsedType as Hr,ZodType as Kr,addIssueToContext as Fr}from"zod";var $r="ZodUpload",_r=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",be=class be extends Kr{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==Hr.object||!_r(r.data)?(Fr(r,{code:Ur.custom,message:`Expected file upload, received ${r.parsedType}`}),Lr):kr(r.data)}};be.create=()=>new be({typeName:$r});var Q=be;var et=/:([A-Za-z0-9_]+)/g;function Vr(e){let r=(e.header("content-type")||"").slice(0,ce.length).toLowerCase()===ce;return"files"in e&&r}var Re={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Br=["body","query","params"],tt=e=>e.method.toLowerCase();function jt(e,t){let r=tt(e);if(r==="options")return{};let o=Br;return r in Re&&(o=Re[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Vr(e):!0).reduce((n,s)=>({...n,...e[s]}),{})}function rt(e){return typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(Dt).includes(e.level)&&typeof e.color=="boolean"}function Pe(e){return!isNaN(e.getTime())}function W(e){return e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`)}function L(e){return e instanceof O.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof q?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message}function Ze(e){return e instanceof Gr?e.statusCode:e instanceof U?400:500}var ot=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
|
|
2
|
+
${o.stack}
|
|
3
|
+
`,{url:t.url,payload:r})},k=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=vt(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},pe=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}};function nt(e){let t=e.match(et);return t?t.map(r=>r.slice(1)):[]}var le=e=>e.reduce((t,r)=>t||r,!1);function j(e){return e instanceof O.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof O.ZodUnion?le(e.options.map(j)):e instanceof O.ZodIntersection?le([e._def.left,e._def.right].map(j)):!1}function I(e){return e instanceof Q?!0:e instanceof O.ZodObject?le(Object.values(e.shape).map(I)):e instanceof O.ZodUnion?le(e.options.map(I)):e instanceof O.ZodIntersection?le([e._def.left,e._def.right].map(I)):e instanceof O.ZodOptional||e instanceof O.ZodNullable?I(e.unwrap()):e instanceof O.ZodEffects||e instanceof O.ZodTransformer?I(e._def.schema):e instanceof O.ZodRecord?I(e._def.valueType):e instanceof O.ZodArray?I(e._def.type):e instanceof O.ZodDefault?I(e._def.innerType):!1}var me=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,N=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Ee=e=>qr("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ae=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},st=e=>typeof e=="string"?{message:e}:e||{};var X=class extends Error{constructor(){super(...arguments);this.name="RoutingError"}},ue=class extends X{constructor(){super(...arguments);this.name="DependsOnMethodError"}},Z=class extends Error{constructor({message:r,method:o,path:n,isResponse:s}){let a=`${r}
|
|
4
|
+
Caused by ${s?"response":"input"} schema of an Endpoint assigned to ${o.toUpperCase()} method of ${n} path.`;super(a);this.name="DocumentationError"}},H=class extends Error{constructor(){super(...arguments);this.name="IOSchemaError"}},q=class extends H{constructor(r){super(L(r));this.name="OutputValidationError";this.originalError=r}},U=class extends H{constructor(r){super(L(r));this.name="InputValidationError";this.originalError=r}},ee=class extends Error{constructor(r,o){super(r);this.name="ResultHandlerError";this.originalError=o||void 0}};var M=e=>typeof e=="object"&&e!==null,Ie=e=>({and:e.reduce((t,r)=>t.concat(M(r)&&"and"in r?r.and:r),[])}),Ce=(e,t)=>{if(M(e)){if("and"in e)return{and:e.and.map(r=>M(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>M(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},it=e=>e.and.reduce((t,r)=>{let o=pe(t.or,M(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(Ie),t},{or:[]}),te=(e,t)=>{if(M(e)){if("and"in e){if(M(t)){if("and"in t)return Ie([e,t]);if("or"in t)return te(it(e),t)}return Ie([e,t])}if("or"in e){if(M(t)){if("and"in t)return te(t,e);if("or"in t){let r=pe(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(Ie)}}}return te(e,{and:[t]})}}return M(t)&&("and"in t||"or"in t)?te(t,e):{and:[e,t]}};import{z as C}from"zod";var re={positive:200,negative:400},at=e=>e,oe=at({getPositiveResponse:e=>{let t=k({schema:e}),r=v(C.object({status:C.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>v(C.object({status:C.literal("error"),error:C.object({message:C.string()})})).example({status:"error",error:{message:L(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(re.positive).json({status:"success",data:r});return}let a=Ze(e);ot({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:L(e)}})}}),dt=at({getPositiveResponse:e=>{let t=k({schema:e}),r=v("shape"in e&&"items"in e.shape&&e.shape.items instanceof C.ZodArray?e.shape.items:C.array(C.any()));return t.reduce((o,n)=>typeof n=="object"&&n!==null&&"items"in n?o.example(n.items):o,r)},getNegativeResponse:()=>v(C.string()).example(L(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Ze(r);ot({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).send(r.message);return}"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),Ne=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
|
|
5
|
+
Original error: ${e.originalError.message}.`:""))};var Lt=(e,t=[G])=>{if(e instanceof K.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},ne=class{},we,kt,De,Ut,ze,Ht,ve,Kt,je,Ft,Me=class extends ne{constructor({middlewares:r,inputSchema:o,outputSchema:n,handler:s,resultHandler:a,description:d,shortDescription:c,...p}){super();z(this,we);z(this,De);z(this,ze);z(this,ve);z(this,je);this.methods=[];this.siblingMethods=[];this.middlewares=[];this.scopes=[];this.tags=[];[{name:"input schema",schema:o},{name:"output schema",schema:n}].forEach(({name:f,schema:x})=>{if(j(x))throw new H(`Using transformations on the top level of endpoint ${f} is not allowed.`)}),this.middlewares=r;let l={positive:a.getPositiveResponse(n),negative:a.getNegativeResponse()};this.mimeTypes={input:I(o)?[ce]:[G],positive:Lt(l.positive),negative:Lt(l.negative)},this.schemas={input:o,output:n,positive:l.positive instanceof K.ZodType?l.positive:l.positive.schema,negative:l.negative instanceof K.ZodType?l.negative:l.negative.schema},this.statusCodes={positive:l.positive instanceof K.ZodType?re.positive:l.positive.statusCode||re.positive,negative:l.negative instanceof K.ZodType?re.negative:l.negative.statusCode||re.negative},this.handler=s,this.resultHandler=a,this.descriptions={long:d,short:c},"scopes"in p&&p.scopes&&this.scopes.push(...p.scopes),"scope"in p&&p.scope&&this.scopes.push(p.scope),"tags"in p&&p.tags&&this.tags.push(...p.tags),"tag"in p&&p.tag&&this.tags.push(p.tag),"methods"in p?this.methods=p.methods:this.methods=[p.method]}_setSiblingMethods(r){this.siblingMethods=r}getDescription(r){return this.descriptions[r]}getMethods(){return this.methods}getSchema(r){return this.schemas[r]}getMimeTypes(r){return this.mimeTypes[r]}getStatusCode(r){return this.statusCodes[r]}getSecurity(){return this.middlewares.reduce((r,o)=>o.security?te(r,o.security):r,{and:[]})}getScopes(){return this.scopes}getTags(){return this.tags}async execute({request:r,response:o,logger:n,config:s}){let a=tt(r),d,c=null;if(s.cors){let l=A(this,we,kt).call(this);typeof s.cors=="function"&&(l=await s.cors({request:r,logger:n,endpoint:this,defaultHeaders:l}));for(let f in l)o.set(f,l[f])}let p=jt(r,s.inputSources);try{let{options:l,isStreamClosed:f}=await A(this,ze,Ht).call(this,{method:a,input:p,request:r,response:o,logger:n});if(f)return;if(a==="options"){o.status(200).end();return}d=await A(this,De,Ut).call(this,await A(this,ve,Kt).call(this,{input:p,options:l,logger:n}))}catch(l){c=W(l)}await A(this,je,Ft).call(this,{input:p,output:d,request:r,response:o,error:c,logger:n})}};we=new WeakSet,kt=function(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.methods.concat(this.siblingMethods).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}},De=new WeakSet,Ut=async function(r){try{return await this.schemas.output.parseAsync(r)}catch(o){throw o instanceof K.ZodError?new q(o):o}},ze=new WeakSet,Ht=async function({method:r,input:o,request:n,response:s,logger:a}){let d={},c=!1;for(let p of this.middlewares){if(r==="options"&&p.type==="proprietary")continue;let l;try{l=await p.input.parseAsync(o)}catch(f){throw f instanceof K.ZodError?new U(f):f}if(Object.assign(d,await p.middleware({input:l,options:d,request:n,response:s,logger:a})),c="writableEnded"in s&&s.writableEnded,c){a.warn(`The middleware ${p.middleware.name} has closed the stream. Accumulated options:`,d);break}}return{options:d,isStreamClosed:c}},ve=new WeakSet,Kt=async function({input:r,options:o,logger:n}){let s;try{s=await this.schemas.input.parseAsync(r)}catch(a){throw a instanceof K.ZodError?new U(a):a}return this.handler({input:s,options:o,logger:n})},je=new WeakSet,Ft=async function({error:r,request:o,response:n,logger:s,input:a,output:d}){try{await this.resultHandler.handler({error:r,output:d,request:o,response:n,logger:s,input:a})}catch(c){Ne({logger:s,response:n,error:new ee(W(c).message,r)})}};var $t=["get","post","put","delete","patch"];import{z as Gt}from"zod";var _t=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Oe(s,n),o)};var pt=e=>{if(j(e.input))throw new H("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var se,Le,V=class V{constructor(t){this.middlewares=[];this.use=this.addExpressMiddleware;this.resultHandler="resultHandler"in t?t.resultHandler:t}addMiddleware(t){var r;return A(r=V,se,Le).call(r,this.middlewares.concat(t),this.resultHandler)}addExpressMiddleware(t,r){var a;let o=r?.transformer||(d=>d),n=r?.provider||(()=>({})),s={type:"express",input:Gt.object({}),middleware:async({request:d,response:c})=>new Promise((p,l)=>{t(d,c,x=>{if(x&&x instanceof Error)return l(o(x));p(n(d,c))})})};return A(a=V,se,Le).call(a,this.middlewares.concat(s),this.resultHandler)}addOptions(t){var r;return A(r=V,se,Le).call(r,this.middlewares.concat(pt({input:Gt.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new Me({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:_t(s,t),...n})}};se=new WeakSet,Le=function(t,r){let o=new V(r);return o.middlewares=t,o},z(V,se);var fe=V,Yr=new fe(oe),Jr=new fe(dt);import{inspect as Qr}from"util";import{LEVEL as Wr,MESSAGE as Xr,SPLAT as eo}from"triple-beam";import ke from"winston";var{combine:to,colorize:ro,timestamp:oo,printf:no}=ke.format;function Ue(e){let t=s=>{let{[Wr]:a,[Xr]:d,[eo]:c,...p}=s;return Qr(p,!1,1,e.color)},r=s=>no(({timestamp:a,message:d,level:c,durationMs:p,...l})=>(typeof d=="object"&&(l={...l,...d},d="[No message]"),`${a} ${c}: ${d}`+(p===void 0?"":` duration: ${p}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[oo()],n={handleExceptions:!0};switch(e.color&&o.push(ro()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=to(...o),ke.createLogger({silent:e.level==="silent",levels:ke.config.npm.levels,transports:[new ke.transports.Console(n)],exitOnError:!1})}var ye=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new ue(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
|
|
6
6
|
This error should prevent mistakes during the development process.
|
|
7
7
|
Example:
|
|
8
8
|
|
|
@@ -13,8 +13,8 @@ new ${this.constructor.name}({
|
|
|
13
13
|
...
|
|
14
14
|
})
|
|
15
15
|
});
|
|
16
|
-
`)})}};import
|
|
17
|
-
The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let d=`${o||""}${s?`/${s}`:""}`;if(a instanceof ne){let c=a.getMethods().slice();n&&c.push("options"),c.forEach(p=>{t(a,d,p)})}else if(a instanceof
|
|
16
|
+
`)})}};import so from"express";var ge=class{constructor(...t){this.params=t}apply(t,r){return r(t,so.static(...this.params))}};var B=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new X(`Routing elements should not contain '/' character.
|
|
17
|
+
The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let d=`${o||""}${s?`/${s}`:""}`;if(a instanceof ne){let c=a.getMethods().slice();n&&c.push("options"),c.forEach(p=>{t(a,d,p)})}else if(a instanceof ge)r&&a.apply(d,r);else if(a instanceof ye){if(Object.entries(a.methods).forEach(([c,p])=>{t(p,d,c)}),n&&Object.keys(a.methods).length>0){let[c,...p]=Object.keys(a.methods),l=a.methods[c];l._setSiblingMethods(p),t(l,d,"options")}}else B({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:d})})};var qt=()=>`
|
|
18
18
|
\x1B[94m\x1B[39m
|
|
19
19
|
\x1B[94m\x1B[39m
|
|
20
20
|
\x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
|
|
@@ -31,7 +31,7 @@ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let
|
|
|
31
31
|
\x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
|
|
32
32
|
\x1B[0m\x1B[0m
|
|
33
33
|
\x1B[0m\x1B[0m
|
|
34
|
-
`.trim();var at=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(_t()),V({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(d,c)=>{t.info(`${d.method}: ${s}`),await n.execute({request:d,response:c,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};import oo,{json as no}from"express";import so from"compression";import io from"express-fileupload";import ao from"https";import Gt from"http-errors";var po=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:Gt(400,Q(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Vt=(e,t)=>(r,o)=>{let n=Gt(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Ie({response:o,logger:t,error:new X(Q(s).message,n)})}};function co(e,t){let r=tt(e.logger)?ke(e.logger):e.logger;at({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||oe;return{notFoundHandler:Vt(o,r),logger:r}}function lo(e,t){let r=tt(e.logger)?ke(e.logger):e.logger,o=oo();o.disable("x-powered-by");let n=e.errorHandler||oe,s=e.server.compression?so({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||no(),d=e.server.upload?io({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,c=[].concat(s||[]).concat(a).concat(d||[]);o.use(c),o.use(po(n,r)),at({app:o,routing:t,logger:r,config:e}),o.use(Vt(n,r));let p=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=ao.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:p,httpsServer:l,logger:r}}import{OpenApiBuilder as Wo}from"openapi3-ts/oas30";import{isReferenceObject as Qt,isSchemaObject as xe}from"openapi3-ts/oas30";import{omit as he}from"ramda";import{z as T}from"zod";import{INVALID as qt,ZodIssueCode as dt,ZodParsedType as Bt,ZodType as mo,addIssueToContext as pt}from"zod";var ct=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,uo="ZodDateIn",He=class He extends mo{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==Bt.string)return pt(o,{code:dt.invalid_type,expected:Bt.string,received:o.parsedType}),qt;ct.test(o.data)||(pt(o,{code:dt.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Re(n)?{status:r.value,value:n}:(pt(o,{code:dt.invalid_date}),qt)}};He.create=()=>new He({typeName:uo});var Ue=He;var q=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,d=s?s({schema:e,...n,next:p=>q({...p,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),c=t&&t({schema:e,prev:d,...n});return c?{...d,...c}:d};var Yt=50,Wt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",fo={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Xt=e=>e.replace(Xe,t=>`{${t.slice(1)}}`),yo=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),go=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),ho=()=>({format:"any"}),xo=e=>{if(e.isResponse)throw new Z({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},To=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new Z({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},So=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Oo=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),bo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Ro=({schema:e,next:t})=>t({schema:e.unwrap()}),Po=({schema:e,next:t})=>t({schema:e._def.innerType}),Zo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Jt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),Eo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),Ao=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&me(s)?s instanceof T.ZodOptional:s.isOptional())});return{type:"object",properties:Ke({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},Io=()=>({type:"string",nullable:!0,format:"null"}),Co=e=>{if(e.isResponse)throw new Z({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:ct.source,externalDocs:{url:Wt}}},No=e=>{if(!e.isResponse)throw new Z({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Wt}}},Mo=e=>{throw new Z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},wo=()=>({type:"boolean"}),Do=()=>({type:"integer",format:"bigint"}),zo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof T.ZodEnum||e instanceof T.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ke({schema:T.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.ZodLiteral)return{type:"object",properties:Ke({schema:T.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof T.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ke({schema:T.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},vo=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),jo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${xe(o)?o.type:o.$ref}`).join(", ")}}}},Lo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:c,isEmoji:p,isDatetime:l,_def:{checks:f}}})=>{let x=f.find(h=>h.kind==="regex"),g=f.find(h=>h.kind==="datetime"),S=x?x.regex:g?g.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...d&&{format:"ulid"},...c&&{format:"ip"},...p&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...S&&{pattern:`/${S.source}/${S.flags}`}}},ko=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ke=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Uo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return fo?.[t]},Ho=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&xe(o)){let s=Ze({effect:n,sample:Uo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:T.any()})}if(!t&&n.type==="preprocess"&&xe(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Ko=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Fo=({schema:e,next:t})=>t({schema:e.unwrap()}),$o=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},er=(e,t,r=[])=>{let o=$({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:he(r,s)}}),{})}},_o=(e,t,r)=>{let o=$({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function ge(e,t){if(e instanceof T.ZodObject)return e;let r;if(e instanceof T.ZodUnion||e instanceof T.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>ge(o,t)).reduce((o,n)=>o.merge(n.partial()),T.object({}));else if(e instanceof T.ZodEffects){if(z(e))throw new Z({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=ge(e._def.schema,t)}else r=ge(e._def.left,t).merge(ge(e._def.right,t));return Se(e,r)}var tr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="parameter"})=>{let p=r.getSchema("input"),l=ge(p,{path:e,method:t,isResponse:!1}).shape,f=ot(e),x=o.includes("query"),g=o.includes("params"),S=h=>g&&f.includes(h);return Object.keys(l).filter(h=>x||S(h)).map(h=>{let b=q({schema:l[h],isResponse:!1,rules:mt,onEach:ut,onMissing:ft,serializer:n,getRef:s,makeRef:a,path:e,method:t}),y=d==="components"?a(C(e,t,`${c} ${h}`),b):b;return{name:h,in:S(h)?"path":"query",required:!l[h].isOptional(),description:xe(b)&&b.description||`${t.toUpperCase()} ${e} ${c}`,schema:y,..._o(p,!1,h)}})},mt={ZodString:Lo,ZodNumber:ko,ZodBigInt:Do,ZodBoolean:wo,ZodDateIn:Co,ZodDateOut:No,ZodNull:Io,ZodArray:vo,ZodTuple:jo,ZodRecord:zo,ZodObject:Ao,ZodLiteral:Eo,ZodIntersection:bo,ZodUnion:So,ZodFile:To,ZodUpload:xo,ZodAny:ho,ZodDefault:yo,ZodEnum:Jt,ZodNativeEnum:Jt,ZodEffects:Ho,ZodOptional:Ro,ZodNullable:Zo,ZodDiscriminatedUnion:Oo,ZodBranded:Fo,ZodDate:Mo,ZodCatch:go,ZodPipeline:Ko,ZodLazy:$o,ZodReadonly:Po},ut=({schema:e,isResponse:t,prev:r})=>{if(Qt(r))return{};let{description:o}=e,n=e instanceof T.ZodLazy,s=r.type!==void 0,a=t&&me(e),d=!n&&s&&!a&&e.isNullable(),c=n?[]:$({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...c.length>0&&{example:c[0]}}},ft=({schema:e,...t})=>{throw new Z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},lt=(e,t)=>{if(Qt(e))return e;let r=e.properties?he(t,e.properties):void 0,o=e.example?he(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>lt(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>lt(d,t)):void 0;return he(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},d])=>d===void 0).map(([d])=>d),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},rr=e=>xe(e)?he(["example"],e):e,yt=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="response"})=>{let p=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),f=rr(q({schema:p,isResponse:!0,rules:mt,onEach:ut,onMissing:ft,serializer:n,getRef:s,makeRef:a,path:t,method:e})),x=er(p,!0),g=d==="components"?a(C(t,e,c),f):f;return{description:`${e.toUpperCase()} ${t} ${c}`,content:l.reduce((S,h)=>({...S,[h]:{schema:g,...x}}),{})}},Go=()=>({type:"http",scheme:"basic"}),Vo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),qo=({name:e})=>({type:"apiKey",in:"query",name:e}),Bo=({name:e})=>({type:"apiKey",in:"header",name:e}),Yo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Jo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Qo=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),or=e=>{let t={basic:Go,bearer:Vo,input:qo,header:Bo,cookie:Yo,openid:Jo,oauth2:Qo};return Ae(e,r=>t[r.type](r))},Fe=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Fe(st(e))}return Fe({or:[e]})},nr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let c=ot(t),p=rr(lt(q({schema:r.getSchema("input"),isResponse:!1,rules:mt,onEach:ut,onMissing:ft,serializer:o,getRef:n,makeRef:s,path:t,method:e}),c)),l=er(r.getSchema("input"),!1,c),f=a==="components"?s(C(t,e,d),p):p;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((x,g)=>({...x,[g]:{schema:f,...l}}),{})}},sr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),gt=e=>e.length<=Yt?e:e.slice(0,Yt-1)+"\u2026";var ht=class extends Wo{constructor({routing:r,config:o,title:n,version:s,serverUrl:a,successfulResponseDescription:d="Successful response",errorResponseDescription:c="Error response",hasSummaryFromDescription:p=!0,composition:l="inline",serializer:f=Pe}){super();this.lastSecuritySchemaIds={};this.lastOperationIdSuffixes={};this.addInfo({title:n,version:s}).addServer({url:a}),V({routing:r,onEndpoint:(g,S,h)=>{let b=h,y={path:S,method:b,endpoint:g,composition:l,serializer:f,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[E,w]=["short","long"].map(g.getDescription.bind(g)),ae=o.inputSources?.[b]||be[b],de=tr({...y,inputSources:ae}),P={operationId:this.ensureUniqOperationId(S,b),responses:{[g.getStatusCode("positive")]:yt({...y,clue:d,isPositive:!0}),[g.getStatusCode("negative")]:yt({...y,clue:c,isPositive:!1})}};w&&(P.description=w,p&&E===void 0&&(P.summary=gt(w))),E&&(P.summary=gt(E)),g.getTags().length>0&&(P.tags=g.getTags()),de.length>0&&(P.parameters=de),ae.includes("body")&&(P.requestBody=nr(y));let Te=Fe(Ae(or(g.getSecurity()),We=>{let Ct=this.ensureUniqSecuritySchemaName(We),Er=["oauth2","openIdConnect"].includes(We.type)?g.getScopes():[];return this.addSecurityScheme(Ct,We),{name:Ct,scopes:Er}}));Te.length>0&&(P.security=Te);let Qe=Xt(S);this.addPath(Qe,{[b]:P})}}),this.rootDoc.tags=o.tags?sr(o.tags):[]}makeRef(r,o){return this.addSchema(r,o),this.getRef(r)}getRef(r){return r in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${r}`}:void 0}ensureUniqOperationId(r,o){let n=C(r,o);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(r){let o=JSON.stringify(r);for(let n in this.rootDoc.components?.securitySchemes||{})if(o===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;return this.lastSecuritySchemaIds[r.type]=(this.lastSecuritySchemaIds?.[r.type]||0)+1,`${r.type.toUpperCase()}_${this.lastSecuritySchemaIds[r.type]}`}};import ir from"http";var Xo=e=>({method:"GET",header:jest.fn(()=>K),...e}),en=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:ir.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=ir.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},tn=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=Xo(t),d=en(r),c={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},p={cors:!1,logger:c,...o};return await e.execute({request:a,response:d,config:p,logger:c}),{requestMock:a,responseMock:d,loggerMock:c}};import H from"typescript";import M from"typescript";var i=M.factory,B=[i.createModifier(M.SyntaxKind.ExportKeyword)],rn=[i.createModifier(M.SyntaxKind.AsyncKeyword)],on=[i.createModifier(M.SyntaxKind.PublicKeyword),i.createModifier(M.SyntaxKind.ReadonlyKeyword)],ar=[i.createModifier(M.SyntaxKind.ProtectedKeyword),i.createModifier(M.SyntaxKind.ReadonlyKeyword)],nn=i.createTemplateHead(""),sn=i.createTemplateTail(""),an=i.createTemplateMiddle(" "),xt=e=>i.createTemplateLiteralType(nn,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?sn:an))),Tt=xt(["M","P"]),$e=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t),_e=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat($e(o,e[o],t)),[]),St=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),dr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),Ot=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),bt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],M.NodeFlags.Const),Rt=(e,t)=>i.createTypeAliasDeclaration(B,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),Ge=(e,t)=>i.createTypeAliasDeclaration(B,e,void 0,t),pr=(e,t,r)=>i.createPropertyDeclaration(on,e,void 0,t,r),cr=(e,t,r=[])=>i.createClassDeclaration(B,e,void 0,void 0,[t,...r]),lr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),mr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(M.SyntaxKind.AnyKeyword)]),Pt=(e,t,r)=>i.createInterfaceDeclaration(B,e,void 0,t,r),ur=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),fr=(e,t)=>i.createArrowFunction(rn,void 0,e.map(r=>$e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Zt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,_e({acc:void 0,key:void 0}),void 0,void 0,t),r]);import u from"typescript";import{z as pn}from"zod";import k from"typescript";var{factory:Ve}=k,Et=(e,t)=>{k.addSyntheticLeadingComment(e,k.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},qe=(e,t,r)=>{let o=Ve.createTypeAliasDeclaration(void 0,Ve.createIdentifier(t),void 0,e);return r&&Et(o,r),o},yr=(e,t)=>{let r=k.createSourceFile("print.ts","",k.ScriptTarget.Latest,!1,k.ScriptKind.TS);return k.createPrinter(t).printNode(k.EmitHint.Unspecified,e,r)},dn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,gr=e=>dn.test(e)?Ve.createIdentifier(e):Ve.createStringLiteral(e);var{factory:m}=u,cn={[u.SyntaxKind.AnyKeyword]:"",[u.SyntaxKind.BigIntKeyword]:BigInt(0),[u.SyntaxKind.BooleanKeyword]:!1,[u.SyntaxKind.NumberKeyword]:0,[u.SyntaxKind.ObjectKeyword]:{},[u.SyntaxKind.StringKeyword]:"",[u.SyntaxKind.UndefinedKeyword]:void 0},ln=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),mn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&me(a)?a instanceof pn.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,gr(s),d&&o?m.createToken(u.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Et(c,a.description),c});return m.createTypeLiteralNode(n)},un=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),fn=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),hr=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),yn=e=>cn?.[e.kind],gn=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ze({effect:n,sample:yn(o)}),a={number:u.SyntaxKind.NumberKeyword,bigint:u.SyntaxKind.BigIntKeyword,boolean:u.SyntaxKind.BooleanKeyword,string:u.SyntaxKind.StringKeyword,undefined:u.SyntaxKind.UndefinedKeyword,object:u.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||u.SyntaxKind.AnyKeyword)}return o},hn=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),xn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.SyntaxKind.UndefinedKeyword)]):o},Tn=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),Sn=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),On=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),bn=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Rn=({next:e,schema:t})=>e({schema:t._def.innerType}),U=e=>()=>m.createKeywordTypeNode(e),Pn=({next:e,schema:t})=>e({schema:t.unwrap()}),Zn=({next:e,schema:t})=>e({schema:t._def.innerType}),En=({next:e,schema:t})=>e({schema:t._def.innerType}),An=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),In=()=>m.createLiteralTypeNode(m.createNull()),Cn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,m.createLiteralTypeNode(m.createNull())),t(s,r({schema:n.schema}))))()},Nn={ZodString:U(u.SyntaxKind.StringKeyword),ZodNumber:U(u.SyntaxKind.NumberKeyword),ZodBigInt:U(u.SyntaxKind.BigIntKeyword),ZodBoolean:U(u.SyntaxKind.BooleanKeyword),ZodDateIn:U(u.SyntaxKind.StringKeyword),ZodDateOut:U(u.SyntaxKind.StringKeyword),ZodNull:In,ZodArray:un,ZodTuple:Sn,ZodRecord:On,ZodObject:mn,ZodLiteral:ln,ZodIntersection:bn,ZodUnion:hr,ZodFile:U(u.SyntaxKind.StringKeyword),ZodAny:U(u.SyntaxKind.AnyKeyword),ZodDefault:Rn,ZodEnum:fn,ZodNativeEnum:hn,ZodEffects:gn,ZodOptional:xn,ZodNullable:Tn,ZodDiscriminatedUnion:hr,ZodBranded:Pn,ZodCatch:En,ZodPipeline:An,ZodLazy:Cn,ZodReadonly:Zn},At=({schema:e,...t})=>q({schema:e,rules:Nn,onMissing:()=>m.createKeywordTypeNode(u.SyntaxKind.AnyKeyword),...t});var It=class{constructor({routing:t,variant:r="client",serializer:o=Pe,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){this.agg=[];this.registry={};this.paths=[];this.aliases={};V({routing:t,onEndpoint:(y,E,w)=>{let ae=C(E,w,"input"),de=C(E,w,"response"),P={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Te=At({...P,schema:y.getSchema("input"),isResponse:!1}),Qe=At({...P,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(qe(Te,ae),qe(Qe,de)),w!=="options"&&(this.paths.push(E),this.registry[`${w} ${E}`]={in:ae,out:de,isJson:y.getMimeTypes("positive").includes(K),tags:y.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Rt("Path",this.paths),a=Rt("Method",Kt),d=Ge("MethodPath",xt([a.name,s.name])),c=[i.createHeritageClause(H.SyntaxKind.ExtendsKeyword,[St(d.name,H.SyntaxKind.AnyKeyword)])],p=Pt("Input",c,Object.keys(this.registry).map(y=>Ot(y,this.registry[y].in))),l=Pt("Response",c,Object.keys(this.registry).map(y=>Ot(y,this.registry[y].out)));if(this.agg.push(s,a,d,p,l),r==="types")return;let f=i.createVariableStatement(B,bt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),x=i.createVariableStatement(B,bt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(y=>i.createPropertyAssignment(`"${y}"`,i.createArrayLiteralExpression(this.registry[y].tags.map(E=>i.createStringLiteral(E)))))))),g=Ge("Provider",i.createFunctionTypeNode(ur({M:a.name,P:s.name}),_e({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(p.name),Tt)}),lr(l.name,Tt))),S=Ge("Implementation",i.createFunctionTypeNode(void 0,_e({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(H.SyntaxKind.StringKeyword),params:St(H.SyntaxKind.StringKeyword,H.SyntaxKind.AnyKeyword)}),mr())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),b=cr("ExpressZodAPIClient",dr([$e("implementation",i.createTypeReferenceNode(S.name),ar)]),[pr("provide",i.createTypeReferenceNode(g.name),fr(["method","path","params"],[i.createIdentifier("method"),Zt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Zt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),H.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment("[key]",i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);H.addSyntheticLeadingComment(b,H.SyntaxKind.MultiLineCommentTrivia,`
|
|
34
|
+
`.trim();var ct=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(qt()),B({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(d,c)=>{t.info(`${d.method}: ${s}`),await n.execute({request:d,response:c,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};import io,{json as ao}from"express";import po from"compression";import co from"express-fileupload";import lo from"https";import Vt from"http-errors";var mo=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:Vt(400,W(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Bt=(e,t)=>(r,o)=>{let n=Vt(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Ne({response:o,logger:t,error:new ee(W(s).message,n)})}};function uo(e,t){let r=rt(e.logger)?Ue(e.logger):e.logger;ct({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||oe;return{notFoundHandler:Bt(o,r),logger:r}}function fo(e,t){let r=rt(e.logger)?Ue(e.logger):e.logger,o=io();o.disable("x-powered-by");let n=e.errorHandler||oe,s=e.server.compression?po({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||ao(),d=e.server.upload?co({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,c=[].concat(s||[]).concat(a).concat(d||[]);o.use(c),o.use(mo(n,r)),ct({app:o,routing:t,logger:r,config:e}),o.use(Bt(n,r));let p=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=lo.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:p,httpsServer:l,logger:r}}import{OpenApiBuilder as tn}from"openapi3-ts/oas30";import{isReferenceObject as Xt,isSchemaObject as Te}from"openapi3-ts/oas30";import{omit as xe}from"ramda";import{z as T}from"zod";import{INVALID as Yt,ZodIssueCode as lt,ZodParsedType as Jt,ZodType as yo,addIssueToContext as mt}from"zod";var ut=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,go="ZodDateIn",Ke=class Ke extends yo{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==Jt.string)return mt(o,{code:lt.invalid_type,expected:Jt.string,received:o.parsedType}),Yt;ut.test(o.data)||(mt(o,{code:lt.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Pe(n)?{status:r.value,value:n}:(mt(o,{code:lt.invalid_date}),Yt)}};Ke.create=()=>new Ke({typeName:go});var He=Ke;var Y=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,d=s?s({schema:e,...n,next:p=>Y({...p,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),c=t&&t({schema:e,prev:d,...n});return c?{...d,...c}:d};var Qt=50,er="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",ho={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},tr=e=>e.replace(et,t=>`{${t.slice(1)}}`),xo=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),To=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),So=()=>({format:"any"}),Oo=e=>{if(e.isResponse)throw new Z({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},bo=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new Z({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},Ro=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Po=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),Zo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Eo=({schema:e,next:t})=>t({schema:e.unwrap()}),Ao=({schema:e,next:t})=>t({schema:e._def.innerType}),Io=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Wt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),Co=({schema:{value:e}})=>({type:typeof e,enum:[e]}),No=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&me(s)?s instanceof T.ZodOptional:s.isOptional())});return{type:"object",properties:Fe({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},Mo=()=>({type:"string",nullable:!0,format:"null"}),wo=e=>{if(e.isResponse)throw new Z({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:ut.source,externalDocs:{url:er}}},Do=e=>{if(!e.isResponse)throw new Z({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:er}}},zo=e=>{throw new Z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},vo=()=>({type:"boolean"}),jo=()=>({type:"integer",format:"bigint"}),Lo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof T.ZodEnum||e instanceof T.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Fe({schema:T.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.ZodLiteral)return{type:"object",properties:Fe({schema:T.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof T.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Fe({schema:T.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},ko=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),Uo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${Te(o)?o.type:o.$ref}`).join(", ")}}}},Ho=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:c,isEmoji:p,isDatetime:l,_def:{checks:f}}})=>{let x=f.find(h=>h.kind==="regex"),g=f.find(h=>h.kind==="datetime"),S=x?x.regex:g?g.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...d&&{format:"ulid"},...c&&{format:"ip"},...p&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...S&&{pattern:`/${S.source}/${S.flags}`}}},Ko=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Fe=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Fo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return ho?.[t]},$o=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&Te(o)){let s=Ae({effect:n,sample:Fo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:T.any()})}if(!t&&n.type==="preprocess"&&Te(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},_o=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Go=({schema:e,next:t})=>t({schema:e.unwrap()}),qo=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},rr=(e,t,r=[])=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?xe(r,s):s}}),{})}},Vo=(e,t,r)=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function he(e,t){if(e instanceof T.ZodObject)return e;let r;if(e instanceof T.ZodUnion||e instanceof T.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>he(o,t)).reduce((o,n)=>o.merge(n.partial()),T.object({}));else if(e instanceof T.ZodEffects){if(j(e))throw new Z({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=he(e._def.schema,t)}else r=he(e._def.left,t).merge(he(e._def.right,t));return Oe(e,r)}var or=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="parameter"})=>{let p=r.getSchema("input"),l=he(p,{path:e,method:t,isResponse:!1}).shape,f=nt(e),x=o.includes("query"),g=o.includes("params"),S=h=>g&&f.includes(h);return Object.keys(l).filter(h=>x||S(h)).map(h=>{let b=Y({schema:l[h],isResponse:!1,rules:yt,onEach:gt,onMissing:ht,serializer:n,getRef:s,makeRef:a,path:e,method:t}),y=d==="components"?a(N(e,t,`${c} ${h}`),b):b;return{name:h,in:S(h)?"path":"query",required:!l[h].isOptional(),description:Te(b)&&b.description||`${t.toUpperCase()} ${e} ${c}`,schema:y,...Vo(p,!1,h)}})},yt={ZodString:Ho,ZodNumber:Ko,ZodBigInt:jo,ZodBoolean:vo,ZodDateIn:wo,ZodDateOut:Do,ZodNull:Mo,ZodArray:ko,ZodTuple:Uo,ZodRecord:Lo,ZodObject:No,ZodLiteral:Co,ZodIntersection:Zo,ZodUnion:Ro,ZodFile:bo,ZodUpload:Oo,ZodAny:So,ZodDefault:xo,ZodEnum:Wt,ZodNativeEnum:Wt,ZodEffects:$o,ZodOptional:Eo,ZodNullable:Io,ZodDiscriminatedUnion:Po,ZodBranded:Go,ZodDate:zo,ZodCatch:To,ZodPipeline:_o,ZodLazy:qo,ZodReadonly:Ao},gt=({schema:e,isResponse:t,prev:r})=>{if(Xt(r))return{};let{description:o}=e,n=e instanceof T.ZodLazy,s=r.type!==void 0,a=t&&me(e),d=!n&&s&&!a&&e.isNullable(),c=n?[]:k({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...c.length>0&&{example:c[0]}}},ht=({schema:e,...t})=>{throw new Z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},ft=(e,t)=>{if(Xt(e))return e;let r=e.properties?xe(t,e.properties):void 0,o=e.example?xe(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>ft(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>ft(d,t)):void 0;return xe(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},d])=>d===void 0).map(([d])=>d),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},nr=e=>Te(e)?xe(["example"],e):e,xt=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="response"})=>{let p=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),f=nr(Y({schema:p,isResponse:!0,rules:yt,onEach:gt,onMissing:ht,serializer:n,getRef:s,makeRef:a,path:t,method:e})),x=rr(p,!0),g=d==="components"?a(N(t,e,c),f):f;return{description:`${e.toUpperCase()} ${t} ${c}`,content:l.reduce((S,h)=>({...S,[h]:{schema:g,...x}}),{})}},Bo=()=>({type:"http",scheme:"basic"}),Yo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Jo=({name:e})=>({type:"apiKey",in:"query",name:e}),Qo=({name:e})=>({type:"apiKey",in:"header",name:e}),Wo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Xo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),en=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),sr=e=>{let t={basic:Bo,bearer:Yo,input:Jo,header:Qo,cookie:Wo,openid:Xo,oauth2:en};return Ce(e,r=>t[r.type](r))},$e=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return $e(it(e))}return $e({or:[e]})},ir=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let c=nt(t),p=nr(ft(Y({schema:r.getSchema("input"),isResponse:!1,rules:yt,onEach:gt,onMissing:ht,serializer:o,getRef:n,makeRef:s,path:t,method:e}),c)),l=rr(r.getSchema("input"),!1,c),f=a==="components"?s(N(t,e,d),p):p;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((x,g)=>({...x,[g]:{schema:f,...l}}),{})}},ar=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),Tt=e=>e.length<=Qt?e:e.slice(0,Qt-1)+"\u2026";var St=class extends tn{constructor({routing:r,config:o,title:n,version:s,serverUrl:a,successfulResponseDescription:d="Successful response",errorResponseDescription:c="Error response",hasSummaryFromDescription:p=!0,composition:l="inline",serializer:f=Ee}){super();this.lastSecuritySchemaIds={};this.lastOperationIdSuffixes={};this.addInfo({title:n,version:s}).addServer({url:a}),B({routing:r,onEndpoint:(g,S,h)=>{let b=h,y={path:S,method:b,endpoint:g,composition:l,serializer:f,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[E,D]=["short","long"].map(g.getDescription.bind(g)),ae=o.inputSources?.[b]||Re[b],de=or({...y,inputSources:ae}),P={operationId:this.ensureUniqOperationId(S,b),responses:{[g.getStatusCode("positive")]:xt({...y,clue:d,isPositive:!0}),[g.getStatusCode("negative")]:xt({...y,clue:c,isPositive:!1})}};D&&(P.description=D,p&&E===void 0&&(P.summary=Tt(D))),E&&(P.summary=Tt(E)),g.getTags().length>0&&(P.tags=g.getTags()),de.length>0&&(P.parameters=de),ae.includes("body")&&(P.requestBody=ir(y));let Se=$e(Ce(sr(g.getSecurity()),Xe=>{let wt=this.ensureUniqSecuritySchemaName(Xe),Ir=["oauth2","openIdConnect"].includes(Xe.type)?g.getScopes():[];return this.addSecurityScheme(wt,Xe),{name:wt,scopes:Ir}}));Se.length>0&&(P.security=Se);let We=tr(S);this.addPath(We,{[b]:P})}}),this.rootDoc.tags=o.tags?ar(o.tags):[]}makeRef(r,o){return this.addSchema(r,o),this.getRef(r)}getRef(r){return r in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${r}`}:void 0}ensureUniqOperationId(r,o){let n=N(r,o);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(r){let o=JSON.stringify(r);for(let n in this.rootDoc.components?.securitySchemes||{})if(o===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;return this.lastSecuritySchemaIds[r.type]=(this.lastSecuritySchemaIds?.[r.type]||0)+1,`${r.type.toUpperCase()}_${this.lastSecuritySchemaIds[r.type]}`}};import dr from"http";var rn=e=>({method:"GET",header:jest.fn(()=>G),...e}),on=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:dr.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=dr.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},nn=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=rn(t),d=on(r),c={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},p={cors:!1,logger:c,...o};return await e.execute({request:a,response:d,config:p,logger:c}),{requestMock:a,responseMock:d,loggerMock:c}};import _ from"typescript";import w from"typescript";var i=w.factory,J=[i.createModifier(w.SyntaxKind.ExportKeyword)],sn=[i.createModifier(w.SyntaxKind.AsyncKeyword)],an=[i.createModifier(w.SyntaxKind.PublicKeyword),i.createModifier(w.SyntaxKind.ReadonlyKeyword)],pr=[i.createModifier(w.SyntaxKind.ProtectedKeyword),i.createModifier(w.SyntaxKind.ReadonlyKeyword)],dn=i.createTemplateHead(""),pn=i.createTemplateTail(""),cn=i.createTemplateMiddle(" "),Ot=e=>i.createTemplateLiteralType(dn,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?pn:cn))),bt=Ot(["M","P"]),_e=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t),Ge=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(_e(o,e[o],t)),[]),Rt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),cr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),Pt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),Zt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],w.NodeFlags.Const),Et=(e,t)=>i.createTypeAliasDeclaration(J,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),qe=(e,t)=>i.createTypeAliasDeclaration(J,e,void 0,t),lr=(e,t,r)=>i.createPropertyDeclaration(an,e,void 0,t,r),mr=(e,t,r=[])=>i.createClassDeclaration(J,e,void 0,void 0,[t,...r]),ur=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),fr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(w.SyntaxKind.AnyKeyword)]),At=(e,t,r)=>i.createInterfaceDeclaration(J,e,void 0,t,r),yr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),gr=(e,t)=>i.createArrowFunction(sn,void 0,e.map(r=>_e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),It=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,Ge({acc:void 0,key:void 0}),void 0,void 0,t),r]);import u from"typescript";import{z as mn}from"zod";import F from"typescript";var{factory:Ve}=F,Ct=(e,t)=>{F.addSyntheticLeadingComment(e,F.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Be=(e,t,r)=>{let o=Ve.createTypeAliasDeclaration(void 0,Ve.createIdentifier(t),void 0,e);return r&&Ct(o,r),o},hr=(e,t)=>{let r=F.createSourceFile("print.ts","",F.ScriptTarget.Latest,!1,F.ScriptKind.TS);return F.createPrinter(t).printNode(F.EmitHint.Unspecified,e,r)},ln=/^[A-Za-z_$][A-Za-z0-9_$]*$/,xr=e=>ln.test(e)?Ve.createIdentifier(e):Ve.createStringLiteral(e);var{factory:m}=u,un={[u.SyntaxKind.AnyKeyword]:"",[u.SyntaxKind.BigIntKeyword]:BigInt(0),[u.SyntaxKind.BooleanKeyword]:!1,[u.SyntaxKind.NumberKeyword]:0,[u.SyntaxKind.ObjectKeyword]:{},[u.SyntaxKind.StringKeyword]:"",[u.SyntaxKind.UndefinedKeyword]:void 0},fn=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),yn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&me(a)?a instanceof mn.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,xr(s),d&&o?m.createToken(u.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Ct(c,a.description),c});return m.createTypeLiteralNode(n)},gn=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),hn=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),Tr=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),xn=e=>un?.[e.kind],Tn=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Ae({effect:n,sample:xn(o)}),a={number:u.SyntaxKind.NumberKeyword,bigint:u.SyntaxKind.BigIntKeyword,boolean:u.SyntaxKind.BooleanKeyword,string:u.SyntaxKind.StringKeyword,undefined:u.SyntaxKind.UndefinedKeyword,object:u.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||u.SyntaxKind.AnyKeyword)}return o},Sn=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),On=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.SyntaxKind.UndefinedKeyword)]):o},bn=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),Rn=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),Pn=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),Zn=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),En=({next:e,schema:t})=>e({schema:t._def.innerType}),$=e=>()=>m.createKeywordTypeNode(e),An=({next:e,schema:t})=>e({schema:t.unwrap()}),In=({next:e,schema:t})=>e({schema:t._def.innerType}),Cn=({next:e,schema:t})=>e({schema:t._def.innerType}),Nn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),Mn=()=>m.createLiteralTypeNode(m.createNull()),wn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,m.createLiteralTypeNode(m.createNull())),t(s,r({schema:n.schema}))))()},Dn={ZodString:$(u.SyntaxKind.StringKeyword),ZodNumber:$(u.SyntaxKind.NumberKeyword),ZodBigInt:$(u.SyntaxKind.BigIntKeyword),ZodBoolean:$(u.SyntaxKind.BooleanKeyword),ZodDateIn:$(u.SyntaxKind.StringKeyword),ZodDateOut:$(u.SyntaxKind.StringKeyword),ZodNull:Mn,ZodArray:gn,ZodTuple:Rn,ZodRecord:Pn,ZodObject:yn,ZodLiteral:fn,ZodIntersection:Zn,ZodUnion:Tr,ZodFile:$(u.SyntaxKind.StringKeyword),ZodAny:$(u.SyntaxKind.AnyKeyword),ZodDefault:En,ZodEnum:hn,ZodNativeEnum:Sn,ZodEffects:Tn,ZodOptional:On,ZodNullable:bn,ZodDiscriminatedUnion:Tr,ZodBranded:An,ZodCatch:Cn,ZodPipeline:Nn,ZodLazy:wn,ZodReadonly:In},Nt=({schema:e,...t})=>Y({schema:e,rules:Dn,onMissing:()=>m.createKeywordTypeNode(u.SyntaxKind.AnyKeyword),...t});var Mt=class{constructor({routing:t,variant:r="client",serializer:o=Ee,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){this.agg=[];this.registry={};this.paths=[];this.aliases={};B({routing:t,onEndpoint:(y,E,D)=>{let ae=N(E,D,"input"),de=N(E,D,"response"),P={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Se=Nt({...P,schema:y.getSchema("input"),isResponse:!1}),We=Nt({...P,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(Be(Se,ae),Be(We,de)),D!=="options"&&(this.paths.push(E),this.registry[`${D} ${E}`]={in:ae,out:de,isJson:y.getMimeTypes("positive").includes(G),tags:y.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Et("Path",this.paths),a=Et("Method",$t),d=qe("MethodPath",Ot([a.name,s.name])),c=[i.createHeritageClause(_.SyntaxKind.ExtendsKeyword,[Rt(d.name,_.SyntaxKind.AnyKeyword)])],p=At("Input",c,Object.keys(this.registry).map(y=>Pt(y,this.registry[y].in))),l=At("Response",c,Object.keys(this.registry).map(y=>Pt(y,this.registry[y].out)));if(this.agg.push(s,a,d,p,l),r==="types")return;let f=i.createVariableStatement(J,Zt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),x=i.createVariableStatement(J,Zt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(y=>i.createPropertyAssignment(`"${y}"`,i.createArrayLiteralExpression(this.registry[y].tags.map(E=>i.createStringLiteral(E)))))))),g=qe("Provider",i.createFunctionTypeNode(yr({M:a.name,P:s.name}),Ge({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(p.name),bt)}),ur(l.name,bt))),S=qe("Implementation",i.createFunctionTypeNode(void 0,Ge({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(_.SyntaxKind.StringKeyword),params:Rt(_.SyntaxKind.StringKeyword,_.SyntaxKind.AnyKeyword)}),fr())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),b=mr("ExpressZodAPIClient",cr([_e("implementation",i.createTypeReferenceNode(S.name),pr)]),[lr("provide",i.createTypeReferenceNode(g.name),gr(["method","path","params"],[i.createIdentifier("method"),It("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),It("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),_.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment("[key]",i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);_.addSyntheticLeadingComment(b,_.SyntaxKind.MultiLineCommentTrivia,`
|
|
35
35
|
export const exampleImplementation: Implementation = async (
|
|
36
36
|
method,
|
|
37
37
|
path,
|
|
@@ -52,6 +52,6 @@ export const exampleImplementation: Implementation = async (
|
|
|
52
52
|
|
|
53
53
|
const client = new ExpressZodAPIClient(exampleImplementation);
|
|
54
54
|
client.provide("get", "/v1/user/retrieve", { id: "10" });
|
|
55
|
-
`,!0),this.agg.push(f,x,g,S,b)}getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=
|
|
55
|
+
`,!0),this.agg.push(f,x,g,S,b)}getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=Be(r,t),this.getAlias(t)}print(t){return this.agg.map(r=>hr(r,t)).join(`
|
|
56
56
|
|
|
57
|
-
`)}};var
|
|
57
|
+
`)}};var Ar={};Nr(Ar,{dateIn:()=>Fn,dateOut:()=>$n,file:()=>Hn,upload:()=>Kn});import{INVALID as Sr,ZodIssueCode as Or,ZodParsedType as br,ZodType as zn,addIssueToContext as Rr}from"zod";var vn="ZodDateOut",Je=class Je extends zn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==br.date?(Rr(o,{code:Or.invalid_type,expected:br.date,received:o.parsedType}),Sr):Pe(o.data)?{status:r.value,value:o.data.toISOString()}:(Rr(o,{code:Or.invalid_date}),Sr)}};Je.create=()=>new Je({typeName:vn});var Ye=Je;import{INVALID as jn,ZodIssueCode as Pr,ZodParsedType as Zr,ZodType as Ln,addIssueToContext as Er}from"zod";var kn="ZodFile",Un=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,ie=class ie extends Ln{constructor(){super(...arguments);this.binary=r=>new ie({...this._def,checks:[...this._def.checks,{kind:"binary",...st(r)}]});this.base64=r=>new ie({...this._def,checks:[...this._def.checks,{kind:"base64",...st(r)}]})}_parse(r){let{status:o,ctx:n}=this._processInputParams(r);if(n.parsedType!==Zr.string)return Er(n,{code:Pr.invalid_type,expected:Zr.string,received:n.parsedType}),jn;for(let s of this._def.checks)s.kind==="base64"&&(Un.test(n.data)||(Er(n,{code:Pr.custom,message:s.message}),o.dirty()));return{status:o.value,value:n.data}}get isBinary(){return!!this._def.checks.find(r=>r.kind==="binary")}get isBase64(){return!!this._def.checks.find(r=>r.kind==="base64")}};ie.create=()=>new ie({checks:[],typeName:kn});var Qe=ie;var Hn=Qe.create,Kn=Q.create,Fn=He.create,$n=Ye.create;import xd from"http-errors";export{ne as AbstractEndpoint,ye as DependsOnMethod,ue as DependsOnMethodError,St as Documentation,Z as DocumentationError,fe as EndpointsFactory,U as InputValidationError,Mt as Integration,q as OutputValidationError,X as RoutingError,ge as ServeStatic,Jr as arrayEndpointsFactory,dt as arrayResultHandler,uo as attachRouting,wr as createConfig,xd as createHttpError,Ue as createLogger,pt as createMiddleware,at as createResultHandler,fo as createServer,Yr as defaultEndpointsFactory,oe as defaultResultHandler,Ar as ez,k as getExamples,L as getMessageFromError,Ze as getStatusCodeFromError,nn as testEndpoint,v as withMeta};
|
package/dist/esm/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"type":"module","version":"11.
|
|
1
|
+
{"type":"module","version":"11.7.0"}
|
package/dist/index.d.ts
CHANGED
|
@@ -415,6 +415,15 @@ declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
|
|
|
415
415
|
keyof: () => z.ZodEnum<never>;
|
|
416
416
|
} & any;
|
|
417
417
|
}>;
|
|
418
|
+
/**
|
|
419
|
+
* @deprecated Resist the urge of using it: this handler is designed only to simplify the migration of legacy APIs.
|
|
420
|
+
* @desc Responding with array is a bad practice keeping your endpoints from evolving without breaking changes.
|
|
421
|
+
* @desc This handler expects your endpoint to have the property 'items' in the output object schema
|
|
422
|
+
* */
|
|
423
|
+
declare const arrayResultHandler: ResultHandlerDefinition<any, z.ZodString & {
|
|
424
|
+
_def: z.ZodStringDef & MetaDef<z.ZodString>;
|
|
425
|
+
example: (example: string) => z.ZodString & any;
|
|
426
|
+
}>;
|
|
418
427
|
|
|
419
428
|
type Handler<IN, OUT, OPT> = (params: {
|
|
420
429
|
input: IN;
|
|
@@ -702,6 +711,15 @@ declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
|
|
|
702
711
|
keyof: () => z.ZodEnum<never>;
|
|
703
712
|
} & any;
|
|
704
713
|
}, null, {}, string, string>;
|
|
714
|
+
/**
|
|
715
|
+
* @deprecated Resist the urge of using it: this factory is designed only to simplify the migration of legacy APIs.
|
|
716
|
+
* @desc Responding with array is a bad practice keeping your endpoints from evolving without breaking changes.
|
|
717
|
+
* @desc The result handler of this factory expects your endpoint to have the property 'items' in the output schema
|
|
718
|
+
*/
|
|
719
|
+
declare const arrayEndpointsFactory: EndpointsFactory<any, z.ZodString & {
|
|
720
|
+
_def: z.ZodStringDef & MetaDef<z.ZodString>;
|
|
721
|
+
example: (example: string) => z.ZodString & any;
|
|
722
|
+
}, null, {}, string, string>;
|
|
705
723
|
|
|
706
724
|
declare function createLogger(loggerConfig: LoggerConfig): winston.Logger;
|
|
707
725
|
|
|
@@ -857,4 +875,4 @@ declare namespace proprietarySchemas {
|
|
|
857
875
|
};
|
|
858
876
|
}
|
|
859
877
|
|
|
860
|
-
export { AbstractEndpoint, DependsOnMethod, DependsOnMethodError, Documentation, DocumentationError, EndpointsFactory, FlatObject, IOSchema, InputValidationError, Integration, LoggerConfig, Method, OutputValidationError, Routing, RoutingError, ServeStatic, ZodDateInDef, ZodDateOutDef, ZodFileDef, ZodUploadDef, attachRouting, createConfig, createLogger, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
|
|
878
|
+
export { AbstractEndpoint, DependsOnMethod, DependsOnMethodError, Documentation, DocumentationError, EndpointsFactory, FlatObject, IOSchema, InputValidationError, Integration, LoggerConfig, Method, OutputValidationError, Routing, RoutingError, ServeStatic, ZodDateInDef, ZodDateOutDef, ZodFileDef, ZodUploadDef, arrayEndpointsFactory, arrayResultHandler, attachRouting, createConfig, createLogger, createMiddleware, createResultHandler, createServer, defaultEndpointsFactory, defaultResultHandler, proprietarySchemas as ez, getExamples, getMessageFromError, getStatusCodeFromError, testEndpoint, withMeta };
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Original error: ${e.originalError.message}.`:""))};var
|
|
1
|
+
"use strict";var Gr=Object.create;var Ne=Object.defineProperty;var qr=Object.getOwnPropertyDescriptor;var Vr=Object.getOwnPropertyNames;var Br=Object.getPrototypeOf,Yr=Object.prototype.hasOwnProperty;var _t=(e,t)=>{for(var r in t)Ne(e,r,{get:t[r],enumerable:!0})},Gt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Vr(t))!Yr.call(e,n)&&n!==r&&Ne(e,n,{get:()=>t[n],enumerable:!(o=qr(t,n))||o.enumerable});return e};var R=(e,t,r)=>(r=e!=null?Gr(Br(e)):{},Gt(t||!e||!e.__esModule?Ne(r,"default",{value:e,enumerable:!0}):r,e)),Jr=e=>Gt(Ne({},"__esModule",{value:!0}),e);var Qr=(e,t,r)=>{if(!t.has(e))throw TypeError("Cannot "+r)};var V=(e,t,r)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,r)};var D=(e,t,r)=>(Qr(e,t,"access private method"),r);var Mn={};_t(Mn,{AbstractEndpoint:()=>te,DependsOnMethod:()=>ye,DependsOnMethodError:()=>de,Documentation:()=>rt,DocumentationError:()=>C,EndpointsFactory:()=>ue,InputValidationError:()=>H,Integration:()=>dt,OutputValidationError:()=>Y,RoutingError:()=>X,ServeStatic:()=>ge,arrayEndpointsFactory:()=>pr,arrayResultHandler:()=>Ke,attachRouting:()=>hr,createConfig:()=>Vt,createHttpError:()=>$r.default,createLogger:()=>Ae,createMiddleware:()=>Ye,createResultHandler:()=>He,createServer:()=>xr,defaultEndpointsFactory:()=>dr,defaultResultHandler:()=>ee,ez:()=>Ft,getExamples:()=>k,getMessageFromError:()=>L,getStatusCodeFromError:()=>Pe,testEndpoint:()=>Nr,withMeta:()=>j});module.exports=Jr(Mn);var qt={silent:!0,warn:!0,debug:!0},Vt=e=>e;var F=require("zod");var Qt=require("http-errors"),Wt=require("crypto"),b=require("zod");var Me=require("ramda"),E="expressZodApiMeta",Wr=e=>{let t=e.constructor,r=(0,Me.clone)(e._def);return r[E]=r[E]||{examples:[]},new t(r)},j=e=>{let t=Wr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=j(t);return o._def[E].examples.push(r),o}}}),t},Bt=e=>E in e._def?typeof e._def[E]=="object"&&e._def[E]!==null:!1;function Yt(e,t){if(!Bt(e))return;let r=e._def;return t in r[E]?r[E][t]:void 0}var we=(e,t)=>{if(!Bt(e))return t;let r=j(t),o=Oe(r._def[E].examples,e._def[E].examples);if(r._def[E].examples=[],o.type==="single")r._def[E].examples=o.value;else for(let[n,s]of o.value)r._def[E].examples.push((0,Me.mergeDeepRight)({...n},{...s}));return r};var Jt=R(require("mime")),W=Jt.default.getType("json")||"application/json",be="multipart/form-data";var I=require("zod"),Xr="ZodUpload",eo=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",De=class De extends I.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==I.ZodParsedType.object||!eo(r.data)?((0,I.addIssueToContext)(r,{code:I.ZodIssueCode.custom,message:`Expected file upload, received ${r.parsedType}`}),I.INVALID):(0,I.OK)(r.data)}};De.create=()=>new De({typeName:Xr});var ie=De;var ft=/:([A-Za-z0-9_]+)/g;function to(e){let r=(e.header("content-type")||"").slice(0,be.length).toLowerCase()===be;return"files"in e&&r}var ze={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},ro=["body","query","params"],yt=e=>e.method.toLowerCase();function Xt(e,t){let r=yt(e);if(r==="options")return{};let o=ro;return r in ze&&(o=ze[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?to(e):!0).reduce((n,s)=>({...n,...e[s]}),{})}function gt(e){return typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(qt).includes(e.level)&&typeof e.color=="boolean"}function ve(e){return!isNaN(e.getTime())}function ae(e){return e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`)}function L(e){return e instanceof b.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof Y?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message}function Pe(e){return e instanceof Qt.HttpError?e.statusCode:e instanceof H?400:500}var ht=({logger:e,request:t,input:r,error:o,statusCode:n})=>{n===500&&e.error(`Internal server error
|
|
2
|
+
${o.stack}
|
|
3
|
+
`,{url:t.url,payload:r})},k=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=Yt(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},Oe=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}};function xt(e){let t=e.match(ft);return t?t.map(r=>r.slice(1)):[]}var Re=e=>e.reduce((t,r)=>t||r,!1);function B(e){return e instanceof b.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof b.z.ZodUnion?Re(e.options.map(B)):e instanceof b.z.ZodIntersection?Re([e._def.left,e._def.right].map(B)):!1}function z(e){return e instanceof ie?!0:e instanceof b.z.ZodObject?Re(Object.values(e.shape).map(z)):e instanceof b.z.ZodUnion?Re(e.options.map(z)):e instanceof b.z.ZodIntersection?Re([e._def.left,e._def.right].map(z)):e instanceof b.z.ZodOptional||e instanceof b.z.ZodNullable?z(e.unwrap()):e instanceof b.z.ZodEffects||e instanceof b.z.ZodTransformer?z(e._def.schema):e instanceof b.z.ZodRecord?z(e._def.valueType):e instanceof b.z.ZodArray?z(e._def.type):e instanceof b.z.ZodDefault?z(e._def.innerType):!1}var Ze=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,U=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),je=e=>(0,Wt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Le=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},Tt=e=>typeof e=="string"?{message:e}:e||{};var X=class extends Error{constructor(){super(...arguments);this.name="RoutingError"}},de=class extends X{constructor(){super(...arguments);this.name="DependsOnMethodError"}},C=class extends Error{constructor({message:r,method:o,path:n,isResponse:s}){let a=`${r}
|
|
4
|
+
Caused by ${s?"response":"input"} schema of an Endpoint assigned to ${o.toUpperCase()} method of ${n} path.`;super(a);this.name="DocumentationError"}},J=class extends Error{constructor(){super(...arguments);this.name="IOSchemaError"}},Y=class extends J{constructor(r){super(L(r));this.name="OutputValidationError";this.originalError=r}},H=class extends J{constructor(r){super(L(r));this.name="InputValidationError";this.originalError=r}},pe=class extends Error{constructor(r,o){super(r);this.name="ResultHandlerError";this.originalError=o||void 0}};var K=e=>typeof e=="object"&&e!==null,ke=e=>({and:e.reduce((t,r)=>t.concat(K(r)&&"and"in r?r.and:r),[])}),Ue=(e,t)=>{if(K(e)){if("and"in e)return{and:e.and.map(r=>K(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>K(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},St=e=>e.and.reduce((t,r)=>{let o=Oe(t.or,K(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(ke),t},{or:[]}),ce=(e,t)=>{if(K(e)){if("and"in e){if(K(t)){if("and"in t)return ke([e,t]);if("or"in t)return ce(St(e),t)}return ke([e,t])}if("or"in e){if(K(t)){if("and"in t)return ce(t,e);if("or"in t){let r=Oe(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(ke)}}}return ce(e,{and:[t]})}}return K(t)&&("and"in t||"or"in t)?ce(t,e):{and:[e,t]}};var M=require("zod");var le={positive:200,negative:400},He=e=>e,ee=He({getPositiveResponse:e=>{let t=k({schema:e}),r=j(M.z.object({status:M.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>j(M.z.object({status:M.z.literal("error"),error:M.z.object({message:M.z.string()})})).example({status:"error",error:{message:L(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(le.positive).json({status:"success",data:r});return}let a=Pe(e);ht({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:L(e)}})}}),Ke=He({getPositiveResponse:e=>{let t=k({schema:e}),r=j("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)=>typeof n=="object"&&n!==null&&"items"in n?o.example(n.items):o,r)},getNegativeResponse:()=>j(M.z.string()).example(L(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Pe(r);ht({logger:o,statusCode:a,request:n,error:r,input:s}),e.status(a).send(r.message);return}"items"in t&&Array.isArray(t.items)?e.status(200).json(t.items):e.status(500).send("Property 'items' is missing in the endpoint output")}}),Fe=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
|
|
5
|
+
Original error: ${e.originalError.message}.`:""))};var er=(e,t=[W])=>{if(e instanceof F.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},te=class{},_e,tr,Ge,rr,qe,or,Ve,nr,Be,sr,$e=class extends te{constructor({middlewares:r,inputSchema:o,outputSchema:n,handler:s,resultHandler:a,description:d,shortDescription:c,...p}){super();V(this,_e);V(this,Ge);V(this,qe);V(this,Ve);V(this,Be);this.methods=[];this.siblingMethods=[];this.middlewares=[];this.scopes=[];this.tags=[];[{name:"input schema",schema:o},{name:"output schema",schema:n}].forEach(({name:f,schema:x})=>{if(B(x))throw new J(`Using transformations on the top level of endpoint ${f} is not allowed.`)}),this.middlewares=r;let l={positive:a.getPositiveResponse(n),negative:a.getNegativeResponse()};this.mimeTypes={input:z(o)?[be]:[W],positive:er(l.positive),negative:er(l.negative)},this.schemas={input:o,output:n,positive:l.positive instanceof F.z.ZodType?l.positive:l.positive.schema,negative:l.negative instanceof F.z.ZodType?l.negative:l.negative.schema},this.statusCodes={positive:l.positive instanceof F.z.ZodType?le.positive:l.positive.statusCode||le.positive,negative:l.negative instanceof F.z.ZodType?le.negative:l.negative.statusCode||le.negative},this.handler=s,this.resultHandler=a,this.descriptions={long:d,short:c},"scopes"in p&&p.scopes&&this.scopes.push(...p.scopes),"scope"in p&&p.scope&&this.scopes.push(p.scope),"tags"in p&&p.tags&&this.tags.push(...p.tags),"tag"in p&&p.tag&&this.tags.push(p.tag),"methods"in p?this.methods=p.methods:this.methods=[p.method]}_setSiblingMethods(r){this.siblingMethods=r}getDescription(r){return this.descriptions[r]}getMethods(){return this.methods}getSchema(r){return this.schemas[r]}getMimeTypes(r){return this.mimeTypes[r]}getStatusCode(r){return this.statusCodes[r]}getSecurity(){return this.middlewares.reduce((r,o)=>o.security?ce(r,o.security):r,{and:[]})}getScopes(){return this.scopes}getTags(){return this.tags}async execute({request:r,response:o,logger:n,config:s}){let a=yt(r),d,c=null;if(s.cors){let l=D(this,_e,tr).call(this);typeof s.cors=="function"&&(l=await s.cors({request:r,logger:n,endpoint:this,defaultHeaders:l}));for(let f in l)o.set(f,l[f])}let p=Xt(r,s.inputSources);try{let{options:l,isStreamClosed:f}=await D(this,qe,or).call(this,{method:a,input:p,request:r,response:o,logger:n});if(f)return;if(a==="options"){o.status(200).end();return}d=await D(this,Ge,rr).call(this,await D(this,Ve,nr).call(this,{input:p,options:l,logger:n}))}catch(l){c=ae(l)}await D(this,Be,sr).call(this,{input:p,output:d,request:r,response:o,error:c,logger:n})}};_e=new WeakSet,tr=function(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.methods.concat(this.siblingMethods).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}},Ge=new WeakSet,rr=async function(r){try{return await this.schemas.output.parseAsync(r)}catch(o){throw o instanceof F.z.ZodError?new Y(o):o}},qe=new WeakSet,or=async function({method:r,input:o,request:n,response:s,logger:a}){let d={},c=!1;for(let p of this.middlewares){if(r==="options"&&p.type==="proprietary")continue;let l;try{l=await p.input.parseAsync(o)}catch(f){throw f instanceof F.z.ZodError?new H(f):f}if(Object.assign(d,await p.middleware({input:l,options:d,request:n,response:s,logger:a})),c="writableEnded"in s&&s.writableEnded,c){a.warn(`The middleware ${p.middleware.name} has closed the stream. Accumulated options:`,d);break}}return{options:d,isStreamClosed:c}},Ve=new WeakSet,nr=async function({input:r,options:o,logger:n}){let s;try{s=await this.schemas.input.parseAsync(r)}catch(a){throw a instanceof F.z.ZodError?new H(a):a}return this.handler({input:s,options:o,logger:n})},Be=new WeakSet,sr=async function({error:r,request:o,response:n,logger:s,input:a,output:d}){try{await this.resultHandler.handler({error:r,output:d,request:o,response:n,logger:s,input:a})}catch(c){Fe({logger:s,response:n,error:new pe(ae(c).message,r)})}};var ir=["get","post","put","delete","patch"];var Ot=require("zod");var ar=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>we(s,n),o)};var Ye=e=>{if(B(e.input))throw new J("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var me,Je,re=class re{constructor(t){this.middlewares=[];this.use=this.addExpressMiddleware;this.resultHandler="resultHandler"in t?t.resultHandler:t}addMiddleware(t){var r;return D(r=re,me,Je).call(r,this.middlewares.concat(t),this.resultHandler)}addExpressMiddleware(t,r){var a;let o=r?.transformer||(d=>d),n=r?.provider||(()=>({})),s={type:"express",input:Ot.z.object({}),middleware:async({request:d,response:c})=>new Promise((p,l)=>{t(d,c,x=>{if(x&&x instanceof Error)return l(o(x));p(n(d,c))})})};return D(a=re,me,Je).call(a,this.middlewares.concat(s),this.resultHandler)}addOptions(t){var r;return D(r=re,me,Je).call(r,this.middlewares.concat(Ye({input:Ot.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new $e({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:ar(s,t),...n})}};me=new WeakSet,Je=function(t,r){let o=new re(r);return o.middlewares=t,o},V(re,me);var ue=re,dr=new ue(ee),pr=new ue(Ke);var cr=require("util"),fe=require("triple-beam"),Ee=R(require("winston")),{combine:oo,colorize:no,timestamp:so,printf:io}=Ee.default.format;function Ae(e){let t=s=>{let{[fe.LEVEL]:a,[fe.MESSAGE]:d,[fe.SPLAT]:c,...p}=s;return(0,cr.inspect)(p,!1,1,e.color)},r=s=>io(({timestamp:a,message:d,level:c,durationMs:p,...l})=>(typeof d=="object"&&(l={...l,...d},d="[No message]"),`${a} ${c}: ${d}`+(p===void 0?"":` duration: ${p}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[so()],n={handleExceptions:!0};switch(e.color&&o.push(no()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=oo(...o),Ee.default.createLogger({silent:e.level==="silent",levels:Ee.default.config.npm.levels,transports:[new Ee.default.transports.Console(n)],exitOnError:!1})}var ye=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new de(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
|
|
6
6
|
This error should prevent mistakes during the development process.
|
|
7
7
|
Example:
|
|
8
8
|
|
|
@@ -13,8 +13,8 @@ new ${this.constructor.name}({
|
|
|
13
13
|
...
|
|
14
14
|
})
|
|
15
15
|
});
|
|
16
|
-
`)})}};var
|
|
17
|
-
The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let d=`${o||""}${s?`/${s}`:""}`;if(a instanceof te){let c=a.getMethods().slice();n&&c.push("options"),c.forEach(p=>{t(a,d,p)})}else if(a instanceof
|
|
16
|
+
`)})}};var lr=R(require("express")),ge=class{constructor(...t){this.params=t}apply(t,r){return r(t,lr.default.static(...this.params))}};var oe=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new X(`Routing elements should not contain '/' character.
|
|
17
|
+
The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let d=`${o||""}${s?`/${s}`:""}`;if(a instanceof te){let c=a.getMethods().slice();n&&c.push("options"),c.forEach(p=>{t(a,d,p)})}else if(a instanceof ge)r&&a.apply(d,r);else if(a instanceof ye){if(Object.entries(a.methods).forEach(([c,p])=>{t(p,d,c)}),n&&Object.keys(a.methods).length>0){let[c,...p]=Object.keys(a.methods),l=a.methods[c];l._setSiblingMethods(p),t(l,d,"options")}}else oe({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:d})})};var mr=()=>`
|
|
18
18
|
\x1B[94m\x1B[39m
|
|
19
19
|
\x1B[94m\x1B[39m
|
|
20
20
|
\x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
|
|
@@ -31,7 +31,7 @@ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let
|
|
|
31
31
|
\x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
|
|
32
32
|
\x1B[0m\x1B[0m
|
|
33
33
|
\x1B[0m\x1B[0m
|
|
34
|
-
`.trim();var St=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(pr()),oe({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(d,c)=>{t.info(`${d.method}: ${s}`),await n.execute({request:d,response:c,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var Ye=R(require("express")),cr=R(require("compression")),lr=R(require("express-fileupload")),mr=R(require("https"));var Ot=R(require("http-errors")),no=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,Ot.default)(400,ae(r).message),request:o,response:n,logger:t,input:o.body,output:null})},ur=(e,t)=>(r,o)=>{let n=(0,Ot.default)(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){He({response:o,logger:t,error:new pe(ae(s).message,n)})}};function fr(e,t){let r=ft(e.logger)?Ee(e.logger):e.logger;St({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||ee;return{notFoundHandler:ur(o,r),logger:r}}function yr(e,t){let r=ft(e.logger)?Ee(e.logger):e.logger,o=(0,Ye.default)();o.disable("x-powered-by");let n=e.errorHandler||ee,s=e.server.compression?(0,cr.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,Ye.json)(),d=e.server.upload?(0,lr.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,c=[].concat(s||[]).concat(a).concat(d||[]);o.use(c),o.use(no(n,r)),St({app:o,routing:t,logger:r,config:e}),o.use(ur(n,r));let p=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=mr.default.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:p,httpsServer:l,logger:r}}var Er=require("openapi3-ts/oas30");var U=require("openapi3-ts/oas30"),ge=require("ramda"),T=require("zod");var S=require("zod");var bt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,so="ZodDateIn",Qe=class Qe extends S.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==S.ZodParsedType.string)return(0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_type,expected:S.ZodParsedType.string,received:o.parsedType}),S.INVALID;bt.test(o.data)||((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return ze(n)?{status:r.value,value:n}:((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_date}),S.INVALID)}};Qe.create=()=>new Qe({typeName:so});var Je=Qe;var ne=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,d=s?s({schema:e,...n,next:p=>ne({...p,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),c=t&&t({schema:e,prev:d,...n});return c?{...d,...c}:d};var gr=50,xr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",io={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Tr=e=>e.replace(mt,t=>`{${t.slice(1)}}`),ao=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),po=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),co=()=>({format:"any"}),lo=e=>{if(e.isResponse)throw new C({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},mo=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new C({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},uo=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),fo=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),yo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),go=({schema:e,next:t})=>t({schema:e.unwrap()}),ho=({schema:e,next:t})=>t({schema:e._def.innerType}),xo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),hr=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),To=({schema:{value:e}})=>({type:typeof e,enum:[e]}),So=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Re(s)?s instanceof T.z.ZodOptional:s.isOptional())});return{type:"object",properties:We({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},Oo=()=>({type:"string",nullable:!0,format:"null"}),bo=e=>{if(e.isResponse)throw new C({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:bt.source,externalDocs:{url:xr}}},Ro=e=>{if(!e.isResponse)throw new C({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:xr}}},Po=e=>{throw new C({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},Zo=()=>({type:"boolean"}),Eo=()=>({type:"integer",format:"bigint"}),Ao=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof T.z.ZodEnum||e instanceof T.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:We({schema:T.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.z.ZodLiteral)return{type:"object",properties:We({schema:T.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.z.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof T.z.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:We({schema:T.z.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},Io=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),Co=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${(0,U.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},No=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:c,isEmoji:p,isDatetime:l,_def:{checks:f}}})=>{let x=f.find(h=>h.kind==="regex"),g=f.find(h=>h.kind==="datetime"),O=x?x.regex:g?g.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...d&&{format:"ulid"},...c&&{format:"ip"},...p&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...O&&{pattern:`/${O.source}/${O.flags}`}}},Mo=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},We=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),wo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return io?.[t]},Do=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,U.isSchemaObject)(o)){let s=Le({effect:n,sample:wo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:T.z.any()})}if(!t&&n.type==="preprocess"&&(0,U.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},zo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),vo=({schema:e,next:t})=>t({schema:e.unwrap()}),jo=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},Sr=(e,t,r=[])=>{let o=V({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:(0,ge.omit)(r,s)}}),{})}},Lo=(e,t,r)=>{let o=V({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function Ae(e,t){if(e instanceof T.z.ZodObject)return e;let r;if(e instanceof T.z.ZodUnion||e instanceof T.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Ae(o,t)).reduce((o,n)=>o.merge(n.partial()),T.z.object({}));else if(e instanceof T.z.ZodEffects){if(_(e))throw new C({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Ae(e._def.schema,t)}else r=Ae(e._def.left,t).merge(Ae(e._def.right,t));return Me(e,r)}var Or=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="parameter"})=>{let p=r.getSchema("input"),l=Ae(p,{path:e,method:t,isResponse:!1}).shape,f=yt(e),x=o.includes("query"),g=o.includes("params"),O=h=>g&&f.includes(h);return Object.keys(l).filter(h=>x||O(h)).map(h=>{let Z=ne({schema:l[h],isResponse:!1,rules:Pt,onEach:Zt,onMissing:Et,serializer:n,getRef:s,makeRef:a,path:e,method:t}),y=d==="components"?a(v(e,t,`${c} ${h}`),Z):Z;return{name:h,in:O(h)?"path":"query",required:!l[h].isOptional(),description:(0,U.isSchemaObject)(Z)&&Z.description||`${t.toUpperCase()} ${e} ${c}`,schema:y,...Lo(p,!1,h)}})},Pt={ZodString:No,ZodNumber:Mo,ZodBigInt:Eo,ZodBoolean:Zo,ZodDateIn:bo,ZodDateOut:Ro,ZodNull:Oo,ZodArray:Io,ZodTuple:Co,ZodRecord:Ao,ZodObject:So,ZodLiteral:To,ZodIntersection:yo,ZodUnion:uo,ZodFile:mo,ZodUpload:lo,ZodAny:co,ZodDefault:ao,ZodEnum:hr,ZodNativeEnum:hr,ZodEffects:Do,ZodOptional:go,ZodNullable:xo,ZodDiscriminatedUnion:fo,ZodBranded:vo,ZodDate:Po,ZodCatch:po,ZodPipeline:zo,ZodLazy:jo,ZodReadonly:ho},Zt=({schema:e,isResponse:t,prev:r})=>{if((0,U.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof T.z.ZodLazy,s=r.type!==void 0,a=t&&Re(e),d=!n&&s&&!a&&e.isNullable(),c=n?[]:V({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...c.length>0&&{example:c[0]}}},Et=({schema:e,...t})=>{throw new C({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},Rt=(e,t)=>{if((0,U.isReferenceObject)(e))return e;let r=e.properties?(0,ge.omit)(t,e.properties):void 0,o=e.example?(0,ge.omit)(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>Rt(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>Rt(d,t)):void 0;return(0,ge.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},d])=>d===void 0).map(([d])=>d),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},br=e=>(0,U.isSchemaObject)(e)?(0,ge.omit)(["example"],e):e,At=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="response"})=>{let p=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),f=br(ne({schema:p,isResponse:!0,rules:Pt,onEach:Zt,onMissing:Et,serializer:n,getRef:s,makeRef:a,path:t,method:e})),x=Sr(p,!0),g=d==="components"?a(v(t,e,c),f):f;return{description:`${e.toUpperCase()} ${t} ${c}`,content:l.reduce((O,h)=>({...O,[h]:{schema:g,...x}}),{})}},ko=()=>({type:"http",scheme:"basic"}),Uo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Ho=({name:e})=>({type:"apiKey",in:"query",name:e}),Ko=({name:e})=>({type:"apiKey",in:"header",name:e}),Fo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),$o=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),_o=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),Rr=e=>{let t={basic:ko,bearer:Uo,input:Ho,header:Ko,cookie:Fo,openid:$o,oauth2:_o};return Ue(e,r=>t[r.type](r))},Xe=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Xe(ht(e))}return Xe({or:[e]})},Pr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let c=yt(t),p=br(Rt(ne({schema:r.getSchema("input"),isResponse:!1,rules:Pt,onEach:Zt,onMissing:Et,serializer:o,getRef:n,makeRef:s,path:t,method:e}),c)),l=Sr(r.getSchema("input"),!1,c),f=a==="components"?s(v(t,e,d),p):p;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((x,g)=>({...x,[g]:{schema:f,...l}}),{})}},Zr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),It=e=>e.length<=gr?e:e.slice(0,gr-1)+"\u2026";var et=class extends Er.OpenApiBuilder{constructor({routing:r,config:o,title:n,version:s,serverUrl:a,successfulResponseDescription:d="Successful response",errorResponseDescription:c="Error response",hasSummaryFromDescription:p=!0,composition:l="inline",serializer:f=je}){super();this.lastSecuritySchemaIds={};this.lastOperationIdSuffixes={};this.addInfo({title:n,version:s}).addServer({url:a}),oe({routing:r,onEndpoint:(g,O,h)=>{let Z=h,y={path:O,method:Z,endpoint:g,composition:l,serializer:f,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[M,F]=["short","long"].map(g.getDescription.bind(g)),xe=o.inputSources?.[Z]||De[Z],Te=Or({...y,inputSources:xe}),N={operationId:this.ensureUniqOperationId(O,Z),responses:{[g.getStatusCode("positive")]:At({...y,clue:d,isPositive:!0}),[g.getStatusCode("negative")]:At({...y,clue:c,isPositive:!1})}};F&&(N.description=F,p&&M===void 0&&(N.summary=It(F))),M&&(N.summary=It(M)),g.getTags().length>0&&(N.tags=g.getTags()),Te.length>0&&(N.parameters=Te),xe.includes("body")&&(N.requestBody=Pr(y));let Ie=Xe(Ue(Rr(g.getSecurity()),lt=>{let Kt=this.ensureUniqSecuritySchemaName(lt),Kr=["oauth2","openIdConnect"].includes(lt.type)?g.getScopes():[];return this.addSecurityScheme(Kt,lt),{name:Kt,scopes:Kr}}));Ie.length>0&&(N.security=Ie);let ct=Tr(O);this.addPath(ct,{[Z]:N})}}),this.rootDoc.tags=o.tags?Zr(o.tags):[]}makeRef(r,o){return this.addSchema(r,o),this.getRef(r)}getRef(r){return r in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${r}`}:void 0}ensureUniqOperationId(r,o){let n=v(r,o);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(r){let o=JSON.stringify(r);for(let n in this.rootDoc.components?.securitySchemes||{})if(o===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;return this.lastSecuritySchemaIds[r.type]=(this.lastSecuritySchemaIds?.[r.type]||0)+1,`${r.type.toUpperCase()}_${this.lastSecuritySchemaIds[r.type]}`}};var Ct=R(require("http"));var Go=e=>({method:"GET",header:jest.fn(()=>Q),...e}),Vo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:Ct.default.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=Ct.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},Ar=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=Go(t),d=Vo(r),c={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},p={cors:!1,logger:c,...o};return await e.execute({request:a,response:d,config:p,logger:c}),{requestMock:a,responseMock:d,loggerMock:c}};var K=R(require("typescript"));var z=R(require("typescript")),i=z.default.factory,se=[i.createModifier(z.default.SyntaxKind.ExportKeyword)],qo=[i.createModifier(z.default.SyntaxKind.AsyncKeyword)],Bo=[i.createModifier(z.default.SyntaxKind.PublicKeyword),i.createModifier(z.default.SyntaxKind.ReadonlyKeyword)],Ir=[i.createModifier(z.default.SyntaxKind.ProtectedKeyword),i.createModifier(z.default.SyntaxKind.ReadonlyKeyword)],Yo=i.createTemplateHead(""),Jo=i.createTemplateTail(""),Qo=i.createTemplateMiddle(" "),Nt=e=>i.createTemplateLiteralType(Yo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Jo:Qo))),Mt=Nt(["M","P"]),tt=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t),rt=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(tt(o,e[o],t)),[]),wt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),Cr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),Dt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),zt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],z.default.NodeFlags.Const),vt=(e,t)=>i.createTypeAliasDeclaration(se,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),ot=(e,t)=>i.createTypeAliasDeclaration(se,e,void 0,t),Nr=(e,t,r)=>i.createPropertyDeclaration(Bo,e,void 0,t,r),Mr=(e,t,r=[])=>i.createClassDeclaration(se,e,void 0,void 0,[t,...r]),wr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),Dr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(z.default.SyntaxKind.AnyKeyword)]),jt=(e,t,r)=>i.createInterfaceDeclaration(se,e,void 0,t,r),zr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),vr=(e,t)=>i.createArrowFunction(qo,void 0,e.map(r=>tt(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Lt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,rt({acc:void 0,key:void 0}),void 0,void 0,t),r]);var u=R(require("typescript")),Ur=require("zod");var H=R(require("typescript")),{factory:nt}=H.default,kt=(e,t)=>{H.default.addSyntheticLeadingComment(e,H.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},st=(e,t,r)=>{let o=nt.createTypeAliasDeclaration(void 0,nt.createIdentifier(t),void 0,e);return r&&kt(o,r),o},jr=(e,t)=>{let r=H.default.createSourceFile("print.ts","",H.default.ScriptTarget.Latest,!1,H.default.ScriptKind.TS);return H.default.createPrinter(t).printNode(H.default.EmitHint.Unspecified,e,r)},Wo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Lr=e=>Wo.test(e)?nt.createIdentifier(e):nt.createStringLiteral(e);var{factory:m}=u.default,Xo={[u.default.SyntaxKind.AnyKeyword]:"",[u.default.SyntaxKind.BigIntKeyword]:BigInt(0),[u.default.SyntaxKind.BooleanKeyword]:!1,[u.default.SyntaxKind.NumberKeyword]:0,[u.default.SyntaxKind.ObjectKeyword]:{},[u.default.SyntaxKind.StringKeyword]:"",[u.default.SyntaxKind.UndefinedKeyword]:void 0},en=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),tn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&Re(a)?a instanceof Ur.z.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,Lr(s),d&&o?m.createToken(u.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&kt(c,a.description),c});return m.createTypeLiteralNode(n)},rn=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),on=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),kr=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),nn=e=>Xo?.[e.kind],sn=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Le({effect:n,sample:nn(o)}),a={number:u.default.SyntaxKind.NumberKeyword,bigint:u.default.SyntaxKind.BigIntKeyword,boolean:u.default.SyntaxKind.BooleanKeyword,string:u.default.SyntaxKind.StringKeyword,undefined:u.default.SyntaxKind.UndefinedKeyword,object:u.default.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||u.default.SyntaxKind.AnyKeyword)}return o},an=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),dn=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.default.SyntaxKind.UndefinedKeyword)]):o},pn=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),cn=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),ln=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),mn=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),un=({next:e,schema:t})=>e({schema:t._def.innerType}),Y=e=>()=>m.createKeywordTypeNode(e),fn=({next:e,schema:t})=>e({schema:t.unwrap()}),yn=({next:e,schema:t})=>e({schema:t._def.innerType}),gn=({next:e,schema:t})=>e({schema:t._def.innerType}),hn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),xn=()=>m.createLiteralTypeNode(m.createNull()),Tn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,m.createLiteralTypeNode(m.createNull())),t(s,r({schema:n.schema}))))()},Sn={ZodString:Y(u.default.SyntaxKind.StringKeyword),ZodNumber:Y(u.default.SyntaxKind.NumberKeyword),ZodBigInt:Y(u.default.SyntaxKind.BigIntKeyword),ZodBoolean:Y(u.default.SyntaxKind.BooleanKeyword),ZodDateIn:Y(u.default.SyntaxKind.StringKeyword),ZodDateOut:Y(u.default.SyntaxKind.StringKeyword),ZodNull:xn,ZodArray:rn,ZodTuple:cn,ZodRecord:ln,ZodObject:tn,ZodLiteral:en,ZodIntersection:mn,ZodUnion:kr,ZodFile:Y(u.default.SyntaxKind.StringKeyword),ZodAny:Y(u.default.SyntaxKind.AnyKeyword),ZodDefault:un,ZodEnum:on,ZodNativeEnum:an,ZodEffects:sn,ZodOptional:dn,ZodNullable:pn,ZodDiscriminatedUnion:kr,ZodBranded:fn,ZodCatch:gn,ZodPipeline:hn,ZodLazy:Tn,ZodReadonly:yn},Ut=({schema:e,...t})=>ne({schema:e,rules:Sn,onMissing:()=>m.createKeywordTypeNode(u.default.SyntaxKind.AnyKeyword),...t});var it=class{constructor({routing:t,variant:r="client",serializer:o=je,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){this.agg=[];this.registry={};this.paths=[];this.aliases={};oe({routing:t,onEndpoint:(y,M,F)=>{let xe=v(M,F,"input"),Te=v(M,F,"response"),N={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Ie=Ut({...N,schema:y.getSchema("input"),isResponse:!1}),ct=Ut({...N,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(st(Ie,xe),st(ct,Te)),F!=="options"&&(this.paths.push(M),this.registry[`${F} ${M}`]={in:xe,out:Te,isJson:y.getMimeTypes("positive").includes(Q),tags:y.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=vt("Path",this.paths),a=vt("Method",nr),d=ot("MethodPath",Nt([a.name,s.name])),c=[i.createHeritageClause(K.default.SyntaxKind.ExtendsKeyword,[wt(d.name,K.default.SyntaxKind.AnyKeyword)])],p=jt("Input",c,Object.keys(this.registry).map(y=>Dt(y,this.registry[y].in))),l=jt("Response",c,Object.keys(this.registry).map(y=>Dt(y,this.registry[y].out)));if(this.agg.push(s,a,d,p,l),r==="types")return;let f=i.createVariableStatement(se,zt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),x=i.createVariableStatement(se,zt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(y=>i.createPropertyAssignment(`"${y}"`,i.createArrayLiteralExpression(this.registry[y].tags.map(M=>i.createStringLiteral(M)))))))),g=ot("Provider",i.createFunctionTypeNode(zr({M:a.name,P:s.name}),rt({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(p.name),Mt)}),wr(l.name,Mt))),O=ot("Implementation",i.createFunctionTypeNode(void 0,rt({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(K.default.SyntaxKind.StringKeyword),params:wt(K.default.SyntaxKind.StringKeyword,K.default.SyntaxKind.AnyKeyword)}),Dr())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),Z=Mr("ExpressZodAPIClient",Cr([tt("implementation",i.createTypeReferenceNode(O.name),Ir)]),[Nr("provide",i.createTypeReferenceNode(g.name),vr(["method","path","params"],[i.createIdentifier("method"),Lt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Lt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),K.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment("[key]",i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);K.default.addSyntheticLeadingComment(Z,K.default.SyntaxKind.MultiLineCommentTrivia,`
|
|
34
|
+
`.trim();var bt=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(mr()),oe({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(d,c)=>{t.info(`${d.method}: ${s}`),await n.execute({request:d,response:c,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var Qe=R(require("express")),ur=R(require("compression")),fr=R(require("express-fileupload")),yr=R(require("https"));var Rt=R(require("http-errors")),ao=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,Rt.default)(400,ae(r).message),request:o,response:n,logger:t,input:o.body,output:null})},gr=(e,t)=>(r,o)=>{let n=(0,Rt.default)(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Fe({response:o,logger:t,error:new pe(ae(s).message,n)})}};function hr(e,t){let r=gt(e.logger)?Ae(e.logger):e.logger;bt({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||ee;return{notFoundHandler:gr(o,r),logger:r}}function xr(e,t){let r=gt(e.logger)?Ae(e.logger):e.logger,o=(0,Qe.default)();o.disable("x-powered-by");let n=e.errorHandler||ee,s=e.server.compression?(0,ur.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,Qe.json)(),d=e.server.upload?(0,fr.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,c=[].concat(s||[]).concat(a).concat(d||[]);o.use(c),o.use(ao(n,r)),bt({app:o,routing:t,logger:r,config:e}),o.use(gr(n,r));let p=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=yr.default.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:p,httpsServer:l,logger:r}}var Cr=require("openapi3-ts/oas30");var $=require("openapi3-ts/oas30"),he=require("ramda"),T=require("zod");var S=require("zod");var Pt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,po="ZodDateIn",Xe=class Xe extends S.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==S.ZodParsedType.string)return(0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_type,expected:S.ZodParsedType.string,received:o.parsedType}),S.INVALID;Pt.test(o.data)||((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return ve(n)?{status:r.value,value:n}:((0,S.addIssueToContext)(o,{code:S.ZodIssueCode.invalid_date}),S.INVALID)}};Xe.create=()=>new Xe({typeName:po});var We=Xe;var ne=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,d=s?s({schema:e,...n,next:p=>ne({...p,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),c=t&&t({schema:e,prev:d,...n});return c?{...d,...c}:d};var Tr=50,Or="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",co={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},br=e=>e.replace(ft,t=>`{${t.slice(1)}}`),lo=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),mo=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),uo=()=>({format:"any"}),fo=e=>{if(e.isResponse)throw new C({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},yo=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new C({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},go=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),ho=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),xo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),To=({schema:e,next:t})=>t({schema:e.unwrap()}),So=({schema:e,next:t})=>t({schema:e._def.innerType}),Oo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Sr=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),bo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),Ro=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Ze(s)?s instanceof T.z.ZodOptional:s.isOptional())});return{type:"object",properties:et({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},Po=()=>({type:"string",nullable:!0,format:"null"}),Zo=e=>{if(e.isResponse)throw new C({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:Pt.source,externalDocs:{url:Or}}},Eo=e=>{if(!e.isResponse)throw new C({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Or}}},Ao=e=>{throw new C({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},Io=()=>({type:"boolean"}),Co=()=>({type:"integer",format:"bigint"}),No=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof T.z.ZodEnum||e instanceof T.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:et({schema:T.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof T.z.ZodLiteral)return{type:"object",properties:et({schema:T.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof T.z.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof T.z.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:et({schema:T.z.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},Mo=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),wo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${(0,$.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},Do=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:c,isEmoji:p,isDatetime:l,_def:{checks:f}}})=>{let x=f.find(h=>h.kind==="regex"),g=f.find(h=>h.kind==="datetime"),O=x?x.regex:g?g.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...d&&{format:"ulid"},...c&&{format:"ip"},...p&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...O&&{pattern:`/${O.source}/${O.flags}`}}},zo=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},et=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),vo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return co?.[t]},jo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,$.isSchemaObject)(o)){let s=Le({effect:n,sample:vo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:T.z.any()})}if(!t&&n.type==="preprocess"&&(0,$.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Lo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),ko=({schema:e,next:t})=>t({schema:e.unwrap()}),Uo=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},Rr=(e,t,r=[])=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:typeof s=="object"&&!Array.isArray(s)?(0,he.omit)(r,s):s}}),{})}},Ho=(e,t,r)=>{let o=k({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function Ie(e,t){if(e instanceof T.z.ZodObject)return e;let r;if(e instanceof T.z.ZodUnion||e instanceof T.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Ie(o,t)).reduce((o,n)=>o.merge(n.partial()),T.z.object({}));else if(e instanceof T.z.ZodEffects){if(B(e))throw new C({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Ie(e._def.schema,t)}else r=Ie(e._def.left,t).merge(Ie(e._def.right,t));return we(e,r)}var Pr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="parameter"})=>{let p=r.getSchema("input"),l=Ie(p,{path:e,method:t,isResponse:!1}).shape,f=xt(e),x=o.includes("query"),g=o.includes("params"),O=h=>g&&f.includes(h);return Object.keys(l).filter(h=>x||O(h)).map(h=>{let Z=ne({schema:l[h],isResponse:!1,rules:Et,onEach:At,onMissing:It,serializer:n,getRef:s,makeRef:a,path:e,method:t}),y=d==="components"?a(U(e,t,`${c} ${h}`),Z):Z;return{name:h,in:O(h)?"path":"query",required:!l[h].isOptional(),description:(0,$.isSchemaObject)(Z)&&Z.description||`${t.toUpperCase()} ${e} ${c}`,schema:y,...Ho(p,!1,h)}})},Et={ZodString:Do,ZodNumber:zo,ZodBigInt:Co,ZodBoolean:Io,ZodDateIn:Zo,ZodDateOut:Eo,ZodNull:Po,ZodArray:Mo,ZodTuple:wo,ZodRecord:No,ZodObject:Ro,ZodLiteral:bo,ZodIntersection:xo,ZodUnion:go,ZodFile:yo,ZodUpload:fo,ZodAny:uo,ZodDefault:lo,ZodEnum:Sr,ZodNativeEnum:Sr,ZodEffects:jo,ZodOptional:To,ZodNullable:Oo,ZodDiscriminatedUnion:ho,ZodBranded:ko,ZodDate:Ao,ZodCatch:mo,ZodPipeline:Lo,ZodLazy:Uo,ZodReadonly:So},At=({schema:e,isResponse:t,prev:r})=>{if((0,$.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof T.z.ZodLazy,s=r.type!==void 0,a=t&&Ze(e),d=!n&&s&&!a&&e.isNullable(),c=n?[]:k({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...d&&{nullable:!0},...c.length>0&&{example:c[0]}}},It=({schema:e,...t})=>{throw new C({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},Zt=(e,t)=>{if((0,$.isReferenceObject)(e))return e;let r=e.properties?(0,he.omit)(t,e.properties):void 0,o=e.example?(0,he.omit)(t,e.example):void 0,n=e.required?e.required.filter(d=>!t.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>Zt(d,t)):void 0,a=e.oneOf?e.oneOf.map(d=>Zt(d,t)):void 0;return(0,he.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},d])=>d===void 0).map(([d])=>d),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},Zr=e=>(0,$.isSchemaObject)(e)?(0,he.omit)(["example"],e):e,Ct=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="response"})=>{let p=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),f=Zr(ne({schema:p,isResponse:!0,rules:Et,onEach:At,onMissing:It,serializer:n,getRef:s,makeRef:a,path:t,method:e})),x=Rr(p,!0),g=d==="components"?a(U(t,e,c),f):f;return{description:`${e.toUpperCase()} ${t} ${c}`,content:l.reduce((O,h)=>({...O,[h]:{schema:g,...x}}),{})}},Ko=()=>({type:"http",scheme:"basic"}),Fo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),$o=({name:e})=>({type:"apiKey",in:"query",name:e}),_o=({name:e})=>({type:"apiKey",in:"header",name:e}),Go=({name:e})=>({type:"apiKey",in:"cookie",name:e}),qo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Vo=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),Er=e=>{let t={basic:Ko,bearer:Fo,input:$o,header:_o,cookie:Go,openid:qo,oauth2:Vo};return Ue(e,r=>t[r.type](r))},tt=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return tt(St(e))}return tt({or:[e]})},Ar=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let c=xt(t),p=Zr(Zt(ne({schema:r.getSchema("input"),isResponse:!1,rules:Et,onEach:At,onMissing:It,serializer:o,getRef:n,makeRef:s,path:t,method:e}),c)),l=Rr(r.getSchema("input"),!1,c),f=a==="components"?s(U(t,e,d),p):p;return{description:`${e.toUpperCase()} ${t} ${d}`,content:r.getMimeTypes("input").reduce((x,g)=>({...x,[g]:{schema:f,...l}}),{})}},Ir=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),Nt=e=>e.length<=Tr?e:e.slice(0,Tr-1)+"\u2026";var rt=class extends Cr.OpenApiBuilder{constructor({routing:r,config:o,title:n,version:s,serverUrl:a,successfulResponseDescription:d="Successful response",errorResponseDescription:c="Error response",hasSummaryFromDescription:p=!0,composition:l="inline",serializer:f=je}){super();this.lastSecuritySchemaIds={};this.lastOperationIdSuffixes={};this.addInfo({title:n,version:s}).addServer({url:a}),oe({routing:r,onEndpoint:(g,O,h)=>{let Z=h,y={path:O,method:Z,endpoint:g,composition:l,serializer:f,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[w,q]=["short","long"].map(g.getDescription.bind(g)),Te=o.inputSources?.[Z]||ze[Z],Se=Pr({...y,inputSources:Te}),N={operationId:this.ensureUniqOperationId(O,Z),responses:{[g.getStatusCode("positive")]:Ct({...y,clue:d,isPositive:!0}),[g.getStatusCode("negative")]:Ct({...y,clue:c,isPositive:!1})}};q&&(N.description=q,p&&w===void 0&&(N.summary=Nt(q))),w&&(N.summary=Nt(w)),g.getTags().length>0&&(N.tags=g.getTags()),Se.length>0&&(N.parameters=Se),Te.includes("body")&&(N.requestBody=Ar(y));let Ce=tt(Ue(Er(g.getSecurity()),ut=>{let $t=this.ensureUniqSecuritySchemaName(ut),_r=["oauth2","openIdConnect"].includes(ut.type)?g.getScopes():[];return this.addSecurityScheme($t,ut),{name:$t,scopes:_r}}));Ce.length>0&&(N.security=Ce);let mt=br(O);this.addPath(mt,{[Z]:N})}}),this.rootDoc.tags=o.tags?Ir(o.tags):[]}makeRef(r,o){return this.addSchema(r,o),this.getRef(r)}getRef(r){return r in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${r}`}:void 0}ensureUniqOperationId(r,o){let n=U(r,o);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(r){let o=JSON.stringify(r);for(let n in this.rootDoc.components?.securitySchemes||{})if(o===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;return this.lastSecuritySchemaIds[r.type]=(this.lastSecuritySchemaIds?.[r.type]||0)+1,`${r.type.toUpperCase()}_${this.lastSecuritySchemaIds[r.type]}`}};var Mt=R(require("http"));var Bo=e=>({method:"GET",header:jest.fn(()=>W),...e}),Yo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:Mt.default.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=Mt.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},Nr=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=Bo(t),d=Yo(r),c={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},p={cors:!1,logger:c,...o};return await e.execute({request:a,response:d,config:p,logger:c}),{requestMock:a,responseMock:d,loggerMock:c}};var G=R(require("typescript"));var v=R(require("typescript")),i=v.default.factory,se=[i.createModifier(v.default.SyntaxKind.ExportKeyword)],Jo=[i.createModifier(v.default.SyntaxKind.AsyncKeyword)],Qo=[i.createModifier(v.default.SyntaxKind.PublicKeyword),i.createModifier(v.default.SyntaxKind.ReadonlyKeyword)],Mr=[i.createModifier(v.default.SyntaxKind.ProtectedKeyword),i.createModifier(v.default.SyntaxKind.ReadonlyKeyword)],Wo=i.createTemplateHead(""),Xo=i.createTemplateTail(""),en=i.createTemplateMiddle(" "),wt=e=>i.createTemplateLiteralType(Wo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Xo:en))),Dt=wt(["M","P"]),ot=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t),nt=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(ot(o,e[o],t)),[]),zt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),wr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),vt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),jt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],v.default.NodeFlags.Const),Lt=(e,t)=>i.createTypeAliasDeclaration(se,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),st=(e,t)=>i.createTypeAliasDeclaration(se,e,void 0,t),Dr=(e,t,r)=>i.createPropertyDeclaration(Qo,e,void 0,t,r),zr=(e,t,r=[])=>i.createClassDeclaration(se,e,void 0,void 0,[t,...r]),vr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),jr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(v.default.SyntaxKind.AnyKeyword)]),kt=(e,t,r)=>i.createInterfaceDeclaration(se,e,void 0,t,r),Lr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),kr=(e,t)=>i.createArrowFunction(Jo,void 0,e.map(r=>ot(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Ut=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,nt({acc:void 0,key:void 0}),void 0,void 0,t),r]);var u=R(require("typescript")),Fr=require("zod");var _=R(require("typescript")),{factory:it}=_.default,Ht=(e,t)=>{_.default.addSyntheticLeadingComment(e,_.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},at=(e,t,r)=>{let o=it.createTypeAliasDeclaration(void 0,it.createIdentifier(t),void 0,e);return r&&Ht(o,r),o},Ur=(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)},tn=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Hr=e=>tn.test(e)?it.createIdentifier(e):it.createStringLiteral(e);var{factory:m}=u.default,rn={[u.default.SyntaxKind.AnyKeyword]:"",[u.default.SyntaxKind.BigIntKeyword]:BigInt(0),[u.default.SyntaxKind.BooleanKeyword]:!1,[u.default.SyntaxKind.NumberKeyword]:0,[u.default.SyntaxKind.ObjectKeyword]:{},[u.default.SyntaxKind.StringKeyword]:"",[u.default.SyntaxKind.UndefinedKeyword]:void 0},on=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),nn=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let d=t&&Ze(a)?a instanceof Fr.z.ZodOptional:a.isOptional(),c=m.createPropertySignature(void 0,Hr(s),d&&o?m.createToken(u.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Ht(c,a.description),c});return m.createTypeLiteralNode(n)},sn=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),an=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),Kr=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),dn=e=>rn?.[e.kind],pn=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Le({effect:n,sample:dn(o)}),a={number:u.default.SyntaxKind.NumberKeyword,bigint:u.default.SyntaxKind.BigIntKeyword,boolean:u.default.SyntaxKind.BooleanKeyword,string:u.default.SyntaxKind.StringKeyword,undefined:u.default.SyntaxKind.UndefinedKeyword,object:u.default.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||u.default.SyntaxKind.AnyKeyword)}return o},cn=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),ln=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.default.SyntaxKind.UndefinedKeyword)]):o},mn=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),un=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),fn=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),yn=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),gn=({next:e,schema:t})=>e({schema:t._def.innerType}),Q=e=>()=>m.createKeywordTypeNode(e),hn=({next:e,schema:t})=>e({schema:t.unwrap()}),xn=({next:e,schema:t})=>e({schema:t._def.innerType}),Tn=({next:e,schema:t})=>e({schema:t._def.innerType}),Sn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),On=()=>m.createLiteralTypeNode(m.createNull()),bn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,m.createLiteralTypeNode(m.createNull())),t(s,r({schema:n.schema}))))()},Rn={ZodString:Q(u.default.SyntaxKind.StringKeyword),ZodNumber:Q(u.default.SyntaxKind.NumberKeyword),ZodBigInt:Q(u.default.SyntaxKind.BigIntKeyword),ZodBoolean:Q(u.default.SyntaxKind.BooleanKeyword),ZodDateIn:Q(u.default.SyntaxKind.StringKeyword),ZodDateOut:Q(u.default.SyntaxKind.StringKeyword),ZodNull:On,ZodArray:sn,ZodTuple:un,ZodRecord:fn,ZodObject:nn,ZodLiteral:on,ZodIntersection:yn,ZodUnion:Kr,ZodFile:Q(u.default.SyntaxKind.StringKeyword),ZodAny:Q(u.default.SyntaxKind.AnyKeyword),ZodDefault:gn,ZodEnum:an,ZodNativeEnum:cn,ZodEffects:pn,ZodOptional:ln,ZodNullable:mn,ZodDiscriminatedUnion:Kr,ZodBranded:hn,ZodCatch:Tn,ZodPipeline:Sn,ZodLazy:bn,ZodReadonly:xn},Kt=({schema:e,...t})=>ne({schema:e,rules:Rn,onMissing:()=>m.createKeywordTypeNode(u.default.SyntaxKind.AnyKeyword),...t});var dt=class{constructor({routing:t,variant:r="client",serializer:o=je,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){this.agg=[];this.registry={};this.paths=[];this.aliases={};oe({routing:t,onEndpoint:(y,w,q)=>{let Te=U(w,q,"input"),Se=U(w,q,"response"),N={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Ce=Kt({...N,schema:y.getSchema("input"),isResponse:!1}),mt=Kt({...N,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(at(Ce,Te),at(mt,Se)),q!=="options"&&(this.paths.push(w),this.registry[`${q} ${w}`]={in:Te,out:Se,isJson:y.getMimeTypes("positive").includes(W),tags:y.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=Lt("Path",this.paths),a=Lt("Method",ir),d=st("MethodPath",wt([a.name,s.name])),c=[i.createHeritageClause(G.default.SyntaxKind.ExtendsKeyword,[zt(d.name,G.default.SyntaxKind.AnyKeyword)])],p=kt("Input",c,Object.keys(this.registry).map(y=>vt(y,this.registry[y].in))),l=kt("Response",c,Object.keys(this.registry).map(y=>vt(y,this.registry[y].out)));if(this.agg.push(s,a,d,p,l),r==="types")return;let f=i.createVariableStatement(se,jt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),x=i.createVariableStatement(se,jt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(y=>i.createPropertyAssignment(`"${y}"`,i.createArrayLiteralExpression(this.registry[y].tags.map(w=>i.createStringLiteral(w)))))))),g=st("Provider",i.createFunctionTypeNode(Lr({M:a.name,P:s.name}),nt({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(p.name),Dt)}),vr(l.name,Dt))),O=st("Implementation",i.createFunctionTypeNode(void 0,nt({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(G.default.SyntaxKind.StringKeyword),params:zt(G.default.SyntaxKind.StringKeyword,G.default.SyntaxKind.AnyKeyword)}),jr())),h=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),Z=zr("ExpressZodAPIClient",wr([ot("implementation",i.createTypeReferenceNode(O.name),Mr)]),[Dr("provide",i.createTypeReferenceNode(g.name),kr(["method","path","params"],[i.createIdentifier("method"),Ut("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[h,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Ut("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[h]),G.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment("[key]",i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);G.default.addSyntheticLeadingComment(Z,G.default.SyntaxKind.MultiLineCommentTrivia,`
|
|
35
35
|
export const exampleImplementation: Implementation = async (
|
|
36
36
|
method,
|
|
37
37
|
path,
|
|
@@ -52,6 +52,6 @@ export const exampleImplementation: Implementation = async (
|
|
|
52
52
|
|
|
53
53
|
const client = new ExpressZodAPIClient(exampleImplementation);
|
|
54
54
|
client.provide("get", "/v1/user/retrieve", { id: "10" });
|
|
55
|
-
`,!0),this.agg.push(f,x,g,O,Z)}getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=
|
|
55
|
+
`,!0),this.agg.push(f,x,g,O,Z)}getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=at(r,t),this.getAlias(t)}print(t){return this.agg.map(r=>Ur(r,t)).join(`
|
|
56
56
|
|
|
57
|
-
`)}};var
|
|
57
|
+
`)}};var Ft={};_t(Ft,{dateIn:()=>Cn,dateOut:()=>Nn,file:()=>An,upload:()=>In});var P=require("zod");var Pn="ZodDateOut",ct=class ct extends P.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==P.ZodParsedType.date?((0,P.addIssueToContext)(o,{code:P.ZodIssueCode.invalid_type,expected:P.ZodParsedType.date,received:o.parsedType}),P.INVALID):ve(o.data)?{status:r.value,value:o.data.toISOString()}:((0,P.addIssueToContext)(o,{code:P.ZodIssueCode.invalid_date}),P.INVALID)}};ct.create=()=>new ct({typeName:Pn});var pt=ct;var A=require("zod");var Zn="ZodFile",En=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,xe=class xe extends A.ZodType{constructor(){super(...arguments);this.binary=r=>new xe({...this._def,checks:[...this._def.checks,{kind:"binary",...Tt(r)}]});this.base64=r=>new xe({...this._def,checks:[...this._def.checks,{kind:"base64",...Tt(r)}]})}_parse(r){let{status:o,ctx:n}=this._processInputParams(r);if(n.parsedType!==A.ZodParsedType.string)return(0,A.addIssueToContext)(n,{code:A.ZodIssueCode.invalid_type,expected:A.ZodParsedType.string,received:n.parsedType}),A.INVALID;for(let s of this._def.checks)s.kind==="base64"&&(En.test(n.data)||((0,A.addIssueToContext)(n,{code:A.ZodIssueCode.custom,message:s.message}),o.dirty()));return{status:o.value,value:n.data}}get isBinary(){return!!this._def.checks.find(r=>r.kind==="binary")}get isBase64(){return!!this._def.checks.find(r=>r.kind==="base64")}};xe.create=()=>new xe({checks:[],typeName:Zn});var lt=xe;var An=lt.create,In=ie.create,Cn=We.create,Nn=pt.create;var $r=R(require("http-errors"));0&&(module.exports={AbstractEndpoint,DependsOnMethod,DependsOnMethodError,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,OutputValidationError,RoutingError,ServeStatic,arrayEndpointsFactory,arrayResultHandler,attachRouting,createConfig,createHttpError,createLogger,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "express-zod-api",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.7.0",
|
|
4
4
|
"description": "A Typescript library to help you get an API server up and running with I/O schema validation and custom middlewares in minutes.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"scripts": {
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
"make-coverage-badge": "^1.2.0",
|
|
111
111
|
"mockdate": "^3.0.5",
|
|
112
112
|
"node-fetch": "^2.6.11",
|
|
113
|
-
"prettier": "3.0.
|
|
113
|
+
"prettier": "3.0.3",
|
|
114
114
|
"strip-ansi": "^6.0.1",
|
|
115
115
|
"ts-node": "^10.9.1",
|
|
116
116
|
"tsd": "^0.28.0",
|