From 2fdf3649473abd2f30bc8ad4c8f425b0cb281354 Mon Sep 17 00:00:00 2001 From: Jonathan Cremin Date: Sun, 7 May 2017 00:02:20 +0100 Subject: [PATCH] Add static asset invalidation. --- app.js | 8 ++ lib/render.js | 2 +- package.json | 5 +- public/src/entry-client.js | 1 + public/src/style/style.css | 177 ------------------------------------- views/index.html | 5 +- webpack.config.js | 30 +++++-- webpack.config.server.js | 7 +- yarn.lock | 142 +++++++++++------------------ 9 files changed, 92 insertions(+), 285 deletions(-) delete mode 100644 public/src/style/style.css diff --git a/app.js b/app.js index ca4e7aa..23c53bf 100644 --- a/app.js +++ b/app.js @@ -1,3 +1,4 @@ +import fs from 'fs'; import path from 'path'; import zlib from 'zlib'; import koa from 'koa'; @@ -32,6 +33,13 @@ app.use(favicon(path.join(__dirname, '/public/images/favicon.png'))); app.use(logger()); app.use(serve('public', { maxage: 31536000000 })); +const manifest = JSON.parse(fs.readFileSync(path.join(__dirname, '/public/dist/manifest.json'))); + +app.use(function *(next) { + this.state = { manifest }; + yield next; +}); + app.use(views(path.resolve(__dirname, './views'), { map: { html: 'ejs', diff --git a/lib/render.js b/lib/render.js index 997e3d8..9e46ce0 100644 --- a/lib/render.js +++ b/lib/render.js @@ -1,7 +1,7 @@ import fs from 'fs'; import { createBundleRenderer } from 'vue-server-renderer'; -const app = fs.readFileSync('./public/dist/js/build-server.js', 'utf8'); +const app = fs.readFileSync('./public/dist/js/main-server.js', 'utf8'); export default function(url, initialState) { const renderer = createBundleRenderer(app); diff --git a/package.json b/package.json index db6300b..8dc9d33 100644 --- a/package.json +++ b/package.json @@ -51,10 +51,10 @@ "bluebird": "^3.4.1", "bulma": "^0.4.1", "co": "~4.6.0", - "copy-webpack-plugin": "^4.0.1", "css-loader": "^0.28.1", "debug": "^2.6.6", "ejs": "^2.5.2", + "extract-text-webpack-plugin": "^2.1.0", "file-loader": "^0.11.1", "json-loader": "^0.5.4", "kcors": "^1.0.1", @@ -84,7 +84,8 @@ "vue-template-compiler": "^2.3.2", "vuex": "^2.3.1", "vuex-router-sync": "^4.1.2", - "webpack": "^2.5.0" + "webpack": "^2.5.0", + "webpack-stats-plugin": "^0.1.5" }, "devDependencies": { "babel-plugin-transform-runtime": "^6.15.0", diff --git a/public/src/entry-client.js b/public/src/entry-client.js index 6469de0..9b12e8b 100644 --- a/public/src/entry-client.js +++ b/public/src/entry-client.js @@ -1,3 +1,4 @@ +import { style } from 'bulma/css/bulma.css'; import { sync } from 'vuex-router-sync'; import { app, store, router } from './app'; diff --git a/public/src/style/style.css b/public/src/style/style.css deleted file mode 100644 index d041677..0000000 --- a/public/src/style/style.css +++ /dev/null @@ -1,177 +0,0 @@ -/* app.vue */ -body { - color: #445470; - background: #fff; -} -.header { - background: #FE4365; -} -h1 { - padding: 25px 0; -} -h1 a { - color: #fff; -} -h1 a:hover { - color: #ffacc5; -} -.share { - margin-bottom: 40px; -} -.share h1 { - text-align: left; - font-size: 1.5em; - line-height: 36px; - padding: 5px 0; -} -.title a:hover { - border-bottom: none; -} -h1 .lighter { - color: #ffacc5; -} -.footer { - margin-top: 50px; - padding-bottom: 40px; -} - -/* index.vue */ - -.blurb { - margin-bottom: 50px; -} -.recently-shared { - margin-bottom: 50px; -} -.faq { - margin-bottom: 50px; -} -.faq p { - margin-bottom: 30px; -} -.home { - max-width: 600px; - margin-top: 40px; -} -p { - margin-bottom: 10px; -} -.recent .artwork { - margin-bottom: 30px; -} -.artwork { - position: relative; - width: 100%; - height: 0; - padding-bottom: 100%; - background-repeat: no-repeat; - background-size: cover; - border-radius: 5px; -} - -/* search.vue */ - -.button.is-primary { - background-color: #FE4365; -} -.button.is-primary:hover { - background-color: #E52A4C; -} -.button.is-primary:focus { - background-color: #E52A4C; -} -.input:active { - border-color: #FE4365; -} -.input:focus { - border-color: #FE4365; -} -.search { - margin-bottom: 25vh; -} -form { - margin-top: 25vh; - margin-bottom: 20px; -} - -/* share.vue */ - -.share-heading { - margin-bottom: 50px -} -.share-heading .title { - color: #8396b0; -} -.share-heading .title strong { - color: #445470; - font-weight: 700; -} -.artwork { - position: relative; - width: 100%; - height: 0; - padding-bottom: 100%; - background-repeat: no-repeat; - background-size: cover; - border-radius: 5px; -} -.artwork-youtube { - background-position: 50% 0%; -} -.service { - position: relative; - margin-bottom: 10px; -} -.service-link img { - margin-top: 20px; - margin-bottom: 20px; - height: 40px; -} -img { - vertical-align: middle; -} -.not-found { - opacity: 0.2; -} -.match { - position: relative; -} -.no-match { - position: absolute; - top: 10px; - right: 10px; - background: #fff; - color: #FE4365; - padding: 3px 6px; - border-radius: 3px; - opacity: 0.7; - font-weight: bold; -} -.loading-wrap { - position: absolute; - top: 0;left: 0; - background: #fff; - height: 100%; - width: 100%; - opacity: 0.8; -} -.loading { - position: absolute; - top: 35%; - left: 40%; - width: 20%; -} - -/* social.vue */ - -.social { - text-align: center; - font-weight: 300; - float: right; -} -.social li { - display: inline; - list-style-type: none; - padding-right: 10px; - float: left; -} diff --git a/views/index.html b/views/index.html index c10fb46..7cab137 100644 --- a/views/index.html +++ b/views/index.html @@ -2,8 +2,7 @@ Match Audio • <%=head.title%> - - + @@ -28,6 +27,6 @@ ga('create', 'UA-66209-8', 'auto'); ga('send', 'pageview'); - + diff --git a/webpack.config.js b/webpack.config.js index f6a8f24..6886afa 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,13 +1,14 @@ const path = require('path'); const webpack = require('webpack'); -const CopyWebpackPlugin = require('copy-webpack-plugin'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); +const StatsWriterPlugin = require('webpack-stats-plugin').StatsWriterPlugin; module.exports = { entry: './public/src/entry-client.js', output: { path: path.resolve(__dirname, './public/dist'), publicPath: '/dist/', - filename: 'js/build-client.js', + filename: 'js/[name].[hash:10].js', }, resolve: { modules: [ @@ -21,20 +22,37 @@ module.exports = { { test: /\.vue$/, loader: 'vue-loader', + options: { + extractCSS: true + }, }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/, }, + { + test: /\.css$/, + loader: ExtractTextPlugin.extract({ fallback: "style-loader", use: "css-loader" }), + }, ], }, devtool: '#source-map', plugins: [ new webpack.optimize.OccurrenceOrderPlugin(), - new CopyWebpackPlugin([{ - from: path.resolve(__dirname, './node_modules/bulma/css'), - to: path.resolve(__dirname, './public/dist/css/'), - }]), + new ExtractTextPlugin("style/[name].[hash:10].css"), + new StatsWriterPlugin({ + fields: ['assets'], + filename: 'manifest.json', + transform(stats) { + const manifest = {}; + stats.assets.map(asset => asset.name) + .sort() + .forEach((file) => { + manifest[file.replace(/\.[a-f0-9]{10}\./, '.')] = file; + }); + return JSON.stringify(manifest, null, 2) + '\n'; + } + }), ], }; diff --git a/webpack.config.server.js b/webpack.config.server.js index 0360301..35f05b1 100644 --- a/webpack.config.server.js +++ b/webpack.config.server.js @@ -1,6 +1,5 @@ const path = require('path'); const webpack = require('webpack'); -const CopyWebpackPlugin = require('copy-webpack-plugin'); module.exports = { target: 'node', @@ -9,7 +8,7 @@ module.exports = { libraryTarget: 'commonjs2', path: path.resolve(__dirname, './public/dist'), publicPath: '/dist/', - filename: 'js/build-server.js', + filename: 'js/main-server.js', }, resolve: { modules: [ @@ -23,10 +22,6 @@ module.exports = { 'global.GENTLY': false, }), new webpack.optimize.OccurrenceOrderPlugin(), - new CopyWebpackPlugin([{ - from: path.resolve(__dirname, './node_modules/bulma/css'), - to: path.resolve(__dirname, './public/dist/css/'), - }]), ], module: { loaders: [ diff --git a/yarn.lock b/yarn.lock index 551271b..9fc1b93 100644 --- a/yarn.lock +++ b/yarn.lock @@ -82,7 +82,7 @@ ajv-keywords@^1.0.0, ajv-keywords@^1.1.1: version "1.5.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" -ajv@^4.7.0, ajv@^4.9.1: +ajv@^4.11.2, ajv@^4.7.0, ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" dependencies: @@ -217,10 +217,6 @@ async@^2.1.2: dependencies: lodash "^4.14.0" -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -838,7 +834,7 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^2.10.2, bluebird@^2.3.2: +bluebird@^2.3.2: version "2.11.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" @@ -1185,7 +1181,7 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@2.9.0, commander@^2.8.1, commander@^2.9.0: +commander@2.9.0, commander@^2.8.1, commander@^2.9.0, commander@~2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: @@ -1295,19 +1291,6 @@ copy-to@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" -copy-webpack-plugin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.0.1.tgz#9728e383b94316050d0c7463958f2b85c0aa8200" - dependencies: - bluebird "^2.10.2" - fs-extra "^0.26.4" - glob "^6.0.4" - is-glob "^3.1.0" - loader-utils "^0.2.15" - lodash "^4.3.0" - minimatch "^3.0.0" - node-dir "^0.1.10" - core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" @@ -1501,18 +1484,18 @@ de-indent@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" -debug@*, debug@2.2.0, debug@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" - -debug@2, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.6.0, debug@^2.6.6: +debug@*, debug@2, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.6.0, debug@^2.6.6: version "2.6.6" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.6.tgz#a9fa6fbe9ca43cf1e79f73b75c0189cbb7d6db5a" dependencies: ms "0.7.3" +debug@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + debug@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" @@ -1971,6 +1954,15 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" +extract-text-webpack-plugin@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.0.tgz#69315b885f876dbf96d3819f6a9f1cca7aebf159" + dependencies: + ajv "^4.11.2" + async "^2.1.2" + loader-utils "^1.0.2" + webpack-sources "^0.1.0" + extsprintf@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" @@ -2087,16 +2079,6 @@ from@~0: version "0.1.7" resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" -fs-extra@^0.26.4: - version "0.26.7" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - fs-readdir-recursive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" @@ -2208,16 +2190,6 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - globals@^9.0.0, globals@^9.14.0: version "9.17.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" @@ -2248,7 +2220,7 @@ got@^3.2.0: read-all-stream "^3.0.0" timed-out "^2.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -2546,10 +2518,6 @@ is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" -is-extglob@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" @@ -2576,12 +2544,6 @@ is-glob@^2.0.0, is-glob@^2.0.1: dependencies: is-extglob "^1.0.0" -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - is-my-json-valid@^2.10.0: version "2.16.0" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" @@ -2781,12 +2743,6 @@ json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - optionalDependencies: - graceful-fs "^4.1.6" - jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -2820,12 +2776,6 @@ kind-of@^3.0.2: dependencies: is-buffer "^1.1.5" -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - optionalDependencies: - graceful-fs "^4.1.9" - koa-bodyparser@^2.2.0: version "2.5.0" resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-2.5.0.tgz#3eb7243f47998a2e772db05f6dc4e0f4f3ccbdf0" @@ -2984,7 +2934,7 @@ loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" -loader-utils@^0.2.15, loader-utils@^0.2.16: +loader-utils@^0.2.16: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" dependencies: @@ -3313,12 +3263,6 @@ nested-error-stacks@^1.0.0: dependencies: inherits "~2.0.1" -node-dir@^0.1.10: - version "0.1.16" - resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.16.tgz#d2ef583aa50b90d93db8cdd26fcea58353957fe4" - dependencies: - minimatch "^3.0.2" - node-libs-browser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" @@ -4329,11 +4273,11 @@ resolve-path@^1.0.0, resolve-path@^1.3.1: http-errors "~1.5.0" path-is-absolute "1.0.1" -resolve@1.1.x, resolve@^1.1.6: +resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" -resolve@^1.2.0, resolve@^1.3.3: +resolve@^1.1.6, resolve@^1.2.0, resolve@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" dependencies: @@ -4545,7 +4489,7 @@ sort-keys@^1.0.0: dependencies: is-plain-obj "^1.0.0" -source-list-map@^0.1.7: +source-list-map@^0.1.7, source-list-map@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" @@ -4931,16 +4875,7 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -uglify-js@^2.6: - version "2.7.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" - dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" - -uglify-js@^2.8.5: +uglify-js@^2.6, uglify-js@^2.8.5: version "2.8.22" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0" dependencies: @@ -4949,10 +4884,26 @@ uglify-js@^2.8.5: optionalDependencies: uglify-to-browserify "~1.0.0" +uglify-js@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.0.tgz#c1089d3f37b6366cb1baf12280bf67316891568c" + dependencies: + commander "~2.9.0" + source-map "~0.5.1" + optionalDependencies: + uglify-to-browserify "~1.0.0" + uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" +uglifyjs-webpack-plugin@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.3.tgz#a672a7d6655f94dfa7e09670d48030f37cc93267" + dependencies: + source-map "^0.5.6" + webpack-sources "^0.2.3" + uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" @@ -5144,6 +5095,13 @@ watchpack@^1.3.1: chokidar "^1.4.3" graceful-fs "^4.1.2" +webpack-sources@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.1.5.tgz#aa1f3abf0f0d74db7111c40e500b84f966640750" + dependencies: + source-list-map "~0.1.7" + source-map "~0.5.3" + webpack-sources@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb" @@ -5151,6 +5109,10 @@ webpack-sources@^0.2.3: source-list-map "^1.1.1" source-map "~0.5.3" +webpack-stats-plugin@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/webpack-stats-plugin/-/webpack-stats-plugin-0.1.5.tgz#29e5f12ebfd53158d31d656a113ac1f7b86179d9" + webpack@^2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.5.1.tgz#61742f0cf8af555b87460a9cd8bba2f1e3ee2fce"