From 50756e1b6727975e36dff2682d4b2f6f7df01b45 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Wed, 19 Jul 2023 10:04:07 +0200 Subject: [PATCH] fix(nextjs): Ensure Webpack plugin is available after dynamic require --- packages/nextjs/src/config/webpack.ts | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/nextjs/src/config/webpack.ts b/packages/nextjs/src/config/webpack.ts index a923c57cfef1..786ce0dfaaed 100644 --- a/packages/nextjs/src/config/webpack.ts +++ b/packages/nextjs/src/config/webpack.ts @@ -2,6 +2,7 @@ /* eslint-disable max-lines */ import { getSentryRelease } from '@sentry/node'; import { arrayify, dropUndefinedKeys, escapeStringForRegex, loadModule, logger } from '@sentry/utils'; +import type SentryCliPlugin from '@sentry/webpack-plugin'; import * as chalk from 'chalk'; import * as fs from 'fs'; import * as path from 'path'; @@ -312,15 +313,16 @@ export function constructWebpackConfigFunction( // without, the option to use `hidden-source-map` only applies to the client-side build. newConfig.devtool = userSentryOptions.hideSourceMaps && !isServer ? 'hidden-source-map' : 'source-map'; - const SentryWebpackPlugin = loadModule('@sentry/webpack-plugin'); - - newConfig.plugins = newConfig.plugins || []; - newConfig.plugins.push( - // @ts-expect-error - this exists, the dynamic import just doesn't know about it - new SentryWebpackPlugin( - getWebpackPluginOptions(buildContext, userSentryWebpackPluginOptions, userSentryOptions), - ), - ); + const SentryWebpackPlugin = loadModule('@sentry/webpack-plugin'); + if (SentryWebpackPlugin) { + newConfig.plugins = newConfig.plugins || []; + newConfig.plugins.push( + // @ts-expect-error - this exists, the dynamic import just doesn't know about it + new SentryWebpackPlugin( + getWebpackPluginOptions(buildContext, userSentryWebpackPluginOptions, userSentryOptions), + ), + ); + } } } @@ -769,10 +771,10 @@ function shouldEnableWebpackPlugin(buildContext: BuildContext, userSentryOptions // architecture-specific version of the `sentry-cli` binary. If `yarn install`, `npm install`, or `npm ci` are run // with the `--ignore-scripts` option, this will be blocked and the missing binary will cause an error when users // try to build their apps. - const SentryWebpackPlugin = loadModule('@sentry/webpack-plugin'); + const SentryWebpackPlugin = loadModule('@sentry/webpack-plugin'); // @ts-expect-error - this exists, the dynamic import just doesn't know it - if (!SentryWebpackPlugin.cliBinaryExists()) { + if (!SentryWebpackPlugin || !SentryWebpackPlugin.cliBinaryExists()) { // eslint-disable-next-line no-console console.error( `${chalk.red('error')} - ${chalk.bold('Sentry CLI binary not found.')} Source maps will not be uploaded.\n`,