@codecov/nextjs-webpack-plugin
Version:
Official Codecov NextJS (Webpack) plugin
146 lines (142 loc) • 4.86 kB
JavaScript
import { createWebpackPlugin } from 'unplugin';
import { red, checkNodeVersion, normalizeOptions, handleErrors, createSentryInstance, Output, telemetryPlugin } from '@codecov/bundler-plugin-core';
import { _internal_processAssets, _internal_processChunks, _internal_processModules } from '@codecov/webpack-plugin';
const nextJSWebpackBundleAnalysisPlugin = ({ output, pluginName, pluginVersion, options }) => ({
version: output.version,
name: pluginName,
pluginVersion,
buildStart: () => {
output.start();
output.setPlugin(pluginName, pluginVersion);
},
buildEnd: () => {
output.end();
},
writeBundle: async () => {
await output.write();
},
webpack(compiler) {
compiler.hooks.thisCompilation.tap(pluginName, (compilation) => {
if (!options.webpack) {
red(
"Unable to run bundle analysis, Webpack wasn't passed successfully."
);
return;
}
compilation.hooks.processAssets.tapPromise(
{
name: pluginName,
stage: options.webpack.Compilation.PROCESS_ASSETS_STAGE_REPORT
},
async () => {
if (!options.webpack) {
red(
"Unable to run bundle analysis, Webpack wasn't passed successfully."
);
return;
}
output.setBundleName(output.originalBundleName);
if (typeof compilation.outputOptions.chunkFormat === "string") {
if (compilation.name && compilation.name !== "") {
output.setBundleName(`${output.bundleName}-${compilation.name}`);
}
let chunkFormat = compilation.outputOptions.chunkFormat;
if (chunkFormat === "commonjs") {
chunkFormat = "cjs";
} else if (chunkFormat === "module") {
chunkFormat = "esm";
}
output.setBundleName(`${output.bundleName}-${chunkFormat}`);
}
const compilationStats = compilation.getStats().toJson({
assets: true,
chunks: true,
modules: true,
builtAt: true,
hash: true
});
output.bundler = {
name: "webpack",
version: options.webpack.version
};
const outputOptions = compilation.outputOptions;
const { assets, chunks, modules } = compilationStats;
if (assets) {
const collectedAssets = await _internal_processAssets({
assets,
compilation,
metaFramework: output.metaFramework
});
output.assets = collectedAssets;
}
const chunkIdMap = /* @__PURE__ */ new Map();
if (chunks) {
output.chunks = _internal_processChunks({ chunks, chunkIdMap });
}
if (modules) {
output.modules = _internal_processModules({ modules, chunkIdMap });
}
output.duration = Date.now() - (output.builtAt ?? 0);
output.outputPath = outputOptions.path ?? "";
if (output.dryRun) {
const { RawSource } = options.webpack.sources;
compilation.emitAsset(
`${output.bundleName}-stats.json`,
new RawSource(output.bundleStatsToJson())
);
}
}
);
});
}
});
const PLUGIN_NAME = "@codecov/nextjs-webpack-plugin";
const PLUGIN_VERSION = "1.9.0";
const codecovNextJSWebpackPluginFactory = createWebpackPlugin((userOptions, unpluginMetaContext) => {
if (checkNodeVersion(unpluginMetaContext)) {
return [];
}
const normalizedOptions = normalizeOptions(userOptions);
if (!normalizedOptions.success) {
const { shouldExit } = handleErrors(normalizedOptions);
if (shouldExit) {
process.exit(1);
}
return [];
}
const plugins = [];
const options = normalizedOptions.options;
const sentryConfig = createSentryInstance({
telemetry: options.telemetry,
isDryRun: options.dryRun,
pluginName: PLUGIN_NAME,
pluginVersion: PLUGIN_VERSION,
options,
bundler: unpluginMetaContext.framework,
metaFramework: "nextjs"
});
const output = new Output(
options,
{ metaFramework: unpluginMetaContext.framework },
sentryConfig
);
if (options.enableBundleAnalysis) {
plugins.push(
telemetryPlugin({
sentryClient: sentryConfig.sentryClient,
sentryScope: sentryConfig.sentryScope,
telemetry: options.telemetry
}),
nextJSWebpackBundleAnalysisPlugin({
output,
options: { webpack: userOptions.webpack },
pluginName: PLUGIN_NAME,
pluginVersion: PLUGIN_VERSION
})
);
}
return plugins;
});
const codecovNextJSWebpackPlugin = codecovNextJSWebpackPluginFactory;
export { codecovNextJSWebpackPlugin };
//# sourceMappingURL=index.mjs.map