postcss-image-inliner
Advanced tools
Comparing version 2.0.0 to 3.0.0
139
index.js
@@ -1,100 +0,65 @@ | ||
'use strict'; | ||
const postcss = require('postcss'); | ||
const Bluebird = require('bluebird'); | ||
const isString = require('lodash.isstring'); | ||
const defaults = require('lodash.defaults'); | ||
const debug = require('debug')('image-inliner'); | ||
const escape = require('lodash.escaperegexp'); | ||
const last = require('lodash.last'); | ||
const reduce = require('lodash.reduce'); | ||
const filesize = require('filesize'); | ||
const getResource = require('asset-resolver').getResource; | ||
const getDataUri = require('./lib/image').getDataUri; | ||
const last = require('lodash/last'); | ||
const escapeRegExp = require('lodash/escapeRegExp'); | ||
const {getDataUriMapping} = require('./lib/image'); | ||
module.exports = postcss.plugin('postcss-image-inliner', opts => { | ||
opts = defaults(opts || {}, { | ||
assetPaths: [], | ||
maxFileSize: 10240, | ||
b64Svg: false, | ||
strict: false | ||
}); | ||
const DEFAULTS = { | ||
assetPaths: [], | ||
maxFileSize: 10240, | ||
b64Svg: false, | ||
strict: false | ||
}; | ||
if (isString(opts.assetPaths)) { | ||
opts.assetPaths = [opts.assetPaths]; | ||
const loop = cb => { | ||
const matcher = /url\(\s*(?:['"]*)(?!['"]*data:)(.*?)(?:['"]*)\s*\)/gm; | ||
return decl => { | ||
let match; | ||
while ((match = matcher.exec(decl.value)) !== null) { | ||
cb({decl, url: last(match)}); | ||
} | ||
}; | ||
}; | ||
opts.assetPaths.push(process.cwd()); | ||
module.exports = postcss.plugin('postcss-image-inliner', (opts = {}) => { | ||
const options = {...DEFAULTS, ...opts}; | ||
function assertSize(resource) { | ||
const encoding = resource.mime === 'image/svg+xml' ? 'utf-8' : 'binary'; | ||
const size = Buffer.byteLength(resource.contents, encoding); | ||
if (opts.maxFileSize && opts.maxFileSize < size) { | ||
const msg = 'Too big. ' + filesize(size) + ' exceeds the allowed ' + filesize(opts.maxFileSize); | ||
debug(msg); | ||
return Bluebird.reject(new Error(msg)); | ||
} | ||
if (Array.isArray(options.assetPaths)) { | ||
options.assetPaths = [...options.assetPaths, process.cwd()]; | ||
} else { | ||
options.assetPaths = [options.assetPaths, process.cwd()]; | ||
} | ||
return resource; | ||
} | ||
return async css => { | ||
const urls = new Set([]); | ||
const filter = /^(background(?:-image)?)|(content)|(cursor)/; | ||
// Get urls | ||
css.walkDecls(filter, loop(({url}) => urls.add(url))); | ||
function resolveUrl(filepath) { | ||
return getResource(filepath, { | ||
base: opts.assetPaths, | ||
filter: assertSize | ||
}).catch(err => { | ||
debug(err.message, filepath, 'could not be resolved'); | ||
}); | ||
} | ||
const mapping = await getDataUriMapping([...urls], options); | ||
function loop(cb) { | ||
const matcher = /url\(\s*(?:['"]*)(?!['"]*data:)(.*?)(?:['"]*)\s*\)/gm; | ||
return function (decl) { | ||
let match; | ||
while ((match = matcher.exec(decl.value)) !== null) { | ||
cb(decl, last(match)); | ||
} | ||
}; | ||
} | ||
css.walkDecls( | ||
filter, | ||
loop(({decl, url}) => { | ||
if (mapping[url]) { | ||
const regexp = new RegExp('[\'"]?' + escapeRegExp(url) + '[\'"]?', 'gm'); | ||
if (url.startsWith('//')) { | ||
// Console.log({url, regexp, val: decl.value}); | ||
} | ||
function compact(data) { | ||
return reduce(data, (acc, file, key) => { | ||
if (file && file.mime) { | ||
acc[key] = file; | ||
} | ||
return acc; | ||
}, {}); | ||
} | ||
decl.value = decl.value.replace(regexp, '\'' + mapping[url] + '\''); | ||
if (url.startsWith('//')) { | ||
// Console.log('RESULT: ', decl.value); | ||
} | ||
return function (css) { | ||
const replacements = {}; | ||
const filter = /^(background(?:-image)?)|(content)|(cursor)/; | ||
css.walkDecls(filter, loop((decl, url) => { | ||
replacements[url] = resolveUrl(url); | ||
})); | ||
return Bluebird.props(replacements) | ||
.then(compact) | ||
.then(file => { | ||
return getDataUri(file, opts); | ||
}) | ||
.then(data => { | ||
css.walkDecls(filter, loop((decl, url) => { | ||
if (data[url]) { | ||
const regexp = new RegExp('[\'"]?' + escape(url) + '[\'"]?'); | ||
decl.value = decl.value.replace(regexp, '\'' + data[url] + '\''); | ||
debug(url, 'successfully replaced with ', data[url]); | ||
} else { | ||
debug(url, 'failed'); | ||
if (opts.strict) { | ||
throw new Error('No file found for ' + url); | ||
} | ||
} | ||
})); | ||
}).catch(err => { | ||
debug(err); | ||
return new Bluebird((resolve, reject) => { | ||
reject(err); | ||
}); | ||
}); | ||
}; | ||
debug(url, 'successfully replaced with ', mapping[url]); | ||
} else { | ||
debug(url, 'failed'); | ||
if (opts.strict) { | ||
throw new Error('No file found for ' + url); | ||
} | ||
} | ||
}) | ||
); | ||
}; | ||
}); |
112
lib/image.js
'use strict'; | ||
const path = require('path'); | ||
const SVGO = require('svgo'); | ||
const filesize = require('filesize'); | ||
const debug = require('debug')('image-inliner'); | ||
const map = require('lodash.map'); | ||
const SVGO = require('svgo'); | ||
const Bluebird = require('bluebird'); | ||
const {getResource} = require('asset-resolver'); | ||
@@ -11,49 +12,80 @@ const svgo = new SVGO(); | ||
function encodeSvg(content) { | ||
return encodeURIComponent(content | ||
return ( | ||
encodeURIComponent( | ||
content | ||
// Strip newlines and tabs | ||
.replace(/[\n\r]/gmi, '') | ||
.replace(/\t/gmi, ' ') | ||
.replace(/[\n\r]/gim, '') | ||
.replace(/\t/gim, ' ') | ||
// Strip comments | ||
.replace(/<!--(.*(?=-->))-->/gmi, '') | ||
.replace(/<!--(.*(?=-->))-->/gim, '') | ||
// Replace | ||
.replace(/'/gmi, '\\i')) | ||
// Encode brackets | ||
.replace(/\(/g, '%28').replace(/\)/g, '%29') | ||
// Replace ' with " | ||
.replace(/'/gm, '"'); | ||
.replace(/'/gim, '\\i') | ||
) | ||
// Encode brackets | ||
.replace(/\(/g, '%28') | ||
.replace(/\)/g, '%29') | ||
// Replace ' with " | ||
.replace(/'/gm, '"') | ||
); | ||
} | ||
function computeDataUri(opts) { | ||
return function (file, key) { | ||
// If the url is SVG, let's compress and use the XML directly | ||
if (file.mime === 'image/svg+xml' && !opts.b64Svg) { | ||
return svgo.optimize(file.contents.toString('utf-8')).then(result => { | ||
debug('optimising svg'); | ||
return { | ||
data: 'data:image/svg+xml;charset=US-ASCII,' + encodeSvg(result.data), | ||
key | ||
}; | ||
}).catch(err => { | ||
debug('errored', err.message); | ||
throw err; | ||
}); | ||
} | ||
async function reduceAsync(array = [], reducer = r => r, initial) { | ||
for (const index of array.keys()) { | ||
initial = await reducer(initial, array[index], index); /* eslint-disable-line no-await-in-loop */ | ||
} | ||
// Otherwise we base64 encode the image | ||
return { | ||
data: 'data:' + file.mime + ';base64,' + Buffer.from(file.contents, 'binary').toString('base64'), | ||
key | ||
}; | ||
}; | ||
return initial; | ||
} | ||
function getDataUri(res, opts) { | ||
const promises = map(res, computeDataUri(opts)); | ||
async function assertSize(resource, maxFileSize) { | ||
const {mime, contents = ''} = resource || {}; | ||
const encoding = mime === 'image/svg+xml' ? 'utf-8' : 'binary'; | ||
const size = Buffer.byteLength(contents, encoding); | ||
if (maxFileSize && maxFileSize < size) { | ||
const msg = 'Too big. ' + filesize(size) + ' exceeds the allowed ' + filesize(maxFileSize); | ||
throw new Error(msg); | ||
} | ||
return Bluebird.reduce(promises, (uris, resource) => { | ||
uris[resource.key] = resource.data; | ||
return uris; | ||
}, {}); | ||
return resource; | ||
} | ||
module.exports.getDataUri = getDataUri; | ||
async function getDataUri(file, opts) { | ||
// If the url is SVG, let's compress and use the XML directly | ||
if (file.mime === 'image/svg+xml' && !opts.b64Svg) { | ||
const optimized = await svgo.optimize(file.contents.toString('utf-8')); | ||
return `data:image/svg+xml;charset=US-ASCII,${encodeSvg(optimized.data)}`; | ||
} | ||
// Otherwise we base64 encode the image | ||
return 'data:' + file.mime + ';base64,' + Buffer.from(file.contents, 'binary').toString('base64'); | ||
} | ||
async function resolve(filepath, {assetPaths, maxFileSize, resolver = () => undefined}) { | ||
const filter = resource => assertSize(resource, maxFileSize); | ||
const resolvedFile = await resolver(filepath); | ||
const base = resolvedFile ? path.dirname(resolvedFile) : assetPaths; | ||
const file = resolvedFile ? path.basename(resolvedFile) : filepath; | ||
try { | ||
return await getResource(file, {base, filter}); | ||
} catch (err) { | ||
debug(err.message, filepath, 'could not be resolved'); | ||
} | ||
} | ||
function getDataUriMapping(urls = [], options = {}) { | ||
return reduceAsync( | ||
[...new Set(urls)], | ||
async (result, url) => { | ||
const file = await resolve(url, options); | ||
if (file && file.mime && /image/.test(file.mime)) { | ||
result[url] = await getDataUri(file, options); | ||
} | ||
return result; | ||
}, | ||
{} | ||
); | ||
} | ||
module.exports.getDataUriMapping = getDataUriMapping; |
{ | ||
"name": "postcss-image-inliner", | ||
"version": "2.0.0", | ||
"version": "3.0.0", | ||
"description": "PostCSS plugin to inline images into css", | ||
@@ -24,39 +24,32 @@ "keywords": [ | ||
"dependencies": { | ||
"asset-resolver": "^1.0.0", | ||
"bluebird": "^3.5.1", | ||
"debug": "3.1.0", | ||
"filesize": "^3.5.11", | ||
"lodash.defaults": "4.2.0", | ||
"lodash.escaperegexp": "4.1.2", | ||
"lodash.isstring": "4.0.1", | ||
"lodash.last": "3.0.0", | ||
"lodash.map": "4.6.0", | ||
"lodash.partialright": "4.2.1", | ||
"lodash.reduce": "4.6.0", | ||
"lodash.reject": "4.6.0", | ||
"lodash.result": "4.5.2", | ||
"mime": "2.0.3", | ||
"object-hash": "^1.2.0", | ||
"postcss": "^6.0.14", | ||
"request": "^2.83.0", | ||
"svgo": "^1.0.3", | ||
"then-fs": "2.0.0" | ||
"asset-resolver": "^2.0.0", | ||
"debug": "^4.1.1", | ||
"eslint-config-xo-space": "^0.21.0", | ||
"filesize": "^4.0.0", | ||
"lodash": "^4.17.11", | ||
"postcss": "^7.0.13", | ||
"svgo": "^1.1.1" | ||
}, | ||
"devDependencies": { | ||
"chai": "^4.1.2", | ||
"eslint": "^4.13.1", | ||
"eslint-config-xo": "^0.19.0", | ||
"finalhandler": "^1.1.0", | ||
"gulp": "3.9.1", | ||
"gulp-eslint": "^4.0.0", | ||
"gulp-mocha": "4.3.1", | ||
"mocha": "^4.0.1", | ||
"serve-static": "^1.13.1" | ||
"chai": "^4.2.0", | ||
"eslint": "^5.12.1", | ||
"finalhandler": "^1.1.1", | ||
"mocha": "^5.2.0", | ||
"serve-static": "^1.13.2" | ||
}, | ||
"scripts": { | ||
"test": "gulp" | ||
"test": "eslint *.js && mocha test/*.js" | ||
}, | ||
"prettier": { | ||
"trailingComma": "es5", | ||
"singleQuote": true, | ||
"printWidth": 120, | ||
"bracketSpacing": false | ||
}, | ||
"eslintConfig": { | ||
"extends": "xo-space" | ||
}, | ||
"engines": { | ||
"node": ">=6.0" | ||
"node": ">=8.6" | ||
} | ||
} |
@@ -1,2 +0,2 @@ | ||
# PostCSS Image Inliner [![Build Status][ci-img]][ci] | ||
# PostCSS Image Inliner [![Build Status][ci-img]][ci] [![Windows Build Status][winci-img]][winci] | ||
@@ -8,2 +8,4 @@ [PostCSS] plugin to inline local/remote images. | ||
[ci]: https://travis-ci.org/bezoerb/postcss-image-inliner | ||
[winci-img]: https://ci.appveyor.com/api/projects/status/5xaq0ord84y5ho0c?svg=true | ||
[winci]: https://ci.appveyor.com/project/bezoerb/postcss-image-inliner | ||
@@ -10,0 +12,0 @@ ```css |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
7
5
72
9865
133
1
+ Addedlodash@^4.17.11
+ Added@babel/code-frame@7.24.7(transitive)
+ Added@babel/helper-validator-identifier@7.24.7(transitive)
+ Added@babel/highlight@7.24.7(transitive)
+ Added@sindresorhus/is@0.14.0(transitive)
+ Added@szmarczak/http-timer@1.1.2(transitive)
+ Added@types/glob@7.2.0(transitive)
+ Added@types/minimatch@5.1.2(transitive)
+ Added@types/node@22.7.4(transitive)
+ Addedacorn@6.4.2(transitive)
+ Addedacorn-jsx@5.3.2(transitive)
+ Addedansi-escapes@3.2.0(transitive)
+ Addedansi-regex@3.0.14.1.1(transitive)
+ Addedasset-resolver@2.0.9(transitive)
+ Addedastral-regex@1.0.0(transitive)
+ Addedcacheable-request@6.1.0(transitive)
+ Addedcallsites@3.1.0(transitive)
+ Addedchardet@0.7.0(transitive)
+ Addedcli-cursor@2.1.0(transitive)
+ Addedcli-width@2.2.1(transitive)
+ Addedclone-response@1.0.3(transitive)
+ Addedcross-spawn@6.0.5(transitive)
+ Addeddeep-is@0.1.4(transitive)
+ Addeddefer-to-connect@1.1.3(transitive)
+ Addeddir-glob@2.2.2(transitive)
+ Addeddoctrine@3.0.0(transitive)
+ Addedemoji-regex@7.0.3(transitive)
+ Addedend-of-stream@1.4.4(transitive)
+ Addedeslint@5.16.0(transitive)
+ Addedeslint-config-xo@0.26.0(transitive)
+ Addedeslint-config-xo-space@0.21.0(transitive)
+ Addedeslint-scope@4.0.3(transitive)
+ Addedeslint-utils@1.4.3(transitive)
+ Addedeslint-visitor-keys@1.3.0(transitive)
+ Addedespree@5.0.1(transitive)
+ Addedesquery@1.6.0(transitive)
+ Addedesrecurse@4.3.0(transitive)
+ Addedestraverse@4.3.05.3.0(transitive)
+ Addedesutils@2.0.3(transitive)
+ Addedexternal-editor@3.1.0(transitive)
+ Addedfast-levenshtein@2.0.6(transitive)
+ Addedfigures@2.0.0(transitive)
+ Addedfile-entry-cache@5.0.1(transitive)
+ Addedfilesize@4.2.1(transitive)
+ Addedflat-cache@2.0.1(transitive)
+ Addedflatted@2.0.2(transitive)
+ Addedfunctional-red-black-tree@1.0.1(transitive)
+ Addedget-stream@4.1.05.2.0(transitive)
+ Addedglobals@11.12.0(transitive)
+ Addedglobby@9.2.0(transitive)
+ Addedgot@9.6.0(transitive)
+ Addedhttp-cache-semantics@4.1.1(transitive)
+ Addediconv-lite@0.4.24(transitive)
+ Addedignore@4.0.6(transitive)
+ Addedimport-fresh@3.3.0(transitive)
+ Addedimurmurhash@0.1.4(transitive)
+ Addedinquirer@6.5.2(transitive)
+ Addedis-fullwidth-code-point@2.0.0(transitive)
+ Addedisexe@2.0.0(transitive)
+ Addedjs-tokens@4.0.0(transitive)
+ Addedjson-stable-stringify-without-jsonify@1.0.1(transitive)
+ Addedkeyv@3.1.0(transitive)
+ Addedlevn@0.3.0(transitive)
+ Addedlodash@4.17.21(transitive)
+ Addedlowercase-keys@2.0.0(transitive)
+ Addedmimic-fn@1.2.0(transitive)
+ Addedmute-stream@0.0.7(transitive)
+ Addednatural-compare@1.4.0(transitive)
+ Addednice-try@1.0.5(transitive)
+ Addednormalize-url@4.5.1(transitive)
+ Addedonetime@2.0.1(transitive)
+ Addedoptionator@0.8.3(transitive)
+ Addedos-tmpdir@1.0.2(transitive)
+ Addedp-cancelable@1.1.0(transitive)
+ Addedparent-module@1.0.1(transitive)
+ Addedpath-is-inside@1.0.2(transitive)
+ Addedpath-key@2.0.1(transitive)
+ Addedpicocolors@0.2.11.1.0(transitive)
+ Addedpify@4.0.1(transitive)
+ Addedpostcss@7.0.39(transitive)
+ Addedprelude-ls@1.1.2(transitive)
+ Addedprogress@2.0.3(transitive)
+ Addedpump@3.0.2(transitive)
+ Addedregexpp@2.0.1(transitive)
+ Addedresolve-from@4.0.0(transitive)
+ Addedrestore-cursor@2.0.0(transitive)
+ Addedrimraf@2.6.3(transitive)
+ Addedrun-async@2.4.1(transitive)
+ Addedrxjs@6.6.7(transitive)
+ Addedshebang-command@1.2.0(transitive)
+ Addedshebang-regex@1.0.0(transitive)
+ Addedslash@2.0.0(transitive)
+ Addedslice-ansi@2.1.0(transitive)
+ Addedstring-width@2.1.13.1.0(transitive)
+ Addedstrip-ansi@4.0.05.2.0(transitive)
+ Addedstrip-json-comments@2.0.1(transitive)
+ Addedtable@5.4.6(transitive)
+ Addedtext-table@0.2.0(transitive)
+ Addedthrough@2.3.8(transitive)
+ Addedtmp@0.0.33(transitive)
+ Addedto-readable-stream@1.0.0(transitive)
+ Addedtslib@1.14.1(transitive)
+ Addedtype-check@0.3.2(transitive)
+ Addedundici-types@6.19.8(transitive)
+ Addedwhich@1.3.1(transitive)
+ Addedword-wrap@1.2.5(transitive)
+ Addedwrite@1.0.3(transitive)
- Removedbluebird@^3.5.1
- Removedlodash.defaults@4.2.0
- Removedlodash.escaperegexp@4.1.2
- Removedlodash.isstring@4.0.1
- Removedlodash.last@3.0.0
- Removedlodash.map@4.6.0
- Removedlodash.partialright@4.2.1
- Removedlodash.reduce@4.6.0
- Removedlodash.reject@4.6.0
- Removedlodash.result@4.5.2
- Removedmime@2.0.3
- Removedobject-hash@^1.2.0
- Removedrequest@^2.83.0
- Removedthen-fs@2.0.0
- Removed@sindresorhus/is@0.7.0(transitive)
- Removedasap@2.0.6(transitive)
- Removedasn1@0.2.6(transitive)
- Removedassert-plus@1.0.0(transitive)
- Removedasset-resolver@1.1.2(transitive)
- Removedasynckit@0.4.0(transitive)
- Removedaws-sign2@0.7.0(transitive)
- Removedaws4@1.13.2(transitive)
- Removedbcrypt-pbkdf@1.0.2(transitive)
- Removedbluebird@3.7.2(transitive)
- Removedcacheable-request@2.1.4(transitive)
- Removedcaseless@0.12.0(transitive)
- Removedclone-response@1.0.2(transitive)
- Removedcombined-stream@1.0.8(transitive)
- Removedcore-util-is@1.0.21.0.3(transitive)
- Removeddashdash@1.14.1(transitive)
- Removeddebug@3.1.0(transitive)
- Removeddelayed-stream@1.0.0(transitive)
- Removeddir-glob@2.0.0(transitive)
- Removedecc-jsbn@0.1.2(transitive)
- Removedextend@3.0.2(transitive)
- Removedextsprintf@1.3.0(transitive)
- Removedfilesize@3.6.1(transitive)
- Removedforever-agent@0.6.1(transitive)
- Removedform-data@2.3.3(transitive)
- Removedfrom2@2.3.0(transitive)
- Removedget-stream@3.0.0(transitive)
- Removedgetpass@0.1.7(transitive)
- Removedglobby@8.0.2(transitive)
- Removedgot@8.3.2(transitive)
- Removedhar-schema@2.0.0(transitive)
- Removedhar-validator@5.1.5(transitive)
- Removedhas-symbol-support-x@1.4.2(transitive)
- Removedhas-to-string-tag-x@1.4.1(transitive)
- Removedhttp-cache-semantics@3.8.1(transitive)
- Removedhttp-signature@1.2.0(transitive)
- Removedignore@3.3.10(transitive)
- Removedinto-stream@3.1.0(transitive)
- Removedis-object@1.0.2(transitive)
- Removedis-retry-allowed@1.2.0(transitive)
- Removedis-typedarray@1.0.0(transitive)
- Removedisstream@0.1.2(transitive)
- Removedisurl@1.0.0(transitive)
- Removedjsbn@0.1.1(transitive)
- Removedjson-schema@0.4.0(transitive)
- Removedjson-stringify-safe@5.0.1(transitive)
- Removedjsprim@1.4.2(transitive)
- Removedkeyv@3.0.0(transitive)
- Removedlodash.defaults@4.2.0(transitive)
- Removedlodash.escaperegexp@4.1.2(transitive)
- Removedlodash.isstring@4.0.1(transitive)
- Removedlodash.last@3.0.0(transitive)
- Removedlodash.map@4.6.0(transitive)
- Removedlodash.partialright@4.2.1(transitive)
- Removedlodash.reduce@4.6.0(transitive)
- Removedlodash.reject@4.6.0(transitive)
- Removedlodash.result@4.5.2(transitive)
- Removedlowercase-keys@1.0.0(transitive)
- Removedmime@2.0.3(transitive)
- Removedmime-db@1.52.0(transitive)
- Removedmime-types@2.1.35(transitive)
- Removednormalize-url@2.0.1(transitive)
- Removedoauth-sign@0.9.0(transitive)
- Removedobject-assign@4.1.1(transitive)
- Removedobject-hash@1.3.1(transitive)
- Removedp-cancelable@0.4.1(transitive)
- Removedp-finally@1.0.0(transitive)
- Removedp-is-promise@1.1.0(transitive)
- Removedp-timeout@2.0.1(transitive)
- Removedperformance-now@2.1.0(transitive)
- Removedpostcss@6.0.23(transitive)
- Removedprocess-nextick-args@2.0.1(transitive)
- Removedpromise@7.3.1(transitive)
- Removedpsl@1.9.0(transitive)
- Removedqs@6.5.3(transitive)
- Removedquery-string@5.1.1(transitive)
- Removedreadable-stream@2.3.8(transitive)
- Removedrequest@2.88.2(transitive)
- Removedsafe-buffer@5.1.25.2.1(transitive)
- Removedslash@1.0.0(transitive)
- Removedsort-keys@2.0.0(transitive)
- Removedsshpk@1.18.0(transitive)
- Removedstrict-uri-encode@1.1.0(transitive)
- Removedstring_decoder@1.1.1(transitive)
- Removedthen-fs@2.0.0(transitive)
- Removedtimed-out@4.0.1(transitive)
- Removedtough-cookie@2.5.0(transitive)
- Removedtunnel-agent@0.6.0(transitive)
- Removedtweetnacl@0.14.5(transitive)
- Removedurl-to-options@1.0.1(transitive)
- Removedutil-deprecate@1.0.2(transitive)
- Removeduuid@3.4.0(transitive)
- Removedverror@1.10.0(transitive)
Updatedasset-resolver@^2.0.0
Updateddebug@^4.1.1
Updatedfilesize@^4.0.0
Updatedpostcss@^7.0.13
Updatedsvgo@^1.1.1