1 |
3a515b92
|
cagy
|
// 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 |
|
|
}));
|