You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.4 KiB
58 lines
1.4 KiB
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;
|
|
|