99 lines
2.3 KiB
JavaScript
99 lines
2.3 KiB
JavaScript
//
|
|
'use strict';
|
|
|
|
const yaml = require('js-yaml');
|
|
const requireFromString = require('require-from-string');
|
|
const readFile = require('./readFile');
|
|
const parseJson = require('./parseJson');
|
|
const path = require('path');
|
|
|
|
module.exports = function loadDefinedFile(
|
|
filepath ,
|
|
options
|
|
|
|
|
|
|
|
) {
|
|
function parseContent(content ) {
|
|
if (!content) {
|
|
throw new Error(`Config file is empty! Filepath - "${filepath}".`);
|
|
}
|
|
|
|
let parsedConfig;
|
|
|
|
switch (options.format || inferFormat(filepath)) {
|
|
case 'json':
|
|
parsedConfig = parseJson(content, filepath);
|
|
break;
|
|
case 'yaml':
|
|
parsedConfig = yaml.safeLoad(content, {
|
|
filename: filepath,
|
|
});
|
|
break;
|
|
case 'js':
|
|
parsedConfig = requireFromString(content, filepath);
|
|
break;
|
|
default:
|
|
parsedConfig = tryAllParsing(content, filepath);
|
|
}
|
|
|
|
if (!parsedConfig) {
|
|
throw new Error(`Failed to parse "${filepath}" as JSON, JS, or YAML.`);
|
|
}
|
|
|
|
return {
|
|
config: parsedConfig,
|
|
filepath,
|
|
};
|
|
}
|
|
|
|
return !options.sync
|
|
? readFile(filepath, { throwNotFound: true }).then(parseContent)
|
|
: parseContent(readFile.sync(filepath, { throwNotFound: true }));
|
|
};
|
|
|
|
function inferFormat(filepath ) {
|
|
switch (path.extname(filepath)) {
|
|
case '.js':
|
|
return 'js';
|
|
case '.json':
|
|
return 'json';
|
|
// istanbul ignore next
|
|
case '.yml':
|
|
case '.yaml':
|
|
return 'yaml';
|
|
default:
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
function tryAllParsing(content , filepath ) {
|
|
return tryYaml(content, filepath, () => {
|
|
return tryRequire(content, filepath, () => {
|
|
return null;
|
|
});
|
|
});
|
|
}
|
|
|
|
function tryYaml(content , filepath , cb ) {
|
|
try {
|
|
const result = yaml.safeLoad(content, {
|
|
filename: filepath,
|
|
});
|
|
if (typeof result === 'string') {
|
|
return cb();
|
|
}
|
|
return result;
|
|
} catch (e) {
|
|
return cb();
|
|
}
|
|
}
|
|
|
|
function tryRequire(content , filepath , cb ) {
|
|
try {
|
|
return requireFromString(content, filepath);
|
|
} catch (e) {
|
|
return cb();
|
|
}
|
|
}
|