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.
48 lines
1.4 KiB
48 lines
1.4 KiB
'use strict'; |
|
|
|
var getFieldAsFn = require('./get-field-as-fn'), |
|
CustomError = require('./get-error'); |
|
|
|
/** |
|
* Create an encoder for output sources using the given codec hash |
|
* @throws Error Where the given codec is missing an encode function |
|
* @this {object} A loader or compilation |
|
* @param {{encode:function}} codec A single codec with an `encode` function |
|
* @returns {function(string):string|Error|false} An encode function that takes an absolute path |
|
*/ |
|
function encodeSourcesWith(codec) { |
|
/* jshint validthis:true */ |
|
var context = this, |
|
encoder = getFieldAsFn('encode')(codec); |
|
if (!encoder) { |
|
return new CustomError('Specified format does not support encoding (it lacks an "encoder" function)'); |
|
} |
|
else { |
|
return function encode(absoluteSource) { |
|
|
|
// call the encoder |
|
var encoded; |
|
try { |
|
encoded = absoluteSource && encoder.call(context, absoluteSource); |
|
} |
|
catch (exception) { |
|
return getNamedError(exception); |
|
} |
|
return encoded; |
|
|
|
function getNamedError(details) { |
|
var name = codec.name || '(unnamed)', |
|
message = [ |
|
'Encoding with codec: ' + name, |
|
'Absolute source: ' + absoluteSource, |
|
details && (details.stack ? details.stack : details) |
|
] |
|
.filter(Boolean) |
|
.join('\n'); |
|
return new Error(message); |
|
} |
|
}; |
|
} |
|
} |
|
|
|
module.exports = encodeSourcesWith;
|
|
|