Browse Source

simplify config of sonar-web

tags/6.5-M1
Stas Vilchik 7 years ago
parent
commit
f7e9c0f2ac

+ 0
- 3
server/sonar-web/.eslintignore View File

@@ -1,5 +1,2 @@
src/main/js/libs
src/main/js/app/components/GlobalFooterBranding.js
tests
scripts
config

+ 0
- 42
server/sonar-web/config/env.js View File

@@ -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;


+ 1
- 1
server/sonar-web/config/jest/FileStub.js View File

@@ -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';

+ 2
- 2
server/sonar-web/config/jest/SetupTestEnvironment.js View File

@@ -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('.');
};

+ 8
- 9
server/sonar-web/config/paths.js View File

@@ -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
};


+ 0
- 1
server/sonar-web/config/polyfills.js View File

@@ -19,4 +19,3 @@
*/
import 'babel-polyfill';
import 'whatwg-fetch';


+ 162
- 0
server/sonar-web/config/webpack.config.js View File

@@ -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'
}
});

+ 0
- 104
server/sonar-web/config/webpack/webpack.config.base.js View File

@@ -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'
}
};

+ 0
- 95
server/sonar-web/config/webpack/webpack.config.dev.js View File

@@ -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;

+ 0
- 47
server/sonar-web/config/webpack/webpack.config.fast.js View File

@@ -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;

+ 0
- 89
server/sonar-web/config/webpack/webpack.config.prod.js View File

@@ -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;

+ 1
- 11
server/sonar-web/package.json View File

@@ -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",

+ 4
- 1
server/sonar-web/scripts/analyze.js View File

@@ -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());


+ 21
- 23
server/sonar-web/scripts/build.js View File

@@ -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();

+ 94
- 78
server/sonar-web/scripts/start.js View File

@@ -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) {

+ 1
- 7
server/sonar-web/scripts/test.js View File

@@ -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);


+ 5
- 5
server/sonar-web/scripts/utils/formatSize.js View File

@@ -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];
};

+ 6
- 98
server/sonar-web/yarn.lock View File

@@ -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:

Loading…
Cancel
Save