UNPKG

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
"use strict"; 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;