diff --git a/src/javascript/sourceMaps/SourceMapAdmission.test.ts b/src/javascript/sourceMaps/SourceMapAdmission.test.ts new file mode 100644 index 0000000000..f7ade1288b --- /dev/null +++ b/src/javascript/sourceMaps/SourceMapAdmission.test.ts @@ -0,0 +1,51 @@ +import { expect, it } from "vitest"; + +import { inspectSourceMapEnvelope } from "../../domain/sourceMapEnvelope.js"; +import { inspectSourceMapValue } from "./SourceMapFormat.js"; +import { traceSourceMap } from "./TraceSourceMap.js"; + +const leaf = { + version: 3, + sources: ["original.ts"], + sourcesContent: ["hello"], + mappings: "AAAA", +}; +const indexed = (map: unknown) => ({ + version: 3, + sections: [{ offset: { line: 0, column: 0 }, map }], +}); + +it.each([2, null, undefined, "3"])( + "rejects nested indexed version %s consistently", + (version) => { + const map = indexed({ ...indexed(leaf), version }); + expect(inspectSourceMapEnvelope(map)).toMatchObject({ + status: "malformed", + invalid_sections: [{ section_path: [0] }], + }); + for (const profile of [undefined, "browser-collection"] as const) + expect(() => + inspectSourceMapValue(map, profile === undefined ? {} : { profile }), + ).toThrow(expect.objectContaining({ reason: "format" })); + expect(() => + traceSourceMap(JSON.stringify(map), "https://example.test/main.js.map", { + line: 1, + column: 0, + }), + ).toThrow(expect.objectContaining({ reason: "format" })); + }, +); + +it("admits numeric version 3 through the same consumers", () => { + const map = indexed(indexed(leaf)); + expect(inspectSourceMapEnvelope(map)).toMatchObject({ status: "included" }); + expect( + inspectSourceMapValue(map, { profile: "browser-collection" }).leaves, + ).toHaveLength(1); + expect( + traceSourceMap(JSON.stringify(map), "https://example.test/main.js.map", { + line: 1, + column: 0, + }).matches, + ).toMatchObject([{ section_path: [0, 0], reported_source: "original.ts" }]); +});