diff --git a/frontend/.gitignore b/frontend/.gitignore index a3f8b06331..a27b31eae6 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -7,6 +7,7 @@ node_modules # Artifacts +.babel_loader_cache .nyc_output coverage dist diff --git a/frontend/app/webpack-stats.json b/frontend/app/webpack-stats.json deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frontend/app/webpack.common.config.js b/frontend/app/webpack.common.config.js deleted file mode 100644 index 8adf16d3da..0000000000 --- a/frontend/app/webpack.common.config.js +++ /dev/null @@ -1,33 +0,0 @@ -const path = require('path'); -const webpack = require('webpack'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); - -module.exports = Object.assign({}, ...['en', 'de'].map(lang => ({ - [lang]: { - plugins: [ - new HtmlWebpackPlugin({ - template: path.join(__dirname, 'src/index.tpl.html'), - inject: 'body', - filename: `index.${lang}.html` - }), - new webpack.NoEmitOnErrorsPlugin(), - new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /de/) - ], - module: { - rules: [{ - test: /\.js$/, - exclude: path.join(__dirname, '../node_modules/'), - loader: 'babel-loader' - }, { - test: /\.json$/, - loader: 'json-loader' - }, { - test: /\.yml$/, - loader: 'json-loader!yaml-loader' - }, { - test: /\.(ttf|eot|svg|png|jpg|woff(2)?)(\?.*$|$)/, - loader: "file-loader?name=[name].[ext]" - }] - } - } -}))); diff --git a/frontend/app/webpack.config.js b/frontend/app/webpack.config.js index 0d6f56fe73..5b02ce8b2f 100644 --- a/frontend/app/webpack.config.js +++ b/frontend/app/webpack.config.js @@ -1,40 +1,93 @@ const path = require('path'); const webpack = require('webpack'); +const { getIfUtils, removeEmpty } = require('webpack-config-utils'); const ProgressBarPlugin = require('progress-bar-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; -const commonConfig = require('./webpack.common.config.js'); +const { ifProduction, ifDevelopment } = getIfUtils(process.env.NODE_ENV || 'development'); module.exports = ['en', 'de'].map(lang => ({ - ...commonConfig[lang], name: lang, - devtool: 'eval-source-map', + devtool: ifDevelopment('eval-source-map'), entry: { - main: [ + main: removeEmpty([ 'babel-polyfill', - 'webpack-hot-middleware/client?reload=true', + ifDevelopment('webpack-hot-middleware/client?reload=true'), path.join(__dirname, `src/js/main.${lang}.js`) - ] + ]) }, output: { path: path.join(__dirname, 'dist/'), - filename: `[name].${lang}.js`, - publicPath: '/' + filename: ifProduction(`[name]-[hash].${lang}.min.js`, `[name].${lang}.js`), + publicPath: '/', + pathinfo: ifDevelopment(true, false) }, - plugins: [ - ...commonConfig[lang].plugins, - new ProgressBarPlugin(), - new webpack.HotModuleReplacementPlugin(), - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify('development') + plugins: removeEmpty([ + new HtmlWebpackPlugin({ + template: path.join(__dirname, 'src/index.tpl.html'), + inject: 'body', + filename: `index.${lang}.html` }), - ], + new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /de/), + ifProduction(new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV) + })), + ifProduction(new ExtractTextPlugin({ + filename: `[name]-[hash].${lang}.min.css`, allChunks: true + })), + ifProduction(new webpack.optimize.ModuleConcatenationPlugin()), + ifProduction(new webpack.optimize.UglifyJsPlugin({ + compressor: { + warnings: false, + screw_ie8: true + } + })), + ifProduction(new BundleAnalyzerPlugin({ + generateStatsFile: true, + analyzerMode: 'static' // Set to 'server' to analyze + })), + ifProduction(new webpack.NoEmitOnErrorsPlugin()), + ifDevelopment(new ProgressBarPlugin()), + ifDevelopment(new webpack.HotModuleReplacementPlugin()), + ]), module: { - ...commonConfig[lang].module, rules: [ - ...commonConfig[lang].module.rules, + { + test: /\.js$/, + exclude: path.join(__dirname, '../node_modules/'), + loader: 'babel-loader', + options: { cacheDirectory: '../.babel_loader_cache' } + }, { + test: /\.json$/, + loader: 'json-loader' + }, { + test: /\.yml$/, + loader: 'json-loader!yaml-loader' + }, { + test: /\.(ttf|eot|svg|png|jpg|woff(2)?)(\?.*$|$)/, + loader: "file-loader?name=[name].[ext]" + }, { test: /\.sass$/, - loaders: [ + use: ifProduction( + ExtractTextPlugin.extract({ + fallback: 'style-loader', + use: [ + 'css-loader', + { loader: 'postcss-loader', options: { sourceMap: true } }, + 'resolve-url-loader', + { + loader: 'sass-loader', + options: { + indentedSyntax: true, + sourceMap: true, // Necessary for resolve-url + } + } + ] + }), + [ 'style-loader', 'css-loader', { loader: 'postcss-loader', options: { sourceMap: true } }, @@ -44,10 +97,9 @@ module.exports = ['en', 'de'].map(lang => ({ options: { indentedSyntax: true, sourceMap: true, // Necessary for resolve-url - includePaths: [path.join(__dirname, 'node_modules/conquery/dist/styles')] } } - ] + ]) }, ] }, diff --git a/frontend/app/webpack.production.config.js b/frontend/app/webpack.production.config.js deleted file mode 100644 index 65eb7e2332..0000000000 --- a/frontend/app/webpack.production.config.js +++ /dev/null @@ -1,63 +0,0 @@ -const path = require('path'); -const webpack = require('webpack'); -const ExtractTextPlugin = require('extract-text-webpack-plugin'); -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; - -const commonConfig = require('./webpack.common.config.js'); - -module.exports = ['en', 'de'].map(lang => ({ - ...commonConfig[lang], - name: lang, - entry: { - main: [ - 'babel-polyfill', - path.join(__dirname, `src/js/main.${lang}.js`) - ] - }, - output: { - path: path.join(__dirname, '/dist/'), - filename: `[name]-[hash].${lang}.min.js`, - publicPath: '/' - }, - plugins: [ - ...commonConfig[lang].plugins, - new ExtractTextPlugin({ filename: `[name]-[hash].${lang}.min.css`, allChunks: true }), - new webpack.optimize.UglifyJsPlugin({ - compressor: { - warnings: false, - screw_ie8: true - } - }), - new BundleAnalyzerPlugin({ - generateStatsFile: true, - analyzerMode: 'disabled' // Set to 'server' to analyze - }), - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV) - }) - ], - module: { - ...commonConfig[lang].module, - rules: [ - ...commonConfig[lang].module.rules, - { - test: /\.sass$/, - loader: ExtractTextPlugin.extract({ - fallback: 'style-loader', - use: [ - 'css-loader', - { loader: 'postcss-loader', options: { sourceMap: true } }, - 'resolve-url-loader', - { - loader: 'sass-loader', - options: { - indentedSyntax: true, - sourceMap: true, // Necessary for resolve-url - } - } - ] - }) - } - ] - } -})); diff --git a/frontend/package.json b/frontend/package.json index c46ceb571d..7a4d1d76c6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,7 +14,7 @@ "start-production": "cross-env NODE_ENV=production PORT=8000 node app/server > webapp.log 2> webapp-err.log &", "lint": "eslint --ext=js lib/js test app/src/js", "build": "rimraf dist && gulp", - "build-app": "cd app && rimraf dist && cross-env NODE_ENV=production webpack --config ./webpack.production.config.js --progress --profile --colors", + "build-app": "cd app && rimraf dist && cross-env NODE_ENV=production webpack --progress --profile --colors", "heroku-postbuild": "yarn run build-app", "flow": "flow; test $? -eq 0 -o $? -eq 2", "test": "rimraf coverage && cross-env NODE_ENV=test nyc _mocha test", @@ -35,7 +35,7 @@ "isomorphic-fetch": "^2.2.1", "less": "^3.0.1", "moment": "^2.17.0", - "prop-types": "^15.6.0", + "prop-types": "^15.6.1", "query-string": "^5.1.0", "react": "^16.2.0", "react-addons-test-utils": "^15.3.1", @@ -62,7 +62,7 @@ "babel-cli": "^6.26.0", "babel-core": "^6.26.0", "babel-eslint": "^8.2.2", - "babel-loader": "^7.1.2", + "babel-loader": "^7.1.3", "babel-polyfill": "^6.26.0", "babel-preset-env": "^1.6.1", "babel-preset-react": "^6.24.1", @@ -71,23 +71,23 @@ "body-parser": "^1.18.2", "chai": "^4.1.2", "cross-env": "^5.1.3", - "css-loader": "^0.28.9", + "css-loader": "^0.28.10", "dirty-chai": "^2.0.1", "eslint": "^4.18.1", "eslint-config-standard": "^11.0.0", "eslint-config-standard-react": "^6.0.0", "eslint-plugin-babel": "^4.1.2", - "eslint-plugin-flowtype": "^2.6.0", + "eslint-plugin-flowtype": "^2.46.1", "eslint-plugin-import": "^2.9.0", "eslint-plugin-mocha": "^4.11.0", - "eslint-plugin-node": "^6.0.0", + "eslint-plugin-node": "^6.0.1", "eslint-plugin-promise": "^3.6.0", "eslint-plugin-react": "^7.7.0", "eslint-plugin-standard": "^3.0.1", "expect": "^22.4.0", "express": "^4.16.2", "extract-text-webpack-plugin": "^3.0.2", - "file-loader": "^1.1.9", + "file-loader": "^1.1.10", "flow-bin": "^0.66.0", "flow-typed": "^2.3.0", "flux-standard-action": "^2.0.1", @@ -100,13 +100,13 @@ "jsdom-global": "^3.0.2", "mocha": "^5.0.1", "mock-local-storage": "^1.0.5", - "nock": "^9.1.9", + "nock": "^9.2.3", "node-sass": "^4.7.2", "nyc": "^11.4.1", - "postcss-loader": "^2.1.0", + "postcss-loader": "^2.1.1", "progress-bar-webpack-plugin": "^1.11.0", "raw-loader": "^0.5.1", - "react-hot-loader": "^4.0.0-rc.0", + "react-hot-loader": "^4.0.0", "redux-logger": "^3.0.6", "redux-mock-store": "^1.5.1", "resolve-url-loader": "^2.2.1", @@ -116,8 +116,9 @@ "timekeeper": "^2.0.0", "url-loader": "^0.6.2", "webpack": "^3.11.0", - "webpack-bundle-analyzer": "^2.10.0", - "webpack-dev-middleware": "^2.0.5", + "webpack-bundle-analyzer": "^2.11.0", + "webpack-config-utils": "^2.3.0", + "webpack-dev-middleware": "^2.0.6", "webpack-hot-middleware": "^2.21.0", "yaml-loader": "^0.5.0" }, diff --git a/frontend/yarn.lock b/frontend/yarn.lock index fc3b356b6d..19fbcfad48 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -642,9 +642,9 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-loader@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126" +babel-loader@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.3.tgz#ff5b440da716e9153abb946251a9ab7670037b16" dependencies: find-cache-dir "^1.0.0" loader-utils "^1.0.2" @@ -1493,14 +1493,6 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -"chai@>=1.9.2 <4.0.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" - dependencies: - assertion-error "^1.0.1" - deep-eql "^0.1.3" - type-detect "^1.0.0" - chai@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" @@ -1955,9 +1947,9 @@ css-in-js-utils@^2.0.0: dependencies: hyphenate-style-name "^1.0.2" -css-loader@^0.28.9: - version "0.28.9" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.9.tgz#68064b85f4e271d7ce4c48a58300928e535d1c95" +css-loader@^0.28.10: + version "0.28.10" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.10.tgz#40282e79230f7bcb4e483efa631d670b735ebf42" dependencies: babel-code-frame "^6.26.0" css-selector-tokenizer "^0.7.0" @@ -2139,12 +2131,6 @@ deep-diff@^0.3.5: version "0.3.8" resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84" -deep-eql@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" - dependencies: - type-detect "0.1.1" - deep-eql@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" @@ -2609,9 +2595,9 @@ eslint-plugin-babel@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/eslint-plugin-babel/-/eslint-plugin-babel-4.1.2.tgz#79202a0e35757dd92780919b2336f1fa2fe53c1e" -eslint-plugin-flowtype@^2.6.0: - version "2.46.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.46.0.tgz#832e2f6cc75ea33a25b801b6b87f0342f372b362" +eslint-plugin-flowtype@^2.46.1: + version "2.46.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.46.1.tgz#c4f81d580cd89c82bc3a85a1ccf4ae3a915143a4" dependencies: lodash "^4.15.0" @@ -2636,9 +2622,9 @@ eslint-plugin-mocha@^4.11.0: dependencies: ramda "^0.24.1" -eslint-plugin-node@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-6.0.0.tgz#5ad5ee6b5346aec6cc9cde0b8619caed2c6d8f25" +eslint-plugin-node@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz#bf19642298064379315d7a4b2a75937376fa05e4" dependencies: ignore "^3.3.6" minimatch "^3.0.4" @@ -2979,9 +2965,9 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" -file-loader@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.9.tgz#cf152aedbcfb3d67038d0845efb7cf11a96e53de" +file-loader@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.10.tgz#77e97dfeab13da64c7085ab3e3887e29ae588aea" dependencies: loader-utils "^1.0.2" schema-utils "^0.4.5" @@ -4831,7 +4817,7 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.2, lodash@~4.17.4: +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.4: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" @@ -5220,19 +5206,19 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -nock@^9.1.9: - version "9.1.9" - resolved "https://registry.yarnpkg.com/nock/-/nock-9.1.9.tgz#eec261a1b5876e066bc9f9b3da320ffea1663e4d" +nock@^9.2.3: + version "9.2.3" + resolved "https://registry.yarnpkg.com/nock/-/nock-9.2.3.tgz#39738087d6a0497d3a165fb352612b38a2f9b92f" dependencies: - chai ">=1.9.2 <4.0.0" - debug "^2.2.0" + chai "^4.1.2" + debug "^3.1.0" deep-equal "^1.0.0" json-stringify-safe "^5.0.1" - lodash "~4.17.2" + lodash "^4.17.5" mkdirp "^0.5.0" - propagate "0.4.0" + propagate "^1.0.0" qs "^6.5.1" - semver "^5.3.0" + semver "^5.5.0" node-fetch@^1.0.1: version "1.7.3" @@ -5930,9 +5916,9 @@ postcss-load-plugins@^2.3.0: cosmiconfig "^2.1.1" object-assign "^4.1.0" -postcss-loader@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.1.0.tgz#038c2d6d59753fef4667827fd3ae03f5dc5e6a7a" +postcss-loader@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.1.1.tgz#208935af3b1d65e1abb1a870a912dd12e7b36895" dependencies: loader-utils "^1.1.0" postcss "^6.0.0" @@ -6206,9 +6192,17 @@ prop-types@15, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.7, prop loose-envify "^1.3.1" object-assign "^4.1.1" -propagate@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/propagate/-/propagate-0.4.0.tgz#f3fcca0a6fe06736a7ba572966069617c130b481" +prop-types@^15.6.1: + version "15.6.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +propagate@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/propagate/-/propagate-1.0.0.tgz#00c2daeedda20e87e3782b344adba1cddd6ad709" proxy-addr@~2.0.2: version "2.0.3" @@ -6264,6 +6258,10 @@ qs@6.5.1, qs@^6.5.1, qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" +qs@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.1.tgz#801fee030e0b9450d6385adc48a4cc55b44aedfc" + qs@~6.3.0: version "6.3.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" @@ -6391,9 +6389,9 @@ react-dropzone@^4.2.8: attr-accept "^1.0.3" prop-types "^15.5.7" -react-hot-loader@^4.0.0-rc.0: - version "4.0.0-rc.0" - resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.0.0-rc.0.tgz#54d931dafeface5119c741d44ccc3e75fbb432e8" +react-hot-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.0.0.tgz#3452fa9bc0d0ba9dfc5b0ccfa25101ca8dbd2de2" dependencies: fast-levenshtein "^2.0.6" global "^4.3.0" @@ -7692,14 +7690,6 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" - -type-detect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" - type-detect@^4.0.0: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -7984,9 +7974,9 @@ webidl-conversions@^4.0.1, webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" -webpack-bundle-analyzer@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.10.0.tgz#d0646cda342939f6f05eb632a090abbd90317446" +webpack-bundle-analyzer@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.11.0.tgz#ed6f6ab59f5b341ffb60849ca707a7fe841c4f86" dependencies: acorn "^5.3.0" bfj-node4 "^5.2.0" @@ -8001,9 +7991,21 @@ webpack-bundle-analyzer@^2.10.0: opener "^1.4.3" ws "^4.0.0" -webpack-dev-middleware@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-2.0.5.tgz#2a1d07afb599e1993033d72c2181ec2344c15e31" +webpack-combine-loaders@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-combine-loaders/-/webpack-combine-loaders-2.0.0.tgz#c8cd033ec797748b569c7823f54d4481670f3e05" + dependencies: + qs "^5.2.0" + +webpack-config-utils@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/webpack-config-utils/-/webpack-config-utils-2.3.0.tgz#49aa66984a85a7c2c9991343137e8dd11b610afa" + dependencies: + webpack-combine-loaders "2.0.0" + +webpack-dev-middleware@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz#a51692801e8310844ef3e3790e1eacfe52326fd4" dependencies: loud-rejection "^1.6.0" memory-fs "~0.4.1"