Skip to content

Commit 1a0cda1

Browse files
bcoetargos
authored andcommitted
errors: support prepareSourceMap with source-maps
Adds support for Error.prepareStackTrace override, when --enable-source-maps is set. PR-URL: #31143 Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Anna Henningsen <[email protected]>
1 parent 8ab748e commit 1a0cda1

File tree

3 files changed

+49
-12
lines changed

3 files changed

+49
-12
lines changed

lib/internal/errors.js

+21-11
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const { kMaxLength } = internalBinding('buffer');
2020
const MainContextError = Error;
2121
const ErrorToString = Error.prototype.toString;
2222
const overrideStackTrace = new WeakMap();
23+
const kNoOverride = Symbol('kNoOverride');
2324
const prepareStackTrace = (globalThis, error, trace) => {
2425
// API for node internals to override error stack formatting
2526
// without interfering with userland code.
@@ -29,6 +30,23 @@ const prepareStackTrace = (globalThis, error, trace) => {
2930
return f(error, trace);
3031
}
3132

33+
const globalOverride =
34+
maybeOverridePrepareStackTrace(globalThis, error, trace);
35+
if (globalOverride !== kNoOverride) return globalOverride;
36+
37+
// Normal error formatting:
38+
//
39+
// Error: Message
40+
// at function (file)
41+
// at file
42+
const errorString = ErrorToString.call(error);
43+
if (trace.length === 0) {
44+
return errorString;
45+
}
46+
return `${errorString}\n at ${trace.join('\n at ')}`;
47+
};
48+
49+
const maybeOverridePrepareStackTrace = (globalThis, error, trace) => {
3250
// Polyfill of V8's Error.prepareStackTrace API.
3351
// https://crbug.com/v8/7848
3452
// `globalThis` is the global that contains the constructor which
@@ -43,19 +61,9 @@ const prepareStackTrace = (globalThis, error, trace) => {
4361
return MainContextError.prepareStackTrace(error, trace);
4462
}
4563

46-
// Normal error formatting:
47-
//
48-
// Error: Message
49-
// at function (file)
50-
// at file
51-
const errorString = ErrorToString.call(error);
52-
if (trace.length === 0) {
53-
return errorString;
54-
}
55-
return `${errorString}\n at ${trace.join('\n at ')}`;
64+
return kNoOverride;
5665
};
5766

58-
5967
let excludedStackFn;
6068

6169
// Lazily loaded
@@ -683,7 +691,9 @@ module.exports = {
683691
SystemError,
684692
// This is exported only to facilitate testing.
685693
E,
694+
kNoOverride,
686695
prepareStackTrace,
696+
maybeOverridePrepareStackTrace,
687697
overrideStackTrace,
688698
kEnhanceStackBeforeInspector,
689699
fatalExceptionStackEnhancers

lib/internal/source_map/prepare_stack_trace.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
const debug = require('internal/util/debuglog').debuglog('source_map');
44
const { findSourceMap } = require('internal/source_map/source_map_cache');
5-
const { overrideStackTrace } = require('internal/errors');
5+
const {
6+
kNoOverride,
7+
overrideStackTrace,
8+
maybeOverridePrepareStackTrace
9+
} = require('internal/errors');
610

711
// Create a prettified stacktrace, inserting context from source maps
812
// if possible.
@@ -17,6 +21,10 @@ const prepareStackTrace = (globalThis, error, trace) => {
1721
return f(error, trace);
1822
}
1923

24+
const globalOverride =
25+
maybeOverridePrepareStackTrace(globalThis, error, trace);
26+
if (globalOverride !== kNoOverride) return globalOverride;
27+
2028
const { SourceMap } = require('internal/source_map/source_map');
2129
const errorString = ErrorToString.call(error);
2230

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Flags: --enable-source-maps
2+
'use strict';
3+
4+
require('../common');
5+
const assert = require('assert');
6+
7+
// Error.prepareStackTrace() can be overridden with source maps enabled.
8+
{
9+
let prepareCalled = false;
10+
Error.prepareStackTrace = (_error, trace) => {
11+
prepareCalled = true;
12+
};
13+
try {
14+
throw new Error('foo');
15+
} catch (err) {
16+
err.stack;
17+
}
18+
assert(prepareCalled);
19+
}

0 commit comments

Comments
 (0)