nodejs / nodejs/node

Sourcemaps don't work in vm.Script scripts

Open
#52,102 6 comments 6 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

source maps vm
Dominant language
JavaScript
Stars
122k
Forks
37.3k
Avg merge
4d 2h
Merged PRs (30d)
283

Description

Version

v21.7.1

Platform

Linux ecls 6.5.0-25-generic #25~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Feb 20 16:09:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux

Subsystem

source_map

What steps will reproduce the bug?

This example is adapted from https://github.com/nodejs/node/issues/43047

import vm from 'node:vm';

const comment = '//#';
const code = `// Generated by CoffeeScript 2.7.0
(function() {
  throw new Error('hello');

}).call(this);

${comment} sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLmpzIiwic291cmNlUm9vdCI6IlxcIiwic291cmNlcyI6WyJzaW1wbGUuY29mZmVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtFQUFBLE1BQU0sSUFBSSxLQUFKLENBQVUsT0FBVjtBQUFOIiwic291cmNlc0NvbnRlbnQiOlsidGhyb3cgbmV3IEVycm9yICdoZWxsbydcbiJdfQ==
${comment} sourceURL=simple.coffee
`;
// eval(code);

const script = new vm.Script(code, {filename: 'simple.js'})
console.log(script.sourceMapURL)
script.runInNewContext()
How often does it reproduce? Is there a required condition?

Always.

What is the expected behavior? Why is that the expected behavior?

The expected behavior is shown if I uncomment the eval call in foo.js and run the code:

$ node --enable-source-maps foo.js
/simple.coffee:1
throw new Error 'hello'
      ^


Error: hello
    at eval (/simple.coffee:1:7)
    at eval (/simple.coffee:1:1)
    at file:///home/rrt/Software/ursa/foo.js:13:1
    at ModuleJob.run (node:internal/modules/esm/module_job:218:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:329:24)
    at async loadESM (node:internal/process/esm_loader:28:7)
    at async handleMainPromise (node:internal/modules/run_main:113:12)

Now, the traceback shows the error in the CoffeeScript code.

What do you see instead?

Running this code from file foo.js gives:

$ node --enable-source-maps foo.js
node --enable-source-maps foo.js
data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLmpzIiwic291cmNlUm9vdCI6IlxcIiwic291cmNlcyI6WyJzaW1wbGUuY29mZmVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtFQUFBLE1BQU0sSUFBSSxLQUFKLENBQVUsT0FBVjtBQUFOIiwic291cmNlc0NvbnRlbnQiOlsidGhyb3cgbmV3IEVycm9yICdoZWxsbydcbiJdfQ==
simple.coffee:3
  throw new Error('hello');
  ^

Error: hello
    at simple.coffee:3:9
    at simple.coffee:5:4
    at Script.runInContext (node:vm:133:12)
    at Script.runInNewContext (node:vm:138:17)
    at file:///home/rrt/Software/ursa/foo.js:17:8
    at ModuleJob.run (node:internal/modules/esm/module_job:218:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:329:24)
    at async loadESM (node:internal/process/esm_loader:28:7)
    at async handleMainPromise (node:internal/modules/run_main:113:12)

Note that the traceback shows the JavaScript source, not the CoffeeScript source.

Additional information

Note that the vm.Script module correctly parses the sourceMappingURL comment, and displays its contents. This led me to believe that the source map would be supported during execution!

I'm sorry if I have overlooked other issues in this area; I have only found the issue I referred to above about adding support for source maps to eval.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the vm.Script example in foo.js and compare its execution with the eval(code) path under --enable-source-maps. Trace how the sourceMappingURL is parsed versus how stack traces are mapped during script.runInNewContext(); done means the vm.Script traceback points to the CoffeeScript source as the eval traceback does.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript, node.js
Domain
backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.