UNPKG

zod-config

Version:

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

5 lines (4 loc) 3.52 kB
import F from"assert";import Z from"path";function s(e){return!e||typeof e!="object"?!1:Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null}function c(e,...n){if(!n.length)return e;let t=n.shift();return t===void 0?e:(s(e)&&s(t)&&Object.keys(t).forEach(r=>{if(t[r]===void 0)return;if(!s(t[r])){e[r]=t[r];return}let o=e[r];if(!s(o)){e[r]=c({},t[r]);return}c(o,t[r])}),c(e,...n))}function y(e,n){let{regex:t}=n;return t?T(e,t):e}var T=(e,n)=>{if(e==null)return{};if(!s(e))throw new TypeError(`Cannot filter ${e} by regex as it is not a record-like object`);return Object.keys(e).filter(t=>n.test(t)).reduce((t,r)=>(t[r]=e[r],t),{})};import{ZodDefault as Y,ZodObject as G,ZodOptional as J}from"zod/v3";import*as d from"zod/v4/core";var q={strict:m(e=>e),lenient:m(C)};function C(e){return e.replace(/[^a-z0-9]/gi,"").toLowerCase()}function m(e){return(n,t)=>e(n)===e(t)}function x(e){let n=new Map;for(let{extensions:t,adapterFactory:r}of e)for(let o of t){if(n.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.`);n.set(o,r)}return n}import{hostname as E}from"os";function z(){let{NODE_CONFIG_ENV:e,NODE_ENV:n}=process.env;return e!==void 0?e:n!==void 0?n:"development"}function D(){let{NODE_APP_INSTANCE:e}=process.env;return e!==void 0?e:null}function $(){let{HOST:e,HOSTNAME:n}=process.env;return e!==void 0?e:n!==void 0?n:E()}function k(){let e=$(),n=e.indexOf(".");return n===-1?e:e.substring(0,n)}function w(){return{deploymentName:z(),instanceName:D(),hostname:$(),shortHostname:k()}}function R(){let{instanceName:e,deploymentName:n,shortHostname:t,hostname:r}=w();return e===null?["default",n,t,`${t}-${n}`,r,`${r}-${n}`,"local",`local-${n}`]:["default",`default-${e}`,n,`${n}-${e}`,t,`${t}-${n}`,`${t}-${e}`,`${t}-${n}-${e}`,r,`${r}-${n}`,`${r}-${e}`,`${r}-${n}-${e}`,"local",`local-${n}`,`local-${e}`,`local-${n}-${e}`]}import N from"assert";import{readdir as M}from"fs/promises";import{basename as S,extname as v}from"path";async function b({path:e,allowedFilenames:n,allowedExtensions:t}){let r=await M(e),o=[];for(let a of r){let i=v(a),f=S(a,i);!n.includes(f)||!t.includes(i)||o.push({dir:e,name:f,ext:i})}return o}async function A({paths:e,allowedFilenames:n,allowedExtensions:t}){return Array.isArray(e)?(await Promise.all(e.map(o=>b({path:o,allowedFilenames:n,allowedExtensions:t})))).flat():await b({path:e,allowedFilenames:n,allowedExtensions:t})}function O(e,n,t){e.sort((r,o)=>{let a=n.indexOf(r.name),i=n.indexOf(o.name);if(a!==i)return a-i;if(r.dir===o.dir)return 0;N(Array.isArray(t));let f=t.indexOf(r.dir),l=t.indexOf(o.dir);return f-l})}var _="directory adapter",ke=({paths:e,adapters:n,regex:t,silent:r,keyMatching:o,transform:a})=>({name:_,read:async()=>{try{let i=x(Array.isArray(n)?n:[n]),f=R(),l=Array.from(i.keys()),g=await A({paths:e,allowedFilenames:f,allowedExtensions:l});O(g,f,e);let h=g.map(p=>{let u=i.get(p.ext);return F(u!==void 0),{...p,adapter:u(Z.format(p))}}).map(async p=>{try{return await p.adapter.read()}catch(u){throw new Error(`Cannot read data from ${p.adapter.name} for ${Z.format(p)}: ${u instanceof Error?u.message:u}`)}}),P=await Promise.all(h),j=c({},...P);return y(j,{regex:t})}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:r,keyMatching:o,transform:a});export{ke as directoryAdapter};