in packages/metro/src/Server/symbolicate.js [88:129]
function findOriginalPos(
frame: StackFrameInput,
module: ExplodedSourceMapModule,
): ?Position {
if (
module.map == null ||
frame.lineNumber == null ||
frame.column == null
) {
return null;
}
const generatedPosInModule = {
line1Based: frame.lineNumber - module.firstLine1Based + 1,
column0Based: frame.column,
};
const mappingIndex = greatestLowerBound(
module.map,
generatedPosInModule,
(target, candidate) => {
if (target.line1Based === candidate[0]) {
return target.column0Based - candidate[1];
}
return target.line1Based - candidate[0];
},
);
if (mappingIndex == null) {
return null;
}
const mapping = module.map[mappingIndex];
if (
mapping[0] !== generatedPosInModule.line1Based ||
mapping.length < 4 /* no source line/column info */
) {
return null;
}
return {
// $FlowFixMe: Length checks do not refine tuple unions.
line1Based: mapping[2],
// $FlowFixMe: Length checks do not refine tuple unions.
column0Based: mapping[3],
};
}