diff --git a/package.json b/package.json index b6021c2ac98..79f211cae35 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,10 @@ "cross-spawn": "^6.0.4", "cssnano": "^3.10.0", "dotenv": "^5.0.0", + "filesize": "^3.6.0", "get-port": "^3.2.0", "glob": "^7.1.2", + "grapheme-breaker": "^0.3.2", "htmlnano": "^0.1.6", "is-url": "^1.2.2", "js-yaml": "^3.10.0", @@ -52,6 +54,7 @@ "serialize-to-js": "^1.1.1", "serve-static": "^1.12.4", "source-map": "0.6.1", + "strip-ansi": "^4.0.0", "toml": "^2.3.3", "tomlify-j0.4": "^3.0.0", "uglify-es": "^3.2.1", diff --git a/src/Asset.js b/src/Asset.js index ee5d3e68ded..b19cc0fd4df 100644 --- a/src/Asset.js +++ b/src/Asset.js @@ -37,6 +37,8 @@ class Asset { this.parentBundle = null; this.bundles = new Set(); this.cacheData = {}; + this.buildTime = 0; + this.bundledSize = 0; } shouldInvalidate() { diff --git a/src/Bundle.js b/src/Bundle.js index ba47e69baf0..7073b3f94c9 100644 --- a/src/Bundle.js +++ b/src/Bundle.js @@ -18,6 +18,8 @@ class Bundle { this.siblingBundles = new Set(); this.siblingBundlesMap = new Map(); this.offsets = new Map(); + this.totalSize = 0; + this.bundleTime = 0; } static createWithAsset(asset, parentBundle) { @@ -122,6 +124,7 @@ class Bundle { let Packager = bundler.packagers.get(this.type); let packager = new Packager(this, bundler); + let startTime = Date.now(); await packager.start(); let included = new Set(); @@ -130,6 +133,11 @@ class Bundle { } await packager.end(); + + this.bundleTime = Date.now() - startTime; + for (let asset of this.assets) { + this.bundleTime += asset.buildTime; + } } async _addDeps(asset, packager, included) { @@ -144,6 +152,12 @@ class Bundle { } await packager.addAsset(asset); + this.addAssetSize(asset, packager.getSize() - this.totalSize); + } + + addAssetSize(asset, size) { + asset.bundledSize = size; + this.totalSize += size; } getParents() { diff --git a/src/Bundler.js b/src/Bundler.js index a5c8889e438..528288e6f27 100644 --- a/src/Bundler.js +++ b/src/Bundler.js @@ -16,6 +16,8 @@ const config = require('./utils/config'); const emoji = require('./utils/emoji'); const loadEnv = require('./utils/env'); const PromiseQueue = require('./utils/PromiseQueue'); +const bundleReport = require('./utils/bundleReport'); +const prettifyTime = require('./utils/prettifyTime'); /** * The Bundler is the main entry point. It resolves and loads assets, @@ -93,7 +95,8 @@ class Bundler extends EventEmitter { typeof options.sourceMaps === 'boolean' ? options.sourceMaps : !isProduction, - hmrHostname: options.hmrHostname || '' + hmrHostname: options.hmrHostname || '', + detailedReport: options.detailedReport || false }; } @@ -200,11 +203,11 @@ class Bundler extends EventEmitter { this.unloadOrphanedAssets(); let buildTime = Date.now() - startTime; - let time = - buildTime < 1000 - ? `${buildTime}ms` - : `${(buildTime / 1000).toFixed(2)}s`; + let time = prettifyTime(buildTime); logger.status(emoji.success, `Built in ${time}.`, 'green'); + if (!this.watcher) { + bundleReport(bundle, this.options.detailedReport); + } this.emit('bundled', bundle); return bundle; @@ -378,6 +381,7 @@ class Bundler extends EventEmitter { asset.processed = true; // First try the cache, otherwise load and compile in the background + let startTime = Date.now(); let processed = this.cache && (await this.cache.read(asset.name)); if (!processed || asset.shouldInvalidate(processed.cacheData)) { processed = await this.farm.run(asset.name, asset.package, this.options); @@ -386,6 +390,7 @@ class Bundler extends EventEmitter { } } + asset.buildTime = Date.now() - startTime; asset.generated = processed.generated; asset.hash = processed.hash; diff --git a/src/Logger.js b/src/Logger.js index aef7932040e..00d08e8386d 100644 --- a/src/Logger.js +++ b/src/Logger.js @@ -2,6 +2,8 @@ const chalk = require('chalk'); const readline = require('readline'); const prettyError = require('./utils/prettyError'); const emoji = require('./utils/emoji'); +const {countBreaks} = require('grapheme-breaker'); +const stripAnsi = require('strip-ansi'); class Logger { constructor(options) { @@ -127,6 +129,46 @@ class Logger { _log(message) { console.log(message); } + + table(columns, table) { + // Measure column widths + let colWidths = []; + for (let row of table) { + let i = 0; + for (let item of row) { + colWidths[i] = Math.max(colWidths[i] || 0, stringWidth(item)); + i++; + } + } + + // Render rows + for (let row of table) { + let items = row.map((item, i) => { + // Add padding between columns unless the alignment is the opposite to the + // next column and pad to the column width. + let padding = + !columns[i + 1] || columns[i + 1].align === columns[i].align ? 4 : 0; + return pad(item, colWidths[i] + padding, columns[i].align); + }); + + this.log(items.join('')); + } + } +} + +// Pad a string with spaces on either side +function pad(text, length, align = 'left') { + let pad = ' '.repeat(length - stringWidth(text)); + if (align === 'right') { + return pad + text; + } + + return text + pad; +} + +// Count visible characters in a string +function stringWidth(string) { + return countBreaks(stripAnsi('' + string)); } // If we are in a worker, make a proxy class which will diff --git a/src/cli.js b/src/cli.js index a618da8a23c..24eba68f1a2 100755 --- a/src/cli.js +++ b/src/cli.js @@ -94,6 +94,10 @@ program 'set the runtime environment, either "node", "browser" or "electron". defaults to "browser"', /^(node|browser|electron)$/ ) + .option( + '--detailed-report', + 'print a detailed build report after a completed build' + ) .action(bundle); program diff --git a/src/packagers/Packager.js b/src/packagers/Packager.js index f15c79b1dea..9e495b55fe1 100644 --- a/src/packagers/Packager.js +++ b/src/packagers/Packager.js @@ -22,6 +22,10 @@ class Packager { throw new Error('Must be implemented by subclasses'); } + getSize() { + return this.dest.bytesWritten; + } + async end() { await this.dest.end(); } diff --git a/src/packagers/RawPackager.js b/src/packagers/RawPackager.js index 1a37b1f4cfe..a0f14f540f2 100644 --- a/src/packagers/RawPackager.js +++ b/src/packagers/RawPackager.js @@ -23,9 +23,14 @@ class RawPackager extends Packager { contents = await fs.readFile(contents ? contents.path : asset.name); } + this.size = contents.length; await fs.writeFile(name, contents); } + getSize() { + return this.size || 0; + } + end() {} } diff --git a/src/transforms/uglify.js b/src/transforms/uglify.js index aad885148b2..9c89f101f80 100644 --- a/src/transforms/uglify.js +++ b/src/transforms/uglify.js @@ -1,5 +1,4 @@ const {minify} = require('uglify-es'); -const logger = require('../Logger'); module.exports = async function(asset) { await asset.parseIfNeeded(); @@ -24,13 +23,6 @@ module.exports = async function(asset) { throw result.error; } - // Log all warnings - if (result.warnings) { - result.warnings.forEach(warning => { - logger.warn('[uglify] ' + warning); - }); - } - // babel-generator did our code generation for us, so remove the old AST asset.ast = null; asset.outputCode = result.code; diff --git a/src/utils/bundleReport.js b/src/utils/bundleReport.js new file mode 100644 index 00000000000..b83fe47b8a5 --- /dev/null +++ b/src/utils/bundleReport.js @@ -0,0 +1,97 @@ +const path = require('path'); +const prettifyTime = require('./prettifyTime'); +const logger = require('../Logger'); +const emoji = require('./emoji'); +const filesize = require('filesize'); + +const LARGE_BUNDLE_SIZE = 1024 * 1024; +const NUM_LARGE_ASSETS = 10; +const COLUMNS = [ + {align: 'left'}, // name + {align: 'right'}, // size + {align: 'right'} // time +]; + +function bundleReport(mainBundle, detailed = false) { + // Get a list of bundles sorted by size + let bundles = Array.from(iterateBundles(mainBundle)).sort( + (a, b) => b.totalSize - a.totalSize + ); + let rows = []; + + for (let bundle of bundles) { + // Add a row for the bundle + rows.push([ + formatFilename(bundle.name, logger.chalk.cyan.bold), + logger.chalk.bold( + prettifySize(bundle.totalSize, bundle.totalSize > LARGE_BUNDLE_SIZE) + ), + logger.chalk.green.bold(prettifyTime(bundle.bundleTime)) + ]); + + // If detailed, generate a list of the top 10 largest assets in the bundle + if (detailed && bundle.assets.size > 1) { + let assets = Array.from(bundle.assets) + .filter(a => a.type === bundle.type) + .sort((a, b) => b.bundledSize - a.bundledSize); + + let largestAssets = assets.slice(0, NUM_LARGE_ASSETS); + for (let asset of largestAssets) { + // Add a row for the asset. + rows.push([ + (asset == assets[assets.length - 1] ? '└── ' : '├── ') + + formatFilename(asset.name, logger.chalk.reset), + logger.chalk.dim(prettifySize(asset.bundledSize)), + logger.chalk.dim(logger.chalk.green(prettifyTime(asset.buildTime))) + ]); + } + + // Show how many more assets there are + if (assets.length > largestAssets.length) { + rows.push([ + '└── ' + + logger.chalk.dim( + `+ ${assets.length - largestAssets.length} more assets` + ) + ]); + } + + // If this isn't the last bundle, add an empty row before the next one + if (bundle !== bundles[bundles.length - 1]) { + rows.push([]); + } + } + } + + // Render table + logger.log(''); + logger.table(COLUMNS, rows); +} + +module.exports = bundleReport; + +function* iterateBundles(bundle) { + yield bundle; + for (let child of bundle.childBundles) { + yield* iterateBundles(child); + } +} + +function prettifySize(size, isLarge) { + let res = filesize(size); + if (isLarge) { + res = logger.chalk.yellow(emoji.warning + ' ' + res); + } else { + res = logger.chalk.magenta(res); + } + + return res; +} + +function formatFilename(filename, color = logger.chalk.reset) { + let dir = path.relative(process.cwd(), path.dirname(filename)); + return ( + logger.chalk.dim(dir + (dir ? path.sep : '')) + + color(path.basename(filename)) + ); +} diff --git a/src/utils/prettifyTime.js b/src/utils/prettifyTime.js new file mode 100644 index 00000000000..27e536a84a3 --- /dev/null +++ b/src/utils/prettifyTime.js @@ -0,0 +1,3 @@ +module.exports = function(time) { + return time < 1000 ? `${time}ms` : `${(time / 1000).toFixed(2)}s`; +}; diff --git a/yarn.lock b/yarn.lock index d79a6dae3a7..2a450393085 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,6 +16,10 @@ acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" +acorn@^5.0.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" + acorn@^5.2.1: version "5.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" @@ -882,6 +886,15 @@ braces@^2.3.0: split-string "^3.0.2" to-regex "^3.0.1" +brfs@^1.2.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.4.4.tgz#fc316bc4880180fa8ee25bcaab65f86910ce1dd5" + dependencies: + quote-stream "^1.0.1" + resolve "^1.1.5" + static-module "^2.1.1" + through2 "^2.0.0" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -973,6 +986,10 @@ bsb-js@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/bsb-js/-/bsb-js-1.0.2.tgz#b9e7af1dfdb8de6191bb36fdff43f59359a7dfe7" +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -1325,7 +1342,7 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.6.0: +concat-stream@^1.6.0, concat-stream@~1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: @@ -1739,6 +1756,12 @@ dotenv@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.0.tgz#0206eb5b336639bf377618a2a304ff00c6a1fddb" +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + dependencies: + readable-stream "^2.0.2" + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -1811,6 +1834,17 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" +escodegen@^1.8.1, escodegen@~1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.5.6" + eslint-scope@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" @@ -1875,6 +1909,10 @@ esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" @@ -1892,7 +1930,7 @@ esrecurse@^4.1.0: estraverse "^4.1.0" object-assign "^4.0.1" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -2019,6 +2057,15 @@ extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" +falafel@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.1.0.tgz#96bb17761daba94f46d001738b3cedf3a67fe06c" + dependencies: + acorn "^5.0.0" + foreach "^2.0.5" + isarray "0.0.1" + object-keys "^1.0.6" + fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" @@ -2059,6 +2106,10 @@ filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" +filesize@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.0.tgz#22d079615624bb6fd3c04026120628a41b3f4efa" + fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" @@ -2126,6 +2177,10 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + foreground-child@^1.5.3, foreground-child@^1.5.6: version "1.5.6" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" @@ -2372,6 +2427,13 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4: version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" +grapheme-breaker@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/grapheme-breaker/-/grapheme-breaker-0.3.2.tgz#5b9e6b78c3832452d2ba2bb1cb830f96276410ac" + dependencies: + brfs "^1.2.0" + unicode-trie "^0.3.1" + graphql-tag@^2.6.0: version "2.6.1" resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.6.1.tgz#4788d509f6e29607d947fc47a40c4e18f736d34a" @@ -4094,6 +4156,14 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-inspect@~1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4" + +object-keys@^1.0.6: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -4148,7 +4218,7 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.2: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" dependencies: @@ -4233,6 +4303,10 @@ p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" +pako@^0.2.5: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" @@ -4714,6 +4788,10 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -4789,6 +4867,14 @@ querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" +quote-stream@^1.0.1, quote-stream@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2" + dependencies: + buffer-equal "0.0.1" + minimist "^1.1.3" + through2 "^2.0.0" + randomatic@^1.1.3: version "1.1.7" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" @@ -4849,6 +4935,18 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable string_decoder "~1.0.3" util-deprecate "~1.0.1" +readable-stream@^2.1.5, readable-stream@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" @@ -5069,7 +5167,7 @@ resolve@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" -resolve@^1.4.0: +resolve@^1.1.5, resolve@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" dependencies: @@ -5267,6 +5365,10 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallow-copy@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -5396,7 +5498,7 @@ source-map@^0.4.2, source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: +source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -5462,6 +5564,12 @@ staged-git-files@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35" +static-eval@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.0.tgz#0e821f8926847def7b4b50cda5d55c04a9b13864" + dependencies: + escodegen "^1.8.1" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -5469,6 +5577,22 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" +static-module@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/static-module/-/static-module-2.1.1.tgz#c771f827177507aff941be65a00fb85c210aa668" + dependencies: + concat-stream "~1.6.0" + duplexer2 "~0.1.4" + escodegen "~1.9.0" + falafel "^2.1.0" + has "^1.0.1" + object-inspect "~1.4.0" + quote-stream "~1.0.2" + readable-stream "~2.3.3" + shallow-copy "~0.0.1" + static-eval "^2.0.0" + through2 "~2.0.3" + "statuses@>= 1.3.1 < 2": version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" @@ -5692,6 +5816,13 @@ text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" +through2@^2.0.0, through2@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -5702,6 +5833,10 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +tiny-inflate@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.2.tgz#93d9decffc8805bd57eae4310f0b745e9b6fb3a7" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -5839,6 +5974,13 @@ underscore.string@2.3.x: version "2.3.3" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.3.3.tgz#71c08bf6b428b1133f37e78fa3a21c82f7329b0d" +unicode-trie@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-0.3.1.tgz#d671dddd89101a08bac37b6a5161010602052085" + dependencies: + pako "^0.2.5" + tiny-inflate "^1.0.0" + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -6036,7 +6178,7 @@ ws@^4.0.0: safe-buffer "~5.1.0" ultron "~1.1.0" -xtend@^4.0.0, xtend@^4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"