From 2bd7de6f8ca62fc1d48334cfa7fdced461b7b153 Mon Sep 17 00:00:00 2001 From: Rudy Celekli Date: Fri, 9 Oct 2026 12:09:42 -0400 Subject: [PATCH] fix(javascript): retain distinct module provenance path components --- ...vascriptSemanticAnalysis.origin_paths.test.ts | 16 ++++++++++++++++ .../javascript/javascriptSemanticProvenance.ts | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 src/domain/javascript/javascriptSemanticAnalysis.origin_paths.test.ts diff --git a/src/domain/javascript/javascriptSemanticAnalysis.origin_paths.test.ts b/src/domain/javascript/javascriptSemanticAnalysis.origin_paths.test.ts new file mode 100644 index 000000000..c3e12d327 --- /dev/null +++ b/src/domain/javascript/javascriptSemanticAnalysis.origin_paths.test.ts @@ -0,0 +1,16 @@ +import { expect, it } from "vitest"; + +import { analyzeJavaScriptSemantics } from "./javascriptSemanticAnalysis.js"; +import { topLevelBinding } from "./javascriptSemanticAnalysis.fixture.js"; + +it("retains distinct module origins when a property contains the old separator", () => { + const result = analyzeJavaScriptSemantics( + 'import * as ns from "./fixture.js"; const selected = choice ? ns["a\\0b"] : ns.a.b;', + ); + const provenance = topLevelBinding(result, "selected").provenance; + expect(provenance.status).toBe("ambiguous"); + expect(provenance.origins.map(({ importedPath }) => importedPath)).toEqual( + expect.arrayContaining([["a\0b"], ["a", "b"]]), + ); + expect(provenance.origins).toHaveLength(2); +}); diff --git a/src/domain/javascript/javascriptSemanticProvenance.ts b/src/domain/javascript/javascriptSemanticProvenance.ts index 218c465b5..ab56a1488 100644 --- a/src/domain/javascript/javascriptSemanticProvenance.ts +++ b/src/domain/javascript/javascriptSemanticProvenance.ts @@ -48,7 +48,7 @@ export const uniqueSemanticOrigins = ( ); const semanticOriginKey = (origin: JavaScriptModuleOrigin): string => - `${origin.specifier}\0${origin.importedPath.join("\0")}`; + JSON.stringify([origin.specifier, origin.importedPath]); /** Canonically distinguish primitive values across type boundaries. */ export const semanticPrimitiveKey = (