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.
47 lines
1.3 KiB
47 lines
1.3 KiB
'use strict'; |
|
|
|
var getFieldAsFn = require('./get-field-as-fn'), |
|
CustomError = require('./get-error'); |
|
|
|
/** |
|
* Locate the root for input 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} An encode function that takes an absolute path |
|
*/ |
|
function locateRootWith(codec) { |
|
/* jshint validthis:true */ |
|
var context = this, |
|
root = getFieldAsFn('root')(codec); |
|
if (!root) { |
|
return new CustomError('Specified format does not support encoding (it lacks a "root" function)'); |
|
} |
|
else { |
|
return function locate() { |
|
|
|
// call the root |
|
var located; |
|
try { |
|
located = root.call(context); |
|
} |
|
catch (exception) { |
|
return getNamedError(exception); |
|
} |
|
return located; |
|
|
|
function getNamedError(details) { |
|
var name = codec.name || '(unnamed)', |
|
message = [ |
|
'Locating root with codec: ' + name, |
|
details && (details.stack ? details.stack : details) |
|
] |
|
.filter(Boolean) |
|
.join('\n'); |
|
return new Error(message); |
|
} |
|
}; |
|
} |
|
} |
|
|
|
module.exports = locateRootWith;
|
|
|