diff --git a/packages/metro-source-map/src/__tests__/composeSourceMaps-test.js b/packages/metro-source-map/src/__tests__/composeSourceMaps-test.js index 7a0dab92f4..58c72f10e0 100644 --- a/packages/metro-source-map/src/__tests__/composeSourceMaps-test.js +++ b/packages/metro-source-map/src/__tests__/composeSourceMaps-test.js @@ -294,6 +294,23 @@ describe('composeSourceMaps', () => { expect(mergedMap).toEqual(fixtures['merged_1_2.json']); }); + test('keeps each mapping at a generated column mapped more than once', () => { + const mergedMap = composeSourceMaps([ + {version: 3, names: [], sources: ['a.js'], mappings: 'AAAA,KAAK'}, + {version: 3, names: [], sources: ['b.js'], mappings: 'AAAA,AAAK'}, + ]); + expect( + [...new Consumer(mergedMap).generatedMappings()].map(mapping => [ + mapping.generatedColumn, + mapping.originalLine, + mapping.originalColumn, + ]), + ).toEqual([ + [0, 1, 0], + [0, 1, 5], + ]); + }); + test('merges two maps preserving unmapped regions in the first one', () => { const mergedMap = composeSourceMaps([ fixtures['ignore_1.json'], diff --git a/packages/metro-source-map/src/composeSourceMaps.js b/packages/metro-source-map/src/composeSourceMaps.js index 812d52bcce..c512b8d844 100644 --- a/packages/metro-source-map/src/composeSourceMaps.js +++ b/packages/metro-source-map/src/composeSourceMaps.js @@ -45,12 +45,23 @@ export default function composeSourceMaps( file: consumers[0].file, }); + const earlierConsumers = consumers.slice(1); consumers[0].eachMapping(mapping => { - const original = findOriginalPosition( - consumers, - mapping.generatedLine, - mapping.generatedColumn, - ); + const original = + mapping.originalLine == null || mapping.originalColumn == null + ? {line: null, column: null, source: null, name: null} + : earlierConsumers.length === 0 + ? { + line: mapping.originalLine, + column: mapping.originalColumn, + source: mapping.source, + name: mapping.name, + } + : findOriginalPosition( + earlierConsumers, + mapping.originalLine, + mapping.originalColumn, + ); generator.addMapping({ generated: { line: mapping.generatedLine,