nodejs / nodejs/node

Sourcemaps don't work in vm.Script scripts

Abierto
#52,102 6 comentarios 6 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

source maps vm
Lenguaje dominante
JavaScript
Estrellas
122k
Forks
37.3k
Merge medio
4 d 2 h
PR fusionados (30 d)
283

Descripción

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.

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con el ejemplo de vm.Script en foo.js y compara su ejecución con la ruta de eval(code) bajo --enable-source-maps. Traza cómo se analiza sourceMappingURL frente a cómo se mapean las trazas de pila durante script.runInNewContext(); se considera terminado cuando el traceback de vm.Script apunta al código fuente de CoffeeScript, igual que el traceback de eval.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
javascript, node.js
Área
backend
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Activo
Claridad
Bastante claro
Aptitud para principiantes
55/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.