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