1
|
// Note: source-map-resolve.js is generated from source-map-resolve-node.js and
|
2
|
// source-map-resolve-template.js. Only edit the two latter files, _not_
|
3
|
// source-map-resolve.js!
|
4
|
|
5
|
void (function(root, factory) {
|
6
|
if (typeof define === "function" && define.amd) {
|
7
|
define(["source-map-url", "resolve-url"], factory)
|
8
|
} else if (typeof exports === "object") {
|
9
|
var sourceMappingURL = require("source-map-url")
|
10
|
var resolveUrl = require("resolve-url")
|
11
|
module.exports = factory(sourceMappingURL, resolveUrl)
|
12
|
} else {
|
13
|
root.sourceMapResolve = factory(root.sourceMappingURL, root.resolveUrl)
|
14
|
}
|
15
|
}(this, function(sourceMappingURL, resolveUrl) {
|
16
|
|
17
|
function callbackAsync(callback, error, result) {
|
18
|
setImmediate(function() { callback(error, result) })
|
19
|
}
|
20
|
|
21
|
function parseMapToJSON(string, data) {
|
22
|
try {
|
23
|
return JSON.parse(string.replace(/^\)\]\}'/, ""))
|
24
|
} catch (error) {
|
25
|
error.sourceMapData = data
|
26
|
throw error
|
27
|
}
|
28
|
}
|
29
|
|
30
|
function readSync(read, url, data) {
|
31
|
var readUrl = url
|
32
|
try {
|
33
|
return String(read(readUrl))
|
34
|
} catch (error) {
|
35
|
error.sourceMapData = data
|
36
|
throw error
|
37
|
}
|
38
|
}
|
39
|
|
40
|
|
41
|
|
42
|
function resolveSourceMap(code, codeUrl, read, callback) {
|
43
|
var mapData
|
44
|
try {
|
45
|
mapData = resolveSourceMapHelper(code, codeUrl)
|
46
|
} catch (error) {
|
47
|
return callbackAsync(callback, error)
|
48
|
}
|
49
|
if (!mapData || mapData.map) {
|
50
|
return callbackAsync(callback, null, mapData)
|
51
|
}
|
52
|
var readUrl = mapData.url
|
53
|
read(readUrl, function(error, result) {
|
54
|
if (error) {
|
55
|
error.sourceMapData = mapData
|
56
|
return callback(error)
|
57
|
}
|
58
|
mapData.map = String(result)
|
59
|
try {
|
60
|
mapData.map = parseMapToJSON(mapData.map, mapData)
|
61
|
} catch (error) {
|
62
|
return callback(error)
|
63
|
}
|
64
|
callback(null, mapData)
|
65
|
})
|
66
|
}
|
67
|
|
68
|
function resolveSourceMapSync(code, codeUrl, read) {
|
69
|
var mapData = resolveSourceMapHelper(code, codeUrl)
|
70
|
if (!mapData || mapData.map) {
|
71
|
return mapData
|
72
|
}
|
73
|
mapData.map = readSync(read, mapData.url, mapData)
|
74
|
mapData.map = parseMapToJSON(mapData.map, mapData)
|
75
|
return mapData
|
76
|
}
|
77
|
|
78
|
var dataUriRegex = /^data:([^,;]*)(;[^,;]*)*(?:,(.*))?$/
|
79
|
|
80
|
/**
|
81
|
* The media type for JSON text is application/json.
|
82
|
*
|
83
|
* {@link https://tools.ietf.org/html/rfc8259#section-11 | IANA Considerations }
|
84
|
*
|
85
|
* `text/json` is non-standard media type
|
86
|
*/
|
87
|
var jsonMimeTypeRegex = /^(?:application|text)\/json$/
|
88
|
|
89
|
/**
|
90
|
* JSON text exchanged between systems that are not part of a closed ecosystem
|
91
|
* MUST be encoded using UTF-8.
|
92
|
*
|
93
|
* {@link https://tools.ietf.org/html/rfc8259#section-8.1 | Character Encoding}
|
94
|
*/
|
95
|
var jsonCharacterEncoding = "utf-8"
|
96
|
|
97
|
function base64ToBuf(b64) {
|
98
|
var binStr = atob(b64)
|
99
|
var len = binStr.length
|
100
|
var arr = new Uint8Array(len)
|
101
|
for (var i = 0; i < len; i++) {
|
102
|
arr[i] = binStr.charCodeAt(i)
|
103
|
}
|
104
|
return arr
|
105
|
}
|
106
|
|
107
|
function decodeBase64String(b64) {
|
108
|
if (typeof TextDecoder === "undefined" || typeof Uint8Array === "undefined") {
|
109
|
return atob(b64)
|
110
|
}
|
111
|
var buf = base64ToBuf(b64);
|
112
|
// Note: `decoder.decode` method will throw a `DOMException` with the
|
113
|
// `"EncodingError"` value when an coding error is found.
|
114
|
var decoder = new TextDecoder(jsonCharacterEncoding, {fatal: true})
|
115
|
return decoder.decode(buf);
|
116
|
}
|
117
|
|
118
|
function resolveSourceMapHelper(code, codeUrl) {
|
119
|
var url = sourceMappingURL.getFrom(code)
|
120
|
if (!url) {
|
121
|
return null
|
122
|
}
|
123
|
|
124
|
var dataUri = url.match(dataUriRegex)
|
125
|
if (dataUri) {
|
126
|
var mimeType = dataUri[1] || "text/plain"
|
127
|
var lastParameter = dataUri[2] || ""
|
128
|
var encoded = dataUri[3] || ""
|
129
|
var data = {
|
130
|
sourceMappingURL: url,
|
131
|
url: null,
|
132
|
sourcesRelativeTo: codeUrl,
|
133
|
map: encoded
|
134
|
}
|
135
|
if (!jsonMimeTypeRegex.test(mimeType)) {
|
136
|
var error = new Error("Unuseful data uri mime type: " + mimeType)
|
137
|
error.sourceMapData = data
|
138
|
throw error
|
139
|
}
|
140
|
try {
|
141
|
data.map = parseMapToJSON(
|
142
|
lastParameter === ";base64" ? decodeBase64String(encoded) : decodeURIComponent(encoded),
|
143
|
data
|
144
|
)
|
145
|
} catch (error) {
|
146
|
error.sourceMapData = data
|
147
|
throw error
|
148
|
}
|
149
|
return data
|
150
|
}
|
151
|
|
152
|
var mapUrl = resolveUrl(codeUrl, url)
|
153
|
return {
|
154
|
sourceMappingURL: url,
|
155
|
url: mapUrl,
|
156
|
sourcesRelativeTo: mapUrl,
|
157
|
map: null
|
158
|
}
|
159
|
}
|
160
|
|
161
|
|
162
|
|
163
|
function resolveSources(map, mapUrl, read, options, callback) {
|
164
|
if (typeof options === "function") {
|
165
|
callback = options
|
166
|
options = {}
|
167
|
}
|
168
|
var pending = map.sources ? map.sources.length : 0
|
169
|
var result = {
|
170
|
sourcesResolved: [],
|
171
|
sourcesContent: []
|
172
|
}
|
173
|
|
174
|
if (pending === 0) {
|
175
|
callbackAsync(callback, null, result)
|
176
|
return
|
177
|
}
|
178
|
|
179
|
var done = function() {
|
180
|
pending--
|
181
|
if (pending === 0) {
|
182
|
callback(null, result)
|
183
|
}
|
184
|
}
|
185
|
|
186
|
resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) {
|
187
|
result.sourcesResolved[index] = fullUrl
|
188
|
if (typeof sourceContent === "string") {
|
189
|
result.sourcesContent[index] = sourceContent
|
190
|
callbackAsync(done, null)
|
191
|
} else {
|
192
|
var readUrl = fullUrl
|
193
|
read(readUrl, function(error, source) {
|
194
|
result.sourcesContent[index] = error ? error : String(source)
|
195
|
done()
|
196
|
})
|
197
|
}
|
198
|
})
|
199
|
}
|
200
|
|
201
|
function resolveSourcesSync(map, mapUrl, read, options) {
|
202
|
var result = {
|
203
|
sourcesResolved: [],
|
204
|
sourcesContent: []
|
205
|
}
|
206
|
|
207
|
if (!map.sources || map.sources.length === 0) {
|
208
|
return result
|
209
|
}
|
210
|
|
211
|
resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) {
|
212
|
result.sourcesResolved[index] = fullUrl
|
213
|
if (read !== null) {
|
214
|
if (typeof sourceContent === "string") {
|
215
|
result.sourcesContent[index] = sourceContent
|
216
|
} else {
|
217
|
var readUrl = fullUrl
|
218
|
try {
|
219
|
result.sourcesContent[index] = String(read(readUrl))
|
220
|
} catch (error) {
|
221
|
result.sourcesContent[index] = error
|
222
|
}
|
223
|
}
|
224
|
}
|
225
|
})
|
226
|
|
227
|
return result
|
228
|
}
|
229
|
|
230
|
var endingSlash = /\/?$/
|
231
|
|
232
|
function resolveSourcesHelper(map, mapUrl, options, fn) {
|
233
|
options = options || {}
|
234
|
var fullUrl
|
235
|
var sourceContent
|
236
|
var sourceRoot
|
237
|
for (var index = 0, len = map.sources.length; index < len; index++) {
|
238
|
sourceRoot = null
|
239
|
if (typeof options.sourceRoot === "string") {
|
240
|
sourceRoot = options.sourceRoot
|
241
|
} else if (typeof map.sourceRoot === "string" && options.sourceRoot !== false) {
|
242
|
sourceRoot = map.sourceRoot
|
243
|
}
|
244
|
// If the sourceRoot is the empty string, it is equivalent to not setting
|
245
|
// the property at all.
|
246
|
if (sourceRoot === null || sourceRoot === '') {
|
247
|
fullUrl = resolveUrl(mapUrl, map.sources[index])
|
248
|
} else {
|
249
|
// Make sure that the sourceRoot ends with a slash, so that `/scripts/subdir` becomes
|
250
|
// `/scripts/subdir/<source>`, not `/scripts/<source>`. Pointing to a file as source root
|
251
|
// does not make sense.
|
252
|
fullUrl = resolveUrl(mapUrl, sourceRoot.replace(endingSlash, "/"), map.sources[index])
|
253
|
}
|
254
|
sourceContent = (map.sourcesContent || [])[index]
|
255
|
fn(fullUrl, sourceContent, index)
|
256
|
}
|
257
|
}
|
258
|
|
259
|
|
260
|
|
261
|
function resolve(code, codeUrl, read, options, callback) {
|
262
|
if (typeof options === "function") {
|
263
|
callback = options
|
264
|
options = {}
|
265
|
}
|
266
|
if (code === null) {
|
267
|
var mapUrl = codeUrl
|
268
|
var data = {
|
269
|
sourceMappingURL: null,
|
270
|
url: mapUrl,
|
271
|
sourcesRelativeTo: mapUrl,
|
272
|
map: null
|
273
|
}
|
274
|
var readUrl = mapUrl
|
275
|
read(readUrl, function(error, result) {
|
276
|
if (error) {
|
277
|
error.sourceMapData = data
|
278
|
return callback(error)
|
279
|
}
|
280
|
data.map = String(result)
|
281
|
try {
|
282
|
data.map = parseMapToJSON(data.map, data)
|
283
|
} catch (error) {
|
284
|
return callback(error)
|
285
|
}
|
286
|
_resolveSources(data)
|
287
|
})
|
288
|
} else {
|
289
|
resolveSourceMap(code, codeUrl, read, function(error, mapData) {
|
290
|
if (error) {
|
291
|
return callback(error)
|
292
|
}
|
293
|
if (!mapData) {
|
294
|
return callback(null, null)
|
295
|
}
|
296
|
_resolveSources(mapData)
|
297
|
})
|
298
|
}
|
299
|
|
300
|
function _resolveSources(mapData) {
|
301
|
resolveSources(mapData.map, mapData.sourcesRelativeTo, read, options, function(error, result) {
|
302
|
if (error) {
|
303
|
return callback(error)
|
304
|
}
|
305
|
mapData.sourcesResolved = result.sourcesResolved
|
306
|
mapData.sourcesContent = result.sourcesContent
|
307
|
callback(null, mapData)
|
308
|
})
|
309
|
}
|
310
|
}
|
311
|
|
312
|
function resolveSync(code, codeUrl, read, options) {
|
313
|
var mapData
|
314
|
if (code === null) {
|
315
|
var mapUrl = codeUrl
|
316
|
mapData = {
|
317
|
sourceMappingURL: null,
|
318
|
url: mapUrl,
|
319
|
sourcesRelativeTo: mapUrl,
|
320
|
map: null
|
321
|
}
|
322
|
mapData.map = readSync(read, mapUrl, mapData)
|
323
|
mapData.map = parseMapToJSON(mapData.map, mapData)
|
324
|
} else {
|
325
|
mapData = resolveSourceMapSync(code, codeUrl, read)
|
326
|
if (!mapData) {
|
327
|
return null
|
328
|
}
|
329
|
}
|
330
|
var result = resolveSourcesSync(mapData.map, mapData.sourcesRelativeTo, read, options)
|
331
|
mapData.sourcesResolved = result.sourcesResolved
|
332
|
mapData.sourcesContent = result.sourcesContent
|
333
|
return mapData
|
334
|
}
|
335
|
|
336
|
|
337
|
|
338
|
return {
|
339
|
resolveSourceMap: resolveSourceMap,
|
340
|
resolveSourceMapSync: resolveSourceMapSync,
|
341
|
resolveSources: resolveSources,
|
342
|
resolveSourcesSync: resolveSourcesSync,
|
343
|
resolve: resolve,
|
344
|
resolveSync: resolveSync,
|
345
|
parseMapToJSON: parseMapToJSON
|
346
|
}
|
347
|
|
348
|
}));
|