diff --git a/index-fetch.js b/index-fetch.js index 3d1b811daa4..e1ad407abdb 100644 --- a/index-fetch.js +++ b/index-fetch.js @@ -37,7 +37,7 @@ module.exports.fetch = function fetch (init, options = undefined) { if (currentFilename) { appendFetchStackTrace(err, currentFilename) } else if (err && typeof err === 'object') { - Error.captureStackTrace(err, module.exports.fetch) + Error.captureStackTrace(err) } throw err }) diff --git a/index.js b/index.js index 7ece983f1db..8e0128a9df4 100644 --- a/index.js +++ b/index.js @@ -158,7 +158,7 @@ module.exports.fetch = function fetch (init, options = undefined) { if (currentFilename) { appendFetchStackTrace(err, currentFilename) } else if (err && typeof err === 'object') { - Error.captureStackTrace(err, module.exports.fetch) + Error.captureStackTrace(err) } throw err }) diff --git a/test/fetch/client-error-stack-trace.js b/test/fetch/client-error-stack-trace.js index b31e2830428..158572d0efb 100644 --- a/test/fetch/client-error-stack-trace.js +++ b/test/fetch/client-error-stack-trace.js @@ -2,6 +2,9 @@ const { test, after } = require('node:test') const { sep, basename, join } = require('node:path') +const { readFileSync } = require('node:fs') +const { createRequire } = require('node:module') +const { runInThisContext } = require('node:vm') const { fetch, setGlobalDispatcher, getGlobalDispatcher, Agent } = require('../..') const projectFolder = basename(join(__dirname, '..', '..')) @@ -40,3 +43,18 @@ test('FETCH-index: request errors and prints trimmed stack trace', async (t) => t.assert.ok(stackLines.some(line => line.includes(__filename))) } }) + +test('FETCH-index: request errors keep their stack trace when __filename is undefined', async (t) => { + // Node.js bundles index-fetch.js into a module wrapper without __filename + const file = join(__dirname, '..', '..', 'index-fetch.js') + const wrapper = runInThisContext(`(function (exports, require, module) {${readFileSync(file, 'utf8')}\n})`, { filename: file }) + const bundled = { exports: {} } + wrapper(bundled.exports, createRequire(file), bundled) + + await t.assert.rejects(bundled.exports.fetch('http://localhost:1'), (error) => { + const stackLines = error.stack.split('\n') + t.assert.ok(stackLines[0].includes('TypeError: fetch failed')) + t.assert.ok(stackLines.some(line => line.includes(__filename))) + return true + }) +})