auto-config-loader
Version:
Find and load configuration from a package.json property, rc file, or CommonJS module.
105 lines (104 loc) • 4.41 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getConfigPath = exports.merge = void 0;
exports.autoConf = autoConf;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const lodash_merge_1 = __importDefault(require("lodash.merge"));
const js_1 = require("./loader/js");
const json_1 = require("./loader/json");
const yaml_1 = require("./loader/yaml");
const toml_1 = require("./loader/toml");
const ini_1 = require("./loader/ini");
const utils_1 = require("./utils");
__exportStar(require("./utils"), exports);
__exportStar(require("./loader/js"), exports);
__exportStar(require("./loader/json"), exports);
__exportStar(require("./loader/yaml"), exports);
__exportStar(require("./loader/toml"), exports);
__exportStar(require("./loader/ini"), exports);
exports.merge = lodash_merge_1.default;
let configPath = '';
const getConfigPath = () => configPath;
exports.getConfigPath = getConfigPath;
/**
* Find and load configuration from a `package.json` property, `rc` file, or `CommonJS` module.
* @param namespace {string} Configuration base name. The default is `autoconf`.
* @param option
*/
async function autoConf(namespace = 'autoconf', option = {}) {
const { searchPlaces = [], default: defaultValue = {}, cwd = process.cwd(), ignoreLog = false, mustExist = ignoreLog || false, jsOption, } = option;
const loaders = {
'.yml': yaml_1.yamlLoader,
'.yaml': yaml_1.yamlLoader,
'.ini': ini_1.iniLoader,
'.toml': toml_1.tomlLoader,
'.json': json_1.jsonLoader,
'.json5': json_1.jsonLoader,
'.jsonc': json_1.jsonLoader,
'.js': js_1.jsLoader,
'.ts': js_1.jsLoader,
'.cjs': js_1.jsLoader,
'.mjs': js_1.jsLoader,
...(option.loaders || {}),
};
const pkgPath = path_1.default.resolve(cwd, 'package.json');
configPath = (0, utils_1.findConfigFile)(namespace, cwd, searchPlaces);
let content = '';
let resultData;
let loaderFunc;
try {
if (configPath) {
const extname = path_1.default.extname(configPath);
const basename = path_1.default.basename(configPath);
if (new RegExp(`^(.?${namespace}rc)$`).test(basename)) {
content = fs_1.default.readFileSync(configPath, 'utf-8');
loaderFunc = loaders['.json'];
}
else if (loaders[extname]) {
content = fs_1.default.readFileSync(configPath, 'utf-8');
loaderFunc = loaders[extname];
}
}
let pkgContent;
if (fs_1.default.existsSync(pkgPath)) {
content = fs_1.default.readFileSync(pkgPath, 'utf-8');
const result = loaders['.json'](pkgPath, content);
pkgContent = result[namespace];
}
if (content && loaderFunc) {
resultData = await loaderFunc(configPath, content, jsOption);
if (typeof resultData === 'function') {
return (0, exports.merge)(defaultValue, resultData ?? {}, { ...pkgContent }, { default: resultData });
}
}
if (pkgContent) {
return (0, exports.merge)(defaultValue, { ...resultData }, { ...pkgContent });
}
if (!!mustExist && !configPath && !resultData) {
return null;
}
return (0, exports.merge)(defaultValue, { ...resultData }, { ...pkgContent });
}
catch (error) {
console.log(`AUTO_CONF:CATCH:ERROR: \x1b[31;1m${error}\x1b[0m`);
}
}
exports.default = autoConf;