var SourceMapConsumer = require('source-map').SourceMapConsumer;
|
|
|
|
function inputSourceMapTracker() {
|
|
var maps = {};
|
|
|
|
return {
|
|
all: all.bind(null, maps),
|
|
isTracking: isTracking.bind(null, maps),
|
|
originalPositionFor: originalPositionFor.bind(null, maps),
|
|
track: track.bind(null, maps)
|
|
};
|
|
}
|
|
|
|
function all(maps) {
|
|
return maps;
|
|
}
|
|
|
|
function isTracking(maps, source) {
|
|
return source in maps;
|
|
}
|
|
|
|
function originalPositionFor(maps, metadata, range, selectorFallbacks) {
|
|
var line = metadata[0];
|
|
var column = metadata[1];
|
|
var source = metadata[2];
|
|
var position = {
|
|
line: line,
|
|
column: column + range
|
|
};
|
|
var originalPosition;
|
|
|
|
while (!originalPosition && position.column > column) {
|
|
position.column--;
|
|
originalPosition = maps[source].originalPositionFor(position);
|
|
}
|
|
|
|
if (!originalPosition || originalPosition.column < 0) {
|
|
return metadata;
|
|
}
|
|
|
|
if (originalPosition.line === null && line > 1 && selectorFallbacks > 0) {
|
|
return originalPositionFor(maps, [line - 1, column, source], range, selectorFallbacks - 1);
|
|
}
|
|
|
|
return originalPosition.line !== null ?
|
|
toMetadata(originalPosition) :
|
|
metadata;
|
|
}
|
|
|
|
function toMetadata(asHash) {
|
|
return [asHash.line, asHash.column, asHash.source];
|
|
}
|
|
|
|
function track(maps, source, data) {
|
|
maps[source] = new SourceMapConsumer(data);
|
|
}
|
|
|
|
module.exports = inputSourceMapTracker;
|