diff --git a/packages/nextjs/src/config/webpack.ts b/packages/nextjs/src/config/webpack.ts index 81e38cee6007..6b5228780b54 100644 --- a/packages/nextjs/src/config/webpack.ts +++ b/packages/nextjs/src/config/webpack.ts @@ -1,10 +1,11 @@ /* eslint-disable max-lines */ -import { getSentryRelease } from '@sentry/node'; +import { deepReadDirSync, getSentryRelease } from '@sentry/node'; import { arrayify, dropUndefinedKeys, escapeStringForRegex, logger, stringMatchesSomePattern } from '@sentry/utils'; import { default as SentryWebpackPlugin } from '@sentry/webpack-plugin'; import * as chalk from 'chalk'; import * as fs from 'fs'; import * as path from 'path'; +import { WebpackPluginInstance } from 'webpack'; import { BuildContext, @@ -100,6 +101,28 @@ export function constructWebpackConfigFunction( ], }); } + + // Prevent `@vercel/nft` (which nextjs uses to determine which files are needed when packaging up a lambda) from + // including any of our build-time code or dependencies. (Otherwise it'll include files like this one and even the + // entirety of rollup and sucrase.) + const nftPlugin = newConfig.plugins?.find((plugin: WebpackPluginInstance) => { + const proto = Object.getPrototypeOf(plugin) as WebpackPluginInstance; + return proto.constructor.name === 'TraceEntryPointsPlugin'; + }) as WebpackPluginInstance & { excludeFiles: string[] }; + if (nftPlugin) { + const nextjsPackageRoot = path.dirname(require.resolve('@sentry/nextjs')); + const nextjsPackageConfigDir = path.join(nextjsPackageRoot, 'config'); + const excludedNextjsPackageFiles = deepReadDirSync(nextjsPackageConfigDir).map(file => + path.join(nextjsPackageConfigDir, file), + ); + + nftPlugin.excludeFiles.push(...excludedNextjsPackageFiles); + } else { + __DEBUG_BUILD__ && + logger.warn( + 'Unable to exclude Sentry build-time helpers from nft files. Could not find `TraceEntryPointsPlugin`.', + ); + } } // The SDK uses syntax (ES6 and ES6+ features like object spread) which isn't supported by older browsers. For users