express-zod-api 10.1.0 → 10.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  ## Version 10
4
4
 
5
+ ### v10.1.1
6
+
7
+ - Fixed issue #900, found and reported by [Max Cohn](https://github.com/maxcohn).
8
+ - Do not set `nullable` property to the depictions having no `type` property according to OpenAPI specification.
9
+ - Affected schemas: `z.any()` and `z.preprocess()`.
10
+
11
+ ```yaml
12
+ # depiction of z.any() in the generated documentation
13
+ before:
14
+ format: any
15
+ nullable: true
16
+ after:
17
+ format: any
18
+ ```
19
+
5
20
  ### v10.1.0
6
21
 
7
22
  - Feature #876: Supporting `z.lazy()` (including circular schemas) for the client generator.
@@ -712,6 +727,36 @@ const exampleEndpoint = taggedEndpointsFactory.build({
712
727
 
713
728
  ## Version 7
714
729
 
730
+ ### v7.9.4
731
+
732
+ - This version contains a cherry-picked fix made in v8.4.1.
733
+ - Fixed a bug found and reported by [@leosuncin](https://github.com/leosuncin) in issue #705.
734
+ - CORS didn't work well in case of using `DependsOnMethod`.
735
+ - The list of the allowed methods in the response to `OPTIONS` request did only contain the first method declared
736
+ within `DependsOnMethod` instance.
737
+
738
+ ```typescript
739
+ // reproduction minimal setup
740
+ const routing: Routing = {
741
+ test: new DependsOnMethod({
742
+ get: getEndpoint,
743
+ post: postEndpoint,
744
+ }),
745
+ };
746
+ // when requesting OPTIONS for "/test", the response has the following header:
747
+ // Access-Control-Allow-Methods: GET, OPTIONS
748
+ ```
749
+
750
+ ### v7.9.3
751
+
752
+ - This version contains a cherry-picked fix made in v8.3.2.
753
+ - Fixed the bug #673 found and reported by [@shroudedcode](https://github.com/shroudedcode).
754
+ - Preventing double parsing of incoming data by input schemas of middlewares containing transformations.
755
+ - The bug caused inability of using any transforming schema in middlewares.
756
+ - In particular, but not limited with: using `z.dateIn()` in middlewares.
757
+ - Sample error message in this case: `Expected string, received date`.
758
+ - Using `.transform()` method in middlewares was also affected by this bug.
759
+
715
760
  ### v7.9.2
716
761
 
717
762
  - Fixed issue #585 found and reported along with a suggested solution by [@rayzr522](https://github.com/rayzr522).
package/dist/esm/index.js CHANGED
@@ -1,7 +1,7 @@
1
- var Zr=(e,r,t)=>{if(!r.has(e))throw TypeError("Cannot "+t)};var N=(e,r,t)=>{if(r.has(e))throw TypeError("Cannot add the same private member more than once");r instanceof WeakSet?r.add(e):r.set(e,t)};var R=(e,r,t)=>(Zr(e,r,"access private method"),t);var Nt={silent:!0,warn:!0,debug:!0},Er=e=>e;import{z as D}from"zod";import{createHash as Ur}from"crypto";import{HttpError as Hr}from"http-errors";import{z as S}from"zod";import{clone as Ar,mergeDeepRight as Ir}from"ramda";var b="expressZodApiMeta",Cr=e=>{let r=e.constructor,t=Ar(e._def);return t[b]=t[b]||{examples:[]},new r(t)},V=e=>{let r=Cr(e);return Object.defineProperties(r,{example:{get:()=>t=>{let o=V(r);return o._def[b].examples.push(t),o}}}),r},Mt=e=>b in e._def?typeof e._def[b]=="object"&&e._def[b]!==null:!1;function Oe(e,r){if(!Mt(e))return;let t=e._def;return r in t[b]?t[b][r]:void 0}var be=(e,r)=>{if(!Mt(e))return r;let t=V(r),o=ne(t._def[b].examples,e._def[b].examples);if(t._def[b].examples=[],o.type==="single")t._def[b].examples=o.value;else for(let[n,s]of o.value)t._def[b].examples.push(Ir({...n},{...s}));return t};import Nr from"mime";var U=Nr.getType("json")||"application/json",se="multipart/form-data";import{INVALID as Mr,OK as wr,ZodIssueCode as zr,ZodParsedType as Dr,ZodType as vr,addIssueToContext as jr}from"zod";var Lr="ZodUpload",kr=e=>typeof e=="object"&&e!==null&&"name"in e&&"encoding"in e&&"mimetype"in e&&"data"in e&&"tempFilePath"in e&&"truncated"in e&&"size"in e&&"md5"in e&&"mv"in e&&typeof e.name=="string"&&typeof e.mimetype=="string"&&typeof e.data=="object"&&typeof e.tempFilePath=="string"&&typeof e.truncated=="boolean"&&typeof e.size=="number"&&typeof e.md5=="string"&&typeof e.mv=="function",Ye=class extends vr{_parse(r){let{ctx:t}=this._processInputParams(r);return t.parsedType!==Dr.object||!kr(t.data)?(jr(t,{code:zr.custom,message:`Expected file upload, received ${t.parsedType}`}),Mr):wr(t.data)}},H=Ye;H.create=()=>new Ye({typeName:Lr});var Je=/:([A-Za-z0-9_]+)/g;function Kr(e){let t=(e.header("content-type")||"").slice(0,se.length).toLowerCase()===se;return"files"in e&&t}var Pe={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},Fr=["body","query","params"],We=e=>e.method.toLowerCase();function wt(e,r){let t=We(e);if(t==="options")return{};let o=Fr;return t in Pe&&(o=Pe[t]),r&&t in r&&(o=r[t]||o),o.filter(n=>n==="files"?Kr(e):!0).reduce((n,s)=>({...n,...e[s]}),{})}function Qe(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 ae(e){return e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`)}function K(e){return e instanceof S.ZodError?e.issues.map(({path:r,message:t})=>(r.length?[r.join("/")]:[]).concat(t).join(": ")).join("; "):e instanceof F?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message}function Xe(e){return e instanceof Hr?e.statusCode:e instanceof w?400:500}var Ze=(e,r)=>{let t=[],o=Oe(e,"examples");for(let n of o||[]){let s=e.safeParse(n);s.success&&t.push(r?s.data:n)}return t},ne=(e,r)=>{if(e.length===0)return{type:"single",value:r};if(r.length===0)return{type:"single",value:e};let t=[];for(let o of e)for(let n of r)t.push([o,n]);return{type:"tuple",value:t}};function et(e){let r=e.match(Je);return r?r.map(t=>t.slice(1)):[]}var ie=e=>e.reduce((r,t)=>r||t,!1);function M(e){return e instanceof S.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof S.ZodUnion?ie(e.options.map(M)):e instanceof S.ZodIntersection?ie([e._def.left,e._def.right].map(M)):!1}function Z(e){return e instanceof H?!0:e instanceof S.ZodObject?ie(Object.values(e.shape).map(Z)):e instanceof S.ZodUnion?ie(e.options.map(Z)):e instanceof S.ZodIntersection?ie([e._def.left,e._def.right].map(Z)):e instanceof S.ZodOptional||e instanceof S.ZodNullable?Z(e.unwrap()):e instanceof S.ZodEffects||e instanceof S.ZodTransformer?Z(e._def.schema):e instanceof S.ZodRecord?Z(e._def.valueType):e instanceof S.ZodArray?Z(e._def.type):e instanceof S.ZodDefault?Z(e._def.innerType):!1}var de=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,A=(e,r,t)=>[r].concat(e.split("/")).concat(t||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Ee=e=>Ur("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ae=({effect:e,sample:r})=>{try{return typeof e.transform(r,{addIssue:()=>{},path:[]})}catch{return}},tt=e=>typeof e=="string"?{message:e}:e||{};var B=class extends Error{constructor(){super(...arguments);this.name="RoutingError"}},pe=class extends B{constructor(){super(...arguments);this.name="DependsOnMethodError"}},P=class extends Error{constructor(){super(...arguments);this.name="OpenAPIError"}},z=class extends Error{constructor(){super(...arguments);this.name="IOSchemaError"}},F=class extends z{constructor(t){super(K(t));this.name="OutputValidationError";this.originalError=t}},w=class extends z{constructor(t){super(K(t));this.name="InputValidationError";this.originalError=t}},Y=class extends Error{constructor(t,o){super(t);this.name="ResultHandlerError";this.originalError=o||void 0}};var I=e=>typeof e=="object"&&e!==null,Ie=e=>({and:e.reduce((r,t)=>r.concat(I(t)&&"and"in t?t.and:t),[])}),Ce=(e,r)=>{if(I(e)){if("and"in e)return{and:e.and.map(t=>I(t)&&"or"in t?{or:t.or.map(r)}:r(t))};if("or"in e)return{or:e.or.map(t=>I(t)&&"and"in t?{and:t.and.map(r)}:r(t))}}return r(e)},rt=e=>e.and.reduce((r,t)=>{let o=ne(r.or,I(t)&&"or"in t?t.or:[t]);return o.type==="single"?r.or.push(...o.value):r.or=o.value.map(Ie),r},{or:[]}),J=(e,r)=>{if(I(e)){if("and"in e){if(I(r)){if("and"in r)return Ie([e,r]);if("or"in r)return J(rt(e),r)}return Ie([e,r])}if("or"in e){if(I(r)){if("and"in r)return J(r,e);if("or"in r){let t=ne(e.or,r.or);return{or:t.type==="single"?t.value:t.value.map(Ie)}}}return J(e,{and:[r]})}}return I(r)&&("and"in r||"or"in r)?J(r,e):{and:[e,r]}};import{z as W}from"zod";var Q={positive:200,negative:400},zt=e=>e,X=zt({getPositiveResponse:e=>{let r=Oe(e,"examples")||[],t=V(W.object({status:W.literal("success"),data:e}));return r.reduce((o,n)=>o.example({status:"success",data:n}),t)},getNegativeResponse:()=>V(W.object({status:W.literal("error"),error:W.object({message:W.string()})})).example({status:"error",error:{message:K(new Error("Sample error message"))}}),handler:({error:e,input:r,output:t,request:o,response:n,logger:s})=>{if(!e){n.status(Q.positive).json({status:"success",data:t});return}let a=Xe(e);a===500&&s.error(`Internal server error
1
+ var Er=(e,r,t)=>{if(!r.has(e))throw TypeError("Cannot "+t)};var N=(e,r,t)=>{if(r.has(e))throw TypeError("Cannot add the same private member more than once");r instanceof WeakSet?r.add(e):r.set(e,t)};var R=(e,r,t)=>(Er(e,r,"access private method"),t);var Nt={silent:!0,warn:!0,debug:!0},Ar=e=>e;import{z as D}from"zod";import{createHash as Hr}from"crypto";import{HttpError as Kr}from"http-errors";import{z as S}from"zod";import{clone as Ir,mergeDeepRight as Cr}from"ramda";var b="expressZodApiMeta",Nr=e=>{let r=e.constructor,t=Ir(e._def);return t[b]=t[b]||{examples:[]},new r(t)},V=e=>{let r=Nr(e);return Object.defineProperties(r,{example:{get:()=>t=>{let o=V(r);return o._def[b].examples.push(t),o}}}),r},Mt=e=>b in e._def?typeof e._def[b]=="object"&&e._def[b]!==null:!1;function Oe(e,r){if(!Mt(e))return;let t=e._def;return r in t[b]?t[b][r]:void 0}var be=(e,r)=>{if(!Mt(e))return r;let t=V(r),o=ne(t._def[b].examples,e._def[b].examples);if(t._def[b].examples=[],o.type==="single")t._def[b].examples=o.value;else for(let[n,s]of o.value)t._def[b].examples.push(Cr({...n},{...s}));return t};import Mr from"mime";var U=Mr.getType("json")||"application/json",se="multipart/form-data";import{INVALID as wr,OK as zr,ZodIssueCode as Dr,ZodParsedType as vr,ZodType as jr,addIssueToContext as Lr}from"zod";var kr="ZodUpload",Ur=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",Ye=class extends jr{_parse(r){let{ctx:t}=this._processInputParams(r);return t.parsedType!==vr.object||!Ur(t.data)?(Lr(t,{code:Dr.custom,message:`Expected file upload, received ${t.parsedType}`}),wr):zr(t.data)}},H=Ye;H.create=()=>new Ye({typeName:kr});var Je=/:([A-Za-z0-9_]+)/g;function Fr(e){let t=(e.header("content-type")||"").slice(0,se.length).toLowerCase()===se;return"files"in e&&t}var Pe={get:["query","params"],post:["body","params","files"],put:["body","params"],patch:["body","params"],delete:["query","params"]},$r=["body","query","params"],We=e=>e.method.toLowerCase();function wt(e,r){let t=We(e);if(t==="options")return{};let o=$r;return t in Pe&&(o=Pe[t]),r&&t in r&&(o=r[t]||o),o.filter(n=>n==="files"?Fr(e):!0).reduce((n,s)=>({...n,...e[s]}),{})}function Qe(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 ae(e){return e instanceof Error?e:new Error(typeof e=="symbol"?e.toString():`${e}`)}function K(e){return e instanceof S.ZodError?e.issues.map(({path:r,message:t})=>(r.length?[r.join("/")]:[]).concat(t).join(": ")).join("; "):e instanceof F?`output${e.originalError.issues[0]?.path.length>0?"/":": "}${e.message}`:e.message}function Xe(e){return e instanceof Kr?e.statusCode:e instanceof w?400:500}var Ze=(e,r)=>{let t=[],o=Oe(e,"examples");for(let n of o||[]){let s=e.safeParse(n);s.success&&t.push(r?s.data:n)}return t},ne=(e,r)=>{if(e.length===0)return{type:"single",value:r};if(r.length===0)return{type:"single",value:e};let t=[];for(let o of e)for(let n of r)t.push([o,n]);return{type:"tuple",value:t}};function et(e){let r=e.match(Je);return r?r.map(t=>t.slice(1)):[]}var ie=e=>e.reduce((r,t)=>r||t,!1);function M(e){return e instanceof S.ZodEffects&&e._def.effect.type!=="refinement"?!0:e instanceof S.ZodUnion?ie(e.options.map(M)):e instanceof S.ZodIntersection?ie([e._def.left,e._def.right].map(M)):!1}function Z(e){return e instanceof H?!0:e instanceof S.ZodObject?ie(Object.values(e.shape).map(Z)):e instanceof S.ZodUnion?ie(e.options.map(Z)):e instanceof S.ZodIntersection?ie([e._def.left,e._def.right].map(Z)):e instanceof S.ZodOptional||e instanceof S.ZodNullable?Z(e.unwrap()):e instanceof S.ZodEffects||e instanceof S.ZodTransformer?Z(e._def.schema):e instanceof S.ZodRecord?Z(e._def.valueType):e instanceof S.ZodArray?Z(e._def.type):e instanceof S.ZodDefault?Z(e._def.innerType):!1}var de=e=>"coerce"in e._def&&typeof e._def.coerce=="boolean"?e._def.coerce:!1,A=(e,r,t)=>[r].concat(e.split("/")).concat(t||[]).flatMap(o=>o.split(/[^A-Z0-9]/gi)).map(o=>o.slice(0,1).toUpperCase()+o.slice(1).toLowerCase()).join(""),Ee=e=>Hr("sha1").update(JSON.stringify(e),"utf8").digest("hex"),Ae=({effect:e,sample:r})=>{try{return typeof e.transform(r,{addIssue:()=>{},path:[]})}catch{return}},tt=e=>typeof e=="string"?{message:e}:e||{};var B=class extends Error{constructor(){super(...arguments);this.name="RoutingError"}},pe=class extends B{constructor(){super(...arguments);this.name="DependsOnMethodError"}},P=class extends Error{constructor(){super(...arguments);this.name="OpenAPIError"}},z=class extends Error{constructor(){super(...arguments);this.name="IOSchemaError"}},F=class extends z{constructor(t){super(K(t));this.name="OutputValidationError";this.originalError=t}},w=class extends z{constructor(t){super(K(t));this.name="InputValidationError";this.originalError=t}},Y=class extends Error{constructor(t,o){super(t);this.name="ResultHandlerError";this.originalError=o||void 0}};var I=e=>typeof e=="object"&&e!==null,Ie=e=>({and:e.reduce((r,t)=>r.concat(I(t)&&"and"in t?t.and:t),[])}),Ce=(e,r)=>{if(I(e)){if("and"in e)return{and:e.and.map(t=>I(t)&&"or"in t?{or:t.or.map(r)}:r(t))};if("or"in e)return{or:e.or.map(t=>I(t)&&"and"in t?{and:t.and.map(r)}:r(t))}}return r(e)},rt=e=>e.and.reduce((r,t)=>{let o=ne(r.or,I(t)&&"or"in t?t.or:[t]);return o.type==="single"?r.or.push(...o.value):r.or=o.value.map(Ie),r},{or:[]}),J=(e,r)=>{if(I(e)){if("and"in e){if(I(r)){if("and"in r)return Ie([e,r]);if("or"in r)return J(rt(e),r)}return Ie([e,r])}if("or"in e){if(I(r)){if("and"in r)return J(r,e);if("or"in r){let t=ne(e.or,r.or);return{or:t.type==="single"?t.value:t.value.map(Ie)}}}return J(e,{and:[r]})}}return I(r)&&("and"in r||"or"in r)?J(r,e):{and:[e,r]}};import{z as W}from"zod";var Q={positive:200,negative:400},zt=e=>e,X=zt({getPositiveResponse:e=>{let r=Oe(e,"examples")||[],t=V(W.object({status:W.literal("success"),data:e}));return r.reduce((o,n)=>o.example({status:"success",data:n}),t)},getNegativeResponse:()=>V(W.object({status:W.literal("error"),error:W.object({message:W.string()})})).example({status:"error",error:{message:K(new Error("Sample error message"))}}),handler:({error:e,input:r,output:t,request:o,response:n,logger:s})=>{if(!e){n.status(Q.positive).json({status:"success",data:t});return}let a=Xe(e);a===500&&s.error(`Internal server error
2
2
  ${e.stack}
3
3
  `,{url:o.url,payload:r}),n.status(a).json({status:"error",error:{message:K(e)}})}}),Ne=({error:e,logger:r,response:t})=>{r.error(`Result handler failure: ${e.message}.`),t.status(500).end(`An error occurred while serving the result: ${e.message}.`+(e.originalError?`
4
- Original error: ${e.originalError.message}.`:""))};var Dt=(e,r=[U])=>{if(e instanceof D.ZodType)return r;let{mimeTypes:t,mimeType:o}=e;return o?[o]:t||r},ee=class{},we,vt,ze,jt,De,Lt,ve,kt,je,Ut,Me=class extends ee{constructor({middlewares:t,inputSchema:o,outputSchema:n,handler:s,resultHandler:a,description:d,shortDescription:l,...p}){super();N(this,we);N(this,ze);N(this,De);N(this,ve);N(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(M(x))throw new z(`Using transformations on the top level of endpoint ${f} is not allowed.`)}),this.middlewares=t;let c={positive:a.getPositiveResponse(n),negative:a.getNegativeResponse()};this.mimeTypes={input:Z(o)?[se]:[U],positive:Dt(c.positive),negative:Dt(c.negative)},this.schemas={input:o,output:n,positive:c.positive instanceof D.ZodType?c.positive:c.positive.schema,negative:c.negative instanceof D.ZodType?c.negative:c.negative.schema},this.statusCodes={positive:c.positive instanceof D.ZodType?Q.positive:c.positive.statusCode||Q.positive,negative:c.negative instanceof D.ZodType?Q.negative:c.negative.statusCode||Q.negative},this.handler=s,this.resultHandler=a,this.descriptions={long:d,short:l},"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(t){this.siblingMethods=t}getDescription(t){return this.descriptions[t]}getMethods(){return this.methods}getSchema(t){return this.schemas[t]}getMimeTypes(t){return this.mimeTypes[t]}getStatusCode(t){return this.statusCodes[t]}getSecurity(){return this.middlewares.reduce((t,o)=>o.security?J(t,o.security):t,{and:[]})}getScopes(){return this.scopes}getTags(){return this.tags}async execute({request:t,response:o,logger:n,config:s}){let a=We(t),d,l=null;if(s.cors){let c=R(this,we,vt).call(this);typeof s.cors=="function"&&(c=await s.cors({request:t,logger:n,endpoint:this,defaultHeaders:c}));for(let f in c)o.set(f,c[f])}let p=wt(t,s.inputSources);try{let{options:c,isStreamClosed:f}=await R(this,De,Lt).call(this,{method:a,input:p,request:t,response:o,logger:n});if(f)return;if(a==="options"){o.status(200).end();return}d=await R(this,ze,jt).call(this,await R(this,ve,kt).call(this,{input:p,options:c,logger:n}))}catch(c){l=ae(c)}await R(this,je,Ut).call(this,{input:p,output:d,request:t,response:o,error:l,logger:n})}};we=new WeakSet,vt=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"}},ze=new WeakSet,jt=async function(t){try{return await this.schemas.output.parseAsync(t)}catch(o){throw o instanceof D.ZodError?new F(o):o}},De=new WeakSet,Lt=async function({method:t,input:o,request:n,response:s,logger:a}){let d={},l=!1;for(let p of this.middlewares){if(t==="options"&&p.type==="proprietary")continue;let c;try{c=await p.input.parseAsync(o)}catch(f){throw f instanceof D.ZodError?new w(f):f}if(Object.assign(d,await p.middleware({input:c,options:d,request:n,response:s,logger:a})),l="writableEnded"in s&&s.writableEnded,l){a.warn(`The middleware ${p.middleware.name} has closed the stream. Accumulated options:`,d);break}}return{options:d,isStreamClosed:l}},ve=new WeakSet,kt=async function({input:t,options:o,logger:n}){let s;try{s=await this.schemas.input.parseAsync(t)}catch(a){throw a instanceof D.ZodError?new w(a):a}return this.handler({input:s,options:o,logger:n})},je=new WeakSet,Ut=async function({error:t,request:o,response:n,logger:s,input:a,output:d}){try{await this.resultHandler.handler({error:t,output:d,request:o,response:n,logger:s,input:a})}catch(l){Ne({logger:s,response:n,error:new Y(ae(l).message,t)})}};var Ht=["get","post","put","delete","patch"];import{z as Ft}from"zod";var Kt=(e,r)=>{let t=e.map(({input:n})=>n).concat(r),o=t.reduce((n,s)=>n.and(s));return t.reduce((n,s)=>be(s,n),o)};var ot=e=>{if(M(e.input))throw new z("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var re,Le,te=class{constructor(r){this.middlewares=[];this.use=this.addExpressMiddleware;this.resultHandler="resultHandler"in r?r.resultHandler:r}addMiddleware(r){var t;return R(t=te,re,Le).call(t,this.middlewares.concat(r),this.resultHandler)}addExpressMiddleware(r,t){var a;let o=t?.transformer||(d=>d),n=t?.provider||(()=>({})),s={type:"express",input:Ft.object({}),middleware:async({request:d,response:l})=>new Promise((p,c)=>{r(d,l,x=>{if(x&&x instanceof Error)return c(o(x));p(n(d,l))})})};return R(a=te,re,Le).call(a,this.middlewares.concat(s),this.resultHandler)}addOptions(r){var t;return R(t=te,re,Le).call(t,this.middlewares.concat(ot({input:Ft.object({}),middleware:async()=>r})),this.resultHandler)}build({input:r,handler:t,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new Me({handler:t,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:Kt(s,r),...n})}},ce=te;re=new WeakSet,Le=function(r,t){let o=new te(t);return o.middlewares=r,o},N(ce,re);var $r=new ce(X);import{inspect as _r}from"util";import{LEVEL as Gr,MESSAGE as qr,SPLAT as Vr}from"triple-beam";import ke from"winston";var{combine:Br,colorize:Yr,timestamp:Jr,printf:Wr}=ke.format;function Ue(e){let r=s=>{let{[Gr]:a,[qr]:d,[Vr]:l,...p}=s;return _r(p,!1,1,e.color)},t=s=>Wr(({timestamp:a,message:d,level:l,durationMs:p,...c})=>(typeof d=="object"&&(c={...c,...d},d="[No message]"),`${a} ${l}: ${d}`+(p===void 0?"":` duration: ${p}ms`)+(Object.keys(c).length===0?"":" "+(s?r(c):JSON.stringify(c))))),o=[Jr()],n={handleExceptions:!0};switch(e.color&&o.push(Yr()),e.level){case"debug":n.level="debug",o.push(t(!0));break;case"silent":case"warn":default:n.level="warn",o.push(t())}return n.format=Br(...o),ke.createLogger({silent:e.level==="silent",levels:ke.config.npm.levels,transports:[new ke.transports.Console(n)],exitOnError:!1})}var le=class{constructor(r){this.methods=r;Object.keys(r).forEach(t=>{if(t in r&&!(r[t]?.getMethods()||[]).includes(t))throw new pe(`The endpoint assigned to the '${t}' parameter must have at least this method in its specification.
4
+ Original error: ${e.originalError.message}.`:""))};var Dt=(e,r=[U])=>{if(e instanceof D.ZodType)return r;let{mimeTypes:t,mimeType:o}=e;return o?[o]:t||r},ee=class{},we,vt,ze,jt,De,Lt,ve,kt,je,Ut,Me=class extends ee{constructor({middlewares:t,inputSchema:o,outputSchema:n,handler:s,resultHandler:a,description:d,shortDescription:c,...p}){super();N(this,we);N(this,ze);N(this,De);N(this,ve);N(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(M(x))throw new z(`Using transformations on the top level of endpoint ${f} is not allowed.`)}),this.middlewares=t;let l={positive:a.getPositiveResponse(n),negative:a.getNegativeResponse()};this.mimeTypes={input:Z(o)?[se]:[U],positive:Dt(l.positive),negative:Dt(l.negative)},this.schemas={input:o,output:n,positive:l.positive instanceof D.ZodType?l.positive:l.positive.schema,negative:l.negative instanceof D.ZodType?l.negative:l.negative.schema},this.statusCodes={positive:l.positive instanceof D.ZodType?Q.positive:l.positive.statusCode||Q.positive,negative:l.negative instanceof D.ZodType?Q.negative:l.negative.statusCode||Q.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(t){this.siblingMethods=t}getDescription(t){return this.descriptions[t]}getMethods(){return this.methods}getSchema(t){return this.schemas[t]}getMimeTypes(t){return this.mimeTypes[t]}getStatusCode(t){return this.statusCodes[t]}getSecurity(){return this.middlewares.reduce((t,o)=>o.security?J(t,o.security):t,{and:[]})}getScopes(){return this.scopes}getTags(){return this.tags}async execute({request:t,response:o,logger:n,config:s}){let a=We(t),d,c=null;if(s.cors){let l=R(this,we,vt).call(this);typeof s.cors=="function"&&(l=await s.cors({request:t,logger:n,endpoint:this,defaultHeaders:l}));for(let f in l)o.set(f,l[f])}let p=wt(t,s.inputSources);try{let{options:l,isStreamClosed:f}=await R(this,De,Lt).call(this,{method:a,input:p,request:t,response:o,logger:n});if(f)return;if(a==="options"){o.status(200).end();return}d=await R(this,ze,jt).call(this,await R(this,ve,kt).call(this,{input:p,options:l,logger:n}))}catch(l){c=ae(l)}await R(this,je,Ut).call(this,{input:p,output:d,request:t,response:o,error:c,logger:n})}};we=new WeakSet,vt=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"}},ze=new WeakSet,jt=async function(t){try{return await this.schemas.output.parseAsync(t)}catch(o){throw o instanceof D.ZodError?new F(o):o}},De=new WeakSet,Lt=async function({method:t,input:o,request:n,response:s,logger:a}){let d={},c=!1;for(let p of this.middlewares){if(t==="options"&&p.type==="proprietary")continue;let l;try{l=await p.input.parseAsync(o)}catch(f){throw f instanceof D.ZodError?new w(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:t,options:o,logger:n}){let s;try{s=await this.schemas.input.parseAsync(t)}catch(a){throw a instanceof D.ZodError?new w(a):a}return this.handler({input:s,options:o,logger:n})},je=new WeakSet,Ut=async function({error:t,request:o,response:n,logger:s,input:a,output:d}){try{await this.resultHandler.handler({error:t,output:d,request:o,response:n,logger:s,input:a})}catch(c){Ne({logger:s,response:n,error:new Y(ae(c).message,t)})}};var Ht=["get","post","put","delete","patch"];import{z as Ft}from"zod";var Kt=(e,r)=>{let t=e.map(({input:n})=>n).concat(r),o=t.reduce((n,s)=>n.and(s));return t.reduce((n,s)=>be(s,n),o)};var ot=e=>{if(M(e.input))throw new z("Using transformations on the top level of middleware input schema is not allowed.");return{...e,type:"proprietary"}};var re,Le,te=class{constructor(r){this.middlewares=[];this.use=this.addExpressMiddleware;this.resultHandler="resultHandler"in r?r.resultHandler:r}addMiddleware(r){var t;return R(t=te,re,Le).call(t,this.middlewares.concat(r),this.resultHandler)}addExpressMiddleware(r,t){var a;let o=t?.transformer||(d=>d),n=t?.provider||(()=>({})),s={type:"express",input:Ft.object({}),middleware:async({request:d,response:c})=>new Promise((p,l)=>{r(d,c,x=>{if(x&&x instanceof Error)return l(o(x));p(n(d,c))})})};return R(a=te,re,Le).call(a,this.middlewares.concat(s),this.resultHandler)}addOptions(r){var t;return R(t=te,re,Le).call(t,this.middlewares.concat(ot({input:Ft.object({}),middleware:async()=>r})),this.resultHandler)}build({input:r,handler:t,output:o,...n}){let{middlewares:s,resultHandler:a}=this;return new Me({handler:t,middlewares:s,outputSchema:o,resultHandler:a,inputSchema:Kt(s,r),...n})}},ce=te;re=new WeakSet,Le=function(r,t){let o=new te(t);return o.middlewares=r,o},N(ce,re);var _r=new ce(X);import{inspect as Gr}from"util";import{LEVEL as qr,MESSAGE as Vr,SPLAT as Br}from"triple-beam";import ke from"winston";var{combine:Yr,colorize:Jr,timestamp:Wr,printf:Qr}=ke.format;function Ue(e){let r=s=>{let{[qr]:a,[Vr]:d,[Br]:c,...p}=s;return Gr(p,!1,1,e.color)},t=s=>Qr(({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?r(l):JSON.stringify(l))))),o=[Wr()],n={handleExceptions:!0};switch(e.color&&o.push(Jr()),e.level){case"debug":n.level="debug",o.push(t(!0));break;case"silent":case"warn":default:n.level="warn",o.push(t())}return n.format=Yr(...o),ke.createLogger({silent:e.level==="silent",levels:ke.config.npm.levels,transports:[new ke.transports.Console(n)],exitOnError:!1})}var le=class{constructor(r){this.methods=r;Object.keys(r).forEach(t=>{if(t in r&&!(r[t]?.getMethods()||[]).includes(t))throw new pe(`The endpoint assigned to the '${t}' parameter must have at least this method in its specification.
5
5
  This error should prevent mistakes during the development process.
6
6
  Example:
7
7
 
@@ -12,8 +12,8 @@ new ${this.constructor.name}({
12
12
  ...
13
13
  })
14
14
  });
15
- `)})}};import Qr from"express";var me=class{constructor(...r){this.params=r}apply(r,t){return t(r,Qr.static(...this.params))}};var $=({routing:e,onEndpoint:r,onStatic:t,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new B(`Routing elements should not contain '/' character.
16
- The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let d=`${o||""}${s?`/${s}`:""}`;if(a instanceof ee){let l=a.getMethods().slice();n&&l.push("options"),l.forEach(p=>{r(a,d,p)})}else if(a instanceof me)t&&a.apply(d,t);else if(a instanceof le){if(Object.entries(a.methods).forEach(([l,p])=>{r(p,d,l)}),n&&Object.keys(a.methods).length>0){let[l,...p]=Object.keys(a.methods),c=a.methods[l];c._setSiblingMethods(p),r(c,d,"options")}}else $({onEndpoint:r,onStatic:t,hasCors:n,routing:a,parentPath:d})})};var $t=()=>`
15
+ `)})}};import Xr from"express";var me=class{constructor(...r){this.params=r}apply(r,t){return t(r,Xr.static(...this.params))}};var $=({routing:e,onEndpoint:r,onStatic:t,parentPath:o,hasCors:n})=>{Object.entries(e).forEach(([s,a])=>{if(s=s.trim(),s.match(/\//))throw new B(`Routing elements should not contain '/' character.
16
+ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let d=`${o||""}${s?`/${s}`:""}`;if(a instanceof ee){let c=a.getMethods().slice();n&&c.push("options"),c.forEach(p=>{r(a,d,p)})}else if(a instanceof me)t&&a.apply(d,t);else if(a instanceof le){if(Object.entries(a.methods).forEach(([c,p])=>{r(p,d,c)}),n&&Object.keys(a.methods).length>0){let[c,...p]=Object.keys(a.methods),l=a.methods[c];l._setSiblingMethods(p),r(l,d,"options")}}else $({onEndpoint:r,onStatic:t,hasCors:n,routing:a,parentPath:d})})};var $t=()=>`
17
17
  \x1B[94m\x1B[39m
18
18
  \x1B[94m\x1B[39m
19
19
  \x1B[94m8888888888 8888888888P 888 d8888 8888888b. 8888888 \x1B[39m
@@ -30,7 +30,7 @@ The error caused by ${o?`'${o}' route that has a '${s}'`:`'${s}'`} entry.`);let
30
30
  \x1B[90m\x1B[3m Thank you for choosing Express Zod API for your project.\x1B[23m\x1B[39m\x1B[0m\x1B[0m
31
31
  \x1B[0m\x1B[0m
32
32
  \x1B[0m\x1B[0m
33
- `.trim();var nt=({app:e,logger:r,config:t,routing:o})=>{t.startupLogo!==!1&&console.log($t()),$({routing:o,hasCors:!!t.cors,onEndpoint:(n,s,a)=>{e[a](s,async(d,l)=>{r.info(`${d.method}: ${s}`),await n.execute({request:d,response:l,logger:r,config:t})})},onStatic:(n,s)=>{e.use(n,s)}})};import Xr,{json as eo}from"express";import to from"compression";import ro from"express-fileupload";import oo from"https";import no from"http-errors";var so=(e,r)=>(t,o,n,s)=>{if(!t)return s();e.handler({error:t,request:o,response:n,logger:r,input:o.body,output:null})},_t=(e,r)=>(t,o)=>{let n=no(404,`Can not ${t.method} ${t.path}`);try{e.handler({request:t,response:o,logger:r,error:n,input:null,output:null})}catch(s){Ne({response:o,logger:r,error:new Y(ae(s).message,n)})}};function io(e,r){let t=Qe(e.logger)?Ue(e.logger):e.logger;nt({app:e.app,routing:r,logger:t,config:e});let o=e.errorHandler||X;return{notFoundHandler:_t(o,t),logger:t}}function ao(e,r){let t=Qe(e.logger)?Ue(e.logger):e.logger,o=Xr();o.disable("x-powered-by");let n=e.errorHandler||X,s=e.server.compression?to({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||eo(),d=e.server.upload?ro({...typeof e.server.upload=="object"?e.server.upload:{},abortOnLimit:!1,parseNested:!0}):void 0,l=[].concat(s||[]).concat(a).concat(d||[]);o.use(l),o.use(so(n,t)),nt({app:o,routing:r,logger:t,config:e}),o.use(_t(n,t));let p=o.listen(e.server.listen,()=>{t.info(`Listening ${e.server.listen}`)}),c;return e.https&&(c=oo.createServer(e.https.options,o).listen(e.https.listen,()=>{t.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:p,httpsServer:c,logger:t}}import{OpenApiBuilder as Yo}from"openapi3-ts";import{isReferenceObject as lo,isSchemaObject as Ke}from"openapi3-ts";import{omit as ye}from"ramda";import{z as T}from"zod";import{INVALID as Gt,ZodIssueCode as st,ZodParsedType as qt,ZodType as po,addIssueToContext as it}from"zod";var at=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,co="ZodDateIn",dt=class extends po{_parse(r){let{status:t,ctx:o}=this._processInputParams(r);if(o.parsedType!==qt.string)return it(o,{code:st.invalid_type,expected:qt.string,received:o.parsedType}),Gt;at.test(o.data)||(it(o,{code:st.invalid_string,validation:"regex"}),t.dirty());let n=new Date(o.data);return Re(n)?{status:t.value,value:n}:(it(o,{code:st.invalid_date}),Gt)}},ue=dt;ue.create=()=>new dt({typeName:co});var _=({schema:e,onEach:r,rules:t,onMissing:o,...n})=>{let s=r&&r({schema:e,...n}),a="typeName"in e._def?t[e._def.typeName]:void 0,l=a?a({schema:e,...n,next:p=>_({...p,...n,onEach:r,rules:t,onMissing:o})}):o(e);return s?{...l,...s}:l};var Vt=50,Yt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",mo={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Jt=e=>e.replace(Je,r=>`{${r.slice(1)}}`),uo=({schema:{_def:{innerType:e,defaultValue:r}},next:t})=>({...t({schema:e}),default:r()}),fo=({schema:{_def:{innerType:e}},next:r})=>r({schema:e}),yo=()=>({format:"any"}),go=({isResponse:e})=>{if(e)throw new P("Please use z.upload() only for input.");return{type:"string",format:"binary"}},ho=({schema:{isBinary:e,isBase64:r},isResponse:t})=>{if(!t)throw new P("Please use z.file() only within ResultHandler.");return{type:"string",format:e?"binary":r?"byte":"file"}},xo=({schema:{options:e},next:r})=>({oneOf:e.map(t=>r({schema:t}))}),To=({schema:{options:e,discriminator:r},next:t})=>({discriminator:{propertyName:r},oneOf:Array.from(e.values()).map(o=>t({schema:o}))}),So=({schema:{_def:{left:e,right:r}},next:t})=>({allOf:[e,r].map(o=>t({schema:o}))}),Oo=({schema:e,next:r})=>r({schema:e.unwrap()}),bo=({schema:e,next:r})=>({nullable:!0,...r({schema:e.unwrap()})}),Bt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),Po=({schema:{value:e}})=>({type:typeof e,enum:[e]}),Ro=({schema:e,isResponse:r,...t})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(r&&de(s)?s instanceof T.ZodOptional:s.isOptional())});return{type:"object",properties:He({schema:e,isResponse:r,...t}),...o.length?{required:o}:{}}},Zo=()=>({type:"string",nullable:!0,format:"null"}),Eo=({isResponse:e})=>{if(e)throw new P("Please use z.dateOut() for output.");return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:at.source,externalDocs:{url:Yt}}},Ao=({isResponse:e})=>{if(!e)throw new P("Please use z.dateIn() for input.");return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Yt}}},Io=({isResponse:e})=>{throw new P(`Using z.date() within ${e?"output":"input"} schema is forbidden. Please use z.date${e?"Out":"In"}() instead. Check out the documentation for details.`)},Co=()=>({type:"boolean"}),No=()=>({type:"integer",format:"bigint"}),Mo=({schema:{keySchema:e,valueSchema:r},...t})=>{if(e instanceof T.ZodEnum||e instanceof T.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:r}),{});return{type:"object",properties:He({schema:T.object(n),...t}),...o.length?{required:o}:{}}}if(e instanceof T.ZodLiteral)return{type:"object",properties:He({schema:T.object({[e.value]:r}),...t}),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]:r}),{});return{type:"object",properties:He({schema:T.object(n),...t}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:t.next({schema:r})}},wo=({schema:{_def:e,element:r},next:t})=>({type:"array",items:t({schema:r}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),zo=({schema:{items:e},next:r})=>{let t=e.map(o=>r({schema:o}));return{type:"array",minItems:t.length,maxItems:t.length,items:{oneOf:t,format:"tuple",...t.length>0&&{description:t.map((o,n)=>`${n}: ${Ke(o)?o.type:o.$ref}`).join(", ")}}}},Do=({schema:{isEmail:e,isURL:r,minLength:t,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:l,isEmoji:p,isDatetime:c,_def:{checks:f}}})=>{let x=f.find(g=>g.kind==="regex"),h=f.find(g=>g.kind==="datetime"),u=x?x.regex:h?h.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...c&&{format:"date-time"},...e&&{format:"email"},...r&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...d&&{format:"ulid"},...l&&{format:"ip"},...p&&{format:"emoji"},...t!==null&&{minLength:t},...o!==null&&{maxLength:o},...u&&{pattern:`/${u.source}/${u.flags}`}}},vo=({schema:e})=>{let r=e._def.checks.find(({kind:s})=>s==="min"),t=r?r.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:!t,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},He=({schema:{shape:e},next:r})=>Object.keys(e).reduce((t,o)=>({...t,[o]:r({schema:e[o]})}),{}),jo=e=>{let r=Array.isArray(e.type)?e.type[0]:e.type;return mo?.[r]},Lo=({schema:e,isResponse:r,next:t})=>{let o=t({schema:e.innerType()}),{effect:n}=e._def;if(r&&n.type==="transform"&&Ke(o)){let s=Ae({effect:n,sample:jo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:t({schema:T.any()})}if(!r&&n.type==="preprocess"&&Ke(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},ko=({schema:e,isResponse:r,next:t})=>t({schema:e._def[r?"out":"in"]}),Uo=({schema:e,next:r})=>r({schema:e.unwrap()}),Ho=({next:e,schema:r,serializer:t,getRef:o,makeRef:n})=>{let s=t(r.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:r.schema}))))()},Wt=(e,r,t=[])=>{let o=Ze(e,r);return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:ye(t,s)}}),{})}},Ko=(e,r,t)=>{let o=Ze(e,r);return o.length===0?{}:{examples:o.reduce((n,s,a)=>t in s?{...n,[`example${a+1}`]:{value:s[t]}}:n,{})}};function fe(e){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(t=>fe(t)).reduce((t,o)=>t.merge(o.partial()),T.object({}));else if(e instanceof T.ZodEffects){if(M(e))throw new P("Using transformations on the top level of input schema is not allowed.");r=fe(e._def.schema)}else r=fe(e._def.left).merge(fe(e._def.right));return be(e,r)}var Qt=({path:e,method:r,endpoint:t,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:l="parameter"})=>{let p=t.getSchema("input"),c=fe(p).shape,f=et(e),x=o.includes("query"),h=o.includes("params"),u=g=>h&&f.includes(g);return Object.keys(c).filter(g=>x||u(g)).map(g=>{let O=_({schema:c[g],isResponse:!1,rules:ct,onEach:lt,onMissing:mt,serializer:n,getRef:s,makeRef:a}),E=d==="components"?a(A(e,r,`${l} ${g}`),O):O;return{name:g,in:u(g)?"path":"query",required:!c[g].isOptional(),description:`${r.toUpperCase()} ${e} ${l}`,schema:E,...Ko(p,!1,g)}})},ct={ZodString:Do,ZodNumber:vo,ZodBigInt:No,ZodBoolean:Co,ZodDateIn:Eo,ZodDateOut:Ao,ZodNull:Zo,ZodArray:wo,ZodTuple:zo,ZodRecord:Mo,ZodObject:Ro,ZodLiteral:Po,ZodIntersection:So,ZodUnion:xo,ZodFile:ho,ZodUpload:go,ZodAny:yo,ZodDefault:uo,ZodEnum:Bt,ZodNativeEnum:Bt,ZodEffects:Lo,ZodOptional:Oo,ZodNullable:bo,ZodDiscriminatedUnion:To,ZodBranded:Uo,ZodDate:Io,ZodCatch:fo,ZodPipeline:ko,ZodLazy:Ho},lt=({schema:e,isResponse:r})=>{let{description:t}=e,o=e instanceof T.ZodLazy,n=o?[]:Ze(e,r);return{...t&&{description:t},...!o&&e.isNullable()&&!(r&&de(e))&&{nullable:!0},...n.length>0&&{example:n[0]}}},mt=e=>{throw new P(`Zod type ${e.constructor.name} is unsupported`)},pt=(e,r)=>{if(lo(e))return e;let t=e.properties?ye(r,e.properties):void 0,o=e.example?ye(r,e.example):void 0,n=e.required?e.required.filter(d=>!r.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>pt(d,r)):void 0,a=e.oneOf?e.oneOf.map(d=>pt(d,r)):void 0;return ye(Object.entries({properties:t,required:n,example:o,allOf:s,oneOf:a}).filter(([{},d])=>d===void 0).map(([d])=>d),{...e,properties:t,required:n,example:o,allOf:s,oneOf:a})},Xt=e=>Ke(e)?ye(["example"],e):e,ut=({method:e,path:r,endpoint:t,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:l="response"})=>{let p=t.getSchema(o?"positive":"negative"),c=t.getMimeTypes(o?"positive":"negative"),f=Xt(_({schema:p,isResponse:!0,rules:ct,onEach:lt,onMissing:mt,serializer:n,getRef:s,makeRef:a})),x=Wt(p,!0),h=d==="components"?a(A(r,e,l),f):f;return{description:`${e.toUpperCase()} ${r} ${l}`,content:c.reduce((u,g)=>({...u,[g]:{schema:h,...x}}),{})}},Fo=()=>({type:"http",scheme:"basic"}),$o=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),_o=({name:e})=>({type:"apiKey",in:"query",name:e}),Go=({name:e})=>({type:"apiKey",in:"header",name:e}),qo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Vo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Bo=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((r,t)=>{let o=e[t];if(!o)return r;let{scopes:n={},...s}=o;return{...r,[t]:{...s,scopes:n}}},{})}),er=e=>{let r={basic:Fo,bearer:$o,input:_o,header:Go,cookie:qo,openid:Vo,oauth2:Bo};return Ce(e,t=>r[t.type](t))},Fe=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(r=>("and"in r?r.and:[r]).reduce((t,{name:o,scopes:n})=>({...t,[o]:n}),{}));if("and"in e)return Fe(rt(e))}return Fe({or:[e]})},tr=({method:e,path:r,endpoint:t,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let l=et(r),p=Xt(pt(_({schema:t.getSchema("input"),isResponse:!1,rules:ct,onEach:lt,onMissing:mt,serializer:o,getRef:n,makeRef:s}),l)),c=Wt(t.getSchema("input"),!1,l),f=a==="components"?s(A(r,e,d),p):p;return{description:`${e.toUpperCase()} ${r} ${d}`,content:t.getMimeTypes("input").reduce((x,h)=>({...x,[h]:{schema:f,...c}}),{})}},rr=e=>Object.keys(e).map(r=>{let t=e[r];return{name:r,description:typeof t=="string"?t:t.description,...typeof t=="object"&&t.url&&{externalDocs:{url:t.url}}}}),ft=e=>e.length<=Vt?e:e.slice(0,Vt-1)+"\u2026";var yt=class extends Yo{constructor({routing:t,config:o,title:n,version:s,serverUrl:a,successfulResponseDescription:d="Successful response",errorResponseDescription:l="Error response",hasSummaryFromDescription:p=!0,composition:c="inline",serializer:f=Ee}){super();this.lastSecuritySchemaIds={};this.lastOperationIdSuffixes={};this.addInfo({title:n,version:s}).addServer({url:a}),$({routing:t,onEndpoint:(h,u,g)=>{let O=g,E={path:u,method:O,endpoint:h,composition:c,serializer:f,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[G,q]=["short","long"].map(h.getDescription.bind(h)),Te=o.inputSources?.[O]||Pe[O],Se=Qt({...E,inputSources:Te}),C={operationId:this.ensureUniqOperationId(u,O),responses:{[h.getStatusCode("positive")]:ut({...E,clue:d,isPositive:!0}),[h.getStatusCode("negative")]:ut({...E,clue:l,isPositive:!1})}};q&&(C.description=q,p&&G===void 0&&(C.summary=ft(q))),G&&(C.summary=ft(G)),h.getTags().length>0&&(C.tags=h.getTags()),Se.length>0&&(C.parameters=Se),Te.includes("body")&&(C.requestBody=tr(E));let It=Fe(Ce(er(h.getSecurity()),Be=>{let Ct=this.ensureUniqSecuritySchemaName(Be),Rr=["oauth2","openIdConnect"].includes(Be.type)?h.getScopes():[];return this.addSecurityScheme(Ct,Be),{name:Ct,scopes:Rr}}));It.length>0&&(C.security=It);let Pr=Jt(u);this.addPath(Pr,{[O]:C})}}),this.rootDoc.tags=o.tags?rr(o.tags):[]}makeRef(t,o){return this.addSchema(t,o),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,o){let n=A(t,o);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(t){let o=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(o===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}};import or from"http";var Jo=e=>({method:"GET",header:jest.fn(()=>U),...e}),Wo=e=>{let r={writableEnded:!1,statusCode:200,statusMessage:or.STATUS_CODES[200],set:jest.fn(()=>r),status:jest.fn(t=>(r.statusCode=t,r.statusMessage=or.STATUS_CODES[t],r)),json:jest.fn(()=>r),end:jest.fn(()=>(r.writableEnded=!0,r)),...e};return r},Qo=async({endpoint:e,requestProps:r,responseProps:t,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=Jo(r),d=Wo(t),l={info:jest.fn(),warn:jest.fn(),error:jest.fn(),debug:jest.fn(),...n},p={cors:!1,logger:l,...o};return await e.execute({request:a,response:d,config:p,logger:l}),{requestMock:a,responseMock:d,loggerMock:l}};import k from"typescript";import v from"typescript";var i=v.factory,oe=[i.createModifier(v.SyntaxKind.ExportKeyword)],Xo=[i.createModifier(v.SyntaxKind.PublicKeyword),i.createModifier(v.SyntaxKind.ReadonlyKeyword)],nr=[i.createModifier(v.SyntaxKind.ProtectedKeyword),i.createModifier(v.SyntaxKind.ReadonlyKeyword)],en=i.createTemplateHead(""),tn=i.createTemplateTail(""),rn=i.createTemplateMiddle(" "),gt=e=>i.createTemplateLiteralType(en,e.map((r,t)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(r),t===e.length-1?tn:rn))),ht=gt(["M","P"]),$e=(e,r,t)=>i.createParameterDeclaration(t,void 0,e,void 0,r),_e=(e,r)=>Object.keys(e).reduce((t,o)=>t.concat($e(o,e[o],r)),[]),xt=(e,r)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(r)]),sr=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),Tt=(e,r)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(r)),ir=(e,r)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,r)],v.NodeFlags.Const),St=(e,r)=>i.createTypeAliasDeclaration(oe,e,void 0,i.createUnionTypeNode(r.map(t=>i.createLiteralTypeNode(i.createStringLiteral(t))))),Ge=(e,r)=>i.createTypeAliasDeclaration(oe,e,void 0,r),ar=(e,r,t)=>i.createPropertyDeclaration(Xo,e,void 0,r,t),dr=(e,r,t=[])=>i.createClassDeclaration(oe,e,void 0,void 0,[r,...t]),pr=(e,r)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),r)]),cr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(v.SyntaxKind.AnyKeyword)]),Ot=(e,r,t)=>i.createInterfaceDeclaration(oe,e,void 0,r,t),lr=e=>Object.keys(e).reduce((r,t)=>r.concat(i.createTypeParameterDeclaration([],t,i.createTypeReferenceNode(e[t]))),[]),mr=(e,r)=>i.createArrowFunction(void 0,void 0,e.map(t=>$e(t)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,r)),bt=(e,r,t)=>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,r),t]);import y from"typescript";import{z as nn}from"zod";import j from"typescript";var{factory:qe}=j,Pt=(e,r)=>{j.addSyntheticLeadingComment(e,j.SyntaxKind.MultiLineCommentTrivia,`* ${r} `,!0)},Ve=(e,r,t)=>{let o=qe.createTypeAliasDeclaration(void 0,qe.createIdentifier(r),void 0,e);return t&&Pt(o,t),o},ur=(e,r)=>{let t=j.createSourceFile("print.ts","",j.ScriptTarget.Latest,!1,j.ScriptKind.TS);return j.createPrinter(r).printNode(j.EmitHint.Unspecified,e,t)},on=/^[A-Za-z_$][A-Za-z0-9_$]*$/,fr=e=>on.test(e)?qe.createIdentifier(e):qe.createStringLiteral(e);var{factory:m}=y,sn={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},an=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),dn=({schema:{shape:e},isResponse:r,next:t})=>{let o=Object.entries(e).map(([n,s])=>{let a=r&&de(s)?s instanceof nn.ZodOptional:s.isOptional(),d=m.createPropertySignature(void 0,fr(n),a?m.createToken(y.SyntaxKind.QuestionToken):void 0,t({schema:s}));return s.description&&Pt(d,s.description),d});return m.createTypeLiteralNode(o)},pn=({schema:{element:e},next:r})=>m.createArrayTypeNode(r({schema:e})),cn=({schema:{options:e}})=>m.createUnionTypeNode(e.map(r=>m.createLiteralTypeNode(m.createStringLiteral(r)))),yr=({schema:{options:e},next:r})=>m.createUnionTypeNode(e.map(t=>r({schema:t}))),ln=e=>sn?.[e.kind],mn=({schema:e,next:r,isResponse:t})=>{let o=r({schema:e.innerType()}),n=e._def.effect;if(t&&n.type==="transform"){let s=Ae({effect:n,sample:ln(o)}),a={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||y.SyntaxKind.AnyKeyword)}return o},un=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(r=>m.createLiteralTypeNode(typeof r=="number"?m.createNumericLiteral(r):m.createStringLiteral(r)))),fn=({next:e,schema:r})=>m.createUnionTypeNode([e({schema:r.unwrap()}),m.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]),yn=({next:e,schema:r})=>m.createUnionTypeNode([e({schema:r.unwrap()}),m.createLiteralTypeNode(m.createNull())]),gn=({next:e,schema:{items:r}})=>m.createTupleTypeNode(r.map(t=>e({schema:t}))),hn=({next:e,schema:{keySchema:r,valueSchema:t}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:r}),e({schema:t})]),xn=({next:e,schema:r})=>m.createIntersectionTypeNode([r._def.left,r._def.right].map(t=>e({schema:t}))),Tn=({next:e,schema:r})=>e({schema:r._def.innerType}),L=e=>()=>m.createKeywordTypeNode(e),Sn=({next:e,schema:r})=>e({schema:r.unwrap()}),On=({next:e,schema:r})=>e({schema:r._def.innerType}),bn=({schema:e,next:r,isResponse:t})=>r({schema:e._def[t?"out":"in"]}),Pn=()=>m.createLiteralTypeNode(m.createNull()),Rn=({getAlias:e,makeAlias:r,next:t,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(r(s,m.createLiteralTypeNode(m.createNull())),r(s,t({schema:n.schema}))))()},Zn={ZodString:L(y.SyntaxKind.StringKeyword),ZodNumber:L(y.SyntaxKind.NumberKeyword),ZodBigInt:L(y.SyntaxKind.BigIntKeyword),ZodBoolean:L(y.SyntaxKind.BooleanKeyword),ZodDateIn:L(y.SyntaxKind.StringKeyword),ZodDateOut:L(y.SyntaxKind.StringKeyword),ZodNull:Pn,ZodArray:pn,ZodTuple:gn,ZodRecord:hn,ZodObject:dn,ZodLiteral:an,ZodIntersection:xn,ZodUnion:yr,ZodFile:L(y.SyntaxKind.StringKeyword),ZodAny:L(y.SyntaxKind.AnyKeyword),ZodDefault:Tn,ZodEnum:cn,ZodNativeEnum:un,ZodEffects:mn,ZodOptional:fn,ZodNullable:yn,ZodDiscriminatedUnion:yr,ZodBranded:Sn,ZodCatch:On,ZodPipeline:bn,ZodLazy:Rn},Rt=({schema:e,...r})=>_({schema:e,rules:Zn,onMissing:()=>m.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),...r});var Zt=class{constructor({routing:r,serializer:t=Ee}){this.agg=[];this.registry={};this.paths=[];this.aliases={};$({routing:r,onEndpoint:(u,g,O)=>{let E=A(g,O,"input"),G=A(g,O,"response"),q={serializer:t,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this)},Te=Rt({...q,schema:u.getSchema("input"),isResponse:!1}),Se=Rt({...q,isResponse:!0,schema:u.getSchema("positive").or(u.getSchema("negative"))});this.agg.push(Ve(Te,E),Ve(Se,G)),O!=="options"&&(this.paths.push(g),this.registry[`${O} ${g}`]={in:E,out:G,isJson:u.getMimeTypes("positive").includes(U)})}}),this.agg=Object.values(this.aliases).concat(this.agg);let o=St("Path",this.paths),n=St("Method",Ht),s=Ge("MethodPath",gt([n.name,o.name])),a=[i.createHeritageClause(k.SyntaxKind.ExtendsKeyword,[xt(s.name,k.SyntaxKind.AnyKeyword)])],d=Ot("Input",a,Object.keys(this.registry).map(u=>Tt(u,this.registry[u].in))),l=Ot("Response",a,Object.keys(this.registry).map(u=>Tt(u,this.registry[u].out))),p=i.createVariableStatement(oe,ir("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(u=>this.registry[u].isJson).map(u=>i.createPropertyAssignment(`"${u}"`,i.createTrue()))))),c=Ge("Provider",i.createFunctionTypeNode(lr({M:n.name,P:o.name}),_e({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(d.name),ht)}),pr(l.name,ht))),f=Ge("Implementation",i.createFunctionTypeNode(void 0,_e({method:i.createTypeReferenceNode(n.name),path:i.createKeywordTypeNode(k.SyntaxKind.StringKeyword),params:xt(k.SyntaxKind.StringKeyword,k.SyntaxKind.AnyKeyword)}),cr())),x=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),h=dr("ExpressZodAPIClient",sr([$e("implementation",i.createTypeReferenceNode(f.name),nr)]),[ar("provide",i.createTypeReferenceNode(c.name),mr(["method","path","params"],[i.createIdentifier("method"),bt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[x,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),bt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[x]),k.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.addSyntheticLeadingComment(h,k.SyntaxKind.MultiLineCommentTrivia,`
33
+ `.trim();var nt=({app:e,logger:r,config:t,routing:o})=>{t.startupLogo!==!1&&console.log($t()),$({routing:o,hasCors:!!t.cors,onEndpoint:(n,s,a)=>{e[a](s,async(d,c)=>{r.info(`${d.method}: ${s}`),await n.execute({request:d,response:c,logger:r,config:t})})},onStatic:(n,s)=>{e.use(n,s)}})};import eo,{json as to}from"express";import ro from"compression";import oo from"express-fileupload";import no from"https";import so from"http-errors";var io=(e,r)=>(t,o,n,s)=>{if(!t)return s();e.handler({error:t,request:o,response:n,logger:r,input:o.body,output:null})},_t=(e,r)=>(t,o)=>{let n=so(404,`Can not ${t.method} ${t.path}`);try{e.handler({request:t,response:o,logger:r,error:n,input:null,output:null})}catch(s){Ne({response:o,logger:r,error:new Y(ae(s).message,n)})}};function ao(e,r){let t=Qe(e.logger)?Ue(e.logger):e.logger;nt({app:e.app,routing:r,logger:t,config:e});let o=e.errorHandler||X;return{notFoundHandler:_t(o,t),logger:t}}function po(e,r){let t=Qe(e.logger)?Ue(e.logger):e.logger,o=eo();o.disable("x-powered-by");let n=e.errorHandler||X,s=e.server.compression?ro({...typeof e.server.compression=="object"?e.server.compression:{}}):void 0,a=e.server.jsonParser||to(),d=e.server.upload?oo({...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(io(n,t)),nt({app:o,routing:r,logger:t,config:e}),o.use(_t(n,t));let p=o.listen(e.server.listen,()=>{t.info(`Listening ${e.server.listen}`)}),l;return e.https&&(l=no.createServer(e.https.options,o).listen(e.https.listen,()=>{t.info(`Listening ${e.https.listen}`)})),{app:o,httpServer:p,httpsServer:l,logger:t}}import{OpenApiBuilder as Yo}from"openapi3-ts";import{isReferenceObject as Yt,isSchemaObject as Ke}from"openapi3-ts";import{omit as ye}from"ramda";import{z as T}from"zod";import{INVALID as Gt,ZodIssueCode as st,ZodParsedType as qt,ZodType as co,addIssueToContext as it}from"zod";var at=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?)?Z?$/,lo="ZodDateIn",dt=class extends co{_parse(r){let{status:t,ctx:o}=this._processInputParams(r);if(o.parsedType!==qt.string)return it(o,{code:st.invalid_type,expected:qt.string,received:o.parsedType}),Gt;at.test(o.data)||(it(o,{code:st.invalid_string,validation:"regex"}),t.dirty());let n=new Date(o.data);return Re(n)?{status:t.value,value:n}:(it(o,{code:st.invalid_date}),Gt)}},ue=dt;ue.create=()=>new dt({typeName:lo});var _=({schema:e,onEach:r,rules:t,onMissing:o,...n})=>{let s="typeName"in e._def?t[e._def.typeName]:void 0,d=s?s({schema:e,...n,next:p=>_({...p,...n,onEach:r,rules:t,onMissing:o})}):o(e),c=r&&r({schema:e,prev:d,...n});return c?{...d,...c}:d};var Vt=50,Jt="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString",mo={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Wt=e=>e.replace(Je,r=>`{${r.slice(1)}}`),uo=({schema:{_def:{innerType:e,defaultValue:r}},next:t})=>({...t({schema:e}),default:r()}),fo=({schema:{_def:{innerType:e}},next:r})=>r({schema:e}),yo=()=>({format:"any"}),go=({isResponse:e})=>{if(e)throw new P("Please use z.upload() only for input.");return{type:"string",format:"binary"}},ho=({schema:{isBinary:e,isBase64:r},isResponse:t})=>{if(!t)throw new P("Please use z.file() only within ResultHandler.");return{type:"string",format:e?"binary":r?"byte":"file"}},xo=({schema:{options:e},next:r})=>({oneOf:e.map(t=>r({schema:t}))}),To=({schema:{options:e,discriminator:r},next:t})=>({discriminator:{propertyName:r},oneOf:Array.from(e.values()).map(o=>t({schema:o}))}),So=({schema:{_def:{left:e,right:r}},next:t})=>({allOf:[e,r].map(o=>t({schema:o}))}),Oo=({schema:e,next:r})=>r({schema:e.unwrap()}),bo=({schema:e,next:r})=>({nullable:!0,...r({schema:e.unwrap()})}),Bt=({schema:e})=>({type:typeof Object.values(e.enum)[0],enum:Object.values(e.enum)}),Po=({schema:{value:e}})=>({type:typeof e,enum:[e]}),Ro=({schema:e,isResponse:r,...t})=>{let o=Object.keys(e.shape).filter(n=>{let s=e.shape[n];return!(r&&de(s)?s instanceof T.ZodOptional:s.isOptional())});return{type:"object",properties:He({schema:e,isResponse:r,...t}),...o.length?{required:o}:{}}},Zo=()=>({type:"string",nullable:!0,format:"null"}),Eo=({isResponse:e})=>{if(e)throw new P("Please use z.dateOut() for output.");return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",pattern:at.source,externalDocs:{url:Jt}}},Ao=({isResponse:e})=>{if(!e)throw new P("Please use z.dateIn() for input.");return{description:"YYYY-MM-DDTHH:mm:ss.sssZ",type:"string",format:"date-time",externalDocs:{url:Jt}}},Io=({isResponse:e})=>{throw new P(`Using z.date() within ${e?"output":"input"} schema is forbidden. Please use z.date${e?"Out":"In"}() instead. Check out the documentation for details.`)},Co=()=>({type:"boolean"}),No=()=>({type:"integer",format:"bigint"}),Mo=({schema:{keySchema:e,valueSchema:r},...t})=>{if(e instanceof T.ZodEnum||e instanceof T.ZodNativeEnum){let o=Object.values(e.enum),n=o.reduce((s,a)=>({...s,[a]:r}),{});return{type:"object",properties:He({schema:T.object(n),...t}),...o.length?{required:o}:{}}}if(e instanceof T.ZodLiteral)return{type:"object",properties:He({schema:T.object({[e.value]:r}),...t}),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]:r}),{});return{type:"object",properties:He({schema:T.object(n),...t}),required:e.options.map(s=>s.value)}}return{type:"object",additionalProperties:t.next({schema:r})}},wo=({schema:{_def:e,element:r},next:t})=>({type:"array",items:t({schema:r}),...e.minLength!==null&&{minItems:e.minLength.value},...e.maxLength!==null&&{maxItems:e.maxLength.value}}),zo=({schema:{items:e},next:r})=>{let t=e.map(o=>r({schema:o}));return{type:"array",minItems:t.length,maxItems:t.length,items:{oneOf:t,format:"tuple",...t.length>0&&{description:t.map((o,n)=>`${n}: ${Ke(o)?o.type:o.$ref}`).join(", ")}}}},Do=({schema:{isEmail:e,isURL:r,minLength:t,maxLength:o,isUUID:n,isCUID:s,isCUID2:a,isULID:d,isIP:c,isEmoji:p,isDatetime:l,_def:{checks:f}}})=>{let x=f.find(g=>g.kind==="regex"),h=f.find(g=>g.kind==="datetime"),u=x?x.regex:h?h.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"):void 0;return{type:"string",...l&&{format:"date-time"},...e&&{format:"email"},...r&&{format:"url"},...n&&{format:"uuid"},...s&&{format:"cuid"},...a&&{format:"cuid2"},...d&&{format:"ulid"},...c&&{format:"ip"},...p&&{format:"emoji"},...t!==null&&{minLength:t},...o!==null&&{maxLength:o},...u&&{pattern:`/${u.source}/${u.flags}`}}},vo=({schema:e})=>{let r=e._def.checks.find(({kind:s})=>s==="min"),t=r?r.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:!t,maximum:e.maxValue===null?e.isInt?Number.MAX_SAFE_INTEGER:Number.MAX_VALUE:e.maxValue,exclusiveMaximum:!n}},He=({schema:{shape:e},next:r})=>Object.keys(e).reduce((t,o)=>({...t,[o]:r({schema:e[o]})}),{}),jo=e=>{let r=Array.isArray(e.type)?e.type[0]:e.type;return mo?.[r]},Lo=({schema:e,isResponse:r,next:t})=>{let o=t({schema:e.innerType()}),{effect:n}=e._def;if(r&&n.type==="transform"&&Ke(o)){let s=Ae({effect:n,sample:jo(o)});return s&&["number","string","boolean"].includes(s)?{type:s}:t({schema:T.any()})}if(!r&&n.type==="preprocess"&&Ke(o)){let{type:s,...a}=o;return{...a,format:`${a.format||s} (preprocessed)`}}return o},ko=({schema:e,isResponse:r,next:t})=>t({schema:e._def[r?"out":"in"]}),Uo=({schema:e,next:r})=>r({schema:e.unwrap()}),Ho=({next:e,schema:r,serializer:t,getRef:o,makeRef:n})=>{let s=t(r.schema);return o(s)||(()=>(n(s,{}),n(s,e({schema:r.schema}))))()},Qt=(e,r,t=[])=>{let o=Ze(e,r);return o.length===0?{}:{examples:o.reduce((n,s,a)=>({...n,[`example${a+1}`]:{value:ye(t,s)}}),{})}},Ko=(e,r,t)=>{let o=Ze(e,r);return o.length===0?{}:{examples:o.reduce((n,s,a)=>t in s?{...n,[`example${a+1}`]:{value:s[t]}}:n,{})}};function fe(e){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(t=>fe(t)).reduce((t,o)=>t.merge(o.partial()),T.object({}));else if(e instanceof T.ZodEffects){if(M(e))throw new P("Using transformations on the top level of input schema is not allowed.");r=fe(e._def.schema)}else r=fe(e._def.left).merge(fe(e._def.right));return be(e,r)}var Xt=({path:e,method:r,endpoint:t,inputSources:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="parameter"})=>{let p=t.getSchema("input"),l=fe(p).shape,f=et(e),x=o.includes("query"),h=o.includes("params"),u=g=>h&&f.includes(g);return Object.keys(l).filter(g=>x||u(g)).map(g=>{let O=_({schema:l[g],isResponse:!1,rules:ct,onEach:lt,onMissing:mt,serializer:n,getRef:s,makeRef:a}),E=d==="components"?a(A(e,r,`${c} ${g}`),O):O;return{name:g,in:u(g)?"path":"query",required:!l[g].isOptional(),description:`${r.toUpperCase()} ${e} ${c}`,schema:E,...Ko(p,!1,g)}})},ct={ZodString:Do,ZodNumber:vo,ZodBigInt:No,ZodBoolean:Co,ZodDateIn:Eo,ZodDateOut:Ao,ZodNull:Zo,ZodArray:wo,ZodTuple:zo,ZodRecord:Mo,ZodObject:Ro,ZodLiteral:Po,ZodIntersection:So,ZodUnion:xo,ZodFile:ho,ZodUpload:go,ZodAny:yo,ZodDefault:uo,ZodEnum:Bt,ZodNativeEnum:Bt,ZodEffects:Lo,ZodOptional:Oo,ZodNullable:bo,ZodDiscriminatedUnion:To,ZodBranded:Uo,ZodDate:Io,ZodCatch:fo,ZodPipeline:ko,ZodLazy:Ho},lt=({schema:e,isResponse:r,prev:t})=>{if(Yt(t))return{};let{description:o}=e,n=e instanceof T.ZodLazy,s=t.type!==void 0,a=r&&de(e),d=!n&&s&&!a&&e.isNullable(),c=n?[]:Ze(e,r);return{...o&&{description:o},...d&&{nullable:!0},...c.length>0&&{example:c[0]}}},mt=e=>{throw new P(`Zod type ${e.constructor.name} is unsupported`)},pt=(e,r)=>{if(Yt(e))return e;let t=e.properties?ye(r,e.properties):void 0,o=e.example?ye(r,e.example):void 0,n=e.required?e.required.filter(d=>!r.includes(d)):void 0,s=e.allOf?e.allOf.map(d=>pt(d,r)):void 0,a=e.oneOf?e.oneOf.map(d=>pt(d,r)):void 0;return ye(Object.entries({properties:t,required:n,example:o,allOf:s,oneOf:a}).filter(([{},d])=>d===void 0).map(([d])=>d),{...e,properties:t,required:n,example:o,allOf:s,oneOf:a})},er=e=>Ke(e)?ye(["example"],e):e,ut=({method:e,path:r,endpoint:t,isPositive:o,serializer:n,getRef:s,makeRef:a,composition:d,clue:c="response"})=>{let p=t.getSchema(o?"positive":"negative"),l=t.getMimeTypes(o?"positive":"negative"),f=er(_({schema:p,isResponse:!0,rules:ct,onEach:lt,onMissing:mt,serializer:n,getRef:s,makeRef:a})),x=Qt(p,!0),h=d==="components"?a(A(r,e,c),f):f;return{description:`${e.toUpperCase()} ${r} ${c}`,content:l.reduce((u,g)=>({...u,[g]:{schema:h,...x}}),{})}},Fo=()=>({type:"http",scheme:"basic"}),$o=({format:e})=>({type:"http",scheme:"bearer",...e&&{bearerFormat:e}}),_o=({name:e})=>({type:"apiKey",in:"query",name:e}),Go=({name:e})=>({type:"apiKey",in:"header",name:e}),qo=({name:e})=>({type:"apiKey",in:"cookie",name:e}),Vo=({url:e})=>({type:"openIdConnect",openIdConnectUrl:e}),Bo=({flows:e={}})=>({type:"oauth2",flows:Object.keys(e).reduce((r,t)=>{let o=e[t];if(!o)return r;let{scopes:n={},...s}=o;return{...r,[t]:{...s,scopes:n}}},{})}),tr=e=>{let r={basic:Fo,bearer:$o,input:_o,header:Go,cookie:qo,openid:Vo,oauth2:Bo};return Ce(e,t=>r[t.type](t))},Fe=e=>{if(typeof e=="object"){if("or"in e)return e.or.map(r=>("and"in r?r.and:[r]).reduce((t,{name:o,scopes:n})=>({...t,[o]:n}),{}));if("and"in e)return Fe(rt(e))}return Fe({or:[e]})},rr=({method:e,path:r,endpoint:t,serializer:o,getRef:n,makeRef:s,composition:a,clue:d="request body"})=>{let c=et(r),p=er(pt(_({schema:t.getSchema("input"),isResponse:!1,rules:ct,onEach:lt,onMissing:mt,serializer:o,getRef:n,makeRef:s}),c)),l=Qt(t.getSchema("input"),!1,c),f=a==="components"?s(A(r,e,d),p):p;return{description:`${e.toUpperCase()} ${r} ${d}`,content:t.getMimeTypes("input").reduce((x,h)=>({...x,[h]:{schema:f,...l}}),{})}},or=e=>Object.keys(e).map(r=>{let t=e[r];return{name:r,description:typeof t=="string"?t:t.description,...typeof t=="object"&&t.url&&{externalDocs:{url:t.url}}}}),ft=e=>e.length<=Vt?e:e.slice(0,Vt-1)+"\u2026";var yt=class extends Yo{constructor({routing:t,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}),$({routing:t,onEndpoint:(h,u,g)=>{let O=g,E={path:u,method:O,endpoint:h,composition:l,serializer:f,getRef:this.getRef.bind(this),makeRef:this.makeRef.bind(this)},[G,q]=["short","long"].map(h.getDescription.bind(h)),Te=o.inputSources?.[O]||Pe[O],Se=Xt({...E,inputSources:Te}),C={operationId:this.ensureUniqOperationId(u,O),responses:{[h.getStatusCode("positive")]:ut({...E,clue:d,isPositive:!0}),[h.getStatusCode("negative")]:ut({...E,clue:c,isPositive:!1})}};q&&(C.description=q,p&&G===void 0&&(C.summary=ft(q))),G&&(C.summary=ft(G)),h.getTags().length>0&&(C.tags=h.getTags()),Se.length>0&&(C.parameters=Se),Te.includes("body")&&(C.requestBody=rr(E));let It=Fe(Ce(tr(h.getSecurity()),Be=>{let Ct=this.ensureUniqSecuritySchemaName(Be),Zr=["oauth2","openIdConnect"].includes(Be.type)?h.getScopes():[];return this.addSecurityScheme(Ct,Be),{name:Ct,scopes:Zr}}));It.length>0&&(C.security=It);let Rr=Wt(u);this.addPath(Rr,{[O]:C})}}),this.rootDoc.tags=o.tags?or(o.tags):[]}makeRef(t,o){return this.addSchema(t,o),this.getRef(t)}getRef(t){return t in(this.rootDoc.components?.schemas||{})?{$ref:`#/components/schemas/${t}`}:void 0}ensureUniqOperationId(t,o){let n=A(t,o);return n in this.lastOperationIdSuffixes?(this.lastOperationIdSuffixes[n]++,`${n}${this.lastOperationIdSuffixes[n]}`):(this.lastOperationIdSuffixes[n]=1,n)}ensureUniqSecuritySchemaName(t){let o=JSON.stringify(t);for(let n in this.rootDoc.components?.securitySchemes||{})if(o===JSON.stringify(this.rootDoc.components?.securitySchemes?.[n]))return n;return this.lastSecuritySchemaIds[t.type]=(this.lastSecuritySchemaIds?.[t.type]||0)+1,`${t.type.toUpperCase()}_${this.lastSecuritySchemaIds[t.type]}`}};import nr from"http";var Jo=e=>({method:"GET",header:jest.fn(()=>U),...e}),Wo=e=>{let r={writableEnded:!1,statusCode:200,statusMessage:nr.STATUS_CODES[200],set:jest.fn(()=>r),status:jest.fn(t=>(r.statusCode=t,r.statusMessage=nr.STATUS_CODES[t],r)),json:jest.fn(()=>r),end:jest.fn(()=>(r.writableEnded=!0,r)),...e};return r},Qo=async({endpoint:e,requestProps:r,responseProps:t,configProps:o,loggerProps:n,__noJest:s})=>{if(!jest||s)throw new Error("You need to install Jest in order to use testEndpoint().");let a=Jo(r),d=Wo(t),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 k from"typescript";import v from"typescript";var i=v.factory,oe=[i.createModifier(v.SyntaxKind.ExportKeyword)],Xo=[i.createModifier(v.SyntaxKind.PublicKeyword),i.createModifier(v.SyntaxKind.ReadonlyKeyword)],sr=[i.createModifier(v.SyntaxKind.ProtectedKeyword),i.createModifier(v.SyntaxKind.ReadonlyKeyword)],en=i.createTemplateHead(""),tn=i.createTemplateTail(""),rn=i.createTemplateMiddle(" "),gt=e=>i.createTemplateLiteralType(en,e.map((r,t)=>i.createTemplateLiteralTypeSpan(i.createTypeReferenceNode(r),t===e.length-1?tn:rn))),ht=gt(["M","P"]),$e=(e,r,t)=>i.createParameterDeclaration(t,void 0,e,void 0,r),_e=(e,r)=>Object.keys(e).reduce((t,o)=>t.concat($e(o,e[o],r)),[]),xt=(e,r)=>i.createExpressionWithTypeArguments(i.createIdentifier("Record"),[typeof e=="number"?i.createKeywordTypeNode(e):i.createTypeReferenceNode(e),i.createKeywordTypeNode(r)]),ir=e=>i.createConstructorDeclaration(void 0,e,i.createBlock([])),Tt=(e,r)=>i.createPropertySignature(void 0,`"${e}"`,void 0,i.createTypeReferenceNode(r)),ar=(e,r)=>i.createVariableDeclarationList([i.createVariableDeclaration(e,void 0,void 0,r)],v.NodeFlags.Const),St=(e,r)=>i.createTypeAliasDeclaration(oe,e,void 0,i.createUnionTypeNode(r.map(t=>i.createLiteralTypeNode(i.createStringLiteral(t))))),Ge=(e,r)=>i.createTypeAliasDeclaration(oe,e,void 0,r),dr=(e,r,t)=>i.createPropertyDeclaration(Xo,e,void 0,r,t),pr=(e,r,t=[])=>i.createClassDeclaration(oe,e,void 0,void 0,[r,...t]),cr=(e,r)=>i.createTypeReferenceNode("Promise",[i.createIndexedAccessTypeNode(i.createTypeReferenceNode(e),r)]),lr=()=>i.createTypeReferenceNode("Promise",[i.createKeywordTypeNode(v.SyntaxKind.AnyKeyword)]),Ot=(e,r,t)=>i.createInterfaceDeclaration(oe,e,void 0,r,t),mr=e=>Object.keys(e).reduce((r,t)=>r.concat(i.createTypeParameterDeclaration([],t,i.createTypeReferenceNode(e[t]))),[]),ur=(e,r)=>i.createArrowFunction(void 0,void 0,e.map(t=>$e(t)),void 0,void 0,i.createCallExpression(i.createPropertyAccessExpression(i.createThis(),"implementation"),void 0,r)),bt=(e,r,t)=>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,r),t]);import y from"typescript";import{z as nn}from"zod";import j from"typescript";var{factory:qe}=j,Pt=(e,r)=>{j.addSyntheticLeadingComment(e,j.SyntaxKind.MultiLineCommentTrivia,`* ${r} `,!0)},Ve=(e,r,t)=>{let o=qe.createTypeAliasDeclaration(void 0,qe.createIdentifier(r),void 0,e);return t&&Pt(o,t),o},fr=(e,r)=>{let t=j.createSourceFile("print.ts","",j.ScriptTarget.Latest,!1,j.ScriptKind.TS);return j.createPrinter(r).printNode(j.EmitHint.Unspecified,e,t)},on=/^[A-Za-z_$][A-Za-z0-9_$]*$/,yr=e=>on.test(e)?qe.createIdentifier(e):qe.createStringLiteral(e);var{factory:m}=y,sn={[y.SyntaxKind.AnyKeyword]:"",[y.SyntaxKind.BigIntKeyword]:BigInt(0),[y.SyntaxKind.BooleanKeyword]:!1,[y.SyntaxKind.NumberKeyword]:0,[y.SyntaxKind.ObjectKeyword]:{},[y.SyntaxKind.StringKeyword]:"",[y.SyntaxKind.UndefinedKeyword]:void 0},an=({schema:{value:e}})=>m.createLiteralTypeNode(typeof e=="number"?m.createNumericLiteral(e):typeof e=="boolean"?e?m.createTrue():m.createFalse():m.createStringLiteral(e)),dn=({schema:{shape:e},isResponse:r,next:t})=>{let o=Object.entries(e).map(([n,s])=>{let a=r&&de(s)?s instanceof nn.ZodOptional:s.isOptional(),d=m.createPropertySignature(void 0,yr(n),a?m.createToken(y.SyntaxKind.QuestionToken):void 0,t({schema:s}));return s.description&&Pt(d,s.description),d});return m.createTypeLiteralNode(o)},pn=({schema:{element:e},next:r})=>m.createArrayTypeNode(r({schema:e})),cn=({schema:{options:e}})=>m.createUnionTypeNode(e.map(r=>m.createLiteralTypeNode(m.createStringLiteral(r)))),gr=({schema:{options:e},next:r})=>m.createUnionTypeNode(e.map(t=>r({schema:t}))),ln=e=>sn?.[e.kind],mn=({schema:e,next:r,isResponse:t})=>{let o=r({schema:e.innerType()}),n=e._def.effect;if(t&&n.type==="transform"){let s=Ae({effect:n,sample:ln(o)}),a={number:y.SyntaxKind.NumberKeyword,bigint:y.SyntaxKind.BigIntKeyword,boolean:y.SyntaxKind.BooleanKeyword,string:y.SyntaxKind.StringKeyword,undefined:y.SyntaxKind.UndefinedKeyword,object:y.SyntaxKind.ObjectKeyword};return m.createKeywordTypeNode(s&&a[s]||y.SyntaxKind.AnyKeyword)}return o},un=({schema:e})=>m.createUnionTypeNode(Object.values(e.enum).map(r=>m.createLiteralTypeNode(typeof r=="number"?m.createNumericLiteral(r):m.createStringLiteral(r)))),fn=({next:e,schema:r})=>m.createUnionTypeNode([e({schema:r.unwrap()}),m.createKeywordTypeNode(y.SyntaxKind.UndefinedKeyword)]),yn=({next:e,schema:r})=>m.createUnionTypeNode([e({schema:r.unwrap()}),m.createLiteralTypeNode(m.createNull())]),gn=({next:e,schema:{items:r}})=>m.createTupleTypeNode(r.map(t=>e({schema:t}))),hn=({next:e,schema:{keySchema:r,valueSchema:t}})=>m.createExpressionWithTypeArguments(m.createIdentifier("Record"),[e({schema:r}),e({schema:t})]),xn=({next:e,schema:r})=>m.createIntersectionTypeNode([r._def.left,r._def.right].map(t=>e({schema:t}))),Tn=({next:e,schema:r})=>e({schema:r._def.innerType}),L=e=>()=>m.createKeywordTypeNode(e),Sn=({next:e,schema:r})=>e({schema:r.unwrap()}),On=({next:e,schema:r})=>e({schema:r._def.innerType}),bn=({schema:e,next:r,isResponse:t})=>r({schema:e._def[t?"out":"in"]}),Pn=()=>m.createLiteralTypeNode(m.createNull()),Rn=({getAlias:e,makeAlias:r,next:t,serializer:o,schema:n})=>{let s=`Type${o(n.schema)}`;return e(s)||(()=>(r(s,m.createLiteralTypeNode(m.createNull())),r(s,t({schema:n.schema}))))()},Zn={ZodString:L(y.SyntaxKind.StringKeyword),ZodNumber:L(y.SyntaxKind.NumberKeyword),ZodBigInt:L(y.SyntaxKind.BigIntKeyword),ZodBoolean:L(y.SyntaxKind.BooleanKeyword),ZodDateIn:L(y.SyntaxKind.StringKeyword),ZodDateOut:L(y.SyntaxKind.StringKeyword),ZodNull:Pn,ZodArray:pn,ZodTuple:gn,ZodRecord:hn,ZodObject:dn,ZodLiteral:an,ZodIntersection:xn,ZodUnion:gr,ZodFile:L(y.SyntaxKind.StringKeyword),ZodAny:L(y.SyntaxKind.AnyKeyword),ZodDefault:Tn,ZodEnum:cn,ZodNativeEnum:un,ZodEffects:mn,ZodOptional:fn,ZodNullable:yn,ZodDiscriminatedUnion:gr,ZodBranded:Sn,ZodCatch:On,ZodPipeline:bn,ZodLazy:Rn},Rt=({schema:e,...r})=>_({schema:e,rules:Zn,onMissing:()=>m.createKeywordTypeNode(y.SyntaxKind.AnyKeyword),...r});var Zt=class{constructor({routing:r,serializer:t=Ee}){this.agg=[];this.registry={};this.paths=[];this.aliases={};$({routing:r,onEndpoint:(u,g,O)=>{let E=A(g,O,"input"),G=A(g,O,"response"),q={serializer:t,getAlias:this.getAlias.bind(this),makeAlias:this.makeAlias.bind(this)},Te=Rt({...q,schema:u.getSchema("input"),isResponse:!1}),Se=Rt({...q,isResponse:!0,schema:u.getSchema("positive").or(u.getSchema("negative"))});this.agg.push(Ve(Te,E),Ve(Se,G)),O!=="options"&&(this.paths.push(g),this.registry[`${O} ${g}`]={in:E,out:G,isJson:u.getMimeTypes("positive").includes(U)})}}),this.agg=Object.values(this.aliases).concat(this.agg);let o=St("Path",this.paths),n=St("Method",Ht),s=Ge("MethodPath",gt([n.name,o.name])),a=[i.createHeritageClause(k.SyntaxKind.ExtendsKeyword,[xt(s.name,k.SyntaxKind.AnyKeyword)])],d=Ot("Input",a,Object.keys(this.registry).map(u=>Tt(u,this.registry[u].in))),c=Ot("Response",a,Object.keys(this.registry).map(u=>Tt(u,this.registry[u].out))),p=i.createVariableStatement(oe,ar("jsonEndpoints",i.createObjectLiteralExpression(Object.keys(this.registry).filter(u=>this.registry[u].isJson).map(u=>i.createPropertyAssignment(`"${u}"`,i.createTrue()))))),l=Ge("Provider",i.createFunctionTypeNode(mr({M:n.name,P:o.name}),_e({method:i.createTypeReferenceNode("M"),path:i.createTypeReferenceNode("P"),params:i.createIndexedAccessTypeNode(i.createTypeReferenceNode(d.name),ht)}),cr(c.name,ht))),f=Ge("Implementation",i.createFunctionTypeNode(void 0,_e({method:i.createTypeReferenceNode(n.name),path:i.createKeywordTypeNode(k.SyntaxKind.StringKeyword),params:xt(k.SyntaxKind.StringKeyword,k.SyntaxKind.AnyKeyword)}),lr())),x=i.createTemplateExpression(i.createTemplateHead(":"),[i.createTemplateSpan(i.createIdentifier("key"),i.createTemplateTail(""))]),h=pr("ExpressZodAPIClient",ir([$e("implementation",i.createTypeReferenceNode(f.name),sr)]),[dr("provide",i.createTypeReferenceNode(l.name),ur(["method","path","params"],[i.createIdentifier("method"),bt("params",i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("acc"),"replace"),void 0,[x,i.createElementAccessExpression(i.createIdentifier("params"),i.createIdentifier("key"))]),i.createIdentifier("path")),bt("params",i.createConditionalExpression(i.createBinaryExpression(i.createCallExpression(i.createPropertyAccessExpression(i.createIdentifier("path"),"indexOf"),void 0,[x]),k.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.addSyntheticLeadingComment(h,k.SyntaxKind.MultiLineCommentTrivia,`
34
34
  export const exampleImplementation: Implementation = async (
35
35
  method,
36
36
  path,
@@ -51,7 +51,7 @@ export const exampleImplementation: Implementation = async (
51
51
 
52
52
  const client = new ExpressZodAPIClient(exampleImplementation);
53
53
  client.provide("get", "/v1/user/retrieve", { id: "10" });
54
- `,!0),this.agg.push(o,n,s,d,l,p,c,f,h)}getAlias(r){return r in this.aliases?i.createTypeReferenceNode(r):void 0}makeAlias(r,t){return this.aliases[r]=Ve(t,r),this.getAlias(r)}print(r){return this.agg.map(t=>ur(t,r)).join(`
54
+ `,!0),this.agg.push(o,n,s,d,c,p,l,f,h)}getAlias(r){return r in this.aliases?i.createTypeReferenceNode(r):void 0}makeAlias(r,t){return this.aliases[r]=Ve(t,r),this.getAlias(r)}print(r){return this.agg.map(t=>fr(t,r)).join(`
55
55
 
56
- `)}};import{INVALID as gr,ZodIssueCode as hr,ZodParsedType as xr,ZodType as En,addIssueToContext as Tr}from"zod";var An="ZodDateOut",Et=class extends En{_parse(r){let{status:t,ctx:o}=this._processInputParams(r);return o.parsedType!==xr.date?(Tr(o,{code:hr.invalid_type,expected:xr.date,received:o.parsedType}),gr):Re(o.data)?{status:t.value,value:o.data.toISOString()}:(Tr(o,{code:hr.invalid_date}),gr)}},ge=Et;ge.create=()=>new Et({typeName:An});import{INVALID as In,ZodIssueCode as Sr,ZodParsedType as Or,ZodType as Cn,addIssueToContext as br}from"zod";var Nn="ZodFile",Mn=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,xe=class extends Cn{constructor(){super(...arguments);this.binary=t=>new xe({...this._def,checks:[...this._def.checks,{kind:"binary",...tt(t)}]});this.base64=t=>new xe({...this._def,checks:[...this._def.checks,{kind:"base64",...tt(t)}]})}_parse(t){let{status:o,ctx:n}=this._processInputParams(t);if(n.parsedType!==Or.string)return br(n,{code:Sr.invalid_type,expected:Or.string,received:n.parsedType}),In;for(let s of this._def.checks)s.kind==="base64"&&(Mn.test(n.data)||(br(n,{code:Sr.custom,message:s.message}),o.dirty()));return{status:o.value,value:n.data}}get isBinary(){return!!this._def.checks.find(t=>t.kind==="binary")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}},he=xe;he.create=()=>new xe({checks:[],typeName:Nn});var At;(n=>(n.file=he.create,n.upload=H.create,n.dateIn=ue.create,n.dateOut=ge.create))(At||(At={}));import ld from"http-errors";export{ee as AbstractEndpoint,Zt as Client,le as DependsOnMethod,pe as DependsOnMethodError,ce as EndpointsFactory,w as InputValidationError,yt as OpenAPI,P as OpenAPIError,F as OutputValidationError,B as RoutingError,me as ServeStatic,io as attachRouting,Er as createConfig,ld as createHttpError,Ue as createLogger,ot as createMiddleware,zt as createResultHandler,ao as createServer,$r as defaultEndpointsFactory,X as defaultResultHandler,At as ez,K as getMessageFromError,Xe as getStatusCodeFromError,Qo as testEndpoint,V as withMeta};
56
+ `)}};import{INVALID as hr,ZodIssueCode as xr,ZodParsedType as Tr,ZodType as En,addIssueToContext as Sr}from"zod";var An="ZodDateOut",Et=class extends En{_parse(r){let{status:t,ctx:o}=this._processInputParams(r);return o.parsedType!==Tr.date?(Sr(o,{code:xr.invalid_type,expected:Tr.date,received:o.parsedType}),hr):Re(o.data)?{status:t.value,value:o.data.toISOString()}:(Sr(o,{code:xr.invalid_date}),hr)}},ge=Et;ge.create=()=>new Et({typeName:An});import{INVALID as In,ZodIssueCode as Or,ZodParsedType as br,ZodType as Cn,addIssueToContext as Pr}from"zod";var Nn="ZodFile",Mn=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,xe=class extends Cn{constructor(){super(...arguments);this.binary=t=>new xe({...this._def,checks:[...this._def.checks,{kind:"binary",...tt(t)}]});this.base64=t=>new xe({...this._def,checks:[...this._def.checks,{kind:"base64",...tt(t)}]})}_parse(t){let{status:o,ctx:n}=this._processInputParams(t);if(n.parsedType!==br.string)return Pr(n,{code:Or.invalid_type,expected:br.string,received:n.parsedType}),In;for(let s of this._def.checks)s.kind==="base64"&&(Mn.test(n.data)||(Pr(n,{code:Or.custom,message:s.message}),o.dirty()));return{status:o.value,value:n.data}}get isBinary(){return!!this._def.checks.find(t=>t.kind==="binary")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}},he=xe;he.create=()=>new xe({checks:[],typeName:Nn});var At;(n=>(n.file=he.create,n.upload=H.create,n.dateIn=ue.create,n.dateOut=ge.create))(At||(At={}));import ld from"http-errors";export{ee as AbstractEndpoint,Zt as Client,le as DependsOnMethod,pe as DependsOnMethodError,ce as EndpointsFactory,w as InputValidationError,yt as OpenAPI,P as OpenAPIError,F as OutputValidationError,B as RoutingError,me as ServeStatic,ao as attachRouting,Ar as createConfig,ld as createHttpError,Ue as createLogger,ot as createMiddleware,zt as createResultHandler,po as createServer,_r as defaultEndpointsFactory,X as defaultResultHandler,At as ez,K as getMessageFromError,Xe as getStatusCodeFromError,Qo as testEndpoint,V as withMeta};
57
57
  //# sourceMappingURL=index.js.map