@@ -81,20 +81,8 @@ export function constructWebpackConfigFunction(
81
81
const newConfig = setUpModuleRules ( rawNewConfig ) ;
82
82
83
83
if ( isServer ) {
84
- newConfig . module . rules . push ( {
85
- test : / s e n t r y \. s e r v e r \. c o n f i g \. ( j s x ? | t s x ? ) / ,
86
- use : [
87
- {
88
- // Support non-default output directories by making the output path (easy to get here at build-time)
89
- // available to the server SDK's default `RewriteFrames` instance (which needs it at runtime), by
90
- // injecting code to attach it to `global`.
91
- loader : path . resolve ( __dirname , 'loaders/prefixLoader.js' ) ,
92
- options : {
93
- distDir : userNextConfig . distDir || '.next' ,
94
- } ,
95
- } ,
96
- ] ,
97
- } ) ;
84
+ // This loader will inject code setting global values for use by `RewriteFrames`
85
+ addRewriteFramesLoader ( newConfig , 'server' , userNextConfig ) ;
98
86
99
87
if ( userSentryOptions . autoInstrumentServerFunctions !== false ) {
100
88
const pagesDir = newConfig . resolve ?. alias ?. [ 'private-next-pages' ] as string ;
@@ -644,3 +632,42 @@ function setUpModuleRules(newConfig: WebpackConfigObject): WebpackConfigObjectWi
644
632
// `newConfig.module.rules` just above, but ¯\_(ツ)_/¯
645
633
return newConfig as WebpackConfigObjectWithModuleRules ;
646
634
}
635
+
636
+ /**
637
+ * Support the `distDir` option by making its value (easy to get here at build-time) available to the server SDK's
638
+ * default `RewriteFrames` instance (which needs it at runtime), by injecting code to attach it to `global`.
639
+ *
640
+ * @param newConfig The webpack config object being constructed
641
+ * @param target Either 'server' or 'client'
642
+ * @param userNextConfig The user's nextjs config options
643
+ */
644
+ function addRewriteFramesLoader (
645
+ newConfig : WebpackConfigObjectWithModuleRules ,
646
+ target : 'server' | 'client' ,
647
+ userNextConfig : NextConfigObject ,
648
+ ) : void {
649
+ const replacements = {
650
+ server : [
651
+ [
652
+ '__DIST_DIR__' ,
653
+ // Make sure that if we have a windows path, the backslashes are interpreted as such (rather than as escape
654
+ // characters)
655
+ userNextConfig . distDir ?. replace ( / \\ / g, '\\\\' ) || '.next' ,
656
+ ] ,
657
+ ] ,
658
+ } ;
659
+
660
+ newConfig . module . rules . push ( {
661
+ test : new RegExp ( `sentry\\.${ target } \\.config\\.(jsx?|tsx?)` ) ,
662
+ use : [
663
+ {
664
+ loader : path . resolve ( __dirname , 'loaders/prefixLoader.js' ) ,
665
+ options : {
666
+ templatePrefix : `${ target } RewriteFrames` ,
667
+ // This weird cast will go away as soon as we add the client half of this function in
668
+ replacements : replacements [ target as 'server' ] ,
669
+ } ,
670
+ } ,
671
+ ] ,
672
+ } ) ;
673
+ }
0 commit comments