in packages/metro-source-map/src/composeSourceMaps.js [23:83]
function composeSourceMaps(
maps: $ReadOnlyArray<MixedSourceMap>,
): MixedSourceMap {
// NOTE: require() here to break dependency cycle
const SourceMetadataMapConsumer = require('metro-symbolicate/src/SourceMetadataMapConsumer');
if (maps.length < 1) {
throw new Error('composeSourceMaps: Expected at least one map');
}
const firstMap = maps[0];
const consumers = maps
.map(function (map) {
return new Consumer(map);
})
.reverse();
const generator = new SourceMapGenerator({
file: consumers[0].file,
});
consumers[0].eachMapping(mapping => {
const original = findOriginalPosition(
consumers,
mapping.generatedLine,
mapping.generatedColumn,
);
generator.addMapping({
generated: {
line: mapping.generatedLine,
column: mapping.generatedColumn,
},
original:
original.line != null
? {
line: original.line,
column: original.column,
}
: null,
source: original.source,
name: original.name,
});
});
const composedMap = generator.toJSON();
composedMap.sourcesContent = composedMap.sources.map(source =>
consumers[consumers.length - 1].sourceContentFor(source, true),
);
if (composedMap.sourcesContent.every(content => content == null)) {
delete composedMap.sourcesContent;
}
const metadataConsumer = new SourceMetadataMapConsumer(firstMap);
composedMap.x_facebook_sources = metadataConsumer.toArray(
composedMap.sources,
);
const function_offsets = maps[maps.length - 1].x_hermes_function_offsets;
if (function_offsets) {
composedMap.x_hermes_function_offsets = function_offsets;
}
return composedMap;
}