You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.5 KiB
118 lines
3.5 KiB
2 years ago
|
'use strict';
|
||
|
|
||
|
var debugMessage = require('./debug-message'),
|
||
|
toRegExp = require('./to-reg-exp'),
|
||
|
throwErrors = require('./throw-errors'),
|
||
|
decodeSourcesWith = require('./decode-sources-with'),
|
||
|
locateRootWith = require('./locate-root-with'),
|
||
|
encodeSourcesWith = require('./encode-sources-with'),
|
||
|
testCodec = require('./test-codec');
|
||
|
|
||
|
var CODECS = require('../../codec');
|
||
|
|
||
|
/**
|
||
|
* Process the given source-map per the given options.
|
||
|
* @param {{resourcePath:string, context:string, output:{path:string}}} context A loader or compilation
|
||
|
* @param {{debug:boolean, fail:boolean, format:string|boolean, root:string, codecs:object}} opt Options hash
|
||
|
* @param {object|string} sourceMapOrSource An incoming source-map or single source path
|
||
|
* @returns {undefined|object|string} An amended source-map or source path else undefined
|
||
|
*/
|
||
|
function process(context, opt, sourceMapOrSource) {
|
||
|
|
||
|
// default options
|
||
|
var options = Object.assign({
|
||
|
sep : '/',
|
||
|
debug : false,
|
||
|
fail : false,
|
||
|
format: false,
|
||
|
root : false,
|
||
|
codecs: CODECS
|
||
|
}, opt);
|
||
|
|
||
|
// validate codecs
|
||
|
var codecs = options.codecs
|
||
|
.filter(testCodec);
|
||
|
|
||
|
// determine what is present
|
||
|
var inputMap = !!sourceMapOrSource && (typeof sourceMapOrSource === 'object') && sourceMapOrSource,
|
||
|
inputPath = (typeof sourceMapOrSource === 'string') && sourceMapOrSource,
|
||
|
inputSources = inputMap && inputMap.sources || inputPath && [inputPath];
|
||
|
|
||
|
// what we need to produce
|
||
|
var absoluteSources,
|
||
|
outputSources,
|
||
|
outputRoot,
|
||
|
outputMap;
|
||
|
|
||
|
if (inputSources) {
|
||
|
|
||
|
// decode each source with the first valid codec
|
||
|
absoluteSources = inputSources
|
||
|
.map(decodeSourcesWith.call(context, codecs, options.fail));
|
||
|
|
||
|
// check for decode errors
|
||
|
throwErrors(context.resourcePath, absoluteSources);
|
||
|
|
||
|
// output map is a copy unless absent or we are removing
|
||
|
outputMap = (!inputMap || (options.format === 'remove')) ? undefined : Object.assign({}, inputMap);
|
||
|
|
||
|
// some change in format
|
||
|
if (options.format) {
|
||
|
|
||
|
// find the specified codec in the codecs list
|
||
|
var codec = codecs
|
||
|
.filter(testNamedCodec)
|
||
|
.pop();
|
||
|
|
||
|
if (!codec) {
|
||
|
throw new Error('Specified format "' + options.format + '" does not match any available codec.');
|
||
|
}
|
||
|
|
||
|
// use the encoder where specified in 'format'
|
||
|
outputSources = absoluteSources
|
||
|
.map(encodeSourcesWith.call(context, codec))
|
||
|
.map(insertAbstractSources)
|
||
|
.map(convertPathSep);
|
||
|
|
||
|
outputRoot = !!options.root && locateRootWith.call(context, codec)() || undefined;
|
||
|
|
||
|
// check for encode errors
|
||
|
throwErrors(context.resourcePath, outputSources.concat(outputRoot));
|
||
|
|
||
|
// commit the change
|
||
|
if (outputMap) {
|
||
|
outputMap.sources = outputSources;
|
||
|
outputMap.sourceRoot = outputRoot;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// debugging information
|
||
|
var isDebug = toRegExp(options.debug).test(context.resourcePath);
|
||
|
if (isDebug) {
|
||
|
console.log(debugMessage(context, {
|
||
|
input : inputSources,
|
||
|
absolute: absoluteSources,
|
||
|
output : outputSources,
|
||
|
root : outputRoot
|
||
|
}));
|
||
|
}
|
||
|
|
||
|
// complete
|
||
|
return inputMap ? outputMap : outputSources ? outputSources[0] : undefined;
|
||
|
|
||
|
function testNamedCodec(value) {
|
||
|
return (value.name === options.format);
|
||
|
}
|
||
|
|
||
|
function insertAbstractSources(value, i) {
|
||
|
return value || inputSources[i];
|
||
|
}
|
||
|
|
||
|
function convertPathSep(value) {
|
||
|
return (value instanceof Error) ? value : value.replace(/[\\\/]/g, options.sep);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = process;
|