| "use strict";(()=>{var c=Object.defineProperty;var v=(n,e,s)=>e in n?c(n,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):n[e]=s;var r=(n,e,s)=>v(n,typeof e!="symbol"?e+"":e,s);var o=class{constructor(){r(this,"_eventListeners");r(this,"_maxListeners");this._eventListeners=new Map,this._maxListeners=100}maxListeners(){return this._maxListeners}addListener(e,s){this.on(e,s)}on(e,s){this._eventListeners.has(e)||this._eventListeners.set(e,[]);let t=this._eventListeners.get(e);t&&(t.length>=this._maxListeners&&console.warn(`MaxListenersExceededWarning: Possible event memory leak detected. ${t.length+1} ${e} listeners added. Use setMaxListeners() to increase limit.`),t.push(s))}removeListener(e,s){this.off(e,s)}off(e,s){let t=this._eventListeners.get(e)??[],i=t.indexOf(s);i>-1&&t.splice(i,1),t.length===0&&this._eventListeners.delete(e)}emit(e,...s){let t=this._eventListeners.get(e);if(t&&t.length>0)for(let i of t)i(...s)}listeners(e){return this._eventListeners.get(e)??[]}removeAllListeners(e){e?this._eventListeners.delete(e):this._eventListeners.clear()}setMaxListeners(e){this._maxListeners=e;for(let s of this._eventListeners.values())s.length>e&&s.splice(e)}};var l=class extends o{constructor(){super();r(this,"_hooks");this._hooks=new Map}onHook(s,t){let i=this._hooks.get(s);i?i.push(t):this._hooks.set(s,[t])}removeHook(s,t){let i=this._hooks.get(s);if(i){let h=i.indexOf(t);h!==-1&&i.splice(h,1)}}async hook(s,...t){let i=this._hooks.get(s);if(i)for(let h of i)try{await h(...t)}catch(a){this.emit("error",new Error(`Error in hook handler for event "${s}": ${a.message}`))}}get hooks(){return this._hooks}getHooks(s){return this._hooks.get(s)}clearHooks(){this._hooks.clear()}};})(); | ||
| //# sourceMappingURL=index.global.js.map |
| {"version":3,"sources":["../../src/eventified.ts","../../src/index.ts"],"sourcesContent":["export type EventListener = (...arguments_: any[]) => void;\n\nexport class Eventified {\n\t_eventListeners: Map<string, EventListener[]>;\n\t_maxListeners: number;\n\n\tconstructor() {\n\t\tthis._eventListeners = new Map();\n\t\tthis._maxListeners = 100; // Default maximum number of listeners\n\t}\n\n\tpublic maxListeners(): number {\n\t\treturn this._maxListeners;\n\t}\n\n\t// Add an event listener\n\tpublic addListener(event: string, listener: EventListener): void {\n\t\tthis.on(event, listener);\n\t}\n\n\tpublic on(event: string, listener: EventListener): void {\n\t\tif (!this._eventListeners.has(event)) {\n\t\t\tthis._eventListeners.set(event, []);\n\t\t}\n\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners) {\n\t\t\tif (listeners.length >= this._maxListeners) {\n\t\t\t\tconsole.warn(`MaxListenersExceededWarning: Possible event memory leak detected. ${listeners.length + 1} ${event} listeners added. Use setMaxListeners() to increase limit.`);\n\t\t\t}\n\n\t\t\tlisteners.push(listener);\n\t\t}\n\t}\n\n\t// Remove an event listener\n\tpublic removeListener(event: string, listener: EventListener): void {\n\t\tthis.off(event, listener);\n\t}\n\n\tpublic off(event: string, listener: EventListener): void {\n\t\tconst listeners = this._eventListeners.get(event) ?? [];\n\t\tconst index = listeners.indexOf(listener);\n\t\tif (index > -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length === 0) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t}\n\t}\n\n\t// Emit an event\n\tpublic emit(event: string, ...arguments_: any[]): void {\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners && listeners.length > 0) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\t\tlistener(...arguments_);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Get all listeners for a specific event\n\tpublic listeners(event: string): EventListener[] {\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t// Remove all listeners for a specific event\n\tpublic removeAllListeners(event?: string): void {\n\t\tif (event) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t} else {\n\t\t\tthis._eventListeners.clear();\n\t\t}\n\t}\n\n\t// Set the maximum number of listeners for a single event\n\tpublic setMaxListeners(n: number): void {\n\t\tthis._maxListeners = n;\n\t\tfor (const listeners of this._eventListeners.values()) {\n\t\t\tif (listeners.length > n) {\n\t\t\t\tlisteners.splice(n);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Eventified} from './eventified.js';\n\nexport type Hook = (...arguments_: any[]) => Promise<void> | void;\n\nexport class Hookified extends Eventified {\n\t_hooks: Map<string, Hook[]>;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis._hooks = new Map();\n\t}\n\n\t// Adds a handler function for a specific event\n\tonHook(event: string, handler: Hook) {\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\teventHandlers.push(handler);\n\t\t} else {\n\t\t\tthis._hooks.set(event, [handler]);\n\t\t}\n\t}\n\n\t// Removes a specific handler function for a specific event\n\tremoveHook(event: string, handler: Hook) {\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tconst index = eventHandlers.indexOf(handler);\n\t\t\tif (index !== -1) {\n\t\t\t\teventHandlers.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Triggers all handlers for a specific event with provided data\n\tasync hook<T>(event: string, ...arguments_: T[]) {\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tfor (const handler of eventHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\t\tawait handler(...arguments_);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.emit('error', new Error(`Error in hook handler for event \"${event}\": ${(error as Error).message}`));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Provides read-only access to the current handlers\n\tget hooks() {\n\t\t// Creating a new map to prevent external modifications to the original map\n\t\treturn this._hooks;\n\t}\n\n\tgetHooks(event: string) {\n\t\treturn this._hooks.get(event);\n\t}\n\n\tclearHooks() {\n\t\tthis._hooks.clear();\n\t}\n}\n\nexport {Eventified, type EventListener} from './eventified.js';\n"],"mappings":"uLAEO,IAAMA,EAAN,KAAiB,CAIvB,aAAc,CAHdC,EAAA,wBACAA,EAAA,sBAGC,KAAK,gBAAkB,IAAI,IAC3B,KAAK,cAAgB,GACtB,CAEO,cAAuB,CAC7B,OAAO,KAAK,aACb,CAGO,YAAYC,EAAeC,EAA+B,CAChE,KAAK,GAAGD,EAAOC,CAAQ,CACxB,CAEO,GAAGD,EAAeC,EAA+B,CAClD,KAAK,gBAAgB,IAAID,CAAK,GAClC,KAAK,gBAAgB,IAAIA,EAAO,CAAC,CAAC,EAGnC,IAAME,EAAY,KAAK,gBAAgB,IAAIF,CAAK,EAE5CE,IACCA,EAAU,QAAU,KAAK,eAC5B,QAAQ,KAAK,qEAAqEA,EAAU,OAAS,CAAC,IAAIF,CAAK,4DAA4D,EAG5KE,EAAU,KAAKD,CAAQ,EAEzB,CAGO,eAAeD,EAAeC,EAA+B,CACnE,KAAK,IAAID,EAAOC,CAAQ,CACzB,CAEO,IAAID,EAAeC,EAA+B,CACxD,IAAMC,EAAY,KAAK,gBAAgB,IAAIF,CAAK,GAAK,CAAC,EAChDG,EAAQD,EAAU,QAAQD,CAAQ,EACpCE,EAAQ,IACXD,EAAU,OAAOC,EAAO,CAAC,EAGtBD,EAAU,SAAW,GACxB,KAAK,gBAAgB,OAAOF,CAAK,CAEnC,CAGO,KAAKA,KAAkBI,EAAyB,CACtD,IAAMF,EAAY,KAAK,gBAAgB,IAAIF,CAAK,EAEhD,GAAIE,GAAaA,EAAU,OAAS,EACnC,QAAWD,KAAYC,EAEtBD,EAAS,GAAGG,CAAU,CAGzB,CAGO,UAAUJ,EAAgC,CAChD,OAAO,KAAK,gBAAgB,IAAIA,CAAK,GAAK,CAAC,CAC5C,CAGO,mBAAmBA,EAAsB,CAC3CA,EACH,KAAK,gBAAgB,OAAOA,CAAK,EAEjC,KAAK,gBAAgB,MAAM,CAE7B,CAGO,gBAAgBK,EAAiB,CACvC,KAAK,cAAgBA,EACrB,QAAWH,KAAa,KAAK,gBAAgB,OAAO,EAC/CA,EAAU,OAASG,GACtBH,EAAU,OAAOG,CAAC,CAGrB,CACD,ECpFO,IAAMC,EAAN,cAAwBC,CAAW,CAGzC,aAAc,CACb,MAAM,EAHPC,EAAA,eAIC,KAAK,OAAS,IAAI,GACnB,CAGA,OAAOC,EAAeC,EAAe,CACpC,IAAMC,EAAgB,KAAK,OAAO,IAAIF,CAAK,EACvCE,EACHA,EAAc,KAAKD,CAAO,EAE1B,KAAK,OAAO,IAAID,EAAO,CAACC,CAAO,CAAC,CAElC,CAGA,WAAWD,EAAeC,EAAe,CACxC,IAAMC,EAAgB,KAAK,OAAO,IAAIF,CAAK,EAC3C,GAAIE,EAAe,CAClB,IAAMC,EAAQD,EAAc,QAAQD,CAAO,EACvCE,IAAU,IACbD,EAAc,OAAOC,EAAO,CAAC,CAE/B,CACD,CAGA,MAAM,KAAQH,KAAkBI,EAAiB,CAChD,IAAMF,EAAgB,KAAK,OAAO,IAAIF,CAAK,EAC3C,GAAIE,EACH,QAAWD,KAAWC,EACrB,GAAI,CAEH,MAAMD,EAAQ,GAAGG,CAAU,CAC5B,OAASC,EAAO,CACf,KAAK,KAAK,QAAS,IAAI,MAAM,oCAAoCL,CAAK,MAAOK,EAAgB,OAAO,EAAE,CAAC,CACxG,CAGH,CAGA,IAAI,OAAQ,CAEX,OAAO,KAAK,MACb,CAEA,SAASL,EAAe,CACvB,OAAO,KAAK,OAAO,IAAIA,CAAK,CAC7B,CAEA,YAAa,CACZ,KAAK,OAAO,MAAM,CACnB,CACD","names":["Eventified","__publicField","event","listener","listeners","index","arguments_","n","Hookified","Eventified","__publicField","event","handler","eventHandlers","index","arguments_","error"]} |
| var c=Object.defineProperty;var v=(n,e,s)=>e in n?c(n,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):n[e]=s;var r=(n,e,s)=>v(n,typeof e!="symbol"?e+"":e,s);var o=class{constructor(){r(this,"_eventListeners");r(this,"_maxListeners");this._eventListeners=new Map,this._maxListeners=100}maxListeners(){return this._maxListeners}addListener(e,s){this.on(e,s)}on(e,s){this._eventListeners.has(e)||this._eventListeners.set(e,[]);let t=this._eventListeners.get(e);t&&(t.length>=this._maxListeners&&console.warn(`MaxListenersExceededWarning: Possible event memory leak detected. ${t.length+1} ${e} listeners added. Use setMaxListeners() to increase limit.`),t.push(s))}removeListener(e,s){this.off(e,s)}off(e,s){let t=this._eventListeners.get(e)??[],i=t.indexOf(s);i>-1&&t.splice(i,1),t.length===0&&this._eventListeners.delete(e)}emit(e,...s){let t=this._eventListeners.get(e);if(t&&t.length>0)for(let i of t)i(...s)}listeners(e){return this._eventListeners.get(e)??[]}removeAllListeners(e){e?this._eventListeners.delete(e):this._eventListeners.clear()}setMaxListeners(e){this._maxListeners=e;for(let s of this._eventListeners.values())s.length>e&&s.splice(e)}};var l=class extends o{constructor(){super();r(this,"_hooks");this._hooks=new Map}onHook(s,t){let i=this._hooks.get(s);i?i.push(t):this._hooks.set(s,[t])}removeHook(s,t){let i=this._hooks.get(s);if(i){let h=i.indexOf(t);h!==-1&&i.splice(h,1)}}async hook(s,...t){let i=this._hooks.get(s);if(i)for(let h of i)try{await h(...t)}catch(a){this.emit("error",new Error(`Error in hook handler for event "${s}": ${a.message}`))}}get hooks(){return this._hooks}getHooks(s){return this._hooks.get(s)}clearHooks(){this._hooks.clear()}};export{o as Eventified,l as Hookified}; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"sources":["../../src/eventified.ts","../../src/index.ts"],"sourcesContent":["export type EventListener = (...arguments_: any[]) => void;\n\nexport class Eventified {\n\t_eventListeners: Map<string, EventListener[]>;\n\t_maxListeners: number;\n\n\tconstructor() {\n\t\tthis._eventListeners = new Map();\n\t\tthis._maxListeners = 100; // Default maximum number of listeners\n\t}\n\n\tpublic maxListeners(): number {\n\t\treturn this._maxListeners;\n\t}\n\n\t// Add an event listener\n\tpublic addListener(event: string, listener: EventListener): void {\n\t\tthis.on(event, listener);\n\t}\n\n\tpublic on(event: string, listener: EventListener): void {\n\t\tif (!this._eventListeners.has(event)) {\n\t\t\tthis._eventListeners.set(event, []);\n\t\t}\n\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners) {\n\t\t\tif (listeners.length >= this._maxListeners) {\n\t\t\t\tconsole.warn(`MaxListenersExceededWarning: Possible event memory leak detected. ${listeners.length + 1} ${event} listeners added. Use setMaxListeners() to increase limit.`);\n\t\t\t}\n\n\t\t\tlisteners.push(listener);\n\t\t}\n\t}\n\n\t// Remove an event listener\n\tpublic removeListener(event: string, listener: EventListener): void {\n\t\tthis.off(event, listener);\n\t}\n\n\tpublic off(event: string, listener: EventListener): void {\n\t\tconst listeners = this._eventListeners.get(event) ?? [];\n\t\tconst index = listeners.indexOf(listener);\n\t\tif (index > -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length === 0) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t}\n\t}\n\n\t// Emit an event\n\tpublic emit(event: string, ...arguments_: any[]): void {\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners && listeners.length > 0) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\t\tlistener(...arguments_);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Get all listeners for a specific event\n\tpublic listeners(event: string): EventListener[] {\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t// Remove all listeners for a specific event\n\tpublic removeAllListeners(event?: string): void {\n\t\tif (event) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t} else {\n\t\t\tthis._eventListeners.clear();\n\t\t}\n\t}\n\n\t// Set the maximum number of listeners for a single event\n\tpublic setMaxListeners(n: number): void {\n\t\tthis._maxListeners = n;\n\t\tfor (const listeners of this._eventListeners.values()) {\n\t\t\tif (listeners.length > n) {\n\t\t\t\tlisteners.splice(n);\n\t\t\t}\n\t\t}\n\t}\n}\n","import {Eventified} from './eventified.js';\n\nexport type Hook = (...arguments_: any[]) => Promise<void> | void;\n\nexport class Hookified extends Eventified {\n\t_hooks: Map<string, Hook[]>;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis._hooks = new Map();\n\t}\n\n\t// Adds a handler function for a specific event\n\tonHook(event: string, handler: Hook) {\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\teventHandlers.push(handler);\n\t\t} else {\n\t\t\tthis._hooks.set(event, [handler]);\n\t\t}\n\t}\n\n\t// Removes a specific handler function for a specific event\n\tremoveHook(event: string, handler: Hook) {\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tconst index = eventHandlers.indexOf(handler);\n\t\t\tif (index !== -1) {\n\t\t\t\teventHandlers.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Triggers all handlers for a specific event with provided data\n\tasync hook<T>(event: string, ...arguments_: T[]) {\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tfor (const handler of eventHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\t\tawait handler(...arguments_);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.emit('error', new Error(`Error in hook handler for event \"${event}\": ${(error as Error).message}`));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Provides read-only access to the current handlers\n\tget hooks() {\n\t\t// Creating a new map to prevent external modifications to the original map\n\t\treturn this._hooks;\n\t}\n\n\tgetHooks(event: string) {\n\t\treturn this._hooks.get(event);\n\t}\n\n\tclearHooks() {\n\t\tthis._hooks.clear();\n\t}\n}\n\nexport {Eventified, type EventListener} from './eventified.js';\n"],"mappings":"oKAEO,IAAMA,EAAN,KAAiB,CAIvB,aAAc,CAHdC,EAAA,wBACAA,EAAA,sBAGC,KAAK,gBAAkB,IAAI,IAC3B,KAAK,cAAgB,GACtB,CAEO,cAAuB,CAC7B,OAAO,KAAK,aACb,CAGO,YAAYC,EAAeC,EAA+B,CAChE,KAAK,GAAGD,EAAOC,CAAQ,CACxB,CAEO,GAAGD,EAAeC,EAA+B,CAClD,KAAK,gBAAgB,IAAID,CAAK,GAClC,KAAK,gBAAgB,IAAIA,EAAO,CAAC,CAAC,EAGnC,IAAME,EAAY,KAAK,gBAAgB,IAAIF,CAAK,EAE5CE,IACCA,EAAU,QAAU,KAAK,eAC5B,QAAQ,KAAK,qEAAqEA,EAAU,OAAS,CAAC,IAAIF,CAAK,4DAA4D,EAG5KE,EAAU,KAAKD,CAAQ,EAEzB,CAGO,eAAeD,EAAeC,EAA+B,CACnE,KAAK,IAAID,EAAOC,CAAQ,CACzB,CAEO,IAAID,EAAeC,EAA+B,CACxD,IAAMC,EAAY,KAAK,gBAAgB,IAAIF,CAAK,GAAK,CAAC,EAChDG,EAAQD,EAAU,QAAQD,CAAQ,EACpCE,EAAQ,IACXD,EAAU,OAAOC,EAAO,CAAC,EAGtBD,EAAU,SAAW,GACxB,KAAK,gBAAgB,OAAOF,CAAK,CAEnC,CAGO,KAAKA,KAAkBI,EAAyB,CACtD,IAAMF,EAAY,KAAK,gBAAgB,IAAIF,CAAK,EAEhD,GAAIE,GAAaA,EAAU,OAAS,EACnC,QAAWD,KAAYC,EAEtBD,EAAS,GAAGG,CAAU,CAGzB,CAGO,UAAUJ,EAAgC,CAChD,OAAO,KAAK,gBAAgB,IAAIA,CAAK,GAAK,CAAC,CAC5C,CAGO,mBAAmBA,EAAsB,CAC3CA,EACH,KAAK,gBAAgB,OAAOA,CAAK,EAEjC,KAAK,gBAAgB,MAAM,CAE7B,CAGO,gBAAgBK,EAAiB,CACvC,KAAK,cAAgBA,EACrB,QAAWH,KAAa,KAAK,gBAAgB,OAAO,EAC/CA,EAAU,OAASG,GACtBH,EAAU,OAAOG,CAAC,CAGrB,CACD,ECpFO,IAAMC,EAAN,cAAwBC,CAAW,CAGzC,aAAc,CACb,MAAM,EAHPC,EAAA,eAIC,KAAK,OAAS,IAAI,GACnB,CAGA,OAAOC,EAAeC,EAAe,CACpC,IAAMC,EAAgB,KAAK,OAAO,IAAIF,CAAK,EACvCE,EACHA,EAAc,KAAKD,CAAO,EAE1B,KAAK,OAAO,IAAID,EAAO,CAACC,CAAO,CAAC,CAElC,CAGA,WAAWD,EAAeC,EAAe,CACxC,IAAMC,EAAgB,KAAK,OAAO,IAAIF,CAAK,EAC3C,GAAIE,EAAe,CAClB,IAAMC,EAAQD,EAAc,QAAQD,CAAO,EACvCE,IAAU,IACbD,EAAc,OAAOC,EAAO,CAAC,CAE/B,CACD,CAGA,MAAM,KAAQH,KAAkBI,EAAiB,CAChD,IAAMF,EAAgB,KAAK,OAAO,IAAIF,CAAK,EAC3C,GAAIE,EACH,QAAWD,KAAWC,EACrB,GAAI,CAEH,MAAMD,EAAQ,GAAGG,CAAU,CAC5B,OAASC,EAAO,CACf,KAAK,KAAK,QAAS,IAAI,MAAM,oCAAoCL,CAAK,MAAOK,EAAgB,OAAO,EAAE,CAAC,CACxG,CAGH,CAGA,IAAI,OAAQ,CAEX,OAAO,KAAK,MACb,CAEA,SAASL,EAAe,CACvB,OAAO,KAAK,OAAO,IAAIA,CAAK,CAC7B,CAEA,YAAa,CACZ,KAAK,OAAO,MAAM,CACnB,CACD","names":["Eventified","__publicField","event","listener","listeners","index","arguments_","n","Hookified","Eventified","__publicField","event","handler","eventHandlers","index","arguments_","error"]} |
| "use strict"; | ||
| var __defProp = Object.defineProperty; | ||
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||
| var __getOwnPropNames = Object.getOwnPropertyNames; | ||
| var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
| var __export = (target, all) => { | ||
| for (var name in all) | ||
| __defProp(target, name, { get: all[name], enumerable: true }); | ||
| }; | ||
| var __copyProps = (to, from, except, desc) => { | ||
| if (from && typeof from === "object" || typeof from === "function") { | ||
| for (let key of __getOwnPropNames(from)) | ||
| if (!__hasOwnProp.call(to, key) && key !== except) | ||
| __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | ||
| } | ||
| return to; | ||
| }; | ||
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | ||
| // src/index.ts | ||
| var src_exports = {}; | ||
| __export(src_exports, { | ||
| Eventified: () => Eventified, | ||
| Hookified: () => Hookified | ||
| }); | ||
| module.exports = __toCommonJS(src_exports); | ||
| // src/eventified.ts | ||
| var Eventified = class { | ||
| _eventListeners; | ||
| _maxListeners; | ||
| constructor() { | ||
| this._eventListeners = /* @__PURE__ */ new Map(); | ||
| this._maxListeners = 100; | ||
| } | ||
| maxListeners() { | ||
| return this._maxListeners; | ||
| } | ||
| // Add an event listener | ||
| addListener(event, listener) { | ||
| this.on(event, listener); | ||
| } | ||
| on(event, listener) { | ||
| if (!this._eventListeners.has(event)) { | ||
| this._eventListeners.set(event, []); | ||
| } | ||
| const listeners = this._eventListeners.get(event); | ||
| if (listeners) { | ||
| if (listeners.length >= this._maxListeners) { | ||
| console.warn(`MaxListenersExceededWarning: Possible event memory leak detected. ${listeners.length + 1} ${event} listeners added. Use setMaxListeners() to increase limit.`); | ||
| } | ||
| listeners.push(listener); | ||
| } | ||
| } | ||
| // Remove an event listener | ||
| removeListener(event, listener) { | ||
| this.off(event, listener); | ||
| } | ||
| off(event, listener) { | ||
| const listeners = this._eventListeners.get(event) ?? []; | ||
| const index = listeners.indexOf(listener); | ||
| if (index > -1) { | ||
| listeners.splice(index, 1); | ||
| } | ||
| if (listeners.length === 0) { | ||
| this._eventListeners.delete(event); | ||
| } | ||
| } | ||
| // Emit an event | ||
| emit(event, ...arguments_) { | ||
| const listeners = this._eventListeners.get(event); | ||
| if (listeners && listeners.length > 0) { | ||
| for (const listener of listeners) { | ||
| listener(...arguments_); | ||
| } | ||
| } | ||
| } | ||
| // Get all listeners for a specific event | ||
| listeners(event) { | ||
| return this._eventListeners.get(event) ?? []; | ||
| } | ||
| // Remove all listeners for a specific event | ||
| removeAllListeners(event) { | ||
| if (event) { | ||
| this._eventListeners.delete(event); | ||
| } else { | ||
| this._eventListeners.clear(); | ||
| } | ||
| } | ||
| // Set the maximum number of listeners for a single event | ||
| setMaxListeners(n) { | ||
| this._maxListeners = n; | ||
| for (const listeners of this._eventListeners.values()) { | ||
| if (listeners.length > n) { | ||
| listeners.splice(n); | ||
| } | ||
| } | ||
| } | ||
| }; | ||
| // src/index.ts | ||
| var Hookified = class extends Eventified { | ||
| _hooks; | ||
| constructor() { | ||
| super(); | ||
| this._hooks = /* @__PURE__ */ new Map(); | ||
| } | ||
| // Adds a handler function for a specific event | ||
| onHook(event, handler) { | ||
| const eventHandlers = this._hooks.get(event); | ||
| if (eventHandlers) { | ||
| eventHandlers.push(handler); | ||
| } else { | ||
| this._hooks.set(event, [handler]); | ||
| } | ||
| } | ||
| // Removes a specific handler function for a specific event | ||
| removeHook(event, handler) { | ||
| const eventHandlers = this._hooks.get(event); | ||
| if (eventHandlers) { | ||
| const index = eventHandlers.indexOf(handler); | ||
| if (index !== -1) { | ||
| eventHandlers.splice(index, 1); | ||
| } | ||
| } | ||
| } | ||
| // Triggers all handlers for a specific event with provided data | ||
| async hook(event, ...arguments_) { | ||
| const eventHandlers = this._hooks.get(event); | ||
| if (eventHandlers) { | ||
| for (const handler of eventHandlers) { | ||
| try { | ||
| await handler(...arguments_); | ||
| } catch (error) { | ||
| this.emit("error", new Error(`Error in hook handler for event "${event}": ${error.message}`)); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| // Provides read-only access to the current handlers | ||
| get hooks() { | ||
| return this._hooks; | ||
| } | ||
| getHooks(event) { | ||
| return this._hooks.get(event); | ||
| } | ||
| clearHooks() { | ||
| this._hooks.clear(); | ||
| } | ||
| }; | ||
| // Annotate the CommonJS export names for ESM import in node: | ||
| 0 && (module.exports = { | ||
| Eventified, | ||
| Hookified | ||
| }); |
| type EventListener = (...arguments_: any[]) => void; | ||
| declare class Eventified { | ||
| _eventListeners: Map<string, EventListener[]>; | ||
| _maxListeners: number; | ||
| constructor(); | ||
| maxListeners(): number; | ||
| addListener(event: string, listener: EventListener): void; | ||
| on(event: string, listener: EventListener): void; | ||
| removeListener(event: string, listener: EventListener): void; | ||
| off(event: string, listener: EventListener): void; | ||
| emit(event: string, ...arguments_: any[]): void; | ||
| listeners(event: string): EventListener[]; | ||
| removeAllListeners(event?: string): void; | ||
| setMaxListeners(n: number): void; | ||
| } | ||
| type Hook = (...arguments_: any[]) => Promise<void> | void; | ||
| declare class Hookified extends Eventified { | ||
| _hooks: Map<string, Hook[]>; | ||
| constructor(); | ||
| onHook(event: string, handler: Hook): void; | ||
| removeHook(event: string, handler: Hook): void; | ||
| hook<T>(event: string, ...arguments_: T[]): Promise<void>; | ||
| get hooks(): Map<string, Hook[]>; | ||
| getHooks(event: string): Hook[] | undefined; | ||
| clearHooks(): void; | ||
| } | ||
| export { type EventListener, Eventified, type Hook, Hookified }; |
| type EventListener = (...arguments_: any[]) => void; | ||
| declare class Eventified { | ||
| _eventListeners: Map<string, EventListener[]>; | ||
| _maxListeners: number; | ||
| constructor(); | ||
| maxListeners(): number; | ||
| addListener(event: string, listener: EventListener): void; | ||
| on(event: string, listener: EventListener): void; | ||
| removeListener(event: string, listener: EventListener): void; | ||
| off(event: string, listener: EventListener): void; | ||
| emit(event: string, ...arguments_: any[]): void; | ||
| listeners(event: string): EventListener[]; | ||
| removeAllListeners(event?: string): void; | ||
| setMaxListeners(n: number): void; | ||
| } | ||
| type Hook = (...arguments_: any[]) => Promise<void> | void; | ||
| declare class Hookified extends Eventified { | ||
| _hooks: Map<string, Hook[]>; | ||
| constructor(); | ||
| onHook(event: string, handler: Hook): void; | ||
| removeHook(event: string, handler: Hook): void; | ||
| hook<T>(event: string, ...arguments_: T[]): Promise<void>; | ||
| get hooks(): Map<string, Hook[]>; | ||
| getHooks(event: string): Hook[] | undefined; | ||
| clearHooks(): void; | ||
| } | ||
| export { type EventListener, Eventified, type Hook, Hookified }; |
| // src/eventified.ts | ||
| var Eventified = class { | ||
| _eventListeners; | ||
| _maxListeners; | ||
| constructor() { | ||
| this._eventListeners = /* @__PURE__ */ new Map(); | ||
| this._maxListeners = 100; | ||
| } | ||
| maxListeners() { | ||
| return this._maxListeners; | ||
| } | ||
| // Add an event listener | ||
| addListener(event, listener) { | ||
| this.on(event, listener); | ||
| } | ||
| on(event, listener) { | ||
| if (!this._eventListeners.has(event)) { | ||
| this._eventListeners.set(event, []); | ||
| } | ||
| const listeners = this._eventListeners.get(event); | ||
| if (listeners) { | ||
| if (listeners.length >= this._maxListeners) { | ||
| console.warn(`MaxListenersExceededWarning: Possible event memory leak detected. ${listeners.length + 1} ${event} listeners added. Use setMaxListeners() to increase limit.`); | ||
| } | ||
| listeners.push(listener); | ||
| } | ||
| } | ||
| // Remove an event listener | ||
| removeListener(event, listener) { | ||
| this.off(event, listener); | ||
| } | ||
| off(event, listener) { | ||
| const listeners = this._eventListeners.get(event) ?? []; | ||
| const index = listeners.indexOf(listener); | ||
| if (index > -1) { | ||
| listeners.splice(index, 1); | ||
| } | ||
| if (listeners.length === 0) { | ||
| this._eventListeners.delete(event); | ||
| } | ||
| } | ||
| // Emit an event | ||
| emit(event, ...arguments_) { | ||
| const listeners = this._eventListeners.get(event); | ||
| if (listeners && listeners.length > 0) { | ||
| for (const listener of listeners) { | ||
| listener(...arguments_); | ||
| } | ||
| } | ||
| } | ||
| // Get all listeners for a specific event | ||
| listeners(event) { | ||
| return this._eventListeners.get(event) ?? []; | ||
| } | ||
| // Remove all listeners for a specific event | ||
| removeAllListeners(event) { | ||
| if (event) { | ||
| this._eventListeners.delete(event); | ||
| } else { | ||
| this._eventListeners.clear(); | ||
| } | ||
| } | ||
| // Set the maximum number of listeners for a single event | ||
| setMaxListeners(n) { | ||
| this._maxListeners = n; | ||
| for (const listeners of this._eventListeners.values()) { | ||
| if (listeners.length > n) { | ||
| listeners.splice(n); | ||
| } | ||
| } | ||
| } | ||
| }; | ||
| // src/index.ts | ||
| var Hookified = class extends Eventified { | ||
| _hooks; | ||
| constructor() { | ||
| super(); | ||
| this._hooks = /* @__PURE__ */ new Map(); | ||
| } | ||
| // Adds a handler function for a specific event | ||
| onHook(event, handler) { | ||
| const eventHandlers = this._hooks.get(event); | ||
| if (eventHandlers) { | ||
| eventHandlers.push(handler); | ||
| } else { | ||
| this._hooks.set(event, [handler]); | ||
| } | ||
| } | ||
| // Removes a specific handler function for a specific event | ||
| removeHook(event, handler) { | ||
| const eventHandlers = this._hooks.get(event); | ||
| if (eventHandlers) { | ||
| const index = eventHandlers.indexOf(handler); | ||
| if (index !== -1) { | ||
| eventHandlers.splice(index, 1); | ||
| } | ||
| } | ||
| } | ||
| // Triggers all handlers for a specific event with provided data | ||
| async hook(event, ...arguments_) { | ||
| const eventHandlers = this._hooks.get(event); | ||
| if (eventHandlers) { | ||
| for (const handler of eventHandlers) { | ||
| try { | ||
| await handler(...arguments_); | ||
| } catch (error) { | ||
| this.emit("error", new Error(`Error in hook handler for event "${event}": ${error.message}`)); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| // Provides read-only access to the current handlers | ||
| get hooks() { | ||
| return this._hooks; | ||
| } | ||
| getHooks(event) { | ||
| return this._hooks.get(event); | ||
| } | ||
| clearHooks() { | ||
| this._hooks.clear(); | ||
| } | ||
| }; | ||
| export { | ||
| Eventified, | ||
| Hookified | ||
| }; |
+13
-12
| { | ||
| "name": "hookified", | ||
| "version": "1.2.1", | ||
| "version": "1.3.0", | ||
| "description": "Event and Middleware Hooks", | ||
| "type": "module", | ||
| "main": "./dist/index.cjs", | ||
| "module": "./dist/index.js", | ||
| "types": "./dist/index.d.ts", | ||
| "main": "dist/node/index.cjs", | ||
| "module": "dist/node/index.js", | ||
| "exports": { | ||
| ".": { | ||
| "require": "./dist/index.cjs", | ||
| "import": "./dist/index.js" | ||
| "import": "./dist/node/index.js", | ||
| "require": "./dist/node/index.cjs" | ||
| }, | ||
| "./browser": { | ||
| "import": "./dist/browser/index.js", | ||
| "default": "./dist/browser/index.global.js" | ||
| } | ||
| }, | ||
| "engines": { | ||
| "node": ">=20" | ||
| }, | ||
| "types": "dist/node/index.d.ts", | ||
| "scripts": { | ||
@@ -22,3 +23,3 @@ "test": "xo --fix && vitest run --coverage", | ||
| "clean": "rimraf ./dist ./coverage ./site/dist", | ||
| "build": "rimraf ./dist && tsup src/index.ts --format cjs,esm --dts --clean", | ||
| "build": "rimraf ./dist && tsup", | ||
| "website:build": "docula build", | ||
@@ -60,3 +61,3 @@ "website:serve": "docula serve", | ||
| "devDependencies": { | ||
| "@vitest/coverage-v8": "^2.1.2", | ||
| "@vitest/coverage-v8": "^2.1.3", | ||
| "docula": "^0.9.3", | ||
@@ -66,3 +67,3 @@ "rimraf": "^6.0.1", | ||
| "typescript": "^5.6.3", | ||
| "vitest": "^2.1.2", | ||
| "vitest": "^2.1.3", | ||
| "xo": "^0.59.3" | ||
@@ -69,0 +70,0 @@ }, |
+68
-15
@@ -11,3 +11,3 @@  | ||
| ## Features | ||
| # Features | ||
| - Simple replacement for EventEmitter | ||
@@ -18,3 +18,3 @@ - Async Middleware Hooks for Your Methods | ||
| ## Installation | ||
| # Installation | ||
| ```bash | ||
@@ -24,3 +24,3 @@ npm install hookified --save | ||
| ## Usage | ||
| # Usage | ||
| This was built because we constantly wanted hooks and events extended on libraires we are building such as [Keyv](https://keyv.org) and [Cacheable](https://cacheable.org). This is a simple way to add hooks and events to your classes. | ||
@@ -72,35 +72,88 @@ | ||
| ## API | ||
| # Using it in the Browser | ||
| ### .onHook(eventName, handler) | ||
| ```html | ||
| <script type="module"> | ||
| import { Hookified } from 'https://cdn.jsdelivr.net/npm/hookified/dist/browser/index.js'; | ||
| class MyClass extends Hookified { | ||
| constructor() { | ||
| super(); | ||
| } | ||
| async myMethodEmittingEvent() { | ||
| this.emit('message', 'Hello World'); //using Emittery | ||
| } | ||
| //with hooks you can pass data in and if they are subscribed via onHook they can modify the data | ||
| async myMethodWithHooks() Promise<any> { | ||
| let data = { some: 'data' }; | ||
| // do something | ||
| await this.hook('before:myMethod2', data); | ||
| return data; | ||
| } | ||
| } | ||
| </script> | ||
| ``` | ||
| if you are not using ESM modules, you can use the following: | ||
| ```html | ||
| <script src="https://cdn.jsdelivr.net/npm/hookified/dist/browser/index.global.js"></script> | ||
| <script> | ||
| class MyClass extends Hookified { | ||
| constructor() { | ||
| super(); | ||
| } | ||
| async myMethodEmittingEvent() { | ||
| this.emit('message', 'Hello World'); //using Emittery | ||
| } | ||
| //with hooks you can pass data in and if they are subscribed via onHook they can modify the data | ||
| async myMethodWithHooks() Promise<any> { | ||
| let data = { some: 'data' }; | ||
| // do something | ||
| await this.hook('before:myMethod2', data); | ||
| return data; | ||
| } | ||
| } | ||
| </script> | ||
| ``` | ||
| # API | ||
| ## .onHook(eventName, handler) | ||
| Subscribe to a hook event. | ||
| ### .removeHook(eventName) | ||
| ## .removeHook(eventName) | ||
| Unsubscribe from a hook event. | ||
| ### .hook(eventName, ...args) | ||
| ## .hook(eventName, ...args) | ||
| Run a hook event. | ||
| ### .hooks | ||
| ## .hooks | ||
| Get all hooks. | ||
| ### .getHooks(eventName) | ||
| ## .getHooks(eventName) | ||
| Get all hooks for an event. | ||
| ### .clearHooks(eventName) | ||
| ## .clearHooks(eventName) | ||
| ### .on(eventName, handler) | ||
| ## .on(eventName, handler) | ||
| Subscribe to an event. | ||
| ### .off(eventName, handler) | ||
| ## .off(eventName, handler) | ||
| Unsubscribe from an event. | ||
| ### .emit(eventName, ...args) | ||
| ## .emit(eventName, ...args) | ||
@@ -121,3 +174,3 @@ Emit an event. | ||
| ## Development and Testing | ||
| # Development and Testing | ||
@@ -134,3 +187,3 @@ Hookified is written in TypeScript and tests are written in `vitest`. To run the tests, use the following command: | ||
| ## License | ||
| # License | ||
@@ -137,0 +190,0 @@ [MIT & © Jared Wray](LICENSE) |
-155
| "use strict"; | ||
| var __defProp = Object.defineProperty; | ||
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||
| var __getOwnPropNames = Object.getOwnPropertyNames; | ||
| var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
| var __export = (target, all) => { | ||
| for (var name in all) | ||
| __defProp(target, name, { get: all[name], enumerable: true }); | ||
| }; | ||
| var __copyProps = (to, from, except, desc) => { | ||
| if (from && typeof from === "object" || typeof from === "function") { | ||
| for (let key of __getOwnPropNames(from)) | ||
| if (!__hasOwnProp.call(to, key) && key !== except) | ||
| __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | ||
| } | ||
| return to; | ||
| }; | ||
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | ||
| // src/index.ts | ||
| var src_exports = {}; | ||
| __export(src_exports, { | ||
| Eventified: () => Eventified, | ||
| Hookified: () => Hookified | ||
| }); | ||
| module.exports = __toCommonJS(src_exports); | ||
| // src/eventified.ts | ||
| var Eventified = class { | ||
| _eventListeners; | ||
| _maxListeners; | ||
| constructor() { | ||
| this._eventListeners = /* @__PURE__ */ new Map(); | ||
| this._maxListeners = 100; | ||
| } | ||
| maxListeners() { | ||
| return this._maxListeners; | ||
| } | ||
| // Add an event listener | ||
| addListener(event, listener) { | ||
| this.on(event, listener); | ||
| } | ||
| on(event, listener) { | ||
| if (!this._eventListeners.has(event)) { | ||
| this._eventListeners.set(event, []); | ||
| } | ||
| const listeners = this._eventListeners.get(event); | ||
| if (listeners) { | ||
| if (listeners.length >= this._maxListeners) { | ||
| console.warn(`MaxListenersExceededWarning: Possible event memory leak detected. ${listeners.length + 1} ${event} listeners added. Use setMaxListeners() to increase limit.`); | ||
| } | ||
| listeners.push(listener); | ||
| } | ||
| } | ||
| // Remove an event listener | ||
| removeListener(event, listener) { | ||
| this.off(event, listener); | ||
| } | ||
| off(event, listener) { | ||
| const listeners = this._eventListeners.get(event) ?? []; | ||
| const index = listeners.indexOf(listener); | ||
| if (index > -1) { | ||
| listeners.splice(index, 1); | ||
| } | ||
| if (listeners.length === 0) { | ||
| this._eventListeners.delete(event); | ||
| } | ||
| } | ||
| // Emit an event | ||
| emit(event, ...arguments_) { | ||
| const listeners = this._eventListeners.get(event); | ||
| if (listeners && listeners.length > 0) { | ||
| for (const listener of listeners) { | ||
| listener(...arguments_); | ||
| } | ||
| } | ||
| } | ||
| // Get all listeners for a specific event | ||
| listeners(event) { | ||
| return this._eventListeners.get(event) ?? []; | ||
| } | ||
| // Remove all listeners for a specific event | ||
| removeAllListeners(event) { | ||
| if (event) { | ||
| this._eventListeners.delete(event); | ||
| } else { | ||
| this._eventListeners.clear(); | ||
| } | ||
| } | ||
| // Set the maximum number of listeners for a single event | ||
| setMaxListeners(n) { | ||
| this._maxListeners = n; | ||
| for (const listeners of this._eventListeners.values()) { | ||
| if (listeners.length > n) { | ||
| listeners.splice(n); | ||
| } | ||
| } | ||
| } | ||
| }; | ||
| // src/index.ts | ||
| var Hookified = class extends Eventified { | ||
| _hooks; | ||
| constructor() { | ||
| super(); | ||
| this._hooks = /* @__PURE__ */ new Map(); | ||
| } | ||
| // Adds a handler function for a specific event | ||
| onHook(event, handler) { | ||
| const eventHandlers = this._hooks.get(event); | ||
| if (eventHandlers) { | ||
| eventHandlers.push(handler); | ||
| } else { | ||
| this._hooks.set(event, [handler]); | ||
| } | ||
| } | ||
| // Removes a specific handler function for a specific event | ||
| removeHook(event, handler) { | ||
| const eventHandlers = this._hooks.get(event); | ||
| if (eventHandlers) { | ||
| const index = eventHandlers.indexOf(handler); | ||
| if (index !== -1) { | ||
| eventHandlers.splice(index, 1); | ||
| } | ||
| } | ||
| } | ||
| // Triggers all handlers for a specific event with provided data | ||
| async hook(event, ...arguments_) { | ||
| const eventHandlers = this._hooks.get(event); | ||
| if (eventHandlers) { | ||
| for (const handler of eventHandlers) { | ||
| try { | ||
| await handler(...arguments_); | ||
| } catch (error) { | ||
| this.emit("error", new Error(`Error in hook handler for event "${event}": ${error.message}`)); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| // Provides read-only access to the current handlers | ||
| get hooks() { | ||
| return this._hooks; | ||
| } | ||
| getHooks(event) { | ||
| return this._hooks.get(event); | ||
| } | ||
| clearHooks() { | ||
| this._hooks.clear(); | ||
| } | ||
| }; | ||
| // Annotate the CommonJS export names for ESM import in node: | ||
| 0 && (module.exports = { | ||
| Eventified, | ||
| Hookified | ||
| }); |
| type EventListener = (...arguments_: any[]) => void; | ||
| declare class Eventified { | ||
| _eventListeners: Map<string, EventListener[]>; | ||
| _maxListeners: number; | ||
| constructor(); | ||
| maxListeners(): number; | ||
| addListener(event: string, listener: EventListener): void; | ||
| on(event: string, listener: EventListener): void; | ||
| removeListener(event: string, listener: EventListener): void; | ||
| off(event: string, listener: EventListener): void; | ||
| emit(event: string, ...arguments_: any[]): void; | ||
| listeners(event: string): EventListener[]; | ||
| removeAllListeners(event?: string): void; | ||
| setMaxListeners(n: number): void; | ||
| } | ||
| type Hook = (...arguments_: any[]) => Promise<void> | void; | ||
| declare class Hookified extends Eventified { | ||
| _hooks: Map<string, Hook[]>; | ||
| constructor(); | ||
| onHook(event: string, handler: Hook): void; | ||
| removeHook(event: string, handler: Hook): void; | ||
| hook<T>(event: string, ...arguments_: T[]): Promise<void>; | ||
| get hooks(): Map<string, Hook[]>; | ||
| getHooks(event: string): Hook[] | undefined; | ||
| clearHooks(): void; | ||
| } | ||
| export { type EventListener, Eventified, type Hook, Hookified }; |
| type EventListener = (...arguments_: any[]) => void; | ||
| declare class Eventified { | ||
| _eventListeners: Map<string, EventListener[]>; | ||
| _maxListeners: number; | ||
| constructor(); | ||
| maxListeners(): number; | ||
| addListener(event: string, listener: EventListener): void; | ||
| on(event: string, listener: EventListener): void; | ||
| removeListener(event: string, listener: EventListener): void; | ||
| off(event: string, listener: EventListener): void; | ||
| emit(event: string, ...arguments_: any[]): void; | ||
| listeners(event: string): EventListener[]; | ||
| removeAllListeners(event?: string): void; | ||
| setMaxListeners(n: number): void; | ||
| } | ||
| type Hook = (...arguments_: any[]) => Promise<void> | void; | ||
| declare class Hookified extends Eventified { | ||
| _hooks: Map<string, Hook[]>; | ||
| constructor(); | ||
| onHook(event: string, handler: Hook): void; | ||
| removeHook(event: string, handler: Hook): void; | ||
| hook<T>(event: string, ...arguments_: T[]): Promise<void>; | ||
| get hooks(): Map<string, Hook[]>; | ||
| getHooks(event: string): Hook[] | undefined; | ||
| clearHooks(): void; | ||
| } | ||
| export { type EventListener, Eventified, type Hook, Hookified }; |
-127
| // src/eventified.ts | ||
| var Eventified = class { | ||
| _eventListeners; | ||
| _maxListeners; | ||
| constructor() { | ||
| this._eventListeners = /* @__PURE__ */ new Map(); | ||
| this._maxListeners = 100; | ||
| } | ||
| maxListeners() { | ||
| return this._maxListeners; | ||
| } | ||
| // Add an event listener | ||
| addListener(event, listener) { | ||
| this.on(event, listener); | ||
| } | ||
| on(event, listener) { | ||
| if (!this._eventListeners.has(event)) { | ||
| this._eventListeners.set(event, []); | ||
| } | ||
| const listeners = this._eventListeners.get(event); | ||
| if (listeners) { | ||
| if (listeners.length >= this._maxListeners) { | ||
| console.warn(`MaxListenersExceededWarning: Possible event memory leak detected. ${listeners.length + 1} ${event} listeners added. Use setMaxListeners() to increase limit.`); | ||
| } | ||
| listeners.push(listener); | ||
| } | ||
| } | ||
| // Remove an event listener | ||
| removeListener(event, listener) { | ||
| this.off(event, listener); | ||
| } | ||
| off(event, listener) { | ||
| const listeners = this._eventListeners.get(event) ?? []; | ||
| const index = listeners.indexOf(listener); | ||
| if (index > -1) { | ||
| listeners.splice(index, 1); | ||
| } | ||
| if (listeners.length === 0) { | ||
| this._eventListeners.delete(event); | ||
| } | ||
| } | ||
| // Emit an event | ||
| emit(event, ...arguments_) { | ||
| const listeners = this._eventListeners.get(event); | ||
| if (listeners && listeners.length > 0) { | ||
| for (const listener of listeners) { | ||
| listener(...arguments_); | ||
| } | ||
| } | ||
| } | ||
| // Get all listeners for a specific event | ||
| listeners(event) { | ||
| return this._eventListeners.get(event) ?? []; | ||
| } | ||
| // Remove all listeners for a specific event | ||
| removeAllListeners(event) { | ||
| if (event) { | ||
| this._eventListeners.delete(event); | ||
| } else { | ||
| this._eventListeners.clear(); | ||
| } | ||
| } | ||
| // Set the maximum number of listeners for a single event | ||
| setMaxListeners(n) { | ||
| this._maxListeners = n; | ||
| for (const listeners of this._eventListeners.values()) { | ||
| if (listeners.length > n) { | ||
| listeners.splice(n); | ||
| } | ||
| } | ||
| } | ||
| }; | ||
| // src/index.ts | ||
| var Hookified = class extends Eventified { | ||
| _hooks; | ||
| constructor() { | ||
| super(); | ||
| this._hooks = /* @__PURE__ */ new Map(); | ||
| } | ||
| // Adds a handler function for a specific event | ||
| onHook(event, handler) { | ||
| const eventHandlers = this._hooks.get(event); | ||
| if (eventHandlers) { | ||
| eventHandlers.push(handler); | ||
| } else { | ||
| this._hooks.set(event, [handler]); | ||
| } | ||
| } | ||
| // Removes a specific handler function for a specific event | ||
| removeHook(event, handler) { | ||
| const eventHandlers = this._hooks.get(event); | ||
| if (eventHandlers) { | ||
| const index = eventHandlers.indexOf(handler); | ||
| if (index !== -1) { | ||
| eventHandlers.splice(index, 1); | ||
| } | ||
| } | ||
| } | ||
| // Triggers all handlers for a specific event with provided data | ||
| async hook(event, ...arguments_) { | ||
| const eventHandlers = this._hooks.get(event); | ||
| if (eventHandlers) { | ||
| for (const handler of eventHandlers) { | ||
| try { | ||
| await handler(...arguments_); | ||
| } catch (error) { | ||
| this.emit("error", new Error(`Error in hook handler for event "${event}": ${error.message}`)); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| // Provides read-only access to the current handlers | ||
| get hooks() { | ||
| return this._hooks; | ||
| } | ||
| getHooks(event) { | ||
| return this._hooks.get(event); | ||
| } | ||
| clearHooks() { | ||
| this._hooks.clear(); | ||
| } | ||
| }; | ||
| export { | ||
| Eventified, | ||
| Hookified | ||
| }; |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
33739
111.86%11
57.14%319
4.59%189
38.97%2
Infinity%1
Infinity%