-
Notifications
You must be signed in to change notification settings - Fork 108
/
Mappings.js
117 lines (98 loc) · 2.44 KB
/
Mappings.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import { encode } from 'vlq';
export default function Mappings ( hires ) {
const offsets = {
generatedCodeColumn: 0,
sourceIndex: 0,
sourceCodeLine: 0,
sourceCodeColumn: 0,
sourceCodeName: 0
};
let generatedCodeLine = 0;
let generatedCodeColumn = 0;
this.raw = [];
let rawSegments = this.raw[ generatedCodeLine ] = [];
let pending = null;
this.addEdit = ( sourceIndex, content, original, loc, nameIndex ) => {
if ( content.length ) {
rawSegments.push([
generatedCodeColumn,
sourceIndex,
loc.line,
loc.column,
nameIndex,
]);
} else if ( pending ) {
rawSegments.push( pending );
}
this.advance( content );
pending = null;
};
this.addUneditedChunk = ( sourceIndex, chunk, original, loc, sourcemapLocations ) => {
let originalCharIndex = chunk.start;
let first = true;
while ( originalCharIndex < chunk.end ) {
if ( hires || first || sourcemapLocations[ originalCharIndex ] ) {
rawSegments.push([
generatedCodeColumn,
sourceIndex,
loc.line,
loc.column,
-1
]);
}
if ( original[ originalCharIndex ] === '\n' ) {
loc.line += 1;
loc.column = 0;
generatedCodeLine += 1;
this.raw[ generatedCodeLine ] = rawSegments = [];
generatedCodeColumn = 0;
} else {
loc.column += 1;
generatedCodeColumn += 1;
}
originalCharIndex += 1;
first = false;
}
pending = [
generatedCodeColumn,
sourceIndex,
loc.line,
loc.column,
-1,
];
};
this.advance = str => {
if ( !str ) return;
const lines = str.split( '\n' );
const lastLine = lines.pop();
if ( lines.length ) {
generatedCodeLine += lines.length;
this.raw[ generatedCodeLine ] = rawSegments = [];
generatedCodeColumn = lastLine.length;
} else {
generatedCodeColumn += lastLine.length;
}
};
this.encode = () => {
return this.raw.map( segments => {
let generatedCodeColumn = 0;
return segments.map( segment => {
const arr = [
segment[0] - generatedCodeColumn,
segment[1] - offsets.sourceIndex,
segment[2] - offsets.sourceCodeLine,
segment[3] - offsets.sourceCodeColumn
];
generatedCodeColumn = segment[0];
offsets.sourceIndex = segment[1];
offsets.sourceCodeLine = segment[2];
offsets.sourceCodeColumn = segment[3];
if ( ~segment[4] ) {
arr.push( segment[4] - offsets.sourceCodeName );
offsets.sourceCodeName = segment[4];
}
return encode( arr );
}).join( ',' );
}).join( ';' );
};
}