nodejs / nodejs/node

Sourcemaps don't work in vm.Script scripts

Ouverte
#52,102 6 commentaires 6 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

source maps vm
Langage dominant
JavaScript
Étoiles
122k
Forks
37.3k
Merge moyen
4 j 2 h
PR mergées (30 j)
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.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par l’exemple de vm.Script dans foo.js et comparez son exécution avec le chemin eval(code) sous --enable-source-maps. Suivez la manière dont sourceMappingURL est analysée par rapport à la manière dont les traces de pile sont mappées pendant script.runInNewContext() ; le travail est terminé lorsque le traceback de vm.Script pointe vers le code source CoffeeScript comme le fait le traceback de eval.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
javascript, node.js
Domaine
backend
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Active
Clarté
Plutôt claire
Accessibilité débutants
55/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.