events
Advanced tools
Comparing version 2.1.0 to 3.0.0
371
events.js
@@ -22,14 +22,36 @@ // Copyright Joyent, Inc. and other Node contributors. | ||
var objectCreate = Object.create || objectCreatePolyfill | ||
var objectKeys = Object.keys || objectKeysPolyfill | ||
var bind = Function.prototype.bind || functionBindPolyfill | ||
'use strict'; | ||
function EventEmitter() { | ||
if (!this._events || !Object.prototype.hasOwnProperty.call(this, '_events')) { | ||
this._events = objectCreate(null); | ||
this._eventsCount = 0; | ||
var R = typeof Reflect === 'object' ? Reflect : null | ||
var ReflectApply = R && typeof R.apply === 'function' | ||
? R.apply | ||
: function ReflectApply(target, receiver, args) { | ||
return Function.prototype.apply.call(target, receiver, args); | ||
} | ||
this._maxListeners = this._maxListeners || undefined; | ||
var ReflectOwnKeys | ||
if (R && typeof R.ownKeys === 'function') { | ||
ReflectOwnKeys = R.ownKeys | ||
} else if (Object.getOwnPropertySymbols) { | ||
ReflectOwnKeys = function ReflectOwnKeys(target) { | ||
return Object.getOwnPropertyNames(target) | ||
.concat(Object.getOwnPropertySymbols(target)); | ||
}; | ||
} else { | ||
ReflectOwnKeys = function ReflectOwnKeys(target) { | ||
return Object.getOwnPropertyNames(target); | ||
}; | ||
} | ||
function ProcessEmitWarning(warning) { | ||
if (console && console.warn) console.warn(warning); | ||
} | ||
var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { | ||
return value !== value; | ||
} | ||
function EventEmitter() { | ||
EventEmitter.init.call(this); | ||
} | ||
module.exports = EventEmitter; | ||
@@ -41,2 +63,3 @@ | ||
EventEmitter.prototype._events = undefined; | ||
EventEmitter.prototype._eventsCount = 0; | ||
EventEmitter.prototype._maxListeners = undefined; | ||
@@ -48,31 +71,32 @@ | ||
var hasDefineProperty; | ||
try { | ||
var o = {}; | ||
if (Object.defineProperty) Object.defineProperty(o, 'x', { value: 0 }); | ||
hasDefineProperty = o.x === 0; | ||
} catch (err) { hasDefineProperty = false } | ||
if (hasDefineProperty) { | ||
Object.defineProperty(EventEmitter, 'defaultMaxListeners', { | ||
enumerable: true, | ||
get: function() { | ||
return defaultMaxListeners; | ||
}, | ||
set: function(arg) { | ||
// check whether the input is a positive number (whose value is zero or | ||
// greater and not a NaN). | ||
if (typeof arg !== 'number' || arg < 0 || arg !== arg) | ||
throw new TypeError('"defaultMaxListeners" must be a positive number'); | ||
defaultMaxListeners = arg; | ||
Object.defineProperty(EventEmitter, 'defaultMaxListeners', { | ||
enumerable: true, | ||
get: function() { | ||
return defaultMaxListeners; | ||
}, | ||
set: function(arg) { | ||
if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { | ||
throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); | ||
} | ||
}); | ||
} else { | ||
EventEmitter.defaultMaxListeners = defaultMaxListeners; | ||
} | ||
defaultMaxListeners = arg; | ||
} | ||
}); | ||
EventEmitter.init = function() { | ||
if (this._events === undefined || | ||
this._events === Object.getPrototypeOf(this)._events) { | ||
this._events = Object.create(null); | ||
this._eventsCount = 0; | ||
} | ||
this._maxListeners = this._maxListeners || undefined; | ||
}; | ||
// Obviously not all Emitters should be limited to 10. This function allows | ||
// that to be increased. Set to zero for unlimited. | ||
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { | ||
if (typeof n !== 'number' || n < 0 || isNaN(n)) | ||
throw new TypeError('"n" argument must be a positive number'); | ||
if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { | ||
throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); | ||
} | ||
this._maxListeners = n; | ||
@@ -92,66 +116,10 @@ return this; | ||
// These standalone emit* functions are used to optimize calling of event | ||
// handlers for fast cases because emit() itself often has a variable number of | ||
// arguments and can be deoptimized because of that. These functions always have | ||
// the same number of arguments and thus do not get deoptimized, so the code | ||
// inside them can execute faster. | ||
function emitNone(handler, isFn, self) { | ||
if (isFn) | ||
handler.call(self); | ||
else { | ||
var len = handler.length; | ||
var listeners = arrayClone(handler, len); | ||
for (var i = 0; i < len; ++i) | ||
listeners[i].call(self); | ||
} | ||
} | ||
function emitOne(handler, isFn, self, arg1) { | ||
if (isFn) | ||
handler.call(self, arg1); | ||
else { | ||
var len = handler.length; | ||
var listeners = arrayClone(handler, len); | ||
for (var i = 0; i < len; ++i) | ||
listeners[i].call(self, arg1); | ||
} | ||
} | ||
function emitTwo(handler, isFn, self, arg1, arg2) { | ||
if (isFn) | ||
handler.call(self, arg1, arg2); | ||
else { | ||
var len = handler.length; | ||
var listeners = arrayClone(handler, len); | ||
for (var i = 0; i < len; ++i) | ||
listeners[i].call(self, arg1, arg2); | ||
} | ||
} | ||
function emitThree(handler, isFn, self, arg1, arg2, arg3) { | ||
if (isFn) | ||
handler.call(self, arg1, arg2, arg3); | ||
else { | ||
var len = handler.length; | ||
var listeners = arrayClone(handler, len); | ||
for (var i = 0; i < len; ++i) | ||
listeners[i].call(self, arg1, arg2, arg3); | ||
} | ||
} | ||
function emitMany(handler, isFn, self, args) { | ||
if (isFn) | ||
handler.apply(self, args); | ||
else { | ||
var len = handler.length; | ||
var listeners = arrayClone(handler, len); | ||
for (var i = 0; i < len; ++i) | ||
listeners[i].apply(self, args); | ||
} | ||
} | ||
EventEmitter.prototype.emit = function emit(type) { | ||
var er, handler, len, args, i, events; | ||
var args = []; | ||
for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); | ||
var doError = (type === 'error'); | ||
events = this._events; | ||
if (events) | ||
doError = (doError && events.error == null); | ||
var events = this._events; | ||
if (events !== undefined) | ||
doError = (doError && events.error === undefined); | ||
else if (!doError) | ||
@@ -162,42 +130,28 @@ return false; | ||
if (doError) { | ||
if (arguments.length > 1) | ||
er = arguments[1]; | ||
var er; | ||
if (args.length > 0) | ||
er = args[0]; | ||
if (er instanceof Error) { | ||
// Note: The comments on the `throw` lines are intentional, they show | ||
// up in Node's output if this results in an unhandled exception. | ||
throw er; // Unhandled 'error' event | ||
} else { | ||
// At least give some kind of context to the user | ||
var err = new Error('Unhandled "error" event. (' + er + ')'); | ||
err.context = er; | ||
throw err; | ||
} | ||
return false; | ||
// At least give some kind of context to the user | ||
var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); | ||
err.context = er; | ||
throw err; // Unhandled 'error' event | ||
} | ||
handler = events[type]; | ||
var handler = events[type]; | ||
if (!handler) | ||
if (handler === undefined) | ||
return false; | ||
var isFn = typeof handler === 'function'; | ||
len = arguments.length; | ||
switch (len) { | ||
// fast cases | ||
case 1: | ||
emitNone(handler, isFn, this); | ||
break; | ||
case 2: | ||
emitOne(handler, isFn, this, arguments[1]); | ||
break; | ||
case 3: | ||
emitTwo(handler, isFn, this, arguments[1], arguments[2]); | ||
break; | ||
case 4: | ||
emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); | ||
break; | ||
// slower | ||
default: | ||
args = new Array(len - 1); | ||
for (i = 1; i < len; i++) | ||
args[i - 1] = arguments[i]; | ||
emitMany(handler, isFn, this, args); | ||
if (typeof handler === 'function') { | ||
ReflectApply(handler, this, args); | ||
} else { | ||
var len = handler.length; | ||
var listeners = arrayClone(handler, len); | ||
for (var i = 0; i < len; ++i) | ||
ReflectApply(listeners[i], this, args); | ||
} | ||
@@ -213,8 +167,9 @@ | ||
if (typeof listener !== 'function') | ||
throw new TypeError('"listener" argument must be a function'); | ||
if (typeof listener !== 'function') { | ||
throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); | ||
} | ||
events = target._events; | ||
if (!events) { | ||
events = target._events = objectCreate(null); | ||
if (events === undefined) { | ||
events = target._events = Object.create(null); | ||
target._eventsCount = 0; | ||
@@ -224,5 +179,5 @@ } else { | ||
// adding it to the listeners, first emit "newListener". | ||
if (events.newListener) { | ||
if (events.newListener !== undefined) { | ||
target.emit('newListener', type, | ||
listener.listener ? listener.listener : listener); | ||
listener.listener ? listener.listener : listener); | ||
@@ -236,3 +191,3 @@ // Re-assign `events` because a newListener handler could have caused the | ||
if (!existing) { | ||
if (existing === undefined) { | ||
// Optimize the case of one listener. Don't need the extra array object. | ||
@@ -245,29 +200,25 @@ existing = events[type] = listener; | ||
existing = events[type] = | ||
prepend ? [listener, existing] : [existing, listener]; | ||
prepend ? [listener, existing] : [existing, listener]; | ||
// If we've already got an array, just append. | ||
} else if (prepend) { | ||
existing.unshift(listener); | ||
} else { | ||
// If we've already got an array, just append. | ||
if (prepend) { | ||
existing.unshift(listener); | ||
} else { | ||
existing.push(listener); | ||
} | ||
existing.push(listener); | ||
} | ||
// Check for listener leak | ||
if (!existing.warned) { | ||
m = $getMaxListeners(target); | ||
if (m && m > 0 && existing.length > m) { | ||
existing.warned = true; | ||
var w = new Error('Possible EventEmitter memory leak detected. ' + | ||
existing.length + ' "' + String(type) + '" listeners ' + | ||
'added. Use emitter.setMaxListeners() to ' + | ||
'increase limit.'); | ||
w.name = 'MaxListenersExceededWarning'; | ||
w.emitter = target; | ||
w.type = type; | ||
w.count = existing.length; | ||
if (typeof console === 'object' && console.warn) { | ||
console.warn('%s: %s', w.name, w.message); | ||
} | ||
} | ||
m = $getMaxListeners(target); | ||
if (m > 0 && existing.length > m && !existing.warned) { | ||
existing.warned = true; | ||
// No error code for this since it is a Warning | ||
// eslint-disable-next-line no-restricted-syntax | ||
var w = new Error('Possible EventEmitter memory leak detected. ' + | ||
existing.length + ' ' + String(type) + ' listeners ' + | ||
'added. Use emitter.setMaxListeners() to ' + | ||
'increase limit'); | ||
w.name = 'MaxListenersExceededWarning'; | ||
w.emitter = target; | ||
w.type = type; | ||
w.count = existing.length; | ||
ProcessEmitWarning(w); | ||
} | ||
@@ -291,21 +242,8 @@ } | ||
function onceWrapper() { | ||
var args = []; | ||
for (var i = 0; i < arguments.length; i++) args.push(arguments[i]); | ||
if (!this.fired) { | ||
this.target.removeListener(this.type, this.wrapFn); | ||
this.fired = true; | ||
switch (arguments.length) { | ||
case 0: | ||
return this.listener.call(this.target); | ||
case 1: | ||
return this.listener.call(this.target, arguments[0]); | ||
case 2: | ||
return this.listener.call(this.target, arguments[0], arguments[1]); | ||
case 3: | ||
return this.listener.call(this.target, arguments[0], arguments[1], | ||
arguments[2]); | ||
default: | ||
var args = new Array(arguments.length); | ||
for (var i = 0; i < args.length; ++i) | ||
args[i] = arguments[i]; | ||
this.listener.apply(this.target, args); | ||
} | ||
ReflectApply(this.listener, this.target, args); | ||
} | ||
@@ -316,3 +254,3 @@ } | ||
var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; | ||
var wrapped = bind.call(onceWrapper, state); | ||
var wrapped = onceWrapper.bind(state); | ||
wrapped.listener = listener; | ||
@@ -324,4 +262,5 @@ state.wrapFn = wrapped; | ||
EventEmitter.prototype.once = function once(type, listener) { | ||
if (typeof listener !== 'function') | ||
throw new TypeError('"listener" argument must be a function'); | ||
if (typeof listener !== 'function') { | ||
throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); | ||
} | ||
this.on(type, _onceWrap(this, type, listener)); | ||
@@ -333,4 +272,5 @@ return this; | ||
function prependOnceListener(type, listener) { | ||
if (typeof listener !== 'function') | ||
throw new TypeError('"listener" argument must be a function'); | ||
if (typeof listener !== 'function') { | ||
throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); | ||
} | ||
this.prependListener(type, _onceWrap(this, type, listener)); | ||
@@ -345,11 +285,12 @@ return this; | ||
if (typeof listener !== 'function') | ||
throw new TypeError('"listener" argument must be a function'); | ||
if (typeof listener !== 'function') { | ||
throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); | ||
} | ||
events = this._events; | ||
if (!events) | ||
if (events === undefined) | ||
return this; | ||
list = events[type]; | ||
if (!list) | ||
if (list === undefined) | ||
return this; | ||
@@ -359,3 +300,3 @@ | ||
if (--this._eventsCount === 0) | ||
this._events = objectCreate(null); | ||
this._events = Object.create(null); | ||
else { | ||
@@ -382,4 +323,5 @@ delete events[type]; | ||
list.shift(); | ||
else | ||
else { | ||
spliceOne(list, position); | ||
} | ||
@@ -389,3 +331,3 @@ if (list.length === 1) | ||
if (events.removeListener) | ||
if (events.removeListener !== undefined) | ||
this.emit('removeListener', type, originalListener || listener); | ||
@@ -397,2 +339,4 @@ } | ||
EventEmitter.prototype.off = EventEmitter.prototype.removeListener; | ||
EventEmitter.prototype.removeAllListeners = | ||
@@ -403,13 +347,13 @@ function removeAllListeners(type) { | ||
events = this._events; | ||
if (!events) | ||
if (events === undefined) | ||
return this; | ||
// not listening for removeListener, no need to emit | ||
if (!events.removeListener) { | ||
if (events.removeListener === undefined) { | ||
if (arguments.length === 0) { | ||
this._events = objectCreate(null); | ||
this._events = Object.create(null); | ||
this._eventsCount = 0; | ||
} else if (events[type]) { | ||
} else if (events[type] !== undefined) { | ||
if (--this._eventsCount === 0) | ||
this._events = objectCreate(null); | ||
this._events = Object.create(null); | ||
else | ||
@@ -423,3 +367,3 @@ delete events[type]; | ||
if (arguments.length === 0) { | ||
var keys = objectKeys(events); | ||
var keys = Object.keys(events); | ||
var key; | ||
@@ -432,3 +376,3 @@ for (i = 0; i < keys.length; ++i) { | ||
this.removeAllListeners('removeListener'); | ||
this._events = objectCreate(null); | ||
this._events = Object.create(null); | ||
this._eventsCount = 0; | ||
@@ -442,3 +386,3 @@ return this; | ||
this.removeListener(type, listeners); | ||
} else if (listeners) { | ||
} else if (listeners !== undefined) { | ||
// LIFO order | ||
@@ -456,7 +400,7 @@ for (i = listeners.length - 1; i >= 0; i--) { | ||
if (!events) | ||
if (events === undefined) | ||
return []; | ||
var evlistener = events[type]; | ||
if (!evlistener) | ||
if (evlistener === undefined) | ||
return []; | ||
@@ -467,3 +411,4 @@ | ||
return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); | ||
return unwrap ? | ||
unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); | ||
} | ||
@@ -491,3 +436,3 @@ | ||
if (events) { | ||
if (events !== undefined) { | ||
var evlistener = events[type]; | ||
@@ -497,3 +442,3 @@ | ||
return 1; | ||
} else if (evlistener) { | ||
} else if (evlistener !== undefined) { | ||
return evlistener.length; | ||
@@ -507,12 +452,5 @@ } | ||
EventEmitter.prototype.eventNames = function eventNames() { | ||
return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; | ||
return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; | ||
}; | ||
// About 1.5x faster than the two-arg version of Array#splice(). | ||
function spliceOne(list, index) { | ||
for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) | ||
list[i] = list[k]; | ||
list.pop(); | ||
} | ||
function arrayClone(arr, n) { | ||
@@ -525,2 +463,8 @@ var copy = new Array(n); | ||
function spliceOne(list, index) { | ||
for (; index + 1 < list.length; index++) | ||
list[index] = list[index + 1]; | ||
list.pop(); | ||
} | ||
function unwrapListeners(arr) { | ||
@@ -533,20 +477,1 @@ var ret = new Array(arr.length); | ||
} | ||
function objectCreatePolyfill(proto) { | ||
var F = function() {}; | ||
F.prototype = proto; | ||
return new F; | ||
} | ||
function objectKeysPolyfill(obj) { | ||
var keys = []; | ||
for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k)) { | ||
keys.push(k); | ||
} | ||
return k; | ||
} | ||
function functionBindPolyfill(context) { | ||
var fn = this; | ||
return function () { | ||
return fn.apply(context, arguments); | ||
}; | ||
} |
@@ -0,1 +1,13 @@ | ||
# 3.0.0 (2018-05-25) | ||
**This version drops support for IE8.** `events` no longer includes polyfills | ||
for ES5 features. If you need to support older environments, use an ES5 shim | ||
like [es5-shim](https://npmjs.com/package/es5-shim). Both the shim and sham | ||
versions of es5-shim are necessary. | ||
- Update to events code from Node.js 10.x | ||
- (semver major) Adds `off()` method | ||
- Port more tests from Node.js | ||
- Switch browser tests to airtap, making things more reliable | ||
# 2.1.0 (2018-05-25) | ||
@@ -2,0 +14,0 @@ |
{ | ||
"name": "events", | ||
"id": "events", | ||
"version": "2.1.0", | ||
"version": "3.0.0", | ||
"description": "Node's event emitter for all engines.", | ||
@@ -23,15 +23,14 @@ "keywords": [ | ||
"engines": { | ||
"node": ">=0.4.x" | ||
"node": ">=0.8.x" | ||
}, | ||
"devDependencies": { | ||
"airtap": "0.0.6", | ||
"isarray": "^2.0.2", | ||
"mocha": "^3.5.3", | ||
"object-keys": "^1.0.11", | ||
"zuul": "^3.11.1" | ||
"tape": "^4.8.0" | ||
}, | ||
"scripts": { | ||
"test": "mocha --ui qunit -- tests/index.js", | ||
"test:browsers": "zuul -- tests/index.js" | ||
"test": "node tests/index.js", | ||
"test:browsers": "airtap -- tests/index.js" | ||
}, | ||
"license": "MIT" | ||
} |
@@ -1,9 +0,19 @@ | ||
# Status: [Maintainer Needed](https://github.com/Gozala/events/issues/43) | ||
# events [![Build Status](https://travis-ci.org/Gozala/events.png?branch=master)](https://travis-ci.org/Gozala/events) | ||
Node's event emitter for all engines. | ||
> Node's event emitter for all engines. | ||
## Install ## | ||
This implements the Node.js [`events`](http://nodejs.org/api/events.html) module for environments that do not have it, like browsers. | ||
> `events` currently matches the **Node.js 10.1** API. | ||
Note that the `events` module uses ES5 features. If you need to support very old browsers like IE8, use a shim like [`es5-shim`](https://www.npmjs.com/package/es5-shim). You need both the shim and the sham versions of `es5-shim`. | ||
This module is maintained, but only by very few people. If you'd like to help, let us know in the [Maintainer Needed](https://github.com/Gozala/events/issues/43) issue! | ||
## Install | ||
You usually do not have to install `events` yourself! If your code runs in Node.js, `events` is built in. If your code runs in the browser, bundlers like [browserify](https://github.com/browserify/browserify) or [webpack](https://github.com/webpack/webpack) also include the `events` module. | ||
But if none of those apply, with npm do: | ||
``` | ||
@@ -13,10 +23,27 @@ npm install events | ||
## Require ## | ||
## Usage | ||
```javascript | ||
var EventEmitter = require('events') | ||
var ee = new EventEmitter() | ||
ee.on('message', function (text) { | ||
console.log(text) | ||
}) | ||
ee.emit('message', 'hello world') | ||
``` | ||
## Usage ## | ||
## API | ||
See the [node.js event emitter docs](http://nodejs.org/api/events.html) | ||
See the [Node.js EventEmitter docs](http://nodejs.org/api/events.html). `events` currently matches the Node.js 10.1 API. | ||
## Contributing | ||
PRs are very welcome! The main way to contribute to `events` is by porting features, bugfixes and tests from Node.js. Ideally, code contributions to this module are copy-pasted from Node.js and transpiled to ES5, rather than reimplemented from scratch. Matching the Node.js code as closely as possible makes maintenance simpler when new changes land in Node.js. | ||
This module intends to provide exactly the same API as Node.js, so features that are not available in the core `events` module will not be accepted. Feature requests should instead be directed at [nodejs/node](https://github.com/nodejs/node) and will be added to this module once they are implemented in Node.js. | ||
If there is a difference in behaviour between Node.js's `events` module and this module, please open an issue! | ||
## License | ||
[MIT](./LICENSE) |
@@ -111,2 +111,2 @@ // Copyright Joyent, Inc. and other Node contributors. | ||
ee.on('foo', null); | ||
}, /^TypeError: "listener" argument must be a function$/); | ||
}, /^TypeError: The "listener" argument must be of type Function. Received type object$/); |
@@ -26,2 +26,10 @@ // Copyright Joyent, Inc. and other Node contributors. | ||
// Redirect warning output to tape. | ||
var consoleWarn = console.warn; | ||
console.warn = common.test.comment; | ||
common.test.on('end', function () { | ||
console.warn = consoleWarn; | ||
}); | ||
// default | ||
@@ -28,0 +36,0 @@ { |
@@ -22,2 +22,3 @@ // Copyright Joyent, Inc. and other Node contributors. | ||
var test = require('tape'); | ||
var assert = require('assert'); | ||
@@ -81,3 +82,3 @@ | ||
// add the exit listener only once to avoid listener leak warnings | ||
if (mustCallChecks.length === 0) after(function() { runCallChecks(0); }); | ||
if (mustCallChecks.length === 0) test.onFinish(function() { runCallChecks(0); }); | ||
@@ -84,0 +85,0 @@ mustCallChecks.push(context); |
@@ -0,3 +1,5 @@ | ||
var test = require('tape'); | ||
require('./legacy-compat'); | ||
var common = require('./common'); | ||
@@ -8,4 +10,9 @@ // we do this to easily wrap each file in a mocha test | ||
var require = function(file) { | ||
test(file, function() { | ||
orig_require(file); | ||
test(file, function(t) { | ||
// Store the tape object so tests can access it. | ||
t.on('end', function () { delete common.test; }); | ||
common.test = t; | ||
try { orig_require(file); } catch (err) { t.fail(err); } | ||
t.end(); | ||
}); | ||
@@ -16,2 +23,4 @@ }; | ||
require('./check-listener-leaks.js'); | ||
require('./errors.js'); | ||
require('./events-list.js'); | ||
require('./listener-count.js'); | ||
@@ -21,8 +30,22 @@ require('./listeners-side-effects.js'); | ||
require('./max-listeners.js'); | ||
if ((function A () {}).name === 'A') { | ||
require('./method-names.js'); | ||
} else { | ||
// Function.name is not supported in IE | ||
test('./method-names.js', { skip: true }, function () {}); | ||
} | ||
require('./modify-in-emit.js'); | ||
require('./num-args.js'); | ||
require('./once.js'); | ||
require('./prepend.js'); | ||
require('./set-max-listeners-side-effects.js'); | ||
require('./special-event-names.js'); | ||
require('./subclass.js'); | ||
if (typeof Symbol === 'function') { | ||
require('./symbols.js'); | ||
} else { | ||
// Symbol is not available. | ||
test('./symbols.js', { skip: true }, function () {}); | ||
} | ||
require('./remove-all-listeners.js'); | ||
require('./remove-listeners.js'); |
@@ -26,3 +26,2 @@ // Copyright Joyent, Inc. and other Node contributors. | ||
var EventEmitter = require('../').EventEmitter; | ||
var objectKeys = require('object-keys'); | ||
@@ -36,3 +35,3 @@ var e = new EventEmitter(); | ||
if (Object.create) assert.ok(!(e._events instanceof Object)); | ||
assert.strictEqual(objectKeys(e._events).length, 0); | ||
assert.strictEqual(Object.keys(e._events).length, 0); | ||
@@ -39,0 +38,0 @@ e.on('foo', assert.fail); |
@@ -36,4 +36,4 @@ // Copyright Joyent, Inc. and other Node contributors. | ||
var throwsObjs = [NaN, -1, 'and even this']; | ||
var maxError = /^TypeError: "n" argument must be a positive number$/; | ||
var defError = /^TypeError: "defaultMaxListeners" must be a positive number$/; | ||
var maxError = /^RangeError: The value of "n" is out of range\. It must be a non-negative number\./; | ||
var defError = /^RangeError: The value of "defaultMaxListeners" is out of range\. It must be a non-negative number\./; | ||
@@ -40,0 +40,0 @@ for (var i = 0; i < throwsObjs.length; i++) { |
@@ -26,9 +26,2 @@ // Copyright Joyent, Inc. and other Node contributors. | ||
var after_checks = []; | ||
after(function() { | ||
for (var i = 0 ; i < after_checks.length ; ++i) { | ||
after_checks[i](); | ||
} | ||
}); | ||
var e = new events.EventEmitter(); | ||
@@ -59,13 +52,11 @@ var num_args_emitted = []; | ||
after_checks.push(function() { | ||
assert.ok(Array.isArray(num_args_emitted)); | ||
assert.strictEqual(num_args_emitted.length, 8); | ||
assert.strictEqual(num_args_emitted[0], 0); | ||
assert.strictEqual(num_args_emitted[1], 1); | ||
assert.strictEqual(num_args_emitted[2], 2); | ||
assert.strictEqual(num_args_emitted[3], 3); | ||
assert.strictEqual(num_args_emitted[4], 4); | ||
assert.strictEqual(num_args_emitted[5], 5); | ||
assert.strictEqual(num_args_emitted[6], 4); | ||
assert.strictEqual(num_args_emitted[6], 4); | ||
}); | ||
assert.ok(Array.isArray(num_args_emitted)); | ||
assert.strictEqual(num_args_emitted.length, 8); | ||
assert.strictEqual(num_args_emitted[0], 0); | ||
assert.strictEqual(num_args_emitted[1], 1); | ||
assert.strictEqual(num_args_emitted[2], 2); | ||
assert.strictEqual(num_args_emitted[3], 3); | ||
assert.strictEqual(num_args_emitted[4], 4); | ||
assert.strictEqual(num_args_emitted[5], 5); | ||
assert.strictEqual(num_args_emitted[6], 4); | ||
assert.strictEqual(num_args_emitted[6], 4); |
@@ -56,3 +56,3 @@ // Copyright Joyent, Inc. and other Node contributors. | ||
ee.once('foo', null); | ||
}, /^TypeError: "listener" argument must be a function$/); | ||
}, /^TypeError: The "listener" argument must be of type Function. Received type object$/); | ||
@@ -59,0 +59,0 @@ { |
@@ -25,13 +25,7 @@ // Copyright Joyent, Inc. and other Node contributors. | ||
var events = require('../'); | ||
var test = require('tape'); | ||
var after_checks = []; | ||
after(function() { | ||
for (var i = 0 ; i < after_checks.length ; ++i) { | ||
after_checks[i](); | ||
} | ||
}); | ||
function expect(expected) { | ||
var actual = []; | ||
after_checks.push(function() { | ||
test.onFinish(function() { | ||
var sortedActual = actual.sort(); | ||
@@ -38,0 +32,0 @@ var sortedExpected = expected.sort(); |
@@ -179,3 +179,3 @@ // Copyright Joyent, Inc. and other Node contributors. | ||
ee.removeListener('foo', null); | ||
}, /^TypeError: "listener" argument must be a function$/); | ||
}, /^TypeError: The "listener" argument must be of type Function\. Received type object$/); | ||
@@ -182,0 +182,0 @@ { |
@@ -25,3 +25,2 @@ // Copyright Joyent, Inc. and other Node contributors. | ||
var events = require('../'); | ||
var objectKeys = require('object-keys'); | ||
@@ -31,4 +30,4 @@ var e = new events.EventEmitter(); | ||
if (Object.create) assert.ok(!(e._events instanceof Object)); | ||
assert.strictEqual(objectKeys(e._events).length, 0); | ||
assert.strictEqual(Object.keys(e._events).length, 0); | ||
e.setMaxListeners(5); | ||
assert.strictEqual(objectKeys(e._events).length, 0); | ||
assert.strictEqual(Object.keys(e._events).length, 0); |
@@ -23,14 +23,7 @@ // Copyright Joyent, Inc. and other Node contributors. | ||
var common = require('./common'); | ||
var test = require('tape'); | ||
var assert = require('assert'); | ||
var EventEmitter = require('../').EventEmitter; | ||
var util = require('util'); | ||
var objectKeys = require('object-keys'); | ||
var after_checks = []; | ||
after(function() { | ||
for (var i = 0 ; i < after_checks.length ; ++i) { | ||
after_checks[i](); | ||
} | ||
}); | ||
util.inherits(MyEE, EventEmitter); | ||
@@ -57,5 +50,5 @@ | ||
after_checks.push(function() { | ||
if (Object.create) assert.ok(!(myee._events instanceof Object)); | ||
assert.strictEqual(objectKeys(myee._events).length, 0); | ||
test.onFinish(function() { | ||
assert.ok(!(myee._events instanceof Object)); | ||
assert.strictEqual(Object.keys(myee._events).length, 0); | ||
}); | ||
@@ -62,0 +55,0 @@ |
Sorry, the diff of this file is not supported yet
71954
3
29
1676
49