Skip to content

[22.9.0] util.getCallSite() doesn't report original line number for TS files #55109

Closed
@bruce-c-liu

Description

@bruce-c-liu

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;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    source mapsIssues and PRs related to source map support.utilIssues and PRs related to the built-in util module.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions