diff options
author | Stas Vilchik <stas.vilchik@sonarsource.com> | 2017-06-14 11:10:48 +0200 |
---|---|---|
committer | Stas Vilchik <stas.vilchik@sonarsource.com> | 2017-06-15 00:22:22 -0700 |
commit | f7e9c0f2ac6d5a80d2719ea0cecfa4ced05216d4 (patch) | |
tree | 4b3d737eb2e756674cade0b163be3432af122647 /server/sonar-web | |
parent | b33d63ad5fb20e1b25ab377770fd91c6cb8f7cda (diff) | |
download | sonarqube-f7e9c0f2ac6d5a80d2719ea0cecfa4ced05216d4.tar.gz sonarqube-f7e9c0f2ac6d5a80d2719ea0cecfa4ced05216d4.zip |
simplify config of sonar-web
Diffstat (limited to 'server/sonar-web')
-rw-r--r-- | server/sonar-web/.eslintignore | 3 | ||||
-rw-r--r-- | server/sonar-web/config/env.js | 42 | ||||
-rw-r--r-- | server/sonar-web/config/jest/FileStub.js | 2 | ||||
-rw-r--r-- | server/sonar-web/config/jest/SetupTestEnvironment.js | 4 | ||||
-rw-r--r-- | server/sonar-web/config/paths.js | 17 | ||||
-rw-r--r-- | server/sonar-web/config/polyfills.js | 1 | ||||
-rw-r--r-- | server/sonar-web/config/webpack.config.js | 162 | ||||
-rw-r--r-- | server/sonar-web/config/webpack/webpack.config.base.js | 104 | ||||
-rw-r--r-- | server/sonar-web/config/webpack/webpack.config.dev.js | 95 | ||||
-rw-r--r-- | server/sonar-web/config/webpack/webpack.config.fast.js | 47 | ||||
-rw-r--r-- | server/sonar-web/config/webpack/webpack.config.prod.js | 89 | ||||
-rw-r--r-- | server/sonar-web/package.json | 12 | ||||
-rw-r--r-- | server/sonar-web/scripts/analyze.js | 5 | ||||
-rw-r--r-- | server/sonar-web/scripts/build.js | 44 | ||||
-rw-r--r-- | server/sonar-web/scripts/start.js | 172 | ||||
-rw-r--r-- | server/sonar-web/scripts/test.js | 8 | ||||
-rw-r--r-- | server/sonar-web/scripts/utils/formatSize.js | 10 | ||||
-rw-r--r-- | server/sonar-web/yarn.lock | 104 |
18 files changed, 305 insertions, 616 deletions
diff --git a/server/sonar-web/.eslintignore b/server/sonar-web/.eslintignore index fbff2a98255..49b0bda4a35 100644 --- a/server/sonar-web/.eslintignore +++ b/server/sonar-web/.eslintignore @@ -1,5 +1,2 @@ src/main/js/libs src/main/js/app/components/GlobalFooterBranding.js -tests -scripts -config diff --git a/server/sonar-web/config/env.js b/server/sonar-web/config/env.js deleted file mode 100644 index 77aa261dab7..00000000000 --- a/server/sonar-web/config/env.js +++ /dev/null @@ -1,42 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -// Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be -// injected into the application via DefinePlugin in Webpack configuration. - -var REACT_APP = /^REACT_APP_/i; - -function getClientEnvironment () { - return Object - .keys(process.env) - .filter(key => REACT_APP.test(key)) - .reduce((env, key) => { - env['process.env.' + key] = JSON.stringify(process.env[key]); - return env; - }, { - // Useful for determining whether we’re running in production mode. - // Most importantly, it switches React into the correct mode. - 'process.env.NODE_ENV': JSON.stringify( - process.env.NODE_ENV || 'development' - ) - }); -} - -module.exports = getClientEnvironment; - diff --git a/server/sonar-web/config/jest/FileStub.js b/server/sonar-web/config/jest/FileStub.js index 70a6c197806..bff56dc8933 100644 --- a/server/sonar-web/config/jest/FileStub.js +++ b/server/sonar-web/config/jest/FileStub.js @@ -17,4 +17,4 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -module.exports = "test-file-stub"; +module.exports = 'test-file-stub'; diff --git a/server/sonar-web/config/jest/SetupTestEnvironment.js b/server/sonar-web/config/jest/SetupTestEnvironment.js index 536db746157..64c8d0c15aa 100644 --- a/server/sonar-web/config/jest/SetupTestEnvironment.js +++ b/server/sonar-web/config/jest/SetupTestEnvironment.js @@ -18,7 +18,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ window.baseUrl = ''; -window.t = window.tp = function () { - var args = Array.prototype.slice.call(arguments, 0); +window.t = window.tp = function() { + const args = Array.prototype.slice.call(arguments, 0); return args.join('.'); }; diff --git a/server/sonar-web/config/paths.js b/server/sonar-web/config/paths.js index 3773a6a6439..5b380588750 100644 --- a/server/sonar-web/config/paths.js +++ b/server/sonar-web/config/paths.js @@ -17,12 +17,12 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -var path = require('path'); -var fs = require('fs'); +const path = require('path'); +const fs = require('fs'); // Make sure any symlinks in the project folder are resolved: // https://github.com/facebookincubator/create-react-app/issues/637 -var appDirectory = fs.realpathSync(process.cwd()); +const appDirectory = fs.realpathSync(process.cwd()); function resolveApp(relativePath) { return path.resolve(appDirectory, relativePath); } @@ -38,10 +38,10 @@ function resolveApp(relativePath) { // It will then be used by Webpack configs. // Jest doesn’t need this because it already handles `NODE_PATH` out of the box. -var nodePaths = (process.env.NODE_PATH || '') - .split(process.platform === 'win32' ? ';' : ':') - .filter(Boolean) - .map(resolveApp); +const nodePaths = (process.env.NODE_PATH || '') + .split(process.platform === 'win32' ? ';' : ':') + .filter(Boolean) + .map(resolveApp); // config after eject: we're in ./config/ module.exports = { @@ -55,6 +55,5 @@ module.exports = { htmlBuild: resolveApp('src/main/webapp/index.html'), appNodeModules: resolveApp('node_modules'), ownNodeModules: resolveApp('node_modules'), - nodePaths: nodePaths + nodePaths }; - diff --git a/server/sonar-web/config/polyfills.js b/server/sonar-web/config/polyfills.js index 3b51c254e7a..fdb2b100715 100644 --- a/server/sonar-web/config/polyfills.js +++ b/server/sonar-web/config/polyfills.js @@ -19,4 +19,3 @@ */ import 'babel-polyfill'; import 'whatwg-fetch'; - diff --git a/server/sonar-web/config/webpack.config.js b/server/sonar-web/config/webpack.config.js new file mode 100644 index 00000000000..33fe812c428 --- /dev/null +++ b/server/sonar-web/config/webpack.config.js @@ -0,0 +1,162 @@ +const path = require('path'); +const autoprefixer = require('autoprefixer'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin'); +const webpack = require('webpack'); +const paths = require('./paths'); +const autoprefixerOptions = require('./autoprefixer'); + +module.exports = ({ production = true, fast = false }) => ({ + bail: production, + + devtool: production ? fast ? false : 'source-map' : 'cheap-module-eval-source-map', + + entry: { + vendor: [ + !production && require.resolve('react-dev-utils/webpackHotDevClient'), + require.resolve('./polyfills'), + 'jquery', + 'underscore', + 'lodash', + 'd3-array', + 'd3-hierarchy', + 'd3-scale', + 'd3-selection', + 'd3-shape', + 'react', + 'react-dom', + 'backbone', + 'backbone.marionette', + 'moment', + 'handlebars/runtime', + './src/main/js/libs/third-party/jquery-ui.js', + './src/main/js/libs/third-party/select2.js', + './src/main/js/libs/third-party/bootstrap/tooltip.js', + './src/main/js/libs/third-party/bootstrap/dropdown.js' + ].filter(Boolean), + + app: [ + './src/main/js/app/utils/setPublicPath.js', + './src/main/js/app/index.js', + './src/main/js/components/SourceViewer/SourceViewer.js' + ] + }, + output: { + path: paths.appBuild, + pathinfo: !production, + filename: production ? 'js/[name].[chunkhash:8].js' : 'js/[name].js', + chunkFilename: production ? 'js/[name].[chunkhash:8].chunk.js' : 'js/[name].chunk.js' + }, + resolve: { + // This allows you to set a fallback for where Webpack should look for modules. + // We read `NODE_PATH` environment variable in `paths.js` and pass paths here. + // We use `fallback` instead of `root` because we want `node_modules` to "win" + // if there any conflicts. This matches Node resolution mechanism. + // https://github.com/facebookincubator/create-react-app/issues/253 + fallback: paths.nodePaths + }, + module: { + // First, run the linter. + // It's important to do this before Babel processes the JS. + // Run for development or full build + preLoaders: !production || !fast + ? [ + { + test: /\.js$/, + loader: 'eslint', + include: paths.appSrc + } + ] + : [], + loaders: [ + { + test: /\.js$/, + loader: 'babel', + exclude: /(node_modules|libs)/ + }, + { + test: /(blueimp-md5|numeral)/, + loader: 'imports?define=>false' + }, + { + test: /\.hbs$/, + loader: 'handlebars', + query: { + helperDirs: path.join(__dirname, '../src/main/js/helpers/handlebars') + } + }, + { + test: /\.css$/, + loader: 'style!css!postcss' + }, + { + test: /\.less$/, + loader: ExtractTextPlugin.extract('style', 'css?-url!postcss!less') + }, + { test: require.resolve('jquery'), loader: 'expose?$!expose?jQuery' }, + { test: require.resolve('underscore'), loader: 'expose?_' }, + { test: require.resolve('backbone'), loader: 'expose?Backbone' }, + { test: require.resolve('backbone.marionette'), loader: 'expose?Marionette' }, + { test: require.resolve('react'), loader: 'expose?React' }, + { test: require.resolve('react-dom'), loader: 'expose?ReactDOM' } + ] + }, + plugins: [ + new webpack.optimize.CommonsChunkPlugin( + 'vendor', + production ? 'js/vendor.[chunkhash:8].js' : 'js/vendor.js' + ), + + new ExtractTextPlugin(production ? 'css/sonar.[chunkhash:8].css' : 'css/sonar.css', { + allChunks: true + }), + + !production && new InterpolateHtmlPlugin({ WEB_CONTEXT: '' }), + + new HtmlWebpackPlugin({ + inject: false, + template: paths.appHtml, + minify: production && + !fast && { + removeComments: true, + collapseWhitespace: true, + removeRedundantAttributes: true, + useShortDoctype: true, + removeEmptyAttributes: true, + removeStyleLinkTypeAttributes: true, + keepClosingSlash: true, + minifyJS: true, + minifyCSS: true, + minifyURLs: true + } + }), + + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify(production ? 'production' : 'development') + }), + + production && new webpack.optimize.OccurrenceOrderPlugin(), + production && new webpack.optimize.DedupePlugin(), + + production && + !fast && + new webpack.optimize.UglifyJsPlugin({ + compress: { screw_ie8: true, warnings: false }, + mangle: { screw_ie8: true }, + output: { comments: false, screw_ie8: true } + }), + + !production && new webpack.HotModuleReplacementPlugin() + ].filter(Boolean), + postcss() { + return [autoprefixer(autoprefixerOptions)]; + }, + // Some libraries import Node modules but don't use them in the browser. + // Tell Webpack to provide empty mocks for them so importing them works. + node: { + fs: 'empty', + net: 'empty', + tls: 'empty' + } +}); diff --git a/server/sonar-web/config/webpack/webpack.config.base.js b/server/sonar-web/config/webpack/webpack.config.base.js deleted file mode 100644 index e8b615bccf8..00000000000 --- a/server/sonar-web/config/webpack/webpack.config.base.js +++ /dev/null @@ -1,104 +0,0 @@ -var path = require('path'); -var autoprefixer = require('autoprefixer'); -var webpack = require('webpack'); -var ExtractTextPlugin = require('extract-text-webpack-plugin'); -var paths = require('../paths'); -var autoprefixerOptions = require('../autoprefixer'); - -module.exports = { - entry: { - vendor: [ - require.resolve('../polyfills'), - 'jquery', - 'underscore', - 'lodash', - 'd3-array', - 'd3-hierarchy', - 'd3-scale', - 'd3-selection', - 'd3-shape', - 'react', - 'react-dom', - 'backbone', - 'backbone.marionette', - 'moment', - 'handlebars/runtime', - './src/main/js/libs/third-party/jquery-ui.js', - './src/main/js/libs/third-party/select2.js', - './src/main/js/libs/third-party/bootstrap/tooltip.js', - './src/main/js/libs/third-party/bootstrap/dropdown.js' - ], - - app: [ - './src/main/js/app/utils/setPublicPath.js', - './src/main/js/app/index.js', - './src/main/js/components/SourceViewer/SourceViewer.js' - ] - }, - output: { - path: paths.appBuild, - filename: 'js/[name].[chunkhash:8].js', - chunkFilename: 'js/[name].[chunkhash:8].chunk.js' - }, - resolve: { - // This allows you to set a fallback for where Webpack should look for modules. - // We read `NODE_PATH` environment variable in `paths.js` and pass paths here. - // We use `fallback` instead of `root` because we want `node_modules` to "win" - // if there any conflicts. This matches Node resolution mechanism. - // https://github.com/facebookincubator/create-react-app/issues/253 - fallback: paths.nodePaths - }, - module: { - // First, run the linter. - // It's important to do this before Babel processes the JS. - preLoaders: [ - { - test: /\.js$/, - loader: 'eslint', - include: paths.appSrc - } - ], - loaders: [ - { - test: /\.js$/, - loader: 'babel', - exclude: /(node_modules|libs)/ - }, - { - test: /(blueimp-md5|numeral)/, - loader: 'imports?define=>false' - }, - { - test: /\.hbs$/, - loader: 'handlebars', - query: { - helperDirs: path.join(__dirname, '../../src/main/js/helpers/handlebars') - } - }, - { - test: /\.css$/, - loader: 'style!css!postcss' - }, - { - test: /\.less$/, - loader: ExtractTextPlugin.extract('style', 'css?-url!postcss!less') - }, - { test: require.resolve('jquery'), loader: 'expose?$!expose?jQuery' }, - { test: require.resolve('underscore'), loader: 'expose?_' }, - { test: require.resolve('backbone'), loader: 'expose?Backbone' }, - { test: require.resolve('backbone.marionette'), loader: 'expose?Marionette' }, - { test: require.resolve('react'), loader: 'expose?React' }, - { test: require.resolve('react-dom'), loader: 'expose?ReactDOM' } - ] - }, - postcss() { - return [autoprefixer(autoprefixerOptions)]; - }, - // Some libraries import Node modules but don't use them in the browser. - // Tell Webpack to provide empty mocks for them so importing them works. - node: { - fs: 'empty', - net: 'empty', - tls: 'empty' - } -}; diff --git a/server/sonar-web/config/webpack/webpack.config.dev.js b/server/sonar-web/config/webpack/webpack.config.dev.js deleted file mode 100644 index 6f4f4da2fac..00000000000 --- a/server/sonar-web/config/webpack/webpack.config.dev.js +++ /dev/null @@ -1,95 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -var webpack = require('webpack'); -var HtmlWebpackPlugin = require('html-webpack-plugin'); -var ExtractTextPlugin = require('extract-text-webpack-plugin'); -var InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin'); -var CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); -var WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin'); -var paths = require('../paths'); -var config = require('./webpack.config.base'); -var getClientEnvironment = require('../env'); - -var webContext = ''; -var env = getClientEnvironment(); - -// This makes the bundle appear split into separate modules in the devtools. -// We don't use source maps here because they can be confusing: -// https://github.com/facebookincubator/create-react-app/issues/343#issuecomment-237241875 -// You may want 'cheap-module-source-map' instead if you prefer source maps. -config.devtool = 'eval'; - -// Include an alternative client for WebpackDevServer. A client's job is to -// connect to WebpackDevServer by a socket and get notified about changes. -// When you save a file, the client will either apply hot updates (in case -// of CSS changes), or refresh the page (in case of JS changes). When you -// make a syntax error, this client will display a syntax error overlay. -// Note: instead of the default WebpackDevServer client, we use a custom one -// to bring better experience for Create React App users. You can replace -// the line below with these two lines if you prefer the stock client: -// require.resolve('webpack-dev-server/client') + '?/', -// require.resolve('webpack/hot/dev-server'), -config.entry.vendor.unshift(require.resolve('react-dev-utils/webpackHotDevClient')); - -// Add /* filename */ comments to generated require()s in the output. -config.output.pathinfo = true; - -// This is the URL that app is served from. -config.output.filename = 'js/[name].js'; -config.output.chunkFilename = 'js/[name].chunk.js'; - -config.plugins = [ - new webpack.optimize.CommonsChunkPlugin('vendor', 'js/vendor.js'), - - new ExtractTextPlugin('css/sonar.css', { allChunks: true }), - - // Makes the web context available as %WEB_CONTEXT% in index.html, e.g.: - // <link rel="shortcut icon" href="%WEB_CONTEXT%/favicon.ico"> - // In development, this will be an empty string. - new InterpolateHtmlPlugin({ - WEB_CONTEXT: webContext - }), - - // Generates an `index.html` file with the <script> injected. - new HtmlWebpackPlugin({ - inject: false, - template: paths.appHtml - }), - - // Makes some environment variables available to the JS code, for example: - // if (process.env.NODE_ENV === 'development') { ... }. See `./env.js`. - new webpack.DefinePlugin(env), - - // This is necessary to emit hot updates (currently CSS only): - new webpack.HotModuleReplacementPlugin(), - - // Watcher doesn't work well if you mistype casing in a path so we use - // a plugin that prints an error when you attempt to do this. - // See https://github.com/facebookincubator/create-react-app/issues/240 - new CaseSensitivePathsPlugin(), - - // If you require a missing module and then `npm install` it, you still have - // to restart the development server for Webpack to discover it. This plugin - // makes the discovery automatic so you don't have to restart. - // See https://github.com/facebookincubator/create-react-app/issues/186 - new WatchMissingNodeModulesPlugin(paths.appNodeModules) -]; - -module.exports = config; diff --git a/server/sonar-web/config/webpack/webpack.config.fast.js b/server/sonar-web/config/webpack/webpack.config.fast.js deleted file mode 100644 index f0fe4003a3e..00000000000 --- a/server/sonar-web/config/webpack/webpack.config.fast.js +++ /dev/null @@ -1,47 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -var webpack = require('webpack'); -var ExtractTextPlugin = require('extract-text-webpack-plugin'); -var HtmlWebpackPlugin = require('html-webpack-plugin'); -var config = require('./webpack.config.base'); -var getClientEnvironment = require('../env'); -var paths = require('../paths'); - -// Get environment variables to inject into our app. -var env = getClientEnvironment(); - -// disable eslint loader -config.module.preLoaders = []; - -// Don't attempt to continue if there are any errors. -config.bail = true; - -config.plugins = [ - new webpack.optimize.CommonsChunkPlugin('vendor', 'js/vendor.[chunkhash:8].js'), - - new ExtractTextPlugin('css/sonar.[chunkhash:8].css', { allChunks: true }), - - new HtmlWebpackPlugin({ - inject: false, - template: paths.appHtml - }) -]; - -module.exports = config; diff --git a/server/sonar-web/config/webpack/webpack.config.prod.js b/server/sonar-web/config/webpack/webpack.config.prod.js deleted file mode 100644 index 0d351f8eaf1..00000000000 --- a/server/sonar-web/config/webpack/webpack.config.prod.js +++ /dev/null @@ -1,89 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -var webpack = require('webpack'); -var ExtractTextPlugin = require('extract-text-webpack-plugin'); -var HtmlWebpackPlugin = require('html-webpack-plugin'); -var config = require('./webpack.config.base'); -var getClientEnvironment = require('../env'); -var paths = require('../paths'); - -// Get environment variables to inject into our app. -var env = getClientEnvironment(); - -// Assert this just to be safe. -// Development builds of React are slow and not intended for production. -if (env['process.env.NODE_ENV'] !== '"production"') { - throw new Error('Production builds must have NODE_ENV=production.'); -} - -// Don't attempt to continue if there are any errors. -config.bail = true; - -config.plugins = [ - new webpack.optimize.CommonsChunkPlugin('vendor', 'js/vendor.[chunkhash:8].js'), - - new ExtractTextPlugin('css/sonar.[chunkhash:8].css', { allChunks: true }), - - new HtmlWebpackPlugin({ - inject: false, - template: paths.appHtml, - minify: { - removeComments: true, - collapseWhitespace: true, - removeRedundantAttributes: true, - useShortDoctype: true, - removeEmptyAttributes: true, - removeStyleLinkTypeAttributes: true, - keepClosingSlash: true, - minifyJS: true, - minifyCSS: true, - minifyURLs: true - } - }), - - // Makes some environment variables available to the JS code, for example: - // if (process.env.NODE_ENV === 'production') { ... }. See `./env.js`. - // It is absolutely essential that NODE_ENV was set to production here. - // Otherwise React will be compiled in the very slow development mode. - new webpack.DefinePlugin(env), - - // This helps ensure the builds are consistent if source hasn't changed: - new webpack.optimize.OccurrenceOrderPlugin(), - - // Try to dedupe duplicated modules, if any: - new webpack.optimize.DedupePlugin(), - - // Minify the code. - new webpack.optimize.UglifyJsPlugin({ - compress: { - screw_ie8: true, // React doesn't support IE8 - warnings: false - }, - mangle: { - screw_ie8: true - }, - output: { - comments: false, - screw_ie8: true - } - }) -]; - -module.exports = config; diff --git a/server/sonar-web/package.json b/server/sonar-web/package.json index c2a639ea9df..90b1155bfec 100644 --- a/server/sonar-web/package.json +++ b/server/sonar-web/package.json @@ -53,14 +53,11 @@ "babel-plugin-transform-react-jsx-source": "^6.22.0", "babel-preset-env": "^1.1.8", "babel-preset-react": "^6.22.0", - "case-sensitive-paths-webpack-plugin": "1.1.4", "chalk": "1.1.3", "connect-history-api-fallback": "1.3.0", "cross-env": "2.0.0", - "cross-spawn": "4.0.0", "css-loader": "0.23.1", "detect-port": "1.0.0", - "dotenv": "2.0.0", "enzyme": "^2.6.0", "enzyme-to-json": "^1.4.5", "eslint": "^3.12.2", @@ -71,22 +68,18 @@ "eslint-plugin-react": "^6.8.0", "expose-loader": "0.7.1", "express": "4.13.4", - "express-http-proxy": "0.6.0", "extract-text-webpack-plugin": "1.0.1", "file-loader": "0.9.0", - "filesize": "3.3.0", - "find-cache-dir": "0.1.1", "flow-bin": "0.47.0", "fs-extra": "0.30.0", - "gzip-size": "3.0.0", "handlebars-loader": "1.1.4", "html-webpack-plugin": "2.24.1", + "http-proxy-middleware": "0.17.3", "imports-loader": "0.6.5", "jest": "19.0.2", "json-loader": "0.5.4", "less": "2.7.1", "less-loader": "2.2.3", - "path-exists": "2.1.0", "postcss-loader": "0.8.0", "prettier": "1.2.2", "prettier-css": "0.0.7", @@ -94,10 +87,7 @@ "prettier-eslint-cli": "3.4.1", "react-addons-test-utils": "15.4.2", "react-dev-utils": "0.2.1", - "react-transform-hmr": "1.0.4", - "recursive-readdir": "2.1.0", "rimraf": "2.5.4", - "strip-ansi": "3.0.1", "style-loader": "0.13.0", "webpack": "1.13.2", "webpack-bundle-analyzer": "^2.3.1", diff --git a/server/sonar-web/scripts/analyze.js b/server/sonar-web/scripts/analyze.js index 6c9b6dfd10e..dd1121b38c2 100644 --- a/server/sonar-web/scripts/analyze.js +++ b/server/sonar-web/scripts/analyze.js @@ -17,11 +17,14 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +/* eslint-disable no-console */ process.env.NODE_ENV = 'production'; const webpack = require('webpack'); const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; -const config = require('../config/webpack/webpack.config.prod'); +const getConfig = require('../config/webpack.config'); + +const config = getConfig({ production: true }); config.plugins.push(new BundleAnalyzerPlugin()); diff --git a/server/sonar-web/scripts/build.js b/server/sonar-web/scripts/build.js index 8cc9bbef3c6..321cb71c30c 100644 --- a/server/sonar-web/scripts/build.js +++ b/server/sonar-web/scripts/build.js @@ -17,25 +17,24 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +/* eslint-disable no-console*/ process.env.NODE_ENV = 'production'; -var chalk = require('chalk'); -var fs = require('fs-extra'); -var path = require('path'); -var rimrafSync = require('rimraf').sync; -var webpack = require('webpack'); -var paths = require('../config/paths'); -var formatSize = require('./utils/formatSize'); +const chalk = require('chalk'); +const fs = require('fs-extra'); +const rimrafSync = require('rimraf').sync; +const webpack = require('webpack'); +const paths = require('../config/paths'); +const formatSize = require('./utils/formatSize'); +const getConfig = require('../config/webpack.config'); -var isFastBuild = process.argv.some(arg => arg.indexOf('--fast') > -1); +const fast = process.argv.some(arg => arg.indexOf('--fast') > -1); -var config = isFastBuild ? - require('../config/webpack/webpack.config.fast') : - require('../config/webpack/webpack.config.prod'); +const config = getConfig({ fast, production: true }); -function clean () { -// Remove all content but keep the directory so that -// if you're in it, you don't end up in Trash +function clean() { + // Remove all content but keep the directory so that + // if you're in it, you don't end up in Trash console.log(chalk.cyan.bold('Cleaning output directories and files...')); console.log(paths.jsBuild + '/*'); @@ -50,8 +49,8 @@ function clean () { console.log(); } -function build () { - if (isFastBuild) { +function build() { + if (fast) { console.log(chalk.magenta.bold('Running fast build...')); } else { console.log(chalk.cyan.bold('Creating optimized production build...')); @@ -71,20 +70,20 @@ function build () { process.exit(1); } - var jsonStats = stats.toJson(); + const jsonStats = stats.toJson(); console.log('Assets:'); - var assets = jsonStats.assets.slice(); + const assets = jsonStats.assets.slice(); assets.sort((a, b) => b.size - a.size); assets.forEach(asset => { - var sizeLabel = formatSize(asset.size); - var leftPadding = ' '.repeat(Math.max(0, 8 - sizeLabel.length)); + let sizeLabel = formatSize(asset.size); + const leftPadding = ' '.repeat(Math.max(0, 8 - sizeLabel.length)); sizeLabel = leftPadding + sizeLabel; console.log('', chalk.yellow(sizeLabel), asset.name); }); console.log(); - var seconds = jsonStats.time / 1000; + const seconds = jsonStats.time / 1000; console.log('Duration: ' + seconds.toFixed(2) + 's'); console.log(); @@ -92,14 +91,13 @@ function build () { }); } -function copyPublicFolder () { +function copyPublicFolder() { fs.copySync(paths.appPublic, paths.appBuild, { dereference: true, filter: file => file !== paths.appHtml }); } - clean(); build(); copyPublicFolder(); diff --git a/server/sonar-web/scripts/start.js b/server/sonar-web/scripts/start.js index c0ee1f90fe1..a985f1bddd7 100644 --- a/server/sonar-web/scripts/start.js +++ b/server/sonar-web/scripts/start.js @@ -17,35 +17,31 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +/* eslint-disable no-console */ process.env.NODE_ENV = 'development'; -// Load environment variables from .env file. Surpress warnings using silent -// if this file is missing. dotenv will never modify any environment variables -// that have already been set. -// https://github.com/motdotla/dotenv -require('dotenv').config({ silent: true }); +const chalk = require('chalk'); +const webpack = require('webpack'); +const WebpackDevServer = require('webpack-dev-server'); +const historyApiFallback = require('connect-history-api-fallback'); +const httpProxyMiddleware = require('http-proxy-middleware'); +const detect = require('detect-port'); +const clearConsole = require('react-dev-utils/clearConsole'); +const formatWebpackMessages = require('react-dev-utils/formatWebpackMessages'); +const prompt = require('react-dev-utils/prompt'); +const getConfig = require('../config/webpack.config'); +const paths = require('../config/paths'); -var chalk = require('chalk'); -var webpack = require('webpack'); -var WebpackDevServer = require('webpack-dev-server'); -var historyApiFallback = require('connect-history-api-fallback'); -var httpProxyMiddleware = require('http-proxy-middleware'); -var detect = require('detect-port'); -var clearConsole = require('react-dev-utils/clearConsole'); -var checkRequiredFiles = require('react-dev-utils/checkRequiredFiles'); -var formatWebpackMessages = require('react-dev-utils/formatWebpackMessages'); -var prompt = require('react-dev-utils/prompt'); -var config = require('../config/webpack/webpack.config.dev'); -var paths = require('../config/paths'); +const config = getConfig({ production: false }); // Tools like Cloud9 rely on this. -var DEFAULT_PORT = process.env.PORT || 3000; -var compiler; -var handleCompile; +const DEFAULT_PORT = process.env.PORT || 3000; +let compiler; +let handleCompile; -var PROXY_URL = 'http://localhost:9000'; +const PROXY_URL = 'http://localhost:9000'; -function setupCompiler (host, port, protocol) { +function setupCompiler(host, port, protocol) { // "Compiler" is a low-level interface to Webpack. // It lets us listen to some events and provide our own custom messages. compiler = webpack(config, handleCompile); @@ -54,22 +50,22 @@ function setupCompiler (host, port, protocol) { // recompiling a bundle. WebpackDevServer takes care to pause serving the // bundle, so if you refresh, it'll wait instead of serving the old one. // "invalid" is short for "bundle invalidated", it doesn't imply any errors. - compiler.plugin('invalid', function () { + compiler.plugin('invalid', () => { clearConsole(); console.log('Compiling...'); }); // "done" event fires when Webpack has finished recompiling the bundle. // Whether or not you have warnings or errors, you will get this event. - compiler.plugin('done', function (stats) { + compiler.plugin('done', stats => { clearConsole(); // We have switched off the default Webpack output in WebpackDevServer // options so we are going to "massage" the warnings and errors and present // them in a readable focused way. - var jsonStats = stats.toJson({}, true); - var messages = formatWebpackMessages(jsonStats); - var seconds = jsonStats.time / 1000; + const jsonStats = stats.toJson({}, true); + const messages = formatWebpackMessages(jsonStats); + const seconds = jsonStats.time / 1000; if (!messages.errors.length && !messages.warnings.length) { console.log(chalk.green('Compiled successfully!')); console.log('Duration: ' + seconds.toFixed(2) + 's'); @@ -104,24 +100,35 @@ function setupCompiler (host, port, protocol) { }); // Teach some ESLint tricks. console.log('You may use special comments to disable some warnings.'); - console.log('Use ' + chalk.yellow('// eslint-disable-next-line') + ' to ignore the next line.'); - console.log('Use ' + chalk.yellow('/* eslint-disable */') + ' to ignore all warnings in a file.'); + console.log( + 'Use ' + chalk.yellow('// eslint-disable-next-line') + ' to ignore the next line.' + ); + console.log( + 'Use ' + chalk.yellow('/* eslint-disable */') + ' to ignore all warnings in a file.' + ); } }); } // We need to provide a custom onError function for httpProxyMiddleware. // It allows us to log custom error messages on the console. -function onProxyError (proxy) { - return function (err, req, res) { - var host = req.headers && req.headers.host; +function onProxyError(proxy) { + return function(err, req, res) { + const host = req.headers && req.headers.host; console.log( - chalk.red('Proxy error:') + ' Could not proxy request ' + chalk.cyan(req.url) + - ' from ' + chalk.cyan(host) + ' to ' + chalk.cyan(proxy) + '.' + chalk.red('Proxy error:') + + ' Could not proxy request ' + + chalk.cyan(req.url) + + ' from ' + + chalk.cyan(host) + + ' to ' + + chalk.cyan(proxy) + + '.' ); console.log( - 'See https://nodejs.org/api/errors.html#errors_common_system_errors for more information (' + - chalk.cyan(err.code) + ').' + 'See https://nodejs.org/api/errors.html#errors_common_system_errors for more information (' + + chalk.cyan(err.code) + + ').' ); console.log(); @@ -130,31 +137,39 @@ function onProxyError (proxy) { if (res.writeHead && !res.headersSent) { res.writeHead(500); } - res.end('Proxy error: Could not proxy request ' + req.url + ' from ' + - host + ' to ' + proxy + ' (' + err.code + ').' + res.end( + 'Proxy error: Could not proxy request ' + + req.url + + ' from ' + + host + + ' to ' + + proxy + + ' (' + + err.code + + ').' ); - } + }; } -function addMiddleware (devServer) { +function addMiddleware(devServer) { // `proxy` lets you to specify a fallback server during development. // Every unrecognized request will be forwarded to it. - var proxy = PROXY_URL; - devServer.use(historyApiFallback({ - // Paths with dots should still use the history fallback. - // See https://github.com/facebookincubator/create-react-app/issues/387. - disableDotRule: true, - // For single page apps, we generally want to fallback to /index.html. - // However we also want to respect `proxy` for API calls. - // So if `proxy` is specified, we need to decide which fallback to use. - // We use a heuristic: if request `accept`s text/html, we pick /index.html. - // Modern browsers include text/html into `accept` header when navigating. - // However API calls like `fetch()` won’t generally accept text/html. - // If this heuristic doesn’t work well for you, don’t use `proxy`. - htmlAcceptHeaders: proxy ? - ['text/html'] : - ['text/html', '*/*'] - })); + const proxy = PROXY_URL; + devServer.use( + historyApiFallback({ + // Paths with dots should still use the history fallback. + // See https://github.com/facebookincubator/create-react-app/issues/387. + disableDotRule: true, + // For single page apps, we generally want to fallback to /index.html. + // However we also want to respect `proxy` for API calls. + // So if `proxy` is specified, we need to decide which fallback to use. + // We use a heuristic: if request `accept`s text/html, we pick /index.html. + // Modern browsers include text/html into `accept` header when navigating. + // However API calls like `fetch()` won’t generally accept text/html. + // If this heuristic doesn’t work well for you, don’t use `proxy`. + htmlAcceptHeaders: proxy ? ['text/html'] : ['text/html', '*/*'] + }) + ); if (proxy) { if (typeof proxy !== 'string') { console.log(chalk.red('When specified, "proxy" in package.json must be a string.')); @@ -168,17 +183,18 @@ function addMiddleware (devServer) { // - /*.hot-update.json (WebpackDevServer uses this too for hot reloading) // - /sockjs-node/* (WebpackDevServer uses this for hot reloading) // Tip: use https://jex.im/regulex/ to visualize the regex - var mayProxy = /^(?!\/(index\.html$|.*\.hot-update\.json$|sockjs-node\/)).*$/; - devServer.use(mayProxy, - // Pass the scope regex both to Express and to the middleware for proxying - // of both HTTP and WebSockets to work without false positives. - httpProxyMiddleware(pathname => mayProxy.test(pathname), { - target: proxy, - logLevel: 'silent', - onError: onProxyError(proxy), - secure: false, - changeOrigin: true - }) + const mayProxy = /^(?!\/(index\.html$|.*\.hot-update\.json$|sockjs-node\/)).*$/; + devServer.use( + mayProxy, + // Pass the scope regex both to Express and to the middleware for proxying + // of both HTTP and WebSockets to work without false positives. + httpProxyMiddleware(pathname => mayProxy.test(pathname), { + target: proxy, + logLevel: 'silent', + onError: onProxyError(proxy), + secure: false, + changeOrigin: true + }) ); } // Finally, by now we have certainly resolved the URL. @@ -186,8 +202,8 @@ function addMiddleware (devServer) { devServer.use(devServer.middleware); } -function runDevServer (host, port, protocol) { - var devServer = new WebpackDevServer(compiler, { +function runDevServer(host, port, protocol) { + const devServer = new WebpackDevServer(compiler, { // Enable gzip compression of generated files. compress: true, // Silence WebpackDevServer's own logs since they're generally not useful. @@ -226,15 +242,15 @@ function runDevServer (host, port, protocol) { ignored: /node_modules/ }, // Enable HTTPS if the HTTPS environment variable is set to 'true' - https: protocol === "https", - host: host + https: protocol === 'https', + host }); // Our custom middleware proxies requests to /index.html or a remote API. addMiddleware(devServer); // Launch WebpackDevServer. - devServer.listen(port, (err, result) => { + devServer.listen(port, err => { if (err) { return console.log(err); } @@ -245,9 +261,9 @@ function runDevServer (host, port, protocol) { }); } -function run (port) { - var protocol = process.env.HTTPS === 'true' ? "https" : "http"; - var host = process.env.HOST || 'localhost'; +function run(port) { + const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; + const host = process.env.HOST || 'localhost'; setupCompiler(host, port, protocol); runDevServer(host, port, protocol); } @@ -261,9 +277,9 @@ detect(DEFAULT_PORT).then(port => { } clearConsole(); - var question = - chalk.yellow('Something is already running on port ' + DEFAULT_PORT + '.') + - '\n\nWould you like to run the app on another port instead?'; + const question = + chalk.yellow('Something is already running on port ' + DEFAULT_PORT + '.') + + '\n\nWould you like to run the app on another port instead?'; prompt(question, true).then(shouldChangePort => { if (shouldChangePort) { diff --git a/server/sonar-web/scripts/test.js b/server/sonar-web/scripts/test.js index 8ec88828387..b4f37491392 100644 --- a/server/sonar-web/scripts/test.js +++ b/server/sonar-web/scripts/test.js @@ -20,13 +20,8 @@ process.env.NODE_ENV = 'test'; process.env.PUBLIC_URL = ''; -// Load environment variables from .env file. Surpress warnings using silent -// if this file is missing. dotenv will never modify any environment variables -// that have already been set. -// https://github.com/motdotla/dotenv -require('dotenv').config({ silent: true }); - const jest = require('jest'); + const argv = process.argv.slice(2); // Watch unless on CI @@ -35,4 +30,3 @@ if (!process.env.CI) { } jest.run(argv); - diff --git a/server/sonar-web/scripts/utils/formatSize.js b/server/sonar-web/scripts/utils/formatSize.js index 384f686866f..e06ba0e183f 100644 --- a/server/sonar-web/scripts/utils/formatSize.js +++ b/server/sonar-web/scripts/utils/formatSize.js @@ -17,12 +17,12 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -module.exports = function (bytes) { - if (bytes == 0) { +module.exports = function(bytes) { + if (bytes === 0) { return '0'; } - var k = 1000; // or 1024 for binary - var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; - var i = Math.floor(Math.log(bytes) / Math.log(k)); + const k = 1000; // or 1024 for binary + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i]; }; diff --git a/server/sonar-web/yarn.lock b/server/sonar-web/yarn.lock index 322bb67a3c1..22ab3755dd3 100644 --- a/server/sonar-web/yarn.lock +++ b/server/sonar-web/yarn.lock @@ -1013,10 +1013,6 @@ builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" -bytes@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" - bytes@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070" @@ -1070,10 +1066,6 @@ caniuse-db@^1.0.30000617: version "1.0.30000622" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000622.tgz#9d9690b577384990a58e33ebb903a14da735e5fd" -case-sensitive-paths-webpack-plugin@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-1.1.4.tgz#8aaedd5699a86cac2b34cf40d9b4145758978472" - caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" @@ -1388,13 +1380,6 @@ cross-env@2.0.0: cross-spawn "^3.0.1" lodash.assign "^3.2.0" -cross-spawn@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.0.tgz#8254774ab4786b8c5b3cf4dfba66ce563932c252" - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - cross-spawn@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" @@ -1754,10 +1739,6 @@ dom-serializer@0, dom-serializer@~0.1.0: domelementtype "~1.1.1" entities "~1.1.1" -dom-walk@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" - domain-browser@^1.1.1: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" @@ -1795,10 +1776,6 @@ domutils@1.5.1, domutils@^1.5.1: dom-serializer "0" domelementtype "1" -dotenv@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-2.0.0.tgz#bd759c357aaa70365e01c96b7b0bec08a6e0d949" - duplexer@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" @@ -2228,13 +2205,6 @@ expose-loader@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/expose-loader/-/expose-loader-0.7.1.tgz#411ee89443aa682f8ea9d9111accf41bfd7e94d9" -express-http-proxy@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/express-http-proxy/-/express-http-proxy-0.6.0.tgz#2a7bdbefe127f85bfab2c51e869c7488b8d257d0" - dependencies: - raw-body "^1.1.6" - type-is "^1.2.0" - express@4.13.4: version "4.13.4" resolved "https://registry.yarnpkg.com/express/-/express-4.13.4.tgz#3c0b76f3c77590c8345739061ec0bd3ba067ec24" @@ -2403,10 +2373,6 @@ fileset@^2.0.2: glob "^7.0.3" minimatch "^3.0.3" -filesize@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.3.0.tgz#53149ea3460e3b2e024962a51648aa572cf98122" - filesize@^3.5.4: version "3.5.6" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.6.tgz#5fd98f3eac94ec9516ef8ed5782fad84a01a0a1a" @@ -2442,7 +2408,7 @@ finalhandler@~1.0.0: statuses "~1.3.1" unpipe "~1.0.0" -find-cache-dir@0.1.1, find-cache-dir@^0.1.1: +find-cache-dir@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" dependencies: @@ -2645,13 +2611,6 @@ glob@~7.0.6: once "^1.3.0" path-is-absolute "^1.0.0" -global@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.1.tgz#5f757908c7cbabce54f386ae440e11e26b7916df" - dependencies: - min-document "^2.19.0" - process "~0.5.1" - globals@^9.0.0, globals@^9.14.0: version "9.14.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" @@ -2685,7 +2644,7 @@ growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" -gzip-size@3.0.0, gzip-size@^3.0.0: +gzip-size@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" dependencies: @@ -2876,7 +2835,7 @@ http-errors@~1.6.1: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" -http-proxy-middleware@~0.17.1: +http-proxy-middleware@0.17.3, http-proxy-middleware@~0.17.1: version "0.17.3" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.3.tgz#940382147149b856084f5534752d5b5a8168cd1d" dependencies: @@ -2908,10 +2867,6 @@ iconv-lite@0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" -iconv-lite@0.4.8: - version "0.4.8" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.8.tgz#c6019a7595f2cefca702eab694a010bcd9298d20" - iconv-lite@~0.4.13: version "0.4.15" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" @@ -3883,7 +3838,7 @@ lodash@^4.0.0, lodash@^4.15.0, lodash@^4.16.4, lodash@^4.17.2: version "4.17.3" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.3.tgz#557ed7d2a9438cac5fd5a43043ca60cb455e01f7" -lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.6.1: +lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -4025,18 +3980,6 @@ mime@1.3.4, mime@^1.2.11, mime@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - dependencies: - dom-walk "^0.1.0" - -minimatch@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.2.tgz#0f398a7300ea441e9c348c83d98ab8c9dbf9c40a" - dependencies: - brace-expansion "^1.0.0" - minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" @@ -4415,7 +4358,7 @@ path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" -path-exists@2.1.0, path-exists@^2.0.0: +path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" dependencies: @@ -4829,10 +4772,6 @@ process@^0.11.0, process@~0.11.0: version "0.11.9" resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1" -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - progress@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" @@ -4927,13 +4866,6 @@ range-parser@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.0.3.tgz#6872823535c692e2c2a0103826afd82c2e0ff175" -raw-body@^1.1.6: - version "1.3.4" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.3.4.tgz#ccc7ddfc46b72861cdd5bb433c840b70b6f27f54" - dependencies: - bytes "1.0.0" - iconv-lite "0.4.8" - rc-align@2.x: version "2.3.3" resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-2.3.3.tgz#15e2fd329fde9c2dec16e4a0e0ec20fba2ffdbc0" @@ -4985,10 +4917,6 @@ react-addons-test-utils@15.4.2: fbjs "^0.8.4" object-assign "^4.1.0" -react-deep-force-update@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.0.1.tgz#f911b5be1d2a6fe387507dd6e9a767aa2924b4c7" - react-dev-utils@0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-0.2.1.tgz#c017d6f530502b28b735dbac3841a7b8665838f5" @@ -5037,13 +4965,6 @@ react-modal@^1.6.4: exenv "1.2.0" lodash.assign "^4.2.0" -react-proxy@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a" - dependencies: - lodash "^4.6.1" - react-deep-force-update "^1.0.0" - react-redux@4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-4.4.1.tgz#f0be889d3dff0b9caf9f4e31fdcc0d0b481aa311" @@ -5076,13 +4997,6 @@ react-side-effect@1.0.2: dependencies: fbjs "0.1.0-alpha.10" -react-transform-hmr@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb" - dependencies: - global "^4.3.0" - react-proxy "^1.1.7" - react-virtualized@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.1.0.tgz#ac022281860f832ffecaf7863c099813681be521" @@ -5180,12 +5094,6 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -recursive-readdir@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.1.0.tgz#78b7bfd79582d3d7596b8ff1bd29fbd50229f6aa" - dependencies: - minimatch "3.0.2" - reduce-css-calc@^1.2.6: version "1.3.0" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" @@ -5884,7 +5792,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-is@^1.2.0, type-is@~1.6.14, type-is@~1.6.6: +type-is@~1.6.14, type-is@~1.6.6: version "1.6.14" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" dependencies: |