webpack-chunk-report-plugin
Version:
Webpack Chunk Report Plugin
96 lines (95 loc) • 4.29 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.METADATA_KEY = void 0;
exports.createWebpackConfig = createWebpackConfig;
exports.withChunkReportPlugin = withChunkReportPlugin;
// libs
const path_1 = __importDefault(require("path"));
const webpack_merge_1 = require("webpack-merge");
// plugins
const webpack_bundle_analyzer_1 = require("webpack-bundle-analyzer");
const ChunkReportPlugin_1 = require("./ChunkReportPlugin");
// rules
const transformReactComponentSource_1 = require("./rules/transformReactComponentSource");
/**
* Creates a higher-order function for Webpack configuration
* @param baseConfig - The base Webpack configuration
* @param hocs - Array of configuration higher-order functions
* @returns Merged Webpack configuration
*/
function createWebpackConfig(baseConfig, ...hocs) {
return hocs.reduce((config, hoc) => hoc(config), baseConfig);
}
function withChunkReportPlugin(options = {}) {
return (config, context) => {
const { enabled, outputDirectory, emitChunkIdVsModuleData, disableTreeShaking, useBabel = true, ...restOptions } = options;
if (!enabled) {
return config;
}
const runtime = context?.nextRuntime || "client";
const reportFilename = options.reportFilename ?? `./analyze/${runtime}.json`;
const analyzerMode = "json";
const openAnalyzer = options.openAnalyzer !== undefined ? options.openAnalyzer : false;
const newConfig = {
module: {
rules: [
useBabel
? {
test: /\.(js|jsx|ts|tsx)$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
options: {
presets: [
"@babel/preset-env",
"@babel/preset-react",
"@babel/preset-typescript", // if using TypeScript
],
plugins: [
// Add your plugin here (assuming it's in src/babel/transform-react-component-source.js)
[
path_1.default.resolve(__dirname, "rules/babel/transformReactComponentSource.js"),
],
],
},
},
}
: {
test: /\.[jt]sx?$/, // Matches .js, .jsx, .ts, .tsx
exclude: /node_modules/,
use: {
loader: "ts-loader",
options: {
getCustomTransformers: () => ({
before: [(0, transformReactComponentSource_1.transformReactComponentSource)()],
}),
transpileOnly: true,
},
},
},
],
},
plugins: [
new webpack_bundle_analyzer_1.BundleAnalyzerPlugin({
...restOptions,
analyzerMode,
openAnalyzer,
reportFilename,
}),
new ChunkReportPlugin_1.ChunkReportPlugin({
runtime,
reportFilename,
outputDirectory,
emitChunkIdVsModuleData,
disableTreeShaking,
}),
],
};
return (0, webpack_merge_1.merge)(config, newConfig);
};
}
var constants_1 = require("./rules/constants");
Object.defineProperty(exports, "METADATA_KEY", { enumerable: true, get: function () { return constants_1.METADATA_KEY; } });