UNPKG

zod-config

Version:

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

5 lines (4 loc) 4.1 kB
"use strict";var D=Object.create;var d=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var v=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var H=(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 _(r))!k.call(e,o)&&o!==t&&d(e,o,{get:()=>r[o],enumerable:!(n=S(r,o))||n.enumerable});return e};var l=(e,r,t)=>(t=e!=null?D(v(e)):{},x(r||!e||!e.__esModule?d(t,"default",{value:e,enumerable:!0}):t,e)),I=e=>x(d({},"__esModule",{value:!0}),e);var q={};H(q,{directoryAdapter:()=>X});module.exports=I(q);var z=l(require("assert")),g=l(require("path"));function a(e){return!e||typeof e!="object"?!1:Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null}function u(e,...r){if(!r.length)return e;let t=r.shift();return t===void 0?e:(a(e)&&a(t)&&Object.keys(t).forEach(n=>{if(t[n]===void 0)return;if(!a(t[n])){e[n]=t[n];return}let o=e[n];if(!a(o)){e[n]=u({},t[n]);return}u(o,t[n])}),u(e,...r))}function A(e,r){let{regex:t}=r;return t?K(e,t):e}var K=(e,r)=>{if(e==null)return{};if(!a(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),{})};var V=require("zod/v3"),$=l(require("zod/v4/core"));var oe={strict:R(e=>e),lenient:R(B)};function B(e){return e.replace(/[^a-z0-9]/gi,"").toLowerCase()}function R(e){return(r,t)=>e(r)===e(t)}function b(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 w=require("os");function L(){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 O(){let{HOST:e,HOSTNAME:r}=process.env;return e!==void 0?e:r!==void 0?r:(0,w.hostname)()}function Y(){let e=O(),r=e.indexOf(".");return r===-1?e:e.substring(0,r)}function h(){return{deploymentName:L(),instanceName:W(),hostname:O(),shortHostname:Y()}}function P(){let{instanceName:e,deploymentName:r,shortHostname:t,hostname:n}=h();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 E=l(require("assert")),j=require("fs/promises"),m=require("path");async function C({path:e,allowedFilenames:r,allowedExtensions:t}){let n=await(0,j.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 T({paths:e,allowedFilenames:r,allowedExtensions:t}){return Array.isArray(e)?(await Promise.all(e.map(o=>C({path:o,allowedFilenames:r,allowedExtensions:t})))).flat():await C({path:e,allowedFilenames:r,allowedExtensions:t})}function Z(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,E.default)(Array.isArray(t));let f=t.indexOf(n.dir),y=t.indexOf(o.dir);return f-y})}var G="directory adapter",X=({paths:e,adapters:r,silent:t,regex:n})=>({name:G,read:async()=>{try{let o=b(Array.isArray(r)?r:[r]),i=P(),s=Array.from(o.keys()),f=await T({paths:e,allowedFilenames:i,allowedExtensions:s});Z(f,i,e);let F=f.map(p=>{let c=o.get(p.ext);return(0,z.default)(c!==void 0),{...p,adapter:c(g.default.format(p))}}).map(async p=>{try{return await p.adapter.read()}catch(c){throw new Error(`Cannot read data from ${p.adapter.name} for ${g.default.format(p)}: ${c instanceof Error?c.message:c}`)}}),M=await Promise.all(F),N=u({},...M);return A(N,{regex:n})}catch(o){throw new Error(`Failed to read config from some of the following directories: - ${Array.isArray(e)?e.join(` - `):e} Reason: ${o instanceof Error?o.message:o}`)}},silent:t});0&&(module.exports={directoryAdapter});