UNPKG

zod-config

Version:

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

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