Skip to content

Commit ee6412a

Browse files
legendecasruyadorno
authored andcommitted
src,lib: print prinstine source when source map source not found
Print unmapped source lines when the source map source is not found. Error stacks should be correctly mapped even when the source is absent. PR-URL: #44052 Refs: #44019 Reviewed-By: Ben Coe <bencoe@gmail.com>
1 parent b252f38 commit ee6412a

File tree

7 files changed

+53
-7
lines changed

7 files changed

+53
-7
lines changed

lib/internal/source_map/prepare_stack_trace.js

+7-6
Original file line numberDiff line numberDiff line change
@@ -139,17 +139,21 @@ function getErrorSource(
139139
originalLine,
140140
originalColumn
141141
) {
142-
let exceptionLine = '';
143142
const originalSourcePathNoScheme =
144143
StringPrototypeStartsWith(originalSourcePath, 'file://') ?
145144
fileURLToPath(originalSourcePath) : originalSourcePath;
146145
const source = getOriginalSource(
147146
sourceMap.payload,
148147
originalSourcePath
149148
);
149+
if (typeof source !== 'string') {
150+
return;
151+
}
150152
const lines = RegExpPrototypeSymbolSplit(/\r?\n/, source, originalLine + 1);
151153
const line = lines[originalLine];
152-
if (!line) return exceptionLine;
154+
if (!line) {
155+
return;
156+
}
153157

154158
// Display ^ in appropriate position, regardless of whether tabs or
155159
// spaces are used:
@@ -161,7 +165,7 @@ function getErrorSource(
161165
}
162166
prefix = StringPrototypeSlice(prefix, 0, -1); // The last character is '^'.
163167

164-
exceptionLine =
168+
const exceptionLine =
165169
`${originalSourcePathNoScheme}:${originalLine + 1}\n${line}\n${prefix}^\n\n`;
166170
return exceptionLine;
167171
}
@@ -184,10 +188,7 @@ function getOriginalSource(payload, originalSourcePath) {
184188
source = readFileSync(originalSourcePathNoScheme, 'utf8');
185189
} catch (err) {
186190
debug(err);
187-
source = '';
188191
}
189-
} else {
190-
source = '';
191192
}
192193
return source;
193194
}

src/node_errors.cc

+3-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,9 @@ static std::string GetErrorSource(Isolate* isolate,
105105
if (has_source_map_url && env != nullptr && env->source_maps_enabled()) {
106106
std::string source = GetSourceMapErrorSource(
107107
isolate, context, message, added_exception_line);
108-
return *added_exception_line ? source : sourceline;
108+
if (*added_exception_line) {
109+
return source;
110+
}
109111
}
110112

111113
// Because of how node modules work, all scripts are wrapped with a

test/fixtures/source-map/no-source.js

+9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fixtures/source-map/no-source.js.map

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fixtures/source-map/no-source.ts

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
function Throw() {
2+
throw new Error('foo');
3+
}
4+
5+
Throw();
6+
7+
// To recreate:
8+
//
9+
// npx tsc --outDir test/fixtures/source-map --sourceMap test/fixtures/source-map/no-source.ts
10+
// rename the "source.[0]" to "file-not-exists.ts"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// Flags: --enable-source-maps
2+
3+
'use strict';
4+
require('../common');
5+
6+
require('../fixtures/source-map/no-source.js');
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
*no-source.js:2
2+
throw new Error('foo');
3+
^
4+
5+
Error: foo
6+
at Throw (*file-not-exists.ts:2:9)
7+
at Object.<anonymous> (*file-not-exists.ts:5:1)
8+
at Module._compile (node:internal/modules/cjs/loader:*)
9+
at Module._extensions..js (node:internal/modules/cjs/loader:*)
10+
at Module.load (node:internal/modules/cjs/loader:*)
11+
at Module._load (node:internal/modules/cjs/loader:*)
12+
at Module.require (node:internal/modules/cjs/loader:*)
13+
at require (node:internal/modules/cjs/helpers:*)
14+
at Object.<anonymous> (*source_map_no_source_file.js:6:1)
15+
at Module._compile (node:internal/modules/cjs/loader:*)
16+
17+
Node.js *

0 commit comments

Comments
 (0)