| 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; |