UNPKG

@codecov/nextjs-webpack-plugin

Version:

Official Codecov NextJS (Webpack) plugin

146 lines (142 loc) 4.86 kB
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