Files
gruvbox/node_modules/cosmiconfig/lib/loadRc.js

93 lines
2.8 KiB
JavaScript

'use strict';
var fs = require('graceful-fs');
var Promise = require('pinkie-promise');
var yaml = require('js-yaml');
var parseJson = require('parse-json');
var requireFromString = require('require-from-string');
module.exports = function(filepath, options) {
return loadExtensionlessRc().then(function(result) {
if (result) return result;
if (options.extensions) return loadRcWithExtensions();
return null;
});
function loadExtensionlessRc() {
return readRcFile().then(function(content) {
if (!content) return null;
var pasedConfig = (options.strictJson)
? parseJson(content, filepath)
: yaml.safeLoad(content, {
filename: filepath,
});
return {
config: pasedConfig,
filepath: filepath,
};
});
}
function loadRcWithExtensions() {
return readRcFile('json').then(function(content) {
if (content) {
var 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(function(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
var successFilepath = filepath + '.yaml';
return {
config: yaml.safeLoad(content, { filename: successFilepath }),
filepath: successFilepath,
};
}
return readRcFile('yml');
}).then(function(content) {
if (content) {
if (content.config) return content;
var successFilepath = filepath + '.yml';
return {
config: yaml.safeLoad(content, { filename: successFilepath }),
filepath: successFilepath,
};
}
return readRcFile('js');
}).then(function(content) {
if (content) {
if (content.config) return content;
var successFilepath = filepath + '.js';
return {
config: requireFromString(content, successFilepath),
filepath: successFilepath,
};
}
return null;
});
}
function readRcFile(extension) {
return new Promise(function(resolve, reject) {
var filepathWithExtension = (extension) ? filepath + '.' + extension : filepath;
fs.readFile(filepathWithExtension, 'utf8', function(fileError, content) {
if (fileError) {
if (fileError.code === 'ENOENT') return resolve(null);
return reject(fileError);
}
resolve(content);
});
});
}
};