express-zod-api 11.6.0 → 11.7.0

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