From 969f163b2617bdf87b560b6cbd58702d6a3c4134 Mon Sep 17 00:00:00 2001 From: Matthias Osswald Date: Wed, 11 Feb 2026 10:43:53 +0100 Subject: [PATCH] feat: Support input source maps --- package-lock.json | 7 ++++--- .../lib/middleware.js | 21 +++++++++++++++++-- .../middleware-code-coverage/package.json | 1 + .../test/unit/lib/middleware.js | 5 ++++- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d53f65c..7811e7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1316,9 +1316,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -16552,6 +16552,7 @@ "version": "2.0.3", "license": "Apache-2.0", "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", "body-parser": "^2.2.2", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-instrument": "^6.0.3", diff --git a/packages/middleware-code-coverage/lib/middleware.js b/packages/middleware-code-coverage/lib/middleware.js index a40fc92..99c2b85 100644 --- a/packages/middleware-code-coverage/lib/middleware.js +++ b/packages/middleware-code-coverage/lib/middleware.js @@ -14,6 +14,10 @@ import path from "node:path"; import serveStatic from "serve-static"; import {promisify} from "node:util"; +import { + AnyMap, +} from "@jridgewell/trace-mapping"; + /** * Custom middleware to instrument JS files with Istanbul. * @@ -46,7 +50,10 @@ export default async function({log, middlewareUtil, options={}, resources}) { // Instrumenter instance const instrumenter = createInstrumenter(instrumenterConfig); - const instrument = promisify(instrumenter.instrument.bind(instrumenter)); + // Switch callback parameters to match promisify signature + const callbackStyleInstrumenter = (code, filename, inputSourceMap, callback) => + instrumenter.instrument(code, filename, callback, inputSourceMap); + const instrument = promisify(callbackStyleInstrumenter); const router = new Router(); @@ -134,8 +141,18 @@ export default async function({log, middlewareUtil, options={}, resources}) { return; } + // TODO: Add actual source map lookup (like in UI5 builder) + const inputSourceMapResource = await resources.all.byPath(`${pathname}.map`); + let inputSourceMap = inputSourceMapResource ? + JSON.parse(await inputSourceMapResource.getString()) : + undefined; + + if (inputSourceMap) { + inputSourceMap = new AnyMap(inputSourceMap); + } + const source = await matchedResource.getString(); - let instrumentedSource = await instrument(source, pathname); + let instrumentedSource = await instrument(source, pathname, inputSourceMap); log.verbose(`...${pathname} instrumented!`); diff --git a/packages/middleware-code-coverage/package.json b/packages/middleware-code-coverage/package.json index e84deac..0bd9e69 100644 --- a/packages/middleware-code-coverage/package.json +++ b/packages/middleware-code-coverage/package.json @@ -33,6 +33,7 @@ "node": "^20.11.0 || >=22.0.0" }, "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", "body-parser": "^2.2.2", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-instrument": "^6.0.3", diff --git a/packages/middleware-code-coverage/test/unit/lib/middleware.js b/packages/middleware-code-coverage/test/unit/lib/middleware.js index 4e01fea..c9bb737 100644 --- a/packages/middleware-code-coverage/test/unit/lib/middleware.js +++ b/packages/middleware-code-coverage/test/unit/lib/middleware.js @@ -32,7 +32,10 @@ const resources = { byGlob() { return []; }, - async byPath() { + async byPath(filePath) { + if (!filePath.endsWith(".js")) { + return null; + } return { async getString() { return sampleJS;