1var SourceMapConsumer = require('source-map').SourceMapConsumer;
2
3function inputSourceMapTracker() {
4  var maps = {};
5
6  return {
7    all: all.bind(null, maps),
8    isTracking: isTracking.bind(null, maps),
9    originalPositionFor: originalPositionFor.bind(null, maps),
10    track: track.bind(null, maps)
11  };
12}
13
14function all(maps) {
15  return maps;
16}
17
18function isTracking(maps, source) {
19  return source in maps;
20}
21
22function originalPositionFor(maps, metadata, range, selectorFallbacks) {
23  var line = metadata[0];
24  var column = metadata[1];
25  var source = metadata[2];
26  var position = {
27    line: line,
28    column: column + range
29  };
30  var originalPosition;
31
32  while (!originalPosition && position.column > column) {
33    position.column--;
34    originalPosition = maps[source].originalPositionFor(position);
35  }
36
37  if (!originalPosition || originalPosition.column < 0) {
38    return metadata;
39  }
40
41  if (originalPosition.line === null && line > 1 && selectorFallbacks > 0) {
42    return originalPositionFor(maps, [line - 1, column, source], range, selectorFallbacks - 1);
43  }
44
45  return originalPosition.line !== null ?
46    toMetadata(originalPosition) :
47    metadata;
48}
49
50function toMetadata(asHash) {
51  return [asHash.line, asHash.column, asHash.source];
52}
53
54function track(maps, source, data) {
55  maps[source] = new SourceMapConsumer(data);
56}
57
58module.exports = inputSourceMapTracker;
59