@angular/build: source-map comment scanner corrupts valid JS containing a regex literal
Maintainer antworten meist innerhalb von 1 Tag
@alan-agius4 arbeitet bereits daran.
Seit 29.10.2026.
Bewertung
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Anfängerfreundlichkeit
- 76/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- angular, typescript
- Bereich
- build-system, devtools
Rechercherichtung
The issue identifies removeSourceMappingURL in @angular/build/src/utils/source-map.js and provides a standalone reproduction. Start by running the reproduction against the affected package version, then inspect the scanner and the related fix in PR #33545. Done means source-map removal preserves the given valid JavaScript and the reproduction assertion passes.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Command
serve
Is this a regression?
- Yes, this behavior used to work in the previous version
The previous version in which this bug was not present was
@angular/build 22.0.9 passes the isolated source-map removal test. @angular/cli remains at 22.2.4; Angular framework packages remain at 22.2.3.
Description
With @angular/build 22.2.4, ng serve fails when optimization and script
source maps are enabled. Vite reports invalid JavaScript during import
analysis. However, ng build succeeds, and the built application worked
when served separately using a local static server.
The failure was traced to removeSourceMappingURL in @angular/build.
The development-server memory plugin calls this function before handing
generated JavaScript to Vite when a source map is present.
The scanner appears to interpret a double quote inside a valid
regular-expression literal as the beginning of a string. It then loses
track of the actual string boundaries and removes a sourceMappingURL-like
sequence that is string content, not a JavaScript comment.
This can be reproduced directly using the published build package,
without application code, authentication libraries, or Vite itself.
Expected:
Source-map comment removal preserves valid JavaScript, including
regular-expression literals and strings containing sourceMappingURL text.
Actual:
Valid JavaScript is truncated into invalid JavaScript. Vite subsequently
reports the parsing error.
The desired behavior is to keep both optimization and script source maps
enabled.
Minimal Reproduction
With @angular/[email protected] installed, save the following as repro.cjs
and run:
node repro.cjs
This intentionally calls the internal utility to isolate the defect.
It is a standalone scanner reproduction, not a complete Angular app.
const assert = require('node:assert/strict');
const path = require('node:path');
const vm = require('node:vm');
const packageRoot = path.dirname(
require.resolve('@angular/build/package.json')
);
const { removeSourceMappingURL } = require(
path.join(packageRoot, 'src', 'utils', 'source-map.js')
);
const input =
'const pattern = /"/; const text = "//# sourceMappingURL=not-a-comment";';
new vm.Script(input); // The input is valid JavaScript.
const output = removeSourceMappingURL(input);
console.log(output);
assert.equal(
output,
input,
'Input without an actual source-map comment should remain unchanged'
);
Expected:
The assertion passes and the input is preserved unchanged.
Actual:
The assertion fails. The output is:
const pattern = /"/; const text = "
The output is invalid JavaScript. The sourceMappingURL text was inside
a quoted string, not an actual comment.
Exception or Error
[vite] Internal server error: Failed to parse source for import analysis
because the content contains invalid JS syntax. If you are using JSX,
make sure to name the file with the .jsx or .tsx extension.
Plugin: vite:import-analysis
The standalone reproduction fails its equality assertion.
Parsing the truncated output also produces:
SyntaxError: Invalid or unexpected token
Your Environment
Original failing environment:
@angular/build: 22.2.4
@angular/cli: 22.2.4
@angular/core: 22.2.3
@angular/compiler: 22.2.3
@angular/compiler-cli: 22.2.3
TypeScript: 6.0.3
Vite: 8.3.0
Node.js: 24.20.0
OS: Windows
Current version-pin configuration:
@angular/build: 22.0.9
@angular/cli: 22.2.4 — unchanged
Angular core/compiler/compiler-cli: 22.2.3 — unchanged
Vite resolved by @angular/build: 7.3.6
Anything else relevant?
Temporary workaround applied
Pinned @angular/build to exactly 22.0.9 instead of 22.2.4:
"@angular/build": "22.0.9"
This is the workaround currently used, not a fix to the scanner.
@angular/cliremains at22.2.4— it was not downgraded.- Angular core/compiler/compiler-cli remain at
22.2.3. - Optimization and script source maps remain enabled.
The pinned build package uses Vite 7.3.6 instead of 8.3.0.
However, the minimal reproduction demonstrates the corruption directly
in @angular/build's source-map scanner without invoking Vite.
Related issue and fix
- Issue #33544 — Source-map comment removal corrupts JavaScript inside template literals
- PR #33545 — Prevent stripping nested sourceMappingURL comments
The earlier issue concerned source-map text inside template literals.
Its fix introduced the replacement scanner. This report concerns
regular-expression literal handling in that scanner.
- Vorherrschende Sprache
- TypeScript
- Sterne
- 27k
- Forks
- 11.8k
- Ø Merge
- 1 T. 52 Min.
- Gemergte PRs (30 T.)
- 268
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus angular/angular-cli
-
Can't use an array of hostnames in --allowedHosts cli parameter in @angular/build:dev-serverEvtl. vergeben @alan-agius4 hat das vor 3 Tagen übernommen. Offenarea: @angular/build gemini-triaged
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
angular/angular-cli#33955 ·
Maintainer antworten meist innerhalb von 1 Tag
-
pnpm add and pnpm install fail after ng new on pnpm 11+ (ERR_PNPM_IGNORED_BUILDS)Evtl. vergeben Ein verknüpfter Pull Request ist offen oder bereits gemergt. Offenarea: @angular/cli
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 48/100
angular/angular-cli#34622 ·
Maintainer antworten meist innerhalb von 1 Tag
-
build: ERR_REQUIRE_CYCLE_MODULE when loading oxc-parser in StackBlitz / WebContainerEvtl. vergeben @JeanMeche hat das heute übernommen. Offenarea: @angular/build
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 55/100
angular/angular-cli#34524 · 5 Kommentare · 2 Reaktionen ·
Maintainer antworten meist innerhalb von 1 Tag
-
Tailwind CSS v4 classes in new or moved files are not picked up by ng serve until another rebuildEvtl. wieder frei Ein Pull Request dazu wurde ohne Merge geschlossen. Offenarea: @angular/build
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
angular/angular-cli#34446 ·
Maintainer antworten meist innerhalb von 1 Tag
-
area: @angular/build
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 58/100
angular/angular-cli#34396 ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in angular/angular-cli
Ähnliche Issues
-
Remove unused dependenciesEvtl. vergeben @alastair-smith hat das heute übernommen. Offenchore other
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
alastair-smith/card-games#384 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 62/100
code-yeongyu/senpi#5571 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
nexu-io/open-design#9262 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
friction
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
kentcdodds/kody#4753 ·
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 62/100
lingdojo/kana-dojo#33508 · 1 Kommentar · 5 Reaktionen ·
Maintainer antworten meist innerhalb von 1 Tag