Comparing version 0.1.3 to 0.2.4
304
index.js
@@ -0,249 +1,123 @@ | ||
'use strict'; | ||
var pipeline = require('multipipe'); | ||
var spawn = require('win-spawn'); | ||
var through = require('through2'); | ||
/** | ||
* 代码修改自grunt-img | ||
* Initialize `Imagemin` with options | ||
* | ||
* @param {Object} opts | ||
* @api private | ||
*/ | ||
'use strict'; | ||
var fs = require('fs'); | ||
var path = require('path'); | ||
var child_process = require('child_process'); | ||
var spawn = child_process.spawn; | ||
//非系统模块 | ||
var which = require('which'); | ||
var log = require('./lib/log'); | ||
var pngcrush = require('node-pngcrush'); | ||
var emptyFn = function() {}; | ||
function Imagemin(opts) { | ||
opts = opts || {}; | ||
this.opts = opts; | ||
this.optimizer = this._getOptimizer(opts.ext); | ||
this.optimizationLevel = opts.optimizationLevel || 7; | ||
} | ||
var win32 = process.platform === 'win32'; | ||
var png = ['.png', '.bmp', '.gif', '.pnm', '.tiff'], | ||
jpegs = ['.jpg', 'jpeg']; | ||
var imagemin = module.exports = function(dir, destDir, cb) { | ||
destDir = destDir || ''; | ||
if (typeof destDir === 'function') { | ||
cb = destDir; | ||
} | ||
if (typeof cb !== 'function') { | ||
cb = emptyFn; | ||
} | ||
/** | ||
* Optimize GIF, JPEG, and PNG images | ||
* | ||
* @api public | ||
*/ | ||
Imagemin.prototype.optimize = function () { | ||
var cp = this.optimizer(); | ||
var stream = through(); | ||
var files = []; | ||
if (Array.isArray(dir)) { | ||
dir.forEach(function(v) { | ||
imagemin(v, destDir, cb); | ||
}); | ||
return; | ||
} | ||
return pipeline(stream, cp.stdin, cp.stdout); | ||
}; | ||
if (fs.statSync(dir).isDirectory()) { | ||
//遍历目录 | ||
recurse(dir, function(filepath, rootdir, subdir, filename) { | ||
files.push(filepath); | ||
}); | ||
} else { | ||
//是文件 | ||
files.push(dir); | ||
} | ||
/** | ||
* Get the optimizer for a desired file extension | ||
* | ||
* @param {String} ext | ||
* @api private | ||
*/ | ||
var pngfiles = files.filter(function(file) { | ||
return !!~png.indexOf(path.extname(file).toLowerCase()); | ||
}); | ||
Imagemin.prototype._getOptimizer = function (ext) { | ||
ext = ext ? ext.toLowerCase() : null; | ||
var jpgfiles = files.filter(function(file) { | ||
return !!~jpegs.indexOf(path.extname(file).toLowerCase()); | ||
}); | ||
var optimizers = { | ||
'.gif': this._optimizeGif, | ||
'.jpg': this._optimizeJpeg, | ||
'.jpeg': this._optimizeJpeg, | ||
'.png': this._optimizePng | ||
}; | ||
log.writeln('Running imagemin task... '); | ||
pngc(pngfiles, destDir, function() { | ||
jpegtran(jpgfiles, {}, destDir, function(err) { | ||
if (err) { | ||
log.error(err); | ||
} | ||
cb(); | ||
}); | ||
}); | ||
return optimizers[ext]; | ||
}; | ||
function pngc(files, output, cb) { | ||
cb = cb || emptyFn; | ||
if (!files.length) { | ||
return cb(); | ||
} | ||
/** | ||
* Optimize a GIF image | ||
* | ||
* @api private | ||
*/ | ||
var isOutDir = false; | ||
if (output) { | ||
var ext = path.extname(output).toLowerCase(); | ||
if ( !! ~png.indexOf(ext)) { | ||
//文件 | ||
Imagemin.prototype._optimizeGif = function () { | ||
var args = ['-w']; | ||
var gifsicle = require('gifsicle').path; | ||
} else { | ||
if (!/\/$/.test(output)) { | ||
output += path.sep; | ||
} | ||
if (!fs.existsSync(output)) { | ||
output = ''; | ||
} | ||
//目录 | ||
isOutDir = true; | ||
} | ||
if (this.opts.interlaced) { | ||
args.push('--interlace'); | ||
} | ||
var file; | ||
while (file = files.shift()) { | ||
var data = fs.readFileSync(file); | ||
var buffer = pngcrush.compress(data); | ||
log.writeln('*Processing: '.cyan + path.normalize(file)); | ||
var outfile = file; | ||
var min = file, | ||
max = file; | ||
if (output !== '') { | ||
outfile = isOutDir ? output + path.basename(file) : output; | ||
min = outfile; | ||
} else { | ||
min = { | ||
size: buffer.length | ||
}; | ||
max = { | ||
size: data.length | ||
}; | ||
} | ||
log.writeln('Output file: '.cyan + path.normalize(outfile)); | ||
fs.writeFileSync(outfile, buffer, { | ||
flags: 'wb' | ||
}); | ||
min_max_stat(min, max); | ||
} | ||
cb(); | ||
} | ||
function jpegtran(files, opts, output, cb) { | ||
opts = opts || {}; | ||
cb = cb || function() {}; | ||
opts.args = opts.args ? opts.args : ['-copy', 'none', '-optimize', '-outfile', 'jpgtmp.jpg']; | ||
return spawn(gifsicle, args); | ||
}; | ||
which_bin('jpegtran', function(err, cmdpath) { | ||
if (err) return not_installed('jpegtran', cb); | ||
(function run(file) { | ||
if (!file) return cb(); | ||
/** | ||
* Optimize a JPEG image | ||
* | ||
* @api private | ||
*/ | ||
log.writeln('*Processing: '.cyan + path.normalize(file)); | ||
Imagemin.prototype._optimizeJpeg = function () { | ||
var args = ['-copy', 'none', '-optimize']; | ||
var jpegtran = require('jpegtran-bin').path; | ||
var jpegtran = spawn(cmdpath, opts.args.concat(file), function() {}); | ||
if (this.opts.progressive) { | ||
args.push('-progressive'); | ||
} | ||
var outputPath; | ||
if (output) { | ||
var ext = path.extname(output).toLowerCase(); | ||
if ( !! ~jpegs.indexOf(ext)) { | ||
//文件 | ||
outputPath = output; | ||
} else { | ||
if (!/\/$/.test(output)) { | ||
output += path.sep; | ||
} | ||
outputPath = output + path.basename(file); | ||
} | ||
try { | ||
fs.readFileSync(outputPath); | ||
} catch (err) { | ||
fs.writeFileSync(outputPath); | ||
} | ||
log.writeln('Output file: '.cyan + path.normalize(outputPath)); | ||
} else { | ||
outputPath = file; | ||
} | ||
jpegtran.stdout.pipe(process.stdout); | ||
jpegtran.stderr.pipe(process.stderr); | ||
jpegtran.on('exit', function(code) { | ||
if (code) return log.warn('jpgtran exited unexpectedly with exit code ' + code); | ||
// output some size info about the file | ||
min_max_stat('jpgtmp.jpg', file); | ||
// copy the temporary optimized jpg to original file | ||
fs.createReadStream('jpgtmp.jpg') | ||
.pipe(fs.createWriteStream(outputPath)).on('close', function() { | ||
//删除 | ||
fs.unlinkSync('jpgtmp.jpg'); | ||
run(files.shift()); | ||
}); | ||
}); | ||
}(files.shift())); | ||
}); | ||
return spawn(jpegtran, args); | ||
}; | ||
/** | ||
* Optimize a PNG image | ||
* | ||
* @api private | ||
*/ | ||
// Output some size info about a file, from a stat object. | ||
Imagemin.prototype._optimizePng = function () { | ||
var args = ['-strip', 'all', '-quiet']; | ||
var optipng = require('optipng-bin').path; | ||
var pngquant; | ||
function min_max_stat(min, max) { | ||
min = typeof min === 'string' ? fs.statSync(min) : min; | ||
max = typeof max === 'string' ? fs.statSync(max) : max; | ||
log.writeln('Uncompressed size: ' + String(max.size).green + ' bytes.'); | ||
log.writeln('Compressed size: ' + String(min.size).green + ' bytes (' + String(max.size - min.size).green + ' bytes = ' + (String((max.size - min.size) / max.size * 100).slice(0, 5) + '%').green + ' decrease).'); | ||
if (typeof this.optimizationLevel === 'number') { | ||
args.push('-o', this.optimizationLevel); | ||
} | ||
}; | ||
if (this.opts.pngquant) { | ||
pngquant = require('pngquant-bin').path; | ||
return spawn(optipng, args).stdout.pipe(spawn(pngquant, ['-'])); | ||
} | ||
function not_installed(cmd, cb) { | ||
log.log('[Running ' + cmd + '...](error)'); | ||
log.writeln([ | ||
'In order for this task to work properly, :cmd must be', | ||
'installed and in the system PATH (if you can run ":cmd" at', | ||
'the command line, this task should work)' | ||
].join(' ').replace(/:cmd/g, cmd)); | ||
log.writeln('Skiping ' + cmd + ' task'); | ||
if (cb) cb(); | ||
return spawn(optipng, args); | ||
}; | ||
var unixifyPath = function(filepath) { | ||
if (win32) { | ||
return filepath.replace(/\\/g, '/'); | ||
} else { | ||
return filepath; | ||
} | ||
}; | ||
/** | ||
* 遍历 | ||
* @param {[type]} rootdir [description] | ||
* @param {Function} callback [description] | ||
* @param {[type]} subdir [description] | ||
* @param {[type]} judgeFunction [description] | ||
* @return {[type]} [description] | ||
* Module exports | ||
*/ | ||
function recurse(rootdir, callback, subdir, judgeFunction) { | ||
var abspath = subdir ? path.join(rootdir, subdir) : rootdir; | ||
subdir = subdir || ''; | ||
judgeFunction = typeof judgeFunction === 'function' ? judgeFunction : function() { | ||
return true; | ||
}; | ||
fs.readdirSync(abspath).forEach(function(filename) { | ||
var filepath = path.join(abspath, filename); | ||
if (fs.statSync(filepath).isDirectory() && judgeFunction(filename)) { | ||
recurse(rootdir, callback, unixifyPath(path.join(subdir, filename)), judgeFunction); | ||
} else { | ||
judgeFunction(filename) && callback(unixifyPath(filepath), rootdir, subdir, filename, judgeFunction); | ||
} | ||
}); | ||
module.exports = function (opts) { | ||
var imagemin = new Imagemin(opts); | ||
} | ||
// **which** helper, wrapper to isaacs/which package plus some fallback logic | ||
// specifically for the win32 binaries in vendor/ (optipng.exe, jpegtran.exe) | ||
function which_bin(cmd, cb) { | ||
if (!win32 || !/optipng|jpegtran/.test(cmd)) return which(cmd, cb); | ||
var jpegtran = './vendor/jpegtran-turbo/win32/jpegtran.exe'; | ||
if (process.arch === 'x64') { | ||
jpegtran = './vendor/jpegtran-turbo/win64/jpegtran.exe'; | ||
if (!imagemin.optimizer) { | ||
return through(); | ||
} | ||
var cmdpath = cmd === 'optipng' ? './vendor/optipng-0.7.4-win32/optipng.exe' : | ||
jpegtran; | ||
cb(null, path.join(__dirname, cmdpath)); | ||
}; | ||
return imagemin.optimize(); | ||
}; |
{ | ||
"name": "imagemin", | ||
"version": "0.1.3", | ||
"description": "A tool to optimize png and jpg images with optipng & jpegtran", | ||
"keywords": [ | ||
"png", | ||
"jpg", | ||
"image optimizer", | ||
"compress image", | ||
"image", | ||
"web performance" | ||
], | ||
"homepage": "https://github.com/ksky521/imagemin", | ||
"bugs": "https://github.com/ksky521/imagemin/issues", | ||
"author": { | ||
"name": "Theowang", | ||
"email": "ksky521@gmail.com", | ||
"url": "http://js.in" | ||
}, | ||
"main": "index.js", | ||
"bin": { | ||
"imagemin": "bin/imagemin" | ||
}, | ||
"repository": { | ||
"type": "git", | ||
"url": "git://github.com/ksky521/imagemin.git" | ||
}, | ||
"dependencies": { | ||
"colors": "~0.6.2", | ||
"which": "~1.0.5", | ||
"optimist": "~0.6.0", | ||
"node-pngcrush": "~0.0.9", | ||
"read": "~1.0.4" | ||
}, | ||
"scripts": { | ||
"install": "node ./bin/install", | ||
"uninstall": "node ./bin/uninstall" | ||
}, | ||
"engines": { | ||
"node": ">=0.6.0" | ||
}, | ||
"licenses": { | ||
"type": "MIT" | ||
} | ||
} | ||
"name": "imagemin", | ||
"version": "0.2.4", | ||
"description": "Minify GIF, JPEG and PNG images", | ||
"license": "MIT", | ||
"repository": "kevva/image-min", | ||
"author": { | ||
"name": "Kevin Mårtensson", | ||
"email": "kevinmartensson@gmail.com", | ||
"url": "https://github.com/kevva" | ||
}, | ||
"engines": { | ||
"node": ">=0.10.0" | ||
}, | ||
"scripts": { | ||
"test": "mocha --reporter list --timeout 500000" | ||
}, | ||
"files": [ | ||
"index.js" | ||
], | ||
"keywords": [ | ||
"extract", | ||
"tar", | ||
"tar.gz", | ||
"zip" | ||
], | ||
"dependencies": { | ||
"multipipe": "0.0.2", | ||
"through2": "^0.4.0", | ||
"win-spawn": "^2.0.0" | ||
}, | ||
"devDependencies": { | ||
"mocha": "^1.17.1", | ||
"rimraf": "^2.2.6" | ||
}, | ||
"optionalDependencies": { | ||
"gifsicle": "^0.1.0", | ||
"jpegtran-bin": "^0.2.0", | ||
"optipng-bin": "^0.3.2", | ||
"pngquant-bin": "^0.1.6" | ||
} | ||
} |
100
README.md
@@ -1,54 +0,70 @@ | ||
imagemin | ||
============= | ||
# image-min [![Build Status](https://secure.travis-ci.org/kevva/image-min.png?branch=master)](http://travis-ci.org/kevva/image-min) | ||
A tool which fork from [grunt-img][grunt-img] to optimize PNG and JPG images with [pngcrush][node-pngcrush] & [jpegtran][jpegtran] ([jpegtran-turbo][jpegtran-turbo] on win32). | ||
> Minify GIF, JPEG and PNG images seamlessly with Node.js. | ||
## Getting Started | ||
## Install | ||
First, be sure that you have [jpegtran][jpegtran] installed in your system. | ||
### for Mac users | ||
You can install with [homebrew][homebrew] | ||
```shell | ||
brew install jpeg | ||
```bash | ||
npm install --save image-min | ||
``` | ||
### for Linux users | ||
Debian, Ubuntu and Mint | ||
```shell | ||
apt-get install libjpeg libjpeg-progs | ||
``` | ||
Both libraries are easy to find for RPM distributions too. | ||
## Usage | ||
### for Windows users | ||
Don't worry because both libraries are included. | ||
```js | ||
var fs = require('fs'); | ||
var imagemin = require('image-min'); | ||
var path = require('path'); | ||
### Install | ||
```shell | ||
npm install imagemin | ||
var src = fs.createReadStream('img.gif'); | ||
var ext = path.extname(src.path); | ||
src | ||
.pipe(imagemin({ ext: ext })) | ||
.pipe(fs.createWriteStream('img-minified' + ext)); | ||
``` | ||
## How to use | ||
## API | ||
### for shell | ||
```shell | ||
imagemin file/path | ||
imagemin file/path -o new/file/path | ||
``` | ||
### for nodejs | ||
```js | ||
var imagemin = require('imagemin'); | ||
imagemin(filePath, destDir, callback); | ||
``` | ||
### imagemin(opts) | ||
Credits | ||
--------------- | ||
* Grunt-image [Helder Santana](http://heldr.com) | ||
* node-pngcrush [node-pngcrush](https://github.com/xiangshouding/node-pngcrush) | ||
Optimize a `GIF`, `JPEG`, or `PNG` image by providing a an `ext`. Use the | ||
options below (optionally) to configure how your images are optimized. | ||
[node-build-script]: http://github.com/h5bp/node-build-script | ||
[grunt-img]: https://github.com/heldr/grunt-img | ||
[jpegtran]: http://jpegclub.org/jpegtran/ | ||
[jpegtran-turbo]: http://libjpeg-turbo.virtualgl.org/ | ||
[node-pngcrush]: https://github.com/xiangshouding/node-pngcrush | ||
[homebrew]: http://mxcl.github.com/homebrew/ | ||
## Options | ||
### ext | ||
Type `String` | ||
Default: `undefined` | ||
File extension used by imagemin to determine which optimizer to use. | ||
### interlaced (GIF only) | ||
Type: `Boolean` | ||
Default: `false` | ||
Interlace gif for progressive rendering. | ||
### pngquant (PNG only) | ||
Type: `Boolean` | ||
Default: `false` | ||
Whether to enable [pngquant](https://github.com/pornel/pngquant) lossy compression. | ||
### progressive (JPEG only) | ||
Type: `Boolean` | ||
Default: `false` | ||
Lossless conversion to progressive. | ||
## Used by | ||
* [gulp-imagemin](https://github.com/sindresorhus/gulp-imagemin) | ||
* [grunt-contrib-imagemin](https://github.com/gruntjs/grunt-contrib-imagemin) | ||
## License | ||
[MIT License](http://en.wikipedia.org/wiki/MIT_License) © [Kevin Mårtensson](http://kevinmartensson.com) |
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
No bug tracker
MaintenancePackage does not have a linked bug tracker in package.json.
Found 1 instance in 1 package
No repository
Supply chain riskPackage does not have a linked source code repository. Without this field, a package will have no reference to the location of the source code use to generate the package.
Found 1 instance in 1 package
No website
QualityPackage does not have a website.
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
Install scripts
Supply chain riskInstall scripts are run when the package is installed. The majority of malware in npm is hidden in install scripts.
Found 1 instance in 1 package
Native code
Supply chain riskContains native code (e.g., compiled binaries or shared libraries). Including native code can obscure malicious behavior.
Found 5 instances in 1 package
Misc. License Issues
License(Experimental) A package's licensing information has fine-grained problems.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
No License Found
License(Experimental) License information could not be found.
Found 1 instance in 1 package
0
0
71
0
1
4618
7
2
3
96
2
+ Addedmultipipe@0.0.2
+ Addedthrough2@^0.4.0
+ Addedwin-spawn@^2.0.0
+ Addedabbrev@1.1.1(transitive)
+ Addedadm-zip@0.4.16(transitive)
+ Addedajv@6.12.6(transitive)
+ Addedansi-regex@2.1.1(transitive)
+ Addedansi-styles@1.0.02.2.1(transitive)
+ Addedasn1@0.2.6(transitive)
+ Addedassert-plus@1.0.0(transitive)
+ Addedasynckit@0.4.0(transitive)
+ Addedaws-sign2@0.7.0(transitive)
+ Addedaws4@1.13.2(transitive)
+ Addedbalanced-match@1.0.2(transitive)
+ Addedbcrypt-pbkdf@1.0.2(transitive)
+ Addedbin-build@0.1.1(transitive)
+ Addedbin-check@0.1.5(transitive)
+ Addedbin-wrapper@0.2.40.3.4(transitive)
+ Addedblock-stream@0.0.9(transitive)
+ Addedbrace-expansion@1.1.11(transitive)
+ Addedcaseless@0.12.0(transitive)
+ Addedchalk@0.4.01.1.3(transitive)
+ Addedcombined-stream@1.0.8(transitive)
+ Addedconcat-map@0.0.1(transitive)
+ Addedcore-util-is@1.0.21.0.3(transitive)
+ Addeddashdash@1.14.1(transitive)
+ Addeddecompress@0.2.5(transitive)
+ Addeddelayed-stream@1.0.0(transitive)
+ Addeddownload@0.1.19(transitive)
+ Addedduplexer@0.1.2(transitive)
+ Addedduplexer2@0.0.1(transitive)
+ Addedeach-async@0.1.3(transitive)
+ Addedecc-jsbn@0.1.2(transitive)
+ Addedescape-string-regexp@1.0.5(transitive)
+ Addedexecutable@0.1.3(transitive)
+ Addedext-list@0.2.0(transitive)
+ Addedext-name@1.0.1(transitive)
+ Addedextend@3.0.2(transitive)
+ Addedextsprintf@1.3.0(transitive)
+ Addedfast-deep-equal@3.1.3(transitive)
+ Addedfast-json-stable-stringify@2.1.0(transitive)
+ Addedfind-file@0.1.4(transitive)
+ Addedforever-agent@0.6.1(transitive)
+ Addedform-data@2.3.3(transitive)
+ Addedfs.realpath@1.0.0(transitive)
+ Addedfstream@0.1.31(transitive)
+ Addedget-stdin@0.1.0(transitive)
+ Addedget-urls@0.1.2(transitive)
+ Addedgetpass@0.1.7(transitive)
+ Addedgifsicle@0.1.7(transitive)
+ Addedglob@7.2.3(transitive)
+ Addedgot@0.2.0(transitive)
+ Addedgraceful-fs@3.0.12(transitive)
+ Addedhar-schema@2.0.0(transitive)
+ Addedhar-validator@5.1.5(transitive)
+ Addedhas-ansi@2.0.0(transitive)
+ Addedhas-color@0.1.7(transitive)
+ Addedhttp-signature@1.2.0(transitive)
+ Addedinflight@1.0.6(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedis-typedarray@1.0.0(transitive)
+ Addedisarray@0.0.1(transitive)
+ Addedisstream@0.1.2(transitive)
+ Addedjpegtran-bin@0.2.8(transitive)
+ Addedjsbn@0.1.1(transitive)
+ Addedjson-schema@0.4.0(transitive)
+ Addedjson-schema-traverse@0.4.1(transitive)
+ Addedjson-stringify-safe@5.0.1(transitive)
+ Addedjsprim@1.4.2(transitive)
+ Addedlog-symbols@1.0.2(transitive)
+ Addedmime-db@1.52.0(transitive)
+ Addedmime-types@2.1.35(transitive)
+ Addedminimatch@3.1.2(transitive)
+ Addedminimist@1.2.8(transitive)
+ Addedmkdirp@0.3.50.5.6(transitive)
+ Addedmout@0.9.1(transitive)
+ Addedmultipipe@0.0.2(transitive)
+ Addednatives@1.1.6(transitive)
+ Addednopt@2.2.1(transitive)
+ Addedoauth-sign@0.9.0(transitive)
+ Addedobject-assign@0.3.1(transitive)
+ Addedobject-keys@0.4.0(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedoptipng-bin@0.3.11(transitive)
+ Addedpath-is-absolute@1.0.1(transitive)
+ Addedperformance-now@2.1.0(transitive)
+ Addedpngquant-bin@0.1.7(transitive)
+ Addedpsl@1.10.0(transitive)
+ Addedpunycode@2.3.1(transitive)
+ Addedqs@6.5.3(transitive)
+ Addedreadable-stream@1.0.34(transitive)
+ Addedrequest@2.88.2(transitive)
+ Addedrimraf@2.7.1(transitive)
+ Addedsafe-buffer@5.2.1(transitive)
+ Addedsafer-buffer@2.1.2(transitive)
+ Addedsshpk@1.18.0(transitive)
+ Addedstream-combiner@0.0.4(transitive)
+ Addedstring_decoder@0.10.31(transitive)
+ Addedstrip-ansi@0.1.13.0.1(transitive)
+ Addedsupports-color@2.0.0(transitive)
+ Addedtar@0.1.20(transitive)
+ Addedtempfile@0.1.3(transitive)
+ Addedthrough2@0.4.2(transitive)
+ Addedtough-cookie@2.5.0(transitive)
+ Addedtunnel-agent@0.6.0(transitive)
+ Addedtweetnacl@0.14.5(transitive)
+ Addedunderscore.string@2.3.3(transitive)
+ Addeduri-js@4.4.1(transitive)
+ Addeduuid@1.4.23.4.0(transitive)
+ Addedverror@1.10.0(transitive)
+ Addedwin-spawn@2.0.0(transitive)
+ Addedwrappy@1.0.2(transitive)
+ Addedxtend@2.1.2(transitive)
- Removedcolors@~0.6.2
- Removednode-pngcrush@~0.0.9
- Removedoptimist@~0.6.0
- Removedread@~1.0.4
- Removedwhich@~1.0.5
- Removedcolors@0.6.2(transitive)
- Removedminimist@0.0.10(transitive)
- Removedmute-stream@0.0.8(transitive)
- Removednode-pngcrush@0.0.9(transitive)
- Removedoptimist@0.6.1(transitive)
- Removedread@1.0.7(transitive)
- Removedwhich@1.0.9(transitive)
- Removedwordwrap@0.0.3(transitive)