zod-sockets
Version:
Socket.IO solution with I/O validation and the ability to generate AsyncAPI specification and a contract for consumers
17 lines (14 loc) • 23.8 kB
JavaScript
;var nt=Object.create;var pe=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var it=Object.getOwnPropertyNames;var st=Object.getPrototypeOf,at=Object.prototype.hasOwnProperty;var ct=(e,t)=>{for(var o in t)pe(e,o,{get:t[o],enumerable:!0})},Pe=(e,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of it(t))!at.call(e,n)&&n!==o&&pe(e,n,{get:()=>t[n],enumerable:!(r=rt(t,n))||r.enumerable});return e};var $=(e,t,o)=>(o=e!=null?nt(st(e)):{},Pe(t||!e||!e.__esModule?pe(o,"default",{value:e,enumerable:!0}):o,e)),pt=e=>Pe(pe({},"__esModule",{value:!0}),e);var qt={};ct(qt,{AbstractAction:()=>ie,ActionsFactory:()=>be,Config:()=>ne,Documentation:()=>Oe,InputValidationError:()=>L,Integration:()=>xe,OutputValidationError:()=>V,attachSockets:()=>Be,createSimpleConfig:()=>Ve});module.exports=pt(qt);var _=require("zod/v4"),B=$(require("ramda"),1),de=B.tryCatch((e,t)=>typeof _.z.parse(e,t),B.always(void 0)),dt=e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase(),C=e=>e.charAt(0).toLowerCase()+e.slice(1),l=(...e)=>e.flatMap(t=>t.split(/[^A-Z0-9]/gi)).flatMap(t=>t.replaceAll(/[A-Z]+/g,o=>`/${o}`).split("/")).map(dt).join(""),Ue=e=>e instanceof Error?e:e instanceof _.z.ZodError?new _.z.ZodRealError(e.issues):new Error(String(e)),ke=e=>e instanceof _.z.ZodError?e.issues.map(({path:t,message:o})=>`${t.length?`${_.z.core.toDotPath(t)}: `:""}${o}`).join("; "):e.message,E=(e,t)=>$e(e)&&"_zod"in e&&(t?B.path(["_zod","def","type"],e)===t:!0),$e=e=>typeof e=="object"&&e!==null;var me=e=>({join:async t=>e.join(t),leave:async t=>typeof t=="string"?e.leave(t):Promise.all(t.map(o=>e.leave(o))).then(()=>{})});var Le=$(require("node:assert/strict"),1);var ue=({sockets:e,...t})=>e.map(o=>({id:o.id,handshake:o.handshake,rooms:Array.from(o.rooms),getData:()=>o.data||{},emit:P({subject:o,...t}),...me(o)}));function P({subject:e,emission:t,timeout:o}){return async(r,...n)=>{let i="id"in e;(0,Le.default)(r in t,new Error(`Unsupported event ${r}`));let{schema:s,ack:a}=t[r],d=s.parse(n);if(!a)return e.emit(String(r),...d)||!0;let y=await e.timeout(o).emitWithAck(String(r),...d);return(i?a:a.array()).parse(y)}}var Ee=({subject:e,...t})=>o=>({getClients:async()=>ue({sockets:await e.in(o).fetchSockets(),...t}),broadcast:P({...t,subject:e.to(o)})});var Fe={onConnection:({client:{id:e,getData:t},logger:o})=>o.debug("Client connected",{...t(),id:e}),onDisconnect:({client:{id:e,getData:t},logger:o})=>o.debug("Client disconnected",{...t(),id:e}),onAnyIncoming:({event:e,client:{id:t,getData:o},logger:r})=>r.debug(`${e} from ${t}`,o()),onAnyOutgoing:({event:e,logger:t,payload:o})=>t.debug(`Sending ${e}`,o),onStartup:({logger:e})=>e.debug("Ready"),onError:({logger:e,event:t,error:o})=>e.error(t?`${t} handling error`:"Error",o)};var le="/",H=e=>{let t=e.trim();return t.startsWith("/")?t:`/${t}`};var U=require("ansis"),b=$(require("ramda"),1),mt=(0,U.italic)("for Sheila".padEnd(40)),ut="Proudly supports non-binary community.".padStart(57),lt=`
,,
MMM"""AMV \u1FEF7MM .M"""bgd \u1FEF7MM mm
M\u2019 AMV MM ,MI "Y MM MM
\u1FEF AMV ,pW"Wq. ,M""bMM \u1FEFMMb. ,pW"Wq. ,p6"bo MM ,MP\u2019 .gP"Ya mmMMmm ,pP"Ybd
AMV 6W\u2019 \u1FEFWb ,AP MM \u1FEFYMMNq. 6W\u2019 \u1FEFWb 6M\u2019 OO MM ;Y ,M\u2019 Yb MM 8I \u1FEF"
AMV , 8M M8 8MI MM . \u1FEFMM 8M M8 8M MM;Mm 8M"""""" MM \u1FEFYMMMa.
AMV ,M YA. ,A9 \u1FEFMb MM Mb dM YA. ,A9 YM. , MM \u1FEFMb. YM. , MM L. I8
AMVmmmmMM \u1FEFYbmd9\u2019 \u1FEFWbmd"MML. P"Ybmmd" \u1FEFYbmd9\u2019 YMbmd\u2019 .JMML. YA. \u1FEFMbmmd\u2019 \u1FEFMbmo M9mmmP\u2019
${mt}${ut}
`,ft=b.cond([[b.gt(4),b.always((0,U.hex)("#FCF434"))],[b.gt(5),b.always((0,U.hex)("#FFF"))],[b.gt(8),b.always((0,U.hex)("#9C59D1"))],[b.T,b.always((0,U.hex)("#383838"))]]),_e=()=>lt.split(`
`).map((e,t)=>ft(t)(e)).join(`
`);var Be=async({io:e,actions:t,target:o,config:{namespaces:r,timeout:n,startupLogo:i=!0},logger:s=console})=>{for(let a in r){let d=e.of(H(a)),{emission:y,hooks:S,metadata:T}=r[a],{onConnection:te,onDisconnect:z,onAnyIncoming:R,onAnyOutgoing:v,onStartup:D,onError:N}={...Fe,...S},O={emission:y,timeout:n},oe={logger:s,withRooms:Ee({subject:e,metadata:T,...O}),all:{getClients:async()=>ue({sockets:await d.fetchSockets(),metadata:T,...O}),getRooms:()=>Array.from(d.adapter.rooms.keys()),broadcast:P({subject:e,...O})}};d.on("connection",async m=>{let Z=P({subject:m,...O}),M=P({subject:m.broadcast,...O}),A={emit:Z,broadcast:M,id:m.id,handshake:m.handshake,getRequest:()=>m.request,isConnected:()=>m.connected,getRooms:()=>Array.from(m.rooms),getData:()=>m.data||{},setData:g=>{T.parse(g),m.data=g},...me(m)},k={...oe,client:A,withRooms:Ee({subject:m,metadata:T,...O})};await te(k),m.onAny((g,...w)=>R({event:g,payload:w,...k})),m.onAnyOutgoing((g,...w)=>v({event:g,payload:w,...k}));for(let g of t)if(g.namespace===a){let{event:w}=g;m.on(w,async(...De)=>{try{return await g.execute({params:De,...k})}catch(ot){return N({...k,event:w,payload:De,error:Ue(ot)})}})}m.on("disconnect",()=>z(k))}),await D(oe)}return(i?console.log:()=>{})(_e()),s.debug("Running","v4.1.2 (CJS)"),s.info("Listening",o.address()),e.attach(o)};var He=require("zod/v4");var ne=class e{timeout;startupLogo;security;namespaces;constructor({timeout:t=2e3,startupLogo:o=!0,namespaces:r={},security:n=[]}={}){this.timeout=t,this.startupLogo=o,this.namespaces=r,this.security=n}addNamespace({path:t=le,emission:o={},metadata:r=He.z.object({}),hooks:n={},security:i=[]}){let{namespaces:s,...a}=this,d={emission:o,hooks:n,metadata:r,security:i};return new e({...a,namespaces:{...s,[t]:d}})}},Ve=({startupLogo:e,timeout:t,security:o,emission:r,hooks:n,metadata:i}={})=>new ne({startupLogo:e,timeout:t,security:o}).addNamespace({emission:r,metadata:i,hooks:n});var Se=$(require("ramda"),1),re=require("zod/v4");var We=require("zod/v4");var fe=class extends Error{name="IOSchemaError"},L=class extends fe{constructor(o){super(ke(o),{cause:o});this.cause=o}name="InputValidationError"},V=class extends fe{constructor(o){let r=new We.z.ZodError(o.issues.map(({path:n,...i})=>({...i,path:["output",...n]})));super(ke(r),{cause:o});this.cause=o}name="OutputValidationError"};var ye=require("zod/v4");var F=(e,t,o)=>{let r=ye.z.function({input:e,output:t}),n=ye.z.custom().transform((i,s)=>typeof i!="function"?(s.addIssue({...o,code:"custom",message:`Expected function, received ${typeof s.value}`}),ye.z.NEVER):r.implement(i));return Object.assign(n._zod.bag,{brand:"function",input:e,output:t}),n},he=e=>e._zod.bag.brand==="function"&&E(e._zod.bag.input,"tuple")&&E(e._zod.bag.output);var ie=class{},ge=class extends ie{#o;#t;#e;#n;#r;constructor(t){super(),this.#o=t.event,this.#t=t.ns||le,this.#e=t.input,this.#n="output"in t?t.output:void 0,this.#r=t.handler}get event(){return this.#o}get namespace(){return this.#t}get inputSchema(){return this.#e}get outputSchema(){return this.#n}#i(t){let o=this.#n?Se.init(t):t;try{return this.#e.parse(o)}catch(r){throw r instanceof re.z.ZodError?new L(r):r}}#s(t){if(this.#n)try{return F(this.#n,re.z.void(),{path:[Math.max(0,t.length-1)]}).parse(Se.last(t))}catch(o){throw o instanceof re.z.ZodError?new L(o):o}}#a(t){if(this.#n)try{return this.#n.parse(t)}catch(o){throw o instanceof re.z.ZodError?new V(o):o}}async execute({params:t,logger:o,...r}){let n=this.#i(t);o.debug(`${this.#o}: parsed input (${this.#n?"excl.":"no"} ack)`,n);let i=this.#s(t),s=await this.#r({input:n,logger:o,...r}),a=this.#a(s);i&&a&&(o.debug(`${this.#o}: parsed output`,a),i(...a))}};var be=class{constructor(t){this.config=t}build(t){return new ge(t)}};var ze=$(require("typescript"),1);var j=$(require("ramda"),1),x=require("zod/v4");var Je=(...e)=>e,Re=(e,t,o=3)=>{if(!t)return F(e,x.z.void());let r=F(t,x.z.void()),n=e._zod.def.rest;if(!n||o<=0)return F(x.z.tuple(Je(...e._zod.def.items,r)),x.z.void());let i=x.globalRegistry.get(n)?.description,s=j.range(0,o).map(a=>{let d=[...e._zod.def.items].concat(j.range(1,a+1).map(y=>{let S=x.z.clone(n);return x.globalRegistry.add(S,{description:`${i||"rest"}${y}`}),S})).concat(r);return F(x.z.tuple(Je(...d)),x.z.void())});return x.z.union(s)},Ye=(e,{io:t})=>{let r=[x.z.toJSONSchema(e,{io:t,unrepresentable:"any",override:({jsonSchema:n})=>{typeof n.default=="bigint"&&delete n.default}})];for(;r.length;){let n=r.shift();if(j.is(Object,n)){if(n.$ref==="#")return!0;r.push(...j.values(n))}j.is(Array,n)&&r.push(...j.values(n))}return!1};var p=$(require("typescript"),1),G=require("zod/v4");var Ze=(e,{onEach:t,rules:o,onMissing:r,ctx:n={}})=>{let i=o[he(e)?"function":e._zod.def.type],a=i?i(e,{...n,next:y=>Ze(y,{ctx:n,onEach:t,rules:o,onMissing:r})}):r(e,n),d=t&&t(e,{prev:a,...n});return d?{...a,...d}:a};var f=$(require("ramda"),1);var W=$(require("ramda"),1),u=$(require("typescript"),1),c=u.default.factory,J=[c.createModifier(u.default.SyntaxKind.ExportKeyword)],se=(e,t)=>u.default.addSyntheticLeadingComment(e,u.default.SyntaxKind.MultiLineCommentTrivia,`* ${t} `,!0),qe=(e,t)=>{let o=u.default.createSourceFile("print.ts","",u.default.ScriptTarget.Latest,!1,u.default.ScriptKind.TS);return u.default.createPrinter(t).printNode(u.default.EmitHint.Unspecified,e,o)},yt=/^[A-Za-z_$][A-Za-z0-9_$]*$/,ht=e=>typeof e=="string"&&yt.test(e)?c.createIdentifier(e):Qe(e),K=(e,t)=>typeof e=="number"?c.createKeywordTypeNode(e):typeof e=="string"||u.default.isIdentifier(e)?c.createTypeReferenceNode(e,t&&W.map(K,t)):e,Y=e=>{let t=new Map;for(let o of e)t.set(St(o)?o.kind:o,o);return c.createUnionTypeNode(Array.from(t.values()))},Ge=(e,t,{isOptional:o,isDeprecated:r,comment:n}={})=>{let i=K(t),s=c.createPropertySignature(void 0,ht(e),o?c.createToken(u.default.SyntaxKind.QuestionToken):void 0,o?Y([i,K(u.default.SyntaxKind.UndefinedKeyword)]):i),a=W.reject(W.isNil,[r?"@deprecated":void 0,n]);return a.length?se(s,a.join(" ")):s},Me=(e,t,{expose:o,comment:r}={})=>{let n=c.createTypeAliasDeclaration(o?J:void 0,e,void 0,t);return r?se(n,r):n},Qe=e=>typeof e=="number"?c.createNumericLiteral(e):typeof e=="bigint"?c.createBigIntLiteral(e.toString()):typeof e=="boolean"?e?c.createTrue():c.createFalse():e===null?c.createNull():c.createStringLiteral(e),q=e=>c.createLiteralTypeNode(Qe(e)),gt=[u.default.SyntaxKind.AnyKeyword,u.default.SyntaxKind.BigIntKeyword,u.default.SyntaxKind.BooleanKeyword,u.default.SyntaxKind.NeverKeyword,u.default.SyntaxKind.NumberKeyword,u.default.SyntaxKind.ObjectKeyword,u.default.SyntaxKind.StringKeyword,u.default.SyntaxKind.SymbolKeyword,u.default.SyntaxKind.UndefinedKeyword,u.default.SyntaxKind.UnknownKeyword,u.default.SyntaxKind.VoidKeyword],St=e=>gt.includes(e.kind);var{factory:h}=p.default,bt={[p.default.SyntaxKind.AnyKeyword]:"",[p.default.SyntaxKind.BigIntKeyword]:BigInt(0),[p.default.SyntaxKind.BooleanKeyword]:!1,[p.default.SyntaxKind.NumberKeyword]:0,[p.default.SyntaxKind.ObjectKeyword]:{},[p.default.SyntaxKind.StringKeyword]:"",[p.default.SyntaxKind.UndefinedKeyword]:void 0},Ce={name:f.path(["name","text"]),type:f.path(["type"]),optional:f.path(["questionToken"])},xt=({_zod:{def:e}})=>{let t=e.values.map(o=>o===void 0?K(p.default.SyntaxKind.UndefinedKeyword):q(o));return t.length===1?t[0]:Y(t)},Tt=({_zod:{def:e}},{next:t})=>{let o=[...e.parts],r=()=>{let s="";for(;o.length;){let a=o.shift();if(E(a)){o.unshift(a);break}s+=a??""}return s},n=h.createTemplateHead(r()),i=[];for(;o.length;){let s=t(o.shift()),a=r(),d=o.length?h.createTemplateMiddle:h.createTemplateTail;i.push(h.createTemplateLiteralTypeSpan(s,d(a)))}return i.length?h.createTemplateLiteralType(n,i):q(n.text)},Nt=(e,{isResponse:t,next:o,makeAlias:r})=>{let n=()=>{let i=Object.entries(e._zod.def.shape).map(([s,a])=>{let{description:d,deprecated:y}=G.globalRegistry.get(a)||{};return Ge(s,o(a),{comment:d,isDeprecated:y,isOptional:(t?a._zod.optout:a._zod.optin)==="optional"})});return h.createTypeLiteralNode(i)};return Ye(e,{io:t?"output":"input"})?r(e,n):n()},Ot=({_zod:{def:e}},{next:t})=>h.createArrayTypeNode(t(e.element)),kt=({_zod:{def:e}})=>Y(Object.values(e.entries).map(q)),$t=({_zod:{def:e}},{next:t})=>Y(e.options.map(t)),Et=e=>bt?.[e.kind],Rt=({_zod:{def:e}},{next:t})=>Y([t(e.innerType),q(null)]),Zt=({_zod:{def:e}},{next:t})=>h.createTupleTypeNode(e.items.map(t).concat(e.rest===null?[]:h.createRestTypeNode(t(e.rest)))),Mt=({_zod:{def:e}},{next:t})=>K("Record",[e.keyType,e.valueType].map(t)),Ct=f.tryCatch(e=>{if(!e.every(p.default.isTypeLiteralNode))throw new Error("Not objects");let t=f.chain(f.prop("members"),e),o=f.uniqWith((...r)=>{if(!f.eqBy(Ce.name,...r))return!1;if(f.both(f.eqBy(Ce.type),f.eqBy(Ce.optional))(...r))return!0;throw new Error("Has conflicting prop")},t);return h.createTypeLiteralNode(o)},(e,t)=>h.createIntersectionTypeNode(t)),Kt=({_zod:{def:e}},{next:t})=>Ct([e.left,e.right].map(t)),I=e=>()=>K(e),ae=({_zod:{def:e}},{next:t})=>t(e.innerType),Xe=e=>K(e?p.default.SyntaxKind.UnknownKeyword:p.default.SyntaxKind.AnyKeyword),zt=({_zod:{def:e}},{next:t,isResponse:o})=>{let r=e[o?"out":"in"],n=e[o?"in":"out"];if(!E(r,"transform"))return t(r);let i=t(n),s=de(r,E(n,"date")?new Date:Et(i)),a={number:p.default.SyntaxKind.NumberKeyword,bigint:p.default.SyntaxKind.BigIntKeyword,boolean:p.default.SyntaxKind.BooleanKeyword,string:p.default.SyntaxKind.StringKeyword,undefined:p.default.SyntaxKind.UndefinedKeyword,object:p.default.SyntaxKind.ObjectKeyword};return K(s&&a[s]||Xe(o))},At=()=>q(null),wt=({_zod:{def:e}},{makeAlias:t,next:o})=>t(e.getter,()=>o(e.getter())),jt=()=>K("Date"),It=(e,{next:t})=>{let o=e._zod.bag.input._zod.def.items.map((n,i)=>{let{description:s}=G.globalRegistry.get(n)||{};return h.createParameterDeclaration(void 0,void 0,h.createIdentifier(s?C(l(s)):`${he(n)?"cb":"p"}${i+1}`),void 0,t(n))}),{rest:r}=e._zod.bag.input._zod.def;if(r){let{description:n}=G.globalRegistry.get(r)||{};o.push(h.createParameterDeclaration(void 0,h.createToken(p.default.SyntaxKind.DotDotDotToken),h.createIdentifier(n?C(l(n)):"rest"),void 0,t(G.z.array(r))))}return h.createFunctionTypeNode(void 0,o,t(e._zod.bag.output))},vt={string:I(p.default.SyntaxKind.StringKeyword),number:I(p.default.SyntaxKind.NumberKeyword),bigint:I(p.default.SyntaxKind.BigIntKeyword),boolean:I(p.default.SyntaxKind.BooleanKeyword),any:I(p.default.SyntaxKind.AnyKeyword),undefined:I(p.default.SyntaxKind.UndefinedKeyword),never:I(p.default.SyntaxKind.NeverKeyword),void:I(p.default.SyntaxKind.VoidKeyword),unknown:I(p.default.SyntaxKind.UnknownKeyword),date:jt,null:At,array:Ot,tuple:Zt,record:Mt,object:Nt,literal:xt,template_literal:Tt,intersection:Kt,union:$t,default:ae,enum:kt,optional:ae,nonoptional:ae,nullable:Rt,catch:ae,pipe:zt,lazy:wt,readonly:ae,function:It},Ke=(e,t)=>Ze(e,{rules:vt,onMissing:({},{isResponse:o})=>Xe(o),ctx:t});var Dt="root",et=["emission","actions"],xe=class{#o=[];#t={};#e={path:c.createIdentifier("path"),socket:c.createIdentifier("Socket"),socketBase:c.createIdentifier("SocketBase"),ioClient:c.createStringLiteral("socket.io-client"),emission:c.createIdentifier(l(et[0])),actions:c.createIdentifier(l(et[1]))};registry={};#n(t,o,r){let n=this.#t[t].get(o)?.name?.text;if(!n){n=`Type${this.#t[t].size+1}`;let i=c.createLiteralTypeNode(c.createNull());this.#t[t].set(o,Me(n,i)),this.#t[t].set(o,Me(n,r()))}return c.createTypeReferenceNode(n)}constructor({config:{namespaces:t},actions:o,maxOverloads:r=3}){this.#o.push(c.createImportDeclaration(void 0,c.createImportClause(!0,void 0,c.createNamedImports([c.createImportSpecifier(!1,this.#e.socket,this.#e.socketBase)])),this.#e.ioClient));for(let[n,{emission:i}]of Object.entries(t)){this.#t[n]=new Map,this.registry[n]={emission:[],actions:[]};let s={makeAlias:this.#n.bind(this,n)};for(let[a,{schema:d,ack:y}]of Object.entries(i)){let S=Ke(Re(d,y,r),{isResponse:!0,...s});this.registry[n].emission.push({event:a,node:S})}for(let a of o)if(a.namespace===n){let{event:d,inputSchema:y,outputSchema:S}=a,T=Ke(Re(y,S,r),{isResponse:!1,...s});this.registry[n].actions.push({event:d,node:T})}}for(let n in this.registry){let i=l(n)||l(Dt),s=c.createVariableStatement(J,c.createVariableDeclarationList([c.createVariableDeclaration(this.#e.path,void 0,void 0,c.createStringLiteral(H(n)))],ze.default.NodeFlags.Const));se(s,`@desc The actual path of the ${i} namespace`);let a=Object.entries(this.registry[n]).map(([y,S])=>c.createInterfaceDeclaration(J,l(y),void 0,void 0,S.map(({event:T,node:te})=>c.createPropertySignature(void 0,T,void 0,te)))),d=c.createTypeAliasDeclaration(J,this.#e.socket,void 0,c.createTypeReferenceNode(this.#e.socketBase,[c.createTypeReferenceNode(this.#e.emission),c.createTypeReferenceNode(this.#e.actions)]));se(d,`@example const socket: ${i}.${this.#e.socket.text} = io(${i}.${this.#e.path.text})`),this.#o.push(c.createModuleDeclaration(J,c.createIdentifier(i),c.createModuleBlock([s,...this.#t[n].values(),...a,d]),ze.default.NodeFlags.Namespace))}}print(t){return this.#o.map(o=>qe(o,t)).join(`
`)}};var ee=require("zod/v4");var tt=$(require("yaml"),1),Te=class{document;constructor(t){this.document={asyncapi:"3.0.0",...t,servers:{},channels:{},components:{}}}addServer(t,o){return this.document.servers={...this.document.servers,[t]:o},this}addChannel(t,o){return this.document.channels={...this.document.channels,[t]:o},this}addOperation(t,o){return this.document.operations={...this.document.operations,[t]:o},this}addSecurityScheme(t,o){return this.document.components={...this.document.components,securitySchemes:{...this.document.components?.securitySchemes,[t]:o}},this}addSchema(t,o){return this.document.components={...this.document.components,schemas:{...this.document.components?.schemas,[t]:o}},this}getSpec(){return this.document}getSpecAsJson(t,o){return JSON.stringify(this.document,t,o)}getSpecAsYaml(){return tt.default.stringify(this.document)}};var Q=$(require("ramda"),1),X=require("zod/v4");function Ae(e){return"$ref"in e}var Pt={integer:0,number:0,string:"",boolean:!1,object:{},null:null,array:[]},Ut=({zodSchema:e,jsonSchema:t})=>{if(!E(e,"union")||!("discriminator"in e._zod.def))return t;let o=e._zod.def.discriminator;return{...t,discriminator:t.discriminator??{propertyName:o}}},Lt=({jsonSchema:e})=>{if(!e.anyOf)return e;let t=e.anyOf[0];return Object.assign(t,{type:Vt(t.type)})},Ft=()=>({type:"string",format:"bigint",pattern:/^-?\d+$/.source}),_t=({zodSchema:e,jsonSchema:t})=>e._zod.def.rest!==null?t:{...t,items:{not:{}}},Bt=({zodSchema:e,jsonSchema:t},o)=>{let r=e._zod.def[o.isResponse?"out":"in"],n=e._zod.def[o.isResponse?"in":"out"];if(!E(r,"transform"))return t;let i=Ne(je(n,{ctx:o}));if(!Ae(i))if(o.isResponse){let s=de(r,E(n,"date")?new Date:Ht(i));if(s&&["number","string","boolean"].includes(s))return{...t,type:s}}else{let{type:s,...a}=i;return{...a,format:`${a.format||s} (preprocessed)`}}return t},Ne=e=>e,Ht=e=>{let t=Array.isArray(e.type)?e.type[0]:e.type;return Pt?.[t]},Vt=e=>e==="null"?e:typeof e=="string"?[e,"null"]:e&&[...new Set(e).add("null")],Wt=()=>({format:"date"}),Jt={nullable:Lt,union:Ut,bigint:Ft,tuple:_t,pipe:Bt,date:Wt},Yt=(e,t,o)=>{let r=[e,t];for(;r.length;){let n=r.shift();if(Q.is(Object,n)){if(Ae(n)&&!n.$ref.startsWith("#/components")){let i=n.$ref.split("/").pop(),s=t[i];s&&(n.$ref=o.makeRef(s.id||s,Ne(s)).$ref);continue}r.push(...Q.values(n))}Q.is(Array,n)&&r.push(...Q.values(n))}return e},je=(e,{ctx:t,rules:o=Jt})=>{let{$defs:r={},properties:n={}}=X.z.toJSONSchema(X.z.object({subject:e}),{unrepresentable:"any",io:t.isResponse?"output":"input",override:i=>{let s=o[i.zodSchema._zod.def.type];if(s){let a={...s(i,t)};for(let d in i.jsonSchema)delete i.jsonSchema[d];Object.assign(i.jsonSchema,a)}}});return Yt($e(n.subject)?n.subject:{},r,t)},we=e=>{let{examples:t,example:o}=X.globalRegistry.get(e)||{};if(t)return Array.isArray(t)?t:Object.values(t).map(({value:r})=>r);if(o!==void 0)return[o];if(E(e,"tuple")){let r=[];for(let n of e._zod.def.items){let i=we(n);i.length&&r.push(i[0])}if(r.length!==e._zod.def.items.length)return[];if(e._zod.def.rest){let n=we(e._zod.def.rest);n.length&&r.push(n[0])}if(r.length)return[r]}return[]},ce=({event:e,schema:t,isResponse:o,isAck:r,makeRef:n})=>{let i={name:r?void 0:e,title:r?`Acknowledgement for ${e}`:e,payload:Ne(je(t,{ctx:{isResponse:o,makeRef:n}}))},s=we(t).map(a=>({payload:a}));return s.length&&(i.examples=s),i},Ie=({isResponse:e,channelId:t,messageId:o,ackId:r,event:n,ns:i,securityIds:s})=>({action:e?"send":"receive",channel:{$ref:`#/channels/${t}`},messages:[{$ref:`#/channels/${t}/messages/${o}`}],title:n,summary:`${e?"Outgoing":"Incoming"} event ${n}`,description:`The message ${e?"produced":"consumed"} by the application within the ${i} namespace`,security:s&&s.length?s.map(a=>({$ref:`#/components/securitySchemes/${a}`})):void 0,reply:r?{address:{location:"$message.payload#",description:"Last argument: acknowledgement handler"},channel:{$ref:`#/channels/${t}`},messages:[{$ref:`#/channels/${t}/messages/${r}`}]}:void 0}),ve=(e,{extra:t,makeRef:o})=>Object.assign(Ne(je(X.z.object(e),{ctx:{isResponse:!1,makeRef:o}})),t);var Oe=class extends Te{#o=new Map;#t(t,o,r=this.#o.get(t)){return r||(r=`Schema${this.#o.size+1}`,this.#o.set(t,r)),this.addSchema(r,o),{$ref:`#/components/schemas/${r}`}}#e(){return{bindingVersion:"0.1.0",method:"GET",headers:ve({connection:ee.z.literal("Upgrade").optional(),upgrade:ee.z.literal("websocket").optional()},{makeRef:this.#t.bind(this)}),query:ve({EIO:ee.z.literal("4").describe("The version of the protocol"),transport:ee.z.enum(["polling","websocket"]).describe("The name of the transport"),sid:ee.z.string().optional().describe("The session identifier")},{makeRef:this.#t.bind(this),extra:{externalDocs:{description:"Engine.IO Protocol",url:"https://socket.io/docs/v4/engine-io-protocol/"}}})}}constructor({actions:t,config:{namespaces:o,security:r},title:n,version:i,documentId:s,description:a,contact:d,license:y,servers:S={}}){super({info:{title:n,version:i,contact:d,license:y,description:a},id:s,defaultContentType:"text/plain"});let T=[];for(let[z,R]of Object.entries(r)){let v=C(l(`server security ${z}`));this.addSecurityScheme(v,R),T.push(v)}for(let z in S){let R=new URL(S[z].url);this.addServer(z,{description:S[z].description,host:R.host,pathname:R.pathname,protocol:R.protocol.slice(0,-1),security:T.length?T.map(v=>({$ref:`#/components/securitySchemes/${v}`})):void 0}),this.document.id||(this.document.id=`urn:${R.host.split(".").concat(R.pathname.slice(1).split("/")).join(":")}`)}let te=this.#e();for(let[z,{emission:R,security:v}]of Object.entries(o)){let D=H(z),N=l(D)||"Root",O={},oe=[];for(let[m,Z]of Object.entries(v)){let M=C(l(`${N} security ${m}`));this.addSecurityScheme(M,Z),oe.push(M)}for(let[m,{schema:Z,ack:M}]of Object.entries(R)){let A={event:m,makeRef:this.#t.bind(this)},k=C(l(`${N} outgoing ${m}`)),g=C(l(`${N} ack for outgoing ${m}`));O[k]=ce({...A,schema:Z,isResponse:!0}),M&&(O[g]=ce({...A,schema:M,isResponse:!1,isAck:!0})),this.addOperation(l(`${N} send operation ${m}`),Ie({...A,ns:D,channelId:N,messageId:k,isResponse:!0,ackId:M&&g}))}for(let m of t)if(m.namespace===D){let{event:Z,inputSchema:M,outputSchema:A}=m,k={event:Z,makeRef:this.#t.bind(this)},g=C(l(`${N} incoming ${Z}`)),w=C(l(`${N} ack for incoming ${Z}`));O[g]=ce({...k,schema:M,isResponse:!1}),A&&(O[w]=ce({...k,schema:A,isResponse:!0,isAck:!0})),this.addOperation(l(`${N} recv operation ${Z}`),Ie({event:Z,ns:D,channelId:N,messageId:g,isResponse:!1,ackId:A&&w,securityIds:oe}))}this.addChannel(N,{address:D,title:`Namespace ${D}`,bindings:{ws:te},messages:O})}}};0&&(module.exports={AbstractAction,ActionsFactory,Config,Documentation,InputValidationError,Integration,OutputValidationError,attachSockets,createSimpleConfig});