-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathsourcemap.js
151 lines (119 loc) · 4.05 KB
/
sourcemap.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// This is a version,
// the original code can be found at
// https://github.com/jashkenas/coffeescript/tree/master/src/sourcemap.litcoffee
var VLQ_SHIFT = 5
var VLQ_CONTINUATION_BIT = 1 << VLQ_SHIFT
var VLQ_VALUE_MASK = VLQ_CONTINUATION_BIT - 1
var BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
function toVlq(value) {
var nextChunk
var vlq = ''
var signBit = value < 0 ? 1 : 0
var valueToEncode = (Math.abs(value) << 1) + signBit
while (valueToEncode || !vlq) {
nextChunk = valueToEncode & VLQ_VALUE_MASK
valueToEncode = valueToEncode >> VLQ_SHIFT
if (valueToEncode) {
nextChunk |= VLQ_CONTINUATION_BIT
}
vlq += toBase64(nextChunk)
}
return vlq
}
function toBase64(value) {
var b64 = BASE64_CHARS[value]
if (!b64) {
throw 'Can not encode ' + value + ' to base-64'
}
return b64
}
var newLineMap = function newLineMap(l) {
return {
line : l,
segments: [],
add: function(generatedColumn, sourceLine, sourceColumn) {
this.segments[generatedColumn] = {
line : this.line,
column : generatedColumn,
sourceLine : sourceLine,
sourceColumn: sourceColumn
}
return this.segments
}
}
}
exports.newSourceMap = function newSourceMap() {
return {
lines: [],
names: null,
add: function(sourceLine, sourceColumn, generatedLine, generatedColumn) {
var line = this.lines[generatedLine]
if (!line) {
line = this.lines[generatedLine] = newLineMap(generatedLine)
}
line.add(generatedColumn, sourceLine, sourceColumn)
},
generate: function(cfg) {
cfg = cfg || {}
var i
var j
var line
var sm
var segment
var segmentsLen
var currentLine = 0
var lastSourceLine = 0
var lastSourceColumn = 0
var lastColumn = 0
var linesLen = this.lines.length
var mapping = ''
var segmentSep = ''
for (i = 0; i < linesLen; i++) {
line = this.lines[i]
if (!line) continue
segmentsLen = line.segments.length
for (j = 0; j < segmentsLen; j++) {
segment = line.segments[j]
if (!segment) continue
while (currentLine < segment.line) {
segmentSep = ''
lastColumn = 0
mapping += ';'
currentLine++
}
mapping += segmentSep
mapping += toVlq(segment.column - lastColumn)
mapping += toVlq(0)
mapping += toVlq(segment.sourceLine - lastSourceLine)
mapping += toVlq(segment.sourceColumn - lastSourceColumn)
lastColumn = segment.column
lastSourceLine = segment.sourceLine
lastSourceColumn = segment.sourceColumn
segmentSep = ','
}
}
sm = {
version : 3,
file : '',
sourceRoot : '',
sources : [''],
sourcesContent: [null],
names : [],
mappings : mapping
}
if (cfg.file) {
sm.file = cfg.file
}
if (cfg.sourceRoot) {
sm.sourceRoot = cfg.sourceRoot
}
if (cfg.source) {
sm.sources = [cfg.source]
}
if (cfg.sourceContent) {
sm.sourcesContent = [cfg.sourceContent]
}
return JSON.stringify(sm)
}
}
}