73 lines
1.9 KiB
TypeScript
73 lines
1.9 KiB
TypeScript
import TerserJSPlugin from 'terser-webpack-plugin';
|
|
import MiniCSSExtractPlugin from 'mini-css-extract-plugin';
|
|
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
|
|
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
|
|
import path from 'path';
|
|
import { Configuration } from 'webpack';
|
|
import { SanitizedConfig } from '../config/types';
|
|
import getBaseConfig from './getBaseConfig';
|
|
|
|
export default (payloadConfig: SanitizedConfig): Configuration => {
|
|
const baseConfig = getBaseConfig(payloadConfig) as any;
|
|
|
|
let config: Configuration = {
|
|
...baseConfig,
|
|
output: {
|
|
publicPath: `${payloadConfig.routes.admin}/`,
|
|
path: path.resolve(process.cwd(), 'build'),
|
|
filename: '[name].[chunkhash].js',
|
|
chunkFilename: '[name].[chunkhash].js',
|
|
},
|
|
mode: 'production',
|
|
stats: 'errors-only',
|
|
optimization: {
|
|
minimizer: [new TerserJSPlugin({}), new CssMinimizerPlugin()],
|
|
splitChunks: {
|
|
cacheGroups: {
|
|
styles: {
|
|
name: 'styles',
|
|
test: /\.(sa|sc|c)ss$/,
|
|
chunks: 'all',
|
|
enforce: true,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
plugins: [
|
|
...baseConfig.plugins,
|
|
new MiniCSSExtractPlugin({
|
|
filename: '[name].css',
|
|
ignoreOrder: true,
|
|
}),
|
|
],
|
|
};
|
|
|
|
config.module.rules.push({
|
|
test: /\.(scss|css)$/,
|
|
sideEffects: true,
|
|
use: [
|
|
MiniCSSExtractPlugin.loader,
|
|
require.resolve('css-loader'),
|
|
{
|
|
loader: require.resolve('postcss-loader'),
|
|
options: {
|
|
postcssOptions: {
|
|
plugins: [require.resolve('postcss-preset-env')],
|
|
},
|
|
},
|
|
},
|
|
require.resolve('sass-loader'),
|
|
],
|
|
});
|
|
|
|
if (process.env.PAYLOAD_ANALYZE_BUNDLE) {
|
|
config.plugins.push(new BundleAnalyzerPlugin());
|
|
}
|
|
|
|
if (payloadConfig.admin.webpack && typeof payloadConfig.admin.webpack === 'function') {
|
|
config = payloadConfig.admin.webpack(config);
|
|
}
|
|
|
|
return config;
|
|
};
|