Skip to content

test(NODE-7493): Enable source maps for accurate test debugging#4947

Open
seanrmilligan wants to merge 1 commit into
mongodb:mainfrom
seanrmilligan:sean.milligan/source-maps
Open

test(NODE-7493): Enable source maps for accurate test debugging#4947
seanrmilligan wants to merge 1 commit into
mongodb:mainfrom
seanrmilligan:sean.milligan/source-maps

Conversation

@seanrmilligan
Copy link
Copy Markdown

@seanrmilligan seanrmilligan commented May 27, 2026

Description

Summary of Changes

  • Enables source map generation: test/tsconfig.json is updated to include "sourceMap": true in the compilerOptions, ensuring that TypeScript generates source maps when compiling test files.
  • Activates native V8 source map support: All Mocha test configurations (.mocharc.js, test/manual/mocharc.js, test/mocha_lambda.js, test/mocha_mongodb.js) are modified to consistently pass the --enable-source-maps Node.js option. This directs the V8 engine to use available source maps for more accurate stack traces. The node-option now always includes enable-source-maps, regardless of the Node.js major version.
  • Adds a source map verification test: A new unit test, test/unit/sourcemap_demo.test.ts, is introduced to explicitly verify that V8's native stack traces correctly map back to the original TypeScript source line numbers.
  • Updates bundled test scripts: The check:test-bundled and check:unit-bundled scripts in package.json are modified to include npm run build:runtime-barrel after their respective test commands.
Notes for Reviewers

The sourcemap_demo.test.ts utilizes a temporary bypass of source-map-support's Error.prepareStackTrace override. This allows the test to observe V8's native behavior with the --enable-source-maps flag in isolation, providing a direct confirmation that the V8 engine itself is correctly resolving stack trace line numbers to their TypeScript origins.

What is the motivation for this change?

This change improves the debugging experience for tests. By enabling source map generation and activating V8's native source map support, stack traces for errors occurring in tests will now correctly point to the original TypeScript source files and line numbers, rather than the transpiled JavaScript output.

Release Highlight

Release notes highlight

Double check the following

  • Lint is passing (npm run check:lint)
  • Self-review completed using the steps outlined here
  • PR title follows the correct format: type(NODE-xxxx)[!]: description
    • Example: feat(NODE-1234)!: rewriting everything in coffeescript
  • Changes are covered by tests
  • New TODOs have a related JIRA ticket

@seanrmilligan seanrmilligan force-pushed the sean.milligan/source-maps branch from 0eac018 to 5e04b2e Compare May 27, 2026 21:48
@seanrmilligan seanrmilligan marked this pull request as ready for review May 27, 2026 21:56
@seanrmilligan seanrmilligan requested a review from a team as a code owner May 27, 2026 21:56
Copilot AI review requested due to automatic review settings May 27, 2026 21:56
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Enables Node.js native source map support across the test runners so that stack traces from compiled TypeScript test files report original .ts line numbers. Adds a demonstration/verification test for the behavior.

Changes:

  • Adds --enable-source-maps to the node-option array in all mocha config files.
  • Enables sourceMap: true in test/tsconfig.json so emitted JS has source maps.
  • Adds a new unit test that verifies V8 natively maps stack frames back to TS source lines.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
.mocharc.js Adds enable-source-maps to node-options for default test runs.
test/mocha_mongodb.js Adds enable-source-maps for integration test runs.
test/mocha_lambda.js Adds enable-source-maps for lambda test runs.
test/manual/mocharc.js Adds enable-source-maps for manual test runs.
test/tsconfig.json Enables sourceMap emission for tests.
test/unit/sourcemap_demo.test.ts New test verifying V8 reports TS line numbers in stack frames.
package.json Appends build:runtime-barrel to bundled check scripts using ;.

Comment thread package.json
Comment thread test/unit/sourcemap_demo.test.ts Outdated
Comment thread test/unit/sourcemap_demo.test.ts Outdated
Comment on lines +53 to +59
console.log('\n ── raw V8 frame (prepareStackTrace bypassed) ──');
console.log(` file : ${frame.file}`);
console.log(` line : ${frame.line} (TypeScript source line is ${TS_SOURCE_LINE})`);
console.log(` col : ${frame.col}`);
console.log(
` ${frame.line === TS_SOURCE_LINE ? '✔ line matches TS source' : `✘ line ${frame.line} ≠ TS source line ${TS_SOURCE_LINE} — source maps not applied by V8`}`
);
Comment on lines +49 to +50
describe('Source map verification (NODE-7493)', function () {
it('V8 native stack frame reports correct TypeScript line number', function () {
Comment thread test/unit/sourcemap_demo.test.ts Outdated
Pass --enable-source-maps to Node for all mocha configs so V8 resolves
inline source maps emitted by ts-node, making the debugger show correct
TypeScript file/line locations. Also add sourceMap: true to
test/tsconfig.json and ensure bundled test runs reset test/mongodb.ts
so stale VM-context state does not affect subsequent debug sessions.
@seanrmilligan seanrmilligan force-pushed the sean.milligan/source-maps branch from 5e04b2e to 228897f Compare May 27, 2026 22:02
Comment thread package.json
"check:search-indexes": "npm run build:bundle && nyc mocha --config test/mocha_mongodb.js test/manual/search-index-management.prose.test.ts",
"check:test": "npm run build:bundle && nyc mocha --config test/mocha_mongodb.js test/integration",
"check:test-bundled": "MONGODB_BUNDLED=true npm run check:test",
"check:test-bundled": "MONGODB_BUNDLED=true npm run check:test; npm run build:runtime-barrel",
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.

What is the purpose of building the barrel after running tests? I don't think we need these two changes.

Copy link
Copy Markdown
Contributor

@PavelSafronov PavelSafronov left a comment

Choose a reason for hiding this comment

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

One of the Acceptance Criteria is to verify hostMatchesWildcards debugging. This can be done manually (test locally, add the repro steps to the PR description, I'll verify on my side), or maybe we can update sourcemap.test.ts test to import and use hostMatchesWildcards and verify that the debugger experience is improved. Up to you how we verify this.

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.

Love the idea of checking programmatically that the correct line is reported. But the current implementation is a bit flaky: we are hard-coding TS_SOURCE_LINE. What if instead we populate that value during test runtime by reading the test file?

@tadjik1 tadjik1 self-assigned this Jun 2, 2026
@tadjik1 tadjik1 added the Primary Review In Review with primary reviewer, not yet ready for team's eyes label Jun 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Primary Review In Review with primary reviewer, not yet ready for team's eyes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants