🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

emitter-pro

Package Overview
Dependencies
Maintainers
1
Versions
12
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

emitter-pro - npm Package Compare versions

Comparing version
1.2.2
to
1.2.3
+1
-1
dist/emitter-pro.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"emitter-pro.js","sources":["../src/index.ts"],"sourcesContent":["type Listener = (...args: any[]) => any;\n\ntype EventName = string | symbol;\ntype EventListener<F extends Listener = Listener> = { raw: F; wrap: F; context: object | null };\ntype Handler<F extends Listener = Listener> = Record<EventName, EventListener<F>[]>;\n\n/**\n * 事件触发器,支持浏览器端和 node 端。\n *\n * @class\n * @example\n *\n * const emitter = new Emitter();\n *\n * // 注册监听方法\n * emitter.on('foo', () => console.log('foo 1'));\n * emitter.on('foo', () => console.log('foo 2'));\n *\n * // 触发方法\n * emitter.emit('foo');\n * // foo 1\n * // foo 2\n *\n * // 取消监听方法\n * emitter.off('foo');\n *\n * // 支持链式调用\n * emitter.on('foo', () => {})\n * .on('foo', () => {})\n * .off('foo');\n */\nclass EmitterPro<F extends Listener = Listener> {\n private handlers: Handler<F>;\n constructor() {\n this.handlers = {};\n }\n\n /**\n * 获取全部事件名称。\n *\n * @returns 事件名称数组。\n * @example\n * emitter.on('foo', () => {});\n * emitter.on('bar', () => {});\n *\n * emitter.eventNames(); // ['foo', 'bar']\n */\n eventNames() {\n const symbols = Object.getOwnPropertySymbols?.(this.handlers) || [];\n const keys = Object.keys(this.handlers) as (string | symbol)[];\n return keys.concat(symbols);\n }\n\n /**\n * 获取事件名称的全部监听方法(原始方法,未经过包装处理)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, fn2]\n */\n rawListeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.raw) : [];\n }\n\n /**\n * 获取事件名称的全部监听方法(如通过 `once` 方法注册,返回的是包装方法)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, wrapFn2]\n */\n listeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.wrap) : [];\n }\n\n /**\n * 判断事件名称对应的监听方法是否存在。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 如果事件名称存在该事件方法返回 `true`,否则返回 `false`。\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // true\n *\n * // fn2 是通过 once 方法注册,执行一次后自动解绑\n * emitter.emit('test');\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // false\n */\n hasListener(eventName: EventName, listener: F) {\n return this.rawListeners(eventName).some((item) => item === listener);\n }\n\n private _on(\n eventName: EventName,\n raw: F,\n wrap: F,\n context: EventListener['context'] = null,\n dir = 1\n ) {\n const currentListener = { raw, wrap, context };\n\n if (!this.handlers[eventName]) {\n this.handlers[eventName] = [currentListener];\n } else {\n const appendMethod = dir === 1 ? 'push' : 'unshift';\n this.handlers[eventName][appendMethod](currentListener);\n }\n\n return this;\n }\n\n /**\n * 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n */\n prependListener(eventName: EventName, listener: F, context?: EventListener['context']) {\n return this._on(eventName, listener, listener, context, 0);\n }\n\n /**\n * 注册监听方法。允许多次添加同一引用的函数。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n */\n on(eventName: EventName, listener: F, context?: EventListener['context']) {\n return this._on(eventName, listener, listener, context);\n }\n\n private _wrapOnce(eventName: EventName, listener: F, context: EventListener['context'] = null) {\n const wrap = ((...args: Parameters<F>) => {\n listener.apply(context, args);\n this.off(eventName, wrap);\n }) as F;\n return wrap;\n }\n\n /**\n * 仅触发一次的监听方法。使用方法同 `on` 。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.once('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.emit('foo');\n * // bar\n */\n once(eventName: EventName, listener: F, context?: EventListener['context']) {\n const wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context);\n }\n\n /**\n * 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependOnceListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n *\n * emitter.emit('foo');\n * // bar\n */\n prependOnceListener(eventName: EventName, listener: F, context?: EventListener['context']) {\n const wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context, 0);\n }\n\n /**\n * 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('foo', fn);\n * emitter.on('foo', () => console.log('baz'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // baz\n * // 42\n *\n * emitter.off('foo', fn); // 取消 foo 的监听方法 fn\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.off('foo'); // 取消 foo 的全部监听方法\n * emitter.emit('foo'); // 什么都没发生\n */\n off(eventName: EventName, listener?: F) {\n const handler = this.handlers[eventName];\n\n if (handler) {\n if (listener) {\n const index = handler.findIndex((item) => item.wrap === listener || item.raw === listener);\n if (index !== -1) {\n handler.splice(index, 1);\n }\n } else {\n delete this.handlers[eventName];\n }\n }\n return this;\n }\n\n /**\n * 取消全部事件名称的监听方法。\n *\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('test', fn);\n * emitter.on('test', () => console.log('baz'));\n * emitter.on('test', () => console.log(42));\n *\n * emitter.on('other', fn);\n * emitter.on('other', () => console.log('baz'));\n *\n * emitter.emit('test');\n * // bar\n * // baz\n * // 42\n *\n * emitter.emit('other');\n * // bar\n * // baz\n *\n * emitter.offAll(); // 取消全部监听方法\n *\n * emitter.emit('test'); // 什么都没发生\n * emitter.emit('other'); // 什么都没发生\n */\n offAll() {\n this.handlers = {};\n return this;\n }\n\n /**\n * 触发监听方法。\n *\n * @param eventName 事件名称\n * @param args 触发监听方法的参数(从第二个参数开始都将传给监听方法)\n * @returns 如果触发成功返回 `true`,否则返回 `false`。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * // 支持传入参数\n * emitter.on('test' (a, b) => console.log(a + b));\n * emitter.on('test' (a, b) => console.log(a * b));\n *\n * emitter.emit('other', 2, 5);\n * // 7\n * // 10\n *\n * emitter.emit('other', 5, 5);\n * // 10\n * // 25\n */\n emit(eventName: EventName, ...args: Parameters<F>) {\n const handler = this.handlers[eventName];\n if (handler && handler.length > 0) {\n handler.forEach((listener) => {\n listener.wrap.apply(listener.context, args);\n });\n return true;\n }\n return false;\n }\n}\n\nexport default EmitterPro;\n"],"names":[],"mappings":"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"}
{"version":3,"file":"emitter-pro.js","sources":["../src/index.ts"],"sourcesContent":["type Listener = (...args: any[]) => any;\n\ntype EventName = string | symbol;\ntype EventListener<F extends Listener = Listener> = { raw: F; wrap: F; context: object | null };\ntype Handler<F extends Listener = Listener> = Record<EventName, EventListener<F>[]>;\n\n/**\n * 事件触发器,支持浏览器端和 node 端。\n *\n * @class\n * @example\n *\n * const emitter = new Emitter();\n *\n * // 注册监听方法\n * emitter.on('foo', () => console.log('foo 1'));\n * emitter.on('foo', () => console.log('foo 2'));\n *\n * // 触发方法\n * emitter.emit('foo');\n * // foo 1\n * // foo 2\n *\n * // 取消监听方法\n * emitter.off('foo');\n *\n * // 支持链式调用\n * emitter.on('foo', () => {})\n * .on('foo', () => {})\n * .off('foo');\n */\nclass EmitterPro<F extends Listener = Listener> {\n private handlers: Handler<F>;\n constructor() {\n this.handlers = {};\n }\n\n /**\n * 获取全部事件名称。\n *\n * @returns 事件名称数组。\n * @example\n * emitter.on('foo', () => {});\n * emitter.on('bar', () => {});\n *\n * emitter.eventNames(); // ['foo', 'bar']\n */\n eventNames() {\n const symbols = Object.getOwnPropertySymbols?.(this.handlers) || [];\n const keys = Object.keys(this.handlers) as (string | symbol)[];\n return keys.concat(symbols);\n }\n\n /**\n * 获取事件名称的全部监听方法(原始方法,未经过包装处理)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, fn2]\n */\n rawListeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.raw) : [];\n }\n\n /**\n * 获取事件名称的全部监听方法(如通过 `once` 方法注册,返回的是包装方法)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, wrapFn2]\n */\n listeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.wrap) : [];\n }\n\n /**\n * 判断事件名称对应的监听方法是否存在。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 如果事件名称存在该事件方法返回 `true`,否则返回 `false`。\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // true\n *\n * // fn2 是通过 once 方法注册,执行一次后自动解绑\n * emitter.emit('test');\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // false\n */\n hasListener(eventName: EventName, listener: F) {\n return this.rawListeners(eventName).some((item) => item === listener);\n }\n\n private _on(\n eventName: EventName,\n raw: F,\n wrap: F,\n context: EventListener['context'] = null,\n dir = 1\n ) {\n const currentListener = { raw, wrap, context };\n\n if (!this.handlers[eventName]) {\n this.handlers[eventName] = [currentListener];\n } else {\n const appendMethod = dir === 1 ? 'push' : 'unshift';\n this.handlers[eventName][appendMethod](currentListener);\n }\n\n return this;\n }\n\n /**\n * 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n */\n prependListener(eventName: EventName, listener: F, context?: EventListener['context']) {\n return this._on(eventName, listener, listener, context, 0);\n }\n\n /**\n * 注册监听方法。允许多次添加同一引用的函数。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n */\n on(eventName: EventName, listener: F, context?: EventListener['context']) {\n return this._on(eventName, listener, listener, context);\n }\n\n private _wrapOnce(eventName: EventName, listener: F, context: EventListener['context'] = null) {\n const wrap = ((...args: Parameters<F>) => {\n listener.apply(context, args);\n this.off(eventName, wrap);\n }) as F;\n return wrap;\n }\n\n /**\n * 仅触发一次的监听方法。使用方法同 `on` 。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.once('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.emit('foo');\n * // bar\n */\n once(eventName: EventName, listener: F, context?: EventListener['context']) {\n const wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context);\n }\n\n /**\n * 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependOnceListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n *\n * emitter.emit('foo');\n * // bar\n */\n prependOnceListener(eventName: EventName, listener: F, context?: EventListener['context']) {\n const wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context, 0);\n }\n\n /**\n * 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('foo', fn);\n * emitter.on('foo', () => console.log('baz'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // baz\n * // 42\n *\n * emitter.off('foo', fn); // 取消 foo 的监听方法 fn\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.off('foo'); // 取消 foo 的全部监听方法\n * emitter.emit('foo'); // 什么都没发生\n */\n off(eventName: EventName, listener?: F) {\n const handler = this.handlers[eventName];\n\n if (handler) {\n if (listener) {\n const index = handler.findIndex((item) => item.wrap === listener || item.raw === listener);\n if (index !== -1) {\n handler.splice(index, 1);\n }\n } else {\n delete this.handlers[eventName];\n }\n }\n return this;\n }\n\n /**\n * 取消全部事件名称的监听方法。\n *\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('test', fn);\n * emitter.on('test', () => console.log('baz'));\n * emitter.on('test', () => console.log(42));\n *\n * emitter.on('other', fn);\n * emitter.on('other', () => console.log('baz'));\n *\n * emitter.emit('test');\n * // bar\n * // baz\n * // 42\n *\n * emitter.emit('other');\n * // bar\n * // baz\n *\n * emitter.offAll(); // 取消全部监听方法\n *\n * emitter.emit('test'); // 什么都没发生\n * emitter.emit('other'); // 什么都没发生\n */\n offAll() {\n this.handlers = {};\n return this;\n }\n\n /**\n * 触发监听方法。\n *\n * @param eventName 事件名称\n * @param args 触发监听方法的参数(从第二个参数开始都将传给监听方法)\n * @returns 如果触发成功返回 `true`,否则返回 `false`。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * // 支持传入参数\n * emitter.on('test' (a, b) => console.log(a + b));\n * emitter.on('test' (a, b) => console.log(a * b));\n *\n * emitter.emit('other', 2, 5);\n * // 7\n * // 10\n *\n * emitter.emit('other', 5, 5);\n * // 10\n * // 25\n */\n emit(eventName: EventName, ...args: Parameters<F>) {\n const handler = this.handlers[eventName];\n if (handler && handler.length > 0) {\n handler.forEach((listener) => {\n listener.wrap.apply(listener.context, args);\n });\n return true;\n }\n return false;\n }\n}\n\nexport default EmitterPro;\n"],"names":[],"mappings":"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"}

@@ -1,2 +0,2 @@

!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t="undefined"!=typeof globalThis?globalThis:t||self).EmitterPro=n()}(this,(function(){"use strict";var t=function(){function t(){this.handlers={}}return t.prototype.eventNames=function(){var t,n=(null===(t=Object.getOwnPropertySymbols)||void 0===t?void 0:t.call(Object,this.handlers))||[];return Object.keys(this.handlers).concat(n)},t.prototype.rawListeners=function(t){var n=this.handlers[t];return n?n.map((function(t){return t.raw})):[]},t.prototype.listeners=function(t){var n=this.handlers[t];return n?n.map((function(t){return t.wrap})):[]},t.prototype.hasListener=function(t,n){return this.rawListeners(t).some((function(t){return t===n}))},t.prototype._on=function(t,n,e,r,o){void 0===r&&(r=null),void 0===o&&(o=1);var i={raw:n,wrap:e,context:r};if(this.handlers[t]){var s=1===o?"push":"unshift";this.handlers[t][s](i)}else this.handlers[t]=[i];return this},t.prototype.prependListener=function(t,n,e){return this._on(t,n,n,e,0)},t.prototype.on=function(t,n,e){return this._on(t,n,n,e)},t.prototype._wrapOnce=function(t,n,e){var r=this;void 0===e&&(e=null);var o=function(){for(var i=[],s=0;s<arguments.length;s++)i[s]=arguments[s];n.apply(e,i),r.off(t,o)};return o},t.prototype.once=function(t,n,e){var r=this._wrapOnce(t,n,e);return this._on(t,n,r,e)},t.prototype.prependOnceListener=function(t,n,e){var r=this._wrapOnce(t,n,e);return this._on(t,n,r,e,0)},t.prototype.off=function(t,n){var e=this.handlers[t];if(e)if(n){var r=e.findIndex((function(t){return t.wrap===n||t.raw===n}));-1!==r&&e.splice(r,1)}else delete this.handlers[t];return this},t.prototype.offAll=function(){return this.handlers={},this},t.prototype.emit=function(t){for(var n=[],e=1;e<arguments.length;e++)n[e-1]=arguments[e];var r=this.handlers[t];return!!(r&&r.length>0)&&(r.forEach((function(t){t.wrap.apply(t.context,n)})),!0)},t}();return t}));
!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t="undefined"!=typeof globalThis?globalThis:t||self).EmitterPro=n()}(this,function(){"use strict";var t=function(){function t(){this.handlers={}}return t.prototype.eventNames=function(){var t,n=(null===(t=Object.getOwnPropertySymbols)||void 0===t?void 0:t.call(Object,this.handlers))||[];return Object.keys(this.handlers).concat(n)},t.prototype.rawListeners=function(t){var n=this.handlers[t];return n?n.map(function(t){return t.raw}):[]},t.prototype.listeners=function(t){var n=this.handlers[t];return n?n.map(function(t){return t.wrap}):[]},t.prototype.hasListener=function(t,n){return this.rawListeners(t).some(function(t){return t===n})},t.prototype._on=function(t,n,e,r,o){void 0===r&&(r=null),void 0===o&&(o=1);var i={raw:n,wrap:e,context:r};if(this.handlers[t]){var s=1===o?"push":"unshift";this.handlers[t][s](i)}else this.handlers[t]=[i];return this},t.prototype.prependListener=function(t,n,e){return this._on(t,n,n,e,0)},t.prototype.on=function(t,n,e){return this._on(t,n,n,e)},t.prototype._wrapOnce=function(t,n,e){var r=this;void 0===e&&(e=null);var o=function(){for(var i=[],s=0;s<arguments.length;s++)i[s]=arguments[s];n.apply(e,i),r.off(t,o)};return o},t.prototype.once=function(t,n,e){var r=this._wrapOnce(t,n,e);return this._on(t,n,r,e)},t.prototype.prependOnceListener=function(t,n,e){var r=this._wrapOnce(t,n,e);return this._on(t,n,r,e,0)},t.prototype.off=function(t,n){var e=this.handlers[t];if(e)if(n){var r=e.findIndex(function(t){return t.wrap===n||t.raw===n});-1!==r&&e.splice(r,1)}else delete this.handlers[t];return this},t.prototype.offAll=function(){return this.handlers={},this},t.prototype.emit=function(t){for(var n=[],e=1;e<arguments.length;e++)n[e-1]=arguments[e];var r=this.handlers[t];return!!(r&&r.length>0)&&(r.forEach(function(t){t.wrap.apply(t.context,n)}),!0)},t}();return t});
//# sourceMappingURL=emitter-pro.min.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"emitter-pro.min.js","sources":["../src/index.ts"],"sourcesContent":["type Listener = (...args: any[]) => any;\n\ntype EventName = string | symbol;\ntype EventListener<F extends Listener = Listener> = { raw: F; wrap: F; context: object | null };\ntype Handler<F extends Listener = Listener> = Record<EventName, EventListener<F>[]>;\n\n/**\n * 事件触发器,支持浏览器端和 node 端。\n *\n * @class\n * @example\n *\n * const emitter = new Emitter();\n *\n * // 注册监听方法\n * emitter.on('foo', () => console.log('foo 1'));\n * emitter.on('foo', () => console.log('foo 2'));\n *\n * // 触发方法\n * emitter.emit('foo');\n * // foo 1\n * // foo 2\n *\n * // 取消监听方法\n * emitter.off('foo');\n *\n * // 支持链式调用\n * emitter.on('foo', () => {})\n * .on('foo', () => {})\n * .off('foo');\n */\nclass EmitterPro<F extends Listener = Listener> {\n private handlers: Handler<F>;\n constructor() {\n this.handlers = {};\n }\n\n /**\n * 获取全部事件名称。\n *\n * @returns 事件名称数组。\n * @example\n * emitter.on('foo', () => {});\n * emitter.on('bar', () => {});\n *\n * emitter.eventNames(); // ['foo', 'bar']\n */\n eventNames() {\n const symbols = Object.getOwnPropertySymbols?.(this.handlers) || [];\n const keys = Object.keys(this.handlers) as (string | symbol)[];\n return keys.concat(symbols);\n }\n\n /**\n * 获取事件名称的全部监听方法(原始方法,未经过包装处理)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, fn2]\n */\n rawListeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.raw) : [];\n }\n\n /**\n * 获取事件名称的全部监听方法(如通过 `once` 方法注册,返回的是包装方法)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, wrapFn2]\n */\n listeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.wrap) : [];\n }\n\n /**\n * 判断事件名称对应的监听方法是否存在。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 如果事件名称存在该事件方法返回 `true`,否则返回 `false`。\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // true\n *\n * // fn2 是通过 once 方法注册,执行一次后自动解绑\n * emitter.emit('test');\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // false\n */\n hasListener(eventName: EventName, listener: F) {\n return this.rawListeners(eventName).some((item) => item === listener);\n }\n\n private _on(\n eventName: EventName,\n raw: F,\n wrap: F,\n context: EventListener['context'] = null,\n dir = 1\n ) {\n const currentListener = { raw, wrap, context };\n\n if (!this.handlers[eventName]) {\n this.handlers[eventName] = [currentListener];\n } else {\n const appendMethod = dir === 1 ? 'push' : 'unshift';\n this.handlers[eventName][appendMethod](currentListener);\n }\n\n return this;\n }\n\n /**\n * 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n */\n prependListener(eventName: EventName, listener: F, context?: EventListener['context']) {\n return this._on(eventName, listener, listener, context, 0);\n }\n\n /**\n * 注册监听方法。允许多次添加同一引用的函数。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n */\n on(eventName: EventName, listener: F, context?: EventListener['context']) {\n return this._on(eventName, listener, listener, context);\n }\n\n private _wrapOnce(eventName: EventName, listener: F, context: EventListener['context'] = null) {\n const wrap = ((...args: Parameters<F>) => {\n listener.apply(context, args);\n this.off(eventName, wrap);\n }) as F;\n return wrap;\n }\n\n /**\n * 仅触发一次的监听方法。使用方法同 `on` 。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.once('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.emit('foo');\n * // bar\n */\n once(eventName: EventName, listener: F, context?: EventListener['context']) {\n const wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context);\n }\n\n /**\n * 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependOnceListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n *\n * emitter.emit('foo');\n * // bar\n */\n prependOnceListener(eventName: EventName, listener: F, context?: EventListener['context']) {\n const wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context, 0);\n }\n\n /**\n * 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('foo', fn);\n * emitter.on('foo', () => console.log('baz'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // baz\n * // 42\n *\n * emitter.off('foo', fn); // 取消 foo 的监听方法 fn\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.off('foo'); // 取消 foo 的全部监听方法\n * emitter.emit('foo'); // 什么都没发生\n */\n off(eventName: EventName, listener?: F) {\n const handler = this.handlers[eventName];\n\n if (handler) {\n if (listener) {\n const index = handler.findIndex((item) => item.wrap === listener || item.raw === listener);\n if (index !== -1) {\n handler.splice(index, 1);\n }\n } else {\n delete this.handlers[eventName];\n }\n }\n return this;\n }\n\n /**\n * 取消全部事件名称的监听方法。\n *\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('test', fn);\n * emitter.on('test', () => console.log('baz'));\n * emitter.on('test', () => console.log(42));\n *\n * emitter.on('other', fn);\n * emitter.on('other', () => console.log('baz'));\n *\n * emitter.emit('test');\n * // bar\n * // baz\n * // 42\n *\n * emitter.emit('other');\n * // bar\n * // baz\n *\n * emitter.offAll(); // 取消全部监听方法\n *\n * emitter.emit('test'); // 什么都没发生\n * emitter.emit('other'); // 什么都没发生\n */\n offAll() {\n this.handlers = {};\n return this;\n }\n\n /**\n * 触发监听方法。\n *\n * @param eventName 事件名称\n * @param args 触发监听方法的参数(从第二个参数开始都将传给监听方法)\n * @returns 如果触发成功返回 `true`,否则返回 `false`。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * // 支持传入参数\n * emitter.on('test' (a, b) => console.log(a + b));\n * emitter.on('test' (a, b) => console.log(a * b));\n *\n * emitter.emit('other', 2, 5);\n * // 7\n * // 10\n *\n * emitter.emit('other', 5, 5);\n * // 10\n * // 25\n */\n emit(eventName: EventName, ...args: Parameters<F>) {\n const handler = this.handlers[eventName];\n if (handler && handler.length > 0) {\n handler.forEach((listener) => {\n listener.wrap.apply(listener.context, args);\n });\n return true;\n }\n return false;\n }\n}\n\nexport default EmitterPro;\n"],"names":["EmitterPro","this","handlers","prototype","eventNames","symbols","_a","Object","getOwnPropertySymbols","call","keys","concat","rawListeners","eventName","handler","map","item","raw","listeners","wrap","hasListener","listener","some","_on","context","dir","currentListener","appendMethod","prependListener","on","_wrapOnce","_this","args","_i","arguments","length","apply","off","once","prependOnceListener","index","findIndex","splice","offAll","emit","forEach"],"mappings":"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"}
{"version":3,"file":"emitter-pro.min.js","sources":["../src/index.ts"],"sourcesContent":["type Listener = (...args: any[]) => any;\n\ntype EventName = string | symbol;\ntype EventListener<F extends Listener = Listener> = { raw: F; wrap: F; context: object | null };\ntype Handler<F extends Listener = Listener> = Record<EventName, EventListener<F>[]>;\n\n/**\n * 事件触发器,支持浏览器端和 node 端。\n *\n * @class\n * @example\n *\n * const emitter = new Emitter();\n *\n * // 注册监听方法\n * emitter.on('foo', () => console.log('foo 1'));\n * emitter.on('foo', () => console.log('foo 2'));\n *\n * // 触发方法\n * emitter.emit('foo');\n * // foo 1\n * // foo 2\n *\n * // 取消监听方法\n * emitter.off('foo');\n *\n * // 支持链式调用\n * emitter.on('foo', () => {})\n * .on('foo', () => {})\n * .off('foo');\n */\nclass EmitterPro<F extends Listener = Listener> {\n private handlers: Handler<F>;\n constructor() {\n this.handlers = {};\n }\n\n /**\n * 获取全部事件名称。\n *\n * @returns 事件名称数组。\n * @example\n * emitter.on('foo', () => {});\n * emitter.on('bar', () => {});\n *\n * emitter.eventNames(); // ['foo', 'bar']\n */\n eventNames() {\n const symbols = Object.getOwnPropertySymbols?.(this.handlers) || [];\n const keys = Object.keys(this.handlers) as (string | symbol)[];\n return keys.concat(symbols);\n }\n\n /**\n * 获取事件名称的全部监听方法(原始方法,未经过包装处理)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, fn2]\n */\n rawListeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.raw) : [];\n }\n\n /**\n * 获取事件名称的全部监听方法(如通过 `once` 方法注册,返回的是包装方法)。\n *\n * @param eventName 事件名称\n * @returns 对应事件名称的监听方法数组\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.rawListeners('test'); // [fn1, wrapFn2]\n */\n listeners(eventName: EventName) {\n const handler = this.handlers[eventName];\n return handler ? handler.map((item) => item.wrap) : [];\n }\n\n /**\n * 判断事件名称对应的监听方法是否存在。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 如果事件名称存在该事件方法返回 `true`,否则返回 `false`。\n * @example\n * const fn1 = () => console.log('bar');\n * const fn2 = () => console.log('baz');\n *\n * emitter.on('test', fn1);\n * emitter.once('test', fn2);\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // true\n *\n * // fn2 是通过 once 方法注册,执行一次后自动解绑\n * emitter.emit('test');\n *\n * emitter.hasListener('test', fn1); // true\n * emitter.hasListener('test', fn2); // false\n */\n hasListener(eventName: EventName, listener: F) {\n return this.rawListeners(eventName).some((item) => item === listener);\n }\n\n private _on(\n eventName: EventName,\n raw: F,\n wrap: F,\n context: EventListener['context'] = null,\n dir = 1\n ) {\n const currentListener = { raw, wrap, context };\n\n if (!this.handlers[eventName]) {\n this.handlers[eventName] = [currentListener];\n } else {\n const appendMethod = dir === 1 ? 'push' : 'unshift';\n this.handlers[eventName][appendMethod](currentListener);\n }\n\n return this;\n }\n\n /**\n * 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n */\n prependListener(eventName: EventName, listener: F, context?: EventListener['context']) {\n return this._on(eventName, listener, listener, context, 0);\n }\n\n /**\n * 注册监听方法。允许多次添加同一引用的函数。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n */\n on(eventName: EventName, listener: F, context?: EventListener['context']) {\n return this._on(eventName, listener, listener, context);\n }\n\n private _wrapOnce(eventName: EventName, listener: F, context: EventListener['context'] = null) {\n const wrap = ((...args: Parameters<F>) => {\n listener.apply(context, args);\n this.off(eventName, wrap);\n }) as F;\n return wrap;\n }\n\n /**\n * 仅触发一次的监听方法。使用方法同 `on` 。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.once('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.emit('foo');\n * // bar\n */\n once(eventName: EventName, listener: F, context?: EventListener['context']) {\n const wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context);\n }\n\n /**\n * 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @param context 执行上下文\n * @returns 事件触发器实例。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.prependOnceListener('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // 42\n * // bar\n *\n * emitter.emit('foo');\n * // bar\n */\n prependOnceListener(eventName: EventName, listener: F, context?: EventListener['context']) {\n const wrap = this._wrapOnce(eventName, listener, context);\n return this._on(eventName, listener, wrap, context, 0);\n }\n\n /**\n * 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。\n *\n * @param eventName 事件名称\n * @param listener 监听方法\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('foo', fn);\n * emitter.on('foo', () => console.log('baz'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // baz\n * // 42\n *\n * emitter.off('foo', fn); // 取消 foo 的监听方法 fn\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * emitter.off('foo'); // 取消 foo 的全部监听方法\n * emitter.emit('foo'); // 什么都没发生\n */\n off(eventName: EventName, listener?: F) {\n const handler = this.handlers[eventName];\n\n if (handler) {\n if (listener) {\n const index = handler.findIndex((item) => item.wrap === listener || item.raw === listener);\n if (index !== -1) {\n handler.splice(index, 1);\n }\n } else {\n delete this.handlers[eventName];\n }\n }\n return this;\n }\n\n /**\n * 取消全部事件名称的监听方法。\n *\n * @returns 事件触发器实例。\n * @example\n * const fn = () => console.log('bar');\n * emitter.on('test', fn);\n * emitter.on('test', () => console.log('baz'));\n * emitter.on('test', () => console.log(42));\n *\n * emitter.on('other', fn);\n * emitter.on('other', () => console.log('baz'));\n *\n * emitter.emit('test');\n * // bar\n * // baz\n * // 42\n *\n * emitter.emit('other');\n * // bar\n * // baz\n *\n * emitter.offAll(); // 取消全部监听方法\n *\n * emitter.emit('test'); // 什么都没发生\n * emitter.emit('other'); // 什么都没发生\n */\n offAll() {\n this.handlers = {};\n return this;\n }\n\n /**\n * 触发监听方法。\n *\n * @param eventName 事件名称\n * @param args 触发监听方法的参数(从第二个参数开始都将传给监听方法)\n * @returns 如果触发成功返回 `true`,否则返回 `false`。\n * @example\n * emitter.on('foo', () => console.log('bar'));\n * emitter.on('foo', () => console.log(42));\n *\n * emitter.emit('foo');\n * // bar\n * // 42\n *\n * // 支持传入参数\n * emitter.on('test' (a, b) => console.log(a + b));\n * emitter.on('test' (a, b) => console.log(a * b));\n *\n * emitter.emit('other', 2, 5);\n * // 7\n * // 10\n *\n * emitter.emit('other', 5, 5);\n * // 10\n * // 25\n */\n emit(eventName: EventName, ...args: Parameters<F>) {\n const handler = this.handlers[eventName];\n if (handler && handler.length > 0) {\n handler.forEach((listener) => {\n listener.wrap.apply(listener.context, args);\n });\n return true;\n }\n return false;\n }\n}\n\nexport default EmitterPro;\n"],"names":["EmitterPro","this","handlers","prototype","eventNames","symbols","_a","Object","getOwnPropertySymbols","call","keys","concat","rawListeners","eventName","handler","map","item","raw","listeners","wrap","hasListener","listener","some","_on","context","dir","currentListener","appendMethod","prependListener","on","_wrapOnce","_this","args","_i","arguments","length","apply","off","once","prependOnceListener","index","findIndex","splice","offAll","emit","forEach"],"mappings":"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"}
{
"name": "emitter-pro",
"version": "1.2.2",
"version": "1.2.3",
"description": "一个简单的 Javascript 事件管理,支持浏览器端和 node 端。",

@@ -8,8 +8,6 @@ "scripts": {

"test:coverage": "jest --verbose --coverage",
"build": "rm -rf dist && npm run build:module && npm run build:umd && npm run build:types",
"build:module": "rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript",
"build:umd": "rollup --config rollup.umd.config.ts --configPlugin @rollup/plugin-typescript",
"build": "rm -rf dist && rollup --config rollup.config.ts --configPlugin typescript && npm run build:types",
"build:types": "rm -rf types && tsc -p tsconfig.types.json",
"prettier": "prettier --write \"**/*.{js,jsx,tsx,ts,less,md,json}\"",
"lint": "eslint --ext .js,.jsx,.ts,.tsx src",
"lint": "eslint .",
"lint:fix": "npm run lint -- --fix",

@@ -28,2 +26,3 @@ "prepublishOnly": "npm test && npm run build",

"unpkg": "dist/emitter-pro.min.js",
"browser": "dist/emitter-pro.min.js",
"types": "types/index.d.ts",

@@ -63,23 +62,23 @@ "config": {

"devDependencies": {
"@commitlint/cli": "^19.2.1",
"@commitlint/config-conventional": "^19.1.0",
"@commitlint/cz-commitlint": "^19.2.0",
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-node-resolve": "^15.2.3",
"@commitlint/cli": "^19.8.1",
"@commitlint/config-conventional": "^19.8.1",
"@commitlint/cz-commitlint": "^19.8.1",
"@eslint/js": "^9.32.0",
"@rollup/plugin-commonjs": "^28.0.6",
"@rollup/plugin-node-resolve": "^16.0.1",
"@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-typescript": "^11.1.6",
"@types/jest": "^29.5.12",
"@typescript-eslint/eslint-plugin": "^7.3.1",
"@typescript-eslint/parser": "^7.3.1",
"commitizen": "^4.3.0",
"eslint": "^8.57.0",
"husky": "^9.0.11",
"inquirer": "^9.2.16",
"jest": "^29.7.0",
"lint-staged": "^15.2.2",
"prettier": "^3.2.5",
"rollup": "^4.13.0",
"ts-jest": "^29.1.2",
"tslib": "^2.6.2",
"typescript": "^5.4.2"
"@rollup/plugin-typescript": "^12.1.4",
"@types/jest": "^30.0.0",
"commitizen": "^4.3.1",
"eslint": "^9.32.0",
"globals": "^16.3.0",
"husky": "^9.1.7",
"jest": "^30.0.5",
"lint-staged": "^15.5.2",
"prettier": "^3.6.2",
"rollup": "^4.46.0",
"ts-jest": "^29.4.0",
"tslib": "^2.8.1",
"typescript": "^5.8.3",
"typescript-eslint": "^8.38.0"
},

@@ -86,0 +85,0 @@ "publishConfig": {