cosmiconfig
Version:
Find and load configuration from a package.json property, rc file, or CommonJS module
84 lines (77 loc) • 2.52 kB
JavaScript
;
const yaml = require('js-yaml');
const parseJson = require('parse-json');
const requireFromString = require('require-from-string');
const readFile = require('./readFile');
module.exports = function (filepath, options) {
return loadExtensionlessRc().then((result) => {
if (result) return result;
if (options.rcExtensions) return loadRcWithExtensions();
return null;
});
function loadExtensionlessRc() {
return readRcFile().then((content) => {
if (!content) return null;
const pasedConfig = (options.rcStrictJson)
? parseJson(content, filepath)
: yaml.safeLoad(content, {
filename: filepath,
});
return {
config: pasedConfig,
filepath: filepath,
};
});
}
function loadRcWithExtensions() {
return readRcFile('json').then((content) => {
if (content) {
const successFilepath = `${filepath}.json`;
return {
config: parseJson(content, successFilepath),
filepath: successFilepath,
};
}
// If not content was found in the file with extension,
// try the next possible extension
return readRcFile('yaml');
}).then((content) => {
if (content) {
// If the previous check returned an object with a config
// property, then it succeeded and this step can be skipped
if (content.config) return content;
// If it just returned a string, then *this* check succeeded
const successFilepath = `${filepath}.yaml`;
return {
config: yaml.safeLoad(content, { filename: successFilepath }),
filepath: successFilepath,
};
}
return readRcFile('yml');
}).then((content) => {
if (content) {
if (content.config) return content;
const successFilepath = `${filepath}.yml`;
return {
config: yaml.safeLoad(content, { filename: successFilepath }),
filepath: successFilepath,
};
}
return readRcFile('js');
}).then((content) => {
if (content) {
if (content.config) return content;
const successFilepath = `${filepath}.js`;
return {
config: requireFromString(content, successFilepath),
filepath: successFilepath,
};
}
return null;
});
}
function readRcFile(extension) {
const filepathWithExtension = (extension) ? `${filepath}.${extension}` : filepath;
return readFile(filepathWithExtension);
}
};