Partie-2/node_modules/cosmiconfig/dist/loadDefinedFile.js
Simon Priet 9e2991e668 init
2021-09-05 22:53:58 +02:00

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();
}
}