From 0cb0d43e79653edfda806b95c91eca15543dc29a Mon Sep 17 00:00:00 2001 From: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Date: Tue, 3 Nov 2026 10:27:47 -0800 Subject: [PATCH] fix(audit): keep companion coverage unresolved for a generic .map link --- src/artifacts/ReleaseExposureReader.test.ts | 25 +++++++++++++++++++++ src/artifacts/ReleaseExposureReader.ts | 3 +++ 2 files changed, 28 insertions(+) diff --git a/src/artifacts/ReleaseExposureReader.test.ts b/src/artifacts/ReleaseExposureReader.test.ts index 99a25c0cd8..58e88a451c 100644 --- a/src/artifacts/ReleaseExposureReader.test.ts +++ b/src/artifacts/ReleaseExposureReader.test.ts @@ -1057,6 +1057,31 @@ describe("ReleaseExposureReader mixed maps and sibling paths", () => { ); }); +describe("ReleaseExposureReader generic map links", () => { + it.skipIf(process.platform === "win32")( + "keeps debug companion coverage unresolved for a generic .map link", + async () => { + const root = await createTestTempDirectory("rea-release-map-link-"); + await writeFile(join(root, "payload"), "not a map\n"); + await symlink("payload", join(root, "symbols.map")); + const scanned = await inspect(root); + expect(scanned.debug_companions.skipped).toBe(1); + expect(scanned.source_maps.skipped).toBe(1); + }, + ); + + it.skipIf(process.platform === "win32")( + "leaves debug companions alone for a JavaScript map link", + async () => { + const root = await createTestTempDirectory("rea-release-map-link-"); + await writeFile(join(root, "payload"), "{}"); + await symlink("payload", join(root, "app.js.map")); + const scanned = await inspect(root); + expect(scanned.debug_companions.skipped).toBe(0); + }, + ); +}); + describe("ReleaseExposureReader acquisition and sibling review regressions", () => { it.each(["external section", "decoder limit", "malformed JSON"])( "keeps a sibling map with an unsupported %s unresolved", diff --git a/src/artifacts/ReleaseExposureReader.ts b/src/artifacts/ReleaseExposureReader.ts index 4218f99619..82403ecbc4 100644 --- a/src/artifacts/ReleaseExposureReader.ts +++ b/src/artifacts/ReleaseExposureReader.ts @@ -2685,6 +2685,9 @@ const noteUnfollowedMapLink = ( state.examinedMaps.add(key); state.examinedScripts.add(key); state.skippedMaps += 1; + // A generic `.map` link may name a linker map, as an unread map may. + if (isSourceMap(logical, "file") && !isJavaScriptSourceMapName(logical)) + state.skippedCompanions += 1; }; const noteUnlistedEntry = (state: ScanState, entry: ArtifactEntry): void => {