getstream-node
Advanced tools
Comparing version 0.3.0 to 1.0.0
{ | ||
"name": "getstream-node", | ||
"version": "0.3.0", | ||
"version": "1.0.0", | ||
"description": "Build newsfeeds and activity feeds on node.js using getstream.io", | ||
@@ -16,5 +16,7 @@ "author": "Tommaso Barbugli <tbarbugli@gmail.com> (http://getstream.io/)", | ||
"async": "^0.9.0", | ||
"getstream": "~v2.2.2", | ||
"extend": "^3.0.0", | ||
"getstream": "~v3.0.0", | ||
"istanbul": "^0.3.13", | ||
"mockery": "^1.4.0", | ||
"promise": "^7.0.4", | ||
"sinon": "^1.14.1" | ||
@@ -29,3 +31,5 @@ }, | ||
"scripts": { | ||
"test": "STREAM_URL='https://key:secret@us-east.getstream.io/?app_id=42' NODE_ENV=test ./node_modules/istanbul/lib/cli.js cover node_modules/mocha/bin/_mocha test/backends test" | ||
"test": "STREAM_URL='https://key:secret@us-east.getstream.io/?app_id=42' NODE_ENV=test ./node_modules/istanbul/lib/cli.js cover node_modules/mocha/bin/_mocha test/backends test", | ||
"preversion": "npm test", | ||
"postversion": "git push && git push --tags" | ||
}, | ||
@@ -32,0 +36,0 @@ "engines": { |
##Stream NodeJS | ||
[![Build Status](https://travis-ci.org/tbarbugli/stream-node.svg)](https://travis-ci.org/tbarbugli/stream-node) | ||
[![npm version](https://badge.fury.io/js/getstream-node.svg)](http://badge.fury.io/js/getstream-node) | ||
@@ -51,3 +52,3 @@ This package helps you create activity streams & newsfeeds with NodeJS and [GetStream.io](https://getstream.io). | ||
stream.mongoose.activitySchema(tweetSchema); | ||
tweetSchema.plugin(stream.mongoose.activity); | ||
@@ -79,3 +80,3 @@ // register your mongoose connection with the library | ||
stream.mongoose.activitySchema(tweetSchema); | ||
tweetSchema.plugin(stream.mongoose.activity); | ||
@@ -161,14 +162,15 @@ tweetSchema.methods.activityActorProp = function() { | ||
```js | ||
``` | ||
router.get('/flat', ensureAuthenticated, function(req, res, next){ | ||
var flatFeed = FeedManager.getNewsFeeds(req.user.id)['flat']; | ||
flatFeed.get({}, function(err, response, body){ | ||
if (err) return next(err); | ||
var activities = body.results; | ||
StreamBackend.enrichActivities(activities, | ||
function(err, enrichedActivities){ | ||
flatFeed.get({}) | ||
.then(function (body) { | ||
var activities = body.results; | ||
return StreamBackend.enrichActivities(activities); | ||
}) | ||
.then(function (enrichedActivities) { | ||
return res.render('feed', {location: 'feed', user: req.user, activities: enrichedActivities, path: req.url}); | ||
} | ||
); | ||
}) | ||
.catch(next) | ||
}); | ||
@@ -178,2 +180,4 @@ }); | ||
Promises are used to pipe the asynchronous result of `flatFeed.get` and `StreamBackend.enrichActivities` through our code. | ||
###Temporarily disabling the model sync | ||
@@ -180,0 +184,0 @@ |
@@ -1,72 +0,67 @@ | ||
var BaseActivity = function() { | ||
}; | ||
module.exports = function (schema, options) { | ||
// Common proto functions | ||
schema.methods.activityActorFeed = function() { | ||
return null; | ||
}; | ||
BaseActivity.methods = {}; | ||
BaseActivity.statics = {}; | ||
schema.methods.activityGetActor = function() { | ||
var actor = this[this.activityActorProp()]; | ||
if (typeof(actor) === 'undefined'){ | ||
// todo: throw a clear error here | ||
} | ||
return actor; | ||
}; | ||
// Common proto functions | ||
BaseActivity.methods.activityActorFeed = function() { | ||
return null; | ||
}; | ||
schema.methods.activityActor = function() { | ||
var actor = this.activityGetActor(); | ||
return actor; | ||
}; | ||
BaseActivity.methods.activityGetActor = function() { | ||
var actor = this[this.activityActorProp()]; | ||
if (typeof(actor) === 'undefined'){ | ||
// todo: throw a clear error here | ||
} | ||
return actor; | ||
}; | ||
schema.methods.activityObject = function() { | ||
return this; | ||
}; | ||
BaseActivity.methods.activityActor = function() { | ||
var actor = this.activityGetActor(); | ||
return actor; | ||
}; | ||
schema.methods.activityForeignId = function() { | ||
return this; | ||
}; | ||
BaseActivity.methods.activityObject = function() { | ||
return this; | ||
}; | ||
schema.methods.createActivity = function() { | ||
var activity = {}; | ||
var extra_data = this.activityExtraData(); | ||
for (var key in extra_data) { | ||
activity[key] = extra_data[key]; | ||
} | ||
activity.to = (this.activityNotify() || []).map(function(x){return x.id}); | ||
activity.actor = this.activityActor(); | ||
activity.verb = this.activityVerb(); | ||
activity.object = this.activityObject(); | ||
activity.foreign_id = this.activityForeignId(); | ||
if (this.activityTime()) { | ||
activity.time = this.activityTime(); | ||
} | ||
return activity; | ||
} | ||
BaseActivity.methods.activityForeignId = function() { | ||
return this; | ||
}; | ||
// User specific proto functions (with decent defaults) | ||
schema.methods.getStreamBackend = function() { | ||
var stream = require('../index.js'); | ||
return new stream.BaseBackend(); | ||
}; | ||
BaseActivity.methods.createActivity = function() { | ||
var activity = {}; | ||
var extra_data = this.activityExtraData(); | ||
for (var key in extra_data) { | ||
activity[key] = extra_data[key]; | ||
} | ||
activity.to = (this.activityNotify() || []).map(function(x){return x.id}); | ||
activity.actor = this.activityActor(); | ||
activity.verb = this.activityVerb(); | ||
activity.object = this.activityObject(); | ||
activity.foreign_id = this.activityForeignId(); | ||
if (this.activityTime()) { | ||
activity.time = this.activityTime(); | ||
} | ||
return activity; | ||
} | ||
schema.methods.activityActorProp = function() { | ||
return 'user' | ||
}; | ||
// User specific proto functions (with decent defaults) | ||
BaseActivity.methods.getStreamBackend = function() { | ||
var stream = require('../index.js'); | ||
return new stream.BaseBackend(); | ||
}; | ||
schema.methods.activityVerb = function() { | ||
return this.constructor.name; | ||
}; | ||
BaseActivity.methods.activityActorProp = function() { | ||
return 'user' | ||
}; | ||
schema.methods.activityExtraData = function() { | ||
return {}; | ||
}; | ||
BaseActivity.methods.activityVerb = function() { | ||
return this.constructor.name; | ||
}; | ||
schema.methods.activityTime = function() {}; | ||
BaseActivity.methods.activityExtraData = function() { | ||
return {}; | ||
schema.methods.activityNotify = function() {}; | ||
}; | ||
BaseActivity.methods.activityTime = function() {}; | ||
BaseActivity.methods.activityNotify = function() {}; | ||
module.exports = BaseActivity; |
var async = require("async"); | ||
var Promise = require("promise"); | ||
@@ -70,8 +71,5 @@ var BaseBackend = function() { | ||
}, | ||
enrichActivities: function(activities, callback) { | ||
try { | ||
this._enrichActivities(activities, callback); | ||
} catch (err) { | ||
callback(err, activities); | ||
} | ||
enrichActivities: function(activities) { | ||
// Return a Promise instead of using node style callbacks (_enrichActivities accepts one argument + callback) | ||
return Promise.denodeify(this._enrichActivities, 1).call(this, activities); | ||
}, | ||
@@ -90,8 +88,5 @@ _enrichActivities: function(activities, callback) { | ||
}, | ||
enrichAggregatedActivities: function(aggregatedActivities, callback) { | ||
try { | ||
this._enrichAggregatedActivities(aggregatedActivities, callback); | ||
} catch (err) { | ||
callback(err, aggregatedActivities); | ||
} | ||
enrichAggregatedActivities: function(aggregatedActivities) { | ||
// Return a Promise instead of using node style callbacks (_enrichAggregatedActivities accepts one argument + callback) | ||
return Promise.denodeify(this._enrichAggregatedActivities, 1).call(this, aggregatedActivities); | ||
}, | ||
@@ -104,9 +99,8 @@ _enrichAggregatedActivities: function(aggregatedActivities, callback) { | ||
enrichments.push( | ||
function(aggregated){ | ||
(function(aggregated){ | ||
return function(done) { | ||
self.enrichActivities(aggregated['activities'], function(err, results) { | ||
done(err, aggregated); | ||
}); | ||
self.enrichActivities(aggregated['activities']) | ||
.then(done.bind(this, null), done); | ||
} | ||
}(aggregatedActivities[i])) | ||
})(aggregatedActivities[i])) | ||
} | ||
@@ -113,0 +107,0 @@ async.parallel(enrichments, function(err) { callback(err, aggregatedActivities); }); |
@@ -1,2 +0,2 @@ | ||
var BaseActivity = require('./activity.js'); | ||
var baseActivitySchemaPlugin = require('./activity.js'); | ||
var util = require("util"); | ||
@@ -46,18 +46,2 @@ var stream = require('../index.js'); | ||
function extendSchema(base, mixin) { | ||
if (typeof base.methods === 'undefined') { | ||
base.methods = {}; | ||
} | ||
if (typeof base.statics === 'undefined') { | ||
base.statics = {}; | ||
} | ||
for (var fn in mixin.methods) { | ||
base.methods[fn] = mixin.methods[fn]; | ||
} | ||
for (var fn in mixin.statics) { | ||
base.statics[fn] = mixin.statics[fn]; | ||
} | ||
return base; | ||
} | ||
function getReferencePaths(paths) { | ||
@@ -73,8 +57,4 @@ var names = []; | ||
var activitySchema = function(Schema) { | ||
// add base proto functions from BaseActivity | ||
extendSchema(Schema, BaseActivity); | ||
Schema.pre('save', function(next) { | ||
var mongooseActivitySchemaPlugin = function(schema, options) { | ||
schema.pre('save', function(next) { | ||
this.wasNew = this.isNew; | ||
@@ -84,3 +64,3 @@ next(); | ||
Schema.post('save', function(doc) { | ||
schema.post('save', function(doc) { | ||
var paths = getReferencePaths(doc.schema.paths); | ||
@@ -94,3 +74,3 @@ doc.populate(paths, function(err, docP) { | ||
Schema.post('remove', function(doc) { | ||
schema.post('remove', function(doc) { | ||
var paths = getReferencePaths(doc.schema.paths); | ||
@@ -103,19 +83,19 @@ doc.populate(paths, function(err, docP) { | ||
// add Mongoose specific proto functions | ||
Schema.methods.referencesPaths = function() { | ||
schema.methods.referencesPaths = function() { | ||
return this; | ||
} | ||
}; | ||
Schema.methods.getStreamBackend = function() { | ||
schema.methods.getStreamBackend = function() { | ||
return new Backend(); | ||
} | ||
}; | ||
Schema.statics.activityModelReference = function() { | ||
schema.statics.activityModelReference = function() { | ||
return this.modelName; | ||
} | ||
}; | ||
Schema.methods.activityVerb = function() { | ||
schema.methods.activityVerb = function() { | ||
return this.constructor.modelName; | ||
}; | ||
Schema.statics.pathsToPopulate = function() { | ||
schema.statics.pathsToPopulate = function() { | ||
return []; | ||
@@ -125,4 +105,8 @@ }; | ||
module.exports.activitySchema = activitySchema; | ||
module.exports.activity = function(schema, options) { | ||
schema.plugin(baseActivitySchemaPlugin); | ||
schema.plugin(mongooseActivitySchemaPlugin); | ||
}; | ||
module.exports.Backend = Backend; | ||
module.exports.setupMongoose = setupMongoose; |
@@ -19,2 +19,4 @@ var path = require('path'), | ||
var Config = function () { | ||
var settings = {}, | ||
config_file = ''; | ||
// load config from defaults or config file | ||
@@ -21,0 +23,0 @@ |
@@ -23,3 +23,3 @@ var stream = require('getstream'); | ||
} | ||
}, | ||
@@ -26,0 +26,0 @@ |
@@ -7,4 +7,15 @@ var FeedManager = require('./FeedManager.js'); | ||
module.exports.FeedManager = new FeedManager(settings); | ||
module.exports.feedManagerFactory = function (options) { | ||
options = options || {}; | ||
for(var key in settings) { | ||
if(settings.hasOwnProperty(key) && options.hasOwnProperty(key)) { | ||
settings[key] = options[key]; | ||
} | ||
} | ||
return new FeedManager(settings); | ||
} | ||
module.exports.BaseBackend = BaseBackend; | ||
module.exports.mongoose = require('./backends/mongoose.js'); | ||
module.exports.settings = settings; |
@@ -10,13 +10,13 @@ var async = require("async"); | ||
mongoose.connect('mongodb://localhost/test'); | ||
var connection = mongoose.connect('mongodb://localhost/test'); | ||
var userSchema = Schema({ | ||
var userSchema = new Schema({ | ||
name : String | ||
}); | ||
var linkSchema = Schema({ | ||
var linkSchema = new Schema({ | ||
href : String | ||
}); | ||
var tweetSchema = Schema({ | ||
var tweetSchema = new Schema({ | ||
text : String, | ||
@@ -28,3 +28,3 @@ actor : { type: Schema.Types.ObjectId, ref: 'User' }, | ||
StreamMongoose.activitySchema(tweetSchema); | ||
tweetSchema.plugin(StreamMongoose.activity); | ||
@@ -82,8 +82,9 @@ tweetSchema.statics.pathsToPopulate = function() { | ||
backend.serializeActivities([activity]); | ||
backend.enrichActivities([activity], function(err, enriched) { | ||
should.not.exist(err); | ||
enriched.should.length(1); | ||
enriched[0].should.have.property('object', null); | ||
done(); | ||
}); | ||
backend.enrichActivities([activity]) | ||
.then(function(enriched) { | ||
enriched.should.length(1); | ||
enriched[0].should.have.property('object', null); | ||
done(); | ||
}) | ||
.catch(done); | ||
}); | ||
@@ -93,6 +94,8 @@ | ||
var activity = {'object': 'user:42'}; | ||
backend.enrichActivities([activity], function(err, enriched) { | ||
(err).should.be.an.instanceOf(Error); | ||
done(); | ||
}); | ||
backend.enrichActivities([activity]) | ||
.then(done) | ||
.catch(function(err) { | ||
(err).should.be.an.instanceOf(Error); | ||
done(); | ||
}); | ||
}); | ||
@@ -102,8 +105,9 @@ | ||
var activity = {'origin': 'user:42'}; | ||
backend.enrichActivities([activity], function(err, enriched) { | ||
should.not.exist(err); | ||
enriched.should.length(1); | ||
enriched[0].should.have.property('origin', 'user:42'); | ||
done(); | ||
}); | ||
backend.enrichActivities([activity]) | ||
.then(function(enriched) { | ||
enriched.should.length(1); | ||
enriched[0].should.have.property('origin', 'user:42'); | ||
done(); | ||
}) | ||
.catch(done); | ||
}); | ||
@@ -130,19 +134,20 @@ | ||
]; | ||
backend.enrichAggregatedActivities(aggregatedActivities, function(err, enriched) { | ||
should.not.exist(err); | ||
enriched.should.length(2); | ||
var firstAggregation = enriched[0]; | ||
var secondAggregation = enriched[1]; | ||
firstAggregation.should.have.property('activities').with.lengthOf(1); | ||
firstAggregation['activities'][0].should.have.property('actor'); | ||
firstAggregation['activities'][0].should.have.property('object'); | ||
firstAggregation['activities'][0].object.should.have.property('_id'); | ||
firstAggregation['activities'][0].should.have.property('verb'); | ||
secondAggregation['activities'][0].should.have.property('actor'); | ||
secondAggregation['activities'][0].should.have.property('object'); | ||
secondAggregation['activities'][0].object.should.have.property('_id'); | ||
secondAggregation['activities'][0].should.have.property('verb'); | ||
(firstAggregation['activities'][0].object._id).should.not.equal((secondAggregation['activities'][0].object._id)); | ||
done(); | ||
}); | ||
backend.enrichAggregatedActivities(aggregatedActivities) | ||
.then(function(enriched) { | ||
enriched.should.length(2); | ||
var firstAggregation = enriched[0]; | ||
var secondAggregation = enriched[1]; | ||
firstAggregation.should.have.property('activities').with.lengthOf(1); | ||
firstAggregation['activities'][0].should.have.property('actor'); | ||
firstAggregation['activities'][0].should.have.property('object'); | ||
firstAggregation['activities'][0].object.should.have.property('_id'); | ||
firstAggregation['activities'][0].should.have.property('verb'); | ||
secondAggregation['activities'][0].should.have.property('actor'); | ||
secondAggregation['activities'][0].should.have.property('object'); | ||
secondAggregation['activities'][0].object.should.have.property('_id'); | ||
secondAggregation['activities'][0].should.have.property('verb'); | ||
(firstAggregation['activities'][0].object._id).should.not.equal((secondAggregation['activities'][0].object._id)); | ||
done(); | ||
}) | ||
.catch(done); | ||
}); | ||
@@ -163,11 +168,12 @@ }); | ||
]; | ||
backend.enrichAggregatedActivities(aggregatedActivities, function(err, enriched) { | ||
should.not.exist(err); | ||
enriched.should.length(1); | ||
enriched[0].should.have.property('activities').with.lengthOf(1); | ||
enriched[0]['activities'][0].should.have.property('actor'); | ||
enriched[0]['activities'][0].should.have.property('object'); | ||
enriched[0]['activities'][0].should.have.property('verb'); | ||
done(); | ||
}); | ||
backend.enrichAggregatedActivities(aggregatedActivities) | ||
.then(function(enriched) { | ||
enriched.should.length(1); | ||
enriched[0].should.have.property('activities').with.lengthOf(1); | ||
enriched[0]['activities'][0].should.have.property('actor'); | ||
enriched[0]['activities'][0].should.have.property('object'); | ||
enriched[0]['activities'][0].should.have.property('verb'); | ||
done(); | ||
}) | ||
.catch(done); | ||
}); | ||
@@ -189,16 +195,17 @@ }); | ||
]; | ||
backend.enrichAggregatedActivities(aggregatedActivities, function(err, enriched) { | ||
should.not.exist(err); | ||
enriched.should.length(2); | ||
enriched[0].should.have.property('activities').with.lengthOf(1); | ||
enriched[0]['activities'][0].should.have.property('actor'); | ||
enriched[0]['activities'][0].should.have.property('object'); | ||
enriched[0]['activities'][0].should.have.property('verb'); | ||
backend.enrichAggregatedActivities(aggregatedActivities) | ||
.then(function(enriched) { | ||
enriched.should.length(2); | ||
enriched[0].should.have.property('activities').with.lengthOf(1); | ||
enriched[0]['activities'][0].should.have.property('actor'); | ||
enriched[0]['activities'][0].should.have.property('object'); | ||
enriched[0]['activities'][0].should.have.property('verb'); | ||
enriched[1].should.have.property('activities').with.lengthOf(2); | ||
enriched[1]['activities'][0].should.have.property('actor'); | ||
enriched[1]['activities'][0].should.have.property('object'); | ||
enriched[1]['activities'][0].should.have.property('verb'); | ||
done(); | ||
}); | ||
enriched[1].should.have.property('activities').with.lengthOf(2); | ||
enriched[1]['activities'][0].should.have.property('actor'); | ||
enriched[1]['activities'][0].should.have.property('object'); | ||
enriched[1]['activities'][0].should.have.property('verb'); | ||
done(); | ||
}) | ||
.catch(done); | ||
}); | ||
@@ -227,10 +234,11 @@ }); | ||
activity = JSON.parse(JSON.stringify(activity)); | ||
backend.enrichActivities([activity], function(err, enriched) { | ||
should.not.exist(err); | ||
enriched.should.length(1); | ||
enriched[0].should.have.property('actor'); | ||
enriched[0]['actor'].should.have.property('_id', self.actor._id); | ||
enriched[0].should.have.property('foreign_id', 'Tweet:'+tweet._id); | ||
done(); | ||
}); | ||
backend.enrichActivities([activity]) | ||
.then(function(enriched) { | ||
enriched.should.length(1); | ||
enriched[0].should.have.property('actor'); | ||
enriched[0]['actor'].should.have.property('_id', self.actor._id); | ||
enriched[0].should.have.property('foreign_id', 'Tweet:'+tweet._id); | ||
done(); | ||
}) | ||
.catch(done); | ||
}); | ||
@@ -249,15 +257,16 @@ }); | ||
var activity = tweet.createActivity(); | ||
backend.enrichActivities([activity], function(err, enriched) { | ||
should.not.exist(err); | ||
enriched.should.length(1); | ||
enriched[0].should.have.property('actor'); | ||
enriched[0]['actor'].should.have.property('_id', self.actor._id); | ||
enriched[0].should.have.property('object'); | ||
enriched[0]['object'].should.have.property('_id', tweet._id); | ||
enriched[0]['object'].should.have.property('text', tweet.text); | ||
enriched[0].should.have.property('bg', 'bgvalue'); | ||
enriched[0].should.have.property('link'); | ||
enriched[0]['link'].should.have.property('_id', this.link._id); | ||
done(); | ||
}); | ||
backend.enrichActivities([activity]) | ||
.then(function(enriched) { | ||
enriched.should.length(1); | ||
enriched[0].should.have.property('actor'); | ||
enriched[0]['actor'].should.have.property('_id', self.actor._id); | ||
enriched[0].should.have.property('object'); | ||
enriched[0]['object'].should.have.property('_id', tweet._id); | ||
enriched[0]['object'].should.have.property('text', tweet.text); | ||
enriched[0].should.have.property('bg', 'bgvalue'); | ||
enriched[0].should.have.property('link'); | ||
enriched[0]['link'].should.have.property('_id', this.link._id); | ||
done(); | ||
}) | ||
.catch(done); | ||
}); | ||
@@ -308,12 +317,13 @@ }); | ||
var activity = tweet.createActivity(); | ||
backend.enrichActivities([activity], function(err, enriched){ | ||
should.not.exist(err); | ||
enriched.should.length(1); | ||
enriched[0].should.have.property('actor'); | ||
enriched[0]['actor'].should.have.property('_id', self.actor._id); | ||
enriched[0].should.have.property('object'); | ||
enriched[0]['object'].should.have.property('_id', tweet._id); | ||
enriched[0]['object'].should.have.property('text', tweet.text); | ||
done(); | ||
}); | ||
backend.enrichActivities([activity]) | ||
.then(function(enriched){ | ||
enriched.should.length(1); | ||
enriched[0].should.have.property('actor'); | ||
enriched[0]['actor'].should.have.property('_id', self.actor._id); | ||
enriched[0].should.have.property('object'); | ||
enriched[0]['object'].should.have.property('_id', tweet._id); | ||
enriched[0]['object'].should.have.property('text', tweet.text); | ||
done(); | ||
}) | ||
.catch(done); | ||
}); | ||
@@ -338,4 +348,4 @@ }); | ||
var activities = [tweet1.createActivity(), tweet2.createActivity()]; | ||
backend.enrichActivities(activities, | ||
function(err, enriched){ | ||
backend.enrichActivities(activities) | ||
.then(function(enriched){ | ||
enriched.should.length(2); | ||
@@ -346,6 +356,7 @@ enriched[0].should.have.property('foreign_id'); | ||
done(); | ||
} | ||
)} | ||
); | ||
}); | ||
}) | ||
.catch(done); | ||
} | ||
); | ||
}); | ||
}); | ||
@@ -352,0 +363,0 @@ |
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
39950
18
0
200
7
832
1
+ Addedextend@^3.0.0
+ Addedpromise@^7.0.4
+ AddedBase64@0.3.0(transitive)
+ Addedansi-regex@2.1.1(transitive)
+ Addedansi-styles@2.2.1(transitive)
+ Addedasn1@0.2.6(transitive)
+ Addedassert-plus@1.0.0(transitive)
+ Addedasync@2.6.4(transitive)
+ Addedbcrypt-pbkdf@1.0.2(transitive)
+ Addedbl@1.0.3(transitive)
+ Addedbluebird@2.11.0(transitive)
+ Addedboom@2.10.1(transitive)
+ Addedcaseless@0.11.0(transitive)
+ Addedchalk@1.1.3(transitive)
+ Addedcombined-stream@1.0.8(transitive)
+ Addedcommander@2.20.3(transitive)
+ Addedcore-util-is@1.0.21.0.3(transitive)
+ Addedcryptiles@2.0.5(transitive)
+ Addeddashdash@1.14.1(transitive)
+ Addeddelayed-stream@1.0.0(transitive)
+ Addedecc-jsbn@0.1.2(transitive)
+ Addedescape-string-regexp@1.0.5(transitive)
+ Addedextend@3.0.2(transitive)
+ Addedextsprintf@1.3.0(transitive)
+ Addedforever-agent@0.6.1(transitive)
+ Addedform-data@1.0.1(transitive)
+ Addedgenerate-function@2.3.1(transitive)
+ Addedgenerate-object-property@1.2.0(transitive)
+ Addedgetpass@0.1.7(transitive)
+ Addedgetstream@3.0.0(transitive)
+ Addedhar-validator@1.8.0(transitive)
+ Addedhas-ansi@2.0.0(transitive)
+ Addedhawk@3.1.3(transitive)
+ Addedhoek@2.16.3(transitive)
+ Addedhttp-signature@0.11.01.4.0(transitive)
+ Addedis-my-ip-valid@1.0.1(transitive)
+ Addedis-my-json-valid@2.20.6(transitive)
+ Addedis-property@1.0.2(transitive)
+ Addedisarray@1.0.0(transitive)
+ Addedisstream@0.1.2(transitive)
+ Addedjsbn@0.1.1(transitive)
+ Addedjson-schema@0.4.0(transitive)
+ Addedjsonpointer@5.0.1(transitive)
+ Addedjsprim@2.0.2(transitive)
+ Addedlodash@4.17.21(transitive)
+ Addedmime-db@1.52.0(transitive)
+ Addedmime-types@2.1.35(transitive)
+ Addedoauth-sign@0.8.2(transitive)
+ Addedprocess-nextick-args@1.0.7(transitive)
+ Addedpromise@7.3.1(transitive)
+ Addedqs@5.1.05.2.1(transitive)
+ Addedreadable-stream@2.0.6(transitive)
+ Addedrequest@2.63.0(transitive)
+ Addedsafer-buffer@2.1.2(transitive)
+ Addedsntp@1.0.9(transitive)
+ Addedsshpk@1.18.0(transitive)
+ Addedstring_decoder@0.10.31(transitive)
+ Addedstringstream@0.0.6(transitive)
+ Addedstrip-ansi@3.0.1(transitive)
+ Addedsupports-color@2.0.0(transitive)
+ Addedtweetnacl@0.14.5(transitive)
+ Addedutil-deprecate@1.0.2(transitive)
+ Addedverror@1.10.0(transitive)
- Removedboom@0.4.2(transitive)
- Removedcombined-stream@0.0.7(transitive)
- Removedcryptiles@0.2.2(transitive)
- Removeddelayed-stream@0.0.5(transitive)
- Removedforever-agent@0.5.2(transitive)
- Removedform-data@0.1.4(transitive)
- Removedgetstream@2.2.2(transitive)
- Removedhawk@1.0.0(transitive)
- Removedhoek@0.9.1(transitive)
- Removedhttp-signature@0.10.1(transitive)
- Removedmime@1.2.11(transitive)
- Removedoauth-sign@0.3.0(transitive)
- Removedqs@0.6.6(transitive)
- Removedrequest@2.36.0(transitive)
- Removedsntp@0.2.4(transitive)
Updatedgetstream@~v3.0.0