Spaces:
Sleeping
Sleeping
| 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; | |