const path = require("path"); const childProcess = require('child_process'); const copy = require("copy-webpack-plugin"); const extract = require("mini-css-extract-plugin"); const TerserJSPlugin = require('terser-webpack-plugin'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const webpack = require("webpack"); const CompressionPlugin = require("compression-webpack-plugin"); const nodedir = path.resolve((process.env.SRCDIR || __dirname), "node_modules"); /* A standard nodejs and webpack pattern */ const production = process.env.NODE_ENV === 'production'; // Non-JS files which are copied verbatim to dist/ const copy_files = [ "./src/index.html", "./src/manifest.json", ]; const plugins = [ new copy({ patterns: copy_files }), new extract({filename: "[name].css"}) ]; /* Only minimize when in production mode */ if (production) { plugins.unshift(new CompressionPlugin({ test: /\.(js|html|css)$/, deleteOriginalAssets: true })); } /* keep this in sync with cockpit.git */ const babel_loader = { loader: "babel-loader", options: { presets: [ ["@babel/env", { "targets": { "chrome": "57", "firefox": "52", "safari": "10.3", "edge": "16", "opera": "44" } }], "@babel/preset-react" ] } } /* check if sassc is available, to avoid unintelligible error messages */ try { childProcess.execFileSync('sassc', ['--version'], { stdio: ['pipe', 'inherit', 'inherit'] }); } catch (e) { if (e.code === 'ENOENT') { console.error("ERROR: You need to install the 'sassc' package to build this project."); process.exit(1); } else { throw e; } } module.exports = { mode: production ? 'production' : 'development', resolve: { modules: [ nodedir ], }, resolveLoader: { modules: [ nodedir, path.resolve(__dirname, 'src/lib') ], }, watchOptions: { ignored: /node_modules/, }, entry: { index: "./src/index.js", }, // cockpit.js gets included via