We don't need to explicitly mention TerserJSPlugin any more (from commit
6b8611), as webpack 5 can now extend the `minimizer:` list with the
special `...` syntax.
This gets rid of several `npm install` warnings:
deprecated [email protected]: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
deprecated [email protected]: https://github.com/lydell/resolve-url#deprecated
deprecated [email protected]: Please see https://github.com/lydell/urix#deprecated
deprecated [email protected]: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.
as well as 10 MB of node_modules.
130 lines
4 KiB
JavaScript
130 lines
4 KiB
JavaScript
const path = require("path");
|
|
const childProcess = require('child_process');
|
|
|
|
const copy = require("copy-webpack-plugin");
|
|
const extract = require("mini-css-extract-plugin");
|
|
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
|
|
const CompressionPlugin = require("compression-webpack-plugin");
|
|
const ESLintPlugin = require('eslint-webpack-plugin');
|
|
const CockpitPoPlugin = require("./src/lib/cockpit-po-plugin");
|
|
|
|
const webpack = require("webpack");
|
|
|
|
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"}),
|
|
new ESLintPlugin({ extensions: ["js", "jsx"] }),
|
|
new CockpitPoPlugin(),
|
|
];
|
|
|
|
/* Only minimize when in production mode */
|
|
if (production) {
|
|
plugins.unshift(new CompressionPlugin({
|
|
test: /\.(js|html|css)$/,
|
|
deleteOriginalAssets: true
|
|
}));
|
|
}
|
|
|
|
/* 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 <script>, everything else should be bundled
|
|
externals: { "cockpit": "cockpit" },
|
|
devtool: "source-map",
|
|
stats: "errors-warnings",
|
|
|
|
optimization: {
|
|
minimize: production,
|
|
minimizer: [`...`, new CssMinimizerPlugin()],
|
|
},
|
|
|
|
module: {
|
|
rules: [
|
|
{
|
|
exclude: /node_modules/,
|
|
use: "babel-loader",
|
|
test: /\.(js|jsx)$/
|
|
},
|
|
/* HACK: remove unwanted fonts from PatternFly's css */
|
|
{
|
|
test: /patternfly-4-cockpit.scss$/,
|
|
use: [
|
|
extract.loader,
|
|
{
|
|
loader: 'css-loader',
|
|
options: {
|
|
sourceMap: true,
|
|
url: false,
|
|
}
|
|
},
|
|
{
|
|
loader: 'string-replace-loader',
|
|
options: {
|
|
multiple: [
|
|
{
|
|
search: /src:url\("patternfly-icons-fake-path\/pficon[^}]*/g,
|
|
replace: 'src:url("../base1/fonts/patternfly.woff") format("woff");',
|
|
},
|
|
{
|
|
search: /@font-face[^}]*patternfly-fonts-fake-path[^}]*}/g,
|
|
replace: '',
|
|
},
|
|
]
|
|
},
|
|
},
|
|
'sassc-loader',
|
|
]
|
|
},
|
|
{
|
|
test: /\.s?css$/,
|
|
exclude: /patternfly-4-cockpit.scss/,
|
|
use: [
|
|
extract.loader,
|
|
{
|
|
loader: 'css-loader',
|
|
options: {
|
|
sourceMap: true,
|
|
url: false
|
|
}
|
|
},
|
|
'sassc-loader',
|
|
]
|
|
},
|
|
]
|
|
},
|
|
plugins: plugins
|
|
}
|