UNPKG

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
"use strict"; 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); } }