Comparing version 1.0.5 to 1.0.6
@@ -1,15 +0,13 @@ | ||
var childProcess = require('child_process'), | ||
Stream = require('stream').Stream, | ||
util = require('util'), | ||
which = require('which'), | ||
memoizeAsync = require('memoizeasync'); | ||
const childProcess = require('child_process'); | ||
const Stream = require('stream').Stream; | ||
const util = require('util'); | ||
const which = require('which'); | ||
const memoizeAsync = require('memoizeasync'); | ||
function JpegTran(jpegTranArgs) { | ||
Stream.call(this); | ||
Stream.call(this); | ||
this.jpegTranArgs = jpegTranArgs; | ||
this.writable = this.readable = true; | ||
this.hasEnded = false; | ||
this.jpegTranArgs = jpegTranArgs; | ||
this.writable = this.readable = true; | ||
this.hasEnded = false; | ||
} | ||
@@ -19,136 +17,156 @@ | ||
JpegTran.getBinaryPath = memoizeAsync(function (cb) { | ||
which('jpegtran', function (err, jpegTranBinaryPath) { | ||
if (err) { | ||
jpegTranBinaryPath = require('jpegtran-bin'); | ||
} | ||
if (jpegTranBinaryPath) { | ||
cb(null, jpegTranBinaryPath); | ||
} else { | ||
cb(new Error('No jpegtran binary in PATH and jpegtran-bin does not provide a pre-built binary for your architecture')); | ||
} | ||
}); | ||
JpegTran.getBinaryPath = memoizeAsync(cb => { | ||
which('jpegtran', (err, jpegTranBinaryPath) => { | ||
if (err) { | ||
jpegTranBinaryPath = require('jpegtran-bin'); | ||
} | ||
if (jpegTranBinaryPath) { | ||
cb(null, jpegTranBinaryPath); | ||
} else { | ||
cb( | ||
new Error( | ||
'No jpegtran binary in PATH and jpegtran-bin does not provide a pre-built binary for your architecture' | ||
) | ||
); | ||
} | ||
}); | ||
}); | ||
JpegTran.prototype._error = function (err) { | ||
if (!this.hasEnded) { | ||
this.hasEnded = true; | ||
this.cleanUp(); | ||
this.emit('error', err); | ||
} | ||
JpegTran.prototype._error = function(err) { | ||
if (!this.hasEnded) { | ||
this.hasEnded = true; | ||
this.cleanUp(); | ||
this.emit('error', err); | ||
} | ||
}; | ||
JpegTran.prototype.write = function (chunk) { | ||
if (this.hasEnded) { | ||
return; | ||
} | ||
if (this.jpegTranProcess) { | ||
this.jpegTranProcess.stdin.write(chunk); | ||
} else { | ||
if (!this.bufferedChunks) { | ||
this.bufferedChunks = []; | ||
JpegTran.getBinaryPath(function (err, jpegTranBinaryPath) { | ||
if (this.hasEnded) { | ||
return; | ||
} | ||
if (err) { | ||
return this._error(err); | ||
} | ||
this.commandLine = jpegTranBinaryPath + (this.jpegTranArgs ? ' ' + this.jpegTranArgs.join(' ') : ''); // For debugging | ||
this.jpegTranProcess = childProcess.spawn(jpegTranBinaryPath, this.jpegTranArgs); | ||
JpegTran.prototype.write = function(chunk) { | ||
if (this.hasEnded) { | ||
return; | ||
} | ||
if (this.jpegTranProcess) { | ||
this.jpegTranProcess.stdin.write(chunk); | ||
} else { | ||
if (!this.bufferedChunks) { | ||
this.bufferedChunks = []; | ||
JpegTran.getBinaryPath((err, jpegTranBinaryPath) => { | ||
if (this.hasEnded) { | ||
return; | ||
} | ||
if (err) { | ||
return this._error(err); | ||
} | ||
this.commandLine = | ||
jpegTranBinaryPath + | ||
(this.jpegTranArgs ? ' ' + this.jpegTranArgs.join(' ') : ''); // For debugging | ||
this.jpegTranProcess = childProcess.spawn( | ||
jpegTranBinaryPath, | ||
this.jpegTranArgs | ||
); | ||
this.seenDataOnStdout = false; | ||
this.seenDataOnStdout = false; | ||
this.jpegTranProcess.on('error', this._error.bind(this)); | ||
this.jpegTranProcess.on('error', this._error.bind(this)); | ||
// The child process might close its STDIN prematurely and emit EPIPE when the next chunk is written. | ||
// That's not necessarily an error, so prevent it from causing an exception: | ||
this.jpegTranProcess.stdin.on('error', function () {}); | ||
// The child process might close its STDIN prematurely and emit EPIPE when the next chunk is written. | ||
// That's not necessarily an error, so prevent it from causing an exception: | ||
this.jpegTranProcess.stdin.on('error', () => {}); | ||
this.jpegTranProcess.on('exit', function (exitCode) { | ||
if (exitCode > 0 && !this.hasEnded) { | ||
this._error(new Error('The jpegtran process exited with a non-zero exit code: ' + exitCode)); | ||
this.hasEnded = true; | ||
} | ||
}.bind(this)); | ||
this.jpegTranProcess.on('exit', exitCode => { | ||
if (exitCode > 0 && !this.hasEnded) { | ||
this._error( | ||
new Error( | ||
'The jpegtran process exited with a non-zero exit code: ' + | ||
exitCode | ||
) | ||
); | ||
this.hasEnded = true; | ||
} | ||
}); | ||
this.jpegTranProcess.stdout.on('data', function (chunk) { | ||
this.seenDataOnStdout = true; | ||
this.emit('data', chunk); | ||
}.bind(this)).on('end', function () { | ||
this.jpegTranProcess = null; | ||
if (!this.hasEnded) { | ||
if (this.seenDataOnStdout) { | ||
this.emit('end'); | ||
} else { | ||
this._error(new Error('JpegTran: The stdout stream ended without emitting any data')); | ||
} | ||
this.hasEnded = true; | ||
} | ||
}.bind(this)); | ||
this.jpegTranProcess.stdout | ||
.on('data', chunk => { | ||
this.seenDataOnStdout = true; | ||
this.emit('data', chunk); | ||
}) | ||
.on('end', () => { | ||
this.jpegTranProcess = null; | ||
if (!this.hasEnded) { | ||
if (this.seenDataOnStdout) { | ||
this.emit('end'); | ||
} else { | ||
this._error( | ||
new Error( | ||
'JpegTran: The stdout stream ended without emitting any data' | ||
) | ||
); | ||
} | ||
this.hasEnded = true; | ||
} | ||
}); | ||
if (this.isPaused) { | ||
this.jpegTranProcess.stdout.pause(); | ||
} | ||
if (this.isPaused) { | ||
this.jpegTranProcess.stdout.pause(); | ||
} | ||
this.bufferedChunks.forEach(function (chunk) { | ||
if (chunk === null) { | ||
this.jpegTranProcess.stdin.end(); | ||
} else { | ||
this.jpegTranProcess.stdin.write(chunk); | ||
} | ||
}, this); | ||
this.bufferedChunks = null; | ||
}.bind(this)); | ||
} | ||
this.bufferedChunks.push(chunk); | ||
this.bufferedChunks.forEach(function(chunk) { | ||
if (chunk === null) { | ||
this.jpegTranProcess.stdin.end(); | ||
} else { | ||
this.jpegTranProcess.stdin.write(chunk); | ||
} | ||
}, this); | ||
this.bufferedChunks = null; | ||
}); | ||
} | ||
this.bufferedChunks.push(chunk); | ||
} | ||
}; | ||
JpegTran.prototype.cleanUp = function () { | ||
if (this.jpegTranProcess) { | ||
this.jpegTranProcess.kill(); | ||
this.jpegTranProcess = null; | ||
} | ||
this.bufferedChunks = null; | ||
JpegTran.prototype.cleanUp = function() { | ||
if (this.jpegTranProcess) { | ||
this.jpegTranProcess.kill(); | ||
this.jpegTranProcess = null; | ||
} | ||
this.bufferedChunks = null; | ||
}; | ||
JpegTran.prototype.destroy = function () { | ||
if (!this.hasEnded) { | ||
this.hasEnded = true; | ||
this.cleanUp(); | ||
this.bufferedChunks = null; | ||
} | ||
JpegTran.prototype.destroy = function() { | ||
if (!this.hasEnded) { | ||
this.hasEnded = true; | ||
this.cleanUp(); | ||
this.bufferedChunks = null; | ||
} | ||
}; | ||
JpegTran.prototype.end = function (chunk) { | ||
if (chunk) { | ||
this.write(chunk); | ||
} | ||
if (this.jpegTranProcess) { | ||
this.jpegTranProcess.stdin.end(); | ||
JpegTran.prototype.end = function(chunk) { | ||
if (chunk) { | ||
this.write(chunk); | ||
} | ||
if (this.jpegTranProcess) { | ||
this.jpegTranProcess.stdin.end(); | ||
} else { | ||
if (this.bufferedChunks) { | ||
this.bufferedChunks.push(null); | ||
} else { | ||
if (this.bufferedChunks) { | ||
this.bufferedChunks.push(null); | ||
} else { | ||
// .end called without an argument and with no preceeding .write calls. Make sure that we do create a process in that case: | ||
this.write(new Buffer(0)); | ||
} | ||
// .end called without an argument and with no preceeding .write calls. Make sure that we do create a process in that case: | ||
this.write(new Buffer(0)); | ||
} | ||
} | ||
}; | ||
JpegTran.prototype.pause = function () { | ||
if (this.jpegTranProcess) { | ||
this.jpegTranProcess.stdout.pause(); | ||
} | ||
this.isPaused = true; | ||
JpegTran.prototype.pause = function() { | ||
if (this.jpegTranProcess) { | ||
this.jpegTranProcess.stdout.pause(); | ||
} | ||
this.isPaused = true; | ||
}; | ||
JpegTran.prototype.resume = function () { | ||
if (this.jpegTranProcess) { | ||
this.jpegTranProcess.stdout.resume(); | ||
} | ||
this.isPaused = false; | ||
JpegTran.prototype.resume = function() { | ||
if (this.jpegTranProcess) { | ||
this.jpegTranProcess.stdout.resume(); | ||
} | ||
this.isPaused = false; | ||
}; | ||
module.exports = JpegTran; |
{ | ||
"name": "jpegtran", | ||
"version": "1.0.5", | ||
"version": "1.0.6", | ||
"description": "The jpegtran utility as a readable/writable stream", | ||
@@ -10,21 +10,24 @@ "main": "lib/JpegTran.js", | ||
"dependencies": { | ||
"jpegtran-bin": "=3.0.4", | ||
"memoizeasync": "0.9.0", | ||
"which": "1.1.1" | ||
"jpegtran-bin": "^4.0.0", | ||
"memoizeasync": "^1.0.0", | ||
"which": "^1.2.14" | ||
}, | ||
"devDependencies": { | ||
"istanbul": "0.3.16", | ||
"jshint": "2.8.0", | ||
"mocha": "3.2.0", | ||
"semver": "5.1.0", | ||
"sinon": "1.17.3", | ||
"unexpected": "10.11.1", | ||
"unexpected-sinon": "10.2.0", | ||
"unexpected-stream": "2.0.3" | ||
"eslint": "^5.7.0", | ||
"eslint-config-pretty-standard": "^2.0.0", | ||
"eslint-plugin-prettier": "^3.0.0", | ||
"mocha": "^6.0.0", | ||
"nyc": "^13.1.0", | ||
"prettier": "^1.14.3", | ||
"semver": "^5.3.0", | ||
"sinon": "^7.0.0", | ||
"unexpected": "^11.0.0", | ||
"unexpected-sinon": "^10.7.1", | ||
"unexpected-stream": "^3.0.0" | ||
}, | ||
"scripts": { | ||
"lint": "jshint .", | ||
"test": "mocha && npm run lint", | ||
"travis": "npm test && npm run coverage && (<coverage/lcov.info coveralls || true)", | ||
"coverage": "NODE_ENV=development istanbul cover _mocha -- --reporter dot && echo google-chrome coverage/lcov-report/index.html" | ||
"lint": "eslint .", | ||
"test": "mocha", | ||
"ci": "npm test && npm run lint && npm run coverage", | ||
"coverage": "NODE_ENV=development nyc --reporter=lcov --reporter=text --all -- npm test && echo google-chrome coverage/lcov-report/index.html" | ||
}, | ||
@@ -46,4 +49,9 @@ "repository": { | ||
], | ||
"author": "Andreas Lind <andreas@one.com>", | ||
"license": "BSD-3-Clause" | ||
"author": "Andreas Lind <andreaslindpetersen@gmail.com>", | ||
"license": "BSD-3-Clause", | ||
"nyc": { | ||
"include": [ | ||
"lib/**" | ||
] | ||
} | ||
} |
/*global describe, it, __dirname, setTimeout*/ | ||
var expect = require('unexpected').clone() | ||
.use(require('unexpected-stream')) | ||
.use(require('unexpected-sinon')); | ||
var sinon = require('sinon'); | ||
var JpegTran = require('../lib/JpegTran'); | ||
var Path = require('path'); | ||
var fs = require('fs'); | ||
var semver = require('semver'); | ||
const expect = require('unexpected') | ||
.clone() | ||
.use(require('unexpected-stream')) | ||
.use(require('unexpected-sinon')); | ||
const sinon = require('sinon'); | ||
const JpegTran = require('../lib/JpegTran'); | ||
const Path = require('path'); | ||
const fs = require('fs'); | ||
const semver = require('semver'); | ||
it.skipIf = function (condition) { | ||
(condition ? it.skip : it).apply(it, Array.prototype.slice.call(arguments, 1)); | ||
it.skipIf = function(condition) { | ||
(condition ? it.skip : it).apply( | ||
it, | ||
Array.prototype.slice.call(arguments, 1) | ||
); | ||
}; | ||
describe('JpegTran', function () { | ||
it('should produce a smaller file when run with -grayscale', function () { | ||
return expect( | ||
fs.createReadStream(Path.resolve(__dirname, 'turtle.jpg')), | ||
'when piped through', | ||
new JpegTran(['-grayscale']), | ||
'to yield output satisfying', | ||
function (resultJpegBuffer) { | ||
expect(resultJpegBuffer.length, 'to be within', 0, 105836); | ||
} | ||
); | ||
}); | ||
describe('JpegTran', () => { | ||
it('should produce a smaller file when run with -grayscale', () => | ||
expect( | ||
fs.createReadStream(Path.resolve(__dirname, 'turtle.jpg')), | ||
'when piped through', | ||
new JpegTran(['-grayscale']), | ||
'to yield output satisfying', | ||
expect.it(resultJpegBuffer => { | ||
expect(resultJpegBuffer.length, 'to be within', 0, 105836); | ||
}) | ||
)); | ||
it.skipIf(semver.satisfies(process.version.replace(/^v/, ''), '>=0.12.0'), 'should not emit data events while paused', function (done) { | ||
var jpegTran = new JpegTran(['-grayscale']); | ||
it.skipIf( | ||
semver.satisfies(process.version.replace(/^v/, ''), '>=0.12.0'), | ||
'should not emit data events while paused', | ||
done => { | ||
const jpegTran = new JpegTran(['-grayscale']); | ||
function fail() { | ||
done(new Error('JpegTran emitted data while it was paused!')); | ||
} | ||
jpegTran.pause(); | ||
jpegTran.on('data', fail).on('error', done); | ||
function fail() { | ||
done(new Error('JpegTran emitted data while it was paused!')); | ||
} | ||
jpegTran.pause(); | ||
jpegTran.on('data', fail).on('error', done); | ||
fs.createReadStream(Path.resolve(__dirname, 'turtle.jpg')).pipe(jpegTran); | ||
fs.createReadStream(Path.resolve(__dirname, 'turtle.jpg')).pipe(jpegTran); | ||
setTimeout(function () { | ||
jpegTran.removeListener('data', fail); | ||
var chunks = []; | ||
setTimeout(() => { | ||
jpegTran.removeListener('data', fail); | ||
const chunks = []; | ||
jpegTran | ||
.on('data', function (chunk) { | ||
chunks.push(chunk); | ||
}) | ||
.on('end', function () { | ||
expect(Buffer.concat(chunks).length, 'to be within', 0, 105836); | ||
done(); | ||
}); | ||
jpegTran | ||
.on('data', chunk => { | ||
chunks.push(chunk); | ||
}) | ||
.on('end', () => { | ||
expect(Buffer.concat(chunks).length, 'to be within', 0, 105836); | ||
done(); | ||
}); | ||
jpegTran.resume(); | ||
}, 1000); | ||
}); | ||
jpegTran.resume(); | ||
}, 1000); | ||
} | ||
); | ||
it('should emit an error if an invalid image is processed', function (done) { | ||
var jpegTran = new JpegTran(); | ||
jpegTran.on('error', function (err) { | ||
done(); | ||
}).on('data', function (chunk) { | ||
done(new Error('JpegTran emitted data when an error was expected')); | ||
}).on('end', function (chunk) { | ||
done(new Error('JpegTran emitted end when an error was expected')); | ||
}); | ||
it('should emit an error if an invalid image is processed', done => { | ||
const jpegTran = new JpegTran(); | ||
jpegTran | ||
.on('error', err => { | ||
done(); | ||
}) | ||
.on('data', chunk => { | ||
done(new Error('JpegTran emitted data when an error was expected')); | ||
}) | ||
.on('end', chunk => { | ||
done(new Error('JpegTran emitted end when an error was expected')); | ||
}); | ||
jpegTran.end(new Buffer('qwvopeqwovkqvwiejvq', 'utf-8')); | ||
}); | ||
jpegTran.end(Buffer.from('qwvopeqwovkqvwiejvq', 'utf-8')); | ||
}); | ||
it('should emit a single error if an invalid command line is specified', function (done) { | ||
var jpegTran = new JpegTran(['-optimize', 'qcwecqweqbar']), | ||
seenError = false; | ||
jpegTran.on('error', function (err) { | ||
if (seenError) { | ||
done(new Error('More than one error event was emitted')); | ||
} else { | ||
seenError = true; | ||
setTimeout(done, 100); | ||
} | ||
}).on('data', function (chunk) { | ||
done(new Error('JpegTran emitted data when an error was expected')); | ||
}).on('end', function (chunk) { | ||
done(new Error('JpegTran emitted end when an error was expected')); | ||
}); | ||
it('should emit a single error if an invalid command line is specified', done => { | ||
const jpegTran = new JpegTran(['-optimize', 'qcwecqweqbar']); | ||
jpegTran.end(new Buffer('qwvopeqwovkqvwiejvq', 'utf-8')); | ||
}); | ||
let seenError = false; | ||
jpegTran | ||
.on('error', err => { | ||
if (seenError) { | ||
done(new Error('More than one error event was emitted')); | ||
} else { | ||
seenError = true; | ||
setTimeout(done, 100); | ||
} | ||
}) | ||
.on('data', chunk => { | ||
done(new Error('JpegTran emitted data when an error was expected')); | ||
}) | ||
.on('end', chunk => { | ||
done(new Error('JpegTran emitted end when an error was expected')); | ||
}); | ||
describe('#destroy', function () { | ||
it('should kill the underlying child process', function () { | ||
var jpegTran = new JpegTran(['-grayscale']); | ||
jpegTran.end(Buffer.from('qwvopeqwovkqvwiejvq', 'utf-8')); | ||
}); | ||
return expect.promise(function (run) { | ||
jpegTran.write('JFIF'); | ||
setTimeout(run(function waitForJpegTranProcess() { | ||
var jpegTranProcess = jpegTran.jpegTranProcess; | ||
if (jpegTran.jpegTranProcess) { | ||
sinon.spy(jpegTranProcess, 'kill'); | ||
jpegTran.destroy(); | ||
sinon.spy(jpegTran, 'emit'); | ||
expect(jpegTranProcess.kill, 'to have calls satisfying', function () { | ||
jpegTranProcess.kill(); | ||
}); | ||
expect(jpegTran.jpegTranProcess, 'to be falsy'); | ||
expect(jpegTran.bufferedChunks, 'to be falsy'); | ||
setTimeout(run(function () { | ||
expect(jpegTran.emit, 'to have calls satisfying', []); | ||
}), 10); | ||
} else { | ||
setTimeout(run(waitForJpegTranProcess), 0); | ||
} | ||
}), 0); | ||
}); | ||
}); | ||
describe('#destroy', () => { | ||
it('should kill the underlying child process', () => { | ||
const jpegTran = new JpegTran(['-grayscale']); | ||
return expect.promise(run => { | ||
jpegTran.write('JFIF'); | ||
setTimeout( | ||
run(function waitForJpegTranProcess() { | ||
const jpegTranProcess = jpegTran.jpegTranProcess; | ||
if (jpegTran.jpegTranProcess) { | ||
sinon.spy(jpegTranProcess, 'kill'); | ||
jpegTran.destroy(); | ||
sinon.spy(jpegTran, 'emit'); | ||
expect(jpegTranProcess.kill, 'to have calls satisfying', () => { | ||
jpegTranProcess.kill(); | ||
}); | ||
expect(jpegTran.jpegTranProcess, 'to be falsy'); | ||
expect(jpegTran.bufferedChunks, 'to be falsy'); | ||
setTimeout( | ||
run(() => { | ||
expect(jpegTran.emit, 'to have calls satisfying', []); | ||
}), | ||
10 | ||
); | ||
} else { | ||
setTimeout(run(waitForJpegTranProcess), 0); | ||
} | ||
}), | ||
0 | ||
); | ||
}); | ||
}); | ||
}); | ||
}); |
Sorry, the diff of this file is not supported yet
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
125071
11
14
285
2
+ Added@sindresorhus/is@0.7.0(transitive)
+ Addedansi-regex@2.1.1(transitive)
+ Addedansi-styles@2.2.1(transitive)
+ Addedarch@2.2.0(transitive)
+ Addedarchive-type@4.0.0(transitive)
+ Addedarray-find-index@1.0.2(transitive)
+ Addedbase64-js@1.5.1(transitive)
+ Addedbin-build@3.0.0(transitive)
+ Addedbin-check@4.1.0(transitive)
+ Addedbin-version@3.1.0(transitive)
+ Addedbin-version-check@4.0.0(transitive)
+ Addedbin-wrapper@4.1.0(transitive)
+ Addedbl@1.2.3(transitive)
+ Addedbuffer@5.7.1(transitive)
+ Addedbuffer-alloc@1.2.0(transitive)
+ Addedbuffer-alloc-unsafe@1.1.0(transitive)
+ Addedbuffer-crc32@0.2.13(transitive)
+ Addedbuffer-fill@1.0.0(transitive)
+ Addedcacheable-request@2.1.4(transitive)
+ Addedcamelcase@2.1.1(transitive)
+ Addedcamelcase-keys@2.1.0(transitive)
+ Addedcaw@2.0.1(transitive)
+ Addedchalk@1.1.3(transitive)
+ Addedclone-response@1.0.2(transitive)
+ Addedcommander@2.20.3(transitive)
+ Addedconfig-chain@1.1.13(transitive)
+ Addedconsole-stream@0.1.1(transitive)
+ Addedcontent-disposition@0.5.4(transitive)
+ Addedcore-util-is@1.0.3(transitive)
+ Addedcross-spawn@5.1.06.0.6(transitive)
+ Addedcurrently-unhandled@0.4.1(transitive)
+ Addeddecamelize@1.2.0(transitive)
+ Addeddecode-uri-component@0.2.2(transitive)
+ Addeddecompress@4.2.1(transitive)
+ Addeddecompress-response@3.3.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)
+ Addeddownload@6.2.57.1.0(transitive)
+ Addedduplexer3@0.1.5(transitive)
+ Addedend-of-stream@1.4.4(transitive)
+ Addederror-ex@1.3.2(transitive)
+ Addedescape-string-regexp@1.0.5(transitive)
+ Addedexeca@0.7.01.0.0(transitive)
+ Addedexecutable@4.1.1(transitive)
+ Addedext-list@2.2.2(transitive)
+ Addedext-name@5.0.0(transitive)
+ Addedfd-slicer@1.1.0(transitive)
+ Addedfigures@1.7.0(transitive)
+ Addedfile-type@3.9.04.4.05.2.06.2.08.1.0(transitive)
+ Addedfilename-reserved-regex@2.0.0(transitive)
+ Addedfilenamify@2.1.0(transitive)
+ Addedfind-up@1.1.2(transitive)
+ Addedfind-versions@3.2.0(transitive)
+ Addedfrom2@2.3.0(transitive)
+ Addedfs-constants@1.0.0(transitive)
+ Addedfunction-bind@1.1.2(transitive)
+ Addedget-proxy@2.1.0(transitive)
+ Addedget-stdin@4.0.1(transitive)
+ Addedget-stream@2.3.13.0.04.1.0(transitive)
+ Addedgot@7.1.08.3.2(transitive)
+ Addedgraceful-fs@4.2.11(transitive)
+ Addedhas-ansi@2.0.0(transitive)
+ Addedhas-symbol-support-x@1.4.2(transitive)
+ Addedhas-to-string-tag-x@1.4.1(transitive)
+ Addedhasown@2.0.2(transitive)
+ Addedhosted-git-info@2.8.9(transitive)
+ Addedhttp-cache-semantics@3.8.1(transitive)
+ Addedieee754@1.2.1(transitive)
+ Addedimport-lazy@3.1.0(transitive)
+ Addedindent-string@2.1.0(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedini@1.3.8(transitive)
+ Addedinto-stream@3.1.0(transitive)
+ Addedis-arrayish@0.2.1(transitive)
+ Addedis-core-module@2.16.1(transitive)
+ Addedis-finite@1.1.0(transitive)
+ Addedis-natural-number@4.0.1(transitive)
+ Addedis-object@1.0.2(transitive)
+ Addedis-plain-obj@1.1.0(transitive)
+ Addedis-retry-allowed@1.2.0(transitive)
+ Addedis-stream@1.1.0(transitive)
+ Addedis-utf8@0.2.1(transitive)
+ Addedisarray@1.0.0(transitive)
+ Addedisexe@2.0.0(transitive)
+ Addedisurl@1.0.0(transitive)
+ Addedjpegtran-bin@4.0.0(transitive)
+ Addedjson-buffer@3.0.0(transitive)
+ Addedkeyv@3.0.0(transitive)
+ Addedload-json-file@1.1.0(transitive)
+ Addedlogalot@2.1.0(transitive)
+ Addedlongest@1.0.1(transitive)
+ Addedloud-rejection@1.6.0(transitive)
+ Addedlowercase-keys@1.0.01.0.1(transitive)
+ Addedlpad-align@1.1.2(transitive)
+ Addedlru-cache@4.1.5(transitive)
+ Addedmake-dir@1.3.0(transitive)
+ Addedmap-obj@1.0.1(transitive)
+ Addedmemoizeasync@1.1.0(transitive)
+ Addedmeow@3.7.0(transitive)
+ Addedmime-db@1.53.0(transitive)
+ Addedmimic-response@1.0.1(transitive)
+ Addedminimist@1.2.8(transitive)
+ Addednice-try@1.0.5(transitive)
+ Addednormalize-package-data@2.5.0(transitive)
+ Addednormalize-url@2.0.1(transitive)
+ Addednpm-conf@1.1.3(transitive)
+ Addednpm-run-path@2.0.2(transitive)
+ Addedobject-assign@4.1.1(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedos-filter-obj@2.0.0(transitive)
+ Addedp-cancelable@0.3.00.4.1(transitive)
+ Addedp-event@1.3.02.3.1(transitive)
+ Addedp-finally@1.0.0(transitive)
+ Addedp-is-promise@1.1.0(transitive)
+ Addedp-map-series@1.0.0(transitive)
+ Addedp-reduce@1.0.0(transitive)
+ Addedp-timeout@1.2.12.0.1(transitive)
+ Addedparse-json@2.2.0(transitive)
+ Addedpath-exists@2.1.0(transitive)
+ Addedpath-key@2.0.1(transitive)
+ Addedpath-parse@1.0.7(transitive)
+ Addedpath-type@1.1.0(transitive)
+ Addedpend@1.2.0(transitive)
+ Addedpify@2.3.03.0.0(transitive)
+ Addedpinkie@2.0.4(transitive)
+ Addedpinkie-promise@2.0.1(transitive)
+ Addedprepend-http@1.0.42.0.0(transitive)
+ Addedprocess-nextick-args@2.0.1(transitive)
+ Addedproto-list@1.2.4(transitive)
+ Addedpseudomap@1.0.2(transitive)
+ Addedpump@3.0.2(transitive)
+ Addedquery-string@5.1.1(transitive)
+ Addedread-pkg@1.1.0(transitive)
+ Addedread-pkg-up@1.0.1(transitive)
+ Addedreadable-stream@2.3.8(transitive)
+ Addedredent@1.0.0(transitive)
+ Addedrepeating@2.0.1(transitive)
+ Addedresolve@1.22.10(transitive)
+ Addedresponselike@1.0.2(transitive)
+ Addedsafe-buffer@5.1.25.2.1(transitive)
+ Addedseek-bzip@1.0.6(transitive)
+ Addedsemver@5.7.2(transitive)
+ Addedsemver-regex@2.0.0(transitive)
+ Addedsemver-truncate@1.1.2(transitive)
+ Addedshebang-command@1.2.0(transitive)
+ Addedshebang-regex@1.0.0(transitive)
+ Addedsignal-exit@3.0.7(transitive)
+ Addedsort-keys@1.1.22.0.0(transitive)
+ Addedsort-keys-length@1.0.1(transitive)
+ Addedspdx-correct@3.2.0(transitive)
+ Addedspdx-exceptions@2.5.0(transitive)
+ Addedspdx-expression-parse@3.0.1(transitive)
+ Addedspdx-license-ids@3.0.21(transitive)
+ Addedsqueak@1.3.0(transitive)
+ Addedstrict-uri-encode@1.1.0(transitive)
+ Addedstring_decoder@1.1.1(transitive)
+ Addedstrip-ansi@3.0.1(transitive)
+ Addedstrip-bom@2.0.0(transitive)
+ Addedstrip-dirs@2.1.0(transitive)
+ Addedstrip-eof@1.0.0(transitive)
+ Addedstrip-indent@1.0.1(transitive)
+ Addedstrip-outer@1.0.1(transitive)
+ Addedsupports-color@2.0.0(transitive)
+ Addedsupports-preserve-symlinks-flag@1.0.0(transitive)
+ Addedtar-stream@1.6.2(transitive)
+ Addedtemp-dir@1.0.0(transitive)
+ Addedtempfile@2.0.0(transitive)
+ Addedthrough@2.3.8(transitive)
+ Addedtimed-out@4.0.1(transitive)
+ Addedto-buffer@1.1.1(transitive)
+ Addedtrim-newlines@1.0.0(transitive)
+ Addedtrim-repeated@1.0.0(transitive)
+ Addedtunnel-agent@0.6.0(transitive)
+ Addedunbzip2-stream@1.4.3(transitive)
+ Addedurl-parse-lax@1.0.03.0.0(transitive)
+ Addedurl-to-options@1.0.1(transitive)
+ Addedutil-deprecate@1.0.2(transitive)
+ Addeduuid@3.4.0(transitive)
+ Addedvalidate-npm-package-license@3.0.4(transitive)
+ Addedwhich@1.3.1(transitive)
+ Addedwrappy@1.0.2(transitive)
+ Addedxtend@4.0.2(transitive)
+ Addedyallist@2.1.2(transitive)
+ Addedyauzl@2.10.0(transitive)
- Removedis-absolute@0.1.7(transitive)
- Removedis-relative@0.1.3(transitive)
- Removedmemoizeasync@0.9.0(transitive)
- Removedwhich@1.1.1(transitive)
Updatedjpegtran-bin@^4.0.0
Updatedmemoizeasync@^1.0.0
Updatedwhich@^1.2.14