express-zod-api 12.0.0-beta2 → 12.0.0-beta3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -26,6 +26,52 @@ after:
26
26
 
27
27
  ## Version 11
28
28
 
29
+ ### v11.7.0
30
+
31
+ - Good news for array lovers and those struggling with migrating legacy APIs to use this library.
32
+ - New feature: `arrayResultHandler` (and corresponding `arrayEndpointsFactory`).
33
+ - Please avoid using them for new projects: responding with array is a bad practice keeping your endpoints from
34
+ evolving without breaking changes.
35
+ - This result handler expects your endpoint to have the property named `items` in its output schema.
36
+ - The `items` property should be the `ZodArray` schema.
37
+ - The value of that property is used as the response.
38
+ - Missing the `items` property will result in internal error (status code `500`).
39
+ - The negative response schema is `z.string()`, meaning that in case of error the response will be its plain message.
40
+ - The result handler also supports examples, as well as documentation and client generation.
41
+ - Check out the [example endpoint](/example/endpoints/list-users.ts) for details.
42
+ - This version also contains a corresponding fix:
43
+ - Fixed depicting the examples in case of `z.array()` and `z.string()` as response schemas in `ResultHandler`.
44
+
45
+ ```yaml
46
+ before:
47
+ examples:
48
+ arrayResponseExample:
49
+ value:
50
+ "0":
51
+ name: Hunter Schafer
52
+ "1":
53
+ name: Laverne Cox
54
+ "2":
55
+ name: Patti Harrison
56
+ stringResponseExample:
57
+ value:
58
+ "0": S
59
+ "1": a
60
+ "2": m
61
+ "3": p
62
+ "4": l
63
+ "5": e
64
+ after:
65
+ examples:
66
+ arrayResponseExample:
67
+ value:
68
+ - name: Hunter Schafer
69
+ - name: Laverne Cox
70
+ - name: Patti Harrison
71
+ stringResponseExample:
72
+ value: Sample
73
+ ```
74
+
29
75
  ### v11.6.0
30
76
 
31
77
  - The generated client is now equipped with the `endpointTags` constant that can be involved into your implementation.
@@ -2216,7 +2262,7 @@ const fileStreamingEndpointsFactoryAfter = new EndpointsFactory(
2216
2262
  ### v2.0.0
2217
2263
 
2218
2264
  - First stable release of the v2.
2219
- - All dependencies are up to date.
2265
+ - All dependencies are up-to-date.
2220
2266
  - Minor changes of response descriptions in OpenAPI / Swagger documentation generator.
2221
2267
 
2222
2268
  ### v2.0.0-beta4
package/README.md CHANGED
@@ -35,19 +35,20 @@ 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. [Using native express middlewares](#using-native-express-middlewares)
39
- 11. [File uploads](#file-uploads)
40
- 12. [Customizing logger](#customizing-logger)
41
- 13. [Connect to your own express app](#connect-to-your-own-express-app)
42
- 14. [Multiple schemas for one route](#multiple-schemas-for-one-route)
43
- 15. [Serving static files](#serving-static-files)
44
- 16. [Customizing input sources](#customizing-input-sources)
45
- 17. [Enabling compression](#enabling-compression)
46
- 18. [Enabling HTTPS](#enabling-https)
47
- 19. [Generating a Frontend Client](#generating-a-frontend-client)
48
- 20. [Creating a documentation](#creating-a-documentation)
49
- 21. [Tagging the endpoints](#tagging-the-endpoints)
50
- 22. [How to test endpoints](#how-to-test-endpoints)
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)
51
52
  5. [Caveats](#caveats)
52
53
  1. [Coercive schema of Zod](#coercive-schema-of-zod)
53
54
  2. [Excessive properties in endpoint output](#excessive-properties-in-endpoint-output)
@@ -582,6 +583,16 @@ const fileStreamingEndpointsFactory = new EndpointsFactory(
582
583
  );
583
584
  ```
584
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
+
585
596
  ## Using native express middlewares
586
597
 
587
598
  You can connect any native `express` middleware that can be supplied to `express` method `app.use()`.
@@ -744,7 +755,7 @@ createConfig({
744
755
 
745
756
  ## Enabling compression
746
757
 
747
- According to [Express JS best practices guide](http://expressjs.com/en/advanced/best-practice-performance.html)
758
+ According to [Express.js best practices guide](http://expressjs.com/en/advanced/best-practice-performance.html)
748
759
  it might be a good idea to enable GZIP compression of your API responses. You can achieve and customize it by using the
749
760
  corresponding configuration option when using the `createServer()` method.
750
761
 
@@ -951,7 +962,7 @@ properties as needed._
951
962
 
952
963
  # Caveats
953
964
 
954
- There are some well-known issue and limitations, or third party bugs that cannot be fixed in the usual way, but you
965
+ There are some well-known issues and limitations, or third party bugs that cannot be fixed in the usual way, but you
955
966
  should be aware of them.
956
967
 
957
968
  ## Coercive schema of Zod
@@ -961,7 +972,7 @@ Despite being supported by the library, `z.coerce.*` schema
961
972
  Please be aware that `z.coerce.number()` and `z.number({ coerce: true })` (being typed not well) still will NOT allow
962
973
  you to assign anything but number. Moreover, coercive schemas are not fail-safe and their methods `.isOptional()` and
963
974
  `.isNullable()` [are buggy](https://github.com/colinhacks/zod/issues/1911). If possible, try to avoid using this type
964
- of schemas. This issue [will NOT be fixed](https://github.com/colinhacks/zod/issues/1760#issuecomment-1407816838) in
975
+ of schema. This issue [will NOT be fixed](https://github.com/colinhacks/zod/issues/1760#issuecomment-1407816838) in
965
976
  Zod version 3.x.
966
977
 
967
978
  ## Excessive properties in endpoint output
package/dist/index.d.mts CHANGED
@@ -400,6 +400,15 @@ declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
400
400
  };
401
401
  }> & any;
402
402
  }>;
403
+ /**
404
+ * @deprecated Resist the urge of using it: this handler is designed only to simplify the migration of legacy APIs.
405
+ * @desc Responding with array is a bad practice keeping your endpoints from evolving without breaking changes.
406
+ * @desc This handler expects your endpoint to have the property 'items' in the output object schema
407
+ * */
408
+ declare const arrayResultHandler: ResultHandlerDefinition<any, z.ZodString & {
409
+ _def: z.ZodStringDef & MetaDef<z.ZodString>;
410
+ example: (example: string) => z.ZodString & any;
411
+ }>;
403
412
 
404
413
  type Handler<IN, OUT, OPT> = (params: {
405
414
  input: IN;
@@ -679,6 +688,15 @@ declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
679
688
  };
680
689
  }> & any;
681
690
  }, null, {}, string, string>;
691
+ /**
692
+ * @deprecated Resist the urge of using it: this factory is designed only to simplify the migration of legacy APIs.
693
+ * @desc Responding with array is a bad practice keeping your endpoints from evolving without breaking changes.
694
+ * @desc The result handler of this factory expects your endpoint to have the property 'items' in the output schema
695
+ */
696
+ declare const arrayEndpointsFactory: EndpointsFactory<any, z.ZodString & {
697
+ _def: z.ZodStringDef & MetaDef<z.ZodString>;
698
+ example: (example: string) => z.ZodString & any;
699
+ }, null, {}, string, string>;
682
700
 
683
701
  declare function createLogger(loggerConfig: LoggerConfig): winston.Logger;
684
702
 
@@ -834,4 +852,4 @@ declare namespace proprietarySchemas {
834
852
  };
835
853
  }
836
854
 
837
- 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 };
855
+ 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.d.ts CHANGED
@@ -400,6 +400,15 @@ declare const defaultResultHandler: ResultHandlerDefinition<z.ZodObject<{
400
400
  };
401
401
  }> & any;
402
402
  }>;
403
+ /**
404
+ * @deprecated Resist the urge of using it: this handler is designed only to simplify the migration of legacy APIs.
405
+ * @desc Responding with array is a bad practice keeping your endpoints from evolving without breaking changes.
406
+ * @desc This handler expects your endpoint to have the property 'items' in the output object schema
407
+ * */
408
+ declare const arrayResultHandler: ResultHandlerDefinition<any, z.ZodString & {
409
+ _def: z.ZodStringDef & MetaDef<z.ZodString>;
410
+ example: (example: string) => z.ZodString & any;
411
+ }>;
403
412
 
404
413
  type Handler<IN, OUT, OPT> = (params: {
405
414
  input: IN;
@@ -679,6 +688,15 @@ declare const defaultEndpointsFactory: EndpointsFactory<z.ZodObject<{
679
688
  };
680
689
  }> & any;
681
690
  }, null, {}, string, string>;
691
+ /**
692
+ * @deprecated Resist the urge of using it: this factory is designed only to simplify the migration of legacy APIs.
693
+ * @desc Responding with array is a bad practice keeping your endpoints from evolving without breaking changes.
694
+ * @desc The result handler of this factory expects your endpoint to have the property 'items' in the output schema
695
+ */
696
+ declare const arrayEndpointsFactory: EndpointsFactory<any, z.ZodString & {
697
+ _def: z.ZodStringDef & MetaDef<z.ZodString>;
698
+ example: (example: string) => z.ZodString & any;
699
+ }, null, {}, string, string>;
682
700
 
683
701
  declare function createLogger(loggerConfig: LoggerConfig): winston.Logger;
684
702
 
@@ -834,4 +852,4 @@ declare namespace proprietarySchemas {
834
852
  };
835
853
  }
836
854
 
837
- 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 };
855
+ 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 br=Object.create;var Pe=Object.defineProperty;var Rr=Object.getOwnPropertyDescriptor;var Pr=Object.getOwnPropertyNames;var Zr=Object.getPrototypeOf,Er=Object.prototype.hasOwnProperty;var At=(e,t)=>{for(var r in t)Pe(e,r,{get:t[r],enumerable:!0})},It=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Pr(t))!Er.call(e,n)&&n!==r&&Pe(e,n,{get:()=>t[n],enumerable:!(o=Rr(t,n))||o.enumerable});return e};var b=(e,t,r)=>(r=e!=null?br(Zr(e)):{},It(t||!e||!e.__esModule?Pe(r,"default",{value:e,enumerable:!0}):r,e)),Ar=e=>It(Pe({},"__esModule",{value:!0}),e);var an={};At(an,{AbstractEndpoint:()=>X,DependsOnMethod:()=>ce,DependsOnMethodError:()=>se,Documentation:()=>Ke,DocumentationError:()=>C,EndpointsFactory:()=>Se,InputValidationError:()=>v,Integration:()=>qe,OutputValidationError:()=>_,RoutingError:()=>J,ServeStatic:()=>le,attachRouting:()=>Bt,createConfig:()=>Nt,createHttpError:()=>Sr.default,createLogger:()=>be,createMiddleware:()=>je,createResultHandler:()=>ot,createServer:()=>Yt,defaultEndpointsFactory:()=>Ht,defaultResultHandler:()=>W,ez:()=>Zt,getExamples:()=>$,getMessageFromError:()=>F,getStatusCodeFromError:()=>Ce,testEndpoint:()=>ar,withMeta:()=>B});module.exports=Ar(an);var Ct={silent:!0,warn:!0,debug:!0},Nt=e=>e;var L=require("zod");var zt=require("crypto"),vt=require("http-errors"),O=require("zod");var Ze=require("ramda"),Z="expressZodApiMeta",Ir=e=>{let t=e.constructor,r=(0,Ze.clone)(e._def);return r[Z]=r[Z]||{examples:[]},new t(r)},B=e=>{let t=Ir(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=B(t);return o._def[Z].examples.push(r),o}}}),t},Mt=e=>Z in e._def?typeof e._def[Z]=="object"&&e._def[Z]!==null:!1;function wt(e,t){if(!Mt(e))return;let r=e._def;return t in r[Z]?r[Z][t]:void 0}var Ee=(e,t)=>{if(!Mt(e))return t;let r=B(t),o=ge(r._def[Z].examples,e._def[Z].examples);if(r._def[Z].examples=[],o.type==="single")r._def[Z].examples=o.value;else for(let[n,s]of o.value)r._def[Z].examples.push((0,Ze.mergeDeepRight)({...n},{...s}));return r};var Dt=b(require("mime")),Y=Dt.default.getType("json")||"application/json",he="multipart/form-data";var I=require("zod"),Cr="ZodUpload",Nr=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",oe=class e extends I.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==I.ZodParsedType.object||!Nr(r.data)?((0,I.addIssueToContext)(r,{code:I.ZodIssueCode.custom,message:`Expected file upload, received ${r.parsedType}`}),I.INVALID):(0,I.OK)(r.data)}static create=()=>new e({typeName:Cr})};var Qe=/:([A-Za-z0-9_]+)/g;function Mr(e){let r=(e.header("content-type")||"").slice(0,he.length).toLowerCase()===he;return"files"in e&&r}var Ae={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},wr=["body","query","params"],We=e=>e.method.toLowerCase();function jt(e,t){let r=We(e);if(r==="options")return{};let o=wr;return r in Ae&&(o=Ae[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Mr(e):!0).reduce((n,s)=>({...n,...e[s]}),{})}function Xe(e){return typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(Ct).includes(e.level)&&typeof e.color=="boolean"}function Ie(e){return!isNaN(e.getTime())}function ne(e){return e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`)}function F(e){return e instanceof O.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof _?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message}function Ce(e){return e instanceof vt.HttpError?e.statusCode:e instanceof v?400:500}var $=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=wt(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},ge=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}};function et(e){let t=e.match(Qe);return t?t.map(r=>r.slice(1)):[]}var xe=e=>e.reduce((t,r)=>t||r,!1);function K(e){return e instanceof O.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof O.z.ZodUnion?xe(e.options.map(K)):e instanceof O.z.ZodIntersection?xe([e._def.left,e._def.right].map(K)):!1}function w(e){return e instanceof oe?!0:e instanceof O.z.ZodObject?xe(Object.values(e.shape).map(w)):e instanceof O.z.ZodUnion?xe(e.options.map(w)):e instanceof O.z.ZodIntersection?xe([e._def.left,e._def.right].map(w)):e instanceof O.z.ZodOptional||e instanceof O.z.ZodNullable?w(e.unwrap()):e instanceof O.z.ZodEffects||e instanceof O.z.ZodTransformer?w(e._def.schema):e instanceof O.z.ZodRecord?w(e._def.valueType):e instanceof O.z.ZodArray?w(e._def.type):e instanceof O.z.ZodDefault?w(e._def.innerType):!1}var Te=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,z=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Ne=e=>(0,zt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Me=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},tt=e=>typeof e=="string"?{message:e}:e||{};var J=class extends Error{name="RoutingError"},se=class extends J{name="DependsOnMethodError"},C=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
2
- Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},G=class extends Error{name="IOSchemaError"},_=class extends G{name="OutputValidationError";originalError;constructor(t){super(F(t)),this.originalError=t}},v=class extends G{name="InputValidationError";originalError;constructor(t){super(F(t)),this.originalError=t}},ie=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var j=e=>typeof e=="object"&&e!==null,we=e=>({and:e.reduce((t,r)=>t.concat(j(r)&&"and"in r?r.and:r),[])}),De=(e,t)=>{if(j(e)){if("and"in e)return{and:e.and.map(r=>j(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>j(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},rt=e=>e.and.reduce((t,r)=>{let o=ge(t.or,j(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(we),t},{or:[]}),ae=(e,t)=>{if(j(e)){if("and"in e){if(j(t)){if("and"in t)return we([e,t]);if("or"in t)return ae(rt(e),t)}return we([e,t])}if("or"in e){if(j(t)){if("and"in t)return ae(t,e);if("or"in t){let r=ge(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(we)}}}return ae(e,{and:[t]})}}return j(t)&&("and"in t||"or"in t)?ae(t,e):{and:[e,t]}};var Q=require("zod");var de={positive:200,negative:400},ot=e=>e,W=ot({getPositiveResponse:e=>{let t=$({schema:e}),r=B(Q.z.object({status:Q.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>B(Q.z.object({status:Q.z.literal("error"),error:Q.z.object({message:Q.z.string()})})).example({status:"error",error:{message:F(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(de.positive).json({status:"success",data:r});return}let a=Ce(e);a===500&&s.error(`Internal server error
3
- ${e.stack}
4
- `,{url:o.url,payload:t}),n.status(a).json({status:"error",error:{message:F(e)}})}}),ze=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
- Original error: ${e.originalError.message}.`:""))};var Lt=(e,t=[Y])=>{if(e instanceof L.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},X=class{},ve=class extends X{descriptions;methods=[];siblingMethods=[];middlewares=[];mimeTypes;statusCodes;handler;resultHandler;schemas;scopes=[];tags=[];constructor({middlewares:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,description:a,shortDescription:p,...d}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:l,schema:h})=>{if(K(h))throw new G(`Using transformations on the top level of endpoint ${l} is not allowed.`)}),this.middlewares=t;let c={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.mimeTypes={input:w(r)?[he]:[Y],positive:Lt(c.positive),negative:Lt(c.negative)},this.schemas={input:r,output:o,positive:c.positive instanceof L.z.ZodType?c.positive:c.positive.schema,negative:c.negative instanceof L.z.ZodType?c.negative:c.negative.schema},this.statusCodes={positive:c.positive instanceof L.z.ZodType?de.positive:c.positive.statusCode||de.positive,negative:c.negative instanceof L.z.ZodType?de.negative:c.negative.statusCode||de.negative},this.handler=n,this.resultHandler=s,this.descriptions={long:a,short:p},"scopes"in d&&d.scopes&&this.scopes.push(...d.scopes),"scope"in d&&d.scope&&this.scopes.push(d.scope),"tags"in d&&d.tags&&this.tags.push(...d.tags),"tag"in d&&d.tag&&this.tags.push(d.tag),"methods"in d?this.methods=d.methods:this.methods=[d.method]}_setSiblingMethods(t){this.siblingMethods=t}getDescription(t){return this.descriptions[t]}getMethods(){return this.methods}getSchema(t){return this.schemas[t]}getMimeTypes(t){return this.mimeTypes[t]}getStatusCode(t){return this.statusCodes[t]}getSecurity(){return this.middlewares.reduce((t,r)=>r.security?ae(t,r.security):t,{and:[]})}getScopes(){return this.scopes}getTags(){return this.tags}#e(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.methods.concat(this.siblingMethods).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#t(t){try{return await this.schemas.output.parseAsync(t)}catch(r){throw r instanceof L.z.ZodError?new _(r):r}}async#r({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.middlewares){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(l){throw l instanceof L.z.ZodError?new v(l):l}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#o({input:t,options:r,logger:o}){let n;try{n=await this.schemas.input.parseAsync(t)}catch(s){throw s instanceof L.z.ZodError?new v(s):s}return this.handler({input:n,options:r,logger:o})}async#n({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.resultHandler.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){ze({logger:n,response:o,error:new ie(ne(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=We(t),a,p=null;if(n.cors){let c=this.#e();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let l in c)r.set(l,c[l])}let d=jt(t,n.inputSources);try{let{options:c,isStreamClosed:l}=await this.#r({method:s,input:d,request:t,response:r,logger:o});if(l)return;if(s==="options"){r.status(200).end();return}a=await this.#t(await this.#o({input:d,options:c,logger:o}))}catch(c){p=ne(c)}await this.#n({input:d,output:a,request:t,response:r,error:p,logger:o})}};var kt=["get","post","put","delete","patch"];var nt=require("zod");var Ut=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Ee(s,n),o)};var je=e=>{if(K(e.input))throw new G("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var Se=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:nt.z.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,h=>{if(h&&h instanceof Error)return c(o(h));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(je({input:nt.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new ve({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:Ut(s,t),...n})}},Ht=new Se(W);var Kt=require("util"),pe=require("triple-beam"),Oe=b(require("winston")),{combine:Dr,colorize:zr,timestamp:vr,printf:jr}=Oe.default.format;function be(e){let t=s=>{let{[pe.LEVEL]:a,[pe.MESSAGE]:p,[pe.SPLAT]:d,...c}=s;return(0,Kt.inspect)(c,!1,1,e.color)},r=s=>jr(({timestamp:a,message:p,level:d,durationMs:c,...l})=>(typeof p=="object"&&(l={...l,...p},p="[No message]"),`${a} ${d}: ${p}`+(c===void 0?"":` duration: ${c}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[vr()],n={handleExceptions:!0};switch(e.color&&o.push(zr()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=Dr(...o),Oe.default.createLogger({silent:e.level==="silent",levels:Oe.default.config.npm.levels,transports:[new Oe.default.transports.Console(n)],exitOnError:!1})}var ce=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new se(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
1
+ "use strict";var Zr=Object.create;var Ze=Object.defineProperty;var Er=Object.getOwnPropertyDescriptor;var Ar=Object.getOwnPropertyNames;var Ir=Object.getPrototypeOf,Cr=Object.prototype.hasOwnProperty;var Ct=(e,t)=>{for(var r in t)Ze(e,r,{get:t[r],enumerable:!0})},Nt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ar(t))!Cr.call(e,n)&&n!==r&&Ze(e,n,{get:()=>t[n],enumerable:!(o=Er(t,n))||o.enumerable});return e};var b=(e,t,r)=>(r=e!=null?Zr(Ir(e)):{},Nt(t||!e||!e.__esModule?Ze(r,"default",{value:e,enumerable:!0}):r,e)),Nr=e=>Nt(Ze({},"__esModule",{value:!0}),e);var cn={};Ct(cn,{AbstractEndpoint:()=>X,DependsOnMethod:()=>le,DependsOnMethodError:()=>se,Documentation:()=>$e,DocumentationError:()=>C,EndpointsFactory:()=>pe,InputValidationError:()=>U,Integration:()=>Ye,OutputValidationError:()=>q,RoutingError:()=>Q,ServeStatic:()=>me,arrayEndpointsFactory:()=>$t,arrayResultHandler:()=>ze,attachRouting:()=>Qt,createConfig:()=>wt,createHttpError:()=>Rr.default,createLogger:()=>Re,createMiddleware:()=>ke,createResultHandler:()=>ve,createServer:()=>Wt,defaultEndpointsFactory:()=>Ft,defaultResultHandler:()=>W,ez:()=>At,getExamples:()=>L,getMessageFromError:()=>j,getStatusCodeFromError:()=>Se,testEndpoint:()=>cr,withMeta:()=>z});module.exports=Nr(cn);var Mt={silent:!0,warn:!0,debug:!0},wt=e=>e;var K=require("zod");var jt=require("http-errors"),Lt=require("crypto"),O=require("zod");var Ee=require("ramda"),Z="expressZodApiMeta",Mr=e=>{let t=e.constructor,r=(0,Ee.clone)(e._def);return r[Z]=r[Z]||{examples:[]},new t(r)},z=e=>{let t=Mr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=z(t);return o._def[Z].examples.push(r),o}}}),t},Dt=e=>Z in e._def?typeof e._def[Z]=="object"&&e._def[Z]!==null:!1;function vt(e,t){if(!Dt(e))return;let r=e._def;return t in r[Z]?r[Z][t]:void 0}var Ae=(e,t)=>{if(!Dt(e))return t;let r=z(t),o=he(r._def[Z].examples,e._def[Z].examples);if(r._def[Z].examples=[],o.type==="single")r._def[Z].examples=o.value;else for(let[n,s]of o.value)r._def[Z].examples.push((0,Ee.mergeDeepRight)({...n},{...s}));return r};var zt=b(require("mime")),J=zt.default.getType("json")||"application/json",xe="multipart/form-data";var I=require("zod"),wr="ZodUpload",Dr=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",oe=class e extends I.ZodType{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==I.ZodParsedType.object||!Dr(r.data)?((0,I.addIssueToContext)(r,{code:I.ZodIssueCode.custom,message:`Expected file upload, received ${r.parsedType}`}),I.INVALID):(0,I.OK)(r.data)}static create=()=>new e({typeName:wr})};var Xe=/:([A-Za-z0-9_]+)/g;function vr(e){let r=(e.header("content-type")||"").slice(0,xe.length).toLowerCase()===xe;return"files"in e&&r}var Ie={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},zr=["body","query","params"],et=e=>e.method.toLowerCase();function kt(e,t){let r=et(e);if(r==="options")return{};let o=zr;return r in Ie&&(o=Ie[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?vr(e):!0).reduce((n,s)=>({...n,...e[s]}),{})}function tt(e){return typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(Mt).includes(e.level)&&typeof e.color=="boolean"}function Ce(e){return!isNaN(e.getTime())}function ne(e){return e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`)}function j(e){return e instanceof O.z.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof q?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message}function Se(e){return e instanceof jt.HttpError?e.statusCode:e instanceof U?400:500}var rt=({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})},L=({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},he=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}};function ot(e){let t=e.match(Xe);return t?t.map(r=>r.slice(1)):[]}var Te=e=>e.reduce((t,r)=>t||r,!1);function G(e){return e instanceof O.z.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof O.z.ZodUnion?Te(e.options.map(G)):e instanceof O.z.ZodIntersection?Te([e._def.left,e._def.right].map(G)):!1}function D(e){return e instanceof oe?!0:e instanceof O.z.ZodObject?Te(Object.values(e.shape).map(D)):e instanceof O.z.ZodUnion?Te(e.options.map(D)):e instanceof O.z.ZodIntersection?Te([e._def.left,e._def.right].map(D)):e instanceof O.z.ZodOptional||e instanceof O.z.ZodNullable?D(e.unwrap()):e instanceof O.z.ZodEffects||e instanceof O.z.ZodTransformer?D(e._def.schema):e instanceof O.z.ZodRecord?D(e._def.valueType):e instanceof O.z.ZodArray?D(e._def.type):e instanceof O.z.ZodDefault?D(e._def.innerType):!1}var Oe=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,k=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Ne=e=>(0,Lt.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Me=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},nt=e=>typeof e=="string"?{message:e}:e||{};var Q=class extends Error{name="RoutingError"},se=class extends Q{name="DependsOnMethodError"},C=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
+ Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},V=class extends Error{name="IOSchemaError"},q=class extends V{name="OutputValidationError";originalError;constructor(t){super(j(t)),this.originalError=t}},U=class extends V{name="InputValidationError";originalError;constructor(t){super(j(t)),this.originalError=t}},ie=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var H=e=>typeof e=="object"&&e!==null,we=e=>({and:e.reduce((t,r)=>t.concat(H(r)&&"and"in r?r.and:r),[])}),De=(e,t)=>{if(H(e)){if("and"in e)return{and:e.and.map(r=>H(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>H(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},st=e=>e.and.reduce((t,r)=>{let o=he(t.or,H(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(we),t},{or:[]}),ae=(e,t)=>{if(H(e)){if("and"in e){if(H(t)){if("and"in t)return we([e,t]);if("or"in t)return ae(st(e),t)}return we([e,t])}if("or"in e){if(H(t)){if("and"in t)return ae(t,e);if("or"in t){let r=he(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(we)}}}return ae(e,{and:[t]})}}return H(t)&&("and"in t||"or"in t)?ae(t,e):{and:[e,t]}};var M=require("zod");var de={positive:200,negative:400},ve=e=>e,W=ve({getPositiveResponse:e=>{let t=L({schema:e}),r=z(M.z.object({status:M.z.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>z(M.z.object({status:M.z.literal("error"),error:M.z.object({message:M.z.string()})})).example({status:"error",error:{message:j(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(de.positive).json({status:"success",data:r});return}let a=Se(e);rt({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:j(e)}})}}),ze=ve({getPositiveResponse:e=>{let t=L({schema:e}),r=z("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:()=>z(M.z.string()).example(j(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Se(r);rt({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")}}),je=({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 Ut=(e,t=[J])=>{if(e instanceof K.z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},X=class{},Le=class extends X{descriptions;methods=[];siblingMethods=[];middlewares=[];mimeTypes;statusCodes;handler;resultHandler;schemas;scopes=[];tags=[];constructor({middlewares:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,description:a,shortDescription:p,...d}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:l,schema:h})=>{if(G(h))throw new V(`Using transformations on the top level of endpoint ${l} is not allowed.`)}),this.middlewares=t;let c={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.mimeTypes={input:D(r)?[xe]:[J],positive:Ut(c.positive),negative:Ut(c.negative)},this.schemas={input:r,output:o,positive:c.positive instanceof K.z.ZodType?c.positive:c.positive.schema,negative:c.negative instanceof K.z.ZodType?c.negative:c.negative.schema},this.statusCodes={positive:c.positive instanceof K.z.ZodType?de.positive:c.positive.statusCode||de.positive,negative:c.negative instanceof K.z.ZodType?de.negative:c.negative.statusCode||de.negative},this.handler=n,this.resultHandler=s,this.descriptions={long:a,short:p},"scopes"in d&&d.scopes&&this.scopes.push(...d.scopes),"scope"in d&&d.scope&&this.scopes.push(d.scope),"tags"in d&&d.tags&&this.tags.push(...d.tags),"tag"in d&&d.tag&&this.tags.push(d.tag),"methods"in d?this.methods=d.methods:this.methods=[d.method]}_setSiblingMethods(t){this.siblingMethods=t}getDescription(t){return this.descriptions[t]}getMethods(){return this.methods}getSchema(t){return this.schemas[t]}getMimeTypes(t){return this.mimeTypes[t]}getStatusCode(t){return this.statusCodes[t]}getSecurity(){return this.middlewares.reduce((t,r)=>r.security?ae(t,r.security):t,{and:[]})}getScopes(){return this.scopes}getTags(){return this.tags}#e(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.methods.concat(this.siblingMethods).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#t(t){try{return await this.schemas.output.parseAsync(t)}catch(r){throw r instanceof K.z.ZodError?new q(r):r}}async#r({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.middlewares){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(l){throw l instanceof K.z.ZodError?new U(l):l}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#o({input:t,options:r,logger:o}){let n;try{n=await this.schemas.input.parseAsync(t)}catch(s){throw s instanceof K.z.ZodError?new U(s):s}return this.handler({input:n,options:r,logger:o})}async#n({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.resultHandler.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){je({logger:n,response:o,error:new ie(ne(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=et(t),a,p=null;if(n.cors){let c=this.#e();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let l in c)r.set(l,c[l])}let d=kt(t,n.inputSources);try{let{options:c,isStreamClosed:l}=await this.#r({method:s,input:d,request:t,response:r,logger:o});if(l)return;if(s==="options"){r.status(200).end();return}a=await this.#t(await this.#o({input:d,options:c,logger:o}))}catch(c){p=ne(c)}await this.#n({input:d,output:a,request:t,response:r,error:p,logger:o})}};var Ht=["get","post","put","delete","patch"];var it=require("zod");var Kt=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>Ae(s,n),o)};var ke=e=>{if(G(e.input))throw new V("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var pe=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:it.z.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,h=>{if(h&&h instanceof Error)return c(o(h));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(ke({input:it.z.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new Le({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:Kt(s,t),...n})}},Ft=new pe(W),$t=new pe(ze);var _t=require("util"),ce=require("triple-beam"),be=b(require("winston")),{combine:jr,colorize:Lr,timestamp:kr,printf:Ur}=be.default.format;function Re(e){let t=s=>{let{[ce.LEVEL]:a,[ce.MESSAGE]:p,[ce.SPLAT]:d,...c}=s;return(0,_t.inspect)(c,!1,1,e.color)},r=s=>Ur(({timestamp:a,message:p,level:d,durationMs:c,...l})=>(typeof p=="object"&&(l={...l,...p},p="[No message]"),`${a} ${d}: ${p}`+(c===void 0?"":` duration: ${c}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[kr()],n={handleExceptions:!0};switch(e.color&&o.push(Lr()),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=jr(...o),be.default.createLogger({silent:e.level==="silent",levels:be.default.config.npm.levels,transports:[new be.default.transports.Console(n)],exitOnError:!1})}var le=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new se(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
6
6
  This error should prevent mistakes during the development process.
7
7
  Example:
8
8
 
@@ -13,8 +13,8 @@ new ${this.constructor.name}({
13
13
  ...
14
14
  })
15
15
  });
16
- `)})}};var Ft=b(require("express")),le=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Ft.default.static(...this.params))}};var ee=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new J(`Routing elements should not contain '/' character.
17
- The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof X){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof le)r&&a.apply(p,r);else if(a instanceof ce){if(Object.entries(a.methods).forEach(([d,c])=>{t(c,p,d)}),n&&Object.keys(a.methods).length>0){let[d,...c]=Object.keys(a.methods),l=a.methods[d];l._setSiblingMethods(c),t(l,p,"options")}}else ee({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var $t=()=>`
16
+ `)})}};var Gt=b(require("express")),me=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,Gt.default.static(...this.params))}};var ee=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new Q(`Routing elements should not contain '/' character.
17
+ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof X){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof me)r&&a.apply(p,r);else if(a instanceof le){if(Object.entries(a.methods).forEach(([d,c])=>{t(c,p,d)}),n&&Object.keys(a.methods).length>0){let[d,...c]=Object.keys(a.methods),l=a.methods[d];l._setSiblingMethods(c),t(l,p,"options")}}else ee({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var 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 st=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log($t()),ee({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var Le=b(require("express")),_t=b(require("compression")),Gt=b(require("express-fileupload")),Vt=b(require("https"));var it=b(require("http-errors")),Lr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,it.default)(400,ne(r).message),request:o,response:n,logger:t,input:o.body,output:null})},qt=(e,t)=>(r,o)=>{let n=(0,it.default)(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){ze({response:o,logger:t,error:new ie(ne(s).message,n)})}};function Bt(e,t){let r=Xe(e.logger)?be(e.logger):e.logger;st({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||W;return{notFoundHandler:qt(o,r),logger:r}}function Yt(e,t){let r=Xe(e.logger)?be(e.logger):e.logger,o=(0,Le.default)();o.disable("x-powered-by");let n=e.errorHandler||W,s=e.server.compression?(0,_t.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,Le.json)(),p=e.server.upload?(0,Gt.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use(Lr(n,r)),st({app:o,routing:t,logger:r,config:e}),o.use(qt(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=Vt.default.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}}var ir=require("openapi3-ts/oas30");var k=require("openapi3-ts/oas30"),me=require("ramda"),x=require("zod");var T=require("zod");var at=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,kr="ZodDateIn",ke=class e extends T.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==T.ZodParsedType.string)return(0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_type,expected:T.ZodParsedType.string,received:o.parsedType}),T.INVALID;at.test(o.data)||((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ie(n)?{status:r.value,value:n}:((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_date}),T.INVALID)}static create=()=>new e({typeName:kr})};var te=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>te({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var Jt=50,Wt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Ur={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Xt=e=>e.replace(Qe,t=>`{${t.slice(1)}}`),Hr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Kr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Fr=()=>({format:"any"}),$r=e=>{if(e.isResponse)throw new C({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},_r=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new C({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},Gr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Vr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),qr=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Br=({schema:e,next:t})=>t({schema:e.unwrap()}),Yr=({schema:e,next:t})=>t({schema:e._def.innerType}),Jr=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Qt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),Qr=({schema:{value:e}})=>({type:typeof e,enum:[e]}),Wr=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Te(s)?s instanceof x.z.ZodOptional:s.isOptional())});return{type:"object",properties:Ue({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},Xr=()=>({type:"string",nullable:!0,format:"null"}),eo=e=>{if(e.isResponse)throw new C({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:at.source,externalDocs:{url:Wt}}},to=e=>{if(!e.isResponse)throw new C({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Wt}}},ro=e=>{throw new C({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},oo=()=>({type:"boolean"}),no=()=>({type:"integer",format:"bigint"}),so=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.z.ZodEnum||e instanceof x.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ue({schema:x.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.z.ZodLiteral)return{type:"object",properties:Ue({schema:x.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.z.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.z.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ue({schema:x.z.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},io=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),ao=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${(0,k.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},po=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:h}}})=>{let g=h.find(f=>f.kind==="regex"),S=h.find(f=>f.kind==="datetime"),P=g?g.regex:S?S.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...P&&{pattern:`/${P.source}/${P.flags}`}}},co=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ue=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),lo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Ur?.[t]},mo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,k.isSchemaObject)(o)){let s=Me({effect:n,sample:lo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.z.any()})}if(!t&&n.type==="preprocess"&&(0,k.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},uo=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),fo=({schema:e,next:t})=>t({schema:e.unwrap()}),yo=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},er=(e,t,r=[])=>{let o=$({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:(0,me.omit)(r,s)}}),{})}},go=(e,t,r)=>{let o=$({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function Re(e,t){if(e instanceof x.z.ZodObject)return e;let r;if(e instanceof x.z.ZodUnion||e instanceof x.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Re(o,t)).reduce((o,n)=>o.merge(n.partial()),x.z.object({}));else if(e instanceof x.z.ZodEffects){if(K(e))throw new C({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Re(e._def.schema,t)}else r=Re(e._def.left,t).merge(Re(e._def.right,t));return Ee(e,r)}var tr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=Re(c,{path:e,method:t,isResponse:!1}).shape,h=et(e),g=o.includes("query"),S=o.includes("params"),P=f=>S&&h.includes(f);return Object.keys(l).filter(f=>g||P(f)).map(f=>{let A=te({schema:l[f],isResponse:!1,rules:pt,onEach:ct,onMissing:lt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),y=p==="components"?a(z(e,t,`${d} ${f}`),A):A;return{name:f,in:P(f)?"path":"query",required:!l[f].isOptional(),description:(0,k.isSchemaObject)(A)&&A.description||`${t.toUpperCase()} ${e} ${d}`,schema:y,...go(c,!1,f)}})},pt={ZodString:po,ZodNumber:co,ZodBigInt:no,ZodBoolean:oo,ZodDateIn:eo,ZodDateOut:to,ZodNull:Xr,ZodArray:io,ZodTuple:ao,ZodRecord:so,ZodObject:Wr,ZodLiteral:Qr,ZodIntersection:qr,ZodUnion:Gr,ZodFile:_r,ZodUpload:$r,ZodAny:Fr,ZodDefault:Hr,ZodEnum:Qt,ZodNativeEnum:Qt,ZodEffects:mo,ZodOptional:Br,ZodNullable:Jr,ZodDiscriminatedUnion:Vr,ZodBranded:fo,ZodDate:ro,ZodCatch:Kr,ZodPipeline:uo,ZodLazy:yo,ZodReadonly:Yr},ct=({schema:e,isResponse:t,prev:r})=>{if((0,k.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof x.z.ZodLazy,s=r.type!==void 0,a=t&&Te(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:$({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},lt=({schema:e,...t})=>{throw new C({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},dt=(e,t)=>{if((0,k.isReferenceObject)(e))return e;let r=e.properties?(0,me.omit)(t,e.properties):void 0,o=e.example?(0,me.omit)(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>dt(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>dt(p,t)):void 0;return(0,me.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},rr=e=>(0,k.isSchemaObject)(e)?(0,me.omit)(["example"],e):e,mt=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),h=rr(te({schema:c,isResponse:!0,rules:pt,onEach:ct,onMissing:lt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),g=er(c,!0),S=p==="components"?a(z(t,e,d),h):h;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((P,f)=>({...P,[f]:{schema:S,...g}}),{})}},ho=()=>({type:"http",scheme:"basic"}),xo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),To=({name:e})=>({type:"apiKey",in:"query",name:e}),So=({name:e})=>({type:"apiKey",in:"header",name:e}),Oo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),bo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Ro=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),or=e=>{let t={basic:ho,bearer:xo,input:To,header:So,cookie:Oo,openid:bo,oauth2:Ro};return De(e,r=>t[r.type](r))},He=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return He(rt(e))}return He({or:[e]})},nr=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=et(t),c=rr(dt(te({schema:r.getSchema("input"),isResponse:!1,rules:pt,onEach:ct,onMissing:lt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=er(r.getSchema("input"),!1,d),h=a==="components"?s(z(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((g,S)=>({...g,[S]:{schema:h,...l}}),{})}},sr=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),ut=e=>e.length<=Jt?e:e.slice(0,Jt-1)+"\u2026";var Ke=class extends ir.OpenApiBuilder{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r){let o=z(t,r);return o in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[o]++,`${o}${this.lastOperationIdSuffixes[o]}`):(this.lastOperationIdSuffixes[o]=1,o)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Ne}){super(),this.addInfo({title:o,version:n}).addServer({url:s}),ee({routing:t,onEndpoint:(g,S,P)=>{let f=P,A={path:S,method:f,endpoint:g,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[y,M]=["short","long"].map(g.getDescription.bind(g)),q=r.inputSources?.[f]||Ae[f],ue=tr({...A,inputSources:q}),N={operationId:this.ensureUniqOperationId(S,f),responses:{[g.getStatusCode("positive")]:mt({...A,clue:a,isPositive:!0}),[g.getStatusCode("negative")]:mt({...A,clue:p,isPositive:!1})}};M&&(N.description=M,d&&y===void 0&&(N.summary=ut(M))),y&&(N.summary=ut(y)),g.getTags().length>0&&(N.tags=g.getTags()),ue.length>0&&(N.parameters=ue),q.includes("body")&&(N.requestBody=nr(A));let fe=He(De(or(g.getSecurity()),ye=>{let Et=this.ensureUniqSecuritySchemaName(ye),Or=["oauth2","openIdConnect"].includes(ye.type)?g.getScopes():[];return this.addSecurityScheme(Et,ye),{name:Et,scopes:Or}}));fe.length>0&&(N.security=fe);let Je=Xt(S);this.addPath(Je,{[f]:N})}}),this.rootDoc.tags=r.tags?sr(r.tags):[]}};var ft=b(require("http"));var Po=e=>({method:"GET",header:jest.fn(()=>Y),...e}),Zo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:ft.default.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=ft.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},ar=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=Po(t),p=Zo(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};var H=b(require("typescript"));var D=b(require("typescript")),i=D.default.factory,re=[i.createModifier(D.default.SyntaxKind.ExportKeyword)],Eo=[i.createModifier(D.default.SyntaxKind.AsyncKeyword)],Ao=[i.createModifier(D.default.SyntaxKind.PublicKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],dr=[i.createModifier(D.default.SyntaxKind.ProtectedKeyword),i.createModifier(D.default.SyntaxKind.ReadonlyKeyword)],Io=i.createTemplateHead(""),Co=i.createTemplateTail(""),No=i.createTemplateMiddle(" "),yt=e=>i.createTemplateLiteralType(Io,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Co:No))),gt=yt(["M","P"]),Fe=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),$e=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Fe(o,e[o],t)),[]),ht=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),pr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),xt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),Tt=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],D.default.NodeFlags.Const),St=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),_e=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,t),cr=(e,t,r)=>i.createPropertyDeclaration(Ao,e,void 0,t,r),lr=(e,t,r=[])=>i.createClassDeclaration(re,e,void 0,void 0,[t,...r]),mr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),ur=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(D.default.SyntaxKind.AnyKeyword)]),Ot=(e,t,r)=>i.createInterfaceDeclaration(re,e,void 0,t,r),fr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),yr=(e,t)=>i.createArrowFunction(Eo,void 0,e.map(r=>Fe(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),bt=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,$e({acc:void 0,key:void 0}),void 0,void 0,t),r]);var u=b(require("typescript")),Tr=require("zod");var U=b(require("typescript")),{factory:Ge}=U.default,Rt=(e,t)=>{U.default.addSyntheticLeadingComment(e,U.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Ve=(e,t,r)=>{let o=Ge.createTypeAliasDeclaration(void 0,Ge.createIdentifier(t),void 0,e);return r&&Rt(o,r),o},gr=(e,t)=>{let r=U.default.createSourceFile("print.ts","",U.default.ScriptTarget.Latest,!1,U.default.ScriptKind.TS);return U.default.createPrinter(t).printNode(U.default.EmitHint.Unspecified,e,r)},Mo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,hr=e=>Mo.test(e)?Ge.createIdentifier(e):Ge.createStringLiteral(e);var{factory:m}=u.default,wo={[u.default.SyntaxKind.AnyKeyword]:"",[u.default.SyntaxKind.BigIntKeyword]:BigInt(0),[u.default.SyntaxKind.BooleanKeyword]:!1,[u.default.SyntaxKind.NumberKeyword]:0,[u.default.SyntaxKind.ObjectKeyword]:{},[u.default.SyntaxKind.StringKeyword]:"",[u.default.SyntaxKind.UndefinedKeyword]:void 0},Do=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),zo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Te(a)?a instanceof Tr.z.ZodOptional:a.isOptional(),d=m.createPropertySignature(void 0,hr(s),p&&o?m.createToken(u.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Rt(d,a.description),d});return m.createTypeLiteralNode(n)},vo=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),jo=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),xr=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),Lo=e=>wo?.[e.kind],ko=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Me({effect:n,sample:Lo(o)}),a={number:u.default.SyntaxKind.NumberKeyword,bigint:u.default.SyntaxKind.BigIntKeyword,boolean:u.default.SyntaxKind.BooleanKeyword,string:u.default.SyntaxKind.StringKeyword,undefined:u.default.SyntaxKind.UndefinedKeyword,object:u.default.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||u.default.SyntaxKind.AnyKeyword)}return o},Uo=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),Ho=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.default.SyntaxKind.UndefinedKeyword)]):o},Ko=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),Fo=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),$o=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),_o=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Go=({next:e,schema:t})=>e({schema:t._def.innerType}),V=e=>()=>m.createKeywordTypeNode(e),Vo=({next:e,schema:t})=>e({schema:t.unwrap()}),qo=({next:e,schema:t})=>e({schema:t._def.innerType}),Bo=({next:e,schema:t})=>e({schema:t._def.innerType}),Yo=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),Jo=()=>m.createLiteralTypeNode(m.createNull()),Qo=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,m.createLiteralTypeNode(m.createNull())),t(s,r({schema:n.schema}))))()},Wo={ZodString:V(u.default.SyntaxKind.StringKeyword),ZodNumber:V(u.default.SyntaxKind.NumberKeyword),ZodBigInt:V(u.default.SyntaxKind.BigIntKeyword),ZodBoolean:V(u.default.SyntaxKind.BooleanKeyword),ZodDateIn:V(u.default.SyntaxKind.StringKeyword),ZodDateOut:V(u.default.SyntaxKind.StringKeyword),ZodNull:Jo,ZodArray:vo,ZodTuple:Fo,ZodRecord:$o,ZodObject:zo,ZodLiteral:Do,ZodIntersection:_o,ZodUnion:xr,ZodFile:V(u.default.SyntaxKind.StringKeyword),ZodAny:V(u.default.SyntaxKind.AnyKeyword),ZodDefault:Go,ZodEnum:jo,ZodNativeEnum:Uo,ZodEffects:ko,ZodOptional:Ho,ZodNullable:Ko,ZodDiscriminatedUnion:xr,ZodBranded:Vo,ZodCatch:Bo,ZodPipeline:Yo,ZodLazy:Qo,ZodReadonly:qo},Pt=({schema:e,...t})=>te({schema:e,rules:Wo,onMissing:()=>m.createKeywordTypeNode(u.default.SyntaxKind.AnyKeyword),...t});var qe=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=Ve(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Ne,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(y,M,q)=>{let ue=z(M,q,"input"),N=z(M,q,"response"),fe={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Je=Pt({...fe,schema:y.getSchema("input"),isResponse:!1}),ye=Pt({...fe,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(Ve(Je,ue),Ve(ye,N)),q!=="options"&&(this.paths.push(M),this.registry[`${q} ${M}`]={in:ue,out:N,isJson:y.getMimeTypes("positive").includes(Y),tags:y.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=St("Path",this.paths),a=St("Method",kt),p=_e("MethodPath",yt([a.name,s.name])),d=[i.createHeritageClause(H.default.SyntaxKind.ExtendsKeyword,[ht(p.name,H.default.SyntaxKind.AnyKeyword)])],c=Ot("Input",d,Object.keys(this.registry).map(y=>xt(y,this.registry[y].in))),l=Ot("Response",d,Object.keys(this.registry).map(y=>xt(y,this.registry[y].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let h=i.createVariableStatement(re,Tt("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),g=i.createVariableStatement(re,Tt("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(y=>i.createPropertyAssignment(`"${y}"`,i.createArrayLiteralExpression(this.registry[y].tags.map(M=>i.createStringLiteral(M)))))))),S=_e("Provider",i.createFunctionTypeNode(fr({M:a.name,P:s.name}),$e({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),gt)}),mr(l.name,gt))),P=_e("Implementation",i.createFunctionTypeNode(void 0,$e({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(H.default.SyntaxKind.StringKeyword),params:ht(H.default.SyntaxKind.StringKeyword,H.default.SyntaxKind.AnyKeyword)}),ur())),f=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),A=lr("ExpressZodAPIClient",pr([Fe("implementation",i.createTypeReferenceNode(P.name),dr)]),[cr("provide",i.createTypeReferenceNode(S.name),yr(["method","path","params"],[i.createIdentifier("method"),bt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[f,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),bt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[f]),H.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);H.default.addSyntheticLeadingComment(A,H.default.SyntaxKind.MultiLineCommentTrivia,`
34
+ `.trim();var at=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(qt()),ee({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};var Ue=b(require("express")),Vt=b(require("compression")),Bt=b(require("express-fileupload")),Yt=b(require("https"));var dt=b(require("http-errors")),Hr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:(0,dt.default)(400,ne(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Jt=(e,t)=>(r,o)=>{let n=(0,dt.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){je({response:o,logger:t,error:new ie(ne(s).message,n)})}};function Qt(e,t){let r=tt(e.logger)?Re(e.logger):e.logger;at({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||W;return{notFoundHandler:Jt(o,r),logger:r}}function Wt(e,t){let r=tt(e.logger)?Re(e.logger):e.logger,o=(0,Ue.default)();o.disable("x-powered-by");let n=e.errorHandler||W,s=e.server.compression?(0,Vt.default)({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||(0,Ue.json)(),p=e.server.upload?(0,Bt.default)({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use(Hr(n,r)),at({app:o,routing:t,logger:r,config:e}),o.use(Jt(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=Yt.default.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}}var pr=require("openapi3-ts/oas30");var F=require("openapi3-ts/oas30"),ue=require("ramda"),x=require("zod");var T=require("zod");var pt=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Kr="ZodDateIn",He=class e extends T.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==T.ZodParsedType.string)return(0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_type,expected:T.ZodParsedType.string,received:o.parsedType}),T.INVALID;pt.test(o.data)||((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return Ce(n)?{status:r.value,value:n}:((0,T.addIssueToContext)(o,{code:T.ZodIssueCode.invalid_date}),T.INVALID)}static create=()=>new e({typeName:Kr})};var te=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>te({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var Xt=50,tr="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Fr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},rr=e=>e.replace(Xe,t=>`{${t.slice(1)}}`),$r=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),_r=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Gr=()=>({format:"any"}),qr=e=>{if(e.isResponse)throw new C({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Vr=({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"}},Br=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Yr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),Jr=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),Qr=({schema:e,next:t})=>t({schema:e.unwrap()}),Wr=({schema:e,next:t})=>t({schema:e._def.innerType}),Xr=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),er=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),eo=({schema:{value:e}})=>({type:typeof e,enum:[e]}),to=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&Oe(s)?s instanceof x.z.ZodOptional:s.isOptional())});return{type:"object",properties:Ke({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},ro=()=>({type:"string",nullable:!0,format:"null"}),oo=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:tr}}},no=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:tr}}},so=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"}),ao=()=>({type:"integer",format:"bigint"}),po=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.z.ZodEnum||e instanceof x.z.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ke({schema:x.z.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.z.ZodLiteral)return{type:"object",properties:Ke({schema:x.z.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.z.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.z.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ke({schema:x.z.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},co=({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}}),lo=({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,F.isSchemaObject)(o)?o.type:o.$ref}`).join(", ")}}}},mo=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:h}}})=>{let g=h.find(f=>f.kind==="regex"),S=h.find(f=>f.kind==="datetime"),P=g?g.regex:S?S.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...P&&{pattern:`/${P.source}/${P.flags}`}}},uo=({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]})}),{}),fo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Fr?.[t]},yo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&(0,F.isSchemaObject)(o)){let s=Me({effect:n,sample:fo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.z.any()})}if(!t&&n.type==="preprocess"&&(0,F.isSchemaObject)(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},go=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),ho=({schema:e,next:t})=>t({schema:e.unwrap()}),xo=({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}))))()},or=(e,t,r=[])=>{let o=L({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,ue.omit)(r,s):s}}),{})}},To=(e,t,r)=>{let o=L({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 Pe(e,t){if(e instanceof x.z.ZodObject)return e;let r;if(e instanceof x.z.ZodUnion||e instanceof x.z.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>Pe(o,t)).reduce((o,n)=>o.merge(n.partial()),x.z.object({}));else if(e instanceof x.z.ZodEffects){if(G(e))throw new C({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=Pe(e._def.schema,t)}else r=Pe(e._def.left,t).merge(Pe(e._def.right,t));return Ae(e,r)}var nr=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=Pe(c,{path:e,method:t,isResponse:!1}).shape,h=ot(e),g=o.includes("query"),S=o.includes("params"),P=f=>S&&h.includes(f);return Object.keys(l).filter(f=>g||P(f)).map(f=>{let A=te({schema:l[f],isResponse:!1,rules:lt,onEach:mt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:e,method:t}),y=p==="components"?a(k(e,t,`${d} ${f}`),A):A;return{name:f,in:P(f)?"path":"query",required:!l[f].isOptional(),description:(0,F.isSchemaObject)(A)&&A.description||`${t.toUpperCase()} ${e} ${d}`,schema:y,...To(c,!1,f)}})},lt={ZodString:mo,ZodNumber:uo,ZodBigInt:ao,ZodBoolean:io,ZodDateIn:oo,ZodDateOut:no,ZodNull:ro,ZodArray:co,ZodTuple:lo,ZodRecord:po,ZodObject:to,ZodLiteral:eo,ZodIntersection:Jr,ZodUnion:Br,ZodFile:Vr,ZodUpload:qr,ZodAny:Gr,ZodDefault:$r,ZodEnum:er,ZodNativeEnum:er,ZodEffects:yo,ZodOptional:Qr,ZodNullable:Xr,ZodDiscriminatedUnion:Yr,ZodBranded:ho,ZodDate:so,ZodCatch:_r,ZodPipeline:go,ZodLazy:xo,ZodReadonly:Wr},mt=({schema:e,isResponse:t,prev:r})=>{if((0,F.isReferenceObject)(r))return{};let{description:o}=e,n=e instanceof x.z.ZodLazy,s=r.type!==void 0,a=t&&Oe(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:L({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},ut=({schema:e,...t})=>{throw new C({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},ct=(e,t)=>{if((0,F.isReferenceObject)(e))return e;let r=e.properties?(0,ue.omit)(t,e.properties):void 0,o=e.example?(0,ue.omit)(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>ct(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>ct(p,t)):void 0;return(0,ue.omit)(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},sr=e=>(0,F.isSchemaObject)(e)?(0,ue.omit)(["example"],e):e,ft=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),h=sr(te({schema:c,isResponse:!0,rules:lt,onEach:mt,onMissing:ut,serializer:n,getRef:s,makeRef:a,path:t,method:e})),g=or(c,!0),S=p==="components"?a(k(t,e,d),h):h;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((P,f)=>({...P,[f]:{schema:S,...g}}),{})}},So=()=>({type:"http",scheme:"basic"}),Oo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),bo=({name:e})=>({type:"apiKey",in:"query",name:e}),Ro=({name:e})=>({type:"apiKey",in:"header",name:e}),Po=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Zo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Eo=({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}}},{})}),ir=e=>{let t={basic:So,bearer:Oo,input:bo,header:Ro,cookie:Po,openid:Zo,oauth2:Eo};return De(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]})},ar=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=ot(t),c=sr(ct(te({schema:r.getSchema("input"),isResponse:!1,rules:lt,onEach:mt,onMissing:ut,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=or(r.getSchema("input"),!1,d),h=a==="components"?s(k(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((g,S)=>({...g,[S]:{schema:h,...l}}),{})}},dr=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}}}}),yt=e=>e.length<=Xt?e:e.slice(0,Xt-1)+"\u2026";var $e=class extends pr.OpenApiBuilder{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r){let o=k(t,r);return o in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[o]++,`${o}${this.lastOperationIdSuffixes[o]}`):(this.lastOperationIdSuffixes[o]=1,o)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Ne}){super(),this.addInfo({title:o,version:n}).addServer({url:s}),ee({routing:t,onEndpoint:(g,S,P)=>{let f=P,A={path:S,method:f,endpoint:g,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[y,w]=["short","long"].map(g.getDescription.bind(g)),Y=r.inputSources?.[f]||Ie[f],fe=nr({...A,inputSources:Y}),N={operationId:this.ensureUniqOperationId(S,f),responses:{[g.getStatusCode("positive")]:ft({...A,clue:a,isPositive:!0}),[g.getStatusCode("negative")]:ft({...A,clue:p,isPositive:!1})}};w&&(N.description=w,d&&y===void 0&&(N.summary=yt(w))),y&&(N.summary=yt(y)),g.getTags().length>0&&(N.tags=g.getTags()),fe.length>0&&(N.parameters=fe),Y.includes("body")&&(N.requestBody=ar(A));let ye=Fe(De(ir(g.getSecurity()),ge=>{let It=this.ensureUniqSecuritySchemaName(ge),Pr=["oauth2","openIdConnect"].includes(ge.type)?g.getScopes():[];return this.addSecurityScheme(It,ge),{name:It,scopes:Pr}}));ye.length>0&&(N.security=ye);let We=rr(S);this.addPath(We,{[f]:N})}}),this.rootDoc.tags=r.tags?dr(r.tags):[]}};var gt=b(require("http"));var Ao=e=>({method:"GET",header:jest.fn(()=>J),...e}),Io=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:gt.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=gt.default.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},cr=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=Ao(t),p=Io(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};var _=b(require("typescript"));var v=b(require("typescript")),i=v.default.factory,re=[i.createModifier(v.default.SyntaxKind.ExportKeyword)],Co=[i.createModifier(v.default.SyntaxKind.AsyncKeyword)],No=[i.createModifier(v.default.SyntaxKind.PublicKeyword),i.createModifier(v.default.SyntaxKind.ReadonlyKeyword)],lr=[i.createModifier(v.default.SyntaxKind.ProtectedKeyword),i.createModifier(v.default.SyntaxKind.ReadonlyKeyword)],Mo=i.createTemplateHead(""),wo=i.createTemplateTail(""),Do=i.createTemplateMiddle(" "),ht=e=>i.createTemplateLiteralType(Mo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?wo:Do))),xt=ht(["M","P"]),_e=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Ge=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(_e(o,e[o],t)),[]),Tt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),mr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),St=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),Ot=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],v.default.NodeFlags.Const),bt=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),qe=(e,t)=>i.createTypeAliasDeclaration(re,e,void 0,t),ur=(e,t,r)=>i.createPropertyDeclaration(No,e,void 0,t,r),fr=(e,t,r=[])=>i.createClassDeclaration(re,e,void 0,void 0,[t,...r]),yr=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),gr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(v.default.SyntaxKind.AnyKeyword)]),Rt=(e,t,r)=>i.createInterfaceDeclaration(re,e,void 0,t,r),hr=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),xr=(e,t)=>i.createArrowFunction(Co,void 0,e.map(r=>_e(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),Pt=(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]);var u=b(require("typescript")),br=require("zod");var $=b(require("typescript")),{factory:Ve}=$.default,Zt=(e,t)=>{$.default.addSyntheticLeadingComment(e,$.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},Be=(e,t,r)=>{let o=Ve.createTypeAliasDeclaration(void 0,Ve.createIdentifier(t),void 0,e);return r&&Zt(o,r),o},Tr=(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)},vo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Sr=e=>vo.test(e)?Ve.createIdentifier(e):Ve.createStringLiteral(e);var{factory:m}=u.default,zo={[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},jo=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),Lo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&Oe(a)?a instanceof br.z.ZodOptional:a.isOptional(),d=m.createPropertySignature(void 0,Sr(s),p&&o?m.createToken(u.default.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&Zt(d,a.description),d});return m.createTypeLiteralNode(n)},ko=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),Uo=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),Or=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),Ho=e=>zo?.[e.kind],Ko=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Me({effect:n,sample:Ho(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},Fo=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),$o=({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},_o=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),Go=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),qo=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),Vo=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),Bo=({next:e,schema:t})=>e({schema:t._def.innerType}),B=e=>()=>m.createKeywordTypeNode(e),Yo=({next:e,schema:t})=>e({schema:t.unwrap()}),Jo=({next:e,schema:t})=>e({schema:t._def.innerType}),Qo=({next:e,schema:t})=>e({schema:t._def.innerType}),Wo=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),Xo=()=>m.createLiteralTypeNode(m.createNull()),en=({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}))))()},tn={ZodString:B(u.default.SyntaxKind.StringKeyword),ZodNumber:B(u.default.SyntaxKind.NumberKeyword),ZodBigInt:B(u.default.SyntaxKind.BigIntKeyword),ZodBoolean:B(u.default.SyntaxKind.BooleanKeyword),ZodDateIn:B(u.default.SyntaxKind.StringKeyword),ZodDateOut:B(u.default.SyntaxKind.StringKeyword),ZodNull:Xo,ZodArray:ko,ZodTuple:Go,ZodRecord:qo,ZodObject:Lo,ZodLiteral:jo,ZodIntersection:Vo,ZodUnion:Or,ZodFile:B(u.default.SyntaxKind.StringKeyword),ZodAny:B(u.default.SyntaxKind.AnyKeyword),ZodDefault:Bo,ZodEnum:Uo,ZodNativeEnum:Fo,ZodEffects:Ko,ZodOptional:$o,ZodNullable:_o,ZodDiscriminatedUnion:Or,ZodBranded:Yo,ZodCatch:Qo,ZodPipeline:Wo,ZodLazy:en,ZodReadonly:Jo},Et=({schema:e,...t})=>te({schema:e,rules:tn,onMissing:()=>m.createKeywordTypeNode(u.default.SyntaxKind.AnyKeyword),...t});var Ye=class{agg=[];registry={};paths=[];aliases={};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)}constructor({routing:t,variant:r="client",serializer:o=Ne,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){ee({routing:t,onEndpoint:(y,w,Y)=>{let fe=k(w,Y,"input"),N=k(w,Y,"response"),ye={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},We=Et({...ye,schema:y.getSchema("input"),isResponse:!1}),ge=Et({...ye,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(Be(We,fe),Be(ge,N)),Y!=="options"&&(this.paths.push(w),this.registry[`${Y} ${w}`]={in:fe,out:N,isJson:y.getMimeTypes("positive").includes(J),tags:y.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=bt("Path",this.paths),a=bt("Method",Ht),p=qe("MethodPath",ht([a.name,s.name])),d=[i.createHeritageClause(_.default.SyntaxKind.ExtendsKeyword,[Tt(p.name,_.default.SyntaxKind.AnyKeyword)])],c=Rt("Input",d,Object.keys(this.registry).map(y=>St(y,this.registry[y].in))),l=Rt("Response",d,Object.keys(this.registry).map(y=>St(y,this.registry[y].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let h=i.createVariableStatement(re,Ot("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),g=i.createVariableStatement(re,Ot("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(y=>i.createPropertyAssignment(`"${y}"`,i.createArrayLiteralExpression(this.registry[y].tags.map(w=>i.createStringLiteral(w)))))))),S=qe("Provider",i.createFunctionTypeNode(hr({M:a.name,P:s.name}),Ge({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),xt)}),yr(l.name,xt))),P=qe("Implementation",i.createFunctionTypeNode(void 0,Ge({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(_.default.SyntaxKind.StringKeyword),params:Tt(_.default.SyntaxKind.StringKeyword,_.default.SyntaxKind.AnyKeyword)}),gr())),f=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),A=fr("ExpressZodAPIClient",mr([_e("implementation",i.createTypeReferenceNode(P.name),lr)]),[ur("provide",i.createTypeReferenceNode(S.name),xr(["method","path","params"],[i.createIdentifier("method"),Pt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[f,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),Pt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[f]),_.default.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);_.default.addSyntheticLeadingComment(A,_.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(h,g,S,P,A)}print(t){return this.agg.map(r=>gr(r,t)).join(`
55
+ `,!0),this.agg.push(h,g,S,P,A)}print(t){return this.agg.map(r=>Tr(r,t)).join(`
56
56
 
57
- `)}};var Zt={};At(Zt,{dateIn:()=>nn,dateOut:()=>sn,file:()=>rn,upload:()=>on});var R=require("zod");var Xo="ZodDateOut",Be=class e extends R.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==R.ZodParsedType.date?((0,R.addIssueToContext)(o,{code:R.ZodIssueCode.invalid_type,expected:R.ZodParsedType.date,received:o.parsedType}),R.INVALID):Ie(o.data)?{status:r.value,value:o.data.toISOString()}:((0,R.addIssueToContext)(o,{code:R.ZodIssueCode.invalid_date}),R.INVALID)}static create=()=>new e({typeName:Xo})};var E=require("zod");var en="ZodFile",tn=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Ye=class e extends E.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==E.ZodParsedType.string)return(0,E.addIssueToContext)(o,{code:E.ZodIssueCode.invalid_type,expected:E.ZodParsedType.string,received:o.parsedType}),E.INVALID;for(let n of this._def.checks)n.kind==="base64"&&(tn.test(o.data)||((0,E.addIssueToContext)(o,{code:E.ZodIssueCode.custom,message:n.message}),r.dirty()));return{status:r.value,value:o.data}}binary=t=>new e({...this._def,checks:[...this._def.checks,{kind:"binary",...tt(t)}]});base64=t=>new e({...this._def,checks:[...this._def.checks,{kind:"base64",...tt(t)}]});get isBinary(){return!!this._def.checks.find(t=>t.kind==="binary")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}static create=()=>new e({checks:[],typeName:en})};var rn=Ye.create,on=oe.create,nn=ke.create,sn=Be.create;var Sr=b(require("http-errors"));0&&(module.exports={AbstractEndpoint,DependsOnMethod,DependsOnMethodError,Documentation,DocumentationError,EndpointsFactory,InputValidationError,Integration,OutputValidationError,RoutingError,ServeStatic,attachRouting,createConfig,createHttpError,createLogger,createMiddleware,createResultHandler,createServer,defaultEndpointsFactory,defaultResultHandler,ez,getExamples,getMessageFromError,getStatusCodeFromError,testEndpoint,withMeta});
57
+ `)}};var At={};Ct(At,{dateIn:()=>dn,dateOut:()=>pn,file:()=>sn,upload:()=>an});var R=require("zod");var rn="ZodDateOut",Je=class e extends R.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==R.ZodParsedType.date?((0,R.addIssueToContext)(o,{code:R.ZodIssueCode.invalid_type,expected:R.ZodParsedType.date,received:o.parsedType}),R.INVALID):Ce(o.data)?{status:r.value,value:o.data.toISOString()}:((0,R.addIssueToContext)(o,{code:R.ZodIssueCode.invalid_date}),R.INVALID)}static create=()=>new e({typeName:rn})};var E=require("zod");var on="ZodFile",nn=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Qe=class e extends E.ZodType{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==E.ZodParsedType.string)return(0,E.addIssueToContext)(o,{code:E.ZodIssueCode.invalid_type,expected:E.ZodParsedType.string,received:o.parsedType}),E.INVALID;for(let n of this._def.checks)n.kind==="base64"&&(nn.test(o.data)||((0,E.addIssueToContext)(o,{code:E.ZodIssueCode.custom,message:n.message}),r.dirty()));return{status:r.value,value:o.data}}binary=t=>new e({...this._def,checks:[...this._def.checks,{kind:"binary",...nt(t)}]});base64=t=>new e({...this._def,checks:[...this._def.checks,{kind:"base64",...nt(t)}]});get isBinary(){return!!this._def.checks.find(t=>t.kind==="binary")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}static create=()=>new e({checks:[],typeName:on})};var sn=Qe.create,an=oe.create,dn=He.create,pn=Je.create;var Rr=b(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/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
- var ar=Object.defineProperty;var dr=(e,t)=>{for(var r in t)ar(e,r,{get:t[r],enumerable:!0})};var yt={silent:!0,warn:!0,debug:!0},pr=e=>e;import{z}from"zod";import{createHash as br}from"crypto";import{HttpError as Rr}from"http-errors";import{z as S}from"zod";import{clone as cr,mergeDeepRight as lr}from"ramda";var b="expressZodApiMeta",mr=e=>{let t=e.constructor,r=cr(e._def);return r[b]=r[b]||{examples:[]},new t(r)},V=e=>{let t=mr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=V(t);return o._def[b].examples.push(r),o}}}),t},gt=e=>b in e._def?typeof e._def[b]=="object"&&e._def[b]!==null:!1;function ht(e,t){if(!gt(e))return;let r=e._def;return t in r[b]?r[b][t]:void 0}var ye=(e,t)=>{if(!gt(e))return t;let r=V(t),o=se(r._def[b].examples,e._def[b].examples);if(r._def[b].examples=[],o.type==="single")r._def[b].examples=o.value;else for(let[n,s]of o.value)r._def[b].examples.push(lr({...n},{...s}));return r};import ur from"mime";var U=ur.getType("json")||"application/json",ie="multipart/form-data";import{INVALID as fr,OK as yr,ZodIssueCode as gr,ZodParsedType as hr,ZodType as xr,addIssueToContext as Tr}from"zod";var Sr="ZodUpload",Or=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",q=class e extends xr{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==hr.object||!Or(r.data)?(Tr(r,{code:gr.custom,message:`Expected file upload, received ${r.parsedType}`}),fr):yr(r.data)}static create=()=>new e({typeName:Sr})};var ke=/:([A-Za-z0-9_]+)/g;function Pr(e){let r=(e.header("content-type")||"").slice(0,ie.length).toLowerCase()===ie;return"files"in e&&r}var ge={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Zr=["body","query","params"],Ue=e=>e.method.toLowerCase();function xt(e,t){let r=Ue(e);if(r==="options")return{};let o=Zr;return r in ge&&(o=ge[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Pr(e):!0).reduce((n,s)=>({...n,...e[s]}),{})}function He(e){return typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(yt).includes(e.level)&&typeof e.color=="boolean"}function he(e){return!isNaN(e.getTime())}function B(e){return e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`)}function H(e){return e instanceof S.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof F?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message}function Ke(e){return e instanceof Rr?e.statusCode:e instanceof w?400:500}var K=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=ht(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},se=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}};function Fe(e){let t=e.match(ke);return t?t.map(r=>r.slice(1)):[]}var ae=e=>e.reduce((t,r)=>t||r,!1);function M(e){return e instanceof S.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof S.ZodUnion?ae(e.options.map(M)):e instanceof S.ZodIntersection?ae([e._def.left,e._def.right].map(M)):!1}function A(e){return e instanceof q?!0:e instanceof S.ZodObject?ae(Object.values(e.shape).map(A)):e instanceof S.ZodUnion?ae(e.options.map(A)):e instanceof S.ZodIntersection?ae([e._def.left,e._def.right].map(A)):e instanceof S.ZodOptional||e instanceof S.ZodNullable?A(e.unwrap()):e instanceof S.ZodEffects||e instanceof S.ZodTransformer?A(e._def.schema):e instanceof S.ZodRecord?A(e._def.valueType):e instanceof S.ZodArray?A(e._def.type):e instanceof S.ZodDefault?A(e._def.innerType):!1}var de=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,I=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),xe=e=>br("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Te=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},$e=e=>typeof e=="string"?{message:e}:e||{};var Y=class extends Error{name="RoutingError"},pe=class extends Y{name="DependsOnMethodError"},Z=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
2
- Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},D=class extends Error{name="IOSchemaError"},F=class extends D{name="OutputValidationError";originalError;constructor(t){super(H(t)),this.originalError=t}},w=class extends D{name="InputValidationError";originalError;constructor(t){super(H(t)),this.originalError=t}},J=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var C=e=>typeof e=="object"&&e!==null,Se=e=>({and:e.reduce((t,r)=>t.concat(C(r)&&"and"in r?r.and:r),[])}),Oe=(e,t)=>{if(C(e)){if("and"in e)return{and:e.and.map(r=>C(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>C(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},_e=e=>e.and.reduce((t,r)=>{let o=se(t.or,C(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(Se),t},{or:[]}),Q=(e,t)=>{if(C(e)){if("and"in e){if(C(t)){if("and"in t)return Se([e,t]);if("or"in t)return Q(_e(e),t)}return Se([e,t])}if("or"in e){if(C(t)){if("and"in t)return Q(t,e);if("or"in t){let r=se(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(Se)}}}return Q(e,{and:[t]})}}return C(t)&&("and"in t||"or"in t)?Q(t,e):{and:[e,t]}};import{z as W}from"zod";var X={positive:200,negative:400},Tt=e=>e,ee=Tt({getPositiveResponse:e=>{let t=K({schema:e}),r=V(W.object({status:W.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>V(W.object({status:W.literal("error"),error:W.object({message:W.string()})})).example({status:"error",error:{message:H(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(X.positive).json({status:"success",data:r});return}let a=Ke(e);a===500&&s.error(`Internal server error
3
- ${e.stack}
4
- `,{url:o.url,payload:t}),n.status(a).json({status:"error",error:{message:H(e)}})}}),be=({error:e,logger:t,response:r})=>{t.error(`Result handler failure: ${e.message}.`),r.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
5
- Original error: ${e.originalError.message}.`:""))};var St=(e,t=[U])=>{if(e instanceof z.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},te=class{},Re=class extends te{descriptions;methods=[];siblingMethods=[];middlewares=[];mimeTypes;statusCodes;handler;resultHandler;schemas;scopes=[];tags=[];constructor({middlewares:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,description:a,shortDescription:p,...d}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:l,schema:h})=>{if(M(h))throw new D(`Using transformations on the top level of endpoint ${l} is not allowed.`)}),this.middlewares=t;let c={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.mimeTypes={input:A(r)?[ie]:[U],positive:St(c.positive),negative:St(c.negative)},this.schemas={input:r,output:o,positive:c.positive instanceof z.ZodType?c.positive:c.positive.schema,negative:c.negative instanceof z.ZodType?c.negative:c.negative.schema},this.statusCodes={positive:c.positive instanceof z.ZodType?X.positive:c.positive.statusCode||X.positive,negative:c.negative instanceof z.ZodType?X.negative:c.negative.statusCode||X.negative},this.handler=n,this.resultHandler=s,this.descriptions={long:a,short:p},"scopes"in d&&d.scopes&&this.scopes.push(...d.scopes),"scope"in d&&d.scope&&this.scopes.push(d.scope),"tags"in d&&d.tags&&this.tags.push(...d.tags),"tag"in d&&d.tag&&this.tags.push(d.tag),"methods"in d?this.methods=d.methods:this.methods=[d.method]}_setSiblingMethods(t){this.siblingMethods=t}getDescription(t){return this.descriptions[t]}getMethods(){return this.methods}getSchema(t){return this.schemas[t]}getMimeTypes(t){return this.mimeTypes[t]}getStatusCode(t){return this.statusCodes[t]}getSecurity(){return this.middlewares.reduce((t,r)=>r.security?Q(t,r.security):t,{and:[]})}getScopes(){return this.scopes}getTags(){return this.tags}#e(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.methods.concat(this.siblingMethods).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#t(t){try{return await this.schemas.output.parseAsync(t)}catch(r){throw r instanceof z.ZodError?new F(r):r}}async#r({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.middlewares){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(l){throw l instanceof z.ZodError?new w(l):l}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#o({input:t,options:r,logger:o}){let n;try{n=await this.schemas.input.parseAsync(t)}catch(s){throw s instanceof z.ZodError?new w(s):s}return this.handler({input:n,options:r,logger:o})}async#n({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.resultHandler.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){be({logger:n,response:o,error:new J(B(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=Ue(t),a,p=null;if(n.cors){let c=this.#e();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let l in c)r.set(l,c[l])}let d=xt(t,n.inputSources);try{let{options:c,isStreamClosed:l}=await this.#r({method:s,input:d,request:t,response:r,logger:o});if(l)return;if(s==="options"){r.status(200).end();return}a=await this.#t(await this.#o({input:d,options:c,logger:o}))}catch(c){p=B(c)}await this.#n({input:d,output:a,request:t,response:r,error:p,logger:o})}};var Ot=["get","post","put","delete","patch"];import{z as Rt}from"zod";var bt=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>ye(s,n),o)};var Ge=e=>{if(M(e.input))throw new D("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var Pe=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:Rt.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,h=>{if(h&&h instanceof Error)return c(o(h));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(Ge({input:Rt.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new Re({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:bt(s,t),...n})}},Er=new Pe(ee);import{inspect as Ar}from"util";import{LEVEL as Ir,MESSAGE as Cr,SPLAT as Nr}from"triple-beam";import Ze from"winston";var{combine:Mr,colorize:wr,timestamp:Dr,printf:zr}=Ze.format;function Ee(e){let t=s=>{let{[Ir]:a,[Cr]:p,[Nr]:d,...c}=s;return Ar(c,!1,1,e.color)},r=s=>zr(({timestamp:a,message:p,level:d,durationMs:c,...l})=>(typeof p=="object"&&(l={...l,...p},p="[No message]"),`${a} ${d}: ${p}`+(c===void 0?"":` duration: ${c}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[Dr()],n={handleExceptions:!0};switch(e.color&&o.push(wr()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=Mr(...o),Ze.createLogger({silent:e.level==="silent",levels:Ze.config.npm.levels,transports:[new Ze.transports.Console(n)],exitOnError:!1})}var ce=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new pe(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
1
+ var pr=Object.defineProperty;var cr=(e,t)=>{for(var r in t)pr(e,r,{get:t[r],enumerable:!0})};var xt={silent:!0,warn:!0,debug:!0},lr=e=>e;import{z as k}from"zod";import{HttpError as Pr}from"http-errors";import{createHash as Zr}from"crypto";import{z as S}from"zod";import{clone as mr,mergeDeepRight as ur}from"ramda";var b="expressZodApiMeta",fr=e=>{let t=e.constructor,r=mr(e._def);return r[b]=r[b]||{examples:[]},new t(r)},w=e=>{let t=fr(e);return Object.defineProperties(t,{example:{get:()=>r=>{let o=w(t);return o._def[b].examples.push(r),o}}}),t},Tt=e=>b in e._def?typeof e._def[b]=="object"&&e._def[b]!==null:!1;function St(e,t){if(!Tt(e))return;let r=e._def;return t in r[b]?r[b][t]:void 0}var ge=(e,t)=>{if(!Tt(e))return t;let r=w(t),o=se(r._def[b].examples,e._def[b].examples);if(r._def[b].examples=[],o.type==="single")r._def[b].examples=o.value;else for(let[n,s]of o.value)r._def[b].examples.push(ur({...n},{...s}));return r};import yr from"mime";var $=yr.getType("json")||"application/json",ie="multipart/form-data";import{INVALID as gr,OK as hr,ZodIssueCode as xr,ZodParsedType as Tr,ZodType as Sr,addIssueToContext as Or}from"zod";var br="ZodUpload",Rr=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",B=class e extends Sr{_parse(t){let{ctx:r}=this._processInputParams(t);return r.parsedType!==Tr.object||!Rr(r.data)?(Or(r,{code:xr.custom,message:`Expected file upload, received ${r.parsedType}`}),gr):hr(r.data)}static create=()=>new e({typeName:br})};var Ue=/:([A-Za-z0-9_]+)/g;function Er(e){let r=(e.header("content-type")||"").slice(0,ie.length).toLowerCase()===ie;return"files"in e&&r}var he={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Ar=["body","query","params"],He=e=>e.method.toLowerCase();function Ot(e,t){let r=He(e);if(r==="options")return{};let o=Ar;return r in he&&(o=he[r]),t&&r in t&&(o=t[r]||o),o.filter(n=>n==="files"?Er(e):!0).reduce((n,s)=>({...n,...e[s]}),{})}function Ke(e){return typeof e=="object"&&"level"in e&&"color"in e&&Object.keys(xt).includes(e.level)&&typeof e.color=="boolean"}function xe(e){return!isNaN(e.getTime())}function Y(e){return e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`)}function v(e){return e instanceof S.ZodError?e.issues.map(({path:t,message:r})=>(t.length?[t.join("/")]:[]).concat(r).join(": ")).join("; "):e instanceof _?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message}function Te(e){return e instanceof Pr?e.statusCode:e instanceof j?400:500}var Fe=({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})},z=({schema:e,variant:t="original",validate:r=t==="parsed"})=>{let o=St(e,"examples")||[];if(!r&&t==="original")return o;let n=[];for(let s of o){let a=e.safeParse(s);a.success&&n.push(t==="parsed"?a.data:s)}return n},se=(e,t)=>{if(e.length===0)return{type:"single",value:t};if(t.length===0)return{type:"single",value:e};let r=[];for(let o of e)for(let n of t)r.push([o,n]);return{type:"tuple",value:r}};function $e(e){let t=e.match(Ue);return t?t.map(r=>r.slice(1)):[]}var ae=e=>e.reduce((t,r)=>t||r,!1);function D(e){return e instanceof S.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof S.ZodUnion?ae(e.options.map(D)):e instanceof S.ZodIntersection?ae([e._def.left,e._def.right].map(D)):!1}function A(e){return e instanceof B?!0:e instanceof S.ZodObject?ae(Object.values(e.shape).map(A)):e instanceof S.ZodUnion?ae(e.options.map(A)):e instanceof S.ZodIntersection?ae([e._def.left,e._def.right].map(A)):e instanceof S.ZodOptional||e instanceof S.ZodNullable?A(e.unwrap()):e instanceof S.ZodEffects||e instanceof S.ZodTransformer?A(e._def.schema):e instanceof S.ZodRecord?A(e._def.valueType):e instanceof S.ZodArray?A(e._def.type):e instanceof S.ZodDefault?A(e._def.innerType):!1}var de=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,C=(e,t,r)=>[t].concat(e.split("/")).concat(r||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Se=e=>Zr("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Oe=({effect:e,sample:t})=>{try{return typeof e.transform(t,{addIssue:()=>{},path:[]})}catch{return}},_e=e=>typeof e=="string"?{message:e}:e||{};var J=class extends Error{name="RoutingError"},pe=class extends J{name="DependsOnMethodError"},Z=class extends Error{name="DocumentationError";constructor({message:t,method:r,path:o,isResponse:n}){let s=`${t}
4
+ Caused by ${n?"response":"input"} schema of an Endpoint assigned to ${r.toUpperCase()} method of ${o} path.`;super(s)}},L=class extends Error{name="IOSchemaError"},_=class extends L{name="OutputValidationError";originalError;constructor(t){super(v(t)),this.originalError=t}},j=class extends L{name="InputValidationError";originalError;constructor(t){super(v(t)),this.originalError=t}},Q=class extends Error{name="ResultHandlerError";originalError;constructor(t,r){super(t),this.originalError=r||void 0}};var N=e=>typeof e=="object"&&e!==null,be=e=>({and:e.reduce((t,r)=>t.concat(N(r)&&"and"in r?r.and:r),[])}),Re=(e,t)=>{if(N(e)){if("and"in e)return{and:e.and.map(r=>N(r)&&"or"in r?{or:r.or.map(t)}:t(r))};if("or"in e)return{or:e.or.map(r=>N(r)&&"and"in r?{and:r.and.map(t)}:t(r))}}return t(e)},Ge=e=>e.and.reduce((t,r)=>{let o=se(t.or,N(r)&&"or"in r?r.or:[r]);return o.type==="single"?t.or.push(...o.value):t.or=o.value.map(be),t},{or:[]}),W=(e,t)=>{if(N(e)){if("and"in e){if(N(t)){if("and"in t)return be([e,t]);if("or"in t)return W(Ge(e),t)}return be([e,t])}if("or"in e){if(N(t)){if("and"in t)return W(t,e);if("or"in t){let r=se(e.or,t.or);return{or:r.type==="single"?r.value:r.value.map(be)}}}return W(e,{and:[t]})}}return N(t)&&("and"in t||"or"in t)?W(t,e):{and:[e,t]}};import{z as I}from"zod";var X={positive:200,negative:400},qe=e=>e,ee=qe({getPositiveResponse:e=>{let t=z({schema:e}),r=w(I.object({status:I.literal("success"),data:e}));return t.reduce((o,n)=>o.example({status:"success",data:n}),r)},getNegativeResponse:()=>w(I.object({status:I.literal("error"),error:I.object({message:I.string()})})).example({status:"error",error:{message:v(new Error("Sample error message"))}}),handler:({error:e,input:t,output:r,request:o,response:n,logger:s})=>{if(!e){n.status(X.positive).json({status:"success",data:r});return}let a=Te(e);Fe({logger:s,statusCode:a,request:o,error:e,input:t}),n.status(a).json({status:"error",error:{message:v(e)}})}}),Ve=qe({getPositiveResponse:e=>{let t=z({schema:e}),r=w("shape"in e&&"items"in e.shape&&e.shape.items instanceof I.ZodArray?e.shape.items:I.array(I.any()));return t.reduce((o,n)=>typeof n=="object"&&n!==null&&"items"in n?o.example(n.items):o,r)},getNegativeResponse:()=>w(I.string()).example(v(new Error("Sample error message"))),handler:({response:e,output:t,error:r,logger:o,request:n,input:s})=>{if(r){let a=Te(r);Fe({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")}}),Pe=({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 bt=(e,t=[$])=>{if(e instanceof k.ZodType)return t;let{mimeTypes:r,mimeType:o}=e;return o?[o]:r||t},te=class{},Ze=class extends te{descriptions;methods=[];siblingMethods=[];middlewares=[];mimeTypes;statusCodes;handler;resultHandler;schemas;scopes=[];tags=[];constructor({middlewares:t,inputSchema:r,outputSchema:o,handler:n,resultHandler:s,description:a,shortDescription:p,...d}){super(),[{name:"input schema",schema:r},{name:"output schema",schema:o}].forEach(({name:l,schema:h})=>{if(D(h))throw new L(`Using transformations on the top level of endpoint ${l} is not allowed.`)}),this.middlewares=t;let c={positive:s.getPositiveResponse(o),negative:s.getNegativeResponse()};this.mimeTypes={input:A(r)?[ie]:[$],positive:bt(c.positive),negative:bt(c.negative)},this.schemas={input:r,output:o,positive:c.positive instanceof k.ZodType?c.positive:c.positive.schema,negative:c.negative instanceof k.ZodType?c.negative:c.negative.schema},this.statusCodes={positive:c.positive instanceof k.ZodType?X.positive:c.positive.statusCode||X.positive,negative:c.negative instanceof k.ZodType?X.negative:c.negative.statusCode||X.negative},this.handler=n,this.resultHandler=s,this.descriptions={long:a,short:p},"scopes"in d&&d.scopes&&this.scopes.push(...d.scopes),"scope"in d&&d.scope&&this.scopes.push(d.scope),"tags"in d&&d.tags&&this.tags.push(...d.tags),"tag"in d&&d.tag&&this.tags.push(d.tag),"methods"in d?this.methods=d.methods:this.methods=[d.method]}_setSiblingMethods(t){this.siblingMethods=t}getDescription(t){return this.descriptions[t]}getMethods(){return this.methods}getSchema(t){return this.schemas[t]}getMimeTypes(t){return this.mimeTypes[t]}getStatusCode(t){return this.statusCodes[t]}getSecurity(){return this.middlewares.reduce((t,r)=>r.security?W(t,r.security):t,{and:[]})}getScopes(){return this.scopes}getTags(){return this.tags}#e(){return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":this.methods.concat(this.siblingMethods).concat("options").join(", ").toUpperCase(),"Access-Control-Allow-Headers":"content-type"}}async#t(t){try{return await this.schemas.output.parseAsync(t)}catch(r){throw r instanceof k.ZodError?new _(r):r}}async#r({method:t,input:r,request:o,response:n,logger:s}){let a={},p=!1;for(let d of this.middlewares){if(t==="options"&&d.type==="proprietary")continue;let c;try{c=await d.input.parseAsync(r)}catch(l){throw l instanceof k.ZodError?new j(l):l}if(Object.assign(a,await d.middleware({input:c,options:a,request:o,response:n,logger:s})),p="writableEnded"in n&&n.writableEnded,p){s.warn(`The middleware ${d.middleware.name} has closed the stream. Accumulated options:`,a);break}}return{options:a,isStreamClosed:p}}async#o({input:t,options:r,logger:o}){let n;try{n=await this.schemas.input.parseAsync(t)}catch(s){throw s instanceof k.ZodError?new j(s):s}return this.handler({input:n,options:r,logger:o})}async#n({error:t,request:r,response:o,logger:n,input:s,output:a}){try{await this.resultHandler.handler({error:t,output:a,request:r,response:o,logger:n,input:s})}catch(p){Pe({logger:n,response:o,error:new Q(Y(p).message,t)})}}async execute({request:t,response:r,logger:o,config:n}){let s=He(t),a,p=null;if(n.cors){let c=this.#e();typeof n.cors=="function"&&(c=await n.cors({request:t,logger:o,endpoint:this,defaultHeaders:c}));for(let l in c)r.set(l,c[l])}let d=Ot(t,n.inputSources);try{let{options:c,isStreamClosed:l}=await this.#r({method:s,input:d,request:t,response:r,logger:o});if(l)return;if(s==="options"){r.status(200).end();return}a=await this.#t(await this.#o({input:d,options:c,logger:o}))}catch(c){p=Y(c)}await this.#n({input:d,output:a,request:t,response:r,error:p,logger:o})}};var Rt=["get","post","put","delete","patch"];import{z as Zt}from"zod";var Pt=(e,t)=>{let r=e.map(({input:n})=>n).concat(t),o=r.reduce((n,s)=>n.and(s));return r.reduce((n,s)=>ge(s,n),o)};var Be=e=>{if(D(e.input))throw new L("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var ce=class e{resultHandler;middlewares=[];constructor(t){this.resultHandler="resultHandler"in t?t.resultHandler:t}static#e(t,r){let o=new e(r);return o.middlewares=t,o}addMiddleware(t){return e.#e(this.middlewares.concat(t),this.resultHandler)}use=this.addExpressMiddleware;addExpressMiddleware(t,r){let o=r?.transformer||(a=>a),n=r?.provider||(()=>({})),s={type:"express",input:Zt.object({}),middleware:async({request:a,response:p})=>new Promise((d,c)=>{t(a,p,h=>{if(h&&h instanceof Error)return c(o(h));d(n(a,p))})})};return e.#e(this.middlewares.concat(s),this.resultHandler)}addOptions(t){return e.#e(this.middlewares.concat(Be({input:Zt.object({}),middleware:async()=>t})),this.resultHandler)}build({input:t,handler:r,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new Ze({handler:r,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:Pt(s,t),...n})}},Ir=new ce(ee),Cr=new ce(Ve);import{inspect as Nr}from"util";import{LEVEL as Mr,MESSAGE as wr,SPLAT as Dr}from"triple-beam";import Ee from"winston";var{combine:vr,colorize:zr,timestamp:jr,printf:Lr}=Ee.format;function Ae(e){let t=s=>{let{[Mr]:a,[wr]:p,[Dr]:d,...c}=s;return Nr(c,!1,1,e.color)},r=s=>Lr(({timestamp:a,message:p,level:d,durationMs:c,...l})=>(typeof p=="object"&&(l={...l,...p},p="[No message]"),`${a} ${d}: ${p}`+(c===void 0?"":` duration: ${c}ms`)+(Object.keys(l).length===0?"":" "+(s?t(l):JSON.stringify(l))))),o=[jr()],n={handleExceptions:!0};switch(e.color&&o.push(zr()),e.level){case"debug":n.level="debug",o.push(r(!0));break;case"silent":case"warn":default:n.level="warn",o.push(r())}return n.format=vr(...o),Ee.createLogger({silent:e.level==="silent",levels:Ee.config.npm.levels,transports:[new Ee.transports.Console(n)],exitOnError:!1})}var le=class{constructor(t){this.methods=t;Object.keys(t).forEach(r=>{if(r in t&&!(t[r]?.getMethods()||[]).includes(r))throw new pe(`The endpoint assigned to the '${r}' parameter must have at least this method in its specification.
6
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 vr from"express";var le=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,vr.static(...this.params))}};var $=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new Y(`Routing elements should not contain '/' character.
17
- The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof te){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof le)r&&a.apply(p,r);else if(a instanceof ce){if(Object.entries(a.methods).forEach(([d,c])=>{t(c,p,d)}),n&&Object.keys(a.methods).length>0){let[d,...c]=Object.keys(a.methods),l=a.methods[d];l._setSiblingMethods(c),t(l,p,"options")}}else $({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var Pt=()=>`
16
+ `)})}};import kr from"express";var me=class{params;constructor(...t){this.params=t}apply(t,r){return r(t,kr.static(...this.params))}};var G=({routing:e,onEndpoint:t,onStatic:r,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new J(`Routing elements should not contain '/' character.
17
+ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let p=`${o||""}${s?`/${s}`:""}`;if(a instanceof te){let d=a.getMethods().slice();n&&d.push("options"),d.forEach(c=>{t(a,p,c)})}else if(a instanceof me)r&&a.apply(p,r);else if(a instanceof le){if(Object.entries(a.methods).forEach(([d,c])=>{t(c,p,d)}),n&&Object.keys(a.methods).length>0){let[d,...c]=Object.keys(a.methods),l=a.methods[d];l._setSiblingMethods(c),t(l,p,"options")}}else G({onEndpoint:t,onStatic:r,hasCors:n,routing:a,parentPath:p})})};var Et=()=>`
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 Ve=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Pt()),$({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};import jr,{json as Lr}from"express";import kr from"compression";import Ur from"express-fileupload";import Hr from"https";import Zt from"http-errors";var Kr=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:Zt(400,B(r).message),request:o,response:n,logger:t,input:o.body,output:null})},Et=(e,t)=>(r,o)=>{let n=Zt(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){be({response:o,logger:t,error:new J(B(s).message,n)})}};function Fr(e,t){let r=He(e.logger)?Ee(e.logger):e.logger;Ve({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||ee;return{notFoundHandler:Et(o,r),logger:r}}function $r(e,t){let r=He(e.logger)?Ee(e.logger):e.logger,o=jr();o.disable("x-powered-by");let n=e.errorHandler||ee,s=e.server.compression?kr({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||Lr(),p=e.server.upload?Ur({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use(Kr(n,r)),Ve({app:o,routing:t,logger:r,config:e}),o.use(Et(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=Hr.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}}import{OpenApiBuilder as Mo}from"openapi3-ts/oas30";import{isReferenceObject as Mt,isSchemaObject as fe}from"openapi3-ts/oas30";import{omit as ue}from"ramda";import{z as x}from"zod";import{INVALID as At,ZodIssueCode as qe,ZodParsedType as It,ZodType as _r,addIssueToContext as Be}from"zod";var Ye=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Gr="ZodDateIn",Ae=class e extends _r{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==It.string)return Be(o,{code:qe.invalid_type,expected:It.string,received:o.parsedType}),At;Ye.test(o.data)||(Be(o,{code:qe.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return he(n)?{status:r.value,value:n}:(Be(o,{code:qe.invalid_date}),At)}static create=()=>new e({typeName:Gr})};var _=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>_({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var Ct=50,wt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Vr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Dt=e=>e.replace(ke,t=>`{${t.slice(1)}}`),qr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Br=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Yr=()=>({format:"any"}),Jr=e=>{if(e.isResponse)throw new Z({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},Qr=({schema:{isBinary:e,isBase64:t},...r})=>{if(!r.isResponse)throw new Z({message:"Please use z.file() only within ResultHandler.",...r});return{type:"string",format:e?"binary":t?"byte":"file"}},Wr=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),Xr=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),eo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),to=({schema:e,next:t})=>t({schema:e.unwrap()}),ro=({schema:e,next:t})=>t({schema:e._def.innerType}),oo=({schema:e,next:t})=>({nullable:!0,...t({schema:e.unwrap()})}),Nt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),no=({schema:{value:e}})=>({type:typeof e,enum:[e]}),so=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&de(s)?s instanceof x.ZodOptional:s.isOptional())});return{type:"object",properties:Ie({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},io=()=>({type:"string",nullable:!0,format:"null"}),ao=e=>{if(e.isResponse)throw new Z({message:"Please use z.dateOut() for output.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:Ye.source,externalDocs:{url:wt}}},po=e=>{if(!e.isResponse)throw new Z({message:"Please use z.dateIn() for input.",...e});return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:wt}}},co=e=>{throw new Z({message:`Using z.date() within ${e.isResponse?"output":"input"} schema is forbidden. Please use z.date${e.isResponse?"Out":"In"}() instead. Check out the documentation for details.`,...e})},lo=()=>({type:"boolean"}),mo=()=>({type:"integer",format:"bigint"}),uo=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.ZodEnum||e instanceof x.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ie({schema:x.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.ZodLiteral)return{type:"object",properties:Ie({schema:x.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ie({schema:x.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},fo=({schema:{_def:e,element:t},next:r})=>({type:"array",items:r({schema:t}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),yo=({schema:{items:e},next:t})=>{let r=e.map(o=>t({schema:o}));return{type:"array",minItems:r.length,maxItems:r.length,items:{oneOf:r,format:"tuple",...r.length>0&&{description:r.map((o,n)=>`${n}: ${fe(o)?o.type:o.$ref}`).join(", ")}}}},go=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:h}}})=>{let g=h.find(f=>f.kind==="regex"),T=h.find(f=>f.kind==="datetime"),O=g?g.regex:T?T.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...O&&{pattern:`/${O.source}/${O.flags}`}}},ho=({schema:e})=>{let t=e._def.checks.find(({kind:s})=>s==="min"),r=t?t.inclusive:!0,o=e._def.checks.find(({kind:s})=>s==="max"),n=o?o.inclusive:!0;return{type:e.isInt?"integer":"number",format:e.isInt?"int64":"double",minimum:e.minValue===null?e.isInt?Number.MIN_SAFE_INTEGER:Number.MIN_VALUE:e.minValue,exclusiveMinimum:!r,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},Ie=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),xo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Vr?.[t]},To=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&fe(o)){let s=Te({effect:n,sample:xo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.any()})}if(!t&&n.type==="preprocess"&&fe(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},So=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Oo=({schema:e,next:t})=>t({schema:e.unwrap()}),bo=({next:e,schema:t,serializer:r,getRef:o,makeRef:n})=>{let s=r(t.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:t.schema}))))()},zt=(e,t,r=[])=>{let o=K({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:ue(r,s)}}),{})}},Ro=(e,t,r)=>{let o=K({schema:e,variant:t?"parsed":"original",validate:!0});return o.length===0?{}:{examples:o.reduce((n,s,a)=>r in s?{...n,[`example${a+1}`]:{value:s[r]}}:n,{})}};function me(e,t){if(e instanceof x.ZodObject)return e;let r;if(e instanceof x.ZodUnion||e instanceof x.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>me(o,t)).reduce((o,n)=>o.merge(n.partial()),x.object({}));else if(e instanceof x.ZodEffects){if(M(e))throw new Z({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=me(e._def.schema,t)}else r=me(e._def.left,t).merge(me(e._def.right,t));return ye(e,r)}var vt=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=me(c,{path:e,method:t,isResponse:!1}).shape,h=Fe(e),g=o.includes("query"),T=o.includes("params"),O=f=>T&&h.includes(f);return Object.keys(l).filter(f=>g||O(f)).map(f=>{let R=_({schema:l[f],isResponse:!1,rules:Qe,onEach:We,onMissing:Xe,serializer:n,getRef:s,makeRef:a,path:e,method:t}),y=p==="components"?a(I(e,t,`${d} ${f}`),R):R;return{name:f,in:O(f)?"path":"query",required:!l[f].isOptional(),description:fe(R)&&R.description||`${t.toUpperCase()} ${e} ${d}`,schema:y,...Ro(c,!1,f)}})},Qe={ZodString:go,ZodNumber:ho,ZodBigInt:mo,ZodBoolean:lo,ZodDateIn:ao,ZodDateOut:po,ZodNull:io,ZodArray:fo,ZodTuple:yo,ZodRecord:uo,ZodObject:so,ZodLiteral:no,ZodIntersection:eo,ZodUnion:Wr,ZodFile:Qr,ZodUpload:Jr,ZodAny:Yr,ZodDefault:qr,ZodEnum:Nt,ZodNativeEnum:Nt,ZodEffects:To,ZodOptional:to,ZodNullable:oo,ZodDiscriminatedUnion:Xr,ZodBranded:Oo,ZodDate:co,ZodCatch:Br,ZodPipeline:So,ZodLazy:bo,ZodReadonly:ro},We=({schema:e,isResponse:t,prev:r})=>{if(Mt(r))return{};let{description:o}=e,n=e instanceof x.ZodLazy,s=r.type!==void 0,a=t&&de(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:K({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},Xe=({schema:e,...t})=>{throw new Z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},Je=(e,t)=>{if(Mt(e))return e;let r=e.properties?ue(t,e.properties):void 0,o=e.example?ue(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>Je(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>Je(p,t)):void 0;return ue(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},jt=e=>fe(e)?ue(["example"],e):e,et=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),h=jt(_({schema:c,isResponse:!0,rules:Qe,onEach:We,onMissing:Xe,serializer:n,getRef:s,makeRef:a,path:t,method:e})),g=zt(c,!0),T=p==="components"?a(I(t,e,d),h):h;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((O,f)=>({...O,[f]:{schema:T,...g}}),{})}},Po=()=>({type:"http",scheme:"basic"}),Zo=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Eo=({name:e})=>({type:"apiKey",in:"query",name:e}),Ao=({name:e})=>({type:"apiKey",in:"header",name:e}),Io=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Co=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),No=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((t,r)=>{let o=e[r];if(!o)return t;let{scopes:n={},...s}=o;return{...t,[r]:{...s,scopes:n}}},{})}),Lt=e=>{let t={basic:Po,bearer:Zo,input:Eo,header:Ao,cookie:Io,openid:Co,oauth2:No};return Oe(e,r=>t[r.type](r))},Ce=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(t=>("and"in t?t.and:[t]).reduce((r,{name:o,scopes:n})=>({...r,[o]:n}),{}));if("and"in e)return Ce(_e(e))}return Ce({or:[e]})},kt=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=Fe(t),c=jt(Je(_({schema:r.getSchema("input"),isResponse:!1,rules:Qe,onEach:We,onMissing:Xe,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=zt(r.getSchema("input"),!1,d),h=a==="components"?s(I(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((g,T)=>({...g,[T]:{schema:h,...l}}),{})}},Ut=e=>Object.keys(e).map(t=>{let r=e[t];return{name:t,description:typeof r=="string"?r:r.description,...typeof r=="object"&&r.url&&{externalDocs:{url:r.url}}}}),tt=e=>e.length<=Ct?e:e.slice(0,Ct-1)+"\u2026";var rt=class extends Mo{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r){let o=I(t,r);return o in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[o]++,`${o}${this.lastOperationIdSuffixes[o]}`):(this.lastOperationIdSuffixes[o]=1,o)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=xe}){super(),this.addInfo({title:o,version:n}).addServer({url:s}),$({routing:t,onEndpoint:(g,T,O)=>{let f=O,R={path:T,method:f,endpoint:g,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[y,E]=["short","long"].map(g.getDescription.bind(g)),k=r.inputSources?.[f]||ge[f],re=vt({...R,inputSources:k}),P={operationId:this.ensureUniqOperationId(T,f),responses:{[g.getStatusCode("positive")]:et({...R,clue:a,isPositive:!0}),[g.getStatusCode("negative")]:et({...R,clue:p,isPositive:!1})}};E&&(P.description=E,d&&y===void 0&&(P.summary=tt(E))),y&&(P.summary=tt(y)),g.getTags().length>0&&(P.tags=g.getTags()),re.length>0&&(P.parameters=re),k.includes("body")&&(P.requestBody=kt(R));let oe=Ce(Oe(Lt(g.getSecurity()),ne=>{let ft=this.ensureUniqSecuritySchemaName(ne),ir=["oauth2","openIdConnect"].includes(ne.type)?g.getScopes():[];return this.addSecurityScheme(ft,ne),{name:ft,scopes:ir}}));oe.length>0&&(P.security=oe);let Le=Dt(T);this.addPath(Le,{[f]:P})}}),this.rootDoc.tags=r.tags?Ut(r.tags):[]}};import Ht from"http";var wo=e=>({method:"GET",header:jest.fn(()=>U),...e}),Do=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:Ht.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=Ht.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},zo=async({endpoint:e,requestProps:t,responseProps:r,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=wo(t),p=Do(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};import L from"typescript";import N from"typescript";var i=N.factory,G=[i.createModifier(N.SyntaxKind.ExportKeyword)],vo=[i.createModifier(N.SyntaxKind.AsyncKeyword)],jo=[i.createModifier(N.SyntaxKind.PublicKeyword),i.createModifier(N.SyntaxKind.ReadonlyKeyword)],Kt=[i.createModifier(N.SyntaxKind.ProtectedKeyword),i.createModifier(N.SyntaxKind.ReadonlyKeyword)],Lo=i.createTemplateHead(""),ko=i.createTemplateTail(""),Uo=i.createTemplateMiddle(" "),ot=e=>i.createTemplateLiteralType(Lo,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?ko:Uo))),nt=ot(["M","P"]),Ne=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),Me=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Ne(o,e[o],t)),[]),st=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),Ft=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),it=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),at=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],N.NodeFlags.Const),dt=(e,t)=>i.createTypeAliasDeclaration(G,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),we=(e,t)=>i.createTypeAliasDeclaration(G,e,void 0,t),$t=(e,t,r)=>i.createPropertyDeclaration(jo,e,void 0,t,r),_t=(e,t,r=[])=>i.createClassDeclaration(G,e,void 0,void 0,[t,...r]),Gt=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),Vt=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(N.SyntaxKind.AnyKeyword)]),pt=(e,t,r)=>i.createInterfaceDeclaration(G,e,void 0,t,r),qt=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Bt=(e,t)=>i.createArrowFunction(vo,void 0,e.map(r=>Ne(r)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,t)),ct=(e,t,r)=>i.createCallExpression(i.createPropertyAccessExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("Object"),"keys"),void 0,[i.createIdentifier(e)]),"reduce"),void 0,[i.createArrowFunction(void 0,void 0,Me({acc:void 0,key:void 0}),void 0,void 0,t),r]);import u from"typescript";import{z as Ko}from"zod";import v from"typescript";var{factory:De}=v,lt=(e,t)=>{v.addSyntheticLeadingComment(e,v.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ze=(e,t,r)=>{let o=De.createTypeAliasDeclaration(void 0,De.createIdentifier(t),void 0,e);return r&&lt(o,r),o},Yt=(e,t)=>{let r=v.createSourceFile("print.ts","",v.ScriptTarget.Latest,!1,v.ScriptKind.TS);return v.createPrinter(t).printNode(v.EmitHint.Unspecified,e,r)},Ho=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Jt=e=>Ho.test(e)?De.createIdentifier(e):De.createStringLiteral(e);var{factory:m}=u,Fo={[u.SyntaxKind.AnyKeyword]:"",[u.SyntaxKind.BigIntKeyword]:BigInt(0),[u.SyntaxKind.BooleanKeyword]:!1,[u.SyntaxKind.NumberKeyword]:0,[u.SyntaxKind.ObjectKeyword]:{},[u.SyntaxKind.StringKeyword]:"",[u.SyntaxKind.UndefinedKeyword]:void 0},$o=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),_o=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&de(a)?a instanceof Ko.ZodOptional:a.isOptional(),d=m.createPropertySignature(void 0,Jt(s),p&&o?m.createToken(u.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&lt(d,a.description),d});return m.createTypeLiteralNode(n)},Go=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),Vo=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),Qt=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),qo=e=>Fo?.[e.kind],Bo=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Te({effect:n,sample:qo(o)}),a={number:u.SyntaxKind.NumberKeyword,bigint:u.SyntaxKind.BigIntKeyword,boolean:u.SyntaxKind.BooleanKeyword,string:u.SyntaxKind.StringKeyword,undefined:u.SyntaxKind.UndefinedKeyword,object:u.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||u.SyntaxKind.AnyKeyword)}return o},Yo=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),Jo=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.SyntaxKind.UndefinedKeyword)]):o},Qo=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),Wo=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),Xo=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),en=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),tn=({next:e,schema:t})=>e({schema:t._def.innerType}),j=e=>()=>m.createKeywordTypeNode(e),rn=({next:e,schema:t})=>e({schema:t.unwrap()}),on=({next:e,schema:t})=>e({schema:t._def.innerType}),nn=({next:e,schema:t})=>e({schema:t._def.innerType}),sn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),an=()=>m.createLiteralTypeNode(m.createNull()),dn=({getAlias:e,makeAlias:t,next:r,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(t(s,m.createLiteralTypeNode(m.createNull())),t(s,r({schema:n.schema}))))()},pn={ZodString:j(u.SyntaxKind.StringKeyword),ZodNumber:j(u.SyntaxKind.NumberKeyword),ZodBigInt:j(u.SyntaxKind.BigIntKeyword),ZodBoolean:j(u.SyntaxKind.BooleanKeyword),ZodDateIn:j(u.SyntaxKind.StringKeyword),ZodDateOut:j(u.SyntaxKind.StringKeyword),ZodNull:an,ZodArray:Go,ZodTuple:Wo,ZodRecord:Xo,ZodObject:_o,ZodLiteral:$o,ZodIntersection:en,ZodUnion:Qt,ZodFile:j(u.SyntaxKind.StringKeyword),ZodAny:j(u.SyntaxKind.AnyKeyword),ZodDefault:tn,ZodEnum:Vo,ZodNativeEnum:Yo,ZodEffects:Bo,ZodOptional:Jo,ZodNullable:Qo,ZodDiscriminatedUnion:Qt,ZodBranded:rn,ZodCatch:nn,ZodPipeline:sn,ZodLazy:dn,ZodReadonly:on},mt=({schema:e,...t})=>_({schema:e,rules:pn,onMissing:()=>m.createKeywordTypeNode(u.SyntaxKind.AnyKeyword),...t});var ut=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=ze(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=xe,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){$({routing:t,onEndpoint:(y,E,k)=>{let re=I(E,k,"input"),P=I(E,k,"response"),oe={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},Le=mt({...oe,schema:y.getSchema("input"),isResponse:!1}),ne=mt({...oe,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(ze(Le,re),ze(ne,P)),k!=="options"&&(this.paths.push(E),this.registry[`${k} ${E}`]={in:re,out:P,isJson:y.getMimeTypes("positive").includes(U),tags:y.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=dt("Path",this.paths),a=dt("Method",Ot),p=we("MethodPath",ot([a.name,s.name])),d=[i.createHeritageClause(L.SyntaxKind.ExtendsKeyword,[st(p.name,L.SyntaxKind.AnyKeyword)])],c=pt("Input",d,Object.keys(this.registry).map(y=>it(y,this.registry[y].in))),l=pt("Response",d,Object.keys(this.registry).map(y=>it(y,this.registry[y].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let h=i.createVariableStatement(G,at("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),g=i.createVariableStatement(G,at("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(y=>i.createPropertyAssignment(`"${y}"`,i.createArrayLiteralExpression(this.registry[y].tags.map(E=>i.createStringLiteral(E)))))))),T=we("Provider",i.createFunctionTypeNode(qt({M:a.name,P:s.name}),Me({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),nt)}),Gt(l.name,nt))),O=we("Implementation",i.createFunctionTypeNode(void 0,Me({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(L.SyntaxKind.StringKeyword),params:st(L.SyntaxKind.StringKeyword,L.SyntaxKind.AnyKeyword)}),Vt())),f=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),R=_t("ExpressZodAPIClient",Ft([Ne("implementation",i.createTypeReferenceNode(O.name),Kt)]),[$t("provide",i.createTypeReferenceNode(T.name),Bt(["method","path","params"],[i.createIdentifier("method"),ct("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[f,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),ct("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[f]),L.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);L.addSyntheticLeadingComment(R,L.SyntaxKind.MultiLineCommentTrivia,`
34
+ `.trim();var Ye=({app:e,logger:t,config:r,routing:o})=>{r.startupLogo!==!1&&console.log(Et()),G({routing:o,hasCors:!!r.cors,onEndpoint:(n,s,a)=>{e[a](s,async(p,d)=>{t.info(`${p.method}: ${s}`),await n.execute({request:p,response:d,logger:t,config:r})})},onStatic:(n,s)=>{e.use(n,s)}})};import Ur,{json as Hr}from"express";import Kr from"compression";import Fr from"express-fileupload";import $r from"https";import At from"http-errors";var _r=(e,t)=>(r,o,n,s)=>{if(!r)return s();e.handler({error:At(400,Y(r).message),request:o,response:n,logger:t,input:o.body,output:null})},It=(e,t)=>(r,o)=>{let n=At(404,`Can not ${r.method} ${r.path}`);try{e.handler({request:r,response:o,logger:t,error:n,input:null,output:null})}catch(s){Pe({response:o,logger:t,error:new Q(Y(s).message,n)})}};function Gr(e,t){let r=Ke(e.logger)?Ae(e.logger):e.logger;Ye({app:e.app,routing:t,logger:r,config:e});let o=e.errorHandler||ee;return{notFoundHandler:It(o,r),logger:r}}function qr(e,t){let r=Ke(e.logger)?Ae(e.logger):e.logger,o=Ur();o.disable("x-powered-by");let n=e.errorHandler||ee,s=e.server.compression?Kr({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||Hr(),p=e.server.upload?Fr({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,d=[].concat(s||[]).concat(a).concat(p||[]);o.use(d),o.use(_r(n,r)),Ye({app:o,routing:t,logger:r,config:e}),o.use(It(n,r));let c=o.listen(e.server.listen,()=>{r.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=$r.createServer(e.https.options,o).listen(e.https.listen,()=>{r.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:c,httpsServer:l,logger:r}}import{OpenApiBuilder as vo}from"openapi3-ts/oas30";import{isReferenceObject as Dt,isSchemaObject as ye}from"openapi3-ts/oas30";import{omit as fe}from"ramda";import{z as x}from"zod";import{INVALID as Ct,ZodIssueCode as Je,ZodParsedType as Nt,ZodType as Vr,addIssueToContext as Qe}from"zod";var We=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,Br="ZodDateIn",Ie=class e extends Vr{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==Nt.string)return Qe(o,{code:Je.invalid_type,expected:Nt.string,received:o.parsedType}),Ct;We.test(o.data)||(Qe(o,{code:Je.invalid_string,validation:"regex"}),r.dirty());let n=new Date(o.data);return xe(n)?{status:r.value,value:n}:(Qe(o,{code:Je.invalid_date}),Ct)}static create=()=>new e({typeName:Br})};var q=({schema:e,onEach:t,rules:r,onMissing:o,...n})=>{let s="typeName"in e._def?r[e._def.typeName]:void 0,p=s?s({schema:e,...n,next:c=>q({...c,...n,onEach:t,rules:r,onMissing:o})}):o({schema:e,...n}),d=t&&t({schema:e,prev:p,...n});return d?{...p,...d}:p};var Mt=50,vt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",Yr={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},zt=e=>e.replace(Ue,t=>`{${t.slice(1)}}`),Jr=({schema:{_def:{innerType:e,defaultValue:t}},next:r})=>({...r({schema:e}),default:t()}),Qr=({schema:{_def:{innerType:e}},next:t})=>t({schema:e}),Wr=()=>({format:"any"}),Xr=e=>{if(e.isResponse)throw new Z({message:"Please use z.upload() only for input.",...e});return{type:"string",format:"binary"}},eo=({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"}},to=({schema:{options:e},next:t})=>({oneOf:e.map(r=>t({schema:r}))}),ro=({schema:{options:e,discriminator:t},next:r})=>({discriminator:{propertyName:t},oneOf:Array.from(e.values()).map(o=>r({schema:o}))}),oo=({schema:{_def:{left:e,right:t}},next:r})=>({allOf:[e,t].map(o=>r({schema:o}))}),no=({schema:e,next:t})=>t({schema:e.unwrap()}),so=({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)}),ao=({schema:{value:e}})=>({type:typeof e,enum:[e]}),po=({schema:e,isResponse:t,...r})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(t&&de(s)?s instanceof x.ZodOptional:s.isOptional())});return{type:"object",properties:Ce({schema:e,isResponse:t,...r}),...o.length?{required:o}:{}}},co=()=>({type:"string",nullable:!0,format:"null"}),lo=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:We.source,externalDocs:{url:vt}}},mo=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:vt}}},uo=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})},fo=()=>({type:"boolean"}),yo=()=>({type:"integer",format:"bigint"}),go=({schema:{keySchema:e,valueSchema:t},...r})=>{if(e instanceof x.ZodEnum||e instanceof x.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:t}),{});return{type:"object",properties:Ce({schema:x.object(n),...r}),...o.length?{required:o}:{}}}if(e instanceof x.ZodLiteral)return{type:"object",properties:Ce({schema:x.object({[e.value]:t}),...r}),required:[e.value]};if(e instanceof x.ZodUnion&&e.options.reduce((n,s)=>n&&s instanceof x.ZodLiteral,!0)){let n=e.options.reduce((s,a)=>({...s,[a.value]:t}),{});return{type:"object",properties:Ce({schema:x.object(n),...r}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:r.next({schema:t})}},ho=({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}}),xo=({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}: ${ye(o)?o.type:o.$ref}`).join(", ")}}}},To=({schema:{isEmail:e,isURL:t,minLength:r,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:p,isIP:d,isEmoji:c,isDatetime:l,_def:{checks:h}}})=>{let g=h.find(f=>f.kind==="regex"),T=h.find(f=>f.kind==="datetime"),O=g?g.regex:T?T.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...t&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...p&&{format:"ulid"},...d&&{format:"ip"},...c&&{format:"emoji"},...r!==null&&{minLength:r},...o!==null&&{maxLength:o},...O&&{pattern:`/${O.source}/${O.flags}`}}},So=({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}},Ce=({schema:{shape:e},next:t})=>Object.keys(e).reduce((r,o)=>({...r,[o]:t({schema:e[o]})}),{}),Oo=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Yr?.[t]},bo=({schema:e,isResponse:t,next:r})=>{let o=r({schema:e.innerType()}),{effect:n}=e._def;if(t&&n.type==="transform"&&ye(o)){let s=Oe({effect:n,sample:Oo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:r({schema:x.any()})}if(!t&&n.type==="preprocess"&&ye(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},Ro=({schema:e,isResponse:t,next:r})=>r({schema:e._def[t?"out":"in"]}),Po=({schema:e,next:t})=>t({schema:e.unwrap()}),Zo=({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}))))()},jt=(e,t,r=[])=>{let o=z({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)?fe(r,s):s}}),{})}},Eo=(e,t,r)=>{let o=z({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 ue(e,t){if(e instanceof x.ZodObject)return e;let r;if(e instanceof x.ZodUnion||e instanceof x.ZodDiscriminatedUnion)r=Array.from(e.options.values()).map(o=>ue(o,t)).reduce((o,n)=>o.merge(n.partial()),x.object({}));else if(e instanceof x.ZodEffects){if(D(e))throw new Z({message:`Using transformations on the top level of ${t.isResponse?"response":"input"} schema is not allowed.`,...t});r=ue(e._def.schema,t)}else r=ue(e._def.left,t).merge(ue(e._def.right,t));return ge(e,r)}var Lt=({path:e,method:t,endpoint:r,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="parameter"})=>{let c=r.getSchema("input"),l=ue(c,{path:e,method:t,isResponse:!1}).shape,h=$e(e),g=o.includes("query"),T=o.includes("params"),O=f=>T&&h.includes(f);return Object.keys(l).filter(f=>g||O(f)).map(f=>{let R=q({schema:l[f],isResponse:!1,rules:et,onEach:tt,onMissing:rt,serializer:n,getRef:s,makeRef:a,path:e,method:t}),y=p==="components"?a(C(e,t,`${d} ${f}`),R):R;return{name:f,in:O(f)?"path":"query",required:!l[f].isOptional(),description:ye(R)&&R.description||`${t.toUpperCase()} ${e} ${d}`,schema:y,...Eo(c,!1,f)}})},et={ZodString:To,ZodNumber:So,ZodBigInt:yo,ZodBoolean:fo,ZodDateIn:lo,ZodDateOut:mo,ZodNull:co,ZodArray:ho,ZodTuple:xo,ZodRecord:go,ZodObject:po,ZodLiteral:ao,ZodIntersection:oo,ZodUnion:to,ZodFile:eo,ZodUpload:Xr,ZodAny:Wr,ZodDefault:Jr,ZodEnum:wt,ZodNativeEnum:wt,ZodEffects:bo,ZodOptional:no,ZodNullable:io,ZodDiscriminatedUnion:ro,ZodBranded:Po,ZodDate:uo,ZodCatch:Qr,ZodPipeline:Ro,ZodLazy:Zo,ZodReadonly:so},tt=({schema:e,isResponse:t,prev:r})=>{if(Dt(r))return{};let{description:o}=e,n=e instanceof x.ZodLazy,s=r.type!==void 0,a=t&&de(e),p=!n&&s&&!a&&e.isNullable(),d=n?[]:z({schema:e,variant:t?"parsed":"original",validate:!0});return{...o&&{description:o},...p&&{nullable:!0},...d.length>0&&{example:d[0]}}},rt=({schema:e,...t})=>{throw new Z({message:`Zod type ${e.constructor.name} is unsupported.`,...t})},Xe=(e,t)=>{if(Dt(e))return e;let r=e.properties?fe(t,e.properties):void 0,o=e.example?fe(t,e.example):void 0,n=e.required?e.required.filter(p=>!t.includes(p)):void 0,s=e.allOf?e.allOf.map(p=>Xe(p,t)):void 0,a=e.oneOf?e.oneOf.map(p=>Xe(p,t)):void 0;return fe(Object.entries({properties:r,required:n,example:o,allOf:s,oneOf:a}).filter(([{},p])=>p===void 0).map(([p])=>p),{...e,properties:r,required:n,example:o,allOf:s,oneOf:a})},kt=e=>ye(e)?fe(["example"],e):e,ot=({method:e,path:t,endpoint:r,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:p,clue:d="response"})=>{let c=r.getSchema(o?"positive":"negative"),l=r.getMimeTypes(o?"positive":"negative"),h=kt(q({schema:c,isResponse:!0,rules:et,onEach:tt,onMissing:rt,serializer:n,getRef:s,makeRef:a,path:t,method:e})),g=jt(c,!0),T=p==="components"?a(C(t,e,d),h):h;return{description:`${e.toUpperCase()} ${t} ${d}`,content:l.reduce((O,f)=>({...O,[f]:{schema:T,...g}}),{})}},Ao=()=>({type:"http",scheme:"basic"}),Io=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),Co=({name:e})=>({type:"apiKey",in:"query",name:e}),No=({name:e})=>({type:"apiKey",in:"header",name:e}),Mo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),wo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Do=({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}}},{})}),Ut=e=>{let t={basic:Ao,bearer:Io,input:Co,header:No,cookie:Mo,openid:wo,oauth2:Do};return Re(e,r=>t[r.type](r))},Ne=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 Ne(Ge(e))}return Ne({or:[e]})},Ht=({method:e,path:t,endpoint:r,serializer:o,getRef:n,makeRef:s,composition:a,clue:p="request body"})=>{let d=$e(t),c=kt(Xe(q({schema:r.getSchema("input"),isResponse:!1,rules:et,onEach:tt,onMissing:rt,serializer:o,getRef:n,makeRef:s,path:t,method:e}),d)),l=jt(r.getSchema("input"),!1,d),h=a==="components"?s(C(t,e,p),c):c;return{description:`${e.toUpperCase()} ${t} ${p}`,content:r.getMimeTypes("input").reduce((g,T)=>({...g,[T]:{schema:h,...l}}),{})}},Kt=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<=Mt?e:e.slice(0,Mt-1)+"\u2026";var st=class extends vo{lastSecuritySchemaIds={};lastOperationIdSuffixes={};makeRef(t,r){return this.addSchema(t,r),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,r){let o=C(t,r);return o in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[o]++,`${o}${this.lastOperationIdSuffixes[o]}`):(this.lastOperationIdSuffixes[o]=1,o)}ensureUniqSecuritySchemaName(t){let r=JSON.stringify(t);for(let o in this.rootDoc.components?.securitySchemes||{})if(r===JSON.stringify(this.rootDoc.components?.securitySchemes?.[o]))return o;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}constructor({routing:t,config:r,title:o,version:n,serverUrl:s,successfulResponseDescription:a="Successful response",errorResponseDescription:p="Error response",hasSummaryFromDescription:d=!0,composition:c="inline",serializer:l=Se}){super(),this.addInfo({title:o,version:n}).addServer({url:s}),G({routing:t,onEndpoint:(g,T,O)=>{let f=O,R={path:T,method:f,endpoint:g,composition:c,serializer:l,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[y,E]=["short","long"].map(g.getDescription.bind(g)),F=r.inputSources?.[f]||he[f],re=Lt({...R,inputSources:F}),P={operationId:this.ensureUniqOperationId(T,f),responses:{[g.getStatusCode("positive")]:ot({...R,clue:a,isPositive:!0}),[g.getStatusCode("negative")]:ot({...R,clue:p,isPositive:!1})}};E&&(P.description=E,d&&y===void 0&&(P.summary=nt(E))),y&&(P.summary=nt(y)),g.getTags().length>0&&(P.tags=g.getTags()),re.length>0&&(P.parameters=re),F.includes("body")&&(P.requestBody=Ht(R));let oe=Ne(Re(Ut(g.getSecurity()),ne=>{let ht=this.ensureUniqSecuritySchemaName(ne),dr=["oauth2","openIdConnect"].includes(ne.type)?g.getScopes():[];return this.addSecurityScheme(ht,ne),{name:ht,scopes:dr}}));oe.length>0&&(P.security=oe);let ke=zt(T);this.addPath(ke,{[f]:P})}}),this.rootDoc.tags=r.tags?Kt(r.tags):[]}};import Ft from"http";var zo=e=>({method:"GET",header:jest.fn(()=>$),...e}),jo=e=>{let t={writableEnded:!1,statusCode:200,statusMessage:Ft.STATUS_CODES[200],set:jest.fn(()=>t),setHeader:jest.fn(()=>t),header:jest.fn(()=>t),status:jest.fn(r=>(t.statusCode=r,t.statusMessage=Ft.STATUS_CODES[r],t)),json:jest.fn(()=>t),send:jest.fn(()=>t),end:jest.fn(()=>(t.writableEnded=!0,t)),...e};return t},Lo=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=zo(t),p=jo(r),d={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},c={cors:!1,logger:d,...o};return await e.execute({request:a,response:p,config:c,logger:d}),{requestMock:a,responseMock:p,loggerMock:d}};import K from"typescript";import M from"typescript";var i=M.factory,V=[i.createModifier(M.SyntaxKind.ExportKeyword)],ko=[i.createModifier(M.SyntaxKind.AsyncKeyword)],Uo=[i.createModifier(M.SyntaxKind.PublicKeyword),i.createModifier(M.SyntaxKind.ReadonlyKeyword)],$t=[i.createModifier(M.SyntaxKind.ProtectedKeyword),i.createModifier(M.SyntaxKind.ReadonlyKeyword)],Ho=i.createTemplateHead(""),Ko=i.createTemplateTail(""),Fo=i.createTemplateMiddle(" "),it=e=>i.createTemplateLiteralType(Ho,e.map((t,r)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(t),r===e.length-1?Ko:Fo))),at=it(["M","P"]),Me=(e,t,r)=>i.createParameterDeclaration(r,void 0,e,void 0,t,void 0),we=(e,t)=>Object.keys(e).reduce((r,o)=>r.concat(Me(o,e[o],t)),[]),dt=(e,t)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(t)]),_t=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),pt=(e,t)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(t)),ct=(e,t)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,t)],M.NodeFlags.Const),lt=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,i.createUnionTypeNode(t.map(r=>i.createLiteralTypeNode(i.createStringLiteral(r))))),De=(e,t)=>i.createTypeAliasDeclaration(V,e,void 0,t),Gt=(e,t,r)=>i.createPropertyDeclaration(Uo,e,void 0,t,r),qt=(e,t,r=[])=>i.createClassDeclaration(V,e,void 0,void 0,[t,...r]),Vt=(e,t)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),t)]),Bt=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(M.SyntaxKind.AnyKeyword)]),mt=(e,t,r)=>i.createInterfaceDeclaration(V,e,void 0,t,r),Yt=e=>Object.keys(e).reduce((t,r)=>t.concat(i.createTypeParameterDeclaration([],r,i.createTypeReferenceNode(e[r]))),[]),Jt=(e,t)=>i.createArrowFunction(ko,void 0,e.map(r=>Me(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,we({acc:void 0,key:void 0}),void 0,void 0,t),r]);import u from"typescript";import{z as _o}from"zod";import U from"typescript";var{factory:ve}=U,ft=(e,t)=>{U.addSyntheticLeadingComment(e,U.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0)},ze=(e,t,r)=>{let o=ve.createTypeAliasDeclaration(void 0,ve.createIdentifier(t),void 0,e);return r&&ft(o,r),o},Qt=(e,t)=>{let r=U.createSourceFile("print.ts","",U.ScriptTarget.Latest,!1,U.ScriptKind.TS);return U.createPrinter(t).printNode(U.EmitHint.Unspecified,e,r)},$o=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Wt=e=>$o.test(e)?ve.createIdentifier(e):ve.createStringLiteral(e);var{factory:m}=u,Go={[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},qo=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),Vo=({schema:{shape:e},isResponse:t,next:r,optionalPropStyle:{withQuestionMark:o}})=>{let n=Object.entries(e).map(([s,a])=>{let p=t&&de(a)?a instanceof _o.ZodOptional:a.isOptional(),d=m.createPropertySignature(void 0,Wt(s),p&&o?m.createToken(u.SyntaxKind.QuestionToken):void 0,r({schema:a}));return a.description&&ft(d,a.description),d});return m.createTypeLiteralNode(n)},Bo=({schema:{element:e},next:t})=>m.createArrayTypeNode(t({schema:e})),Yo=({schema:{options:e}})=>m.createUnionTypeNode(e.map(t=>m.createLiteralTypeNode(m.createStringLiteral(t)))),Xt=({schema:{options:e},next:t})=>m.createUnionTypeNode(e.map(r=>t({schema:r}))),Jo=e=>Go?.[e.kind],Qo=({schema:e,next:t,isResponse:r})=>{let o=t({schema:e.innerType()}),n=e._def.effect;if(r&&n.type==="transform"){let s=Oe({effect:n,sample:Jo(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},Wo=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(t=>m.createLiteralTypeNode(typeof t=="number"?m.createNumericLiteral(t):m.createStringLiteral(t)))),Xo=({next:e,schema:t,optionalPropStyle:{withUndefined:r}})=>{let o=e({schema:t.unwrap()});return r?m.createUnionTypeNode([o,m.createKeywordTypeNode(u.SyntaxKind.UndefinedKeyword)]):o},en=({next:e,schema:t})=>m.createUnionTypeNode([e({schema:t.unwrap()}),m.createLiteralTypeNode(m.createNull())]),tn=({next:e,schema:{items:t}})=>m.createTupleTypeNode(t.map(r=>e({schema:r}))),rn=({next:e,schema:{keySchema:t,valueSchema:r}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:t}),e({schema:r})]),on=({next:e,schema:t})=>m.createIntersectionTypeNode([t._def.left,t._def.right].map(r=>e({schema:r}))),nn=({next:e,schema:t})=>e({schema:t._def.innerType}),H=e=>()=>m.createKeywordTypeNode(e),sn=({next:e,schema:t})=>e({schema:t.unwrap()}),an=({next:e,schema:t})=>e({schema:t._def.innerType}),dn=({next:e,schema:t})=>e({schema:t._def.innerType}),pn=({schema:e,next:t,isResponse:r})=>t({schema:e._def[r?"out":"in"]}),cn=()=>m.createLiteralTypeNode(m.createNull()),ln=({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}))))()},mn={ZodString:H(u.SyntaxKind.StringKeyword),ZodNumber:H(u.SyntaxKind.NumberKeyword),ZodBigInt:H(u.SyntaxKind.BigIntKeyword),ZodBoolean:H(u.SyntaxKind.BooleanKeyword),ZodDateIn:H(u.SyntaxKind.StringKeyword),ZodDateOut:H(u.SyntaxKind.StringKeyword),ZodNull:cn,ZodArray:Bo,ZodTuple:tn,ZodRecord:rn,ZodObject:Vo,ZodLiteral:qo,ZodIntersection:on,ZodUnion:Xt,ZodFile:H(u.SyntaxKind.StringKeyword),ZodAny:H(u.SyntaxKind.AnyKeyword),ZodDefault:nn,ZodEnum:Yo,ZodNativeEnum:Wo,ZodEffects:Qo,ZodOptional:Xo,ZodNullable:en,ZodDiscriminatedUnion:Xt,ZodBranded:sn,ZodCatch:dn,ZodPipeline:pn,ZodLazy:ln,ZodReadonly:an},yt=({schema:e,...t})=>q({schema:e,rules:mn,onMissing:()=>m.createKeywordTypeNode(u.SyntaxKind.AnyKeyword),...t});var gt=class{agg=[];registry={};paths=[];aliases={};getAlias(t){return t in this.aliases?i.createTypeReferenceNode(t):void 0}makeAlias(t,r){return this.aliases[t]=ze(r,t),this.getAlias(t)}constructor({routing:t,variant:r="client",serializer:o=Se,optionalPropStyle:n={withQuestionMark:!0,withUndefined:!0}}){G({routing:t,onEndpoint:(y,E,F)=>{let re=C(E,F,"input"),P=C(E,F,"response"),oe={serializer:o,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this),optionalPropStyle:n},ke=yt({...oe,schema:y.getSchema("input"),isResponse:!1}),ne=yt({...oe,isResponse:!0,schema:y.getSchema("positive").or(y.getSchema("negative"))});this.agg.push(ze(ke,re),ze(ne,P)),F!=="options"&&(this.paths.push(E),this.registry[`${F} ${E}`]={in:re,out:P,isJson:y.getMimeTypes("positive").includes($),tags:y.getTags()})}}),this.agg=Object.values(this.aliases).concat(this.agg);let s=lt("Path",this.paths),a=lt("Method",Rt),p=De("MethodPath",it([a.name,s.name])),d=[i.createHeritageClause(K.SyntaxKind.ExtendsKeyword,[dt(p.name,K.SyntaxKind.AnyKeyword)])],c=mt("Input",d,Object.keys(this.registry).map(y=>pt(y,this.registry[y].in))),l=mt("Response",d,Object.keys(this.registry).map(y=>pt(y,this.registry[y].out)));if(this.agg.push(s,a,p,c,l),r==="types")return;let h=i.createVariableStatement(V,ct("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(y=>this.registry[y].isJson).map(y=>i.createPropertyAssignment(`"${y}"`,i.createTrue()))))),g=i.createVariableStatement(V,ct("endpointTags",i.createObjectLiteralExpression(Object.keys(this.registry).map(y=>i.createPropertyAssignment(`"${y}"`,i.createArrayLiteralExpression(this.registry[y].tags.map(E=>i.createStringLiteral(E)))))))),T=De("Provider",i.createFunctionTypeNode(Yt({M:a.name,P:s.name}),we({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(c.name),at)}),Vt(l.name,at))),O=De("Implementation",i.createFunctionTypeNode(void 0,we({method:i.createTypeReferenceNode(a.name),path:i.createKeywordTypeNode(K.SyntaxKind.StringKeyword),params:dt(K.SyntaxKind.StringKeyword,K.SyntaxKind.AnyKeyword)}),Bt())),f=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),R=qt("ExpressZodAPIClient",_t([Me("implementation",i.createTypeReferenceNode(O.name),$t)]),[Gt("provide",i.createTypeReferenceNode(T.name),Jt(["method","path","params"],[i.createIdentifier("method"),ut("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[f,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,[f]),K.SyntaxKind.GreaterThanEqualsToken,i.createNumericLiteral(0)),void 0,i.createIdentifier("acc"),void 0,i.createObjectLiteralExpression([i.createSpreadAssignment(i.createIdentifier("acc")),i.createPropertyAssignment(i.createComputedPropertyName(i.createIdentifier("key")),i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key")))])),i.createObjectLiteralExpression())]))]);K.addSyntheticLeadingComment(R,K.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(h,g,T,O,R)}print(t){return this.agg.map(r=>Yt(r,t)).join(`
55
+ `,!0),this.agg.push(h,g,T,O,R)}print(t){return this.agg.map(r=>Qt(r,t)).join(`
56
56
 
57
- `)}};var sr={};dr(sr,{dateIn:()=>xn,dateOut:()=>Tn,file:()=>gn,upload:()=>hn});import{INVALID as Wt,ZodIssueCode as Xt,ZodParsedType as er,ZodType as cn,addIssueToContext as tr}from"zod";var ln="ZodDateOut",ve=class e extends cn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==er.date?(tr(o,{code:Xt.invalid_type,expected:er.date,received:o.parsedType}),Wt):he(o.data)?{status:r.value,value:o.data.toISOString()}:(tr(o,{code:Xt.invalid_date}),Wt)}static create=()=>new e({typeName:ln})};import{INVALID as mn,ZodIssueCode as rr,ZodParsedType as or,ZodType as un,addIssueToContext as nr}from"zod";var fn="ZodFile",yn=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,je=class e extends un{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==or.string)return nr(o,{code:rr.invalid_type,expected:or.string,received:o.parsedType}),mn;for(let n of this._def.checks)n.kind==="base64"&&(yn.test(o.data)||(nr(o,{code:rr.custom,message:n.message}),r.dirty()));return{status:r.value,value:o.data}}binary=t=>new e({...this._def,checks:[...this._def.checks,{kind:"binary",...$e(t)}]});base64=t=>new e({...this._def,checks:[...this._def.checks,{kind:"base64",...$e(t)}]});get isBinary(){return!!this._def.checks.find(t=>t.kind==="binary")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}static create=()=>new e({checks:[],typeName:fn})};var gn=je.create,hn=q.create,xn=Ae.create,Tn=ve.create;import Va from"http-errors";export{te as AbstractEndpoint,ce as DependsOnMethod,pe as DependsOnMethodError,rt as Documentation,Z as DocumentationError,Pe as EndpointsFactory,w as InputValidationError,ut as Integration,F as OutputValidationError,Y as RoutingError,le as ServeStatic,Fr as attachRouting,pr as createConfig,Va as createHttpError,Ee as createLogger,Ge as createMiddleware,Tt as createResultHandler,$r as createServer,Er as defaultEndpointsFactory,ee as defaultResultHandler,sr as ez,K as getExamples,H as getMessageFromError,Ke as getStatusCodeFromError,zo as testEndpoint,V as withMeta};
57
+ `)}};var ar={};cr(ar,{dateIn:()=>On,dateOut:()=>bn,file:()=>Tn,upload:()=>Sn});import{INVALID as er,ZodIssueCode as tr,ZodParsedType as rr,ZodType as un,addIssueToContext as or}from"zod";var fn="ZodDateOut",je=class e extends un{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);return o.parsedType!==rr.date?(or(o,{code:tr.invalid_type,expected:rr.date,received:o.parsedType}),er):xe(o.data)?{status:r.value,value:o.data.toISOString()}:(or(o,{code:tr.invalid_date}),er)}static create=()=>new e({typeName:fn})};import{INVALID as yn,ZodIssueCode as nr,ZodParsedType as sr,ZodType as gn,addIssueToContext as ir}from"zod";var hn="ZodFile",xn=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Le=class e extends gn{_parse(t){let{status:r,ctx:o}=this._processInputParams(t);if(o.parsedType!==sr.string)return ir(o,{code:nr.invalid_type,expected:sr.string,received:o.parsedType}),yn;for(let n of this._def.checks)n.kind==="base64"&&(xn.test(o.data)||(ir(o,{code:nr.custom,message:n.message}),r.dirty()));return{status:r.value,value:o.data}}binary=t=>new e({...this._def,checks:[...this._def.checks,{kind:"binary",..._e(t)}]});base64=t=>new e({...this._def,checks:[...this._def.checks,{kind:"base64",..._e(t)}]});get isBinary(){return!!this._def.checks.find(t=>t.kind==="binary")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}static create=()=>new e({checks:[],typeName:hn})};var Tn=Le.create,Sn=B.create,On=Ie.create,bn=je.create;import Ya from"http-errors";export{te as AbstractEndpoint,le as DependsOnMethod,pe as DependsOnMethodError,st as Documentation,Z as DocumentationError,ce as EndpointsFactory,j as InputValidationError,gt as Integration,_ as OutputValidationError,J as RoutingError,me as ServeStatic,Cr as arrayEndpointsFactory,Ve as arrayResultHandler,Gr as attachRouting,lr as createConfig,Ya as createHttpError,Ae as createLogger,Be as createMiddleware,qe as createResultHandler,qr as createServer,Ir as defaultEndpointsFactory,ee as defaultResultHandler,ar as ez,z as getExamples,v as getMessageFromError,Te as getStatusCodeFromError,Lo as testEndpoint,w as withMeta};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "express-zod-api",
3
- "version": "12.0.0-beta2",
3
+ "version": "12.0.0-beta3",
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": {