redash/webpack.config.js

273 lines
7.0 KiB
JavaScript
Raw Normal View History

2016-10-30 09:29:51 +00:00
/* eslint-disable */
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const WebpackBuildNotifierPlugin = require("webpack-build-notifier");
const ManifestPlugin = require("webpack-manifest-plugin");
Migrate router and <app-view> to React (#4525) * Migrate router and <app-view> to React: skeleton * Update layout on route change * Start moving page routes from angular to react * Move page routes to react except of public dashboard and visualization embed) * Move public dashboard and visualization embed routes to React * Replace $route/$routeParams usages * Some cleanup * Replace AngularJS $location service with implementation based on history library * Minor fix to how ApplicationView handles route change * Explicitly use global layout for each page instead of handling related stuff in ApplicationArea component * Error handling * Remove AngularJS and related dependencies * Move Parameter factory method to a separate file * Fix CSS (replace custom components with classes) * Fix: keep other url parts when updating location partially; refine code * Fix tests * Make router work in multi-org mode (respect <base> tag) * Optimzation: don't resolve route if path didn't change * Fix search input in header; error handling improvement (handle more errors in pages; global error handler for unhandled errors; dialog dismiss 'unhandled rejection' errors) * Fix page keys; fix navigateTo calls (third parameter not available) * Use relative links * Router: ignore location REPLACE events, resolve only on PUSH/POP * Fix tests * Remove unused jQuery reference * Show error from backend when creating Destination * Remove route.resolve where not necessary (used constant values) * New Query page: keep state on saving, reload when creating another new query * Use currentRoute.key instead of hard-coded keys for page components * Tidy up Router * Tidy up location service * Fix tests * Don't add parameters changes to browser's history * Fix test (improved fix) Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-01-20 18:56:37 +00:00
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
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;
const fs = require("fs");
const path = require("path");
2016-10-30 09:29:51 +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", {});
const isProduction = process.env.NODE_ENV === "production";
const redashBackend = process.env.REDASH_BACKEND || "http://localhost:5000";
const staticPath = CONFIG.staticPath || "/static/";
2016-10-30 09:29:51 +00:00
const basePath = path.join(__dirname, "client");
const appPath = path.join(__dirname, "client", "app");
Migrate router and <app-view> to React (#4525) * Migrate router and <app-view> to React: skeleton * Update layout on route change * Start moving page routes from angular to react * Move page routes to react except of public dashboard and visualization embed) * Move public dashboard and visualization embed routes to React * Replace $route/$routeParams usages * Some cleanup * Replace AngularJS $location service with implementation based on history library * Minor fix to how ApplicationView handles route change * Explicitly use global layout for each page instead of handling related stuff in ApplicationArea component * Error handling * Remove AngularJS and related dependencies * Move Parameter factory method to a separate file * Fix CSS (replace custom components with classes) * Fix: keep other url parts when updating location partially; refine code * Fix tests * Make router work in multi-org mode (respect <base> tag) * Optimzation: don't resolve route if path didn't change * Fix search input in header; error handling improvement (handle more errors in pages; global error handler for unhandled errors; dialog dismiss 'unhandled rejection' errors) * Fix page keys; fix navigateTo calls (third parameter not available) * Use relative links * Router: ignore location REPLACE events, resolve only on PUSH/POP * Fix tests * Remove unused jQuery reference * Show error from backend when creating Destination * Remove route.resolve where not necessary (used constant values) * New Query page: keep state on saving, reload when creating another new query * Use currentRoute.key instead of hard-coded keys for page components * Tidy up Router * Tidy up location service * Fix tests * Don't add parameters changes to browser's history * Fix test (improved fix) Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-01-20 18:56:37 +00:00
const extensionsRelativePath =
process.env.EXTENSIONS_DIRECTORY || path.join("client", "app", "extensions");
const extensionPath = path.join(__dirname, extensionsRelativePath);
// 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 = {
mode: isProduction ? "production" : "development",
2016-10-30 09:29:51 +00:00
entry: {
app: [
"./client/app/index.js",
"./client/app/assets/less/main.less",
"./client/app/assets/less/ant.less"
],
server: ["./client/app/assets/less/server.less"]
2016-10-30 09:29:51 +00:00
},
output: {
path: path.join(basePath, "./dist"),
filename: isProduction ? "[name].[chunkhash].js" : "[name].js",
publicPath: staticPath
2016-10-30 09:29:51 +00:00
},
resolve: {
symlinks: false,
extensions: [".js", ".jsx", ".ts", ".tsx"],
alias: {
"@": appPath,
Migrate router and <app-view> to React (#4525) * Migrate router and <app-view> to React: skeleton * Update layout on route change * Start moving page routes from angular to react * Move page routes to react except of public dashboard and visualization embed) * Move public dashboard and visualization embed routes to React * Replace $route/$routeParams usages * Some cleanup * Replace AngularJS $location service with implementation based on history library * Minor fix to how ApplicationView handles route change * Explicitly use global layout for each page instead of handling related stuff in ApplicationArea component * Error handling * Remove AngularJS and related dependencies * Move Parameter factory method to a separate file * Fix CSS (replace custom components with classes) * Fix: keep other url parts when updating location partially; refine code * Fix tests * Make router work in multi-org mode (respect <base> tag) * Optimzation: don't resolve route if path didn't change * Fix search input in header; error handling improvement (handle more errors in pages; global error handler for unhandled errors; dialog dismiss 'unhandled rejection' errors) * Fix page keys; fix navigateTo calls (third parameter not available) * Use relative links * Router: ignore location REPLACE events, resolve only on PUSH/POP * Fix tests * Remove unused jQuery reference * Show error from backend when creating Destination * Remove route.resolve where not necessary (used constant values) * New Query page: keep state on saving, reload when creating another new query * Use currentRoute.key instead of hard-coded keys for page components * Tidy up Router * Tidy up location service * Fix tests * Don't add parameters changes to browser's history * Fix test (improved fix) Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-01-20 18:56:37 +00:00
extensions: extensionPath
}
},
2016-10-30 09:29:51 +00:00
plugins: [
new WebpackBuildNotifierPlugin({ title: "Redash" }),
// bundle only default `moment` locale (`en`)
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en/),
2016-10-30 09:29:51 +00:00
new HtmlWebpackPlugin({
template: "./client/app/index.html",
filename: "index.html",
excludeChunks: ["server"],
release: process.env.BUILD_VERSION || "dev",
staticPath
2016-10-30 09:29:51 +00:00
}),
new HtmlWebpackPlugin({
template: "./client/app/multi_org.html",
filename: "multi_org.html",
excludeChunks: ["server"]
}),
2018-10-18 18:21:47 +00:00
new MiniCssExtractPlugin({
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",
Migrate router and <app-view> to React (#4525) * Migrate router and <app-view> to React: skeleton * Update layout on route change * Start moving page routes from angular to react * Move page routes to react except of public dashboard and visualization embed) * Move public dashboard and visualization embed routes to React * Replace $route/$routeParams usages * Some cleanup * Replace AngularJS $location service with implementation based on history library * Minor fix to how ApplicationView handles route change * Explicitly use global layout for each page instead of handling related stuff in ApplicationArea component * Error handling * Remove AngularJS and related dependencies * Move Parameter factory method to a separate file * Fix CSS (replace custom components with classes) * Fix: keep other url parts when updating location partially; refine code * Fix tests * Make router work in multi-org mode (respect <base> tag) * Optimzation: don't resolve route if path didn't change * Fix search input in header; error handling improvement (handle more errors in pages; global error handler for unhandled errors; dialog dismiss 'unhandled rejection' errors) * Fix page keys; fix navigateTo calls (third parameter not available) * Use relative links * Router: ignore location REPLACE events, resolve only on PUSH/POP * Fix tests * Remove unused jQuery reference * Show error from backend when creating Destination * Remove route.resolve where not necessary (used constant values) * New Query page: keep state on saving, reload when creating another new query * Use currentRoute.key instead of hard-coded keys for page components * Tidy up Router * Tidy up location service * Fix tests * Don't add parameters changes to browser's history * Fix test (improved fix) Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-01-20 18:56:37 +00:00
publicPath: ""
}),
new CopyWebpackPlugin([
{ from: "client/app/assets/robots.txt" },
{ from: "client/app/unsupported.html" },
{ from: "client/app/unsupportedRedirect.js" },
2018-05-03 06:38:13 +00:00
{ from: "client/app/assets/css/*.css", to: "styles/", flatten: true },
Migrate router and <app-view> to React (#4525) * Migrate router and <app-view> to React: skeleton * Update layout on route change * Start moving page routes from angular to react * Move page routes to react except of public dashboard and visualization embed) * Move public dashboard and visualization embed routes to React * Replace $route/$routeParams usages * Some cleanup * Replace AngularJS $location service with implementation based on history library * Minor fix to how ApplicationView handles route change * Explicitly use global layout for each page instead of handling related stuff in ApplicationArea component * Error handling * Remove AngularJS and related dependencies * Move Parameter factory method to a separate file * Fix CSS (replace custom components with classes) * Fix: keep other url parts when updating location partially; refine code * Fix tests * Make router work in multi-org mode (respect <base> tag) * Optimzation: don't resolve route if path didn't change * Fix search input in header; error handling improvement (handle more errors in pages; global error handler for unhandled errors; dialog dismiss 'unhandled rejection' errors) * Fix page keys; fix navigateTo calls (third parameter not available) * Use relative links * Router: ignore location REPLACE events, resolve only on PUSH/POP * Fix tests * Remove unused jQuery reference * Show error from backend when creating Destination * Remove route.resolve where not necessary (used constant values) * New Query page: keep state on saving, reload when creating another new query * Use currentRoute.key instead of hard-coded keys for page components * Tidy up Router * Tidy up location service * Fix tests * Don't add parameters changes to browser's history * Fix test (improved fix) Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-01-20 18:56:37 +00:00
{ from: "client/app/assets/fonts", to: "fonts/" }
])
2016-10-30 09:29:51 +00:00
],
2018-10-18 18:21:47 +00:00
optimization: {
splitChunks: {
Migrate router and <app-view> to React (#4525) * Migrate router and <app-view> to React: skeleton * Update layout on route change * Start moving page routes from angular to react * Move page routes to react except of public dashboard and visualization embed) * Move public dashboard and visualization embed routes to React * Replace $route/$routeParams usages * Some cleanup * Replace AngularJS $location service with implementation based on history library * Minor fix to how ApplicationView handles route change * Explicitly use global layout for each page instead of handling related stuff in ApplicationArea component * Error handling * Remove AngularJS and related dependencies * Move Parameter factory method to a separate file * Fix CSS (replace custom components with classes) * Fix: keep other url parts when updating location partially; refine code * Fix tests * Make router work in multi-org mode (respect <base> tag) * Optimzation: don't resolve route if path didn't change * Fix search input in header; error handling improvement (handle more errors in pages; global error handler for unhandled errors; dialog dismiss 'unhandled rejection' errors) * Fix page keys; fix navigateTo calls (third parameter not available) * Use relative links * Router: ignore location REPLACE events, resolve only on PUSH/POP * Fix tests * Remove unused jQuery reference * Show error from backend when creating Destination * Remove route.resolve where not necessary (used constant values) * New Query page: keep state on saving, reload when creating another new query * Use currentRoute.key instead of hard-coded keys for page components * Tidy up Router * Tidy up location service * Fix tests * Don't add parameters changes to browser's history * Fix test (improved fix) Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
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: [
{
test: /\.(t|j)sx?$/,
2017-06-18 20:45:43 +00:00
exclude: /node_modules/,
use: ["babel-loader", "eslint-loader"]
2017-06-18 20:45:43 +00:00
},
{
test: /\.html$/,
exclude: [/node_modules/, /index\.html/, /multi_org\.html/],
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
},
{
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
{
loader: "css-loader",
2017-11-07 08:41:29 +00:00
options: {
minimize: process.env.NODE_ENV === "production"
2017-11-07 08:41:29 +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)(\?.*)?$/,
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
}
]
2016-10-30 09:29:51 +00:00
},
{
test: /\.geo\.json$/,
Migrate router and <app-view> to React (#4525) * Migrate router and <app-view> to React: skeleton * Update layout on route change * Start moving page routes from angular to react * Move page routes to react except of public dashboard and visualization embed) * Move public dashboard and visualization embed routes to React * Replace $route/$routeParams usages * Some cleanup * Replace AngularJS $location service with implementation based on history library * Minor fix to how ApplicationView handles route change * Explicitly use global layout for each page instead of handling related stuff in ApplicationArea component * Error handling * Remove AngularJS and related dependencies * Move Parameter factory method to a separate file * Fix CSS (replace custom components with classes) * Fix: keep other url parts when updating location partially; refine code * Fix tests * Make router work in multi-org mode (respect <base> tag) * Optimzation: don't resolve route if path didn't change * Fix search input in header; error handling improvement (handle more errors in pages; global error handler for unhandled errors; dialog dismiss 'unhandled rejection' errors) * Fix page keys; fix navigateTo calls (third parameter not available) * Use relative links * Router: ignore location REPLACE events, resolve only on PUSH/POP * Fix tests * Remove unused jQuery reference * Show error from backend when creating Destination * Remove route.resolve where not necessary (used constant values) * New Query page: keep state on saving, reload when creating another new query * Use currentRoute.key instead of hard-coded keys for page components * Tidy up Router * Tidy up location service * Fix tests * Don't add parameters changes to browser's history * Fix test (improved fix) Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-01-20 18:56:37 +00:00
type: "javascript/auto",
use: [
{
loader: "file-loader",
options: {
outputPath: "data/",
name: "[hash:7].[name].[ext]"
}
}
]
},
2016-10-30 09:29:51 +00:00
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
use: [
{
loader: "url-loader",
options: {
limit: 10000,
name: "fonts/[name].[hash:7].[ext]"
}
2017-06-18 20:45:43 +00:00
}
]
2016-10-30 09:29:51 +00:00
}
]
},
devtool: isProduction ? "source-map" : "cheap-eval-module-source-map",
stats: {
children: false,
modules: false,
chunkModules: false
},
2018-03-10 08:48:11 +00:00
watchOptions: {
ignored: /\.sw.$/
2018-03-10 08:48:11 +00:00
},
2016-10-30 09:29:51 +00:00
devServer: {
inline: true,
index: "/static/index.html",
historyApiFallback: {
index: "/static/index.html",
rewrites: [{ from: /./, to: "/static/index.html" }]
},
contentBase: false,
publicPath: staticPath,
proxy: [
{
2018-07-17 10:47:43 +00:00
context: [
"/login",
"/logout",
"/invite",
"/setup",
"/status.json",
"/api",
"/oauth"
],
target: redashBackend + "/",
changeOrigin: false,
secure: false
},
{
context: path => {
// CSS/JS for server-rendered pages should be served from backend
return /^\/static\/[a-z]+\.[0-9a-fA-F]+\.(css|js)$/.test(path);
},
target: redashBackend + "/",
changeOrigin: true,
secure: false
}
],
stats: {
modules: false,
chunkModules: false
}
},
performance: {
hints: false
2016-10-30 09:29:51 +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());
}
module.exports = maybeApplyOverrides(config);