"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = loader;
var _path = _interopRequireDefault(require("path"));
var _options = _interopRequireDefault(require("./options.json"));
var _utils = require("./utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
async function loader(input, inputMap) {
const options = this.getOptions(_options.default);
const {
sourceMappingURL,
replacementString
} = (0, _utils.getSourceMappingURL)(input);
const callback = this.async();
if (!sourceMappingURL) {
callback(null, input, inputMap);
return;
}
let behaviourSourceMappingUrl;
try {
behaviourSourceMappingUrl = typeof options.filterSourceMappingUrl !== "undefined" ? options.filterSourceMappingUrl(sourceMappingURL, this.resourcePath) : "consume";
} catch (error) {
callback(error);
return;
} // eslint-disable-next-line default-case
switch (behaviourSourceMappingUrl) {
case "skip":
callback(null, input, inputMap);
return;
case false:
case "remove":
callback(null, input.replace(replacementString, ""), inputMap);
return;
}
let sourceURL;
let sourceContent;
try {
({
sourceURL,
sourceContent
} = await (0, _utils.fetchFromURL)(this, this.context, sourceMappingURL));
} catch (error) {
this.emitWarning(error);
callback(null, input, inputMap);
return;
}
if (sourceURL) {
this.addDependency(sourceURL);
}
let map;
try {
map = JSON.parse(sourceContent.replace(/^\)\]\}'/, ""));
} catch (parseError) {
this.emitWarning(new Error(`Failed to parse source map from '${sourceMappingURL}': ${parseError}`));
callback(null, input, inputMap);
return;
}
const context = sourceURL ? _path.default.dirname(sourceURL) : this.context;
if (map.sections) {
// eslint-disable-next-line no-param-reassign
map = await (0, _utils.flattenSourceMap)(map);
}
const resolvedSources = await Promise.all(map.sources.map(async (source, i) => {
// eslint-disable-next-line no-shadow
let sourceURL; // eslint-disable-next-line no-shadow
let sourceContent;
const originalSourceContent = map.sourcesContent && typeof map.sourcesContent[i] !== "undefined" && map.sourcesContent[i] !== null ? map.sourcesContent[i] : // eslint-disable-next-line no-undefined
undefined;
const skipReading = typeof originalSourceContent !== "undefined";
let errored = false; // We do not skipReading here, because we need absolute paths in sources.
// This is necessary so that for sourceMaps with the same file structure in sources, name collisions do not occur.
// https://github.com/webpack-contrib/source-map-loader/issues/51
try {
({
sourceURL,
sourceContent
} = await (0, _utils.fetchFromURL)(this, context, source, map.sourceRoot, skipReading));
} catch (error) {
errored = true;
this.emitWarning(error);
}
if (skipReading) {
sourceContent = originalSourceContent;
} else if (!errored && sourceURL) {
this.addDependency(sourceURL);
} // Return original value of `source` when error happens
return {
sourceURL: errored ? source : sourceURL,
sourceContent
};
}));
const newMap = { ...map
};
newMap.sources = [];
newMap.sourcesContent = [];
delete newMap.sourceRoot;
resolvedSources.forEach(source => {
// eslint-disable-next-line no-shadow
const {
sourceURL,
sourceContent
} = source;
newMap.sources.push(sourceURL || "");
newMap.sourcesContent.push(sourceContent || "");
});
const sourcesContentIsEmpty = newMap.sourcesContent.filter(entry => Boolean(entry)).length === 0;
if (sourcesContentIsEmpty) {
delete newMap.sourcesContent;
}
callback(null, input.replace(replacementString, ""), newMap);
}