Comparing version 1.1.2 to 1.2.0
214
handoff.js
@@ -1,159 +0,149 @@ | ||
'use strict'; | ||
'use strict' | ||
let onHold = false | ||
let holdQueue = [] | ||
let interests = {} | ||
let pending = [] | ||
let handoff, | ||
onHold = false, | ||
holdQueue = [], | ||
interests = {}, | ||
pending = []; | ||
class Notification { | ||
constructor (name, args) { | ||
this.name = name | ||
this.args = args | ||
this.status = 0 | ||
this.pointer = 0 | ||
return this | ||
} | ||
constructor (name, args) { | ||
this.name = name; | ||
this.args = args; | ||
this.status = 0; | ||
this.pointer = 0; | ||
return this; | ||
} | ||
cancel () { | ||
this.status = 0; | ||
this.pointer = 0; | ||
cancelNotification(this); | ||
} | ||
cancel () { | ||
this.status = 0 | ||
this.pointer = 0 | ||
cancelNotification(this) | ||
} | ||
} | ||
function notifyObjects (n) { | ||
let name, subs | ||
let name, | ||
subs; | ||
let next = function () { | ||
if (n.status === 1 && n.pointer < subs.length) { | ||
return new Promise((resolve, reject) => { | ||
try { | ||
resolve(subs[n.pointer++].apply(null, [].concat(n, n.args))); | ||
} | ||
catch (err) { | ||
reject(err); | ||
} | ||
}).then(response => { | ||
n.response = response; | ||
return next(); | ||
}); | ||
let next = function () { | ||
if (n.status === 1 && n.pointer < subs.length) { | ||
return new Promise((resolve, reject) => { | ||
try { | ||
resolve(subs[n.pointer++].apply(null, [].concat(n, n.args))) | ||
} catch (err) { | ||
reject(err) | ||
} | ||
}).then(response => { | ||
n.response = response | ||
return next() | ||
}) | ||
} else { | ||
subs = null | ||
else { | ||
if (n.status === 1 || n.response != null) { | ||
let response = n.response | ||
n.cancel() | ||
return Promise.resolve(response) | ||
} | ||
subs = null; | ||
let err = new Error('Notification (' + n.name + ') was cancelled.') | ||
err.code = 'ECANCELED' | ||
n.cancel() | ||
if (n.status === 1 || n.response != null) { | ||
let response = n.response; | ||
n.cancel(); | ||
return Promise.resolve(response); | ||
} | ||
return Promise.reject(err) | ||
} | ||
} | ||
let err = new Error('Notification (' + n.name + ') was cancelled.'); | ||
err.code = 'ECANCELED'; | ||
n.cancel(); | ||
name = n.name | ||
return Promise.reject(err); | ||
} | ||
}; | ||
if (interests[name] && interests[name].length) { | ||
subs = interests[name].slice(0) | ||
return next() | ||
} | ||
name = n.name; | ||
let err = new Error(n.name + ' was published but has no subscribers.') | ||
err.code = 'ENOSYS' | ||
if (interests[name] && interests[name].length) { | ||
subs = interests[name].slice(0); | ||
return next(); | ||
} | ||
let err = new Error(n.name + ' was published but has no subscribers.'); | ||
err.code = 'ENOSYS'; | ||
return Promise.reject(err); | ||
return Promise.reject(err) | ||
} | ||
function publishNotification (notification) { | ||
if (onHold) { | ||
return new Promise((resolve, reject) => { | ||
holdQueue.push({resolve, reject, notification}); | ||
}); | ||
} | ||
notification.status = 1; | ||
notification.pointer = 0; | ||
pending.push(notification); | ||
return notifyObjects(notification); | ||
if (onHold) { | ||
return new Promise((resolve, reject) => { | ||
holdQueue.push({ resolve, reject, notification }) | ||
}) | ||
} | ||
notification.status = 1 | ||
notification.pointer = 0 | ||
pending.push(notification) | ||
return notifyObjects(notification) | ||
} | ||
function cancelNotification (notification) { | ||
let idx = pending.indexOf(notification); | ||
if (!~idx) {return;} | ||
pending.splice(idx, 1); | ||
let idx = pending.indexOf(notification) | ||
if (!~idx) { | ||
return | ||
} | ||
pending.splice(idx, 1) | ||
} | ||
function publish () { | ||
let args = Array.prototype.slice.call(arguments) | ||
let name = args[0] | ||
let args = Array.prototype.slice.call(arguments), | ||
name = args[0]; | ||
args = args.slice(1, args.length) | ||
args = args.slice(1, args.length); | ||
let notification = new Notification(name, args); | ||
return publishNotification(notification); | ||
let notification = new Notification(name, args) | ||
return publishNotification(notification) | ||
} | ||
function subscribe (name, fn, priority) { | ||
priority = isNaN(priority) ? -1 : priority | ||
interests[name] = interests[name] || [] | ||
priority = isNaN(priority) ? -1 : priority; | ||
interests[name] = interests[name] || []; | ||
if (priority <= -1 || priority >= interests[name].length) { | ||
interests[name].push(fn) | ||
} else { | ||
interests[name].splice(priority, priority, fn) | ||
} | ||
if (priority <= -1 || priority >= interests[name].length) { | ||
interests[name].push(fn); | ||
} | ||
else { | ||
interests[name].splice(priority, priority, fn); | ||
} | ||
return fn; | ||
return fn | ||
} | ||
function unsubscribe (name, fn) { | ||
if (!fn) { | ||
interests[name] = [] | ||
return | ||
} | ||
let fnIndex = interests[name].indexOf(fn); | ||
if (fnIndex > -1) { | ||
interests[name].splice(fnIndex, 1); | ||
} | ||
let fnIndex = interests[name].indexOf(fn) | ||
if (fnIndex > -1) { | ||
interests[name].splice(fnIndex, 1) | ||
} | ||
} | ||
function __reset () { | ||
interests = {}; | ||
pending.forEach(cancelNotification); | ||
pending = []; | ||
interests = {} | ||
pending.forEach(cancelNotification) | ||
pending = [] | ||
} | ||
function hold () { | ||
onHold = true; | ||
onHold = true | ||
} | ||
function resume () { | ||
onHold = false; | ||
holdQueue.forEach(item => { | ||
item.resolve(publishNotification(item.notification)); | ||
}); | ||
holdQueue = []; | ||
onHold = false | ||
holdQueue.forEach(item => { | ||
item.resolve(publishNotification(item.notification)) | ||
}) | ||
holdQueue = [] | ||
} | ||
module.exports = handoff = { | ||
publish, | ||
subscribe, | ||
unsubscribe, | ||
hold, | ||
resume, | ||
__reset, | ||
}; | ||
module.exports = { | ||
publish, | ||
subscribe, | ||
unsubscribe, | ||
hold, | ||
resume, | ||
__reset | ||
} |
{ | ||
"name": "handoff", | ||
"version": "1.1.2", | ||
"version": "1.2.0", | ||
"description": "PubSub with Promises", | ||
"main": "handoff.js", | ||
"scripts": { | ||
"test": "node tests/run.js" | ||
"test": "node ./node_modules/standard/bin/cmd | node ./node_modules/snazzy/bin/cmd && node tests/run.js" | ||
}, | ||
@@ -30,3 +30,7 @@ "keywords": [ | ||
"mocha": "^2.3.4" | ||
}, | ||
"dependencies": { | ||
"snazzy": "^7.0.0", | ||
"standard": "^10.0.2" | ||
} | ||
} |
@@ -62,8 +62,12 @@ # handoff.js | ||
### handoff.ignoreErrors | ||
### Rejections | ||
By default, handoff will throw an `Error` if you `publish()` something that nobody is subscribed to. | ||
This is to help alleviate some of the issues that PubSub and loose coupling introduce. You can disable this behavior by doing `handoff.ignoreErrors = true` | ||
Handoff will reject a promise in two instances : | ||
- A subscriber cancelled the Notification. In these cases the Error object | ||
passed to the rejection handler will have a `code` property with a value of `ECANCELED`. | ||
- There are no subscribers for a notification. In these cases the Error object | ||
passed to the rejection handler will have a `code` property with a value of `ENOSYS`. | ||
#### License | ||
@@ -70,0 +74,0 @@ |
@@ -1,13 +0,14 @@ | ||
var mocha = require('mocha'); | ||
global.expect = require('chai').expect | ||
global.expect = require('chai').expect; | ||
const path = require('path') | ||
const Mocha = require('mocha') | ||
mocha = new mocha({ | ||
ui : 'bdd', | ||
reporter : 'spec' | ||
}); | ||
const mocha = new Mocha({ | ||
ui: 'bdd', | ||
reporter: 'spec' | ||
}) | ||
mocha.checkLeaks(); | ||
mocha.checkLeaks() | ||
mocha.addFile(__dirname + '/tests.js'); | ||
mocha.run(); | ||
mocha.addFile(path.join(__dirname, 'tests.js')) | ||
mocha.run() |
@@ -1,142 +0,133 @@ | ||
var handoff = require('../handoff'); | ||
const handoff = require('../handoff') | ||
const ignore = () => {} | ||
/* global expect, describe, it, afterEach */ | ||
describe('pub/sub', () => { | ||
afterEach(() => { | ||
handoff.__reset() | ||
}) | ||
afterEach(() => { | ||
handoff.__reset(); | ||
}); | ||
it('should publish/subscribe and unsubscribe to a notification successfully', done => { | ||
let a = 0 | ||
let subscriber1 | ||
it('should publish/subscribe and unsubscribe to a notification successfully', done => { | ||
subscriber1 = handoff.subscribe('sub-test', () => { | ||
a++ | ||
}) | ||
var a = 0, | ||
subscriber1; | ||
handoff.publish('sub-test') | ||
handoff.unsubscribe('sub-test', subscriber1) | ||
subscriber1 = handoff.subscribe('sub-test', () => { | ||
a ++; | ||
}); | ||
handoff.publish('sub-test').catch(ignore) | ||
handoff.publish('sub-test'); | ||
handoff.unsubscribe('sub-test', subscriber1); | ||
expect(a).to.equal(1) | ||
done() | ||
}) | ||
try { | ||
handoff.publish('sub-test'); | ||
} catch (err) {} | ||
it('should reject if nobody is listening', done => { | ||
handoff.publish('sub-test').catch(err => { | ||
ignore(err) | ||
done() | ||
}) | ||
}) | ||
expect(a).to.equal(1); | ||
it('should hold and resume notifications', function () { | ||
let timerRan = false | ||
done(); | ||
}); | ||
handoff.subscribe('sub-test', function () { | ||
return 'hello!' | ||
}) | ||
it('should reject if nobody is listening', done => { | ||
handoff.publish('sub-test').catch(err => { | ||
done(); | ||
}); | ||
}); | ||
handoff.hold() | ||
setTimeout(function () { | ||
timerRan = true | ||
handoff.resume() | ||
}, 0) | ||
it('should hold and resume notifications', function () { | ||
var timerRan = false; | ||
return handoff.publish('sub-test').then(() => { | ||
expect(timerRan).to.equal(true) | ||
}) | ||
}) | ||
handoff.subscribe('sub-test', function () { | ||
return 'hello!'; | ||
}); | ||
it('should publish a notification with data', done => { | ||
handoff.subscribe('pub-data-test', function (n, data) { | ||
expect(data).to.eql({ | ||
x: 1, | ||
y: 2 | ||
}) | ||
handoff.hold(); | ||
setTimeout(function () { | ||
timerRan = true; | ||
handoff.resume(); | ||
}, 0); | ||
done() | ||
}) | ||
return handoff.publish('sub-test').then(() => { | ||
expect(timerRan).to.equal(true); | ||
}); | ||
}); | ||
handoff.publish('pub-data-test', { | ||
x: 1, | ||
y: 2 | ||
}) | ||
}) | ||
it('should publish a notification with multiple arguments', done => { | ||
handoff.subscribe('pub-args-test', function (n, arg1, arg2, arg3) { | ||
expect(arg1).to.equal(1) | ||
expect(arg2).to.equal(2) | ||
expect(arg3).to.equal('z') | ||
done() | ||
}) | ||
it('should publish a notification with data', done => { | ||
handoff.publish('pub-args-test', 1, 2, 'z') | ||
}) | ||
handoff.subscribe('pub-data-test', function (n, data) { | ||
expect(data).to.eql({ | ||
x : 1, | ||
y : 2 | ||
}); | ||
describe('notifications', () => { | ||
it('should support subscribers that return promises', done => { | ||
let didHold = false | ||
done(); | ||
}); | ||
handoff.subscribe('hold-test-2', function (n) { | ||
return new Promise(function (resolve, reject) { | ||
setTimeout(() => { | ||
didHold = true | ||
resolve() | ||
}, 10) | ||
}) | ||
}) | ||
handoff.publish('pub-data-test', { | ||
x : 1, | ||
y : 2 | ||
}); | ||
}); | ||
handoff.subscribe('hold-test-2', function (n) { | ||
if (didHold) { | ||
done() | ||
} | ||
}) | ||
it('should publish a notification with multiple arguments', done => { | ||
handoff.publish('hold-test-2') | ||
}) | ||
handoff.subscribe('pub-args-test', function (n, arg1, arg2, arg3) { | ||
expect(arg1).to.equal(1); | ||
expect(arg2).to.equal(2); | ||
expect(arg3).to.equal('z'); | ||
done(); | ||
}); | ||
it('should support subscribers that return values', done => { | ||
handoff.subscribe('respond-test-2', function (n) { | ||
expect(n).to.be.an('object') | ||
return {x: 1, y: 2} | ||
}) | ||
handoff.publish('pub-args-test', 1, 2, 'z'); | ||
}); | ||
handoff.publish('respond-test-2', {}).then(function (obj) { | ||
expect(obj).to.eql({ | ||
x: 1, | ||
y: 2 | ||
}) | ||
describe('notifications', () => { | ||
done() | ||
}) | ||
}) | ||
it('should support subscribers that return promises', done => { | ||
it('should be able to cancel notifications', function () { | ||
handoff.subscribe('cancel-test-2', function (n) { | ||
n.cancel() | ||
return 'cancelled' | ||
}) | ||
var didHold = false; | ||
handoff.subscribe('cancel-test-2', function (n) { | ||
return 'not cancelled' | ||
}) | ||
handoff.subscribe('hold-test-2', function (n) { | ||
return new Promise(function (resolve, reject) { | ||
setTimeout(() => { | ||
didHold = true; | ||
resolve(); | ||
}, 10); | ||
}); | ||
}); | ||
handoff.subscribe('hold-test-2', function (n) { | ||
if (didHold) { | ||
done(); | ||
} | ||
}); | ||
handoff.publish('hold-test-2'); | ||
}); | ||
it('should support subscribers that return values', done => { | ||
handoff.subscribe('respond-test-2', function (n) { | ||
expect(n).to.be.an('object'); | ||
return {x : 1, y : 2}; | ||
}); | ||
handoff.publish('respond-test-2', {}).then(function (obj) { | ||
expect(obj).to.eql({ | ||
x : 1, | ||
y : 2 | ||
}); | ||
done(); | ||
}); | ||
}); | ||
it('should be able to cancel notifications', function () { | ||
handoff.subscribe('cancel-test-2', function (n) { | ||
n.cancel(); | ||
return 'cancelled'; | ||
}); | ||
handoff.subscribe('cancel-test-2', function (n) { | ||
return 'not cancelled'; | ||
}); | ||
return handoff.publish('cancel-test-2').then(response => { | ||
expect(response).to.equal('cancelled'); | ||
}); | ||
}); | ||
}); | ||
}); | ||
return handoff.publish('cancel-test-2').then(response => { | ||
expect(response).to.equal('cancelled') | ||
}) | ||
}) | ||
}) | ||
}) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
239
113
11335
2
5
1
+ Addedsnazzy@^7.0.0
+ Addedstandard@^10.0.2
+ Addedacorn@3.3.05.7.4(transitive)
+ Addedacorn-jsx@3.0.1(transitive)
+ Addedajv@4.11.8(transitive)
+ Addedajv-keywords@1.5.1(transitive)
+ Addedansi-escapes@1.4.0(transitive)
+ Addedansi-regex@2.1.13.0.1(transitive)
+ Addedansi-styles@2.2.13.2.1(transitive)
+ Addedargparse@1.0.10(transitive)
+ Addedarray-buffer-byte-length@1.0.1(transitive)
+ Addedarray.prototype.find@2.2.3(transitive)
+ Addedarraybuffer.prototype.slice@1.0.3(transitive)
+ Addedavailable-typed-arrays@1.0.7(transitive)
+ Addedbabel-code-frame@6.26.0(transitive)
+ Addedbalanced-match@1.0.2(transitive)
+ Addedbrace-expansion@1.1.11(transitive)
+ Addedbuffer-from@1.1.2(transitive)
+ Addedbuiltin-modules@1.1.1(transitive)
+ Addedcall-bind@1.0.7(transitive)
+ Addedcaller-path@0.1.0(transitive)
+ Addedcallsites@0.2.0(transitive)
+ Addedchalk@1.1.32.4.2(transitive)
+ Addedcircular-json@0.3.3(transitive)
+ Addedcli-cursor@1.0.2(transitive)
+ Addedcli-width@2.2.1(transitive)
+ Addedco@4.6.0(transitive)
+ Addedcode-point-at@1.1.0(transitive)
+ Addedcolor-convert@1.9.3(transitive)
+ Addedcolor-name@1.1.3(transitive)
+ Addedconcat-map@0.0.1(transitive)
+ Addedconcat-stream@1.6.22.0.0(transitive)
+ Addedcontains-path@0.1.0(transitive)
+ Addedcore-util-is@1.0.3(transitive)
+ Addedd@1.0.2(transitive)
+ Addeddata-view-buffer@1.0.1(transitive)
+ Addeddata-view-byte-length@1.0.1(transitive)
+ Addeddata-view-byte-offset@1.0.0(transitive)
+ Addeddebug@2.6.93.2.7(transitive)
+ Addeddebug-log@1.0.1(transitive)
+ Addeddeep-is@0.1.4(transitive)
+ Addeddefine-data-property@1.1.4(transitive)
+ Addeddefine-properties@1.2.1(transitive)
+ Addeddeglob@2.1.1(transitive)
+ Addeddoctrine@1.5.02.1.0(transitive)
+ Addederror-ex@1.3.2(transitive)
+ Addedes-abstract@1.23.5(transitive)
+ Addedes-define-property@1.0.0(transitive)
+ Addedes-errors@1.3.0(transitive)
+ Addedes-object-atoms@1.0.0(transitive)
+ Addedes-set-tostringtag@2.0.3(transitive)
+ Addedes-shim-unscopables@1.0.2(transitive)
+ Addedes-to-primitive@1.3.0(transitive)
+ Addedes5-ext@0.10.64(transitive)
+ Addedes6-iterator@2.0.3(transitive)
+ Addedes6-map@0.1.5(transitive)
+ Addedes6-set@0.1.6(transitive)
+ Addedes6-symbol@3.1.4(transitive)
+ Addedes6-weak-map@2.0.3(transitive)
+ Addedescape-string-regexp@1.0.5(transitive)
+ Addedescope@3.6.0(transitive)
+ Addedeslint@3.19.0(transitive)
+ Addedeslint-config-standard@10.2.1(transitive)
+ Addedeslint-config-standard-jsx@4.0.2(transitive)
+ Addedeslint-import-resolver-node@0.2.3(transitive)
+ Addedeslint-module-utils@2.12.0(transitive)
+ Addedeslint-plugin-import@2.2.0(transitive)
+ Addedeslint-plugin-node@4.2.3(transitive)
+ Addedeslint-plugin-promise@3.5.0(transitive)
+ Addedeslint-plugin-react@6.10.3(transitive)
+ Addedeslint-plugin-standard@3.0.1(transitive)
+ Addedesniff@2.0.1(transitive)
+ Addedespree@3.5.4(transitive)
+ Addedesprima@4.0.1(transitive)
+ Addedesquery@1.6.0(transitive)
+ Addedesrecurse@4.3.0(transitive)
+ Addedestraverse@4.3.05.3.0(transitive)
+ Addedesutils@2.0.3(transitive)
+ Addedevent-emitter@0.3.5(transitive)
+ Addedexit-hook@1.1.1(transitive)
+ Addedext@1.7.0(transitive)
+ Addedfast-levenshtein@2.0.6(transitive)
+ Addedfigures@1.7.0(transitive)
+ Addedfile-entry-cache@2.0.0(transitive)
+ Addedfind-root@1.1.0(transitive)
+ Addedfind-up@1.1.22.1.0(transitive)
+ Addedflat-cache@1.3.4(transitive)
+ Addedfor-each@0.3.3(transitive)
+ Addedfs.realpath@1.0.0(transitive)
+ Addedfunction-bind@1.1.2(transitive)
+ Addedfunction.prototype.name@1.1.6(transitive)
+ Addedfunctions-have-names@1.2.3(transitive)
+ Addedgenerate-function@2.3.1(transitive)
+ Addedgenerate-object-property@1.2.0(transitive)
+ Addedget-intrinsic@1.2.4(transitive)
+ Addedget-stdin@5.0.1(transitive)
+ Addedget-symbol-description@1.0.2(transitive)
+ Addedglob@7.2.3(transitive)
+ Addedglobals@9.18.0(transitive)
+ Addedglobalthis@1.0.4(transitive)
+ Addedgopd@1.1.0(transitive)
+ Addedgraceful-fs@4.2.11(transitive)
+ Addedhas@1.0.4(transitive)
+ Addedhas-ansi@2.0.0(transitive)
+ Addedhas-bigints@1.0.2(transitive)
+ Addedhas-flag@3.0.0(transitive)
+ Addedhas-property-descriptors@1.0.2(transitive)
+ Addedhas-proto@1.0.3(transitive)
+ Addedhas-symbols@1.0.3(transitive)
+ Addedhas-tostringtag@1.0.2(transitive)
+ Addedhasown@2.0.2(transitive)
+ Addedignore@3.3.10(transitive)
+ Addedimurmurhash@0.1.4(transitive)
+ Addedinflight@1.0.6(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedinquirer@0.12.0(transitive)
+ Addedinternal-slot@1.0.7(transitive)
+ Addedinterpret@1.4.0(transitive)
+ Addedis-array-buffer@3.0.4(transitive)
+ Addedis-arrayish@0.2.1(transitive)
+ Addedis-async-function@2.0.0(transitive)
+ Addedis-bigint@1.0.4(transitive)
+ Addedis-boolean-object@1.1.2(transitive)
+ Addedis-callable@1.2.7(transitive)
+ Addedis-core-module@2.15.1(transitive)
+ Addedis-data-view@1.0.1(transitive)
+ Addedis-date-object@1.0.5(transitive)
+ Addedis-finalizationregistry@1.1.0(transitive)
+ Addedis-fullwidth-code-point@1.0.02.0.0(transitive)
+ Addedis-generator-function@1.0.10(transitive)
+ Addedis-map@2.0.3(transitive)
+ Addedis-my-ip-valid@1.0.1(transitive)
+ Addedis-my-json-valid@2.20.6(transitive)
+ Addedis-negative-zero@2.0.3(transitive)
+ Addedis-number-object@1.0.7(transitive)
+ Addedis-property@1.0.2(transitive)
+ Addedis-regex@1.2.0(transitive)
+ Addedis-resolvable@1.1.0(transitive)
+ Addedis-set@2.0.3(transitive)
+ Addedis-shared-array-buffer@1.0.3(transitive)
+ Addedis-string@1.0.7(transitive)
+ Addedis-symbol@1.0.4(transitive)
+ Addedis-typed-array@1.1.13(transitive)
+ Addedis-weakmap@2.0.2(transitive)
+ Addedis-weakref@1.0.2(transitive)
+ Addedis-weakset@2.0.3(transitive)
+ Addedisarray@1.0.02.0.5(transitive)
+ Addedjs-tokens@3.0.2(transitive)
+ Addedjs-yaml@3.14.1(transitive)
+ Addedjson-parse-better-errors@1.0.2(transitive)
+ Addedjson-stable-stringify@1.1.1(transitive)
+ Addedjsonify@0.0.1(transitive)
+ Addedjsonpointer@5.0.1(transitive)
+ Addedjsx-ast-utils@1.4.1(transitive)
+ Addedlevn@0.3.0(transitive)
+ Addedload-json-file@4.0.0(transitive)
+ Addedlocate-path@2.0.0(transitive)
+ Addedlodash@4.17.21(transitive)
+ Addedlodash.cond@4.5.2(transitive)
+ Addedminimatch@3.1.2(transitive)
+ Addedminimist@1.2.8(transitive)
+ Addedmkdirp@0.5.6(transitive)
+ Addedms@2.0.02.1.3(transitive)
+ Addedmute-stream@0.0.5(transitive)
+ Addednatural-compare@1.4.0(transitive)
+ Addednext-tick@1.1.0(transitive)
+ Addednumber-is-nan@1.0.1(transitive)
+ Addedobject-assign@4.1.1(transitive)
+ Addedobject-inspect@1.13.3(transitive)
+ Addedobject-keys@1.1.1(transitive)
+ Addedobject.assign@4.1.5(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedonetime@1.1.0(transitive)
+ Addedoptionator@0.8.3(transitive)
+ Addedos-homedir@1.0.2(transitive)
+ Addedp-limit@1.3.0(transitive)
+ Addedp-locate@2.0.0(transitive)
+ Addedp-try@1.0.0(transitive)
+ Addedparse-json@4.0.0(transitive)
+ Addedpath-exists@2.1.03.0.0(transitive)
+ Addedpath-is-absolute@1.0.1(transitive)
+ Addedpath-is-inside@1.0.2(transitive)
+ Addedpath-parse@1.0.7(transitive)
+ Addedpify@3.0.0(transitive)
+ Addedpinkie@2.0.4(transitive)
+ Addedpinkie-promise@2.0.1(transitive)
+ Addedpkg-conf@2.1.0(transitive)
+ Addedpkg-config@1.1.1(transitive)
+ Addedpkg-up@1.0.0(transitive)
+ Addedpluralize@1.2.1(transitive)
+ Addedpossible-typed-array-names@1.0.0(transitive)
+ Addedprelude-ls@1.1.2(transitive)
+ Addedprocess-nextick-args@2.0.1(transitive)
+ Addedprogress@1.1.8(transitive)
+ Addedqueue-microtask@1.2.3(transitive)
+ Addedreadable-stream@2.3.83.6.2(transitive)
+ Addedreadline2@1.0.1(transitive)
+ Addedrechoir@0.6.2(transitive)
+ Addedreflect.getprototypeof@1.0.7(transitive)
+ Addedregexp.prototype.flags@1.5.3(transitive)
+ Addedrequire-uncached@1.0.3(transitive)
+ Addedresolve@1.22.8(transitive)
+ Addedresolve-from@1.0.1(transitive)
+ Addedrestore-cursor@1.0.1(transitive)
+ Addedrimraf@2.6.3(transitive)
+ Addedrun-async@0.1.0(transitive)
+ Addedrun-parallel@1.2.0(transitive)
+ Addedrx-lite@3.1.2(transitive)
+ Addedsafe-array-concat@1.1.2(transitive)
+ Addedsafe-buffer@5.1.2(transitive)
+ Addedsafe-regex-test@1.0.3(transitive)
+ Addedsemver@5.3.0(transitive)
+ Addedset-function-length@1.2.2(transitive)
+ Addedset-function-name@2.0.2(transitive)
+ Addedshelljs@0.7.8(transitive)
+ Addedside-channel@1.0.6(transitive)
+ Addedslice-ansi@0.0.4(transitive)
+ Addedsnazzy@7.1.1(transitive)
+ Addedsprintf-js@1.0.3(transitive)
+ Addedstandard@10.0.3(transitive)
+ Addedstandard-engine@7.0.0(transitive)
+ Addedstandard-json@1.1.0(transitive)
+ Addedstring-width@1.0.22.1.1(transitive)
+ Addedstring.prototype.trim@1.2.9(transitive)
+ Addedstring.prototype.trimend@1.0.8(transitive)
+ Addedstring.prototype.trimstart@1.0.8(transitive)
+ Addedstring_decoder@1.1.1(transitive)
+ Addedstrip-ansi@3.0.14.0.0(transitive)
+ Addedstrip-bom@3.0.0(transitive)
+ Addedstrip-json-comments@2.0.1(transitive)
+ Addedsupports-color@2.0.05.5.0(transitive)
+ Addedsupports-preserve-symlinks-flag@1.0.0(transitive)
+ Addedtable@3.8.3(transitive)
+ Addedtext-table@0.2.0(transitive)
+ Addedthrough@2.3.8(transitive)
+ Addedtype@2.7.3(transitive)
+ Addedtype-check@0.3.2(transitive)
+ Addedtyped-array-buffer@1.0.2(transitive)
+ Addedtyped-array-byte-length@1.0.1(transitive)
+ Addedtyped-array-byte-offset@1.0.3(transitive)
+ Addedtyped-array-length@1.0.7(transitive)
+ Addedtypedarray@0.0.6(transitive)
+ Addedunbox-primitive@1.0.2(transitive)
+ Addeduniq@1.0.1(transitive)
+ Addeduser-home@2.0.0(transitive)
+ Addedutil-deprecate@1.0.2(transitive)
+ Addedwhich-boxed-primitive@1.0.2(transitive)
+ Addedwhich-builtin-type@1.2.0(transitive)
+ Addedwhich-collection@1.0.2(transitive)
+ Addedwhich-typed-array@1.1.16(transitive)
+ Addedword-wrap@1.2.5(transitive)
+ Addedwrappy@1.0.2(transitive)
+ Addedwrite@0.2.1(transitive)
+ Addedxtend@4.0.2(transitive)