@@ -86,15 +86,11 @@ export function getOverlayMiddleware(project: Project) {
86
86
) : Promise < void > {
87
87
const { pathname, searchParams } = new URL ( req . url ! , 'http://n' )
88
88
89
- const frame = {
90
- file : searchParams . get ( 'file' ) as string ,
91
- methodName : searchParams . get ( 'methodName' ) ?? '<unknown>' ,
92
- line : parseInt ( searchParams . get ( 'lineNumber' ) ?? '0' , 10 ) || 0 ,
93
- column : parseInt ( searchParams . get ( 'column' ) ?? '0' , 10 ) || 0 ,
94
- isServer : searchParams . get ( 'isServer' ) === 'true' ,
95
- } satisfies TurbopackStackFrame
96
-
97
89
if ( pathname === '/__nextjs_original-stack-frame' ) {
90
+ const frame = createStackFrame ( searchParams )
91
+
92
+ if ( ! frame ) return badRequest ( res )
93
+
98
94
let originalStackFrame : OriginalStackFrameResponse | null
99
95
try {
100
96
originalStackFrame = await createOriginalStackFrame ( project , frame )
@@ -110,7 +106,9 @@ export function getOverlayMiddleware(project: Project) {
110
106
111
107
return json ( res , originalStackFrame )
112
108
} else if ( pathname === '/__nextjs_launch-editor' ) {
113
- if ( ! frame . file ) return badRequest ( res )
109
+ const frame = createStackFrame ( searchParams )
110
+
111
+ if ( ! frame ) return badRequest ( res )
114
112
115
113
const fileExists = await fs . access ( frame . file , FS . F_OK ) . then (
116
114
( ) => true ,
@@ -169,3 +167,24 @@ export function getSourceMapMiddleware(project: Project) {
169
167
noContent ( res )
170
168
}
171
169
}
170
+
171
+ function createStackFrame ( searchParams : URLSearchParams ) {
172
+ const fileParam = searchParams . get ( 'file' )
173
+
174
+ if ( ! fileParam ) {
175
+ return undefined
176
+ }
177
+
178
+ // rsc://React/Server/file://<filename>?42 => file://<filename>
179
+ const file = fileParam
180
+ . replace ( / ^ r s c : \/ \/ R e a c t \/ \w + \/ / , '' )
181
+ . replace ( / \? \d + $ / , '' )
182
+
183
+ return {
184
+ file,
185
+ methodName : searchParams . get ( 'methodName' ) ?? '<unknown>' ,
186
+ line : parseInt ( searchParams . get ( 'lineNumber' ) ?? '0' , 10 ) || 0 ,
187
+ column : parseInt ( searchParams . get ( 'column' ) ?? '0' , 10 ) || 0 ,
188
+ isServer : searchParams . get ( 'isServer' ) === 'true' ,
189
+ } satisfies TurbopackStackFrame
190
+ }
0 commit comments