Spaces:
Running
Running
var fs = require('fs'); | |
var path = require('path'); | |
var isAllowedResource = require('./is-allowed-resource'); | |
var hasProtocol = require('../utils/has-protocol'); | |
var isRemoteResource = require('../utils/is-remote-resource'); | |
function loadOriginalSources(context, callback) { | |
var loadContext = { | |
callback: callback, | |
fetch: context.options.fetch, | |
index: 0, | |
inline: context.options.inline, | |
inlineRequest: context.options.inlineRequest, | |
inlineTimeout: context.options.inlineTimeout, | |
localOnly: context.localOnly, | |
rebaseTo: context.options.rebaseTo, | |
sourcesContent: context.sourcesContent, | |
uriToSource: uriToSourceMapping(context.inputSourceMapTracker.all()), | |
warnings: context.warnings | |
}; | |
return context.options.sourceMap && context.options.sourceMapInlineSources | |
? doLoadOriginalSources(loadContext) | |
: callback(); | |
} | |
function uriToSourceMapping(allSourceMapConsumers) { | |
var mapping = {}; | |
var consumer; | |
var uri; | |
var source; | |
var i, l; | |
for (source in allSourceMapConsumers) { | |
consumer = allSourceMapConsumers[source]; | |
for (i = 0, l = consumer.sources.length; i < l; i++) { | |
uri = consumer.sources[i]; | |
source = consumer.sourceContentFor(uri, true); | |
mapping[uri] = source; | |
} | |
} | |
return mapping; | |
} | |
function doLoadOriginalSources(loadContext) { | |
var uris = Object.keys(loadContext.uriToSource); | |
var uri; | |
var source; | |
var total; | |
for (total = uris.length; loadContext.index < total; loadContext.index++) { | |
uri = uris[loadContext.index]; | |
source = loadContext.uriToSource[uri]; | |
if (source) { | |
loadContext.sourcesContent[uri] = source; | |
} else { | |
return loadOriginalSource(uri, loadContext); | |
} | |
} | |
return loadContext.callback(); | |
} | |
function loadOriginalSource(uri, loadContext) { | |
var content; | |
if (isRemoteResource(uri)) { | |
return loadOriginalSourceFromRemoteUri(uri, loadContext, function(content) { | |
loadContext.index++; | |
loadContext.sourcesContent[uri] = content; | |
return doLoadOriginalSources(loadContext); | |
}); | |
} | |
content = loadOriginalSourceFromLocalUri(uri, loadContext); | |
loadContext.index++; | |
loadContext.sourcesContent[uri] = content; | |
return doLoadOriginalSources(loadContext); | |
} | |
function loadOriginalSourceFromRemoteUri(uri, loadContext, whenLoaded) { | |
var isAllowed = isAllowedResource(uri, true, loadContext.inline); | |
var isRuntimeResource = !hasProtocol(uri); | |
if (loadContext.localOnly) { | |
loadContext.warnings.push('Cannot fetch remote resource from "' + uri + '" as no callback given.'); | |
return whenLoaded(null); | |
} if (isRuntimeResource) { | |
loadContext.warnings.push('Cannot fetch "' + uri + '" as no protocol given.'); | |
return whenLoaded(null); | |
} if (!isAllowed) { | |
loadContext.warnings.push('Cannot fetch "' + uri + '" as resource is not allowed.'); | |
return whenLoaded(null); | |
} | |
loadContext.fetch(uri, loadContext.inlineRequest, loadContext.inlineTimeout, function(error, content) { | |
if (error) { | |
loadContext.warnings.push('Missing original source at "' + uri + '" - ' + error); | |
} | |
whenLoaded(content); | |
}); | |
} | |
function loadOriginalSourceFromLocalUri(relativeUri, loadContext) { | |
var isAllowed = isAllowedResource(relativeUri, false, loadContext.inline); | |
var absoluteUri = path.resolve(loadContext.rebaseTo, relativeUri); | |
if (!fs.existsSync(absoluteUri) || !fs.statSync(absoluteUri).isFile()) { | |
loadContext.warnings.push('Ignoring local source map at "' + absoluteUri + '" as resource is missing.'); | |
return null; | |
} if (!isAllowed) { | |
loadContext.warnings.push('Cannot fetch "' + absoluteUri + '" as resource is not allowed.'); | |
return null; | |
} | |
var result = fs.readFileSync(absoluteUri, 'utf8'); | |
if (result.charCodeAt(0) === 65279) { | |
result = result.substring(1); | |
} | |
return result; | |
} | |
module.exports = loadOriginalSources; | |