111 lines
3.1 KiB
JavaScript
111 lines
3.1 KiB
JavaScript
//
|
|
'use strict';
|
|
|
|
const yaml = require('js-yaml');
|
|
const requireFromString = require('require-from-string');
|
|
const readFile = require('./readFile');
|
|
const parseJson = require('./parseJson');
|
|
const funcRunner = require('./funcRunner');
|
|
|
|
module.exports = function loadRc(
|
|
filepath ,
|
|
options
|
|
|
|
|
|
|
|
|
|
) {
|
|
if (!options.sync) {
|
|
return readFile(filepath)
|
|
.then(parseExtensionlessRcFile)
|
|
.then(checkExtensionlessRcResult);
|
|
} else {
|
|
return checkExtensionlessRcResult(
|
|
parseExtensionlessRcFile(readFile.sync(filepath))
|
|
);
|
|
}
|
|
|
|
function checkExtensionlessRcResult(result) {
|
|
if (result) return result;
|
|
if (options.rcExtensions) return loadRcWithExtensions();
|
|
return null;
|
|
}
|
|
|
|
function parseExtensionlessRcFile(content ) {
|
|
if (!content) return null;
|
|
const pasedConfig = options.rcStrictJson
|
|
? parseJson(content, filepath)
|
|
: yaml.safeLoad(content, { filename: filepath });
|
|
return {
|
|
config: pasedConfig,
|
|
filepath,
|
|
};
|
|
}
|
|
|
|
function loadRcWithExtensions() {
|
|
let foundConfig = null;
|
|
return funcRunner(readRcFile('json'), [
|
|
(jsonContent ) => {
|
|
// Since this is the first try, config cannot have been found, so don't
|
|
// check `if (foundConfig)`.
|
|
if (jsonContent) {
|
|
const successFilepath = `${filepath}.json`;
|
|
foundConfig = {
|
|
config: parseJson(jsonContent, successFilepath),
|
|
filepath: successFilepath,
|
|
};
|
|
} else {
|
|
return readRcFile('yaml');
|
|
}
|
|
},
|
|
(yamlContent ) => {
|
|
if (foundConfig) {
|
|
return;
|
|
} else if (yamlContent) {
|
|
const successFilepath = `${filepath}.yaml`;
|
|
foundConfig = {
|
|
config: yaml.safeLoad(yamlContent, { filename: successFilepath }),
|
|
filepath: successFilepath,
|
|
};
|
|
} else {
|
|
return readRcFile('yml');
|
|
}
|
|
},
|
|
(ymlContent ) => {
|
|
if (foundConfig) {
|
|
return;
|
|
} else if (ymlContent) {
|
|
const successFilepath = `${filepath}.yml`;
|
|
foundConfig = {
|
|
config: yaml.safeLoad(ymlContent, { filename: successFilepath }),
|
|
filepath: successFilepath,
|
|
};
|
|
} else {
|
|
return readRcFile('js');
|
|
}
|
|
},
|
|
(jsContent ) => {
|
|
if (foundConfig) {
|
|
return;
|
|
} else if (jsContent) {
|
|
const successFilepath = `${filepath}.js`;
|
|
foundConfig = {
|
|
config: requireFromString(jsContent, successFilepath),
|
|
filepath: successFilepath,
|
|
};
|
|
} else {
|
|
return;
|
|
}
|
|
},
|
|
() => foundConfig,
|
|
]);
|
|
}
|
|
|
|
function readRcFile(extension ) {
|
|
const filepathWithExtension = `${filepath}.${extension}`;
|
|
return !options.sync
|
|
? readFile(filepathWithExtension)
|
|
: readFile.sync(filepathWithExtension);
|
|
}
|
|
};
|