-
-
Notifications
You must be signed in to change notification settings - Fork 32.3k
Closed
Closed
Copy link
Labels
source mapsIssues and PRs related to source map support.Issues and PRs related to source map support.utilIssues and PRs related to the built-in util module.Issues and PRs related to the built-in util module.
Description
What is the problem this feature will solve?
Lot of people use tools like ts-node
or tsx
when developing locally or even in production. The new util.getCallSite()
function doesn't seem to report the line number from the original typescript file. Rather, it reports the transformed version of the file (e.g. by tsx
) with types stripped out/minified/etc?
Example
expected: line 20, col 12
received: line 1, col 15123
What is the feature you are proposing to solve the problem?
Have util.getCallSite()
report original line number for TS files.
What alternatives have you considered?
I currently have a custom function that does report the correct line number for the original typescript file. However, I would like to use the Node version if possible so I don't have to maintain this.
const ORIGINAL_STACK_TRACE_LIMIT = Error.stackTraceLimit;
/**
* Returns information about the indicated frame in the stack trace.
* frameIndex = 0 corresponds to the function that calls stackedTrace().
*
* Below sample values assume frameIndex = 1.
* Inspiration: https://www.npmjs.com/package/callsites/v/3.1.0
*/
export function stackTrace(frameIndex = 0) {
// Optimization: Adjust stackTraceLimit to the minimum depth required to get the desired frameIndex.
// This significantly reduces the depth of the produced stack trace. (Node 22's default limit is 10)
Error.stackTraceLimit = frameIndex + 1;
const error = { stack: "" };
// https://nodejs.org/api/errors.html#errorcapturestacktracetargetobject-constructoropt
// Creates a `.stack` property on provided object
Error.captureStackTrace(
error,
stackTrace // don't include the stackTrace() function itself in the trace
);
Error.stackTraceLimit = ORIGINAL_STACK_TRACE_LIMIT; // restore original stackTraceLimit
// "Error
// at DerivedLogger.logger.<computed> (/Users/bruce.liu/Desktop/ai-search/server/logging/logger.ts:50:20)
// at Server.<anonymous> (/Users/bruce.liu/Desktop/ai-search/server/index.ts:58:12)"
const stackErrorMsg = error.stack;
// [
// "at DerivedLogger.logger.<computed> (/Users/bruce.liu/Desktop/ai-search/server/logging/logger.ts:50:20)",
// "at Server.<anonymous> (/Users/bruce.liu/Desktop/ai-search/server/index.ts:58:12)"
// ]
const frames = stackErrorMsg.split("\n").slice(1);
// "at Server.<anonymous> (/Users/bruce.liu/Desktop/ai-search/server/index.ts:58:12)"
let frameOfInterest = frames[frameIndex]!;
// "at Server.<anonymous> /Users/bruce.liu/Desktop/ai-search/server/index.ts:58:12"
frameOfInterest = frameOfInterest.replace(/[()]/g, ""); // remove "(" and ")"
// "/Users/bruce.liu/Desktop/ai-search/server/index.ts:58:12"
frameOfInterest = frameOfInterest.split(" ").at(-1)!;
return frameOfInterest;
}
alexanderniebuhr and styfle
Metadata
Metadata
Assignees
Labels
source mapsIssues and PRs related to source map support.Issues and PRs related to source map support.utilIssues and PRs related to the built-in util module.Issues and PRs related to the built-in util module.