cosmos-explorer/webpack.config.js

355 lines
12 KiB
JavaScript
Raw Permalink Normal View History

/* eslint-disable @typescript-eslint/no-var-requires */
/* eslint-disable no-undef */
2021-03-15 03:53:16 +00:00
require("dotenv/config");
const path = require("path");
const MonacoWebpackPlugin = require("monaco-editor-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const InlineChunkHtmlPlugin = require("react-dev-utils/InlineChunkHtmlPlugin");
const HTMLInlineCSSWebpackPlugin = require("html-inline-css-webpack-plugin").default;
const { EnvironmentPlugin } = require("webpack");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const CaseSensitivePathsPlugin = require("case-sensitive-paths-webpack-plugin");
const CreateFileWebpack = require("create-file-webpack");
const childProcess = require("child_process");
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
const TerserPlugin = require("terser-webpack-plugin");
const webpack = require("webpack");
const isCI = require("is-ci");
const gitSha = childProcess.execSync("git rev-parse HEAD").toString("utf8");
2021-03-15 03:53:16 +00:00
const AZURE_CLIENT_ID = "fd8753b0-0707-4e32-84e9-2532af865fb4";
const AZURE_TENANT_ID = "72f988bf-86f1-41af-91ab-2d7cd011db47";
const SUBSCRIPTION_ID = "69e02f2d-f059-4409-9eac-97e8a276ae2c";
const RESOURCE_GROUP = "runners";
const AZURE_CLIENT_SECRET = process.env.AZURE_CLIENT_SECRET || process.env.NOTEBOOKS_TEST_RUNNER_CLIENT_SECRET; // TODO Remove. Exists for backwards compat with old .env files. Prefer AZURE_CLIENT_SECRET
if (!AZURE_CLIENT_SECRET) {
console.warn("AZURE_CLIENT_SECRET is not set. testExplorer.html will not work.");
}
const cssRule = {
test: /\.css$/,
2021-01-20 15:15:01 +00:00
use: [MiniCssExtractPlugin.loader, "css-loader"],
};
const lessRule = {
test: /\.less$/,
use: [MiniCssExtractPlugin.loader, "css-loader", "less-loader"],
2021-01-20 15:15:01 +00:00
exclude: [path.resolve(__dirname, "less/Common/Constants.less")],
};
const imagesRule = {
test: /\.(jpg|jpeg|png|gif|svg|pdf|ico)$/,
type: "asset/resource",
generator: {
// Add hash, because there are multiple versions of "delete.svg"
filename: "images/[name].[hash][ext]",
2021-01-20 15:15:01 +00:00
},
};
const fontRule = {
test: /\.(woff|woff2|ttf|eot)$/,
generator: {
filename: "[name][ext]",
2021-01-20 15:15:01 +00:00
},
};
const htmlRule = {
test: /\.html$/,
use: [
{
loader: "html-loader",
options: {
minify: false,
removeComments: false,
collapseWhitespace: false,
2021-01-20 15:15:01 +00:00
root: path.resolve(__dirname, "images"),
},
},
],
};
// We compile our own code with ts-loader
const typescriptRule = {
test: /\.tsx?$/,
use: [
{
loader: "ts-loader",
options: {
2021-01-20 15:15:01 +00:00
transpileOnly: true,
},
},
],
2021-01-20 15:15:01 +00:00
exclude: /node_modules/,
};
// eslint-disable-next-line @typescript-eslint/no-unused-vars
/** @type {(_env: Record<string, string>, argv: Record<string, unknown>) => import("webpack").Configuration} */
module.exports = function (_env = {}, argv = {}) {
const mode = argv.mode || "development";
const rules = [fontRule, lessRule, imagesRule, cssRule, htmlRule, typescriptRule];
const envVars = {
GIT_SHA: gitSha,
2021-01-20 15:15:01 +00:00
PORT: process.env.PORT || "1234",
};
if (mode === "production") {
envVars.NODE_ENV = "production";
}
if (mode === "development") {
envVars.NODE_ENV = "development";
2021-03-15 03:53:16 +00:00
envVars.AZURE_CLIENT_ID = AZURE_CLIENT_ID;
envVars.AZURE_TENANT_ID = AZURE_TENANT_ID;
envVars.AZURE_CLIENT_SECRET = AZURE_CLIENT_SECRET || null;
2021-03-15 03:53:16 +00:00
envVars.SUBSCRIPTION_ID = SUBSCRIPTION_ID;
envVars.RESOURCE_GROUP = RESOURCE_GROUP;
typescriptRule.use[0].options.compilerOptions = { target: "ES2018" };
}
const plugins = [
new CleanWebpackPlugin(),
new webpack.ProvidePlugin({
process: "process/browser",
2021-08-19 03:12:40 +01:00
Buffer: ["buffer", "Buffer"],
}),
new CreateFileWebpack({
path: "./dist",
fileName: "version.txt",
2021-01-20 15:15:01 +00:00
content: `${gitSha.trim()} ${new Date().toUTCString()}`,
}),
// TODO Enable when @nteract once removed
// ./node_modules/@nteract/markdown/node_modules/@nteract/presentational-components/lib/index.js line 63 breaks this with physical file Icon.js referred to as icon.js
// new CaseSensitivePathsPlugin(),
new MiniCssExtractPlugin({
2021-01-20 15:15:01 +00:00
filename: "[name].[contenthash].css",
}),
new HtmlWebpackPlugin({
filename: "explorer.html",
template: "src/explorer.html",
2021-01-20 15:15:01 +00:00
chunks: ["main"],
}),
new HtmlWebpackPlugin({
filename: "terminal.html",
template: "src/Terminal/index.html",
2021-01-20 15:15:01 +00:00
chunks: ["terminal"],
}),
new HtmlWebpackPlugin({
filename: "quickstart.html",
template: "src/quickstart.html",
2021-01-20 15:15:01 +00:00
chunks: ["quickstart"],
}),
new HtmlWebpackPlugin({
filename: "index.html",
template: "src/index.html",
2021-01-20 15:15:01 +00:00
chunks: ["index"],
}),
new HtmlWebpackPlugin({
filename: "hostedExplorer.html",
template: "src/hostedExplorer.html",
2021-01-20 15:15:01 +00:00
chunks: ["hostedExplorer"],
}),
new HtmlWebpackPlugin({
filename: "testExplorer.html",
template: "test/testExplorer/testExplorer.html",
2021-01-20 15:15:01 +00:00
chunks: ["testExplorer"],
}),
new HtmlWebpackPlugin({
filename: "Heatmap.html",
template: "src/Controls/Heatmap/Heatmap.html",
2021-01-20 15:15:01 +00:00
chunks: ["heatmap"],
}),
new HtmlWebpackPlugin({
filename: "cellOutputViewer.html",
template: "src/CellOutputViewer/cellOutputViewer.html",
chunks: ["cellOutputViewer"],
}),
new HtmlWebpackPlugin({
filename: "notebookViewer.html",
2020-06-05 03:04:15 +01:00
template: "src/NotebookViewer/notebookViewer.html",
2021-01-20 15:15:01 +00:00
chunks: ["notebookViewer"],
}),
new HtmlWebpackPlugin({
filename: "gallery.html",
template: "src/GalleryViewer/galleryViewer.html",
2021-01-20 15:15:01 +00:00
chunks: ["galleryViewer"],
}),
new HtmlWebpackPlugin({
filename: "connectToGitHub.html",
template: "src/connectToGitHub.html",
2021-01-20 15:15:01 +00:00
chunks: ["connectToGitHub"],
}),
Created selfServe landing page (#444) * Portal changes for DedicatedGateway Changes to support creation and deletion of DedicatedGateway resource. Tested locally with various scenarios. * Portal changes for DedicatedGateway. CR feedback * Stylecop changes * created selfServe.html landing page * Removing TODO comments * exposed baselineValues * added getOnSaveNotification * disable UI when onSave is taking place * minro edits * made polling optional * added optional polling * added default * Added portal notifications * merged more changes * minor edits * added label for description * Added correlationids and polling of refresh * Added correlationids and polling of refresh * minor edit * added label tooltip * removed ClassInfo decorator * Added dynamic decription * added info and warninf types for description * more changes to promise retry * promise retry changes * added spinner on selfserve load * compile errors fixed * New changes * added operationstatus link * merged sqlxEdits * undid sqlx changes * added completed notification * passed retryInterval in notif options * more retry changes * more changes * added polling on landing on the page * edits for error display * added keys blade link * added link generation * added link to blade * Modified info and description * fixed format errors * added selfserve contract to output files * addressed PR comments Co-authored-by: Balaji Sridharan <fnbalaji@microsoft.com> Co-authored-by: fnbalaji <75445927+fnbalaji@users.noreply.github.com>
2021-03-10 21:55:05 +00:00
new HtmlWebpackPlugin({
filename: "selfServe.html",
template: "src/SelfServe/selfServe.html",
chunks: ["selfServe"],
}),
new InlineChunkHtmlPlugin(HtmlWebpackPlugin, [/cellOutputViewer/]),
new HTMLInlineCSSWebpackPlugin({
filter: (fileName) => fileName.includes("cellOutputViewer"),
}),
new MonacoWebpackPlugin(),
2020-06-18 14:39:47 +01:00
new CopyWebpackPlugin({
2021-01-20 15:15:01 +00:00
patterns: [{ from: "DataExplorer.nuspec" }, { from: "web.config" }, { from: "quickstart/*.zip" }],
2020-06-18 14:39:47 +01:00
}),
2021-01-20 15:15:01 +00:00
new EnvironmentPlugin(envVars),
];
if (argv.analyze) {
plugins.push(new BundleAnalyzerPlugin());
}
return {
mode: mode,
entry: {
2020-11-13 02:10:59 +00:00
main: "./src/Main.tsx",
2021-07-22 16:19:17 +01:00
index: "./src/Index.tsx",
quickstart: "./src/quickstart.ts",
hostedExplorer: "./src/HostedExplorer.tsx",
testExplorer: "./test/testExplorer/TestExplorer.ts",
heatmap: "./src/Controls/Heatmap/Heatmap.ts",
terminal: "./src/Terminal/index.ts",
cellOutputViewer: "./src/CellOutputViewer/CellOutputViewer.tsx",
2020-06-05 03:04:15 +01:00
notebookViewer: "./src/NotebookViewer/NotebookViewer.tsx",
galleryViewer: "./src/GalleryViewer/GalleryViewer.tsx",
Created selfServe landing page (#444) * Portal changes for DedicatedGateway Changes to support creation and deletion of DedicatedGateway resource. Tested locally with various scenarios. * Portal changes for DedicatedGateway. CR feedback * Stylecop changes * created selfServe.html landing page * Removing TODO comments * exposed baselineValues * added getOnSaveNotification * disable UI when onSave is taking place * minro edits * made polling optional * added optional polling * added default * Added portal notifications * merged more changes * minor edits * added label for description * Added correlationids and polling of refresh * Added correlationids and polling of refresh * minor edit * added label tooltip * removed ClassInfo decorator * Added dynamic decription * added info and warninf types for description * more changes to promise retry * promise retry changes * added spinner on selfserve load * compile errors fixed * New changes * added operationstatus link * merged sqlxEdits * undid sqlx changes * added completed notification * passed retryInterval in notif options * more retry changes * more changes * added polling on landing on the page * edits for error display * added keys blade link * added link generation * added link to blade * Modified info and description * fixed format errors * added selfserve contract to output files * addressed PR comments Co-authored-by: Balaji Sridharan <fnbalaji@microsoft.com> Co-authored-by: fnbalaji <75445927+fnbalaji@users.noreply.github.com>
2021-03-10 21:55:05 +00:00
selfServe: "./src/SelfServe/SelfServe.tsx",
2021-01-20 15:15:01 +00:00
connectToGitHub: "./src/GitHub/GitHubConnector.ts",
},
output: {
chunkFilename: "[name].[chunkhash:6].js",
filename: "[name].[chunkhash:6].js",
2021-01-20 15:15:01 +00:00
path: path.resolve(__dirname, "dist"),
publicPath: "",
hashFunction: "xxhash64",
},
devtool: mode === "development" ? "eval-source-map" : "source-map",
plugins,
module: {
2021-01-20 15:15:01 +00:00
rules,
},
resolve: {
modules: [path.resolve(__dirname, "src"), "node_modules"],
alias: {
process: "process/browser",
"/sort_both.png": path.resolve(__dirname, "images/jquery.dataTables-images/sort_both.png"),
"/sort_asc.png": path.resolve(__dirname, "images/jquery.dataTables-images/sort_asc.png"),
"/sort_desc.png": path.resolve(__dirname, "images/jquery.dataTables-images/sort_desc.png"),
"/sort_asc_disabled.png": path.resolve(__dirname, "images/jquery.dataTables-images/sort_asc_disabled.png"),
"/sort_desc_disabled.png": path.resolve(__dirname, "images/jquery.dataTables-images/sort_desc_disabled.png"),
},
2021-08-19 03:12:40 +01:00
fallback: {
crypto: false,
fs: false,
querystring: require.resolve("querystring-es3"),
},
2021-01-20 15:15:01 +00:00
extensions: [".tsx", ".ts", ".js"],
},
optimization: {
minimize: mode === "production" ? true : false,
minimizer: [
new TerserPlugin({
terserOptions: {
// These options increase our initial bundle size by ~5% but the builds are significantly faster and won't run out of memory
compress: false,
2021-04-08 00:10:26 +01:00
mangle: {
keep_fnames: true,
keep_classnames: true,
},
2021-01-20 15:15:01 +00:00
},
}),
],
},
watch: false,
// Hack since it is hard to disable watch entirely with webpack dev server https://github.com/webpack/webpack-dev-server/issues/1251#issuecomment-654240734
watchOptions: isCI ? { poll: 24 * 60 * 60 * 1000 } : {},
/** @type {import("webpack-dev-server").Configuration}*/
devServer: {
2020-08-13 02:12:31 +01:00
hot: false,
// disableHostCheck is removed in webpack 5, use: allowedHosts: "all",
// disableHostCheck: true,
liveReload: !isCI,
server: {
type: "https",
},
host: "0.0.0.0",
port: envVars.PORT,
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": "true",
"Access-Control-Max-Age": "3600",
"Access-Control-Allow-Headers": "*",
2021-01-20 15:15:01 +00:00
"Access-Control-Allow-Methods": "*",
},
setupMiddlewares: (middlewares, server) => {
// Provide an HTTP API that will wait for compilation of all bundles to be completed.
// This is used by Playwright to know when the server is ready to be tested.
let compilationComplete = false;
server.compiler.hooks.done.tap("done", () => {
setImmediate(() => {
compilationComplete = true;
});
});
server.app.get("/_ready", (_, res) => {
if (compilationComplete) {
res.status(200).send("Compilation complete.");
} else {
res.status(503).send("Compilation not complete.");
}
});
return middlewares;
},
proxy: {
"/api": {
target: "https://main.documentdb.ext.azure.com",
changeOrigin: true,
logLevel: "debug",
bypass: (req, res) => {
if (req.method === "OPTIONS") {
res.statusCode = 200;
res.send();
}
2021-01-20 15:15:01 +00:00
},
},
"/proxy": {
target: "https://main.documentdb.ext.azure.com",
changeOrigin: true,
secure: false,
logLevel: "debug",
pathRewrite: { "^/proxy": "" },
2021-01-20 15:15:01 +00:00
router: (req) => {
let newTarget = req.headers["x-ms-proxy-target"];
return newTarget;
2021-01-20 15:15:01 +00:00
},
},
"/_explorer": {
target: process.env.EMULATOR_ENDPOINT || "https://localhost:8081/",
changeOrigin: true,
secure: false,
2021-01-20 15:15:01 +00:00
logLevel: "debug",
},
"/explorerProxy": {
target: process.env.EMULATOR_ENDPOINT || "https://localhost:8081/",
pathRewrite: { "^/explorerProxy": "" },
changeOrigin: true,
secure: false,
2021-01-20 15:15:01 +00:00
logLevel: "debug",
},
2021-03-15 03:53:16 +00:00
[`/${AZURE_TENANT_ID}`]: {
target: "https://login.microsoftonline.com/",
changeOrigin: true,
secure: false,
logLevel: "debug",
},
2021-01-20 15:15:01 +00:00
},
},
stats: "minimal",
};
};