diff --git a/.gitignore b/.gitignore index fb2775d..4024acd 100644 --- a/.gitignore +++ b/.gitignore @@ -131,6 +131,3 @@ dist # TODO TODO.md - -# Built libraries -/lib diff --git a/lib/cjs/index.d.ts b/lib/cjs/index.d.ts new file mode 100644 index 0000000..f154cdb --- /dev/null +++ b/lib/cjs/index.d.ts @@ -0,0 +1,3 @@ +export * from "./utils.js"; +export { default as loadConfig } from "./loadConfig.js"; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/lib/cjs/index.d.ts.map b/lib/cjs/index.d.ts.map new file mode 100644 index 0000000..8124025 --- /dev/null +++ b/lib/cjs/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC"} \ No newline at end of file diff --git a/lib/cjs/index.js b/lib/cjs/index.js new file mode 100644 index 0000000..ed45c8a --- /dev/null +++ b/lib/cjs/index.js @@ -0,0 +1,24 @@ +"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.loadConfig = void 0; +__exportStar(require("./utils.js"), exports); +var loadConfig_js_1 = require("./loadConfig.js"); +Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return __importDefault(loadConfig_js_1).default; } }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBMkI7QUFDM0IsaURBQXdEO0FBQS9DLDRIQUFBLE9BQU8sT0FBYyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL3V0aWxzLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGxvYWRDb25maWcgfSBmcm9tIFwiLi9sb2FkQ29uZmlnLmpzXCI7XG4iXX0= \ No newline at end of file diff --git a/lib/cjs/loadConfig.d.ts b/lib/cjs/loadConfig.d.ts new file mode 100644 index 0000000..f7434fa --- /dev/null +++ b/lib/cjs/loadConfig.d.ts @@ -0,0 +1,5 @@ +declare const _default: (opts: Partial, envKey: string, localDefaultFilePath?: string) => { + [x: string]: any; +}; +export default _default; +//# sourceMappingURL=loadConfig.d.ts.map \ No newline at end of file diff --git a/lib/cjs/loadConfig.d.ts.map b/lib/cjs/loadConfig.d.ts.map new file mode 100644 index 0000000..795eba3 --- /dev/null +++ b/lib/cjs/loadConfig.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"loadConfig.d.ts","sourceRoot":"","sources":["../../src/loadConfig.ts"],"names":[],"mappings":"sDAUS,MAAM;;;AAFf,wBAyCE"} \ No newline at end of file diff --git a/lib/cjs/loadConfig.js b/lib/cjs/loadConfig.js new file mode 100644 index 0000000..7077409 --- /dev/null +++ b/lib/cjs/loadConfig.js @@ -0,0 +1,43 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const path_1 = __importDefault(require("path")); +const utils_1 = require("./utils"); +exports.default = (opts, envKey, localDefaultFilePath = "") => { + const { env } = process, { __dirname } = (0, utils_1.getDirname)(), def = (0, utils_1.readJsonIfExists)(path_1.default.join(__dirname, localDefaultFilePath || "./defaults.json5")), + // gets value from ENV || options || defaults (in that order) + getVal = (envName) => { + const snakeEnvName = `${envKey}_${(0, utils_1.convertCamelToUpperSnakeCase)(envName)}`; + if (env[snakeEnvName]) + return env[snakeEnvName]; + if (opts[envName]) + return opts[envName]; + return def[envName]; + }, + // gets array from ENV || options || defaults (in that order) + getArray = (envName, optName = "") => { + let newEnvName; + if (optName === "") { + optName = envName; + newEnvName = (0, utils_1.convertCamelToUpperSnakeCase)(envName); + } + newEnvName = `${envKey}_${String(envName)}`; + if (env[newEnvName]) + return env?.[newEnvName]?.split(path_1.default.delimiter); + if (Array.isArray(opts[optName]) && opts[optName].length) + return opts[optName]; + return def[optName]; + }; + return { + ...Object.keys(def).reduce((acc, curr) => { + if (Array.isArray(def[curr])) + acc[curr] = getArray(curr); + else + acc[curr] = getVal(curr); + return acc; + }, {}), + }; +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZENvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2FkQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsZ0RBQXdCO0FBRXhCLG1DQUlpQjtBQUVqQixrQkFBZSxDQUNkLElBQWdCLEVBQ2hCLE1BQWMsRUFDZCxvQkFBb0IsR0FBRyxFQUFFLEVBQ3hCLEVBQUU7SUFDSCxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUN0QixFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUEsa0JBQVUsR0FBRSxFQUM1QixHQUFHLEdBQUcsSUFBQSx3QkFBZ0IsRUFDckIsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLElBQUksa0JBQWtCLENBQUMsQ0FDaEU7SUFDRCw2REFBNkQ7SUFDN0QsTUFBTSxHQUFHLENBQUMsT0FBZ0IsRUFBRSxFQUFFO1FBQzdCLE1BQU0sWUFBWSxHQUFHLEdBQUcsTUFBTSxJQUFJLElBQUEsb0NBQTRCLEVBQzdELE9BQWlCLENBQ2pCLEVBQUUsQ0FBQztRQUNKLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQztZQUFFLE9BQU8sR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFDRCw2REFBNkQ7SUFDN0QsUUFBUSxHQUFHLENBQUMsT0FBZ0IsRUFBRSxVQUF3QixFQUFFLEVBQUUsRUFBRTtRQUMzRCxJQUFJLFVBQVUsQ0FBQztRQUNmLElBQUksT0FBTyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDbEIsVUFBVSxHQUFHLElBQUEsb0NBQTRCLEVBQUMsT0FBaUIsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxVQUFVLEdBQUcsR0FBRyxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDNUMsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDO1lBQ2xCLE9BQU8sR0FBRyxFQUFFLENBQUMsVUFBOEIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxjQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFLLElBQUksQ0FBQyxPQUFPLENBQVEsQ0FBQyxNQUFNO1lBQy9ELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBd0IsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUM3RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBZSxDQUFDLENBQUM7O2dCQUMvRCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQWUsQ0FBQyxDQUFDO1lBQ3pDLE9BQU8sR0FBRyxDQUFDO1FBQ1osQ0FBQyxFQUFFLEVBQUUsQ0FBQztLQUNOLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQge1xuXHRjb252ZXJ0Q2FtZWxUb1VwcGVyU25ha2VDYXNlLFxuXHRnZXREaXJuYW1lLFxuXHRyZWFkSnNvbklmRXhpc3RzLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZGVmYXVsdCA8VD4oXG5cdG9wdHM6IFBhcnRpYWw8VD4sXG5cdGVudktleTogc3RyaW5nLFxuXHRsb2NhbERlZmF1bHRGaWxlUGF0aCA9IFwiXCJcbikgPT4ge1xuXHRjb25zdCB7IGVudiB9ID0gcHJvY2Vzcyxcblx0XHR7IF9fZGlybmFtZSB9ID0gZ2V0RGlybmFtZSgpLFxuXHRcdGRlZiA9IHJlYWRKc29uSWZFeGlzdHMoXG5cdFx0XHRwYXRoLmpvaW4oX19kaXJuYW1lLCBsb2NhbERlZmF1bHRGaWxlUGF0aCB8fCBcIi4vZGVmYXVsdHMuanNvbjVcIilcblx0XHQpLFxuXHRcdC8vIGdldHMgdmFsdWUgZnJvbSBFTlYgfHwgb3B0aW9ucyB8fCBkZWZhdWx0cyAoaW4gdGhhdCBvcmRlcilcblx0XHRnZXRWYWwgPSAoZW52TmFtZToga2V5b2YgVCkgPT4ge1xuXHRcdFx0Y29uc3Qgc25ha2VFbnZOYW1lID0gYCR7ZW52S2V5fV8ke2NvbnZlcnRDYW1lbFRvVXBwZXJTbmFrZUNhc2UoXG5cdFx0XHRcdGVudk5hbWUgYXMgc3RyaW5nXG5cdFx0XHQpfWA7XG5cdFx0XHRpZiAoZW52W3NuYWtlRW52TmFtZV0pIHJldHVybiBlbnZbc25ha2VFbnZOYW1lXTtcblx0XHRcdGlmIChvcHRzW2Vudk5hbWVdKSByZXR1cm4gb3B0c1tlbnZOYW1lXTtcblx0XHRcdHJldHVybiBkZWZbZW52TmFtZV07XG5cdFx0fSxcblx0XHQvLyBnZXRzIGFycmF5IGZyb20gRU5WIHx8IG9wdGlvbnMgfHwgZGVmYXVsdHMgKGluIHRoYXQgb3JkZXIpXG5cdFx0Z2V0QXJyYXkgPSAoZW52TmFtZToga2V5b2YgVCwgb3B0TmFtZToga2V5b2YgVCB8IFwiXCIgPSBcIlwiKSA9PiB7XG5cdFx0XHRsZXQgbmV3RW52TmFtZTtcblx0XHRcdGlmIChvcHROYW1lID09PSBcIlwiKSB7XG5cdFx0XHRcdG9wdE5hbWUgPSBlbnZOYW1lO1xuXHRcdFx0XHRuZXdFbnZOYW1lID0gY29udmVydENhbWVsVG9VcHBlclNuYWtlQ2FzZShlbnZOYW1lIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0XHRuZXdFbnZOYW1lID0gYCR7ZW52S2V5fV8ke1N0cmluZyhlbnZOYW1lKX1gO1xuXHRcdFx0aWYgKGVudltuZXdFbnZOYW1lXSlcblx0XHRcdFx0cmV0dXJuIGVudj8uW25ld0Vudk5hbWUgYXMga2V5b2YgdHlwZW9mIGVudl0/LnNwbGl0KHBhdGguZGVsaW1pdGVyKTtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KG9wdHNbb3B0TmFtZV0pICYmIChvcHRzW29wdE5hbWVdIGFzIFtdKS5sZW5ndGgpXG5cdFx0XHRcdHJldHVybiBvcHRzW29wdE5hbWVdO1xuXHRcdFx0cmV0dXJuIGRlZltvcHROYW1lXTtcblx0XHR9O1xuXG5cdHJldHVybiB7XG5cdFx0Li4uT2JqZWN0LmtleXMoZGVmKS5yZWR1Y2UoKGFjYzogUGFydGlhbDx0eXBlb2YgZGVmPiwgY3VycikgPT4ge1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoZGVmW2N1cnJdKSkgYWNjW2N1cnJdID0gZ2V0QXJyYXkoY3VyciBhcyBrZXlvZiBUKTtcblx0XHRcdGVsc2UgYWNjW2N1cnJdID0gZ2V0VmFsKGN1cnIgYXMga2V5b2YgVCk7XG5cdFx0XHRyZXR1cm4gYWNjO1xuXHRcdH0sIHt9KSxcblx0fTtcbn07XG4iXX0= \ No newline at end of file diff --git a/lib/cjs/utils.d.ts b/lib/cjs/utils.d.ts new file mode 100644 index 0000000..991d592 --- /dev/null +++ b/lib/cjs/utils.d.ts @@ -0,0 +1,16 @@ +/// +export interface ErrorWithCode { + code: string; +} +export declare const convertCamelToUpperSnakeCase: (str: string) => string; +/** + * From: https://www.webmanajemen.com/2022/05/use-import-meta-cjs.html + */ +export declare const getDirname: () => { + __dirname: string; + __filename: string; +}; +export declare const getTime: () => string; +export declare const log: (...msg: unknown[]) => void; +export declare const readJsonIfExists: (filePath: string | URL) => any; +//# sourceMappingURL=utils.d.ts.map \ No newline at end of file diff --git a/lib/cjs/utils.d.ts.map b/lib/cjs/utils.d.ts.map new file mode 100644 index 0000000..5d0f3f3 --- /dev/null +++ b/lib/cjs/utils.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";AAIA,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,4BAA4B,QAAS,MAAM,WACM,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,UAAU;;;CAYtB,CAAC;AAEF,eAAO,MAAM,OAAO,cAyBnB,CAAC;AAEF,eAAO,MAAM,GAAG,WAAY,OAAO,EAAE,SACgB,CAAC;AAEtD,eAAO,MAAM,gBAAgB,aAAc,MAAM,GAAG,GAAG,QAQtD,CAAC"} \ No newline at end of file diff --git a/lib/cjs/utils.js b/lib/cjs/utils.js new file mode 100644 index 0000000..5120555 --- /dev/null +++ b/lib/cjs/utils.js @@ -0,0 +1,67 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.readJsonIfExists = exports.log = exports.getTime = exports.getDirname = exports.convertCamelToUpperSnakeCase = void 0; +const chalk_1 = __importDefault(require("chalk")); +const fs_1 = __importDefault(require("fs")); +const json5_1 = __importDefault(require("json5")); +const convertCamelToUpperSnakeCase = (str) => str.replace(/[A-Z]/g, (letter) => `_${letter}`).toUpperCase(); +exports.convertCamelToUpperSnakeCase = convertCamelToUpperSnakeCase; +/** + * From: https://www.webmanajemen.com/2022/05/use-import-meta-cjs.html + */ +const getDirname = () => { + // get the stack + const { stack } = new Error(); + // get the third line (the original invoker) + const invokeFileLine = (stack || "").split(`\n`)[2]; + // match the file url from file://(.+.(ts|js)) and get the first capturing group + const __filename = (invokeFileLine.match(/file:\/\/(.+.(ts|js))/) || + [])[1].slice(1); + // match the file URL from file://(.+)/ and get the first capturing group + // the (.+) is a greedy quantifier and will make the RegExp expand to the largest match + const __dirname = (invokeFileLine.match(/file:\/\/(.+)\//) || [])[1].slice(1); + return { __dirname, __filename }; +}; +exports.getDirname = getDirname; +const getTime = () => { + const now = new Date(), tzo = -now.getTimezoneOffset(), dif = tzo >= 0 ? "+" : "-", pad = (num) => { + const norm = Math.floor(Math.abs(num)); + return `${norm < 10 ? "0" : ""}${norm}`; + }; + return [ + now.getFullYear(), + "-", + pad(now.getMonth() + 1), + "-", + pad(now.getDate()), + "T", + pad(now.getHours()), + ":", + pad(now.getMinutes()), + ":", + pad(now.getSeconds()), + dif, + pad(tzo / 60), + ":", + pad(tzo % 60), + ].join(""); +}; +exports.getTime = getTime; +const log = (...msg) => console.log(`${chalk_1.default.grey(`${(0, exports.getTime)()}:`)} ${msg}`); +exports.log = log; +const readJsonIfExists = (filePath) => { + try { + return json5_1.default.parse(fs_1.default.readFileSync(filePath, { encoding: "utf8" })); + } + catch (err) { + // if no file, return empty object + if (err?.code === "ENOENT") + return {}; + throw err; + } +}; +exports.readJsonIfExists = readJsonIfExists; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLDRDQUFvQjtBQUNwQixrREFBMEI7QUFNbkIsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQzNELEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7QUFEbEQsUUFBQSw0QkFBNEIsZ0NBQ3NCO0FBRS9EOztHQUVHO0FBQ0ksTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO0lBQzlCLGdCQUFnQjtJQUNoQixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUM5Qiw0Q0FBNEM7SUFDNUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELGdGQUFnRjtJQUNoRixNQUFNLFVBQVUsR0FBRyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUM7UUFDaEUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pCLHlFQUF5RTtJQUN6RSwyRkFBMkY7SUFDM0YsTUFBTSxTQUFTLEdBQUcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBWlcsUUFBQSxVQUFVLGNBWXJCO0FBRUssTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO0lBQzNCLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLEVBQ3JCLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxFQUM5QixHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQzFCLEdBQUcsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUN6QyxDQUFDLENBQUM7SUFDSCxPQUFPO1FBQ04sR0FBRyxDQUFDLFdBQVcsRUFBRTtRQUNqQixHQUFHO1FBQ0gsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdkIsR0FBRztRQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEIsR0FBRztRQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkIsR0FBRztRQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDckIsR0FBRztRQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDckIsR0FBRztRQUNILEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsR0FBRztRQUNILEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO0tBQ2IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDWixDQUFDLENBQUM7QUF6QlcsUUFBQSxPQUFPLFdBeUJsQjtBQUVLLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFjLEVBQUUsRUFBRSxDQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsZUFBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUEsZUFBTyxHQUFFLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFEekMsUUFBQSxHQUFHLE9BQ3NDO0FBRS9DLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxRQUFzQixFQUFFLEVBQUU7SUFDMUQsSUFBSSxDQUFDO1FBQ0osT0FBTyxlQUFLLENBQUMsS0FBSyxDQUFDLFlBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNkLGtDQUFrQztRQUNsQyxJQUFLLEdBQXFCLEVBQUUsSUFBSSxLQUFLLFFBQVE7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN6RCxNQUFNLEdBQUcsQ0FBQztJQUNYLENBQUM7QUFDRixDQUFDLENBQUM7QUFSVyxRQUFBLGdCQUFnQixvQkFRM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQganNvbjUgZnJvbSBcImpzb241XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JXaXRoQ29kZSB7XG5cdGNvZGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRDYW1lbFRvVXBwZXJTbmFrZUNhc2UgPSAoc3RyOiBzdHJpbmcpID0+XG5cdHN0ci5yZXBsYWNlKC9bQS1aXS9nLCAobGV0dGVyKSA9PiBgXyR7bGV0dGVyfWApLnRvVXBwZXJDYXNlKCk7XG5cbi8qKlxuICogRnJvbTogaHR0cHM6Ly93d3cud2VibWFuYWplbWVuLmNvbS8yMDIyLzA1L3VzZS1pbXBvcnQtbWV0YS1janMuaHRtbFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGlybmFtZSA9ICgpID0+IHtcblx0Ly8gZ2V0IHRoZSBzdGFja1xuXHRjb25zdCB7IHN0YWNrIH0gPSBuZXcgRXJyb3IoKTtcblx0Ly8gZ2V0IHRoZSB0aGlyZCBsaW5lICh0aGUgb3JpZ2luYWwgaW52b2tlcilcblx0Y29uc3QgaW52b2tlRmlsZUxpbmUgPSAoc3RhY2sgfHwgXCJcIikuc3BsaXQoYFxcbmApWzJdO1xuXHQvLyBtYXRjaCB0aGUgZmlsZSB1cmwgZnJvbSBmaWxlOi8vKC4rLih0c3xqcykpIGFuZCBnZXQgdGhlIGZpcnN0IGNhcHR1cmluZyBncm91cFxuXHRjb25zdCBfX2ZpbGVuYW1lID0gKGludm9rZUZpbGVMaW5lLm1hdGNoKC9maWxlOlxcL1xcLyguKy4odHN8anMpKS8pIHx8XG5cdFx0W10pWzFdLnNsaWNlKDEpO1xuXHQvLyBtYXRjaCB0aGUgZmlsZSBVUkwgZnJvbSBmaWxlOi8vKC4rKS8gYW5kIGdldCB0aGUgZmlyc3QgY2FwdHVyaW5nIGdyb3VwXG5cdC8vICAgICB0aGUgKC4rKSBpcyBhIGdyZWVkeSBxdWFudGlmaWVyIGFuZCB3aWxsIG1ha2UgdGhlIFJlZ0V4cCBleHBhbmQgdG8gdGhlIGxhcmdlc3QgbWF0Y2hcblx0Y29uc3QgX19kaXJuYW1lID0gKGludm9rZUZpbGVMaW5lLm1hdGNoKC9maWxlOlxcL1xcLyguKylcXC8vKSB8fCBbXSlbMV0uc2xpY2UoMSk7XG5cdHJldHVybiB7IF9fZGlybmFtZSwgX19maWxlbmFtZSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRpbWUgPSAoKSA9PiB7XG5cdGNvbnN0IG5vdyA9IG5ldyBEYXRlKCksXG5cdFx0dHpvID0gLW5vdy5nZXRUaW1lem9uZU9mZnNldCgpLFxuXHRcdGRpZiA9IHR6byA+PSAwID8gXCIrXCIgOiBcIi1cIixcblx0XHRwYWQgPSAobnVtOiBudW1iZXIpID0+IHtcblx0XHRcdGNvbnN0IG5vcm0gPSBNYXRoLmZsb29yKE1hdGguYWJzKG51bSkpO1xuXHRcdFx0cmV0dXJuIGAke25vcm0gPCAxMCA/IFwiMFwiIDogXCJcIn0ke25vcm19YDtcblx0XHR9O1xuXHRyZXR1cm4gW1xuXHRcdG5vdy5nZXRGdWxsWWVhcigpLFxuXHRcdFwiLVwiLFxuXHRcdHBhZChub3cuZ2V0TW9udGgoKSArIDEpLFxuXHRcdFwiLVwiLFxuXHRcdHBhZChub3cuZ2V0RGF0ZSgpKSxcblx0XHRcIlRcIixcblx0XHRwYWQobm93LmdldEhvdXJzKCkpLFxuXHRcdFwiOlwiLFxuXHRcdHBhZChub3cuZ2V0TWludXRlcygpKSxcblx0XHRcIjpcIixcblx0XHRwYWQobm93LmdldFNlY29uZHMoKSksXG5cdFx0ZGlmLFxuXHRcdHBhZCh0em8gLyA2MCksXG5cdFx0XCI6XCIsXG5cdFx0cGFkKHR6byAlIDYwKSxcblx0XS5qb2luKFwiXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGxvZyA9ICguLi5tc2c6IHVua25vd25bXSkgPT5cblx0Y29uc29sZS5sb2coYCR7Y2hhbGsuZ3JleShgJHtnZXRUaW1lKCl9OmApfSAke21zZ31gKTtcblxuZXhwb3J0IGNvbnN0IHJlYWRKc29uSWZFeGlzdHMgPSAoZmlsZVBhdGg6IHN0cmluZyB8IFVSTCkgPT4ge1xuXHR0cnkge1xuXHRcdHJldHVybiBqc29uNS5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pKTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gaWYgbm8gZmlsZSwgcmV0dXJuIGVtcHR5IG9iamVjdFxuXHRcdGlmICgoZXJyIGFzIEVycm9yV2l0aENvZGUpPy5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4ge307XG5cdFx0dGhyb3cgZXJyO1xuXHR9XG59O1xuIl19 \ No newline at end of file diff --git a/lib/esm/index.d.ts b/lib/esm/index.d.ts new file mode 100644 index 0000000..f154cdb --- /dev/null +++ b/lib/esm/index.d.ts @@ -0,0 +1,3 @@ +export * from "./utils.js"; +export { default as loadConfig } from "./loadConfig.js"; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/lib/esm/index.d.ts.map b/lib/esm/index.d.ts.map new file mode 100644 index 0000000..8124025 --- /dev/null +++ b/lib/esm/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC"} \ No newline at end of file diff --git a/lib/esm/index.js b/lib/esm/index.js new file mode 100644 index 0000000..ed45c8a --- /dev/null +++ b/lib/esm/index.js @@ -0,0 +1,24 @@ +"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.loadConfig = void 0; +__exportStar(require("./utils.js"), exports); +var loadConfig_js_1 = require("./loadConfig.js"); +Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return __importDefault(loadConfig_js_1).default; } }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBMkI7QUFDM0IsaURBQXdEO0FBQS9DLDRIQUFBLE9BQU8sT0FBYyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL3V0aWxzLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGxvYWRDb25maWcgfSBmcm9tIFwiLi9sb2FkQ29uZmlnLmpzXCI7XG4iXX0= \ No newline at end of file diff --git a/lib/esm/loadConfig.d.ts b/lib/esm/loadConfig.d.ts new file mode 100644 index 0000000..f7434fa --- /dev/null +++ b/lib/esm/loadConfig.d.ts @@ -0,0 +1,5 @@ +declare const _default: (opts: Partial, envKey: string, localDefaultFilePath?: string) => { + [x: string]: any; +}; +export default _default; +//# sourceMappingURL=loadConfig.d.ts.map \ No newline at end of file diff --git a/lib/esm/loadConfig.d.ts.map b/lib/esm/loadConfig.d.ts.map new file mode 100644 index 0000000..795eba3 --- /dev/null +++ b/lib/esm/loadConfig.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"loadConfig.d.ts","sourceRoot":"","sources":["../../src/loadConfig.ts"],"names":[],"mappings":"sDAUS,MAAM;;;AAFf,wBAyCE"} \ No newline at end of file diff --git a/lib/esm/loadConfig.js b/lib/esm/loadConfig.js new file mode 100644 index 0000000..7077409 --- /dev/null +++ b/lib/esm/loadConfig.js @@ -0,0 +1,43 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const path_1 = __importDefault(require("path")); +const utils_1 = require("./utils"); +exports.default = (opts, envKey, localDefaultFilePath = "") => { + const { env } = process, { __dirname } = (0, utils_1.getDirname)(), def = (0, utils_1.readJsonIfExists)(path_1.default.join(__dirname, localDefaultFilePath || "./defaults.json5")), + // gets value from ENV || options || defaults (in that order) + getVal = (envName) => { + const snakeEnvName = `${envKey}_${(0, utils_1.convertCamelToUpperSnakeCase)(envName)}`; + if (env[snakeEnvName]) + return env[snakeEnvName]; + if (opts[envName]) + return opts[envName]; + return def[envName]; + }, + // gets array from ENV || options || defaults (in that order) + getArray = (envName, optName = "") => { + let newEnvName; + if (optName === "") { + optName = envName; + newEnvName = (0, utils_1.convertCamelToUpperSnakeCase)(envName); + } + newEnvName = `${envKey}_${String(envName)}`; + if (env[newEnvName]) + return env?.[newEnvName]?.split(path_1.default.delimiter); + if (Array.isArray(opts[optName]) && opts[optName].length) + return opts[optName]; + return def[optName]; + }; + return { + ...Object.keys(def).reduce((acc, curr) => { + if (Array.isArray(def[curr])) + acc[curr] = getArray(curr); + else + acc[curr] = getVal(curr); + return acc; + }, {}), + }; +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZENvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2FkQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsZ0RBQXdCO0FBRXhCLG1DQUlpQjtBQUVqQixrQkFBZSxDQUNkLElBQWdCLEVBQ2hCLE1BQWMsRUFDZCxvQkFBb0IsR0FBRyxFQUFFLEVBQ3hCLEVBQUU7SUFDSCxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUN0QixFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUEsa0JBQVUsR0FBRSxFQUM1QixHQUFHLEdBQUcsSUFBQSx3QkFBZ0IsRUFDckIsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLElBQUksa0JBQWtCLENBQUMsQ0FDaEU7SUFDRCw2REFBNkQ7SUFDN0QsTUFBTSxHQUFHLENBQUMsT0FBZ0IsRUFBRSxFQUFFO1FBQzdCLE1BQU0sWUFBWSxHQUFHLEdBQUcsTUFBTSxJQUFJLElBQUEsb0NBQTRCLEVBQzdELE9BQWlCLENBQ2pCLEVBQUUsQ0FBQztRQUNKLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQztZQUFFLE9BQU8sR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFDRCw2REFBNkQ7SUFDN0QsUUFBUSxHQUFHLENBQUMsT0FBZ0IsRUFBRSxVQUF3QixFQUFFLEVBQUUsRUFBRTtRQUMzRCxJQUFJLFVBQVUsQ0FBQztRQUNmLElBQUksT0FBTyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDbEIsVUFBVSxHQUFHLElBQUEsb0NBQTRCLEVBQUMsT0FBaUIsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxVQUFVLEdBQUcsR0FBRyxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDNUMsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDO1lBQ2xCLE9BQU8sR0FBRyxFQUFFLENBQUMsVUFBOEIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxjQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFLLElBQUksQ0FBQyxPQUFPLENBQVEsQ0FBQyxNQUFNO1lBQy9ELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBd0IsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUM3RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBZSxDQUFDLENBQUM7O2dCQUMvRCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQWUsQ0FBQyxDQUFDO1lBQ3pDLE9BQU8sR0FBRyxDQUFDO1FBQ1osQ0FBQyxFQUFFLEVBQUUsQ0FBQztLQUNOLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQge1xuXHRjb252ZXJ0Q2FtZWxUb1VwcGVyU25ha2VDYXNlLFxuXHRnZXREaXJuYW1lLFxuXHRyZWFkSnNvbklmRXhpc3RzLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZGVmYXVsdCA8VD4oXG5cdG9wdHM6IFBhcnRpYWw8VD4sXG5cdGVudktleTogc3RyaW5nLFxuXHRsb2NhbERlZmF1bHRGaWxlUGF0aCA9IFwiXCJcbikgPT4ge1xuXHRjb25zdCB7IGVudiB9ID0gcHJvY2Vzcyxcblx0XHR7IF9fZGlybmFtZSB9ID0gZ2V0RGlybmFtZSgpLFxuXHRcdGRlZiA9IHJlYWRKc29uSWZFeGlzdHMoXG5cdFx0XHRwYXRoLmpvaW4oX19kaXJuYW1lLCBsb2NhbERlZmF1bHRGaWxlUGF0aCB8fCBcIi4vZGVmYXVsdHMuanNvbjVcIilcblx0XHQpLFxuXHRcdC8vIGdldHMgdmFsdWUgZnJvbSBFTlYgfHwgb3B0aW9ucyB8fCBkZWZhdWx0cyAoaW4gdGhhdCBvcmRlcilcblx0XHRnZXRWYWwgPSAoZW52TmFtZToga2V5b2YgVCkgPT4ge1xuXHRcdFx0Y29uc3Qgc25ha2VFbnZOYW1lID0gYCR7ZW52S2V5fV8ke2NvbnZlcnRDYW1lbFRvVXBwZXJTbmFrZUNhc2UoXG5cdFx0XHRcdGVudk5hbWUgYXMgc3RyaW5nXG5cdFx0XHQpfWA7XG5cdFx0XHRpZiAoZW52W3NuYWtlRW52TmFtZV0pIHJldHVybiBlbnZbc25ha2VFbnZOYW1lXTtcblx0XHRcdGlmIChvcHRzW2Vudk5hbWVdKSByZXR1cm4gb3B0c1tlbnZOYW1lXTtcblx0XHRcdHJldHVybiBkZWZbZW52TmFtZV07XG5cdFx0fSxcblx0XHQvLyBnZXRzIGFycmF5IGZyb20gRU5WIHx8IG9wdGlvbnMgfHwgZGVmYXVsdHMgKGluIHRoYXQgb3JkZXIpXG5cdFx0Z2V0QXJyYXkgPSAoZW52TmFtZToga2V5b2YgVCwgb3B0TmFtZToga2V5b2YgVCB8IFwiXCIgPSBcIlwiKSA9PiB7XG5cdFx0XHRsZXQgbmV3RW52TmFtZTtcblx0XHRcdGlmIChvcHROYW1lID09PSBcIlwiKSB7XG5cdFx0XHRcdG9wdE5hbWUgPSBlbnZOYW1lO1xuXHRcdFx0XHRuZXdFbnZOYW1lID0gY29udmVydENhbWVsVG9VcHBlclNuYWtlQ2FzZShlbnZOYW1lIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0XHRuZXdFbnZOYW1lID0gYCR7ZW52S2V5fV8ke1N0cmluZyhlbnZOYW1lKX1gO1xuXHRcdFx0aWYgKGVudltuZXdFbnZOYW1lXSlcblx0XHRcdFx0cmV0dXJuIGVudj8uW25ld0Vudk5hbWUgYXMga2V5b2YgdHlwZW9mIGVudl0/LnNwbGl0KHBhdGguZGVsaW1pdGVyKTtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KG9wdHNbb3B0TmFtZV0pICYmIChvcHRzW29wdE5hbWVdIGFzIFtdKS5sZW5ndGgpXG5cdFx0XHRcdHJldHVybiBvcHRzW29wdE5hbWVdO1xuXHRcdFx0cmV0dXJuIGRlZltvcHROYW1lXTtcblx0XHR9O1xuXG5cdHJldHVybiB7XG5cdFx0Li4uT2JqZWN0LmtleXMoZGVmKS5yZWR1Y2UoKGFjYzogUGFydGlhbDx0eXBlb2YgZGVmPiwgY3VycikgPT4ge1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoZGVmW2N1cnJdKSkgYWNjW2N1cnJdID0gZ2V0QXJyYXkoY3VyciBhcyBrZXlvZiBUKTtcblx0XHRcdGVsc2UgYWNjW2N1cnJdID0gZ2V0VmFsKGN1cnIgYXMga2V5b2YgVCk7XG5cdFx0XHRyZXR1cm4gYWNjO1xuXHRcdH0sIHt9KSxcblx0fTtcbn07XG4iXX0= \ No newline at end of file diff --git a/lib/esm/utils.d.ts b/lib/esm/utils.d.ts new file mode 100644 index 0000000..991d592 --- /dev/null +++ b/lib/esm/utils.d.ts @@ -0,0 +1,16 @@ +/// +export interface ErrorWithCode { + code: string; +} +export declare const convertCamelToUpperSnakeCase: (str: string) => string; +/** + * From: https://www.webmanajemen.com/2022/05/use-import-meta-cjs.html + */ +export declare const getDirname: () => { + __dirname: string; + __filename: string; +}; +export declare const getTime: () => string; +export declare const log: (...msg: unknown[]) => void; +export declare const readJsonIfExists: (filePath: string | URL) => any; +//# sourceMappingURL=utils.d.ts.map \ No newline at end of file diff --git a/lib/esm/utils.d.ts.map b/lib/esm/utils.d.ts.map new file mode 100644 index 0000000..5d0f3f3 --- /dev/null +++ b/lib/esm/utils.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";AAIA,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,4BAA4B,QAAS,MAAM,WACM,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,UAAU;;;CAYtB,CAAC;AAEF,eAAO,MAAM,OAAO,cAyBnB,CAAC;AAEF,eAAO,MAAM,GAAG,WAAY,OAAO,EAAE,SACgB,CAAC;AAEtD,eAAO,MAAM,gBAAgB,aAAc,MAAM,GAAG,GAAG,QAQtD,CAAC"} \ No newline at end of file diff --git a/lib/esm/utils.js b/lib/esm/utils.js new file mode 100644 index 0000000..5120555 --- /dev/null +++ b/lib/esm/utils.js @@ -0,0 +1,67 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.readJsonIfExists = exports.log = exports.getTime = exports.getDirname = exports.convertCamelToUpperSnakeCase = void 0; +const chalk_1 = __importDefault(require("chalk")); +const fs_1 = __importDefault(require("fs")); +const json5_1 = __importDefault(require("json5")); +const convertCamelToUpperSnakeCase = (str) => str.replace(/[A-Z]/g, (letter) => `_${letter}`).toUpperCase(); +exports.convertCamelToUpperSnakeCase = convertCamelToUpperSnakeCase; +/** + * From: https://www.webmanajemen.com/2022/05/use-import-meta-cjs.html + */ +const getDirname = () => { + // get the stack + const { stack } = new Error(); + // get the third line (the original invoker) + const invokeFileLine = (stack || "").split(`\n`)[2]; + // match the file url from file://(.+.(ts|js)) and get the first capturing group + const __filename = (invokeFileLine.match(/file:\/\/(.+.(ts|js))/) || + [])[1].slice(1); + // match the file URL from file://(.+)/ and get the first capturing group + // the (.+) is a greedy quantifier and will make the RegExp expand to the largest match + const __dirname = (invokeFileLine.match(/file:\/\/(.+)\//) || [])[1].slice(1); + return { __dirname, __filename }; +}; +exports.getDirname = getDirname; +const getTime = () => { + const now = new Date(), tzo = -now.getTimezoneOffset(), dif = tzo >= 0 ? "+" : "-", pad = (num) => { + const norm = Math.floor(Math.abs(num)); + return `${norm < 10 ? "0" : ""}${norm}`; + }; + return [ + now.getFullYear(), + "-", + pad(now.getMonth() + 1), + "-", + pad(now.getDate()), + "T", + pad(now.getHours()), + ":", + pad(now.getMinutes()), + ":", + pad(now.getSeconds()), + dif, + pad(tzo / 60), + ":", + pad(tzo % 60), + ].join(""); +}; +exports.getTime = getTime; +const log = (...msg) => console.log(`${chalk_1.default.grey(`${(0, exports.getTime)()}:`)} ${msg}`); +exports.log = log; +const readJsonIfExists = (filePath) => { + try { + return json5_1.default.parse(fs_1.default.readFileSync(filePath, { encoding: "utf8" })); + } + catch (err) { + // if no file, return empty object + if (err?.code === "ENOENT") + return {}; + throw err; + } +}; +exports.readJsonIfExists = readJsonIfExists; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLDRDQUFvQjtBQUNwQixrREFBMEI7QUFNbkIsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQzNELEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7QUFEbEQsUUFBQSw0QkFBNEIsZ0NBQ3NCO0FBRS9EOztHQUVHO0FBQ0ksTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO0lBQzlCLGdCQUFnQjtJQUNoQixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUM5Qiw0Q0FBNEM7SUFDNUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELGdGQUFnRjtJQUNoRixNQUFNLFVBQVUsR0FBRyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUM7UUFDaEUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pCLHlFQUF5RTtJQUN6RSwyRkFBMkY7SUFDM0YsTUFBTSxTQUFTLEdBQUcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBWlcsUUFBQSxVQUFVLGNBWXJCO0FBRUssTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO0lBQzNCLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLEVBQ3JCLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxFQUM5QixHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQzFCLEdBQUcsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUN6QyxDQUFDLENBQUM7SUFDSCxPQUFPO1FBQ04sR0FBRyxDQUFDLFdBQVcsRUFBRTtRQUNqQixHQUFHO1FBQ0gsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdkIsR0FBRztRQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEIsR0FBRztRQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkIsR0FBRztRQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDckIsR0FBRztRQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDckIsR0FBRztRQUNILEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsR0FBRztRQUNILEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO0tBQ2IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDWixDQUFDLENBQUM7QUF6QlcsUUFBQSxPQUFPLFdBeUJsQjtBQUVLLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFjLEVBQUUsRUFBRSxDQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsZUFBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUEsZUFBTyxHQUFFLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFEekMsUUFBQSxHQUFHLE9BQ3NDO0FBRS9DLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxRQUFzQixFQUFFLEVBQUU7SUFDMUQsSUFBSSxDQUFDO1FBQ0osT0FBTyxlQUFLLENBQUMsS0FBSyxDQUFDLFlBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNkLGtDQUFrQztRQUNsQyxJQUFLLEdBQXFCLEVBQUUsSUFBSSxLQUFLLFFBQVE7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN6RCxNQUFNLEdBQUcsQ0FBQztJQUNYLENBQUM7QUFDRixDQUFDLENBQUM7QUFSVyxRQUFBLGdCQUFnQixvQkFRM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQganNvbjUgZnJvbSBcImpzb241XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JXaXRoQ29kZSB7XG5cdGNvZGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRDYW1lbFRvVXBwZXJTbmFrZUNhc2UgPSAoc3RyOiBzdHJpbmcpID0+XG5cdHN0ci5yZXBsYWNlKC9bQS1aXS9nLCAobGV0dGVyKSA9PiBgXyR7bGV0dGVyfWApLnRvVXBwZXJDYXNlKCk7XG5cbi8qKlxuICogRnJvbTogaHR0cHM6Ly93d3cud2VibWFuYWplbWVuLmNvbS8yMDIyLzA1L3VzZS1pbXBvcnQtbWV0YS1janMuaHRtbFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGlybmFtZSA9ICgpID0+IHtcblx0Ly8gZ2V0IHRoZSBzdGFja1xuXHRjb25zdCB7IHN0YWNrIH0gPSBuZXcgRXJyb3IoKTtcblx0Ly8gZ2V0IHRoZSB0aGlyZCBsaW5lICh0aGUgb3JpZ2luYWwgaW52b2tlcilcblx0Y29uc3QgaW52b2tlRmlsZUxpbmUgPSAoc3RhY2sgfHwgXCJcIikuc3BsaXQoYFxcbmApWzJdO1xuXHQvLyBtYXRjaCB0aGUgZmlsZSB1cmwgZnJvbSBmaWxlOi8vKC4rLih0c3xqcykpIGFuZCBnZXQgdGhlIGZpcnN0IGNhcHR1cmluZyBncm91cFxuXHRjb25zdCBfX2ZpbGVuYW1lID0gKGludm9rZUZpbGVMaW5lLm1hdGNoKC9maWxlOlxcL1xcLyguKy4odHN8anMpKS8pIHx8XG5cdFx0W10pWzFdLnNsaWNlKDEpO1xuXHQvLyBtYXRjaCB0aGUgZmlsZSBVUkwgZnJvbSBmaWxlOi8vKC4rKS8gYW5kIGdldCB0aGUgZmlyc3QgY2FwdHVyaW5nIGdyb3VwXG5cdC8vICAgICB0aGUgKC4rKSBpcyBhIGdyZWVkeSBxdWFudGlmaWVyIGFuZCB3aWxsIG1ha2UgdGhlIFJlZ0V4cCBleHBhbmQgdG8gdGhlIGxhcmdlc3QgbWF0Y2hcblx0Y29uc3QgX19kaXJuYW1lID0gKGludm9rZUZpbGVMaW5lLm1hdGNoKC9maWxlOlxcL1xcLyguKylcXC8vKSB8fCBbXSlbMV0uc2xpY2UoMSk7XG5cdHJldHVybiB7IF9fZGlybmFtZSwgX19maWxlbmFtZSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRpbWUgPSAoKSA9PiB7XG5cdGNvbnN0IG5vdyA9IG5ldyBEYXRlKCksXG5cdFx0dHpvID0gLW5vdy5nZXRUaW1lem9uZU9mZnNldCgpLFxuXHRcdGRpZiA9IHR6byA+PSAwID8gXCIrXCIgOiBcIi1cIixcblx0XHRwYWQgPSAobnVtOiBudW1iZXIpID0+IHtcblx0XHRcdGNvbnN0IG5vcm0gPSBNYXRoLmZsb29yKE1hdGguYWJzKG51bSkpO1xuXHRcdFx0cmV0dXJuIGAke25vcm0gPCAxMCA/IFwiMFwiIDogXCJcIn0ke25vcm19YDtcblx0XHR9O1xuXHRyZXR1cm4gW1xuXHRcdG5vdy5nZXRGdWxsWWVhcigpLFxuXHRcdFwiLVwiLFxuXHRcdHBhZChub3cuZ2V0TW9udGgoKSArIDEpLFxuXHRcdFwiLVwiLFxuXHRcdHBhZChub3cuZ2V0RGF0ZSgpKSxcblx0XHRcIlRcIixcblx0XHRwYWQobm93LmdldEhvdXJzKCkpLFxuXHRcdFwiOlwiLFxuXHRcdHBhZChub3cuZ2V0TWludXRlcygpKSxcblx0XHRcIjpcIixcblx0XHRwYWQobm93LmdldFNlY29uZHMoKSksXG5cdFx0ZGlmLFxuXHRcdHBhZCh0em8gLyA2MCksXG5cdFx0XCI6XCIsXG5cdFx0cGFkKHR6byAlIDYwKSxcblx0XS5qb2luKFwiXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGxvZyA9ICguLi5tc2c6IHVua25vd25bXSkgPT5cblx0Y29uc29sZS5sb2coYCR7Y2hhbGsuZ3JleShgJHtnZXRUaW1lKCl9OmApfSAke21zZ31gKTtcblxuZXhwb3J0IGNvbnN0IHJlYWRKc29uSWZFeGlzdHMgPSAoZmlsZVBhdGg6IHN0cmluZyB8IFVSTCkgPT4ge1xuXHR0cnkge1xuXHRcdHJldHVybiBqc29uNS5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pKTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gaWYgbm8gZmlsZSwgcmV0dXJuIGVtcHR5IG9iamVjdFxuXHRcdGlmICgoZXJyIGFzIEVycm9yV2l0aENvZGUpPy5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4ge307XG5cdFx0dGhyb3cgZXJyO1xuXHR9XG59O1xuIl19 \ No newline at end of file diff --git a/package.json b/package.json index 30a6a48..a9c5f00 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@itsericwoodward/utils", - "version": "0.1.2", + "version": "0.1.3", "description": "A small collection of common libraries and functions the author likes to use in his Node applications.", "main": "./lib/cjs/index.js", "module": "./lib/esm/index.js",