unenv
Version:
`unenv` is a framework-agnostic system that allows converting JavaScript code to be platform agnostic and work in any environment including Browsers, Workers, Node.js, or JavaScript runtime.
213 lines (212 loc) • 6.57 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.EventEmitter = void 0;
exports.once = once;
let defaultMaxListeners = 10;
class EventEmitter {
__unenv__ = true;
_events = /* @__PURE__ */Object.create(null);
_maxListeners;
static get defaultMaxListeners() {
return defaultMaxListeners;
}
static set defaultMaxListeners(arg) {
if (typeof arg !== "number" || arg < 0 || Number.isNaN(arg)) {
throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + ".");
}
defaultMaxListeners = arg;
}
setMaxListeners(n) {
if (typeof n !== "number" || n < 0 || Number.isNaN(n)) {
throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + ".");
}
this._maxListeners = n;
return this;
}
getMaxListeners() {
return _getMaxListeners(this);
}
emit(type, ...args) {
if (!this._events[type] || this._events[type].length === 0) {
return false;
}
if (type === "error") {
let er;
if (args.length > 0) {
er = args[0];
}
if (er instanceof Error) {
throw er;
}
const err = new Error("Unhandled error." + (er ? " (" + er.message + ")" : ""));
err.context = er;
throw err;
}
for (const _listener of this._events[type]) {
(_listener.listener || _listener).apply(this, args);
}
return true;
}
addListener(type, listener) {
return _addListener(this, type, listener, false);
}
on(type, listener) {
return _addListener(this, type, listener, false);
}
prependListener(type, listener) {
return _addListener(this, type, listener, true);
}
once(type, listener) {
return this.on(type, _wrapOnce(this, type, listener));
}
prependOnceListener(type, listener) {
return this.prependListener(type, _wrapOnce(this, type, listener));
}
removeListener(type, listener) {
return _removeListener(this, type, listener);
}
off(type, listener) {
return this.removeListener(type, listener);
}
removeAllListeners(type) {
return _removeAllListeners(this, type);
}
listeners(type) {
return _listeners(this, type, true);
}
rawListeners(type) {
return _listeners(this, type, false);
}
listenerCount(type) {
return this.rawListeners(type).length;
}
eventNames() {
return Object.keys(this._events);
}
}
exports.EventEmitter = EventEmitter;
function once(emitter, name) {
return new Promise(function (resolve, reject) {
function errorListener(err) {
emitter.removeListener(name, resolver);
reject(err);
}
function resolver() {
if (typeof emitter.removeListener === "function") {
emitter.removeListener("error", errorListener);
}
resolve(Array.prototype.slice.call(arguments));
}
_eventTargetAgnosticAddListener(emitter, name, resolver, {
once: true
});
if (name !== "error") {
_addErrorHandlerIfEventEmitter(emitter, errorListener, {
once: true
});
}
});
}
function _addListener(target, type, listener, prepend) {
_checkListener(listener);
if (target._events.newListener !== void 0) {
target.emit("newListener", type, listener.listener || listener);
}
if (!target._events[type]) {
target._events[type] = [];
}
if (prepend) {
target._events[type].unshift(listener);
} else {
target._events[type].push(listener);
}
const maxListeners = _getMaxListeners(target);
if (maxListeners > 0 && target._events[type].length > maxListeners && !target._events[type].warned) {
target._events[type].warned = true;
const warning = new Error(`[unenv] Possible EventEmitter memory leak detected. ${target._events[type].length} ${type} listeners added. Use emitter.setMaxListeners() to increase limit`);
warning.name = "MaxListenersExceededWarning";
warning.emitter = target;
warning.type = type;
warning.count = target._events[type]?.length;
console.warn(warning);
}
return target;
}
function _removeListener(target, type, listener) {
_checkListener(listener);
if (!target._events[type] || target._events[type].length === 0) {
return target;
}
const lenBeforeFilter = target._events[type].length;
target._events[type] = target._events[type].filter(fn => fn !== listener);
if (lenBeforeFilter === target._events[type].length) {
return target;
}
if (target._events.removeListener) {
target.emit("removeListener", type, listener.listener || listener);
}
if (target._events[type].length === 0) {
delete target._events[type];
}
return target;
}
function _removeAllListeners(target, type) {
if (!target._events[type] || target._events[type].length === 0) {
return target;
}
if (target._events.removeListener) {
for (const _listener of target._events[type]) {
target.emit("removeListener", type, _listener.listener || _listener);
}
}
delete target._events[type];
return target;
}
function _wrapOnce(target, type, listener) {
let fired = false;
const wrapper = (...args) => {
if (fired) {
return;
}
target.removeListener(type, wrapper);
fired = true;
return args.length === 0 ? listener.call(target) : listener.apply(target, args);
};
wrapper.listener = listener;
return wrapper;
}
function _getMaxListeners(target) {
return target._maxListeners ?? EventEmitter.defaultMaxListeners;
}
function _listeners(target, type, unwrap) {
let listeners = target._events[type];
if (typeof listeners === "function") {
listeners = [listeners];
}
return unwrap ? listeners.map(l => l.listener || l) : listeners;
}
function _checkListener(listener) {
if (typeof listener !== "function") {
throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
}
}
function _addErrorHandlerIfEventEmitter(emitter, handler, flags) {
if (typeof emitter.on === "function") {
_eventTargetAgnosticAddListener(emitter, "error", handler, flags);
}
}
function _eventTargetAgnosticAddListener(emitter, name, listener, flags) {
if (typeof emitter.on === "function") {
if (flags.once) {
emitter.once(name, listener);
} else {
emitter.on(name, listener);
}
} else if (typeof emitter.addEventListener === "function") {
emitter.addEventListener(name, listener);
} else {
throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
}
}