🎩 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.3
to
1.2.4
+1
-231
dist/emitter-pro.cjs.js
'use strict';
/**
* 事件触发器,支持浏览器端和 node 端。
*
* @class
* @example
*
* const emitter = new Emitter();
*
* // 注册监听方法
* emitter.on('foo', () => console.log('foo 1'));
* emitter.on('foo', () => console.log('foo 2'));
*
* // 触发方法
* emitter.emit('foo');
* // foo 1
* // foo 2
*
* // 取消监听方法
* emitter.off('foo');
*
* // 支持链式调用
* emitter.on('foo', () => {})
* .on('foo', () => {})
* .off('foo');
*/
var EmitterPro = /** @class */ (function () {
var EmitterPro = (function () {
function EmitterPro() {
this.handlers = {};
}
/**
* 获取全部事件名称。
*
* @returns 事件名称数组。
* @example
* emitter.on('foo', () => {});
* emitter.on('bar', () => {});
*
* emitter.eventNames(); // ['foo', 'bar']
*/
EmitterPro.prototype.eventNames = function () {

@@ -48,16 +13,2 @@ var _a;

};
/**
* 获取事件名称的全部监听方法(原始方法,未经过包装处理)。
*
* @param eventName 事件名称
* @returns 对应事件名称的监听方法数组
* @example
* const fn1 = () => console.log('bar');
* const fn2 = () => console.log('baz');
*
* emitter.on('test', fn1);
* emitter.once('test', fn2);
*
* emitter.rawListeners('test'); // [fn1, fn2]
*/
EmitterPro.prototype.rawListeners = function (eventName) {

@@ -67,16 +18,2 @@ var handler = this.handlers[eventName];

};
/**
* 获取事件名称的全部监听方法(如通过 `once` 方法注册,返回的是包装方法)。
*
* @param eventName 事件名称
* @returns 对应事件名称的监听方法数组
* @example
* const fn1 = () => console.log('bar');
* const fn2 = () => console.log('baz');
*
* emitter.on('test', fn1);
* emitter.once('test', fn2);
*
* emitter.rawListeners('test'); // [fn1, wrapFn2]
*/
EmitterPro.prototype.listeners = function (eventName) {

@@ -86,24 +23,2 @@ var handler = this.handlers[eventName];

};
/**
* 判断事件名称对应的监听方法是否存在。
*
* @param eventName 事件名称
* @param listener 监听方法
* @returns 如果事件名称存在该事件方法返回 `true`,否则返回 `false`。
* @example
* const fn1 = () => console.log('bar');
* const fn2 = () => console.log('baz');
*
* emitter.on('test', fn1);
* emitter.once('test', fn2);
*
* emitter.hasListener('test', fn1); // true
* emitter.hasListener('test', fn2); // true
*
* // fn2 是通过 once 方法注册,执行一次后自动解绑
* emitter.emit('test');
*
* emitter.hasListener('test', fn1); // true
* emitter.hasListener('test', fn2); // false
*/
EmitterPro.prototype.hasListener = function (eventName, listener) {

@@ -125,35 +40,5 @@ return this.rawListeners(eventName).some(function (item) { return item === listener; });

};
/**
* 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。
*
* @param eventName 事件名称
* @param listener 监听方法
* @param context 执行上下文
* @returns 事件触发器实例。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.prependListener('foo', () => console.log(42));
*
* emitter.emit('foo');
* // 42
* // bar
*/
EmitterPro.prototype.prependListener = function (eventName, listener, context) {
return this._on(eventName, listener, listener, context, 0);
};
/**
* 注册监听方法。允许多次添加同一引用的函数。
*
* @param eventName 事件名称
* @param listener 监听方法
* @param context 执行上下文
* @returns 事件触发器实例。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.on('foo', () => console.log(42));
*
* emitter.emit('foo');
* // bar
* // 42
*/
EmitterPro.prototype.on = function (eventName, listener, context) {

@@ -175,20 +60,2 @@ return this._on(eventName, listener, listener, context);

};
/**
* 仅触发一次的监听方法。使用方法同 `on` 。
*
* @param eventName 事件名称
* @param listener 监听方法
* @param context 执行上下文
* @returns 事件触发器实例。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.once('foo', () => console.log(42));
*
* emitter.emit('foo');
* // bar
* // 42
*
* emitter.emit('foo');
* // bar
*/
EmitterPro.prototype.once = function (eventName, listener, context) {

@@ -198,20 +65,2 @@ var wrap = this._wrapOnce(eventName, listener, context);

};
/**
* 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。
*
* @param eventName 事件名称
* @param listener 监听方法
* @param context 执行上下文
* @returns 事件触发器实例。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.prependOnceListener('foo', () => console.log(42));
*
* emitter.emit('foo');
* // 42
* // bar
*
* emitter.emit('foo');
* // bar
*/
EmitterPro.prototype.prependOnceListener = function (eventName, listener, context) {

@@ -221,28 +70,2 @@ var wrap = this._wrapOnce(eventName, listener, context);

};
/**
* 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。
*
* @param eventName 事件名称
* @param listener 监听方法
* @returns 事件触发器实例。
* @example
* const fn = () => console.log('bar');
* emitter.on('foo', fn);
* emitter.on('foo', () => console.log('baz'));
* emitter.on('foo', () => console.log(42));
*
* emitter.emit('foo');
* // bar
* // baz
* // 42
*
* emitter.off('foo', fn); // 取消 foo 的监听方法 fn
*
* emitter.emit('foo');
* // bar
* // 42
*
* emitter.off('foo'); // 取消 foo 的全部监听方法
* emitter.emit('foo'); // 什么都没发生
*/
EmitterPro.prototype.off = function (eventName, listener) {

@@ -263,29 +86,2 @@ var handler = this.handlers[eventName];

};
/**
* 取消全部事件名称的监听方法。
*
* @returns 事件触发器实例。
* @example
* const fn = () => console.log('bar');
* emitter.on('test', fn);
* emitter.on('test', () => console.log('baz'));
* emitter.on('test', () => console.log(42));
*
* emitter.on('other', fn);
* emitter.on('other', () => console.log('baz'));
*
* emitter.emit('test');
* // bar
* // baz
* // 42
*
* emitter.emit('other');
* // bar
* // baz
*
* emitter.offAll(); // 取消全部监听方法
*
* emitter.emit('test'); // 什么都没发生
* emitter.emit('other'); // 什么都没发生
*/
EmitterPro.prototype.offAll = function () {

@@ -295,28 +91,2 @@ this.handlers = {};

};
/**
* 触发监听方法。
*
* @param eventName 事件名称
* @param args 触发监听方法的参数(从第二个参数开始都将传给监听方法)
* @returns 如果触发成功返回 `true`,否则返回 `false`。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.on('foo', () => console.log(42));
*
* emitter.emit('foo');
* // bar
* // 42
*
* // 支持传入参数
* emitter.on('test' (a, b) => console.log(a + b));
* emitter.on('test' (a, b) => console.log(a * b));
*
* emitter.emit('other', 2, 5);
* // 7
* // 10
*
* emitter.emit('other', 5, 5);
* // 10
* // 25
*/
EmitterPro.prototype.emit = function (eventName) {

@@ -323,0 +93,0 @@ var args = [];

@@ -1,40 +0,5 @@

/**
* 事件触发器,支持浏览器端和 node 端。
*
* @class
* @example
*
* const emitter = new Emitter();
*
* // 注册监听方法
* emitter.on('foo', () => console.log('foo 1'));
* emitter.on('foo', () => console.log('foo 2'));
*
* // 触发方法
* emitter.emit('foo');
* // foo 1
* // foo 2
*
* // 取消监听方法
* emitter.off('foo');
*
* // 支持链式调用
* emitter.on('foo', () => {})
* .on('foo', () => {})
* .off('foo');
*/
var EmitterPro = /** @class */ (function () {
var EmitterPro = (function () {
function EmitterPro() {
this.handlers = {};
}
/**
* 获取全部事件名称。
*
* @returns 事件名称数组。
* @example
* emitter.on('foo', () => {});
* emitter.on('bar', () => {});
*
* emitter.eventNames(); // ['foo', 'bar']
*/
EmitterPro.prototype.eventNames = function () {

@@ -46,16 +11,2 @@ var _a;

};
/**
* 获取事件名称的全部监听方法(原始方法,未经过包装处理)。
*
* @param eventName 事件名称
* @returns 对应事件名称的监听方法数组
* @example
* const fn1 = () => console.log('bar');
* const fn2 = () => console.log('baz');
*
* emitter.on('test', fn1);
* emitter.once('test', fn2);
*
* emitter.rawListeners('test'); // [fn1, fn2]
*/
EmitterPro.prototype.rawListeners = function (eventName) {

@@ -65,16 +16,2 @@ var handler = this.handlers[eventName];

};
/**
* 获取事件名称的全部监听方法(如通过 `once` 方法注册,返回的是包装方法)。
*
* @param eventName 事件名称
* @returns 对应事件名称的监听方法数组
* @example
* const fn1 = () => console.log('bar');
* const fn2 = () => console.log('baz');
*
* emitter.on('test', fn1);
* emitter.once('test', fn2);
*
* emitter.rawListeners('test'); // [fn1, wrapFn2]
*/
EmitterPro.prototype.listeners = function (eventName) {

@@ -84,24 +21,2 @@ var handler = this.handlers[eventName];

};
/**
* 判断事件名称对应的监听方法是否存在。
*
* @param eventName 事件名称
* @param listener 监听方法
* @returns 如果事件名称存在该事件方法返回 `true`,否则返回 `false`。
* @example
* const fn1 = () => console.log('bar');
* const fn2 = () => console.log('baz');
*
* emitter.on('test', fn1);
* emitter.once('test', fn2);
*
* emitter.hasListener('test', fn1); // true
* emitter.hasListener('test', fn2); // true
*
* // fn2 是通过 once 方法注册,执行一次后自动解绑
* emitter.emit('test');
*
* emitter.hasListener('test', fn1); // true
* emitter.hasListener('test', fn2); // false
*/
EmitterPro.prototype.hasListener = function (eventName, listener) {

@@ -123,35 +38,5 @@ return this.rawListeners(eventName).some(function (item) { return item === listener; });

};
/**
* 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。
*
* @param eventName 事件名称
* @param listener 监听方法
* @param context 执行上下文
* @returns 事件触发器实例。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.prependListener('foo', () => console.log(42));
*
* emitter.emit('foo');
* // 42
* // bar
*/
EmitterPro.prototype.prependListener = function (eventName, listener, context) {
return this._on(eventName, listener, listener, context, 0);
};
/**
* 注册监听方法。允许多次添加同一引用的函数。
*
* @param eventName 事件名称
* @param listener 监听方法
* @param context 执行上下文
* @returns 事件触发器实例。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.on('foo', () => console.log(42));
*
* emitter.emit('foo');
* // bar
* // 42
*/
EmitterPro.prototype.on = function (eventName, listener, context) {

@@ -173,20 +58,2 @@ return this._on(eventName, listener, listener, context);

};
/**
* 仅触发一次的监听方法。使用方法同 `on` 。
*
* @param eventName 事件名称
* @param listener 监听方法
* @param context 执行上下文
* @returns 事件触发器实例。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.once('foo', () => console.log(42));
*
* emitter.emit('foo');
* // bar
* // 42
*
* emitter.emit('foo');
* // bar
*/
EmitterPro.prototype.once = function (eventName, listener, context) {

@@ -196,20 +63,2 @@ var wrap = this._wrapOnce(eventName, listener, context);

};
/**
* 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。
*
* @param eventName 事件名称
* @param listener 监听方法
* @param context 执行上下文
* @returns 事件触发器实例。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.prependOnceListener('foo', () => console.log(42));
*
* emitter.emit('foo');
* // 42
* // bar
*
* emitter.emit('foo');
* // bar
*/
EmitterPro.prototype.prependOnceListener = function (eventName, listener, context) {

@@ -219,28 +68,2 @@ var wrap = this._wrapOnce(eventName, listener, context);

};
/**
* 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。
*
* @param eventName 事件名称
* @param listener 监听方法
* @returns 事件触发器实例。
* @example
* const fn = () => console.log('bar');
* emitter.on('foo', fn);
* emitter.on('foo', () => console.log('baz'));
* emitter.on('foo', () => console.log(42));
*
* emitter.emit('foo');
* // bar
* // baz
* // 42
*
* emitter.off('foo', fn); // 取消 foo 的监听方法 fn
*
* emitter.emit('foo');
* // bar
* // 42
*
* emitter.off('foo'); // 取消 foo 的全部监听方法
* emitter.emit('foo'); // 什么都没发生
*/
EmitterPro.prototype.off = function (eventName, listener) {

@@ -261,29 +84,2 @@ var handler = this.handlers[eventName];

};
/**
* 取消全部事件名称的监听方法。
*
* @returns 事件触发器实例。
* @example
* const fn = () => console.log('bar');
* emitter.on('test', fn);
* emitter.on('test', () => console.log('baz'));
* emitter.on('test', () => console.log(42));
*
* emitter.on('other', fn);
* emitter.on('other', () => console.log('baz'));
*
* emitter.emit('test');
* // bar
* // baz
* // 42
*
* emitter.emit('other');
* // bar
* // baz
*
* emitter.offAll(); // 取消全部监听方法
*
* emitter.emit('test'); // 什么都没发生
* emitter.emit('other'); // 什么都没发生
*/
EmitterPro.prototype.offAll = function () {

@@ -293,28 +89,2 @@ this.handlers = {};

};
/**
* 触发监听方法。
*
* @param eventName 事件名称
* @param args 触发监听方法的参数(从第二个参数开始都将传给监听方法)
* @returns 如果触发成功返回 `true`,否则返回 `false`。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.on('foo', () => console.log(42));
*
* emitter.emit('foo');
* // bar
* // 42
*
* // 支持传入参数
* emitter.on('test' (a, b) => console.log(a + b));
* emitter.on('test' (a, b) => console.log(a * b));
*
* emitter.emit('other', 2, 5);
* // 7
* // 10
*
* emitter.emit('other', 5, 5);
* // 10
* // 25
*/
EmitterPro.prototype.emit = function (eventName) {

@@ -321,0 +91,0 @@ var args = [];

@@ -7,41 +7,6 @@ (function (global, factory) {

/**
* 事件触发器,支持浏览器端和 node 端。
*
* @class
* @example
*
* const emitter = new Emitter();
*
* // 注册监听方法
* emitter.on('foo', () => console.log('foo 1'));
* emitter.on('foo', () => console.log('foo 2'));
*
* // 触发方法
* emitter.emit('foo');
* // foo 1
* // foo 2
*
* // 取消监听方法
* emitter.off('foo');
*
* // 支持链式调用
* emitter.on('foo', () => {})
* .on('foo', () => {})
* .off('foo');
*/
var EmitterPro = /** @class */ (function () {
var EmitterPro = (function () {
function EmitterPro() {
this.handlers = {};
}
/**
* 获取全部事件名称。
*
* @returns 事件名称数组。
* @example
* emitter.on('foo', () => {});
* emitter.on('bar', () => {});
*
* emitter.eventNames(); // ['foo', 'bar']
*/
EmitterPro.prototype.eventNames = function () {

@@ -53,16 +18,2 @@ var _a;

};
/**
* 获取事件名称的全部监听方法(原始方法,未经过包装处理)。
*
* @param eventName 事件名称
* @returns 对应事件名称的监听方法数组
* @example
* const fn1 = () => console.log('bar');
* const fn2 = () => console.log('baz');
*
* emitter.on('test', fn1);
* emitter.once('test', fn2);
*
* emitter.rawListeners('test'); // [fn1, fn2]
*/
EmitterPro.prototype.rawListeners = function (eventName) {

@@ -72,16 +23,2 @@ var handler = this.handlers[eventName];

};
/**
* 获取事件名称的全部监听方法(如通过 `once` 方法注册,返回的是包装方法)。
*
* @param eventName 事件名称
* @returns 对应事件名称的监听方法数组
* @example
* const fn1 = () => console.log('bar');
* const fn2 = () => console.log('baz');
*
* emitter.on('test', fn1);
* emitter.once('test', fn2);
*
* emitter.rawListeners('test'); // [fn1, wrapFn2]
*/
EmitterPro.prototype.listeners = function (eventName) {

@@ -91,24 +28,2 @@ var handler = this.handlers[eventName];

};
/**
* 判断事件名称对应的监听方法是否存在。
*
* @param eventName 事件名称
* @param listener 监听方法
* @returns 如果事件名称存在该事件方法返回 `true`,否则返回 `false`。
* @example
* const fn1 = () => console.log('bar');
* const fn2 = () => console.log('baz');
*
* emitter.on('test', fn1);
* emitter.once('test', fn2);
*
* emitter.hasListener('test', fn1); // true
* emitter.hasListener('test', fn2); // true
*
* // fn2 是通过 once 方法注册,执行一次后自动解绑
* emitter.emit('test');
*
* emitter.hasListener('test', fn1); // true
* emitter.hasListener('test', fn2); // false
*/
EmitterPro.prototype.hasListener = function (eventName, listener) {

@@ -130,35 +45,5 @@ return this.rawListeners(eventName).some(function (item) { return item === listener; });

};
/**
* 注册监听方法。同 `on` 方法,只是将监听方法添加到最前面(事件触发是按顺序执行)。
*
* @param eventName 事件名称
* @param listener 监听方法
* @param context 执行上下文
* @returns 事件触发器实例。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.prependListener('foo', () => console.log(42));
*
* emitter.emit('foo');
* // 42
* // bar
*/
EmitterPro.prototype.prependListener = function (eventName, listener, context) {
return this._on(eventName, listener, listener, context, 0);
};
/**
* 注册监听方法。允许多次添加同一引用的函数。
*
* @param eventName 事件名称
* @param listener 监听方法
* @param context 执行上下文
* @returns 事件触发器实例。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.on('foo', () => console.log(42));
*
* emitter.emit('foo');
* // bar
* // 42
*/
EmitterPro.prototype.on = function (eventName, listener, context) {

@@ -180,20 +65,2 @@ return this._on(eventName, listener, listener, context);

};
/**
* 仅触发一次的监听方法。使用方法同 `on` 。
*
* @param eventName 事件名称
* @param listener 监听方法
* @param context 执行上下文
* @returns 事件触发器实例。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.once('foo', () => console.log(42));
*
* emitter.emit('foo');
* // bar
* // 42
*
* emitter.emit('foo');
* // bar
*/
EmitterPro.prototype.once = function (eventName, listener, context) {

@@ -203,20 +70,2 @@ var wrap = this._wrapOnce(eventName, listener, context);

};
/**
* 仅触发一次的监听方法。同 `once` 方法,只是添加到最前面(事件触发是按顺序执行)。
*
* @param eventName 事件名称
* @param listener 监听方法
* @param context 执行上下文
* @returns 事件触发器实例。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.prependOnceListener('foo', () => console.log(42));
*
* emitter.emit('foo');
* // 42
* // bar
*
* emitter.emit('foo');
* // bar
*/
EmitterPro.prototype.prependOnceListener = function (eventName, listener, context) {

@@ -226,28 +75,2 @@ var wrap = this._wrapOnce(eventName, listener, context);

};
/**
* 取消监听方法。如果不传第二个参数,将取消该事件名称的全部监听方法。如果多次添加同一引用的函数,需要多次删除。
*
* @param eventName 事件名称
* @param listener 监听方法
* @returns 事件触发器实例。
* @example
* const fn = () => console.log('bar');
* emitter.on('foo', fn);
* emitter.on('foo', () => console.log('baz'));
* emitter.on('foo', () => console.log(42));
*
* emitter.emit('foo');
* // bar
* // baz
* // 42
*
* emitter.off('foo', fn); // 取消 foo 的监听方法 fn
*
* emitter.emit('foo');
* // bar
* // 42
*
* emitter.off('foo'); // 取消 foo 的全部监听方法
* emitter.emit('foo'); // 什么都没发生
*/
EmitterPro.prototype.off = function (eventName, listener) {

@@ -268,29 +91,2 @@ var handler = this.handlers[eventName];

};
/**
* 取消全部事件名称的监听方法。
*
* @returns 事件触发器实例。
* @example
* const fn = () => console.log('bar');
* emitter.on('test', fn);
* emitter.on('test', () => console.log('baz'));
* emitter.on('test', () => console.log(42));
*
* emitter.on('other', fn);
* emitter.on('other', () => console.log('baz'));
*
* emitter.emit('test');
* // bar
* // baz
* // 42
*
* emitter.emit('other');
* // bar
* // baz
*
* emitter.offAll(); // 取消全部监听方法
*
* emitter.emit('test'); // 什么都没发生
* emitter.emit('other'); // 什么都没发生
*/
EmitterPro.prototype.offAll = function () {

@@ -300,28 +96,2 @@ this.handlers = {};

};
/**
* 触发监听方法。
*
* @param eventName 事件名称
* @param args 触发监听方法的参数(从第二个参数开始都将传给监听方法)
* @returns 如果触发成功返回 `true`,否则返回 `false`。
* @example
* emitter.on('foo', () => console.log('bar'));
* emitter.on('foo', () => console.log(42));
*
* emitter.emit('foo');
* // bar
* // 42
*
* // 支持传入参数
* emitter.on('test' (a, b) => console.log(a + b));
* emitter.on('test' (a, b) => console.log(a * b));
*
* emitter.emit('other', 2, 5);
* // 7
* // 10
*
* emitter.emit('other', 5, 5);
* // 10
* // 25
*/
EmitterPro.prototype.emit = function (eventName) {

@@ -328,0 +98,0 @@ var args = [];

+1
-1

@@ -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":";;;;;;AA+BA,QAAA,UAAA,IAAA,YAAA;IAEE,IAAA,SAAA,UAAA,GAAA;IACE,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;QACpB;IAYA,IAAA,UAAA,CAAA,SAAA,CAAA,UAAU,GAAV,YAAA;;IACE,QAAA,IAAM,OAAO,GAAG,CAAA,CAAA,EAAA,GAAA,MAAM,CAAC,qBAAqB,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,MAAA,EAAG,IAAI,CAAC,QAAQ,CAAC,KAAI,EAAE;YACnE,IAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAwB;IAC9D,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAC7B,CAAC;QAgBD,UAAA,CAAA,SAAA,CAAA,YAAY,GAAZ,UAAa,SAAoB,EAAA;YAC/B,IAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YACxC,OAAO,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAC,IAAI,EAAA,EAAK,OAAA,IAAI,CAAC,GAAG,CAAA,CAAR,CAAQ,CAAC,GAAG,EAAE;QACvD,CAAC;QAgBD,UAAA,CAAA,SAAA,CAAA,SAAS,GAAT,UAAU,SAAoB,EAAA;YAC5B,IAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YACxC,OAAO,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAC,IAAI,EAAA,EAAK,OAAA,IAAI,CAAC,IAAI,CAAA,CAAT,CAAS,CAAC,GAAG,EAAE;QACxD,CAAC;IAwBD,IAAA,UAAA,CAAA,SAAA,CAAA,WAAW,GAAX,UAAY,SAAoB,EAAE,QAAW,EAAA;IAC3C,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAC,IAAI,EAAA,EAAK,OAAA,IAAI,KAAK,QAAQ,CAAA,CAAjB,CAAiB,CAAC;QACvE,CAAC;QAEO,UAAA,CAAA,SAAA,CAAA,GAAG,GAAX,UACE,SAAoB,EACpB,GAAM,EACN,IAAO,EACP,OAAwC,EACxC,GAAO,EAAA;IADP,QAAA,IAAA,OAAA,KAAA,MAAA,EAAA,EAAA,OAAA,GAAA,IAAwC,CAAA,CAAA;IACxC,QAAA,IAAA,GAAA,KAAA,MAAA,EAAA,EAAA,GAAA,GAAA,CAAO,CAAA,CAAA;IAEP,QAAA,IAAM,eAAe,GAAG,EAAE,GAAG,EAAA,GAAA,EAAE,IAAI,EAAA,IAAA,EAAE,OAAO,EAAA,OAAA,EAAE;YAE9C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;gBAC7B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC;YAC9C;iBAAO;IACL,YAAA,IAAM,YAAY,GAAG,GAAG,KAAK,CAAC,GAAG,MAAM,GAAG,SAAS;gBACnD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC;YACzD;IAEA,QAAA,OAAO,IAAI;QACb,CAAC;IAiBD,IAAA,UAAA,CAAA,SAAA,CAAA,eAAe,GAAf,UAAgB,SAAoB,EAAE,QAAW,EAAE,OAAkC,EAAA;IACnF,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;IAiBD,IAAA,UAAA,CAAA,SAAA,CAAA,EAAE,GAAF,UAAG,SAAoB,EAAE,QAAW,EAAE,OAAkC,EAAA;IACtE,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;QACzD,CAAC;IAEO,IAAA,UAAA,CAAA,SAAA,CAAA,SAAS,GAAjB,UAAkB,SAAoB,EAAE,QAAW,EAAE,OAAwC,EAAA;YAA7F,IAAA,KAAA,GAAA,IAAA;IAAqD,QAAA,IAAA,OAAA,KAAA,MAAA,EAAA,EAAA,OAAA,GAAA,IAAwC,CAAA,CAAA;YAC3F,IAAM,IAAI,IAAI,YAAA;gBAAC,IAAA,IAAA,GAAA,EAAA;qBAAA,IAAA,EAAA,GAAA,CAAsB,EAAtB,EAAA,GAAA,SAAA,CAAA,MAAsB,EAAtB,EAAA,EAAsB,EAAA;oBAAtB,IAAA,CAAA,EAAA,CAAA,GAAA,SAAA,CAAA,EAAA,CAAA;;IACb,YAAA,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;IAC7B,YAAA,KAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC;IAC3B,QAAA,CAAC,CAAM;IACP,QAAA,OAAO,IAAI;QACb,CAAC;IAoBD,IAAA,UAAA,CAAA,SAAA,CAAA,IAAI,GAAJ,UAAK,SAAoB,EAAE,QAAW,EAAE,OAAkC,EAAA;IACxE,QAAA,IAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC;IACzD,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC;QACrD,CAAC;IAoBD,IAAA,UAAA,CAAA,SAAA,CAAA,mBAAmB,GAAnB,UAAoB,SAAoB,EAAE,QAAW,EAAE,OAAkC,EAAA;IACvF,QAAA,IAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC;IACzD,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;IA4BD,IAAA,UAAA,CAAA,SAAA,CAAA,GAAG,GAAH,UAAI,SAAoB,EAAE,QAAY,EAAA;YACpC,IAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAExC,IAAI,OAAO,EAAE;gBACX,IAAI,QAAQ,EAAE;oBACZ,IAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,UAAC,IAAI,EAAA,EAAK,OAAA,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAA,CAA/C,CAA+C,CAAC;IAC1F,gBAAA,IAAI,KAAK,KAAK,EAAE,EAAE;IAChB,oBAAA,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;oBAC1B;gBACF;qBAAO;IACL,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;gBACjC;YACF;IACA,QAAA,OAAO,IAAI;QACb,CAAC;IA6BD,IAAA,UAAA,CAAA,SAAA,CAAA,MAAM,GAAN,YAAA;IACE,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IAClB,QAAA,OAAO,IAAI;QACb,CAAC;QA4BD,UAAA,CAAA,SAAA,CAAA,IAAI,GAAJ,UAAK,SAAoB,EAAA;YAAE,IAAA,IAAA,GAAA,EAAA;iBAAA,IAAA,EAAA,GAAA,CAAsB,EAAtB,EAAA,GAAA,SAAA,CAAA,MAAsB,EAAtB,EAAA,EAAsB,EAAA;gBAAtB,IAAA,CAAA,EAAA,GAAA,CAAA,CAAA,GAAA,SAAA,CAAA,EAAA,CAAA;;YACzB,IAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YACxC,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;IACjC,YAAA,OAAO,CAAC,OAAO,CAAC,UAAC,QAAQ,EAAA;oBACvB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAC7C,YAAA,CAAC,CAAC;IACF,YAAA,OAAO,IAAI;YACb;IACA,QAAA,OAAO,KAAK;QACd,CAAC;QACH,OAAA,UAAC;IAAD,CAAC,EAnTD;;;;;;;;"}
{
"name": "emitter-pro",
"version": "1.2.3",
"version": "1.2.4",
"description": "一个简单的 Javascript 事件管理,支持浏览器端和 node 端。",

@@ -63,20 +63,20 @@ "scripts": {

"@commitlint/cz-commitlint": "^19.8.1",
"@eslint/js": "^9.32.0",
"@rollup/plugin-commonjs": "^28.0.6",
"@rollup/plugin-node-resolve": "^16.0.1",
"@eslint/js": "^9.39.2",
"@rollup/plugin-commonjs": "^28.0.9",
"@rollup/plugin-node-resolve": "^16.0.3",
"@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-typescript": "^12.1.4",
"@rollup/plugin-typescript": "^12.3.0",
"@types/jest": "^30.0.0",
"commitizen": "^4.3.1",
"eslint": "^9.32.0",
"globals": "^16.3.0",
"eslint": "^9.39.2",
"globals": "^16.5.0",
"husky": "^9.1.7",
"jest": "^30.0.5",
"jest": "^30.2.0",
"lint-staged": "^15.5.2",
"prettier": "^3.6.2",
"rollup": "^4.46.0",
"ts-jest": "^29.4.0",
"prettier": "^3.8.1",
"rollup": "^4.57.0",
"ts-jest": "^29.4.6",
"tslib": "^2.8.1",
"typescript": "^5.8.3",
"typescript-eslint": "^8.38.0"
"typescript": "^5.9.3",
"typescript-eslint": "^8.54.0"
},

@@ -83,0 +83,0 @@ "publishConfig": {