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