Launch Week Day 5: Introducing Reachability for PHP.Learn More
Socket
Book a DemoSign in
Socket

hookified

Package Overview
Dependencies
Maintainers
1
Versions
34
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

hookified - npm Package Compare versions

Comparing version
1.2.1
to
1.3.0
+2
dist/browser/index.global.js
"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 @@ ![site/logo.svg](site/logo.svg)

## 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)

"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
};