2021-04-26 05:31:10 +01:00
/* eslint-disable @typescript-eslint/no-var-requires */
/* eslint-disable no-undef */
2021-03-15 03:53:16 +00:00
require ( "dotenv/config" ) ;
2020-05-26 03:30:55 +01:00
const path = require ( "path" ) ;
const MonacoWebpackPlugin = require ( "monaco-editor-webpack-plugin" ) ;
const HtmlWebpackPlugin = require ( "html-webpack-plugin" ) ;
2021-04-22 18:37:12 +01:00
const InlineChunkHtmlPlugin = require ( "react-dev-utils/InlineChunkHtmlPlugin" ) ;
const HTMLInlineCSSWebpackPlugin = require ( "html-inline-css-webpack-plugin" ) . default ;
2020-05-26 03:30:55 +01:00
const { EnvironmentPlugin } = require ( "webpack" ) ;
const MiniCssExtractPlugin = require ( "mini-css-extract-plugin" ) ;
const CopyWebpackPlugin = require ( "copy-webpack-plugin" ) ;
2021-08-16 21:44:40 +01:00
const { CleanWebpackPlugin } = require ( "clean-webpack-plugin" ) ;
2020-05-26 03:30:55 +01:00
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" ) ;
2021-08-16 21:44:40 +01:00
const webpack = require ( "webpack" ) ;
2020-08-12 21:25:53 +01:00
const isCI = require ( "is-ci" ) ;
2020-05-26 03:30:55 +01:00
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." ) ;
}
2020-05-26 03:30:55 +01:00
const cssRule = {
test : /\.css$/ ,
2021-01-20 15:15:01 +00:00
use : [ MiniCssExtractPlugin . loader , "css-loader" ] ,
2020-05-26 03:30:55 +01:00
} ;
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" ) ] ,
2020-05-26 03:30:55 +01:00
} ;
const imagesRule = {
test : /\.(jpg|jpeg|png|gif|svg|pdf|ico)$/ ,
2023-12-13 18:24:40 +00:00
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
} ,
2020-05-26 03:30:55 +01:00
} ;
const fontRule = {
test : /\.(woff|woff2|ttf|eot)$/ ,
2023-12-13 18:24:40 +00:00
generator : {
filename : "[name][ext]" ,
2021-01-20 15:15:01 +00:00
} ,
2020-05-26 03:30:55 +01: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" ) ,
} ,
} ,
] ,
2020-05-26 03:30:55 +01:00
} ;
// 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 ,
} ,
} ,
2020-05-26 03:30:55 +01:00
] ,
2021-01-20 15:15:01 +00:00
exclude : /node_modules/ ,
2020-05-26 03:30:55 +01:00
} ;
2021-04-26 05:31:10 +01:00
// eslint-disable-next-line @typescript-eslint/no-unused-vars
module . exports = function ( _env = { } , argv = { } ) {
2020-05-26 03:30:55 +01:00
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" ,
2020-05-26 03:30:55 +01:00
} ;
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 ;
2021-09-14 17:33:09 +01:00
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 ;
2021-01-19 22:31:55 +00:00
typescriptRule . use [ 0 ] . options . compilerOptions = { target : "ES2018" } ;
2020-05-26 03:30:55 +01:00
}
const plugins = [
2021-08-16 21:44:40 +01:00
new CleanWebpackPlugin ( ) ,
new webpack . ProvidePlugin ( {
process : "process/browser" ,
2021-08-19 03:12:40 +01:00
Buffer : [ "buffer" , "Buffer" ] ,
2021-08-16 21:44:40 +01:00
} ) ,
2020-05-26 03:30:55 +01:00
new CreateFileWebpack ( {
path : "./dist" ,
fileName : "version.txt" ,
2021-01-20 15:15:01 +00:00
content : ` ${ gitSha . trim ( ) } ${ new Date ( ) . toUTCString ( ) } ` ,
2020-05-26 03:30:55 +01:00
} ) ,
2023-12-13 18:24:40 +00:00
// 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(),
2020-07-17 02:35:18 +01:00
new MiniCssExtractPlugin ( {
2021-01-20 15:15:01 +00:00
filename : "[name].[contenthash].css" ,
2020-07-17 02:35:18 +01:00
} ) ,
2020-05-26 03:30:55 +01:00
new HtmlWebpackPlugin ( {
filename : "explorer.html" ,
template : "src/explorer.html" ,
2021-01-20 15:15:01 +00:00
chunks : [ "main" ] ,
2020-05-26 03:30:55 +01:00
} ) ,
new HtmlWebpackPlugin ( {
filename : "terminal.html" ,
template : "src/Terminal/index.html" ,
2021-01-20 15:15:01 +00:00
chunks : [ "terminal" ] ,
2020-05-26 03:30:55 +01:00
} ) ,
new HtmlWebpackPlugin ( {
filename : "quickstart.html" ,
template : "src/quickstart.html" ,
2021-01-20 15:15:01 +00:00
chunks : [ "quickstart" ] ,
2020-05-26 03:30:55 +01:00
} ) ,
new HtmlWebpackPlugin ( {
filename : "index.html" ,
template : "src/index.html" ,
2021-01-20 15:15:01 +00:00
chunks : [ "index" ] ,
2020-05-26 03:30:55 +01:00
} ) ,
new HtmlWebpackPlugin ( {
filename : "hostedExplorer.html" ,
template : "src/hostedExplorer.html" ,
2021-01-20 15:15:01 +00:00
chunks : [ "hostedExplorer" ] ,
2020-05-26 03:30:55 +01:00
} ) ,
2020-11-19 17:29:38 +00:00
new HtmlWebpackPlugin ( {
filename : "testExplorer.html" ,
2021-01-20 06:42:45 +00:00
template : "test/testExplorer/testExplorer.html" ,
2021-01-20 15:15:01 +00:00
chunks : [ "testExplorer" ] ,
2020-11-19 17:29:38 +00:00
} ) ,
2020-05-26 03:30:55 +01:00
new HtmlWebpackPlugin ( {
filename : "Heatmap.html" ,
template : "src/Controls/Heatmap/Heatmap.html" ,
2021-01-20 15:15:01 +00:00
chunks : [ "heatmap" ] ,
2020-05-26 03:30:55 +01:00
} ) ,
2021-04-22 18:37:12 +01:00
new HtmlWebpackPlugin ( {
filename : "cellOutputViewer.html" ,
template : "src/CellOutputViewer/cellOutputViewer.html" ,
chunks : [ "cellOutputViewer" ] ,
} ) ,
2020-05-26 03:30:55 +01:00
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" ] ,
2020-05-26 03:30:55 +01:00
} ) ,
new HtmlWebpackPlugin ( {
2020-07-16 07:41:05 +01:00
filename : "gallery.html" ,
2020-05-26 03:30:55 +01:00
template : "src/GalleryViewer/galleryViewer.html" ,
2021-01-20 15:15:01 +00:00
chunks : [ "galleryViewer" ] ,
2020-05-26 03:30:55 +01:00
} ) ,
new HtmlWebpackPlugin ( {
filename : "connectToGitHub.html" ,
template : "src/connectToGitHub.html" ,
2021-01-20 15:15:01 +00:00
chunks : [ "connectToGitHub" ] ,
2020-05-26 03:30:55 +01:00
} ) ,
2021-03-10 21:55:05 +00:00
new HtmlWebpackPlugin ( {
filename : "selfServe.html" ,
template : "src/SelfServe/selfServe.html" ,
chunks : [ "selfServe" ] ,
} ) ,
2021-04-22 18:37:12 +01:00
new InlineChunkHtmlPlugin ( HtmlWebpackPlugin , [ /cellOutputViewer/ ] ) ,
new HTMLInlineCSSWebpackPlugin ( {
filter : ( fileName ) => fileName . includes ( "cellOutputViewer" ) ,
} ) ,
2020-05-26 03:30:55 +01:00
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 ) ,
2020-05-26 03:30:55 +01:00
] ;
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" ,
2020-05-26 03:30:55 +01:00
quickstart : "./src/quickstart.ts" ,
2021-01-19 22:31:55 +00:00
hostedExplorer : "./src/HostedExplorer.tsx" ,
2021-01-20 06:42:45 +00:00
testExplorer : "./test/testExplorer/TestExplorer.ts" ,
2020-05-26 03:30:55 +01:00
heatmap : "./src/Controls/Heatmap/Heatmap.ts" ,
terminal : "./src/Terminal/index.ts" ,
2021-04-22 18:37:12 +01:00
cellOutputViewer : "./src/CellOutputViewer/CellOutputViewer.tsx" ,
2020-06-05 03:04:15 +01:00
notebookViewer : "./src/NotebookViewer/NotebookViewer.tsx" ,
2020-05-26 03:30:55 +01:00
galleryViewer : "./src/GalleryViewer/GalleryViewer.tsx" ,
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" ,
2020-05-26 03:30:55 +01:00
} ,
output : {
chunkFilename : "[name].[chunkhash:6].js" ,
filename : "[name].[chunkhash:6].js" ,
2021-01-20 15:15:01 +00:00
path : path . resolve ( _ _dirname , "dist" ) ,
2021-08-16 21:44:40 +01:00
publicPath : "" ,
2023-12-13 18:24:40 +00:00
hashFunction : "xxhash64" ,
2020-05-26 03:30:55 +01:00
} ,
2021-08-16 21:44:40 +01:00
devtool : mode === "development" ? "eval-source-map" : "source-map" ,
2020-05-26 03:30:55 +01:00
plugins ,
module : {
2021-01-20 15:15:01 +00:00
rules ,
2020-05-26 03:30:55 +01:00
} ,
resolve : {
2021-10-12 15:38:34 +01:00
modules : [ path . resolve ( _ _dirname , "src" ) , "node_modules" ] ,
2021-08-16 21:44:40 +01:00
alias : {
process : "process/browser" ,
2023-12-13 18:24:40 +00:00
"/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-16 21:44:40 +01:00
} ,
2021-08-19 03:12:40 +01:00
2021-08-16 21:44:40 +01:00
fallback : {
crypto : false ,
fs : false ,
2023-12-13 18:24:40 +00:00
querystring : require . resolve ( "querystring-es3" ) ,
2021-08-16 21:44:40 +01:00
} ,
2021-01-20 15:15:01 +00:00
extensions : [ ".tsx" , ".ts" , ".js" ] ,
2020-05-26 03:30:55 +01:00
} ,
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
} ,
} ) ,
] ,
2020-05-26 03:30:55 +01:00
} ,
2021-08-16 21:44:40 +01:00
watch : false ,
2020-08-12 21:25:53 +01:00
// 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 } : { } ,
2020-05-26 03:30:55 +01:00
devServer : {
2020-08-13 02:12:31 +01:00
hot : false ,
2023-12-13 18:24:40 +00:00
// disableHostCheck is removed in webpack 5, use: allowedHosts: "all",
// disableHostCheck: true,
2020-08-12 21:25:53 +01:00
liveReload : ! isCI ,
2023-12-13 18:24:40 +00:00
server : {
type : "https" ,
} ,
2020-05-26 03:30:55 +01:00
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" : "*" ,
2020-05-26 03:30:55 +01:00
} ,
proxy : {
"/api" : {
target : "https://main.documentdb.ext.azure.com" ,
changeOrigin : true ,
logLevel : "debug" ,
2021-04-26 05:31:10 +01:00
bypass : ( req , res ) => {
2020-05-26 03:30:55 +01:00
if ( req . method === "OPTIONS" ) {
res . statusCode = 200 ;
res . send ( ) ;
}
2021-01-20 15:15:01 +00:00
} ,
2020-05-26 03:30:55 +01: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 ) => {
2020-05-26 03:30:55 +01:00
let newTarget = req . headers [ "x-ms-proxy-target" ] ;
return newTarget ;
2021-01-20 15:15:01 +00:00
} ,
2020-05-26 03:30:55 +01:00
} ,
"/_explorer" : {
target : process . env . EMULATOR _ENDPOINT || "https://localhost:8081/" ,
changeOrigin : true ,
secure : false ,
2021-01-20 15:15:01 +00:00
logLevel : "debug" ,
2020-05-26 03:30:55 +01:00
} ,
"/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
} ,
2020-05-26 03:30:55 +01:00
} ,
stats : "minimal" ,
} ;
} ;