59 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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;
 |