1 | var SourceMapConsumer = require('source-map').SourceMapConsumer;
|
---|
2 |
|
---|
3 | function 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 |
|
---|
14 | function all(maps) {
|
---|
15 | return maps;
|
---|
16 | }
|
---|
17 |
|
---|
18 | function isTracking(maps, source) {
|
---|
19 | return source in maps;
|
---|
20 | }
|
---|
21 |
|
---|
22 | function 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 |
|
---|
50 | function toMetadata(asHash) {
|
---|
51 | return [asHash.line, asHash.column, asHash.source];
|
---|
52 | }
|
---|
53 |
|
---|
54 | function track(maps, source, data) {
|
---|
55 | maps[source] = new SourceMapConsumer(data);
|
---|
56 | }
|
---|
57 |
|
---|
58 | module.exports = inputSourceMapTracker;
|
---|