16
16
var fsPromises = require ( 'fs/promises' ) ;
17
17
var path = require ( 'path' ) ;
18
18
var { promisify } = require ( 'util' ) ;
19
+ const { fileURLToPath } = require ( 'url' ) ;
19
20
20
21
// avoid loading error-callsites until needed to avoid
21
22
// Error.prepareStackTrace side-effects
@@ -89,6 +90,20 @@ function getCwd(log) {
89
90
return cwd ;
90
91
}
91
92
93
+ // "filePath" refers to frame.fileName(), but with the possible "file://..."
94
+ // URL converted to a local path. An callsite in an ES module will have a
95
+ // file URL for the `fileName`.
96
+ //
97
+ // This just relies on `callsite.getFileName() -> <string | null | undefined>`
98
+ // so it works with CallSite or StackFrames (from `error-stack-parser`).
99
+ function filePathFromCallSite ( callsite ) {
100
+ let filePath = callsite . getFileName ( ) ;
101
+ if ( filePath && filePath . startsWith ( 'file://' ) ) {
102
+ filePath = fileURLToPath ( filePath ) ;
103
+ }
104
+ return filePath ;
105
+ }
106
+
92
107
// If gathering a stacktrace from the structured CallSites fails, this is
93
108
// used as a fallback: parsing the `err.stack` *string*.
94
109
function stackTraceFromErrStackString ( log , err ) {
@@ -114,7 +129,7 @@ function stackTraceFromErrStackString(log, err) {
114
129
const cwd = getCwd ( log ) ;
115
130
for ( var i = 0 ; i < frames . length ; i ++ ) {
116
131
const frame = frames [ i ] ;
117
- const filename = frame . getFileName ( ) || '' ;
132
+ const filename = filePathFromCallSite ( frame ) || '' ;
118
133
stacktrace . push ( {
119
134
filename : getRelativeFileName ( filename , cwd ) ,
120
135
function : frame . getFunctionName ( ) ,
@@ -136,7 +151,7 @@ function isStackFrameApp(stackframe) {
136
151
if ( isStackFrameNode ( stackframe ) ) {
137
152
return false ;
138
153
} else {
139
- const fileName = stackframe . getFileName ( ) ;
154
+ const fileName = filePathFromCallSite ( stackframe ) ;
140
155
if ( ! fileName ) {
141
156
return true ;
142
157
} else if ( fileName . indexOf ( NODE_MODULES_PATH_SEG ) === - 1 ) {
@@ -153,7 +168,7 @@ function isStackFrameNode(stackframe) {
153
168
if ( stackframe . isNative ) {
154
169
return true ;
155
170
} else {
156
- const fileName = stackframe . getFileName ( ) ;
171
+ const fileName = filePathFromCallSite ( stackframe ) ;
157
172
if ( ! fileName ) {
158
173
return true ;
159
174
} else {
@@ -166,7 +181,7 @@ function isCallSiteApp(callsite) {
166
181
if ( isCallSiteNode ( callsite ) ) {
167
182
return false ;
168
183
} else {
169
- const fileName = callsite . getFileName ( ) ;
184
+ const fileName = filePathFromCallSite ( callsite ) ;
170
185
if ( ! fileName ) {
171
186
return true ;
172
187
} else if ( fileName . indexOf ( NODE_MODULES_PATH_SEG ) === - 1 ) {
@@ -181,7 +196,7 @@ function isCallSiteNode(callsite) {
181
196
if ( callsite . isNative ( ) ) {
182
197
return true ;
183
198
} else {
184
- const fileName = callsite . getFileName ( ) ;
199
+ const fileName = filePathFromCallSite ( callsite ) ;
185
200
if ( ! fileName ) {
186
201
return true ;
187
202
} else {
@@ -244,7 +259,7 @@ async function getSourceMapConsumer(callsite) {
244
259
if ( isCallSiteNode ( callsite ) ) {
245
260
return null ;
246
261
} else {
247
- var filename = callsite . getFileName ( ) ;
262
+ var filename = filePathFromCallSite ( callsite ) ;
248
263
if ( ! filename ) {
249
264
return null ;
250
265
} else {
@@ -277,7 +292,7 @@ async function frameFromCallSite(
277
292
sourceLinesLibraryFrames ,
278
293
) {
279
294
// getFileName can return null, e.g. with a `at Generator.next (<anonymous>)` frame.
280
- const filename = callsite . getFileName ( ) || '' ;
295
+ const filename = filePathFromCallSite ( callsite ) || '' ;
281
296
const lineno = callsite . getLineNumber ( ) ;
282
297
const colno = callsite . getColumnNumber ( ) ;
283
298
0 commit comments