Skip to content

Commit a2eb55a

Browse files
alan-agius4RafaelGSS
authored andcommitted
lib: don't match sourceMappingURL in strings
Prior to this change `sourceMappingURL` in string where being matched by the RegExp which caused sourcemaps not be loaded when using the `--enable-source-maps` flag. This commit changes the RegExp to match the last occurrence. Fixes: #44654 PR-URL: #44658 Reviewed-By: Chengzhong Wu <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]>
1 parent 945aa74 commit a2eb55a

5 files changed

+43
-11
lines changed

lib/internal/source_map/source_map_cache.js

+22-11
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ const esmSourceMapCache = new SafeMap();
4141
// The generated sources is not mutable, so we can use a Map without memory concerns:
4242
const generatedSourceMapCache = new SafeMap();
4343
const kLeadingProtocol = /^\w+:\/\//;
44-
const kSourceMappingURLMagicComment = /\/[*/]#\s+sourceMappingURL=(?<sourceMappingURL>[^\s]+)/;
45-
const kSourceURLMagicComment = /\/[*/]#\s+sourceURL=(?<sourceURL>[^\s]+)/;
44+
const kSourceMappingURLMagicComment = /\/[*/]#\s+sourceMappingURL=(?<sourceMappingURL>[^\s]+)/g;
45+
const kSourceURLMagicComment = /\/[*/]#\s+sourceURL=(?<sourceURL>[^\s]+)/g;
4646

4747
const { fileURLToPath, pathToFileURL, URL } = require('internal/url');
4848
let SourceMap;
@@ -80,11 +80,14 @@ function setSourceMapsEnabled(val) {
8080
}
8181

8282
function extractSourceURLMagicComment(content) {
83-
const matchSourceURL = RegExpPrototypeExec(
84-
kSourceURLMagicComment,
85-
content
86-
);
87-
if (matchSourceURL === null) {
83+
let match;
84+
let matchSourceURL;
85+
// A while loop is used here to get the last occurrence of sourceURL.
86+
// This is needed so that we don't match sourceURL in string literals.
87+
while ((match = RegExpPrototypeExec(kSourceURLMagicComment, content))) {
88+
matchSourceURL = match;
89+
}
90+
if (matchSourceURL == null) {
8891
return null;
8992
}
9093
let sourceURL = matchSourceURL.groups.sourceURL;
@@ -104,13 +107,21 @@ function maybeCacheSourceMap(filename, content, cjsModuleInstance, isGeneratedSo
104107
debug(err);
105108
return;
106109
}
107-
const match = RegExpPrototypeExec(kSourceMappingURLMagicComment, content);
110+
111+
let match;
112+
let lastMatch;
113+
// A while loop is used here to get the last occurrence of sourceMappingURL.
114+
// This is needed so that we don't match sourceMappingURL in string literals.
115+
while ((match = RegExpPrototypeExec(kSourceMappingURLMagicComment, content))) {
116+
lastMatch = match;
117+
}
118+
108119
if (sourceURL === undefined) {
109120
sourceURL = extractSourceURLMagicComment(content);
110121
}
111-
if (match) {
112-
const data = dataFromUrl(filename, match.groups.sourceMappingURL);
113-
const url = data ? null : match.groups.sourceMappingURL;
122+
if (lastMatch) {
123+
const data = dataFromUrl(filename, lastMatch.groups.sourceMappingURL);
124+
const url = data ? null : lastMatch.groups.sourceMappingURL;
114125
if (cjsModuleInstance) {
115126
cjsSourceMapCache.set(cjsModuleInstance, {
116127
filename,

test/fixtures/source-map/typescript-sourcemapping_url_string.js

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

test/fixtures/source-map/typescript-sourcemapping_url_string.js.map

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Flags: --enable-source-maps
2+
3+
'use strict';
4+
require('../common');
5+
Error.stackTraceLimit = 2;
6+
7+
try {
8+
require('../fixtures/source-map/typescript-sourcemapping_url_string');
9+
} catch (err) {
10+
setTimeout(() => {
11+
console.info(err);
12+
}, 10);
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Error: an exception.
2+
at *typescript-sourcemapping_url_string.ts:3:7*
3+
at Module._compile (node:internal/modules/cjs/loader:*)

0 commit comments

Comments
 (0)