digdug
Advanced tools
Comparing version 1.4.1 to 1.5.0
@@ -97,4 +97,9 @@ /** | ||
/** | ||
* The URL of a service that provides a list of environments supported by BrowserStack. | ||
*/ | ||
environmentUrl: 'https://www.browserstack.com/automate/browsers.json', | ||
get auth() { | ||
return this.username + ':' + this.accessKey; | ||
return (this.username || '') + ':' + (this.accessKey || ''); | ||
}, | ||
@@ -139,5 +144,6 @@ | ||
download: function () { | ||
var executable = pathUtil.join(this.directory, this.executable); | ||
return _super.download.apply(this, arguments).then(function () { | ||
_postDownloadFile: function (response) { | ||
var self = this; | ||
return util.decompress(response.data, this.directory).then(function () { | ||
var executable = pathUtil.join(self.directory, self.executable); | ||
fs.chmodSync(executable, parseInt('0755', 8)); | ||
@@ -259,2 +265,55 @@ }); | ||
return dfd.promise; | ||
}, | ||
/** | ||
* Attempt to normalize a BrowserStack described environment with the standard Selenium capabilities | ||
* | ||
* BrowserStack returns a list of environments that looks like: | ||
* | ||
* { | ||
* "browser": "opera", | ||
* "os_version": "Lion", | ||
* "browser_version":"12.15", | ||
* "device": null, | ||
* "os": "OS X" | ||
* } | ||
* | ||
* @param {Object} environment a BrowserStack environment descriptor | ||
* @returns a normalized descriptor | ||
* @private | ||
*/ | ||
_normalizeEnvironment: function (environment) { | ||
var platformMap = { | ||
Windows: { | ||
'10': 'WINDOWS', | ||
'8.1': 'WIN8', | ||
'8': 'WIN8', | ||
'7': 'WINDOWS', | ||
'XP': 'XP' | ||
}, | ||
'OS X': 'MAC' | ||
}; | ||
var browserMap = { | ||
ie: 'internet explorer' | ||
}; | ||
// Create the BS platform name for a given os + version | ||
var platform = platformMap[environment.os] || environment.os; | ||
if (typeof platform === 'object') { | ||
platform = platform[environment.os_version]; | ||
} | ||
return { | ||
platform: platform, | ||
platformName: environment.os, | ||
platformVersion: environment.os_version, | ||
browserName: browserMap[environment.browser] || environment.browser, | ||
browserVersion: environment.browser_version, | ||
version: environment.browser_version, | ||
descriptor: environment | ||
}; | ||
} | ||
@@ -261,0 +320,0 @@ }); |
{ | ||
"name": "digdug", | ||
"version": "1.4.1", | ||
"description": "Dig Dug. A simple abstraction library for downloading and launching WebDriver service tunnels.", | ||
"repository": { | ||
"type": "git", | ||
"url": "https://github.com/theintern/digdug.git" | ||
}, | ||
"license": "BSD-3-Clause", | ||
"dependencies": { | ||
"dojo": "2.0.0-alpha.7", | ||
"decompress": "3.0.0" | ||
}, | ||
"devDependencies": { | ||
"intern": "3.0.6" | ||
}, | ||
"scripts": { | ||
"test": "./node_modules/.bin/intern-client config=tests/intern" | ||
}, | ||
"bugs": "https://github.com/theintern/digdug/issues", | ||
"keywords": [ "javascript", "test", "functional", "selenium", "webdriver", "sauce labs", "browserstack", "testingbot" ], | ||
"homepage": "https://github.com/theintern/digdug" | ||
} | ||
"name": "digdug", | ||
"version": "1.5.0", | ||
"description": "Dig Dug. A simple abstraction library for downloading and launching WebDriver service tunnels.", | ||
"repository": { | ||
"type": "git", | ||
"url": "https://github.com/theintern/digdug.git" | ||
}, | ||
"license": "BSD-3-Clause", | ||
"dependencies": { | ||
"dojo": "2.0.0-alpha.7", | ||
"decompress": "4.0.0" | ||
}, | ||
"devDependencies": { | ||
"intern": "3.2.3" | ||
}, | ||
"scripts": { | ||
"test": "./node_modules/.bin/intern-client config=tests/intern" | ||
}, | ||
"bugs": "https://github.com/theintern/digdug/issues", | ||
"keywords": [ | ||
"javascript", | ||
"test", | ||
"functional", | ||
"selenium", | ||
"webdriver", | ||
"sauce labs", | ||
"browserstack", | ||
"testingbot" | ||
], | ||
"homepage": "https://github.com/theintern/digdug" | ||
} |
# ディグダグ | ||
[![Build Status](https://travis-ci.org/theintern/digdug.svg?branch=master)](https://travis-ci.org/theintern/digdug) | ||
[![npm version](https://badge.fury.io/js/digdug.svg)](https://badge.fury.io/js/digdug) | ||
[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/theintern/digdug.svg)](http://isitmaintained.com/project/theintern/digdug "Average time to resolve an issue") | ||
[![Percentage of issues still open](http://isitmaintained.com/badge/open/theintern/digdug.svg)](http://isitmaintained.com/project/theintern/digdug "Percentage of issues still open") | ||
Dig Dug is a simple abstraction library for downloading and launching WebDriver service tunnels and interacting with | ||
the REST APIs of these services. | ||
The following services are currently supported: | ||
Dig Dug can run a local Selenium server, and it supports the following cloud testing services: | ||
@@ -12,3 +17,2 @@ * [BrowserStack](http://www.browserstack.com) | ||
## Configuration | ||
@@ -15,0 +19,0 @@ |
@@ -36,2 +36,3 @@ /** | ||
var _super = Tunnel.prototype; | ||
SauceLabsTunnel.prototype = util.mixin(Object.create(_super), /** @lends module:digdug/SauceLabsTunnel# */ { | ||
@@ -167,4 +168,9 @@ constructor: SauceLabsTunnel, | ||
/** | ||
* The URL of a service that provides a list of environments supported by Sauce Labs. | ||
*/ | ||
environmentUrl: 'https://saucelabs.com/rest/v1/info/platforms/webdriver', | ||
get auth() { | ||
return this.username + ':' + this.accessKey; | ||
return (this.username || '') + ':' + (this.accessKey || ''); | ||
}, | ||
@@ -195,3 +201,3 @@ | ||
get isDownloaded() { | ||
return fs.existsSync(this.executable === 'java' ? | ||
return util.fileExists(this.executable === 'java' ? | ||
pathUtil.join(this.directory, 'Sauce-Connect.jar') : | ||
@@ -221,8 +227,7 @@ pathUtil.join(this.directory, this.executable) | ||
download: function () { | ||
_postDownloadFile: function (response) { | ||
var self = this; | ||
var executable = this.executable; | ||
return _super.download.apply(this, arguments).then(function () { | ||
return util.decompress(response.data, this.directory).then(function () { | ||
if (self.executable !== 'java') { | ||
fs.chmodSync(pathUtil.join(self.directory, executable), parseInt('0755', 8)); | ||
fs.chmodSync(pathUtil.join(self.directory, self.executable), parseInt('0755', 8)); | ||
} | ||
@@ -463,2 +468,60 @@ }); | ||
return child; | ||
}, | ||
/** | ||
* Attempt to normalize a SauceLabs described environment with the standard Selenium capabilities | ||
* | ||
* SauceLabs returns a list of environments that looks like: | ||
* | ||
* { | ||
* "short_version": "25", | ||
* "long_name": "Firefox", | ||
* "api_name": "firefox", | ||
* "long_version": "25.0b2.", | ||
* "latest_stable_version": "", | ||
* "automation_backend": "webdriver", | ||
* "os": "Windows 2003" | ||
* } | ||
* | ||
* @param {Object} environment a SauceLabs environment descriptor | ||
* @returns a normalized descriptor | ||
* @private | ||
*/ | ||
_normalizeEnvironment: function (environment) { | ||
var windowsMap = { | ||
'Windows 2003': 'Windows XP', | ||
'Windows 2008': 'Windows 7', | ||
'Windows 2012': 'Windows 8', | ||
'Windows 2012 R2': 'Windows 8.1', | ||
'Windows 10': 'Windows 10' | ||
}; | ||
var browserMap = { | ||
'microsoftedge': 'MicrosoftEdge' | ||
}; | ||
var os = environment.os; | ||
var platformName = os; | ||
var platformVersion; | ||
if (os.indexOf('Windows') === 0) { | ||
os = windowsMap[os] || os; | ||
platformName = 'Windows'; | ||
platformVersion = os.slice('Windows '.length); | ||
} | ||
else if (os.indexOf('Mac') === 0) { | ||
platformName = 'OS X'; | ||
platformVersion = os.slice('Mac '.length); | ||
} | ||
return { | ||
platform: platformName + (platformVersion ? ' ' + platformVersion : ''), | ||
platformName: platformName, | ||
platformVersion: platformVersion, | ||
browserName: browserMap[environment.api_name] || environment.api_name, | ||
browserVersion: environment.short_version, | ||
version: environment.short_version, | ||
descriptor: environment | ||
}; | ||
} | ||
@@ -465,0 +528,0 @@ }); |
@@ -68,3 +68,3 @@ /** | ||
url: 'http://testingbot.com/downloads/testingbot-tunnel.zip', | ||
url: 'https://testingbot.com/downloads/testingbot-tunnel.zip', | ||
@@ -103,8 +103,13 @@ /** | ||
/** | ||
* The URL of a service that provides a list of environments supported by TestingBot. | ||
*/ | ||
environmentUrl: 'https://api.testingbot.com/v1/browsers', | ||
get auth() { | ||
return this.apiKey + ':' + this.apiSecret; | ||
return (this.apiKey || '') + ':' + (this.apiSecret || ''); | ||
}, | ||
get isDownloaded() { | ||
return fs.existsSync(pathUtil.join(this.directory, 'testingbot-tunnel/testingbot-tunnel.jar')); | ||
return util.fileExists(pathUtil.join(this.directory, 'testingbot-tunnel/testingbot-tunnel.jar')); | ||
}, | ||
@@ -216,2 +221,5 @@ | ||
} | ||
else if (message.indexOf('SEVERE: ') === 0) { | ||
dfd.reject(message); | ||
} | ||
}); | ||
@@ -222,2 +230,32 @@ }) | ||
return child; | ||
}, | ||
/** | ||
* Attempt to normalize a TestingBot described environment with the standard Selenium capabilities | ||
* | ||
* TestingBot returns a list of environments that looks like: | ||
* | ||
* { | ||
* "selenium_name": "Chrome36", | ||
* "name": "googlechrome", | ||
* "platform": "CAPITAN", | ||
* "version":"36" | ||
* } | ||
* | ||
* @param {Object} environment a TestingBot environment descriptor | ||
* @returns a normalized descriptor | ||
* @private | ||
*/ | ||
_normalizeEnvironment: function (environment) { | ||
var browserMap = { | ||
googlechrome: 'chrome', | ||
iexplore: 'internet explorer' | ||
}; | ||
return { | ||
platform: environment.platform, | ||
browserName: browserMap[environment.name] || environment.name, | ||
version: environment.version, | ||
descriptor: environment | ||
}; | ||
} | ||
@@ -224,0 +262,0 @@ }); |
@@ -13,3 +13,4 @@ /* jshint dojo:true */ | ||
suites: [ | ||
'dojo/has!host-node?digdug/tests/all' | ||
'dojo/has!host-node?digdug/tests/unit/all', | ||
'dojo/has!host-node?digdug/tests/integration/all' | ||
], | ||
@@ -16,0 +17,0 @@ functionalSuites: [], |
152
Tunnel.js
@@ -5,9 +5,7 @@ /** | ||
var Decompress = require('decompress'); | ||
var Evented = require('dojo/Evented'); | ||
var fs = require('fs'); | ||
var pathUtil = require('path'); | ||
var Promise = require('dojo/Promise'); | ||
var sendRequest = require('dojo/request'); | ||
var spawnUtil = require('child_process'); | ||
var childProcess = require('child_process'); | ||
var urlUtil = require('url'); | ||
@@ -60,2 +58,3 @@ var util = require('./util'); | ||
var _super = Evented.prototype; | ||
Tunnel.prototype = util.mixin(Object.create(_super), /** @lends module:digdug/Tunnel# */ { | ||
@@ -255,3 +254,3 @@ /** | ||
get isDownloaded() { | ||
return fs.existsSync(pathUtil.join(this.directory, this.executable)); | ||
return util.fileExists(pathUtil.join(this.directory, this.executable)); | ||
}, | ||
@@ -269,2 +268,9 @@ | ||
download: function (forceDownload) { | ||
if (!forceDownload && this.isDownloaded) { | ||
return Promise.resolve(); | ||
} | ||
return this._downloadFile(this.url, this.proxy); | ||
}, | ||
_downloadFile: function (url, proxy, options) { | ||
var self = this; | ||
@@ -277,23 +283,6 @@ | ||
if (!forceDownload && self.isDownloaded) { | ||
resolve(); | ||
return; | ||
} | ||
var request = sendRequest(self.url, { proxy: self.proxy }); | ||
var request = sendRequest(url, { proxy: proxy }); | ||
request.then( | ||
function (response) { | ||
var decompressor = new Decompress(); | ||
decompressor.src(response.data) | ||
.use(Decompress.zip()) | ||
.use(Decompress.targz()) | ||
.dest(self.directory) | ||
.run(function (error) { | ||
if (error) { | ||
reject(error); | ||
} | ||
else { | ||
resolve(); | ||
} | ||
}); | ||
resolve(self._postDownloadFile(response, options)); | ||
}, | ||
@@ -306,10 +295,20 @@ function (error) { | ||
}, | ||
progress | ||
); | ||
return request; | ||
function (info) { | ||
self.emit('downloadprogress', util.mixin({}, info, { url: url })); | ||
progress(info); | ||
} | ||
).catch(function (error) { | ||
reject(error); | ||
}); | ||
}); | ||
}, | ||
/** | ||
* Called with the response after a file download has completed | ||
*/ | ||
_postDownloadFile: function (response) { | ||
return util.decompress(response.data, this.directory); | ||
}, | ||
/** | ||
* Creates the list of command-line arguments to be passed to the spawned tunnel. Implementations should | ||
@@ -359,3 +358,3 @@ * override this method to provide the appropriate command-line arguments. | ||
}); | ||
var child = spawnUtil.spawn(command, args, options); | ||
var child = childProcess.spawn(command, args, options); | ||
@@ -454,5 +453,2 @@ child.stdout.setEncoding('utf8'); | ||
.download() | ||
.then(null, null, function (progress) { | ||
self.emit('downloadprogress', progress); | ||
}) | ||
.then(function () { | ||
@@ -476,12 +472,15 @@ self._handles = []; | ||
this._startTask.then(function () { | ||
self._startTask = null; | ||
self.isStarting = false; | ||
self.isRunning = true; | ||
self.emit('status', 'Ready'); | ||
}, function (error) { | ||
self._startTask = null; | ||
self.isStarting = false; | ||
self.emit('status', error.name === 'CancelError' ? 'Start cancelled' : 'Failed to start tunnel'); | ||
}); | ||
this._startTask.then( | ||
function () { | ||
self._startTask = null; | ||
self.isStarting = false; | ||
self.isRunning = true; | ||
self.emit('status', 'Ready'); | ||
}, | ||
function (error) { | ||
self._startTask = null; | ||
self.isStarting = false; | ||
self.emit('status', error.name === 'CancelError' ? 'Start cancelled' : 'Failed to start tunnel'); | ||
} | ||
); | ||
@@ -547,12 +546,15 @@ return this._startTask; | ||
var self = this; | ||
return this._stop().then(function (returnValue) { | ||
clearHandles(self._handles); | ||
self._process = self._handles = null; | ||
self.isRunning = self.isStopping = false; | ||
return returnValue; | ||
}, function (error) { | ||
self.isRunning = true; | ||
self.isStopping = false; | ||
throw error; | ||
}); | ||
return this._stop().then( | ||
function (returnValue) { | ||
clearHandles(self._handles); | ||
self._process = self._handles = null; | ||
self.isRunning = self.isStopping = false; | ||
return returnValue; | ||
}, | ||
function (error) { | ||
self.isRunning = true; | ||
self.isStopping = false; | ||
throw error; | ||
} | ||
); | ||
}, | ||
@@ -579,2 +581,48 @@ | ||
return dfd.promise; | ||
}, | ||
/** | ||
* Get a list of environments available on the service. | ||
* | ||
* This method should be overridden and use a specific implementation that returns normalized | ||
* environments from the service. E.g. | ||
* | ||
* { | ||
* browserName: 'firefox', | ||
* version: '12', | ||
* platform: 'windows', | ||
* descriptor: { <original returned environment> } | ||
* } | ||
* | ||
* @returns An object containing the response and helper functions | ||
*/ | ||
getEnvironments: function () { | ||
if (!this.environmentUrl) { | ||
return Promise.resolve([]); | ||
} | ||
var normalizeEnvironment = this._normalizeEnvironment.bind(this); | ||
return sendRequest(this.environmentUrl, { | ||
password: this.accessKey, | ||
user: this.username, | ||
proxy: this.proxy | ||
}).then(function (response) { | ||
if (response.statusCode >= 200 && response.statusCode < 400) { | ||
return JSON.parse(response.data.toString()).map(normalizeEnvironment); | ||
} | ||
else { | ||
throw new Error('Server replied with a status of ' + response.statusCode); | ||
} | ||
}); | ||
}, | ||
/** | ||
* Normalizes a specific Tunnel environment descriptor to a general form. To be overriden by a child implementation. | ||
* @param environment an environment descriptor specific to the Tunnel | ||
* @returns a normalized environment | ||
* @protected | ||
*/ | ||
_normalizeEnvironment: function (environment) { | ||
return environment; | ||
} | ||
@@ -581,0 +629,0 @@ }); |
77
util.js
@@ -0,1 +1,6 @@ | ||
var decompress = require('decompress'); | ||
var Promise = require('dojo/Promise'); | ||
var fs = require('fs'); | ||
var path = require('path'); | ||
module.exports = { | ||
@@ -39,3 +44,75 @@ /** | ||
}; | ||
}, | ||
/** | ||
* Returns true if a file or directory exists | ||
* | ||
* @param {string} filename | ||
* @returns {bool} true if filename exists, false otherwise | ||
*/ | ||
fileExists: function (filename) { | ||
try { | ||
fs.statSync(filename); | ||
return true; | ||
} | ||
catch (error) { | ||
return false; | ||
} | ||
}, | ||
/** | ||
* Decompresses archive data into a given directory | ||
* | ||
* @param {Buffer} data | ||
* @param {string} directory | ||
* @returns {Promise.<void>} A Promise that resolves when the data is decompressed | ||
*/ | ||
decompress: function (data, directory) { | ||
return decompress(data, directory); | ||
}, | ||
/** | ||
* Writes data to a file. | ||
* | ||
* The file's parent directories will be created if they do not already exist. | ||
* | ||
* @param {Buffer} data | ||
* @param {string} filename | ||
* @returns {Promise.<void>} A Promise that resolves when the file has been written | ||
*/ | ||
writeFile: function (data, filename) { | ||
return new Promise(function (resolve, reject) { | ||
function mkdirp(dir) { | ||
if (!dir) { | ||
return; | ||
} | ||
try { | ||
fs.mkdirSync(dir); | ||
} | ||
catch (error) { | ||
// A parent directory didn't exist, create it | ||
if (error.code === 'ENOENT') { | ||
mkdirp(path.dirname(dir)); | ||
mkdirp(dir); | ||
} | ||
else { | ||
if (!fs.statSync(dir).isDirectory()) { | ||
throw error; | ||
} | ||
} | ||
} | ||
} | ||
mkdirp(path.dirname(filename)); | ||
fs.writeFile(filename, data, function (error) { | ||
if (error) { | ||
reject(error); | ||
} | ||
else { | ||
resolve(); | ||
} | ||
}); | ||
}); | ||
} | ||
}; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 6 instances in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
104833
36
2715
67
12
+ Addedbase64-js@1.5.1(transitive)
+ Addedbuffer@5.7.1(transitive)
+ Addeddecompress@4.0.0(transitive)
+ Addeddecompress-tar@4.1.1(transitive)
+ Addeddecompress-tarbz2@4.1.1(transitive)
+ Addeddecompress-targz@4.1.1(transitive)
+ Addeddecompress-unzip@4.0.1(transitive)
+ Addedfile-type@5.2.06.2.0(transitive)
+ Addedget-stream@2.3.1(transitive)
+ Addedieee754@1.2.1(transitive)
+ Addedpify@2.3.0(transitive)
+ Addedsafe-buffer@5.2.1(transitive)
+ Addedthrough@2.3.8(transitive)
+ Addedunbzip2-stream@1.4.3(transitive)
- Removedarr-diff@2.0.0(transitive)
- Removedarr-flatten@1.1.0(transitive)
- Removedarray-unique@0.2.1(transitive)
- Removedbalanced-match@1.0.2(transitive)
- Removedbrace-expansion@1.1.11(transitive)
- Removedbraces@1.8.5(transitive)
- Removedbuffer-from@1.1.2(transitive)
- Removedbuffer-to-vinyl@1.1.0(transitive)
- Removedclone@0.2.01.0.4(transitive)
- Removedclone-stats@0.0.1(transitive)
- Removedconcat-map@0.0.1(transitive)
- Removedconcat-stream@1.6.2(transitive)
- Removedconvert-source-map@1.9.0(transitive)
- Removeddecompress@3.0.0(transitive)
- Removeddecompress-tar@3.1.0(transitive)
- Removeddecompress-tarbz2@3.1.0(transitive)
- Removeddecompress-targz@3.1.0(transitive)
- Removeddecompress-unzip@3.4.0(transitive)
- Removedduplexer2@0.1.4(transitive)
- Removedduplexify@3.7.1(transitive)
- Removedexpand-brackets@0.1.5(transitive)
- Removedexpand-range@1.8.2(transitive)
- Removedextend@3.0.2(transitive)
- Removedextend-shallow@2.0.1(transitive)
- Removedextglob@0.3.2(transitive)
- Removedfilename-regex@2.0.1(transitive)
- Removedfill-range@2.2.4(transitive)
- Removedfirst-chunk-stream@1.0.0(transitive)
- Removedfor-in@1.0.2(transitive)
- Removedfor-own@0.1.5(transitive)
- Removedglob@5.0.15(transitive)
- Removedglob-base@0.3.0(transitive)
- Removedglob-parent@2.0.03.1.0(transitive)
- Removedglob-stream@5.3.5(transitive)
- Removedgraceful-fs@4.2.11(transitive)
- Removedgulp-sourcemaps@1.6.0(transitive)
- Removedinflight@1.0.6(transitive)
- Removedis-buffer@1.1.6(transitive)
- Removedis-bzip2@1.0.0(transitive)
- Removedis-dotfile@1.0.3(transitive)
- Removedis-equal-shallow@0.1.3(transitive)
- Removedis-extendable@0.1.1(transitive)
- Removedis-extglob@1.0.02.1.1(transitive)
- Removedis-glob@2.0.13.1.0(transitive)
- Removedis-gzip@1.0.0(transitive)
- Removedis-number@2.1.04.0.0(transitive)
- Removedis-posix-bracket@0.1.1(transitive)
- Removedis-primitive@2.0.0(transitive)
- Removedis-tar@1.0.0(transitive)
- Removedis-utf8@0.2.1(transitive)
- Removedis-valid-glob@0.3.0(transitive)
- Removedis-zip@1.0.0(transitive)
- Removedisarray@0.0.1(transitive)
- Removedisobject@2.1.0(transitive)
- Removedjson-stable-stringify-without-jsonify@1.0.1(transitive)
- Removedkind-of@3.2.26.0.3(transitive)
- Removedlazystream@1.0.1(transitive)
- Removedlodash.isequal@4.5.0(transitive)
- Removedmath-random@1.0.4(transitive)
- Removedmerge-stream@1.0.1(transitive)
- Removedmicromatch@2.3.11(transitive)
- Removedminimatch@3.1.2(transitive)
- Removednormalize-path@2.1.1(transitive)
- Removedobject-assign@2.1.1(transitive)
- Removedobject.omit@2.0.1(transitive)
- Removedordered-read-streams@0.3.0(transitive)
- Removedparse-glob@3.0.4(transitive)
- Removedpath-dirname@1.0.2(transitive)
- Removedpath-is-absolute@1.0.1(transitive)
- Removedpreserve@0.2.0(transitive)
- Removedrandomatic@3.1.1(transitive)
- Removedread-all-stream@3.1.0(transitive)
- Removedreadable-stream@1.0.343.6.2(transitive)
- Removedregex-cache@0.4.4(transitive)
- Removedremove-trailing-separator@1.1.0(transitive)
- Removedrepeat-element@1.1.4(transitive)
- Removedrepeat-string@1.6.1(transitive)
- Removedreplace-ext@0.0.1(transitive)
- Removedstat-mode@0.2.2(transitive)
- Removedstream-combiner2@1.1.1(transitive)
- Removedstream-shift@1.0.3(transitive)
- Removedstring_decoder@0.10.31(transitive)
- Removedstrip-bom@2.0.0(transitive)
- Removedstrip-bom-stream@1.0.0(transitive)
- Removedthrough2@0.6.52.0.54.0.2(transitive)
- Removedthrough2-filter@2.0.03.1.0(transitive)
- Removedto-absolute-glob@0.1.1(transitive)
- Removedtypedarray@0.0.6(transitive)
- Removedunique-stream@2.3.1(transitive)
- Removeduuid@2.0.3(transitive)
- Removedvali-date@1.0.0(transitive)
- Removedvinyl@0.4.61.2.0(transitive)
- Removedvinyl-assign@1.2.1(transitive)
- Removedvinyl-fs@2.4.4(transitive)
Updateddecompress@4.0.0