diff --git a/index.d.ts b/index.d.ts index 7d2ec98..380e404 100644 --- a/index.d.ts +++ b/index.d.ts @@ -123,5 +123,5 @@ export class Transformer { * # Errors * Returns an error if the transformation fails to find injection points. */ - transform(code: string | Buffer, moduleType: ModuleType, sourcemap?: string | null): TransformOutput; + transform(code: string | Buffer, moduleType: ModuleType, sourcemap?: string | object | null): TransformOutput; } diff --git a/lib/transformer.js b/lib/transformer.js index 663e3cb..76d6c4d 100644 --- a/lib/transformer.js +++ b/lib/transformer.js @@ -138,10 +138,17 @@ class Transformer { SourceMapGenerator ??= require('source-map').SourceMapGenerator const file = `${this.#moduleName}/${this.#filePath}` - const sourceMapInput = sourcemap ? new SourceMapConsumer(sourcemap) : { file } - const sourceMap = new SourceMapGenerator(sourceMapInput) - const code = generate(ast, { sourceMap }) - const map = sourceMap.toString() + let generator + if (sourcemap) { + const consumer = new SourceMapConsumer(sourcemap) + consumer.file = file + generator = SourceMapGenerator.fromSourceMap(consumer) + } else { + generator = new SourceMapGenerator({ file }) + } + + const code = generate(ast, { sourceMap: generator }) + const map = generator.toString() return { code, map } } diff --git a/tests/tests.test.mjs b/tests/tests.test.mjs index 225bcb8..e2eccdc 100644 --- a/tests/tests.test.mjs +++ b/tests/tests.test.mjs @@ -516,6 +516,23 @@ describe('source_map', () => { assert.equal(original.line, originalReturnLine) assert.equal(original.column, originalReturnColumn) }) + + test('produces a valid sourcemap when an inputSourceMap is provided', () => { + const code = 'export class Undici { async fetch (url) { return 42; } }' + const inputSourceMap = { version: 3, sources: ['input.js'], mappings: 'AAAA', names: [] } + + const instrumentor = create([ + { + channelName: 'Undici:fetch', + module: { name: TEST_MODULE_NAME, versionRange: '>=0.0.1', filePath: TEST_MODULE_PATH }, + functionQuery: { className: 'Undici', methodName: 'fetch', kind: 'Async' }, + }, + ]) + const transformer = instrumentor.getTransformer(TEST_MODULE_NAME, TEST_MODULE_VERSION, TEST_MODULE_PATH) + const { map } = transformer.transform(code, 'esm', inputSourceMap) + + assert.equal(JSON.parse(map).file, `${TEST_MODULE_NAME}/${TEST_MODULE_PATH}`) + }) }) describe('wrap_promise_non_promise', () => {