UNPKG

zod-config

Version:

Load configuration variables from multiple sources with flexible adapters, ensuring type safety with Zod.

5 lines (4 loc) 4.17 kB
"use strict";var j=Object.create;var d=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var k=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var S=(e,r)=>{for(var t in r)d(e,t,{get:r[t],enumerable:!0})},x=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of T(r))!H.call(e,o)&&o!==t&&d(e,o,{get:()=>r[o],enumerable:!(n=I(r,o))||n.enumerable});return e};var g=(e,r,t)=>(t=e!=null?j(k(e)):{},x(r||!e||!e.__esModule?d(t,"default",{value:e,enumerable:!0}):t,e)),_=e=>x(d({},"__esModule",{value:!0}),e);var J={};S(J,{directoryAdapter:()=>z});module.exports=_(J);var O=g(require("assert")),y=g(require("path"));var V=(e,r)=>{if(e==null)return{};if(!p(e))throw new TypeError(`Cannot filter ${e} by prefix key as it is not a record-like object`);return Object.keys(e).filter(t=>t.startsWith(r)).reduce((t,n)=>(t[n]=e[n],t),{})},B=(e,r)=>{if(e==null)return{};if(!p(e))throw new TypeError(`Cannot filter ${e} by regex as it is not a record-like object`);return Object.keys(e).filter(t=>r.test(t)).reduce((t,n)=>(t[n]=e[n],t),{})};function u(e,...r){if(!r.length)return e;let t=r.shift();return t===void 0?e:(p(e)&&p(t)&&Object.keys(t).forEach(n=>{if(t[n]===void 0)return;if(!p(t[n])){e[n]=t[n];return}let o=e[n];if(!p(o)){e[n]=u({},t[n]);return}u(o,t[n])}),u(e,...r))}function p(e){return!e||typeof e!="object"?!1:Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null}function A(e,r){let{regex:t,prefixKey:n}=r;return t?B(e,t):n?V(e,n):e}function R(e){let r=new Map;for(let{extensions:t,adapterFactory:n}of e)for(let o of t){if(r.has(o))throw new Error(`Ambiguous adapter mapping for file extension ${o} - please ensure file extensions are specified at most once across all adapter specifiers.`);r.set(o,n)}return r}var $=require("os");function K(){let{NODE_CONFIG_ENV:e,NODE_ENV:r}=process.env;return e!==void 0?e:r!==void 0?r:"development"}function W(){let{NODE_APP_INSTANCE:e}=process.env;return e!==void 0?e:null}function w(){let{HOST:e,HOSTNAME:r}=process.env;return e!==void 0?e:r!==void 0?r:(0,$.hostname)()}function G(){let e=w(),r=e.indexOf(".");return r===-1?e:e.substring(0,r)}function C(){return{deploymentName:K(),instanceName:W(),hostname:w(),shortHostname:G()}}function P(){let{instanceName:e,deploymentName:r,shortHostname:t,hostname:n}=C();return e===null?["default",r,t,`${t}-${r}`,n,`${n}-${r}`,"local",`local-${r}`]:["default",`default-${e}`,r,`${r}-${e}`,t,`${t}-${r}`,`${t}-${e}`,`${t}-${r}-${e}`,n,`${n}-${r}`,`${n}-${e}`,`${n}-${r}-${e}`,"local",`local-${r}`,`local-${e}`,`local-${r}-${e}`]}var F=g(require("assert")),h=require("fs/promises"),m=require("path");async function E({path:e,allowedFilenames:r,allowedExtensions:t}){let n=await(0,h.readdir)(e),o=[];for(let i of n){let s=(0,m.extname)(i),f=(0,m.basename)(i,s);!r.includes(f)||!t.includes(s)||o.push({dir:e,name:f,ext:s})}return o}async function N({paths:e,allowedFilenames:r,allowedExtensions:t}){return Array.isArray(e)?(await Promise.all(e.map(o=>E({path:o,allowedFilenames:r,allowedExtensions:t})))).flat():await E({path:e,allowedFilenames:r,allowedExtensions:t})}function b(e,r,t){e.sort((n,o)=>{let i=r.indexOf(n.name),s=r.indexOf(o.name);if(i!==s)return i-s;if(n.dir===o.dir)return 0;(0,F.default)(Array.isArray(t));let f=t.indexOf(n.dir),c=t.indexOf(o.dir);return f-c})}var q="directory adapter",z=({paths:e,adapters:r,prefixKey:t,silent:n,regex:o})=>({name:q,read:async()=>{try{let i=R(Array.isArray(r)?r:[r]),s=P(),f=Array.from(i.keys()),c=await N({paths:e,allowedFilenames:s,allowedExtensions:f});b(c,s,e);let D=c.map(a=>{let l=i.get(a.ext);return(0,O.default)(l!==void 0),{...a,adapter:l(y.default.format(a))}}).map(async a=>{try{return await a.adapter.read()}catch(l){throw new Error(`Cannot read data from ${a.adapter.name} for ${y.default.format(a)}: ${l instanceof Error?l.message:l}`)}}),v=await Promise.all(D),M=u({},...v);return A(M,{prefixKey:t,regex:o})}catch(i){throw new Error(`Failed to read config from some of the following directories: - ${Array.isArray(e)?e.join(` - `):e} Reason: ${i instanceof Error?i.message:i}`)}},silent:n});0&&(module.exports={directoryAdapter});