@boost/core
Version:
Robust pipeline for creating dev tools that separate logic into routines and tasks.
74 lines (73 loc) • 2.62 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const camelCase_1 = __importDefault(require("lodash/camelCase"));
const upperFirst_1 = __importDefault(require("lodash/upperFirst"));
const constants_1 = require("./constants");
class Emitter {
constructor() {
this.listeners = new Map();
}
/**
* Remove all listeners for the defined event name.
*/
clearListeners(eventName) {
this.getListeners(eventName).clear();
return this;
}
/**
* Syncronously execute listeners for the defined event and arguments.
*/
emit(eventName, args = []) {
Array.from(this.getListeners(eventName)).some(listener => listener(...args) === false);
return this;
}
/**
* Return all event names with registered listeners.
*/
getEventNames() {
return Array.from(this.listeners.keys());
}
/**
* Return a set of listeners for a specific event name.
*/
getListeners(eventName) {
if (!eventName.match(constants_1.EVENT_NAME_PATTERN)) {
throw new Error(`Invalid event name "${eventName}". ` +
'May only contain dashes, periods, and lowercase characters.');
}
if (!this.listeners.has(eventName)) {
this.listeners.set(eventName, new Set());
}
return this.listeners.get(eventName);
}
/**
* Remove a listener function from a specific event name.
*/
off(eventName, listener) {
this.getListeners(eventName).delete(listener);
return this;
}
/**
* Register a listener function to a specific event name.
*/
on(eventName, listener) {
if (typeof listener !== 'function') {
throw new TypeError(`Invalid event listener for "${eventName}", must be a function.`);
}
let eventProp = eventName;
const args = ['listener'];
if (eventName.includes('.')) {
const [scope, event] = eventName.split('.', 2);
args.push(`'${scope}'`);
eventProp = event;
}
// eslint-disable-next-line no-console
console.warn(`Boost emitter has been deprecated. Please migrate \`on('${eventName}', listener)\` to the new @boost/event system, \`on${upperFirst_1.default(camelCase_1.default(eventProp))}.listen(${args.join(', ')})\`.'`);
this.getListeners(eventName).add(listener);
return this;
}
}
exports.default = Emitter;