Skip to content
Snippets Groups Projects
Commit 516d239f authored by Atte Keinänen's avatar Atte Keinänen
Browse files

Upgrade Webpack from v1.x to v3.x

parent 49c85c57
No related merge requests found
...@@ -3,7 +3,7 @@ import React from "react"; ...@@ -3,7 +3,7 @@ import React from "react";
import cx from "classnames"; import cx from "classnames";
// eslint-disable-next-line import/no-commonjs // eslint-disable-next-line import/no-commonjs
let colorStyles = require("!style!css?modules!postcss!metabase/css/core/colors.css"); let colorStyles = require("!style-loader!css-loader?modules!postcss-loader!metabase/css/core/colors.css");
const ColorsApp = () => const ColorsApp = () =>
<div className="p2"> <div className="p2">
......
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
"stack-source-map": "^1.0.4", "stack-source-map": "^1.0.4",
"tether": "^1.2.0", "tether": "^1.2.0",
"underscore": "^1.8.3", "underscore": "^1.8.3",
"webpack-dev-middleware": "^1.12.0",
"z-index": "0.0.1" "z-index": "0.0.1"
}, },
"devDependencies": { "devDependencies": {
...@@ -81,7 +82,7 @@ ...@@ -81,7 +82,7 @@
"babel-cli": "^6.11.4", "babel-cli": "^6.11.4",
"babel-core": "^6.20.0", "babel-core": "^6.20.0",
"babel-eslint": "^7.1.1", "babel-eslint": "^7.1.1",
"babel-loader": "^6.2.4", "babel-loader": "^7.1.2",
"babel-plugin-add-react-displayname": "^0.0.4", "babel-plugin-add-react-displayname": "^0.0.4",
"babel-plugin-c-3po": "^0.5.8", "babel-plugin-c-3po": "^0.5.8",
"babel-plugin-transform-builtin-extend": "^1.1.2", "babel-plugin-transform-builtin-extend": "^1.1.2",
...@@ -93,24 +94,24 @@ ...@@ -93,24 +94,24 @@
"babel-register": "^6.11.6", "babel-register": "^6.11.6",
"banner-webpack-plugin": "^0.2.3", "banner-webpack-plugin": "^0.2.3",
"concurrently": "^3.1.0", "concurrently": "^3.1.0",
"css-loader": "^0.28.0", "css-loader": "^0.28.7",
"documentation": "^4.0.0-rc.1", "documentation": "^4.0.0-rc.1",
"enzyme": "^2.7.0", "enzyme": "^2.7.0",
"eslint": "^3.5.0", "eslint": "^3.5.0",
"eslint-import-resolver-webpack": "^0.8.0", "eslint-import-resolver-webpack": "^0.8.3",
"eslint-loader": "^1.6.0", "eslint-loader": "^1.9.0",
"eslint-plugin-flowtype": "^2.22.0", "eslint-plugin-flowtype": "^2.22.0",
"eslint-plugin-import": "^2.2.0", "eslint-plugin-import": "^2.2.0",
"eslint-plugin-jasmine": "^2.2.0", "eslint-plugin-jasmine": "^2.2.0",
"eslint-plugin-react": "^6.3.0", "eslint-plugin-react": "^6.3.0",
"exports-loader": "^0.6.3", "exports-loader": "^0.6.3",
"extract-text-webpack-plugin": "^1.0.1", "extract-text-webpack-plugin": "^3.0.1",
"file-loader": "^0.11.1", "file-loader": "^0.11.1",
"flow-bin": "^0.37.4", "flow-bin": "^0.37.4",
"fs-promise": "^2.0.2", "fs-promise": "^2.0.2",
"glob": "^7.1.1", "glob": "^7.1.1",
"html-webpack-harddisk-plugin": "^0.1.0", "html-webpack-harddisk-plugin": "^0.1.0",
"html-webpack-plugin": "^2.14.0", "html-webpack-plugin": "^2.30.1",
"image-diff": "^1.6.3", "image-diff": "^1.6.3",
"imports-loader": "^0.7.0", "imports-loader": "^0.7.0",
"jasmine": "^2.4.1", "jasmine": "^2.4.1",
...@@ -126,7 +127,7 @@ ...@@ -126,7 +127,7 @@
"karma-jasmine": "^1.1.0", "karma-jasmine": "^1.1.0",
"karma-junit-reporter": "^1.1.0", "karma-junit-reporter": "^1.1.0",
"karma-nyan-reporter": "^0.2.2", "karma-nyan-reporter": "^0.2.2",
"karma-webpack": "^1.7.0", "karma-webpack": "^2.0.5",
"lint-staged": "^3.3.1", "lint-staged": "^3.3.1",
"postcss-cssnext": "^2.4.0", "postcss-cssnext": "^2.4.0",
"postcss-import": "^9.0.0", "postcss-import": "^9.0.0",
...@@ -141,9 +142,9 @@ ...@@ -141,9 +142,9 @@
"style-loader": "^0.16.1", "style-loader": "^0.16.1",
"unused-files-webpack-plugin": "^3.0.0", "unused-files-webpack-plugin": "^3.0.0",
"webchauffeur": "^1.2.0", "webchauffeur": "^1.2.0",
"webpack": "^1.14.0", "webpack": "^3.6.0",
"webpack-dev-server": "^1.16.2", "webpack-dev-server": "^2.9.1",
"webpack-hot-middleware": "^2.14.0", "webpack-hot-middleware": "^2.19.1",
"webpack-postcss-tools": "^1.1.2" "webpack-postcss-tools": "^1.1.2"
}, },
"scripts": { "scripts": {
......
const webpackPostcssTools = require('webpack-postcss-tools');
const _ = require('underscore');
const glob = require('glob');
var SRC_PATH = __dirname + '/frontend/src/metabase';
// Build mapping of CSS variables
const CSS_SRC = glob.sync(SRC_PATH + '/css/**/*.css');
const CSS_MAPS = { vars: {}, media: {}, selector: {} };
CSS_SRC.map(webpackPostcssTools.makeVarMap).forEach(function(map) {
for (let name in CSS_MAPS) _.extend(CSS_MAPS[name], map[name]);
});
// CSS Next:
const CSSNEXT_CONFIG = {
features: {
// pass in the variables and custom media we scanned for before
customProperties: { variables: CSS_MAPS.vars },
customMedia: { extensions: CSS_MAPS.media }
},
import: {
path: ['resources/frontend_client/app/css']
},
compress: false
};
module.exports = {
plugins: {
'postcss-import': {},
'postcss-url': {},
'postcss-cssnext': CSSNEXT_CONFIG,
}
}
...@@ -5,7 +5,6 @@ require("babel-register"); ...@@ -5,7 +5,6 @@ require("babel-register");
require("babel-polyfill"); require("babel-polyfill");
var webpack = require('webpack'); var webpack = require('webpack');
var webpackPostcssTools = require('webpack-postcss-tools');
var ExtractTextPlugin = require('extract-text-webpack-plugin'); var ExtractTextPlugin = require('extract-text-webpack-plugin');
var HtmlWebpackPlugin = require('html-webpack-plugin'); var HtmlWebpackPlugin = require('html-webpack-plugin');
...@@ -13,18 +12,11 @@ var HtmlWebpackHarddiskPlugin = require('html-webpack-harddisk-plugin'); ...@@ -13,18 +12,11 @@ var HtmlWebpackHarddiskPlugin = require('html-webpack-harddisk-plugin');
var UnusedFilesWebpackPlugin = require("unused-files-webpack-plugin").default; var UnusedFilesWebpackPlugin = require("unused-files-webpack-plugin").default;
var BannerWebpackPlugin = require('banner-webpack-plugin'); var BannerWebpackPlugin = require('banner-webpack-plugin');
var _ = require('underscore');
var glob = require('glob');
var fs = require('fs'); var fs = require('fs');
var chevrotain = require("chevrotain"); var chevrotain = require("chevrotain");
var allTokens = require("./frontend/src/metabase/lib/expressions/tokens").allTokens; var allTokens = require("./frontend/src/metabase/lib/expressions/tokens").allTokens;
function hasArg(arg) {
var regex = new RegExp("^" + ((arg.length === 2) ? ("-\\w*"+arg[1]+"\\w*") : (arg)) + "$");
return process.argv.filter(regex.test.bind(regex)).length > 0;
}
var SRC_PATH = __dirname + '/frontend/src/metabase'; var SRC_PATH = __dirname + '/frontend/src/metabase';
var LIB_SRC_PATH = __dirname + '/frontend/src/metabase-lib'; var LIB_SRC_PATH = __dirname + '/frontend/src/metabase-lib';
var TEST_SUPPORT_PATH = __dirname + '/frontend/test/__support__'; var TEST_SUPPORT_PATH = __dirname + '/frontend/test/__support__';
...@@ -33,38 +25,11 @@ var BUILD_PATH = __dirname + '/resources/frontend_client'; ...@@ -33,38 +25,11 @@ var BUILD_PATH = __dirname + '/resources/frontend_client';
// default NODE_ENV to development // default NODE_ENV to development
var NODE_ENV = process.env["NODE_ENV"] || "development"; var NODE_ENV = process.env["NODE_ENV"] || "development";
// Need to scan the CSS files for variable and custom media used across files
// NOTE: this requires "webpack -w" (watch mode) to be restarted when variables change :(
var IS_WATCHING = hasArg("-w") || hasArg("--watch");
if (IS_WATCHING) {
process.stderr.write("Warning: in webpack watch mode you must restart webpack if you change any CSS variables or custom media queries\n");
}
// Babel: // Babel:
var BABEL_CONFIG = { var BABEL_CONFIG = {
cacheDirectory: process.env.BABEL_DISABLE_CACHE ? null : ".babel_cache" cacheDirectory: process.env.BABEL_DISABLE_CACHE ? null : ".babel_cache"
}; };
// Build mapping of CSS variables
var CSS_SRC = glob.sync(SRC_PATH + '/css/**/*.css');
var CSS_MAPS = { vars: {}, media: {}, selector: {} };
CSS_SRC.map(webpackPostcssTools.makeVarMap).forEach(function(map) {
for (var name in CSS_MAPS) _.extend(CSS_MAPS[name], map[name]);
});
// CSS Next:
var CSSNEXT_CONFIG = {
features: {
// pass in the variables and custom media we scanned for before
customProperties: { variables: CSS_MAPS.vars },
customMedia: { extensions: CSS_MAPS.media }
},
import: {
path: ['resources/frontend_client/app/css']
},
compress: false
};
var CSS_CONFIG = { var CSS_CONFIG = {
localIdentName: NODE_ENV !== "production" ? localIdentName: NODE_ENV !== "production" ?
"[name]__[local]___[hash:base64:5]" : "[name]__[local]___[hash:base64:5]" :
...@@ -100,36 +65,38 @@ var config = module.exports = { ...@@ -100,36 +65,38 @@ var config = module.exports = {
{ {
test: /\.(js|jsx)$/, test: /\.(js|jsx)$/,
exclude: /node_modules/, exclude: /node_modules/,
loader: "babel", loader: "babel-loader",
query: BABEL_CONFIG query: BABEL_CONFIG
}, },
{ {
test: /\.(js|jsx)$/, test: /\.(js|jsx)$/,
exclude: /node_modules|\.spec\.js/, exclude: /node_modules|\.spec\.js/,
loader: 'eslint' loader: 'eslint-loader'
}, },
{ {
test: /\.(eot|woff2?|ttf|svg|png)$/, test: /\.(eot|woff2?|ttf|svg|png)$/,
loader: "file-loader" loader: "file-loader"
}, },
{
test: /\.json$/,
loader: "json-loader"
},
{ {
test: /\.css$/, test: /\.css$/,
loader: ExtractTextPlugin.extract("style-loader", "css-loader?" + JSON.stringify(CSS_CONFIG) + "!postcss-loader") use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: [
{ loader: "css-loader?", options: CSS_CONFIG },
{ loader: "postcss-loader" }
]
})
} }
] ]
}, },
resolve: { resolve: {
extensions: ["", ".webpack.js", ".web.js", ".js", ".jsx", ".css"], extensions: [".webpack.js", ".web.js", ".js", ".jsx", ".css"],
alias: { alias: {
'metabase': SRC_PATH, 'metabase': SRC_PATH,
'metabase-lib': LIB_SRC_PATH, 'metabase-lib': LIB_SRC_PATH,
'__support__': TEST_SUPPORT_PATH, '__support__': TEST_SUPPORT_PATH,
'style': SRC_PATH + '/css/core/index.css', 'style': SRC_PATH + '/css/core/index',
'ace': __dirname + '/node_modules/ace-builds/src-min-noconflict', 'ace': __dirname + '/node_modules/ace-builds/src-min-noconflict',
} }
}, },
...@@ -146,7 +113,9 @@ var config = module.exports = { ...@@ -146,7 +113,9 @@ var config = module.exports = {
}), }),
// Extracts initial CSS into a standard stylesheet that can be loaded in parallel with JavaScript // Extracts initial CSS into a standard stylesheet that can be loaded in parallel with JavaScript
// NOTE: the filename on disk won't include "?[chunkhash]" but the URL in index.html generated by HtmlWebpackPlugin will: // NOTE: the filename on disk won't include "?[chunkhash]" but the URL in index.html generated by HtmlWebpackPlugin will:
new ExtractTextPlugin('[name].bundle.css?[contenthash]'), new ExtractTextPlugin({
filename: '[name].bundle.css?[contenthash]'
}),
new HtmlWebpackPlugin({ new HtmlWebpackPlugin({
filename: '../../index.html', filename: '../../index.html',
chunks: ["app-main", "styles"], chunks: ["app-main", "styles"],
...@@ -189,15 +158,7 @@ var config = module.exports = { ...@@ -189,15 +158,7 @@ var config = module.exports = {
}, },
} }
}), }),
], ]
postcss: function (webpack) {
return [
require("postcss-import")(),
require("postcss-url")(),
require("postcss-cssnext")(CSSNEXT_CONFIG)
]
}
}; };
if (NODE_ENV === "hot") { if (NODE_ENV === "hot") {
...@@ -210,11 +171,20 @@ if (NODE_ENV === "hot") { ...@@ -210,11 +171,20 @@ if (NODE_ENV === "hot") {
config.module.loaders.unshift({ config.module.loaders.unshift({
test: /\.jsx$/, test: /\.jsx$/,
exclude: /node_modules/, exclude: /node_modules/,
loaders: ['react-hot', 'babel?'+JSON.stringify(BABEL_CONFIG)] use: [
{ loader: 'react-hot-loader' },
{ loader: 'babel-loader', options: BABEL_CONFIG }
]
}); });
// disable ExtractTextPlugin // disable ExtractTextPlugin
config.module.loaders[config.module.loaders.length - 1].loader = "style-loader!css-loader?" + JSON.stringify(CSS_CONFIG) + "!postcss-loader" config.module.loaders[config.module.loaders.length - 1].use = {
loader: "style-loader",
use: [
{ loader: "css-loader?", options: CSS_CONFIG },
{ loader: "postcss-loader" }
]
}
config.devServer = { config.devServer = {
hot: true, hot: true,
...@@ -256,11 +226,6 @@ if (NODE_ENV !== "production") { ...@@ -256,11 +226,6 @@ if (NODE_ENV !== "production") {
config.output.pathinfo = true; config.output.pathinfo = true;
} else { } else {
config.plugins.push(new webpack.optimize.UglifyJsPlugin({ config.plugins.push(new webpack.optimize.UglifyJsPlugin({
// suppress uglify warnings in production
// output from these warnings was causing Heroku builds to fail (#5410)
compress: {
warnings: false,
},
mangle: { mangle: {
// this is required to ensure we don't minify Chevrotain token identifiers // this is required to ensure we don't minify Chevrotain token identifiers
// https://github.com/SAP/chevrotain/tree/master/examples/parser/minification // https://github.com/SAP/chevrotain/tree/master/examples/parser/minification
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment