|
|
- 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);
- });
- } else {
- 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);
- } else if (isRuntimeResource) {
- loadContext.warnings.push('Cannot fetch "' + uri + '" as no protocol given.');
- return whenLoaded(null);
- } else 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;
- } else if (!isAllowed) {
- loadContext.warnings.push('Cannot fetch "' + absoluteUri + '" as resource is not allowed.');
- return null;
- }
-
- return fs.readFileSync(absoluteUri, 'utf8');
- }
-
- module.exports = loadOriginalSources;
|