Skip to content

error printer: remap frames when the original source is unavailable, and not twice after error.stack - #38296

Merged
Jarred-Sumner merged 3 commits into
mainfrom
farm/eebf9e6f/remap-frames-without-source
Aug 17, 2026
Merged

Jarred-Sumner merged 3 commits into
mainfrom
farm/eebf9e6f/remap-frames-without-source

Conversation

@robobun

@robobun robobun commented Aug 14, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

  • Bun.inspect(err), console.error(err) and the uncaught exception output print the mapped file name with the generated line:column when the mapped source cannot be read: at thrower (orig.ts:2:27) where err.stack says at thrower (orig.ts:4:9). The frames below it are not remapped at all (at host.js:5:8).
  • Triggers: a .map whose sourcesContent entry is null (or missing) and whose source is not on disk (a deployed bun build --target=bun --sourcemap artifact with the sources stripped), or any module bun transpiled itself that was deleted or moved after it was loaded.
  • Cause: remap_zig_exception (src/jsc/VirtualMachine.rs:5704 on main) returned when fetch_without_on_load_plugins for the code frame failed. At that point the top frame's source_url had already been replaced by the mapped name (line 5679) but position was still the generated one (set at 5731, after the return), and the loop remapping the other frames (5778) never ran. Same catch return existed in the Zig version.
  • Second bug in the same function: once err.stack has been read, toZigException rebuilds the frames by parsing that string and marks them remapped (ZigException.cpp:615). The top frame honors that, but the loop at 5778 pushed the other frames through the source map a second time, so err.stack; console.error(err) printed at outer (m.js:1:39) / at top (m.js:1:39) for frames whose real positions are 2:20 and 3:18. Any error reporter that touches .stack before the error is logged or goes uncaught hits this.
  • Both reproduce on 1.3.14 and on main. The second one is Incorrect line numbers in error stack for TypeScript code #15859 (let x = error.stack; throw error printing f1 at the wrong line: 13:5 before, 8:5 with this change) and the .stack-access half of Unsupported proper logging of AggregateError, Error.cause, modified/accessed Error.stack #1352; the AggregateError and assigned-.stack parts of Unsupported proper logging of AggregateError, Error.cause, modified/accessed Error.stack #1352 are not touched here.
  • Not fixed here: once .stack has been read, the stack-string parser still stops at the first frame without parentheses (the global-code frame, usually last), so that frame stays missing from the printed output. That is a separate bug in V8StackTraceIterator (ZigException.cpp) and is tracked separately.

Fix

  • On a failed code-frame fetch, break out of the code block with an empty slice instead of returning. The rest of the function then behaves as for every other case with no original text (same fallback the plugin virtual module case already uses): the generated line is shown as the code frame, the top frame gets the mapped position, and the other frames are remapped. That code frame therefore carries generated line numbers under a mapped frame line; dropping the excerpt or the caret in that situation would be a separate change that also affects the virtual module output, so it is not part of this fix.
  • Skip frames with remapped set in the per-frame loop, which is what remap_stack_frame_positions already does. Without this the first change would also regress the ".stack read first, source missing" case, which today is only correct because the early return skipped the loop.
  • Output for eval, stdin, data:/blob: modules, new Function, plugin virtual modules, bun test failures and --compile binaries is unchanged (compared against the release build); those all fetch their source fine.
  • Tests: test/js/bun/util/inspect-error.test.js, source map remapping of the printed stack. An external map with sourcesContent: [null] and no source on disk checks Bun.inspect, err.stack and the uncaught output against fixed expected positions; a second test covers a transpiled module deleted after import, and Bun.inspect / uncaught output after err.stack was read, for a present and a deleted module, all compared against err.stack. Both fail on the release build and on main's src/ (the deleted-module test also fails with only the first change applied), pass with the fix.
  • Also in that file: normalizeError stripped debug-only builtin frames by looking for (:, but that frame now prints as at require (51:24), so the two minified-file tests failed on debug builds; it now matches on the missing file name. The other inline snapshots only moved because of the added import.
  • Also ran test/js/bun/sourcemap/, test/js/node/module/sourcemap.test.js, test/regression/issue/23022-stack-trace-iterator.test.ts, the compile sourcemap tests and the console/reportError tests: green.

Background

  • Two code paths remap stack traces. err.stack is formatted in C++ (FormatStackTraceForJS.cpp), which calls remap_stack_frame_positions for all frames at once. The error printer (Bun.inspect, console.error, uncaught exceptions) instead builds a ZigException and calls remap_zig_exception, which remaps the top frame, fetches its original source to print the code frame, then remaps the remaining frames. The bug is only in the second path, which is why err.stack was right while the printed output was wrong.
  • Lookup::display_source_url_if_needed returns the original file name when the map is external (a .map file or a --compile binary); for bun's own runtime transpilation the file name does not change, only line:column do. That is why the external case showed a wrong file/position mix and the deleted-module case showed generated positions under the right name.
  • ZigStackFrame.remapped means the frame's position is already an original position. It is set by the remap paths and by the error.stack string parser, since that string was itself produced by the remapping formatter.
  • JSC drops the structured stack frames of an ErrorInstance once err.stack has been materialized, which is why reading .stack changes which input the printer works from.
Repro output, before and after

host.js (// @bun pragma, sidecar map with sourcesContent: [null], orig.ts not on disk):

# before
Bun.inspect:      at thrower (/tmp/x/orig.ts:2:27)
err.stack  :    at thrower (/tmp/x/orig.ts:4:9)
error: HOSTILE
      at thrower (/tmp/x/orig.ts:2:27)
      at /tmp/x/host.js:5:8

# after
Bun.inspect:      at thrower (/tmp/x/orig.ts:4:9)
err.stack  :    at thrower (/tmp/x/orig.ts:4:9)
error: HOSTILE
      at thrower (/tmp/x/orig.ts:4:9)
      at /tmp/x/orig.ts:6:17

m.js, .stack read before the error is printed:

function inner() { throw new Error("X"); }
function outer() { inner(); }
function main() { try { outer(); } catch (e) { e.stack; throw e; } }
main();
# before
      at inner (/tmp/y/m.js:1:30)
      at outer (/tmp/y/m.js:1:39)
      at main (/tmp/y/m.js:1:39)

# after
      at inner (/tmp/y/m.js:1:30)
      at outer (/tmp/y/m.js:2:20)
      at main (/tmp/y/m.js:3:25)

Fixes #15859


[review] gate passed · iteration 1 · 2 files touched

fails on main (without fix)
ASAN without fix: 2 FAILED
$ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/mechgate.xml" test/js/bun/util/inspect-error.test.js
bun test v1.4.0 (18936795e)

test/js/bun/util/inspect-error.test.js:
(pass) error.cause [9.98ms]
(pass) Error [5.69ms]
(pass) BuildMessage [16.31ms]
(pass) Error inside minified file (no color)  [133.07ms]
(pass) Error inside minified file (color)  [80.34ms]
(pass) Inserted originalLine and originalColumn do not appear in node:util.inspect [211.03ms]
(pass) observable properties > sourceURL is observable [9.36ms]
(pass) observable properties > line is observable [4.51ms]
(pass) observable properties > column is observable [3.26ms]
(pass) error.stack throwing an error doesn't lead to a crash [6.33ms]
243 |     const files = ["orig.ts", "main.js"];
244 |     expect({
245 |       stack: frames(out.stack, dir, files),
246 |       inspect: frames(out.inspect, dir, files),
247 |       uncaught: frames(stderr, dir, files),
248 |     }).toEqual({
             ^
error: expect(received).toEqual(expected)

  {
    "inspect": [
-     "at thrower (orig.ts:11:5)",
-     "at orig.ts:21:5",
+     "at thrower (ori
... (truncated)

release without fix: 2 FAILED
bun test v1.4.0-canary.1 (b7a043103)

test/js/bun/util/inspect-error.test.js:
(pass) error.cause [0.41ms]
(pass) Error [0.13ms]
(pass) BuildMessage [0.43ms]
(pass) Error inside minified file (no color)  [1.57ms]
(pass) Error inside minified file (color)  [0.51ms]
(pass) Inserted originalLine and originalColumn do not appear in node:util.inspect [3.66ms]
(pass) observable properties > sourceURL is observable [0.26ms]
(pass) observable properties > line is observable [0.09ms]
(pass) observable properties > column is observable [0.09ms]
(pass) error.stack throwing an error doesn't lead to a crash [0.11ms]
243 |     const files = ["orig.ts", "main.js"];
244 |     expect({
245 |       stack: frames(out.stack, dir, files),
246 |       inspect: frames(out.inspect, dir, files),
247 |       uncaught: frames(stderr, dir, files),
248 |     }).toEqual({
             ^
error: expect(received).toEqual(expected)

  {
    "inspect": [
-     "at thrower (orig.ts:11:5)",
-     "at orig.ts:21:5",
+     "at thrower (orig.ts:2:28)",
+     "at main.js:4:14",
    ],
    "stack": [
      "at thrower (orig.ts:11:5)",
      "at orig.ts:31:5",
    ],
    "uncaught": [
-     "at thrower (orig.
... (truncated)
passes on PR (with fix)
ASAN with fix: all passed
$ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/mechgate.xml" test/js/bun/util/inspect-error.test.js
bun test v1.4.0 (18936795e)

test/js/bun/util/inspect-error.test.js:
(pass) error.cause [8.90ms]
(pass) Error [6.22ms]
(pass) BuildMessage [19.94ms]
(pass) Error inside minified file (no color)  [138.56ms]
(pass) Error inside minified file (color)  [77.24ms]
(pass) Inserted originalLine and originalColumn do not appear in node:util.inspect [160.63ms]
(pass) observable properties > sourceURL is observable [6.49ms]
(pass) observable properties > line is observable [3.00ms]
(pass) observable properties > column is observable [2.11ms]
(pass) error.stack throwing an error doesn't lead to a crash [4.53ms]
(pass) source map remapping of the printed stack > external map whose original source is unavailable [392.03ms]
(pass) source map remapping of the printed stack > transpiled modules: source deleted, and frames already remapped by error.stack [1180.02ms]

 12 pass
 0 fail
 6 snapshots, 19 expect() calls
Ran 12 tests across 1 file. [5.01s]
__F:0:S:0

release with fix: all passed
$ bun scripts/build.ts --profile=release
[configured] bun-profile → bun (stripped) in 909ms (unchanged)
ninja: Entering directory `/workspace/bun/build/release'
[1/5] gen generated_host_exports.rs
generated_host_exports.rs: 93 exports (host=3, lazy=10, generic=80, rust=0); 239 extern-C blocks audited
[1/5] cargo bun_bin → libbun_rust.a (--target x86_64-unknown-linux-gnu)

  nightly-2026-07-20-x86_64-unknown-linux-gnu unchanged - rustc 1.99.0-nightly (9f36de775 2026-07-19)

�[1m�[92m   Compiling�[0m bun_bundler v0.0.0 (/workspace/bun/src/bundler)
�[1m�[92m   Compiling�[0m bun_standalone_graph v0.0.0 (/workspace/bun/src/standalone_graph)
�[1m�[92m   Compiling�[0m bun_transpiler v0.0.0 (/workspace/bun/src/transpiler)
�[1m�[92m   Compiling�[0m bun_bunfig v0.0.0 (/workspace/bun/src/bunfig)
�[1m�[92m   Compiling�[0m bun_install v0.0.0 (/workspace/bun/src/install)
�[1m�[92m   Compiling�[0m bun_jsc v0.0.0 (/workspace/bun/src/jsc)
�[1m�[92m   Compiling�[0m bun_js_parser_jsc v0.0.0 (/workspace/bun/src/js_parser_jsc)
�[1m�[92m   Compiling�[0m bun_ast_jsc v0.0.0 (/workspace/bun/src/ast_jsc)
�[1m�[92m   Compiling�[0m bun_patch_jsc v0.0.0 (/workspace/bun/src/patch_jsc)
�[1m�[
... (truncated)
diff hotspot
src/jsc/VirtualMachine.rs              |   6 +-
 test/js/bun/util/inspect-error.test.js | 209 +++++++++++++++++++++++++++------
 2 files changed, 178 insertions(+), 37 deletions(-)

gate history · 1 passed · 0 rejected · iteration 1

evidence per changed file
file                                    reads  edits  tests
src/jsc/VirtualMachine.rs                   3      7      0
test/js/bun/util/inspect-error.test.js      6     14      0

@coderabbitai

coderabbitai Bot commented Aug 14, 2026 •

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

@robobun, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 1 minute

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 106aa817-a16a-4ba9-9517-12cbea1758aa

📥 Commits

Reviewing files that changed from the base of the PR and between 385aee6 and 1893679.

📒 Files selected for processing (2)
  • src/jsc/VirtualMachine.rs
  • test/js/bun/util/inspect-error.test.js

Comment @coderabbitai help to get the list of available commands.

Comment thread src/jsc/VirtualMachine.rs Outdated
Comment thread src/jsc/VirtualMachine.rs Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Found 2 issues this PR may fix:

  1. Incorrect line numbers in error stack for TypeScript code #15859 - let x = error.stack before the rethrow is what breaks the printed line numbers there, and only the non-top frames are wrong — exactly the double-remap this PR skips via frames[i].remapped.
  2. Unsupported proper logging of AggregateError, Error.cause, modified/accessed Error.stack #1352 - the console.log(void err.stack) → console.error(err) repro is the same double-remap; partial only — the AggregateError, Error.cause and assigned-.stack parts of that issue are untouched, so you may want to drop this line rather than auto-close it.

If this is helpful, copy the block below into the PR description to auto-close these issues on merge.

Fixes #15859
Fixes #1352

🤖 Generated with Claude Code

@robobun

robobun commented Aug 14, 2026 •

Copy link
Copy Markdown
Collaborator Author

Status: ready for review. The diff is green on every lane that ran; the remaining red on build 95894 is CI infrastructure, not this change.

Build 95894 (head 1893679, rebased onto main): 176 of 179 jobs passed, including all Linux lanes (glibc, musl, ASAN), Windows 2019 x64, and 7 of 8 Windows 11 aarch64 shards. The three non-passing jobs never ran: the two darwin 14 aarch64 shards expired after about five hours in the queue (the release-tier=previous aarch64 pool is six agents and every PR build in this window lost its darwin shards the same way, 20 expired shards across 10 builds at the time of writing), and one Windows 11 aarch64 shard was canceled because Azure returned a 500 while creating its VM. Every test annotation on the build is a retry/isolation pass of a test that is also flaky on main (napi.test.ts, inspect-error-leak.test.js, sourcetextmodule-leak.test.ts, ...); none of them is touched by this change.

The change itself is platform independent (two lines of control flow in remap_zig_exception), and the previous build (95189, before the rebase) did run on darwin: its only darwin failures were the astro-post / vite-build aborts that main had at that base and that #38291 fixed. I am not re-triggering while the darwin queue is in this state since a new build would expire the same way; happy to re-run once it clears or on request.

Reproduced (release 1.3.14, 1.4.0 canary and a main debug build) with the // @bun + sourcesContent: [null] file from the report, with a .ts module deleted after import, and with e.stack; console.error(e) / e.stack; throw e (#15859): Bun.inspect and the uncaught output disagreed with err.stack in all three; with this branch they match.

Verification: test/js/bun/util/inspect-error.test.js ("source map remapping of the printed stack") fails on the release binary and on main's src/ (2 tests) and passes with the fix, re-run on the rebased base; test/js/bun/sourcemap/, test/js/node/module/sourcemap.test.js, test/regression/issue/23022-stack-trace-iterator.test.ts, the compile sourcemap tests and the console/reportError tests stay green. Output for eval, stdin, data:/blob: modules, plugin virtual modules, bun test failures and --compile binaries is unchanged compared with the release build.

Review threads: the two comment-cop threads were addressed by shortening both comments; the code-frame nit (generated excerpt under a mapped frame when no original text exists) is pre-existing behavior shared with virtual modules and is called out in the description rather than changed here.

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — the two-line control-flow fix is a strict improvement and the remapped skip now matches remap_stack_frame_positions. The inline nit about the caret/gutter coordinate mismatch on the new fallback path is cosmetic and can be a follow-up.

Extended reasoning...

Overview

Two surgical changes to remap_zig_exception in src/jsc/VirtualMachine.rs:

  1. return → break 'code EMPTY when fetch_without_on_load_plugins fails, so the top frame's mapped position is written and the remaining-frames loop runs even when the original source can't be read.
  2. Skip frames[i].remapped in the per-frame loop, matching what remap_stack_frame_positions at line 5411 already does, so frames parsed back out of an already-remapped error.stack string aren't pushed through the map a second time.

The rest of the diff is test coverage in inspect-error.test.js (two new subprocess tests plus mechanical inline-snapshot shifts from the added import line) and a fix to normalizeError so debug-only builtin frames without a filename are still stripped.

Security risks

None. This is diagnostic output formatting — the change affects what line:column numbers appear in printed stack traces. No parsing of untrusted input, no auth/crypto/permissions surface.

Level of scrutiny

Medium-low. VirtualMachine.rs is core, but the touched function is the error-printer remap path, not execution semantics. Both changes are one-liners whose correctness is locally verifiable: the first reuses the existing empty-code fallback (same as the top_frame_is_builtin and no-preview branches directly above it), and the second mirrors the sibling function's guard. *must_reset_parser_arena_later was not set on the old return path either, so no behavior change there.

Other factors

  • Tests are thorough: hand-built VLQ mappings with sourcesContent: [null] and no source on disk; a transpiled module deleted after import; .stack-read-first for both present and deleted sources; Bun.inspect, err.stack, and uncaught stderr all cross-checked. Follows harness conventions (tempDir, bunEnv/bunExe, concurrent pipe draining, test.concurrent, exit code asserted last).
  • The one finding is explicitly a cosmetic nit (mapped column drawn against a generated code-frame line on the new fallback) and is a strict improvement over the prior behavior of showing nothing at all; the same shape already exists on the top_frame_is_builtin branch.
  • The comment-cop feedback was addressed in cc77d40 (comments shortened to one line each).
  • The normalizeError regex change was checked for over-matching: \(:?\d+:\d+\)$ cannot match a frame that has a filename before the position, so only the intended debug-only builtin frames are stripped.

Comment thread src/jsc/VirtualMachine.rs
@robobun

robobun commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator Author
Updated 7:05 PM PT - Aug 13th, 2026

@robobun, your commit cc77d40 is building: #95189

@robobun

robobun commented Aug 14, 2026 •

Copy link
Copy Markdown
Collaborator Author
Updated 7:05 AM PT - Aug 14th, 2026

❌ @robobun, your commit 1893679 has 1 failures in Build #95894 (All Failures):


🧪   To try this PR locally:

bunx bun-pr 38296

That installs a local version of the PR into your bun-38296 executable, so you can run:

bun-38296 --bun

…ead, and never twice

remap_zig_exception returned early when the source text for the code
frame could not be fetched (a .map without sourcesContent whose source
is not on disk, or a module deleted after it was loaded). By then the
top frame's file name had already been swapped for the mapped one while
its line:column were still the generated ones, and the remaining frames
were never touched, so Bun.inspect(err) and the uncaught exception
output disagreed with err.stack. Fall through with an empty code frame
instead.

The per-frame loop also re-applied the source map to frames that came
out of an already formatted err.stack string (remapped = true), so
console.error(err) after any err.stack access printed wrong positions
for every frame but the first. Skip those frames, as
remap_stack_frame_positions already does.

The normalizeError helper in inspect-error.test.js looked for the old
" (:" shape of the debug-only builtin frame, which now prints as
"at require (51:24)"; match on the missing file instead.
@robobun
robobun force-pushed the farm/eebf9e6f/remap-frames-without-source branch from cc77d40 to 1893679 Compare August 14, 2026 10:53

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — the two-line runtime change brings remap_zig_exception in line with its siblings (the top_frame_is_builtin arm already does break 'code EMPTY, and remap_stack_frame_positions already skips .remapped frames), and the tests cover the full variant matrix. My earlier nit about the mixed-coordinate code frame stands as a follow-up; it's pre-existing behavior and out of scope here as discussed.

What was reviewed:

  • Confirmed must_reset_parser_arena_later is correctly not set on the new failure path (nothing was parsed) and no resource is leaked by the break — EMPTY is static, and the original_source derefs only apply on the success arm.
  • Verified the .remapped skip matches remap_stack_frame_positions at VirtualMachine.rs:5425 exactly.
  • Checked the new normalizeError regex is anchored and only strips frames with no file path, so it can't drop legitimate frames.
  • Test structure: tempDir/using, concurrent pipe drain, exit-code-last, test.concurrent, hermetic (no network), String(dir) captured before disposal.
Extended reasoning...

Overview

Two-line fix in remap_zig_exception (src/jsc/VirtualMachine.rs): (1) when fetch_without_on_load_plugins fails to read the mapped source for the code-frame preview, break 'code EMPTY instead of returning, so the top frame's position is written and the remaining-frames loop runs; (2) skip frames whose .remapped flag is already set in that loop, so frames parsed back from a materialized error.stack string aren't pushed through the source map a second time. The rest of the diff is test coverage and mechanical snapshot shifts from the added harness import.

Security risks

None. This is error-formatting output only — no parsing of untrusted data, no allocation sizing from external input, no auth/crypto/permissions surface. The failure path now falls through to the same code the top_frame_is_builtin and !enable_source_code_preview arms already exercise.

Level of scrutiny

Low-to-medium. The runtime change is three lines and each line has a direct sibling in the same function or in remap_stack_frame_positions (line 5425) that already does the identical thing, so this is convergence rather than new behavior. The one behavioral question — whether skipping must_reset_parser_arena_later = true on the failure path leaks anything — is answered by the fact that the fetch failed before touching the arena, same as the pre-change return. The empty ZigStringSlice is static, and get_lines_in_text on it returns None, leaving the JSC-collected source lines in place (the pre-existing fallback my earlier nit describes).

Other factors

  • Tests are thorough for a fix this size: external-map-with-null-sourcesContent and deleted-transpiled-module cover the first change; present/deleted × inspect/stack-then-inspect/uncaught-after-stack cover the second, all cross-checked against err.stack as ground truth. They follow harness conventions (tempDir with using, bunEnv/bunExe, test.concurrent, concurrent pipe drain, exit code asserted last).
  • The normalizeError regex tightening is a net safety improvement over the old substring check — it's anchored end-to-end and only matches frames with a bare line:col (no path segment), so it cannot accidentally strip real frames.
  • All prior review threads are resolved: the two comment-cop notes were addressed by shortening the comments; my earlier cosmetic nit about the caret/gutter coordinate mix is acknowledged as pre-existing (shared with virtual modules) and deliberately deferred, which is called out in the PR body.
  • Fixes #15859 with a linked test; the related sourcemap/console/reportError suites were re-run per the PR body and CI is building green.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Incorrect line numbers in error stack for TypeScript code

2 participants