@@ -380,11 +380,37 @@ function checkWebpackPluginOverrides(
380
380
* @returns `true` if sentry code should be injected, and `false` otherwise
381
381
*/
382
382
function shouldAddSentryToEntryPoint ( entryPointName : string , isServer : boolean ) : boolean {
383
- return (
384
- entryPointName === 'pages/_app' ||
385
- ( entryPointName . includes ( 'pages/api' ) && ! entryPointName . includes ( '_middleware' ) ) ||
386
- ( isServer && entryPointName === 'pages/_error' )
387
- ) ;
383
+ // On the server side, by default we inject the `Sentry.init()` code into every page (with a few exceptions).
384
+ if ( isServer ) {
385
+ const entryPointRoute = entryPointName . replace ( / ^ p a g e s / , '' ) ;
386
+ if (
387
+ // All non-API pages contain both of these components, and we don't want to inject more than once, so as long as
388
+ // we're doing the individual pages, it's fine to skip these. (Note: Even if a given user doesn't have either or
389
+ // both of these in their `pages/` folder, they'll exist as entrypoints because nextjs will supply default
390
+ // versions.)
391
+ entryPointRoute === '/_app' ||
392
+ entryPointRoute === '/_document' ||
393
+ // While middleware was in beta, it could be anywhere (at any level) in the `pages` directory, and would be called
394
+ // `_middleware.js`. Until the SDK runs successfully in the lambda edge environment, we have to exclude these.
395
+ entryPointName . includes ( '_middleware' ) ||
396
+ // Newer versions of nextjs are starting to introduce things outside the `pages/` folder (middleware, an `app/`
397
+ // directory, etc), but until those features are stable and we know how we want to support them, the safest bet is
398
+ // not to inject anywhere but inside `pages/`.
399
+ ! entryPointName . startsWith ( 'pages/' )
400
+ ) {
401
+ return false ;
402
+ }
403
+
404
+ // We want to inject Sentry into all other pages
405
+ return true ;
406
+ }
407
+
408
+ // On the client side, we only want to inject into `_app`, because that guarantees there'll be only one copy of the
409
+ // SDK in the eventual bundle. Since `_app` is the (effectively) the root component for every nextjs app, inclusing
410
+ // Sentry there means it will be available for every front end page.
411
+ else {
412
+ return entryPointName === 'pages/_app' ;
413
+ }
388
414
}
389
415
390
416
/**
0 commit comments