Skip to content

Commit

Permalink
feat: add ESM version
Browse files Browse the repository at this point in the history
  • Loading branch information
darrachequesne committed Apr 17, 2022
1 parent cd703fe commit 54468cf
Show file tree
Hide file tree
Showing 2 changed files with 171 additions and 0 deletions.
169 changes: 169 additions & 0 deletions index.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
/**
* Initialize a new `Emitter`.
*
* @api public
*/

export function Emitter(obj) {
if (obj) return mixin(obj);
}

/**
* Mixin the emitter properties.
*
* @param {Object} obj
* @return {Object}
* @api private
*/

function mixin(obj) {
for (var key in Emitter.prototype) {
obj[key] = Emitter.prototype[key];
}
return obj;
}

/**
* Listen on the given `event` with `fn`.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/

Emitter.prototype.on =
Emitter.prototype.addEventListener = function(event, fn){
this._callbacks = this._callbacks || {};
(this._callbacks['$' + event] = this._callbacks['$' + event] || [])
.push(fn);
return this;
};

/**
* Adds an `event` listener that will be invoked a single
* time then automatically removed.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/

Emitter.prototype.once = function(event, fn){
function on() {
this.off(event, on);
fn.apply(this, arguments);
}

on.fn = fn;
this.on(event, on);
return this;
};

/**
* Remove the given callback for `event` or all
* registered callbacks.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/

Emitter.prototype.off =
Emitter.prototype.removeListener =
Emitter.prototype.removeAllListeners =
Emitter.prototype.removeEventListener = function(event, fn){
this._callbacks = this._callbacks || {};

// all
if (0 == arguments.length) {
this._callbacks = {};
return this;
}

// specific event
var callbacks = this._callbacks['$' + event];
if (!callbacks) return this;

// remove all handlers
if (1 == arguments.length) {
delete this._callbacks['$' + event];
return this;
}

// remove specific handler
var cb;
for (var i = 0; i < callbacks.length; i++) {
cb = callbacks[i];
if (cb === fn || cb.fn === fn) {
callbacks.splice(i, 1);
break;
}
}

// Remove event specific arrays for event types that no
// one is subscribed for to avoid memory leak.
if (callbacks.length === 0) {
delete this._callbacks['$' + event];
}

return this;
};

/**
* Emit `event` with the given args.
*
* @param {String} event
* @param {Mixed} ...
* @return {Emitter}
*/

Emitter.prototype.emit = function(event){
this._callbacks = this._callbacks || {};

var args = new Array(arguments.length - 1)
, callbacks = this._callbacks['$' + event];

for (var i = 1; i < arguments.length; i++) {
args[i - 1] = arguments[i];
}

if (callbacks) {
callbacks = callbacks.slice(0);
for (var i = 0, len = callbacks.length; i < len; ++i) {
callbacks[i].apply(this, args);
}
}

return this;
};

// alias used for reserved events (protected method)
Emitter.prototype.emitReserved = Emitter.prototype.emit;

/**
* Return array of callbacks for `event`.
*
* @param {String} event
* @return {Array}
* @api public
*/

Emitter.prototype.listeners = function(event){
this._callbacks = this._callbacks || {};
return this._callbacks['$' + event] || [];
};

/**
* Check if this emitter has `event` handlers.
*
* @param {String} event
* @return {Boolean}
* @api public
*/

Emitter.prototype.hasListeners = function(event){
return !! this.listeners(event).length;
};
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
}
},
"main": "index.js",
"module": "index.mjs",
"types": "index.d.ts",
"repository": {
"type": "git",
Expand All @@ -23,6 +24,7 @@
},
"files": [
"index.js",
"index.mjs",
"index.d.ts",
"LICENSE"
]
Expand Down

0 comments on commit 54468cf

Please # to comment.