2025-04-02 13:24:56 +05:30

134 lines
3.5 KiB
JavaScript

const path = require('path');
const glob = require('glob');
const TerserPlugin = require('terser-webpack-plugin');
// -------------------------------------------------------------------------------
// Config
const conf = (() => {
const _conf = require('./build-config');
return require('deepmerge').all([{}, _conf.base || {}, _conf[process.env.NODE_ENV] || {}]);
})();
conf.distPath = path.resolve(__dirname, conf.distPath);
// -------------------------------------------------------------------------------
// NPM packages to transpile
const TRANSPILE_PACKAGES = ['bootstrap', 'popper.js', 'shepherd.js'];
const packageRegex = package => `(?:\\\\|\\/)${package}(?:\\\\|\\/).+?\\.js$`;
// -------------------------------------------------------------------------------
// Build config
const collectEntries = () => {
const fileList = glob.sync(`!(${conf.exclude.join('|')})/**/!(_)*.@(js|es6)`) || [];
return fileList.reduce((entries, file) => {
const filePath = file.replace(/\\/g, '/');
return { ...entries, [filePath.replace(/\.(?:js|es6)$/, '')]: `./${filePath}` };
}, {});
};
const babelLoader = () => ({
loader: 'babel-loader',
options: {
presets: [['@babel/preset-env', { targets: 'last 2 versions, ie >= 10' }]],
plugins: [
'@babel/plugin-transform-destructuring',
'@babel/plugin-transform-object-rest-spread',
'@babel/plugin-transform-template-literals'
],
babelrc: false
}
});
const webpackConfig = {
mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
performance: {
hints: false,
maxEntrypointSize: 512000,
maxAssetSize: 512000
},
entry: collectEntries(),
output: {
path: conf.distPath,
filename: '[name].js',
libraryTarget: 'umd'
},
module: {
rules: [
{
// Transpile sources
test: /\.es6$|\.js$/,
exclude: [path.resolve(__dirname, 'node_modules')],
use: [babelLoader()]
},
{
// Transpile required packages
test: new RegExp(`(?:${TRANSPILE_PACKAGES.map(packageRegex).join(')|(?:')})`),
include: [path.resolve(__dirname, 'node_modules')],
use: [babelLoader()]
},
{
test: /\.css$/,
use: [{ loader: 'style-loader' }, { loader: 'css-loader' }]
},
{
test: /\.scss$/,
use: [{ loader: 'style-loader' }, { loader: 'css-loader' }, { loader: 'sass-loader' }]
},
{
test: /\.html$/,
use: [
{
loader: 'html-loader',
options: { minimize: true }
}
]
}
]
},
plugins: [],
externals: {
jquery: 'jQuery',
moment: 'moment',
jsdom: 'jsdom',
velocity: 'Velocity',
hammer: 'Hammer',
pace: '"pace-progress"',
chartist: 'Chartist',
'popper.js': 'Popper',
// blueimp-gallery plugin
'./blueimp-helper': 'jQuery',
'./blueimp-gallery': 'blueimpGallery',
'./blueimp-gallery-video': 'blueimpGallery'
}
};
// -------------------------------------------------------------------------------
// Sourcemaps
if (conf.sourcemaps) {
webpackConfig.devtool = conf.devtool;
}
// -------------------------------------------------------------------------------
// Minify
// Minifies sources by default in production mode
if (process.env.NODE_ENV !== 'production' && conf.minify) {
webpackConfig.plugins.push(
new TerserPlugin({
optimization: {
minimize: true
},
sourceMap: conf.sourcemaps,
parallel: true
})
);
}
module.exports = webpackConfig;