2016-10-30 09:29:51 +00:00
|
|
|
/* eslint-disable */
|
|
|
|
|
2018-04-30 08:01:36 +00:00
|
|
|
const webpack = require("webpack");
|
|
|
|
const HtmlWebpackPlugin = require("html-webpack-plugin");
|
|
|
|
const WebpackBuildNotifierPlugin = require("webpack-build-notifier");
|
|
|
|
const ManifestPlugin = require("webpack-manifest-plugin");
|
2020-01-20 18:56:37 +00:00
|
|
|
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
2018-04-30 08:01:36 +00:00
|
|
|
const CopyWebpackPlugin = require("copy-webpack-plugin");
|
|
|
|
const LessPluginAutoPrefix = require("less-plugin-autoprefix");
|
2018-07-17 10:47:43 +00:00
|
|
|
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer")
|
|
|
|
.BundleAnalyzerPlugin;
|
2020-07-16 20:05:44 +00:00
|
|
|
const fs = require("fs");
|
2018-11-29 12:24:23 +00:00
|
|
|
|
2018-04-30 08:01:36 +00:00
|
|
|
const path = require("path");
|
2016-10-30 09:29:51 +00:00
|
|
|
|
2020-07-27 11:52:02 +00:00
|
|
|
function optionalRequire(module, defaultReturn = undefined) {
|
|
|
|
try {
|
|
|
|
require.resolve(module);
|
|
|
|
} catch (e) {
|
|
|
|
if (e && e.code === "MODULE_NOT_FOUND") {
|
|
|
|
// Module was not found, return default value if any
|
|
|
|
return defaultReturn;
|
|
|
|
}
|
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
return require(module);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Load optionally configuration object (see scripts/README)
|
|
|
|
const CONFIG = optionalRequire("./scripts/config", {});
|
|
|
|
|
2018-11-29 09:35:17 +00:00
|
|
|
const isProduction = process.env.NODE_ENV === "production";
|
|
|
|
|
2018-04-30 08:01:36 +00:00
|
|
|
const redashBackend = process.env.REDASH_BACKEND || "http://localhost:5000";
|
2020-07-27 11:52:02 +00:00
|
|
|
const staticPath = CONFIG.staticPath || "/static/";
|
2016-10-30 09:29:51 +00:00
|
|
|
|
2019-03-12 19:24:21 +00:00
|
|
|
const basePath = path.join(__dirname, "client");
|
|
|
|
const appPath = path.join(__dirname, "client", "app");
|
2018-02-25 09:13:54 +00:00
|
|
|
|
2020-01-20 18:56:37 +00:00
|
|
|
const extensionsRelativePath =
|
|
|
|
process.env.EXTENSIONS_DIRECTORY || path.join("client", "app", "extensions");
|
2019-03-12 19:24:21 +00:00
|
|
|
const extensionPath = path.join(__dirname, extensionsRelativePath);
|
2018-10-14 12:53:39 +00:00
|
|
|
|
2020-07-27 11:52:02 +00:00
|
|
|
// Function to apply configuration overrides (see scripts/README)
|
|
|
|
function maybeApplyOverrides(config) {
|
|
|
|
const overridesLocation = process.env.REDASH_WEBPACK_OVERRIDES || "./scripts/webpack/overrides";
|
|
|
|
const applyOverrides = optionalRequire(overridesLocation);
|
|
|
|
if (!applyOverrides) {
|
|
|
|
return config;
|
|
|
|
}
|
|
|
|
console.info("Custom overrides found. Applying them...");
|
|
|
|
const newConfig = applyOverrides(config);
|
|
|
|
console.info("Custom overrides applied successfully.");
|
|
|
|
return newConfig;
|
|
|
|
}
|
|
|
|
|
2017-11-16 11:04:59 +00:00
|
|
|
const config = {
|
2018-11-29 09:35:17 +00:00
|
|
|
mode: isProduction ? "production" : "development",
|
2016-10-30 09:29:51 +00:00
|
|
|
entry: {
|
2019-01-15 09:40:38 +00:00
|
|
|
app: [
|
|
|
|
"./client/app/index.js",
|
|
|
|
"./client/app/assets/less/main.less",
|
|
|
|
"./client/app/assets/less/ant.less"
|
|
|
|
],
|
2018-04-30 08:01:36 +00:00
|
|
|
server: ["./client/app/assets/less/server.less"]
|
2016-10-30 09:29:51 +00:00
|
|
|
},
|
|
|
|
output: {
|
2018-04-30 08:01:36 +00:00
|
|
|
path: path.join(basePath, "./dist"),
|
2018-11-29 09:35:17 +00:00
|
|
|
filename: isProduction ? "[name].[chunkhash].js" : "[name].js",
|
2020-07-27 11:52:02 +00:00
|
|
|
publicPath: staticPath
|
2016-10-30 09:29:51 +00:00
|
|
|
},
|
2017-10-26 06:58:24 +00:00
|
|
|
resolve: {
|
2019-03-12 19:24:21 +00:00
|
|
|
symlinks: false,
|
2020-07-16 20:05:44 +00:00
|
|
|
extensions: [".js", ".jsx", ".ts", ".tsx"],
|
2017-10-26 06:58:24 +00:00
|
|
|
alias: {
|
2018-10-14 12:53:39 +00:00
|
|
|
"@": appPath,
|
2020-01-20 18:56:37 +00:00
|
|
|
extensions: extensionPath
|
|
|
|
}
|
2017-10-26 06:58:24 +00:00
|
|
|
},
|
2016-10-30 09:29:51 +00:00
|
|
|
plugins: [
|
2018-04-30 08:01:36 +00:00
|
|
|
new WebpackBuildNotifierPlugin({ title: "Redash" }),
|
2018-03-23 11:38:02 +00:00
|
|
|
// bundle only default `moment` locale (`en`)
|
|
|
|
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en/),
|
2016-10-30 09:29:51 +00:00
|
|
|
new HtmlWebpackPlugin({
|
2018-04-30 08:01:36 +00:00
|
|
|
template: "./client/app/index.html",
|
|
|
|
filename: "index.html",
|
2020-05-12 07:55:48 +00:00
|
|
|
excludeChunks: ["server"],
|
2020-07-27 11:52:02 +00:00
|
|
|
release: process.env.BUILD_VERSION || "dev",
|
|
|
|
staticPath
|
2016-10-30 09:29:51 +00:00
|
|
|
}),
|
2017-05-03 20:53:23 +00:00
|
|
|
new HtmlWebpackPlugin({
|
2018-04-30 08:01:36 +00:00
|
|
|
template: "./client/app/multi_org.html",
|
|
|
|
filename: "multi_org.html",
|
|
|
|
excludeChunks: ["server"]
|
2017-05-03 20:53:23 +00:00
|
|
|
}),
|
2018-10-18 18:21:47 +00:00
|
|
|
new MiniCssExtractPlugin({
|
2018-04-30 08:01:36 +00:00
|
|
|
filename: "[name].[chunkhash].css"
|
2018-02-07 12:15:21 +00:00
|
|
|
}),
|
|
|
|
new ManifestPlugin({
|
2018-10-18 18:21:47 +00:00
|
|
|
fileName: "asset-manifest.json",
|
2020-01-20 18:56:37 +00:00
|
|
|
publicPath: ""
|
2018-02-07 14:43:25 +00:00
|
|
|
}),
|
|
|
|
new CopyWebpackPlugin([
|
2018-04-30 08:01:36 +00:00
|
|
|
{ from: "client/app/assets/robots.txt" },
|
2019-03-27 15:47:12 +00:00
|
|
|
{ from: "client/app/unsupported.html" },
|
2019-05-27 19:18:04 +00:00
|
|
|
{ from: "client/app/unsupportedRedirect.js" },
|
2018-05-03 06:38:13 +00:00
|
|
|
{ from: "client/app/assets/css/*.css", to: "styles/", flatten: true },
|
2020-01-20 18:56:37 +00:00
|
|
|
{ from: "client/app/assets/fonts", to: "fonts/" }
|
2018-02-07 14:43:25 +00:00
|
|
|
])
|
2016-10-30 09:29:51 +00:00
|
|
|
],
|
2018-10-18 18:21:47 +00:00
|
|
|
optimization: {
|
|
|
|
splitChunks: {
|
2020-01-20 18:56:37 +00:00
|
|
|
chunks: chunk => {
|
2018-10-18 18:21:47 +00:00
|
|
|
return chunk.name != "server";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2016-10-30 09:29:51 +00:00
|
|
|
module: {
|
2017-06-18 20:45:43 +00:00
|
|
|
rules: [
|
|
|
|
{
|
2020-07-16 20:05:44 +00:00
|
|
|
test: /\.(t|j)sx?$/,
|
2017-06-18 20:45:43 +00:00
|
|
|
exclude: /node_modules/,
|
2018-04-30 08:01:36 +00:00
|
|
|
use: ["babel-loader", "eslint-loader"]
|
2017-06-18 20:45:43 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
test: /\.html$/,
|
2020-05-12 07:55:48 +00:00
|
|
|
exclude: [/node_modules/, /index\.html/, /multi_org\.html/],
|
2018-04-30 08:01:36 +00:00
|
|
|
use: [
|
|
|
|
{
|
|
|
|
loader: "raw-loader"
|
|
|
|
}
|
|
|
|
]
|
2017-06-18 20:45:43 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
test: /\.css$/,
|
2018-10-18 18:21:47 +00:00
|
|
|
use: [
|
|
|
|
{
|
|
|
|
loader: MiniCssExtractPlugin.loader
|
|
|
|
},
|
2018-04-30 08:01:36 +00:00
|
|
|
{
|
|
|
|
loader: "css-loader",
|
|
|
|
options: {
|
|
|
|
minimize: process.env.NODE_ENV === "production"
|
|
|
|
}
|
2017-06-18 21:11:00 +00:00
|
|
|
}
|
2018-10-18 18:21:47 +00:00
|
|
|
]
|
2017-06-18 20:45:43 +00:00
|
|
|
},
|
2017-11-07 08:41:29 +00:00
|
|
|
{
|
|
|
|
test: /\.less$/,
|
2018-10-18 18:21:47 +00:00
|
|
|
use: [
|
|
|
|
{
|
|
|
|
loader: MiniCssExtractPlugin.loader
|
|
|
|
},
|
2017-11-07 08:41:29 +00:00
|
|
|
{
|
2018-04-30 08:01:36 +00:00
|
|
|
loader: "css-loader",
|
2017-11-07 08:41:29 +00:00
|
|
|
options: {
|
2018-04-30 08:01:36 +00:00
|
|
|
minimize: process.env.NODE_ENV === "production"
|
2017-11-07 08:41:29 +00:00
|
|
|
}
|
2018-04-30 08:01:36 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
loader: "less-loader",
|
2017-11-07 08:41:29 +00:00
|
|
|
options: {
|
2018-07-17 10:47:43 +00:00
|
|
|
plugins: [
|
|
|
|
new LessPluginAutoPrefix({ browsers: ["last 3 versions"] })
|
2019-03-10 11:35:27 +00:00
|
|
|
],
|
|
|
|
javascriptEnabled: true
|
2017-11-07 08:41:29 +00:00
|
|
|
}
|
|
|
|
}
|
2018-10-18 18:21:47 +00:00
|
|
|
]
|
2017-11-07 08:41:29 +00:00
|
|
|
},
|
2016-10-30 09:29:51 +00:00
|
|
|
{
|
|
|
|
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
|
2018-04-30 08:01:36 +00:00
|
|
|
use: [
|
|
|
|
{
|
|
|
|
loader: "file-loader",
|
|
|
|
options: {
|
|
|
|
context: path.resolve(appPath, "./assets/images/"),
|
|
|
|
outputPath: "images/",
|
|
|
|
name: "[path][name].[ext]"
|
|
|
|
}
|
2017-06-18 20:45:43 +00:00
|
|
|
}
|
2018-04-30 08:01:36 +00:00
|
|
|
]
|
2016-10-30 09:29:51 +00:00
|
|
|
},
|
2018-03-06 11:33:15 +00:00
|
|
|
{
|
|
|
|
test: /\.geo\.json$/,
|
2020-01-20 18:56:37 +00:00
|
|
|
type: "javascript/auto",
|
2018-04-30 08:01:36 +00:00
|
|
|
use: [
|
|
|
|
{
|
|
|
|
loader: "file-loader",
|
|
|
|
options: {
|
|
|
|
outputPath: "data/",
|
|
|
|
name: "[hash:7].[name].[ext]"
|
|
|
|
}
|
2018-03-06 11:33:15 +00:00
|
|
|
}
|
2018-04-30 08:01:36 +00:00
|
|
|
]
|
2018-03-06 11:33:15 +00:00
|
|
|
},
|
2016-10-30 09:29:51 +00:00
|
|
|
{
|
|
|
|
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
|
2018-04-30 08:01:36 +00:00
|
|
|
use: [
|
|
|
|
{
|
|
|
|
loader: "url-loader",
|
|
|
|
options: {
|
|
|
|
limit: 10000,
|
|
|
|
name: "fonts/[name].[hash:7].[ext]"
|
|
|
|
}
|
2017-06-18 20:45:43 +00:00
|
|
|
}
|
2018-04-30 08:01:36 +00:00
|
|
|
]
|
2016-10-30 09:29:51 +00:00
|
|
|
}
|
|
|
|
]
|
|
|
|
},
|
2018-11-29 09:35:17 +00:00
|
|
|
devtool: isProduction ? "source-map" : "cheap-eval-module-source-map",
|
2017-11-12 18:15:21 +00:00
|
|
|
stats: {
|
2020-01-14 12:05:37 +00:00
|
|
|
children: false,
|
2017-11-12 18:15:21 +00:00
|
|
|
modules: false,
|
2018-04-30 08:01:36 +00:00
|
|
|
chunkModules: false
|
2017-11-12 18:15:21 +00:00
|
|
|
},
|
2018-03-10 08:48:11 +00:00
|
|
|
watchOptions: {
|
2018-04-30 08:01:36 +00:00
|
|
|
ignored: /\.sw.$/
|
2018-03-10 08:48:11 +00:00
|
|
|
},
|
2016-10-30 09:29:51 +00:00
|
|
|
devServer: {
|
|
|
|
inline: true,
|
2018-04-30 08:01:36 +00:00
|
|
|
index: "/static/index.html",
|
2018-02-08 12:07:26 +00:00
|
|
|
historyApiFallback: {
|
2018-04-30 08:01:36 +00:00
|
|
|
index: "/static/index.html",
|
|
|
|
rewrites: [{ from: /./, to: "/static/index.html" }]
|
2018-02-08 12:07:26 +00:00
|
|
|
},
|
2018-02-09 16:56:46 +00:00
|
|
|
contentBase: false,
|
2020-07-27 11:52:02 +00:00
|
|
|
publicPath: staticPath,
|
2018-02-09 16:56:46 +00:00
|
|
|
proxy: [
|
|
|
|
{
|
2018-07-17 10:47:43 +00:00
|
|
|
context: [
|
|
|
|
"/login",
|
|
|
|
"/logout",
|
|
|
|
"/invite",
|
|
|
|
"/setup",
|
|
|
|
"/status.json",
|
|
|
|
"/api",
|
|
|
|
"/oauth"
|
|
|
|
],
|
2018-04-30 08:01:36 +00:00
|
|
|
target: redashBackend + "/",
|
|
|
|
changeOrigin: false,
|
|
|
|
secure: false
|
2018-02-09 16:56:46 +00:00
|
|
|
},
|
|
|
|
{
|
2018-04-30 08:01:36 +00:00
|
|
|
context: path => {
|
2018-02-09 16:56:46 +00:00
|
|
|
// CSS/JS for server-rendered pages should be served from backend
|
|
|
|
return /^\/static\/[a-z]+\.[0-9a-fA-F]+\.(css|js)$/.test(path);
|
|
|
|
},
|
2018-04-30 08:01:36 +00:00
|
|
|
target: redashBackend + "/",
|
2018-02-09 16:56:46 +00:00
|
|
|
changeOrigin: true,
|
2018-04-30 08:01:36 +00:00
|
|
|
secure: false
|
2018-02-09 16:56:46 +00:00
|
|
|
}
|
|
|
|
],
|
2017-11-12 18:15:21 +00:00
|
|
|
stats: {
|
|
|
|
modules: false,
|
2018-04-30 08:01:36 +00:00
|
|
|
chunkModules: false
|
|
|
|
}
|
2019-07-31 08:34:52 +00:00
|
|
|
},
|
|
|
|
performance: {
|
|
|
|
hints: false
|
2016-10-30 09:29:51 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2017-01-16 13:09:45 +00:00
|
|
|
if (process.env.DEV_SERVER_HOST) {
|
|
|
|
config.devServer.host = process.env.DEV_SERVER_HOST;
|
|
|
|
}
|
|
|
|
|
2018-03-22 15:23:49 +00:00
|
|
|
if (process.env.BUNDLE_ANALYZER) {
|
|
|
|
config.plugins.push(new BundleAnalyzerPlugin());
|
|
|
|
}
|
|
|
|
|
2020-07-27 11:52:02 +00:00
|
|
|
module.exports = maybeApplyOverrides(config);
|