Thanks to visit codestin.com
Credit goes to github.com

Skip to content

module runner stack trace of esm external has wrong column with prepareStackTrace #21561

Description

@hi-ogawa

Describe the bug

For esm external:

  • fixtures/esm-external/index.js
var _padding_______________________; export function outer(fn) { return inner(fn); } function inner(fn) { return fn(); }

and the user code (entry):

  • repro-vite-entry.js
import { outer } from "test-esm-external";

function userFn() {
  throw new Error("boom");
}

outer(userFn);

running it on module runner with prepareStackTrace shows wrong stack trace column for esm external:

  • repro-vite.js
import { createServerModuleRunner } from "vite";
import { createServer } from "vite";

async function main() {
  const server = await createServer({
    configFile: false,
  });
  await server.listen();
  const runner = createServerModuleRunner(server.environments.ssr, {
    hmr: false,
    sourcemapInterceptor: "prepareStackTrace",
  });
  await runner.import("./repro-vite-entry.js");
  await server.close();
}

main();
$ node repro-vite.js
/yyy/repro-vite-entry.js:7
  throw new Error("boom");
        ^

Error: boom
    at userFn (/yyy/repro-vite-entry.js:4:9)
    at inner (file:///xxx/node_modules/test-esm-external/index.js:1:52) ⚠️ expected 114 = 52 + 62
    at outer (file:///xxx/node_modules/test-esm-external/index.js:1:11) ⚠️ expected 73 = 11 + 62
    at /yyy/repro-vite-entry.js:7:6
    at ESModulesEvaluator.runInlinedModule (file:///yyy/node_modules/vite/dist/node/module-runner.js:913:3)
    at ModuleRunner.directRequest (file:///yyy/node_modules/vite/dist/node/module-runner.js:1146:59)
    at ModuleRunner.cachedRequest (file:///yyy/node_modules/vite/dist/node/module-runner.js:1053:73)
    at ModuleRunner.import (file:///yyy/node_modules/vite/dist/node/module-runner.js:1014:10)
    at main (file:///yyy/repro-vite.js:13:3)

Node.js v24.13.0

The expected behavior is to match stack columns to be same as native node execution

$ node repro-vite-entry.js
file:///yyy/repro-vite-entry.js:4
  throw new Error("boom");
        ^

Error: boom
    at userFn (file:///yyy/repro-vite-entry.js:4:9)
    at inner (file:///xxx/node_modules/test-esm-external/index.js:1:114)
    at outer (file:///xxx/node_modules/test-esm-external/index.js:1:73)
    at file:///yyy/repro-vite-entry.js:7:1
    at ModuleJob.run (node:internal/modules/esm/module_job:413:25)
    at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:660:26)
    at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5)

Node.js v24.13.0

See here for full detail https://github.com/hi-ogawa/reproductions/tree/main/vitest-9003-source-map-external#vite-issue It appears "subtraction by 62" is coming from

const headerLength = 62
if (line === 1 && column > headerLength && !frame.isEval())
column -= headerLength

The issue is discovered while investigating vitest-dev/vitest#9152 (running minified preact on vitest happy-dom)

Reproduction

https://stackblitz.com/github/hi-ogawa/reproductions/tree/main/vitest-9003-source-map-external

Steps to reproduce

System Info

System:
    OS: Linux 6.18 Arch Linux
    CPU: (16) x64 12th Gen Intel(R) Core(TM) i7-12650H
    Memory: 14.18 GB / 31.05 GB
    Container: Yes
    Shell: 5.3.9 - /usr/bin/bash
  Binaries:
    Node: 24.13.0 - /run/user/1000/fnm_multishells/82414_1770259029960/bin/node
    npm: 11.6.2 - /run/user/1000/fnm_multishells/82414_1770259029960/bin/npm
    pnpm: 10.24.0 - /run/user/1000/fnm_multishells/82414_1770259029960/bin/pnpm
    bun: 1.3.5 - /home/hiroshi/.local/bin/bun
    Deno: 2.6.6 - /home/hiroshi/.local/bin/deno
  Browsers:
    Chromium: 143.0.7499.192
    Firefox: 146.0.1
    Firefox Developer Edition: 146.0.1
  npmPackages:
    vite: ^7.3.1 => 7.3.1

Used Package Manager

pnpm

Logs

No response

Validations

Metadata

Metadata

Assignees

No one assigned

    Labels

    feat: sourcemapSourcemap supportfeat: ssrp3-minor-bugAn edge case that only affects very specific usage (priority)

    Type

    Fields

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions