{"_id":"node-env-resolver","_rev":"23-8213a4914ad7c4d3310cab90665e7b50","name":"node-env-resolver","dist-tags":{"latest":"6.6.0"},"versions":{"0.0.0":{"name":"node-env-resolver","version":"0.0.0","keywords":["node","aws-secrets","local-env"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@0.0.0","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"dist":{"shasum":"8a0717812bccbaefe341154392f71f4a81c8c4d6","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-0.0.0.tgz","fileCount":18,"integrity":"sha512-Po7zHmmIjoakyPKyLL69xOj3YYUflfUp7vlXtxz2RGG9JkIV6D3bx3Ug3gwaYaGiLKbVPvXJNOky7kCc8L3sfA==","signatures":[{"sig":"MEQCIEKd0nZ/iPbldUShDNgs8/1vhJjzdu8z/XD8EAhX8LNsAiAqPxDNlQDLRWz8/jcoYuMgMGJChlR3pJprCbhBTNxi4w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":20984,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj1xLmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqgUg//T/9BbscwRreqDE08jBkB4eFmdhuUsow23qRyyOOf5D8vpnrW\r\nXJvTO1mC64CUgC1DGLi09gIIlVTsEKoV+CRCRTJVlNLXnZRaqosXXOsvWM9u\r\nj09Na0l+RQSUWLTj38Czxe6gBpFXetyqzetU9LUTnIyoGgg71wpD9B75k39g\r\nbQD2EbG4T23r9gQotvkMbflaZRXeyXOHwndcVnZ/ExjSaqS+37Zca/w1KolH\r\nnURLsQ2d3qtJkWilwz9aPPtzwWxq6O2+LLjslNZGVLD8l457HCqCtw5CBIZi\r\n+08eIz/UhzwLw95lzX+saUdUtFm06VghvpBPZhjaz8B9xav8c1qEBcHyjetb\r\nGchDdJw/t732AMKvOP4Xa4UhxTrO7M8pVq0dNvwVm2ChSDc7Nu7U4bSYeBMF\r\n8n9w4cSfkBpW4Spj/dvSuAXaueq/98ZiqsVygJoB4AokPqFjssluLgsZD3k6\r\nnY6mk0tuhO4vRCEmAYy7qpmToKfiWn7pw2h8D2U3gRbfIW9SWNBCBOs1XS30\r\nTWfXyaZ9LkMyIPy8SKmAmtPKhvjWEEoKcboNRmBfVs0RN8PktqFTQOOP+ghF\r\nv0ijTcE1URKcQzy0BGEr/Cn/bveNBUL+UXByUnYs6gDrzQ/F5Wt83UjU+rNY\r\nY+eBeMAouKO7JcHNKr7jDR4U/3RyJBKMfK4=\r\n=JqZ1\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./dist/index.js","_from":"file:node-env-resolver-0.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","scripts":{"lint":"eslint --ext .js,.ts ./src","test":"jest --coverage","build":"tsup","format":"prettier --ignore-path .gitignore --write \"**/*.+(js|ts|json)\"","release":"changeset publish","changeset":"changeset","prerelease":"npm run lint && npm run build && npm run test"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_resolved":"/private/var/folders/sp/__ydkqk53ss4hb4k3wbv1wbc0000gn/T/3728baa8fc591b0b007b97208cc8de37/node-env-resolver-0.0.0.tgz","_integrity":"sha512-Po7zHmmIjoakyPKyLL69xOj3YYUflfUp7vlXtxz2RGG9JkIV6D3bx3Ug3gwaYaGiLKbVPvXJNOky7kCc8L3sfA==","_npmVersion":"8.19.2","description":"Resolves environment variables for Node.js applications","directories":{},"_nodeVersion":"18.12.0","dependencies":{"zod":"^3.20.2","@aws-sdk/client-secrets-manager":"^3.259.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.4.1","tsup":"^6.5.0","eslint":"^8.33.0","ts-jest":"^29.0.5","prettier":"^2.8.3","typescript":"^4.9.4","@types/jest":"^29.4.0","@types/node":"^18.11.18","@changesets/cli":"^2.26.0","eslint-config-prettier":"^8.6.0","@typescript-eslint/parser":"^5.49.0","@typescript-eslint/eslint-plugin":"^5.49.0"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_0.0.0_1675039462522_0.0716740571962231","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"node-env-resolver","version":"1.0.0","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@1.0.0","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"dist":{"shasum":"5ff5c871059a1f9766e40b9f6c93735f5984e778","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-1.0.0.tgz","fileCount":47,"integrity":"sha512-5jhfVB1A7lGsPdjQZiSknar2GEmU/WJFkou9iWNYqva6gXXhpm7AvJ8glBTVQ0nh3zsYU1vRWmnC/eicsy3iNQ==","signatures":[{"sig":"MEUCIEuIlQGSzV5UMgEMdwWCWtQPOpkJYlvAlfZUXLQCE9F1AiEAkwgCrtNOgJWkza8fJbpf5l1C/v5nteuYibQP3J5/050=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72631},"main":"./dist/index.js","type":"module","_from":"file:node-env-resolver-1.0.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js"},"./standard-schema":{"types":"./dist/standard-schema.d.ts","import":"./dist/standard-schema.js"}},"scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup && tsc --emitDeclarationOnly","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_resolved":"/tmp/a383d050f625562f753b07bcda14e656/node-env-resolver-1.0.0.tgz","_integrity":"sha512-5jhfVB1A7lGsPdjQZiSknar2GEmU/WJFkou9iWNYqva6gXXhpm7AvJ8glBTVQ0nh3zsYU1vRWmnC/eicsy3iNQ==","_npmVersion":"10.9.3","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","dependencies":{"@standard-schema/spec":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.37.0","vitest":"^3.2.4","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.7.0","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.46.0","@typescript-eslint/eslint-plugin":"^8.46.0"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_1.0.0_1759824615694_0.027277227130730664","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"node-env-resolver","version":"1.1.0","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@1.1.0","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"dist":{"shasum":"a362a2b8fa398e6834860437f693b560c59562b8","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-1.1.0.tgz","fileCount":49,"integrity":"sha512-W1uEBwZz0zOWZg56mfbSGjXv8mPVLZKIhDDOgPI4Nt1RmaR1QZAdKf+Z70R+q5OrKJ9vJxJKjsnhtL/O0jM0EQ==","signatures":[{"sig":"MEYCIQCc8dUqnqEbZUlRNYlGQ1RE0PU5b2uPDF2T2QY38piEhQIhAPCYo+7VFEBnYgjpG4tCbLFdCIpIy+AHOifLVfDi/qNH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79531},"main":"./dist/index.js","type":"module","_from":"file:node-env-resolver-1.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js"},"./standard-schema":{"types":"./dist/standard-schema.d.ts","import":"./dist/standard-schema.js"}},"scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup && tsc --emitDeclarationOnly","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_resolved":"/tmp/603243ace16079679ea8b4297234c092/node-env-resolver-1.1.0.tgz","_integrity":"sha512-W1uEBwZz0zOWZg56mfbSGjXv8mPVLZKIhDDOgPI4Nt1RmaR1QZAdKf+Z70R+q5OrKJ9vJxJKjsnhtL/O0jM0EQ==","_npmVersion":"10.9.3","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","dependencies":{"@standard-schema/spec":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.37.0","vitest":"^3.2.4","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.7.0","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.46.0","@typescript-eslint/eslint-plugin":"^8.46.0"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_1.1.0_1759907490101_0.7484555599300566","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"node-env-resolver","version":"2.0.0","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@2.0.0","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"dist":{"shasum":"eeaf6d13b2396929f817a9132f04297ff40a1bb1","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-2.0.0.tgz","fileCount":51,"integrity":"sha512-eQk1GI4DOr5TDXRcAuOy3hPd878o8R1H51+FLIjKlFqtJwrQGUDvmXyplGaUAqHfaFEJ4J1X/SN5WU1YDnQasw==","signatures":[{"sig":"MEUCIDcjJ37UxYL9MLn8+ZxEZVWm9m62cJS9w/gYrTPFbSGPAiEAwuWEdb5UtNL7WorKgRLWUonbGd14iQrZuV5wfa7kb5A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96787},"main":"./dist/index.js","type":"module","_from":"file:node-env-resolver-2.0.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js"},"./standard-schema":{"types":"./dist/standard-schema.d.ts","import":"./dist/standard-schema.js"}},"scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup && tsc --emitDeclarationOnly","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_resolved":"/tmp/d5fbc252f60eceb4682cfaee5fa51e45/node-env-resolver-2.0.0.tgz","_integrity":"sha512-eQk1GI4DOr5TDXRcAuOy3hPd878o8R1H51+FLIjKlFqtJwrQGUDvmXyplGaUAqHfaFEJ4J1X/SN5WU1YDnQasw==","_npmVersion":"10.9.3","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.37.0","vitest":"^3.2.4","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.7.0","@standard-schema/spec":"^1.0.0","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.46.0","@typescript-eslint/eslint-plugin":"^8.46.0"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_2.0.0_1759961204279_0.24110805381340983","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"node-env-resolver","version":"2.0.1","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@2.0.1","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"dist":{"shasum":"b30423149cc09a4f2c11abdd46a1752f00f4058c","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-2.0.1.tgz","fileCount":53,"integrity":"sha512-F/8qMSlqYh/6fdWmY6LXPjc1taNNVMEx9Rr57ODsd/Abk7KO2dmXk0+Efq3gInUj7kPYhlzFgs1azJ8RWaDxkw==","signatures":[{"sig":"MEQCIFmydSwdQgxnTyntGI32rUKO2SPdoyD1ayPx1bKhOqq1AiAVYP86MbRvocKkWwplCF987N44OJHKnD+wOq1CD4Uo0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104144},"main":"./dist/index.js","type":"module","_from":"file:node-env-resolver-2.0.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js"},"./standard-schema":{"types":"./dist/standard-schema.d.ts","import":"./dist/standard-schema.js"}},"scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup && tsc --emitDeclarationOnly","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_resolved":"/tmp/f5a236ffdb89feefb9a55b2cb7b8d704/node-env-resolver-2.0.1.tgz","_integrity":"sha512-F/8qMSlqYh/6fdWmY6LXPjc1taNNVMEx9Rr57ODsd/Abk7KO2dmXk0+Efq3gInUj7kPYhlzFgs1azJ8RWaDxkw==","_npmVersion":"10.9.3","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.37.0","vitest":"^3.2.4","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.7.0","@standard-schema/spec":"^1.0.0","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.46.0","@typescript-eslint/eslint-plugin":"^8.46.0"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_2.0.1_1760082149380_0.2256351801295451","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"node-env-resolver","version":"3.0.0","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@3.0.0","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"dist":{"shasum":"dc00aa19b0c0122d20ad60bdddbc686de5e46e7d","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-3.0.0.tgz","fileCount":62,"integrity":"sha512-7bUPJmr8QEmO8hnGFY+K+PEfQWUGe+JFkL0C5hzoqZJlYwa8sqTExa31ff6uLcuBJPnlo+M1Wt4yjmEkCqK7jA==","signatures":[{"sig":"MEQCIHHspD0gnNyKYfxSKuVz3wT2/cN+bAtoEKeb53tww2GqAiBxLvyDOe8T40Uy63NS+JHI5c/obpj5LzatEBVktjB0gg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114602},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js"}},"gitHead":"dd870cf48654a926db274cd88cd3978a1b9b84ba","scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup && tsc --emitDeclarationOnly","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm build && pnpm type-check"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_npmVersion":"10.9.3","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.37.0","vitest":"^3.2.4","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.7.2","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.0","@typescript-eslint/parser":"^8.46.0","@typescript-eslint/eslint-plugin":"^8.46.0"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_3.0.0_1760313051847_0.48176067827320024","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"node-env-resolver","version":"3.0.1","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@3.0.1","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"dist":{"shasum":"93bed0597dd3214d3efd1560537d7eabcc1dd080","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-3.0.1.tgz","fileCount":75,"integrity":"sha512-s+15xiK325Fa0bM0cV5lJjI0B/ElqprMWaPCyjI61HfGkSq7EgkWBzohm5bl8n63umXPWD/z3XvVMuSUCybxQA==","signatures":[{"sig":"MEYCIQDy4UrUeW0hAeyBB9UGH095UPyke0HiXhb2UezewTVqbwIhAMhfRsjERzRHs9RiqfdMNpxC1mtf9/ifRxd05sAiH7hk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152837},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js"}},"gitHead":"dff6211a59cfa8baa75870baccc377c988acd336","scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup && tsc --emitDeclarationOnly","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm build && pnpm type-check"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_npmVersion":"10.9.3","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.37.0","vitest":"^3.2.4","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.7.2","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.0","@typescript-eslint/parser":"^8.46.0","@typescript-eslint/eslint-plugin":"^8.46.0"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_3.0.1_1760394543849_0.49390207737575964","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"node-env-resolver","version":"4.0.0","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@4.0.0","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"dist":{"shasum":"b4b8ce47d45d724b8c5c26b87c1ffe7b64e0d281","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-4.0.0.tgz","fileCount":98,"integrity":"sha512-yPQsWSf3/MIAPJ9bTeI11s2KPDCY8s0P6x7q+Cs3vwqrcu9j0mtkUkMaI9ilQNQTtCuKcqBqidOpT802Ahb3GQ==","signatures":[{"sig":"MEQCIB0nv5Vm9Pbno4jZMWzo1Oe8RjcW0xc1z3CNY+LOsJH3AiB+0a+g4o+0Cy3Ix0bo2QJgIN6LQZ6xICyWLoKMCOnxQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":216662},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js","require":"./dist/cli.cjs"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js","require":"./dist/web.cjs"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js","require":"./dist/zod.cjs"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js","require":"./dist/audit.cjs"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js","require":"./dist/types.cjs"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js","require":"./dist/utils.cjs"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js","require":"./dist/builder.cjs"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js","require":"./dist/valibot.cjs"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js","require":"./dist/resolver.cjs"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js","require":"./dist/resolvers.cjs"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js","require":"./dist/validators.cjs"}},"gitHead":"cfa1dd2c059a6edda6d0f4ab938ae98b3e09c5bc","scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup && tsc --emitDeclarationOnly","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm build && pnpm type-check"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_npmVersion":"10.9.3","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.37.0","vitest":"^3.2.4","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.7.2","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.0","@typescript-eslint/parser":"^8.46.1","@typescript-eslint/eslint-plugin":"^8.46.1"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_4.0.0_1760465343657_0.2604115306955783","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"node-env-resolver","version":"5.0.0","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@5.0.0","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"dist":{"shasum":"8e5454611afca3141408e6b5a898c60be5c21012","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-5.0.0.tgz","fileCount":66,"integrity":"sha512-+MXIkIe7BbGORGe2xQU74rs0Z9slRvLoQN2bS8zf+81yu9DgsItTKY84bJbedCS9bvZAb62opCzxbRPUzs1RHw==","signatures":[{"sig":"MEYCIQD/NQrKndv5QpOqUbzqX9zJPPRtmhjL8D2UZU5Ud9ch4AIhAN5PmOppI0EmFtZgyDS76YNfKJDYVwi+UlsRTrFCnqQO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258396},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js","require":"./dist/cli.cjs"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js","require":"./dist/web.cjs"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js","require":"./dist/zod.cjs"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js","require":"./dist/audit.cjs"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js","require":"./dist/types.cjs"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js","require":"./dist/utils.cjs"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js","require":"./dist/builder.cjs"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js","require":"./dist/valibot.cjs"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js","require":"./dist/resolver.cjs"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js","require":"./dist/resolvers.cjs"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js","require":"./dist/validators.cjs"}},"gitHead":"cf33cbd7cb43cdb0e486c60e51bc65db78be7b26","scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm build && pnpm type-check"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_npmVersion":"10.9.3","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.37.0","vitest":"^3.2.4","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.7.2","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.0","@typescript-eslint/parser":"^8.46.1","@typescript-eslint/eslint-plugin":"^8.46.1"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_5.0.0_1760573330455_0.3713491051372839","host":"s3://npm-registry-packages-npm-production"}},"5.0.1":{"name":"node-env-resolver","version":"5.0.1","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@5.0.1","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"dist":{"shasum":"c5115ab88ff5925af262624e9aa86227ee13ce84","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-5.0.1.tgz","fileCount":68,"integrity":"sha512-7OlljKFVew4B3Qaze1heJ6rIB4UWgJ4U/u/1OcwJoECKxFTwoO1HTlWtrS+vas0L3c4QMGOaWmrMz9j5fRP/hA==","signatures":[{"sig":"MEQCIHEgwVCR44JqaivMQDFosJc4QRewkFkJVATA1cyxQGDBAiBl2uo03amfIurd5q8avJg7MPv+1FXkA+cVXDrE08ZEsA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":254449},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js","require":"./dist/cli.cjs"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js","require":"./dist/web.cjs"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js","require":"./dist/zod.cjs"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js","require":"./dist/audit.cjs"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js","require":"./dist/types.cjs"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js","require":"./dist/utils.cjs"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js","require":"./dist/builder.cjs"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js","require":"./dist/valibot.cjs"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js","require":"./dist/resolver.cjs"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js","require":"./dist/resolvers.cjs"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js","require":"./dist/validators.cjs"}},"gitHead":"fa4be66b3606ad9316e4cce7f58a3e4b2aa9e523","scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm build && pnpm type-check"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_npmVersion":"10.9.3","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.37.0","vitest":"^3.2.4","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.7.2","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.0","@typescript-eslint/parser":"^8.46.1","@typescript-eslint/eslint-plugin":"^8.46.1"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_5.0.1_1760604204803_0.40321288533745636","host":"s3://npm-registry-packages-npm-production"}},"6.0.0":{"name":"node-env-resolver","version":"6.0.0","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@6.0.0","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"dist":{"shasum":"51cfbe44f9aa080e034049b11fb6dfb3ec1824fd","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-6.0.0.tgz","fileCount":68,"integrity":"sha512-6+zVj8V7q66adivZLfO5u3WiQbdhtKeu7mJnULs/wshMBoUOgKZIsUvL0PtM7Co0j4GIPVTwcOaOZP6GTinq2g==","signatures":[{"sig":"MEUCIDg6pDjhUp4TlT5s1kVCI9A6xPdrVhMmHN8T+oy/UEQtAiEAyfZs0MvpwVt1ZrOt+k/gDwXje9hQDdxlCjBZLB2q4qs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":286967},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js","require":"./dist/cli.cjs"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js","require":"./dist/web.cjs"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js","require":"./dist/zod.cjs"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js","require":"./dist/audit.cjs"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js","require":"./dist/types.cjs"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js","require":"./dist/utils.cjs"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js","require":"./dist/builder.cjs"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js","require":"./dist/valibot.cjs"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js","require":"./dist/resolver.cjs"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js","require":"./dist/resolvers.cjs"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js","require":"./dist/validators.cjs"}},"gitHead":"66a158e32f471b1d87155e6f936a335d82a50f58","scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm build && pnpm type-check"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_npmVersion":"10.9.3","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.37.0","vitest":"^3.2.4","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.7.2","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.0","@typescript-eslint/parser":"^8.46.1","@typescript-eslint/eslint-plugin":"^8.46.1"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_6.0.0_1760895564565_0.9849807825143078","host":"s3://npm-registry-packages-npm-production"}},"6.0.1":{"name":"node-env-resolver","version":"6.0.1","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@6.0.1","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"dist":{"shasum":"4a6c85d7c8d17344c15e56646a66fd2e55bbd7f3","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-6.0.1.tgz","fileCount":68,"integrity":"sha512-387KKYK/ZpdeLbWxreGvVe4d2YHQ92lZ6Fp0PqKSsjgG4fcOIfqpYUQvVXa7zzafYN4ZMWah54skXdZYcx0RBQ==","signatures":[{"sig":"MEUCIHhEunvhKnTLK5knBR55GJY+tBFn/rWmx9faFxjg2/EqAiEA4gSq1pPzw1rrKzaJWDkLAQ8TRtxzKsiBsZNdTjpsG80=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":287522},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js","default":"./dist/cli.js","require":"./dist/cli.cjs"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js","default":"./dist/web.js","require":"./dist/web.cjs"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js","default":"./dist/zod.js","require":"./dist/zod.cjs"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js","default":"./dist/audit.js","require":"./dist/audit.cjs"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js","default":"./dist/types.js","require":"./dist/types.cjs"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js","default":"./dist/utils.js","require":"./dist/utils.cjs"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js","default":"./dist/builder.js","require":"./dist/builder.cjs"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js","default":"./dist/valibot.js","require":"./dist/valibot.cjs"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js","default":"./dist/resolver.js","require":"./dist/resolver.cjs"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js","default":"./dist/resolvers.js","require":"./dist/resolvers.cjs"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js","default":"./dist/validators.js","require":"./dist/validators.cjs"}},"gitHead":"9acf5934bffa4493880d348e649f861711297087","scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm build && pnpm type-check"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_npmVersion":"10.9.4","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","eslint":"^9.37.0","vitest":"^3.2.4","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.7.2","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.0","@typescript-eslint/parser":"^8.46.1","@typescript-eslint/eslint-plugin":"^8.46.1"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_6.0.1_1762807789878_0.13332144886574948","host":"s3://npm-registry-packages-npm-production"}},"6.1.0":{"name":"node-env-resolver","version":"6.1.0","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@6.1.0","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"dist":{"shasum":"cf4af7733517a2c429702c1395baca93971fd01a","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-6.1.0.tgz","fileCount":68,"integrity":"sha512-fjHekPOgE++acSm0bfCe4u24EPMq3tgKjfHOOiTfZtGC+rp2bpuhSHKbi9eVS69cDw//YoVbWh4jtTprVgAz3Q==","signatures":[{"sig":"MEQCIGX1019ihT6FwBD1CwqBTkPhrryFM1jLLARx76/2P6jDAiBPUSt6b1EM15EPUoSOvJK/Htfa0m9kIlWt4S3lnywK5Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":294203},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js","default":"./dist/cli.js","require":"./dist/cli.cjs"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js","default":"./dist/web.js","require":"./dist/web.cjs"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js","default":"./dist/zod.js","require":"./dist/zod.cjs"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js","default":"./dist/audit.js","require":"./dist/audit.cjs"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js","default":"./dist/types.js","require":"./dist/types.cjs"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js","default":"./dist/utils.js","require":"./dist/utils.cjs"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js","default":"./dist/builder.js","require":"./dist/builder.cjs"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js","default":"./dist/valibot.js","require":"./dist/valibot.cjs"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js","default":"./dist/resolver.js","require":"./dist/resolver.cjs"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js","default":"./dist/resolvers.js","require":"./dist/resolvers.cjs"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js","default":"./dist/validators.js","require":"./dist/validators.cjs"}},"gitHead":"343535c687172ee35c300928334892418b41d42d","scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm build && pnpm type-check"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_npmVersion":"10.9.4","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.1","vitest":"^4.0.10","prettier":"^3.6.2","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/node":"^24.10.1","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.1","@typescript-eslint/parser":"^8.47.0","@typescript-eslint/eslint-plugin":"^8.47.0"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_6.1.0_1763506935397_0.05176075390852963","host":"s3://npm-registry-packages-npm-production"}},"6.1.1":{"name":"node-env-resolver","version":"6.1.1","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@6.1.1","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"dist":{"shasum":"77caf885814eb99ac4e0f639b7aa2ba77b21ffb2","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-6.1.1.tgz","fileCount":68,"integrity":"sha512-mUy5/oS5fg9PWn5zBVXQ6HQcTgn/KPXhWGqmMsgjGXEwPJXGH1jIKCvqEiVjzqE5WChs2TxMAkQZhFZQ6uvhFA==","signatures":[{"sig":"MEUCIQCnDfEJUZZwPD4foY0TV7nAO2Ljq/dS6bV7hAPpmTu+ZQIgZNXe+x3/CKQ4GKZvw5di2SvD2IszjuEJAAKb4Nn/3K0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":296405},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js","default":"./dist/cli.js","require":"./dist/cli.cjs"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js","default":"./dist/web.js","require":"./dist/web.cjs"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js","default":"./dist/zod.js","require":"./dist/zod.cjs"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js","default":"./dist/audit.js","require":"./dist/audit.cjs"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js","default":"./dist/types.js","require":"./dist/types.cjs"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js","default":"./dist/utils.js","require":"./dist/utils.cjs"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js","default":"./dist/builder.js","require":"./dist/builder.cjs"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js","default":"./dist/valibot.js","require":"./dist/valibot.cjs"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js","default":"./dist/resolver.js","require":"./dist/resolver.cjs"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js","default":"./dist/resolvers.js","require":"./dist/resolvers.cjs"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js","default":"./dist/validators.js","require":"./dist/validators.cjs"}},"gitHead":"6f7d0ea1798babe206f21d11f29d1d0b63a51fff","scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm build && pnpm type-check"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_npmVersion":"10.9.4","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.1","vitest":"^4.0.14","prettier":"^3.6.2","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/node":"^24.10.1","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.1","@typescript-eslint/parser":"^8.48.0","@typescript-eslint/eslint-plugin":"^8.48.0"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_6.1.1_1764163166845_0.09062688697164734","host":"s3://npm-registry-packages-npm-production"}},"6.2.1":{"name":"node-env-resolver","version":"6.2.1","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@6.2.1","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"homepage":"https://github.com/jagreehal/node-env-resolver#readme","bugs":{"url":"https://github.com/jagreehal/node-env-resolver/issues"},"dist":{"shasum":"20d6f2add3e3066f449d4081a91044f121a59639","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-6.2.1.tgz","fileCount":68,"integrity":"sha512-eAMM+iCuPom008bxtIXb8V43jW7iBiUaIGQjCk5JC2jyh2p9rfARpBQ+BVpCrBxQ9cgjlhRudODxCauE6Ayztw==","signatures":[{"sig":"MEQCIEu39SSdEV2tokGQgNc4Vz+Ij3mO1pVSi6/5+wCMFXiHAiBIalh/oPH4UpiSNdHdRFeNqn+/USYWJMCcaFgR7fHz3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-env-resolver@6.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":299579},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js","default":"./dist/cli.js","require":"./dist/cli.cjs"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js","default":"./dist/web.js","require":"./dist/web.cjs"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js","default":"./dist/zod.js","require":"./dist/zod.cjs"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js","default":"./dist/audit.js","require":"./dist/audit.cjs"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js","default":"./dist/types.js","require":"./dist/types.cjs"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js","default":"./dist/utils.js","require":"./dist/utils.cjs"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js","default":"./dist/builder.js","require":"./dist/builder.cjs"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js","default":"./dist/valibot.js","require":"./dist/valibot.cjs"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js","default":"./dist/resolver.js","require":"./dist/resolver.cjs"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js","default":"./dist/resolvers.js","require":"./dist/resolvers.cjs"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js","default":"./dist/validators.js","require":"./dist/validators.cjs"}},"gitHead":"0d0686bf2e30dc19ff09fed0a4cb57ed03c727dc","scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm build && pnpm type-check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1123929b-20f2-4d1b-997f-eb8a875ddc84"}},"repository":{"url":"git+https://github.com/jagreehal/node-env-resolver.git","type":"git","directory":"packages/node-env-resolver"},"_npmVersion":"11.7.0","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","publishConfig":{"access":"public"},"typesVersions":{"*":{"cli":["./dist/cli.d.ts"],"web":["./dist/web.d.ts"],"zod":["./dist/zod.d.ts"],"audit":["./dist/audit.d.ts"],"types":["./dist/types.d.ts"],"utils":["./dist/utils.d.ts"],"builder":["./dist/builder.d.ts"],"valibot":["./dist/valibot.d.ts"],"resolver":["./dist/resolver.d.ts"],"resolvers":["./dist/resolvers.d.ts"],"validators":["./dist/validators.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.1","vitest":"^4.0.15","prettier":"^3.7.4","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/node":"^25.0.0","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.1","@typescript-eslint/parser":"^8.49.0","@typescript-eslint/eslint-plugin":"^8.49.0"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_6.2.1_1765437982351_0.6278888538789957","host":"s3://npm-registry-packages-npm-production"}},"6.3.0":{"name":"node-env-resolver","version":"6.3.0","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@6.3.0","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"homepage":"https://github.com/jagreehal/node-env-resolver#readme","bugs":{"url":"https://github.com/jagreehal/node-env-resolver/issues"},"dist":{"shasum":"b5ccfe8fb50d9b6ebfd762863b9e3d1a9a11305c","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-6.3.0.tgz","fileCount":68,"integrity":"sha512-MwfTl82uvBXZNqEqsTELx7QlmYnVo2UIo8Er7xz4jwTankIzXpDXI7D/1jnRJBRBv+1JXVo+vEB4lfuxaE3KbQ==","signatures":[{"sig":"MEQCIHm+I846JbmFzjm9tPqamfub7bHB8Z7PSyIkZxxys+dzAiBy+hvYaO5iB/ZBH80lM0m4B9OO9Hi80ARewN0kqkrJ8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-env-resolver@6.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":300227},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js","default":"./dist/cli.js","require":"./dist/cli.cjs"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js","default":"./dist/web.js","require":"./dist/web.cjs"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js","default":"./dist/zod.js","require":"./dist/zod.cjs"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js","default":"./dist/audit.js","require":"./dist/audit.cjs"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js","default":"./dist/types.js","require":"./dist/types.cjs"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js","default":"./dist/utils.js","require":"./dist/utils.cjs"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js","default":"./dist/builder.js","require":"./dist/builder.cjs"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js","default":"./dist/valibot.js","require":"./dist/valibot.cjs"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js","default":"./dist/resolver.js","require":"./dist/resolver.cjs"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js","default":"./dist/resolvers.js","require":"./dist/resolvers.cjs"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js","default":"./dist/validators.js","require":"./dist/validators.cjs"}},"gitHead":"59db5e343e321f6fdd283987ce00449d175186ce","scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm build && pnpm type-check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1123929b-20f2-4d1b-997f-eb8a875ddc84"}},"repository":{"url":"git+https://github.com/jagreehal/node-env-resolver.git","type":"git","directory":"packages/node-env-resolver"},"_npmVersion":"11.7.0","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","publishConfig":{"access":"public"},"typesVersions":{"*":{"cli":["./dist/cli.d.ts"],"web":["./dist/web.d.ts"],"zod":["./dist/zod.d.ts"],"audit":["./dist/audit.d.ts"],"types":["./dist/types.d.ts"],"utils":["./dist/utils.d.ts"],"builder":["./dist/builder.d.ts"],"valibot":["./dist/valibot.d.ts"],"resolver":["./dist/resolver.d.ts"],"resolvers":["./dist/resolvers.d.ts"],"validators":["./dist/validators.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.2","vitest":"^4.0.15","prettier":"^3.7.4","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/node":"^25.0.2","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.1","@typescript-eslint/parser":"^8.50.0","@typescript-eslint/eslint-plugin":"^8.50.0"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_6.3.0_1765876692908_0.8868329059796005","host":"s3://npm-registry-packages-npm-production"}},"6.4.0":{"name":"node-env-resolver","version":"6.4.0","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@6.4.0","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"homepage":"https://github.com/jagreehal/node-env-resolver#readme","bugs":{"url":"https://github.com/jagreehal/node-env-resolver/issues"},"dist":{"shasum":"ee86d677722f5bd9500a43a1675c2757b4098a1f","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-6.4.0.tgz","fileCount":68,"integrity":"sha512-bcwy0MZSiAWbTiuGp97Tg0N7ULh9eAf8S/9epV+TaPn1YHXRtNT9Kb1BiDz/AaZ9qs0Bpfli7oxcqoxMqhj0Tw==","signatures":[{"sig":"MEYCIQCp+r13p7ow2k8K4XmoqGRjycR8RfZsTDEmVjavYsT5OwIhAK3TqHAvy13uUnrNE7EXVTNsMklXya3TLYfYQfscO8aa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-env-resolver@6.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":300715},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js","default":"./dist/cli.js","require":"./dist/cli.cjs"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js","default":"./dist/web.js","require":"./dist/web.cjs"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js","default":"./dist/zod.js","require":"./dist/zod.cjs"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js","default":"./dist/audit.js","require":"./dist/audit.cjs"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js","default":"./dist/types.js","require":"./dist/types.cjs"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js","default":"./dist/utils.js","require":"./dist/utils.cjs"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js","default":"./dist/builder.js","require":"./dist/builder.cjs"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js","default":"./dist/valibot.js","require":"./dist/valibot.cjs"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js","default":"./dist/resolver.js","require":"./dist/resolver.cjs"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js","default":"./dist/resolvers.js","require":"./dist/resolvers.cjs"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js","default":"./dist/validators.js","require":"./dist/validators.cjs"}},"gitHead":"a40e24bac258c6bfb6be8f67853fa3fc823122e7","scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm build && pnpm type-check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1123929b-20f2-4d1b-997f-eb8a875ddc84"}},"repository":{"url":"git+https://github.com/jagreehal/node-env-resolver.git","type":"git","directory":"packages/node-env-resolver"},"_npmVersion":"11.11.0","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"typesVersions":{"*":{"cli":["./dist/cli.d.ts"],"web":["./dist/web.d.ts"],"zod":["./dist/zod.d.ts"],"audit":["./dist/audit.d.ts"],"types":["./dist/types.d.ts"],"utils":["./dist/utils.d.ts"],"builder":["./dist/builder.d.ts"],"valibot":["./dist/valibot.d.ts"],"resolver":["./dist/resolver.d.ts"],"resolvers":["./dist/resolvers.d.ts"],"validators":["./dist/validators.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.0.2","vitest":"^4.0.18","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^25.3.3","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.1","@typescript-eslint/parser":"^8.56.1","@typescript-eslint/eslint-plugin":"^8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_6.4.0_1772579740845_0.43814172543735874","host":"s3://npm-registry-packages-npm-production"}},"6.5.0":{"name":"node-env-resolver","version":"6.5.0","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@6.5.0","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"homepage":"https://github.com/jagreehal/node-env-resolver#readme","bugs":{"url":"https://github.com/jagreehal/node-env-resolver/issues"},"bin":{"node-env-resolver":"dist/cli-main.js"},"dist":{"shasum":"73698db4712c1a72d0bc096939f60a0627f8f20f","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-6.5.0.tgz","fileCount":84,"integrity":"sha512-jWfZvoY+mfnsg1ScWg7S1afYAm/jzClXEuO4t76v3GmiuBUPKWNWI74LAFj7lk3TtqbOMsaDW5zVVlNrR790RA==","signatures":[{"sig":"MEQCIE36PSfUjyXSdgpGwemSgfFWSqdzhvlpR9VncfZnInnAAiAEw4GeBTJhPfbPPDltmWJUzvaOeVI/fdaDSG/u19torw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-env-resolver@6.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":351432},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js","default":"./dist/cli.js","require":"./dist/cli.cjs"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js","default":"./dist/web.js","require":"./dist/web.cjs"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js","default":"./dist/zod.js","require":"./dist/zod.cjs"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js","default":"./dist/audit.js","require":"./dist/audit.cjs"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js","default":"./dist/types.js","require":"./dist/types.cjs"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js","default":"./dist/utils.js","require":"./dist/utils.cjs"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js","default":"./dist/builder.js","require":"./dist/builder.cjs"},"./typegen":{"types":"./dist/typegen.d.ts","import":"./dist/typegen.js","default":"./dist/typegen.js","require":"./dist/typegen.cjs"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js","default":"./dist/valibot.js","require":"./dist/valibot.cjs"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js","default":"./dist/resolver.js","require":"./dist/resolver.cjs"},"./redaction":{"types":"./dist/redaction.d.ts","import":"./dist/redaction.js","default":"./dist/redaction.js","require":"./dist/redaction.cjs"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js","default":"./dist/resolvers.js","require":"./dist/resolvers.cjs"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js","default":"./dist/validators.js","require":"./dist/validators.cjs"}},"gitHead":"2d77500fed1f88aac6dd48bb53c377742bcf5571","scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm build && pnpm type-check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1123929b-20f2-4d1b-997f-eb8a875ddc84"}},"repository":{"url":"git+https://github.com/jagreehal/node-env-resolver.git","type":"git","directory":"packages/node-env-resolver"},"_npmVersion":"11.11.1","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"20.20.1","dependencies":{"ansis":"^4.2.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"cli":["./dist/cli.d.ts"],"web":["./dist/web.d.ts"],"zod":["./dist/zod.d.ts"],"audit":["./dist/audit.d.ts"],"types":["./dist/types.d.ts"],"utils":["./dist/utils.d.ts"],"builder":["./dist/builder.d.ts"],"typegen":["./dist/typegen.d.ts"],"valibot":["./dist/valibot.d.ts"],"resolver":["./dist/resolver.d.ts"],"redaction":["./dist/redaction.d.ts"],"resolvers":["./dist/resolvers.d.ts"],"validators":["./dist/validators.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.0.3","vitest":"^4.1.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^25.5.0","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.1","@typescript-eslint/parser":"^8.57.0","@typescript-eslint/eslint-plugin":"^8.57.0"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_6.5.0_1773771853626_0.33408452356092","host":"s3://npm-registry-packages-npm-production"}},"6.5.1":{"name":"node-env-resolver","version":"6.5.1","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@6.5.1","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"bin":{"node-env-resolver":"./dist/cli-main.js"},"dist":{"shasum":"e1b6c3b5d96f3d9ff2922d69a43ba1654b00374a","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-6.5.1.tgz","fileCount":88,"integrity":"sha512-AtNMIxRAYx9E8omI6VDI+z82ZCujB8VTw62E4hgN8XZifPK8Z8Oq40cqEevjvRXuR5kOBRqHFvZb2OpmlACGWw==","signatures":[{"sig":"MEYCIQDNc00sn/HcTAcpR4Ce/omYZl1B9raOjOUoLGgKcHXKTwIhAOQw5JeTH2rEE+CUKppXKEvuADLFRLwm0dz1OarAp8tV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-env-resolver@6.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4870521},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js","default":"./dist/cli.js","require":"./dist/cli.cjs"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js","default":"./dist/web.js","require":"./dist/web.cjs"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js","default":"./dist/zod.js","require":"./dist/zod.cjs"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js","default":"./dist/audit.js","require":"./dist/audit.cjs"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js","default":"./dist/types.js","require":"./dist/types.cjs"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js","default":"./dist/utils.js","require":"./dist/utils.cjs"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js","default":"./dist/builder.js","require":"./dist/builder.cjs"},"./typegen":{"types":"./dist/typegen.d.ts","import":"./dist/typegen.js","default":"./dist/typegen.js","require":"./dist/typegen.cjs"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js","default":"./dist/valibot.js","require":"./dist/valibot.cjs"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js","default":"./dist/resolver.js","require":"./dist/resolver.cjs"},"./redaction":{"types":"./dist/redaction.d.ts","import":"./dist/redaction.js","default":"./dist/redaction.js","require":"./dist/redaction.cjs"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js","default":"./dist/resolvers.js","require":"./dist/resolvers.cjs"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js","default":"./dist/validators.js","require":"./dist/validators.cjs"}},"scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","prepublishOnly":"pnpm build && pnpm type-check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:1123929b-20f2-4d1b-997f-eb8a875ddc84"}},"deprecated":"SECURITY: compromised supply-chain build (2026-06-04 worm) — do not use; upgrade to a known-good release.","repository":{"url":"https://github.com/jagreehal/node-env-resolver.git","type":"git","directory":"packages/node-env-resolver"},"description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"dependencies":{"ansis":"^4.2.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"cli":["./dist/cli.d.ts"],"web":["./dist/web.d.ts"],"zod":["./dist/zod.d.ts"],"audit":["./dist/audit.d.ts"],"types":["./dist/types.d.ts"],"utils":["./dist/utils.d.ts"],"builder":["./dist/builder.d.ts"],"typegen":["./dist/typegen.d.ts"],"valibot":["./dist/valibot.d.ts"],"resolver":["./dist/resolver.d.ts"],"redaction":["./dist/redaction.d.ts"],"resolvers":["./dist/resolvers.d.ts"],"validators":["./dist/validators.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.0.3","vitest":"^4.1.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^25.5.0","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.1","@typescript-eslint/parser":"^8.57.0","@typescript-eslint/eslint-plugin":"^8.57.0"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_6.5.1_1780532863707_0.21013420253149495","host":"s3://npm-registry-packages-npm-production"}},"6.5.2":{"name":"node-env-resolver","version":"6.5.2","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"url":"https://jagreehal.com","name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com"},"license":"MIT","_id":"node-env-resolver@6.5.2","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"homepage":"https://github.com/jagreehal/node-env-resolver#readme","bugs":{"url":"https://github.com/jagreehal/node-env-resolver/issues"},"bin":{"ner":"dist/cli/bin.js","node-env-resolver":"dist/cli/bin.js"},"dist":{"shasum":"c8cc7f6f9bcea661e1b0059df6b9aba535c74550","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-6.5.2.tgz","fileCount":80,"integrity":"sha512-5TfxDvQqT720HU11gzQzan1FQ6LZTAVvsYBcaboRpxp5IqnoJI14Jb+i0RRYq02AsuHc8oTTJgochcIyNV3K4g==","signatures":[{"sig":"MEUCIQCpx9si4n/SKqMfG/kdd3jxfnv+muuX2s+k5rp7GC39AgIgYkkoFSmvBUzMLm0fuSMV1FhQD9hvsKiL5noaHRFir5c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":394909},"main":"./dist/index.js","type":"module","_from":"file:node-env-resolver-6.5.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js","default":"./dist/cli.js","require":"./dist/cli.cjs"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js","default":"./dist/web.js","require":"./dist/web.cjs"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js","default":"./dist/zod.js","require":"./dist/zod.cjs"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js","default":"./dist/audit.js","require":"./dist/audit.cjs"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js","default":"./dist/types.js","require":"./dist/types.cjs"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js","default":"./dist/utils.js","require":"./dist/utils.cjs"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js","default":"./dist/builder.js","require":"./dist/builder.cjs"},"./runtime":{"types":"./dist/runtime/index.d.ts","import":"./dist/runtime/index.js","default":"./dist/runtime/index.js","require":"./dist/runtime/index.cjs"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js","default":"./dist/valibot.js","require":"./dist/valibot.cjs"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js","default":"./dist/resolver.js","require":"./dist/resolver.cjs"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js","default":"./dist/resolvers.js","require":"./dist/resolvers.cjs"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js","default":"./dist/validators.js","require":"./dist/validators.cjs"}},"scripts":{"lint":"eslint src/","test":"vitest run","build":"NODE_ENV=production tsup","format":"prettier --write \"**/*.{ts,tsx,md}\"","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"jagreehal","email":"jag.reehal@gmail.com"},"_resolved":"/private/var/folders/sp/__ydkqk53ss4hb4k3wbv1wbc0000gn/T/78e2300143df9d8ee1d675691b48e8c6/node-env-resolver-6.5.2.tgz","_integrity":"sha512-5TfxDvQqT720HU11gzQzan1FQ6LZTAVvsYBcaboRpxp5IqnoJI14Jb+i0RRYq02AsuHc8oTTJgochcIyNV3K4g==","repository":{"url":"git+https://github.com/jagreehal/node-env-resolver.git","type":"git","directory":"packages/node-env-resolver"},"_npmVersion":"11.13.0","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"typesVersions":{"*":{"cli":["./dist/cli.d.ts"],"web":["./dist/web.d.ts"],"zod":["./dist/zod.d.ts"],"audit":["./dist/audit.d.ts"],"types":["./dist/types.d.ts"],"utils":["./dist/utils.d.ts"],"builder":["./dist/builder.d.ts"],"runtime":["./dist/runtime/index.d.ts"],"valibot":["./dist/valibot.d.ts"],"resolver":["./dist/resolver.d.ts"],"resolvers":["./dist/resolvers.d.ts"],"validators":["./dist/validators.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.2.0","vitest":"^4.1.4","prettier":"^3.8.2","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/node":"^25.6.0","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.1","@typescript-eslint/parser":"^8.58.1","@typescript-eslint/eslint-plugin":"^8.58.1"},"_npmOperationalInternal":{"tmp":"tmp/node-env-resolver_6.5.2_1780866111469_0.20522008103842815","host":"s3://npm-registry-packages-npm-production"}},"6.6.0":{"name":"node-env-resolver","version":"6.6.0","description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","bin":{"ner":"dist/cli/bin.js","node-env-resolver":"dist/cli/bin.js"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs","default":"./dist/index.js"},"./builder":{"types":"./dist/builder.d.ts","import":"./dist/builder.js","require":"./dist/builder.cjs","default":"./dist/builder.js"},"./zod":{"types":"./dist/zod.d.ts","import":"./dist/zod.js","require":"./dist/zod.cjs","default":"./dist/zod.js"},"./valibot":{"types":"./dist/valibot.d.ts","import":"./dist/valibot.js","require":"./dist/valibot.cjs","default":"./dist/valibot.js"},"./web":{"types":"./dist/web.d.ts","import":"./dist/web.js","require":"./dist/web.cjs","default":"./dist/web.js"},"./resolvers":{"types":"./dist/resolvers.d.ts","import":"./dist/resolvers.js","require":"./dist/resolvers.cjs","default":"./dist/resolvers.js"},"./provider-kit":{"types":"./dist/provider-kit.d.ts","import":"./dist/provider-kit.js","require":"./dist/provider-kit.cjs","default":"./dist/provider-kit.js"},"./validators":{"types":"./dist/validators.d.ts","import":"./dist/validators.js","require":"./dist/validators.cjs","default":"./dist/validators.js"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.js","require":"./dist/utils.cjs","default":"./dist/utils.js"},"./cli":{"types":"./dist/cli.d.ts","import":"./dist/cli.js","require":"./dist/cli.cjs","default":"./dist/cli.js"},"./audit":{"types":"./dist/audit.d.ts","import":"./dist/audit.js","require":"./dist/audit.cjs","default":"./dist/audit.js"},"./resolver":{"types":"./dist/resolver.d.ts","import":"./dist/resolver.js","require":"./dist/resolver.cjs","default":"./dist/resolver.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js","require":"./dist/types.cjs","default":"./dist/types.js"},"./runtime":{"types":"./dist/runtime/index.d.ts","import":"./dist/runtime/index.js","require":"./dist/runtime/index.cjs","default":"./dist/runtime/index.js"}},"typesVersions":{"*":{"resolvers":["./dist/resolvers.d.ts"],"validators":["./dist/validators.d.ts"],"utils":["./dist/utils.d.ts"],"builder":["./dist/builder.d.ts"],"zod":["./dist/zod.d.ts"],"valibot":["./dist/valibot.d.ts"],"web":["./dist/web.d.ts"],"cli":["./dist/cli.d.ts"],"audit":["./dist/audit.d.ts"],"resolver":["./dist/resolver.d.ts"],"types":["./dist/types.d.ts"],"runtime":["./dist/runtime/index.d.ts"]}},"scripts":{"build":"NODE_ENV=production tsup","build:dev":"tsup","build:dts":"tsc --emitDeclarationOnly","type-check":"tsc -p tsconfig.json --noEmit","lint":"eslint src/","test":"vitest run","format":"prettier --write \"**/*.{ts,tsx,md}\"","prepublishOnly":"pnpm build && pnpm type-check"},"keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"author":{"name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com","url":"https://jagreehal.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/jagreehal/node-env-resolver.git","directory":"packages/node-env-resolver"},"sideEffects":false,"publishConfig":{"access":"public"},"engines":{"node":">=18"},"devDependencies":{"@eslint/js":"^10.0.1","@types/node":"^25.9.2","@typescript-eslint/eslint-plugin":"^8.60.1","@typescript-eslint/parser":"^8.60.1","eslint":"^10.4.1","eslint-config-prettier":"^10.1.8","eslint-plugin-import-zod":"^1.2.1","prettier":"^3.8.3","tsup":"^8.5.1","typescript":"^6.0.3","vitest":"^4.1.8"},"gitHead":"4aac5c23dc04cb28ce290da1f03417484b397f28","_id":"node-env-resolver@6.6.0","bugs":{"url":"https://github.com/jagreehal/node-env-resolver/issues"},"homepage":"https://github.com/jagreehal/node-env-resolver#readme","_nodeVersion":"20.20.2","_npmVersion":"11.16.0","dist":{"integrity":"sha512-crDmKoozJg3P0Ww2gLIBUQfclxzTk6ySzkaswvu5tLDWiGw3RVitzgwCXTDP9ksEcoSWSj6/A2cwQU5L6q6q/g==","shasum":"de8a6f7096bf9c9a45cbc491ddce2fa920033253","tarball":"https://registry.npmjs.org/node-env-resolver/-/node-env-resolver-6.6.0.tgz","fileCount":84,"unpackedSize":403375,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/node-env-resolver@6.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCv5P3mNTQVHJbHpR9/fEpc4WhxNQeofYgtJjtivfd6ZAIhAL65VSc3bAhuj+N0/KF+ibhqlgi0HsU/9e6TCZhmNo1h"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ac968908-7165-47e9-8ad5-fa4adfe734dd"}},"directories":{},"maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/node-env-resolver_6.6.0_1781157927797_0.6208004930138973"},"_hasShrinkwrap":false}},"time":{"created":"2023-01-30T00:44:22.432Z","modified":"2026-06-11T06:05:28.272Z","0.0.0":"2023-01-30T00:44:22.675Z","1.0.0":"2025-10-07T08:10:15.869Z","1.1.0":"2025-10-08T07:11:30.278Z","2.0.0":"2025-10-08T22:06:44.461Z","2.0.1":"2025-10-10T07:42:29.572Z","3.0.0":"2025-10-12T23:50:52.044Z","3.0.1":"2025-10-13T22:29:04.012Z","4.0.0":"2025-10-14T18:09:03.840Z","5.0.0":"2025-10-16T00:08:50.642Z","5.0.1":"2025-10-16T08:43:25.024Z","6.0.0":"2025-10-19T17:39:24.820Z","6.0.1":"2025-11-10T20:49:50.078Z","6.1.0":"2025-11-18T23:02:15.596Z","6.1.1":"2025-11-26T13:19:27.032Z","6.2.1":"2025-12-11T07:26:22.551Z","6.3.0":"2025-12-16T09:18:13.098Z","6.4.0":"2026-03-03T23:15:41.005Z","6.5.0":"2026-03-17T18:24:13.813Z","6.5.1":"2026-06-04T00:27:43.928Z","6.5.2":"2026-06-07T21:01:51.608Z","6.6.0":"2026-06-11T06:05:27.960Z"},"bugs":{"url":"https://github.com/jagreehal/node-env-resolver/issues"},"author":{"name":"Jagvinder Singh Reehal","email":"jag@jagreehal.com","url":"https://jagreehal.com"},"license":"MIT","homepage":"https://github.com/jagreehal/node-env-resolver#readme","keywords":["environment","env","config","typescript","aws-secrets","aws-ssm","vault","doppler","type-safe","tree-shaking","lambda","serverless"],"repository":{"type":"git","url":"git+https://github.com/jagreehal/node-env-resolver.git","directory":"packages/node-env-resolver"},"description":"Type-safe environment variable resolver with async resolvers - lightweight, tree-shakeable, no dependencies","maintainers":[{"name":"jagreehal","email":"jag.reehal@gmail.com"}],"readme":"# node-env-resolver\n\nType-safe environment variable resolution with zero dependencies and ultra-small bundle size.\n\n[![npm version](https://img.shields.io/npm/v/node-env-resolver)](https://www.npmjs.com/package/node-env-resolver)\n\n**Bundle Size:** ~6.3KB gzipped (core), code-splits for advanced features\n\n## Install\n\n```bash\nnpm install node-env-resolver\n```\n\n### TypeScript Configuration\n\nThis package uses modern [package.json `exports`](https://nodejs.org/api/packages.html#exports) for subpath imports (like `node-env-resolver/resolvers`). Your `tsconfig.json` must use a modern module resolution strategy.\n\n**What to change:**\n\nIf your `tsconfig.json` has:\n\n```json\n{\n  \"compilerOptions\": {\n    \"module\": \"CommonJS\",\n    \"moduleResolution\": \"node\"\n  }\n}\n```\n\n**Change it to:**\n\n```json\n{\n  \"compilerOptions\": {\n    \"module\": \"NodeNext\", // Changed from \"CommonJS\"\n    \"moduleResolution\": \"NodeNext\" // Changed from \"node\"\n  }\n}\n```\n\n**Alternative options:**\n\n- For bundler projects (Vite, Webpack, etc.): Use `\"moduleResolution\": \"bundler\"` (you can keep `\"module\": \"CommonJS\"` or use `\"ESNext\"`)\n- For Node.js projects: Use `\"moduleResolution\": \"node16\"` with `\"module\": \"node16\"`\n\n**Required values:** `\"node16\"`, `\"nodenext\"`, or `\"bundler\"`  \n**Not supported:** `\"node\"` (legacy resolution doesn't understand exports)\n\nIf you see module resolution errors, see the [Troubleshooting](#troubleshooting) section below.\n\n## Quick start (uses process.env)\n\n```ts\nimport { resolve } from 'node-env-resolver';\nimport { string } from 'node-env-resolver/validators';\nimport { protect } from 'node-env-resolver/runtime';\n\nconst config = resolve({\n  PORT: 3000,\n  NODE_ENV: ['development', 'production', 'test'] as const,\n  DEBUG: false,\n  API_KEY: string({ optional: true }),\n});\n\n// Redact secrets from all console output in one call\nconst unprotect = protect(config);\n\n// Resulting type (fully inferred):\n// type config = {\n//   PORT: number;\n//   NODE_ENV: 'development' | 'production' | 'test';\n//   DEBUG: boolean;\n//   API_KEY: string | undefined;\n// }\n\n// TypeScript knows the exact types:\nconfig.PORT; // number\nconfig.NODE_ENV; // 'development' | 'production' | 'test'\nconfig.DEBUG; // boolean\nconfig.API_KEY; // string | undefined\n```\n\n## Quick start (with custom resolvers)\n\n```ts\nimport { resolve, resolveAsync } from 'node-env-resolver';\nimport { processEnv, dotenv } from 'node-env-resolver/resolvers';\nimport { string, url, postgres, redis } from 'node-env-resolver/validators';\nimport { awsSecrets, gcpSecrets, vaultSecrets } from 'node-env-resolver-aws';\n\n// Synchronous with custom resolver (object syntax)\nconst config = resolve({\n  resolvers: [\n    [\n      dotenv(),\n      {\n        PORT: 3000,\n        NODE_ENV: ['development', 'production', 'test'] as const,\n        DEBUG: false,\n        API_KEY: string({ optional: true }),\n      },\n    ],\n  ],\n});\n\n// Asynchronous with any resolvers (both sync and async work!)\nconst config = await resolveAsync({\n  resolvers: [\n    [\n      dotenv(),\n      {\n        PORT: 3000,\n        NODE_ENV: ['development', 'production', 'test'] as const,\n        DEBUG: false,\n        API_KEY: string({ optional: true }),\n      },\n    ],\n    [awsSecrets(), { DATABASE_URL: url() }],\n  ],\n});\n\n// Resulting type (fully inferred):\n// type config = {\n//   PORT: number;\n//   NODE_ENV: 'development' | 'production' | 'test';\n//   DEBUG: boolean;\n//   API_KEY: string | undefined;\n//   DATABASE_URL: string;\n// }\n\n// Multiple resolvers with options\nconst config = await resolveAsync({\n  resolvers: [\n    [processEnv(), { PORT: 3000 }],\n    [dotenv(), { DATABASE_URL: postgres() }],\n    [awsSecrets(), { API_KEY: string() }],\n    [gcpSecrets(), { JWT_SECRET: string() }],\n    [vaultSecrets(), { REDIS_URL: redis() }],\n  ],\n  options: { priority: 'last' },\n});\n```\n\n## Table of Contents\n\n- [Install](#install)\n- [Quick start](#quick-start-uses-processenv)\n- [Quick start (with custom resolvers)](#quick-start-with-custom-resolvers)\n- [Basic usage](#basic-usage)\n  - [Required values](#required-values)\n  - [Default values](#default-values)\n  - [Optional values](#optional-values)\n  - [Enums](#enums)\n  - [Optional Enums](#optional-enums)\n- [Variable Naming Conventions](#variable-naming-conventions)\n- [Performance & Bundle Size](#performance--bundle-size)\n- [Custom validators](#custom-validators)\n- [Multiple sources](#multiple-sources)\n- [Safe error handling](#safe-error-handling)\n- [Synchronous resolution](#synchronous-resolution)\n- [Advanced features](#advanced-features)\n  - [TTL caching](#ttl-caching)\n  - [Polling remote config](#polling-remote-config)\n- [API Reference](#api-reference)\n- [Configuration Options](#configuration-options)\n- [Framework examples](#framework-examples)\n- [Security Policies](#security-policies)\n- [Audit Logging](#audit-logging)\n- [Error messages](#error-messages)\n- [Licence](#licence)\n\n## Basic usage\n\n### Required values\n\nIf an environment variable is missing and has no default, validation fails:\n\n```ts\nimport { resolve } from 'node-env-resolver';\nimport { postgres, string } from 'node-env-resolver/validators';\n\nconst config = resolve({\n  DATABASE_URL: postgres(), // Required PostgreSQL URL\n  API_KEY: string(), // Required\n});\n```\n\n### Default values\n\nProvide a default value to use when the environment variable is not set:\n\n```ts\nimport { resolve } from 'node-env-resolver';\n\nconst config = resolve({\n  PORT: 3000, // Defaults to 3000\n  DEBUG: false, // Defaults to false\n  LOG_LEVEL: 'info', // Defaults to 'info'\n});\n```\n\n### Optional values\n\nUse the `{optional: true}` option to make a value optional:\n\n```ts\nimport { string, url, number } from 'node-env-resolver/validators';\n\nconst config = resolve({\n  API_KEY: string({ optional: true }), // string | undefined\n  REDIS_URL: url({ optional: true }), // string | undefined\n  MAX_RETRIES: number({ optional: true }), // number | undefined\n});\n```\n\n### Enums\n\nUse arrays for enum validation:\n\n```ts\nimport { resolve } from 'node-env-resolver';\n\nconst config = resolve({\n  NODE_ENV: ['development', 'production', 'test'] as const,\n  LOG_LEVEL: ['debug', 'info', 'warn', 'error'] as const,\n});\n\n// TypeScript knows the exact types\nconfig.NODE_ENV; // 'development' | 'production' | 'test'\nconfig.LOG_LEVEL; // 'debug' | 'info' | 'warn' | 'error'\n```\n\n### Optional Enums\n\nMake enum values optional using the `optional()` wrapper or `enumOf()` function:\n\n```ts\nimport { resolve } from 'node-env-resolver';\nimport { optional, enumOf } from 'node-env-resolver/validators';\n\nconst config = resolve({\n  // Required enum (must be set to one of these values)\n  NODE_ENV: ['development', 'production', 'test'] as const,\n\n  // Optional enum - Method 1: optional() wrapper (clean syntax)\n  PROTOCOL: optional(['http', 'grpc'] as const),\n\n  // Optional enum - Method 2: enumOf() function (explicit)\n  LOG_LEVEL: enumOf(['error', 'warn', 'info', 'debug'] as const, {\n    optional: true,\n  }),\n\n  // Enum with default value\n  COMPRESSION: enumOf(['gzip', 'brotli', 'none'] as const, { default: 'gzip' }),\n});\n\n// TypeScript infers the correct types:\n// config.NODE_ENV: 'development' | 'production' | 'test'\n// config.PROTOCOL: 'http' | 'grpc' | undefined\n// config.LOG_LEVEL: 'error' | 'warn' | 'info' | 'debug' | undefined\n// config.COMPRESSION: 'gzip' | 'brotli' | 'none'\n```\n\n## Variable Naming Conventions\n\nThe library validates environment variable names to prevent shell errors and ensure cross-platform compatibility.\n\n### Supported Name Formats\n\nVariable names can use:\n\n- **Letters** (both uppercase and lowercase): `A-Z`, `a-z`\n- **Numbers** (not as first character): `0-9`\n- **Underscores**: `_`\n\n### Valid Examples\n\n```ts\nimport { resolve } from 'node-env-resolver';\nimport { string } from 'node-env-resolver/validators';\n\nconst config = resolve({\n  PORT: 3000, // ✅ SCREAMING_SNAKE_CASE (traditional)\n  port: 3000, // ✅ lowercase\n  myApiKey: string(), // ✅ camelCase\n  my_api_key: string(), // ✅ snake_case\n  API_KEY_V2: string(), // ✅ with numbers (not first char)\n  _PRIVATE: string(), // ✅ starting with underscore\n});\n```\n\n### Invalid Examples\n\n```ts\nimport { resolve } from 'node-env-resolver';\nimport { string } from 'node-env-resolver/validators';\n\nconst config = resolve({\n  '123PORT': 3000, // ❌ Starts with number\n  'API-KEY': string(), // ❌ Contains hyphen\n  'API.KEY': string(), // ❌ Contains dot\n  'API KEY': string(), // ❌ Contains space\n  'API@KEY': string(), // ❌ Special characters\n});\n```\n\n**Recommendation:** While all formats are supported, **SCREAMING_SNAKE_CASE** (e.g., `DATABASE_URL`, `API_KEY`) is the most common convention for environment variables and ensures maximum compatibility with legacy systems.\n\n**Validation pattern:** `/^[A-Za-z_][A-Za-z0-9_]*$/`\n\n## Performance & Bundle Size\n\n**Lightweight** The core library is **~4.3KB gzipped** with validation and resolver capabilities - **optimized for minimal bundle impact**.\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { processEnv, dotenv, json } from 'node-env-resolver/resolvers';\nimport { postgres, string, redis } from 'node-env-resolver/validators';\nimport { awsSecrets } from 'node-env-resolver-aws';\n\nconst config = await resolveAsync({\n  resolvers: [\n    [processEnv(), { PORT: 3000 }],\n    [dotenv(), { DATABASE_URL: postgres() }],\n    [awsSecrets(), { API_KEY: string() }],\n  ],\n  // Perfect for complex microservice architectures!\n});\n```\n\n**Benefits:**\n\n- **No artificial limits** - use as many resolvers as needed\n- **Better type inference** - proper schema merging with full TypeScript support\n- **Cleaner code** - single implementation instead of multiple overloads\n- **Future-proof** - automatically supports new resolver types\n\n### Efficient validation architecture\n\nThe library uses a two-tier validation strategy with lazy-loaded validators:\n\n**Basic types** (~6.3KB core - inline validation):\n\n- `string`, `number`, `boolean` (with min/max validation)\n- `enum` (array validation)\n- `pattern` (regex validation)\n- `custom` (validator functions)\n\n**Advanced types** (+1KB when used - lazy-loaded):\n\n- Database URLs: `postgres`, `mysql`, `mongodb`, `redis`\n- Web types: `http`, `https`, `url`, `email`\n- Format types: `json`, `date`, `timestamp`, `port`\n\nAdvanced validators are lazy-loaded only when you use them, keeping the base bundle minimal. All types work both synchronously and asynchronously:\n\n```ts\nimport { resolve, resolveAsync } from 'node-env-resolver';\nimport { postgres, url } from 'node-env-resolver/validators';\nimport { awsSecrets } from 'node-env-resolver-aws';\n\n// Synchronous - works with all types\nconst config = resolve({\n  PORT: 3000,\n  DATABASE_URL: postgres(),\n  API_URL: url(),\n  NODE_ENV: ['development', 'production'] as const,\n});\n\n// Also works with async resolvers\nconst config = await resolveAsync({\n  resolvers: [[awsSecrets(), { DATABASE_URL: postgres(), API_URL: url() }]],\n});\n```\n\n### What's in the 6.3KB core?\n\n- Core resolver logic (async/sync resolution)\n- Schema normalization & type coercion\n- Basic validation (string, number, boolean, enum, pattern, custom)\n- Interpolation & policy checking\n- Provenance tracking & error handling\n\n### Code Splitting Architecture\n\nThe library uses intelligent code splitting to keep the core minimal:\n\n- **Advanced validators** (~1KB): Lazy-loaded when using types like `url`, `email`, `postgres`\n- **Audit logging** (~150 bytes): Lazy-loaded when `enableAudit: true`\n- **dotenv parser** (~1.6KB): Separate import from `'node-env-resolver/resolvers'`\n- **Utility functions** (~1KB): Separate import from `'node-env-resolver/utils'`\n\nOnly the code you actually use gets loaded!\n\n### Audit Logging (Lazy Loaded)\n\nAudit logging is lazy-loaded only when enabled, keeping the base bundle minimal:\n\n```ts\nimport { resolve } from 'node-env-resolver';\n\n// Base bundle\nconst config = resolve({ PORT: 3000 });\n\n// Audit module loaded when enabled\nconst config = resolve({ PORT: 3000 }, { enableAudit: true });\n```\n\n### Optimized Module Structure\n\nImport only what you need for optimal bundle size:\n\n```ts\n// Core (~6.3KB) - Main API\nimport { resolve, safeResolve } from 'node-env-resolver';\n\n// Resolvers (separate chunk) - .env file parsing\nimport { processEnv, dotenv } from 'node-env-resolver/resolvers';\n\n// Utils (separate chunk) - caching & retry logic\nimport { cached, retry, TTL, awsCache } from 'node-env-resolver/utils';\n\n// Validators (separate chunk) - reusable validation functions\nimport { url, email } from 'node-env-resolver/validators';\n\n// Integrations (separate packages)\nimport { resolveZod } from 'node-env-resolver/zod';\nimport { resolveValibot } from 'node-env-resolver/valibot';\nimport { awsSecrets } from 'node-env-resolver-aws';\n```\n\n**Most apps only need the core (~6.3KB)!**\n\n## Custom validators\n\nWrite your own validation functions:\n\n```ts\nimport { resolve } from 'node-env-resolver';\n\nconst isValidPort = (value: string): number => {\n  const port = parseInt(value, 10);\n  if (isNaN(port) || port < 1 || port > 65535) {\n    throw new Error('Port must be between 1 and 65535');\n  }\n  return port;\n};\n\nconst isValidEmail = (value: string): string => {\n  if (!value.includes('@')) {\n    throw new Error('Invalid email address');\n  }\n  return value.toLowerCase();\n};\n\nconst config = resolve({\n  CUSTOM_PORT: isValidPort,\n  ADMIN_EMAIL: isValidEmail,\n});\n```\n\n### Reusing built-in validators\n\nFor advanced use cases, you can import and compose the built-in validation functions:\n\n```ts\nimport { resolve } from 'node-env-resolver';\nimport { url, email } from 'node-env-resolver/validators';\n\nconst validateMarketingUrl = (value: string): string => {\n  // Reuse built-in URL validator\n  const result = url(value);\n  if (!result.valid) {\n    throw new Error(result.error || 'Invalid URL');\n  }\n\n  // Add custom business logic\n  if (!value.includes('marketing.example.com')) {\n    throw new Error('Must be a marketing domain URL');\n  }\n\n  return value;\n};\n\nconst config = resolve({\n  MARKETING_URL: validateMarketingUrl,\n});\n```\n\nAvailable validation functions: `validatePostgres`, `mysql`, `mongodb`, `redis`, `http`, `https`, `url`, `email`, `port`, `number`, `boolean`, `json`, `date`, `timestamp`.\n\n## Multiple sources\n\nLoad configuration from multiple sources. By default, later sources override earlier ones:\n\n```ts\nimport { resolve, resolveAsync } from 'node-env-resolver';\nimport { processEnv, dotenv, json } from 'node-env-resolver/resolvers';\nimport { postgres, string, redis } from 'node-env-resolver/validators';\nimport { awsSecrets } from 'node-env-resolver-aws';\n\n// Async mode - supports both sync and async resolvers\nconst config = await resolveAsync({\n  resolvers: [\n    [\n      processEnv(),\n      {\n        PORT: 3000,\n        NODE_ENV: ['development', 'production'] as const,\n      },\n    ],\n    [\n      dotenv(),\n      {\n        DATABASE_URL: postgres(),\n        API_KEY: string(),\n      },\n    ],\n  ],\n});\n\n// Sync mode - supports multiple SYNC resolvers\nconst config = resolve({\n  resolvers: [\n    [dotenv(), { PORT: 3000 }],\n    [json('config.json'), { DATABASE_URL: postgres() }],\n  ],\n  // Both resolvers must have loadSync() method\n});\n\n// Support for ANY number of resolvers (3, 4, 5, 10+ resolvers!)\nconst config = await resolveAsync({\n  resolvers: [\n    [processEnv(), { PORT: 3000 }],\n    [dotenv(), { DATABASE_URL: postgres() }],\n    [awsSecrets(), { API_KEY: string() }],\n  ],\n  options: { priority: 'last' },\n});\n```\n\n### Controlling merge behaviour\n\nUse `priority` to control how resolvers merge values (works with both sync and async modes):\n\n```ts\nimport { resolve, resolveAsync } from 'node-env-resolver';\nimport { processEnv, dotenv, json } from 'node-env-resolver/resolvers';\nimport { postgres } from 'node-env-resolver/validators';\nimport { awsSecrets } from 'node-env-resolver-aws';\n\n// priority: 'last' (default) - later resolvers override earlier ones\nconst config = await resolveAsync({\n  resolvers: [\n    [processEnv(), { DATABASE_URL: postgres() }],\n    [awsSecrets(), { DATABASE_URL: postgres() }],\n  ],\n  // AWS wins\n});\n\n// priority: 'first' - earlier resolvers take precedence\nconst config = await resolveAsync({\n  resolvers: [\n    [dotenv(), { DATABASE_URL: postgres() }],\n    [awsSecrets(), { DATABASE_URL: postgres() }],\n  ],\n  options: { priority: 'first' },\n  // dotenv wins\n});\n\n// Also works with sync resolve()\nconst config = resolve({\n  resolvers: [\n    [dotenv(), { DATABASE_URL: postgres() }],\n    [json('config.json'), { DATABASE_URL: postgres() }],\n  ],\n  options: { priority: 'first' },\n  // dotenv wins\n});\n```\n\nThis is useful for development workflows where local overrides should take precedence over cloud secrets.\n\n### Performance optimizations\n\nThe library includes two automatic performance optimizations:\n\n#### 1. Early termination with `priority: 'first'`\n\nWhen using `priority: 'first'`, resolvers are called sequentially, but execution **stops early** once all required environment variables are satisfied:\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { dotenv } from 'node-env-resolver/resolvers';\nimport { postgres, string } from 'node-env-resolver/validators';\nimport { awsSecrets } from 'node-env-resolver-aws';\n\nconst config = await resolveAsync({\n  resolvers: [\n    [dotenv(), { DATABASE_URL: postgres(), API_KEY: string(), PORT: 3000 }],\n    [awsSecrets(), { DATABASE_URL: postgres(), API_KEY: string(), PORT: 3000 }],\n  ],\n  options: { priority: 'first' },\n});\n// If dotenv() provides all required keys, awsSecrets() is never called!\n```\n\nThis is particularly valuable in development where:\n\n- Local `.env` file contains all needed variables\n- Expensive remote resolver calls (AWS Secrets Manager, Parameter Store, GCP Secret Manager) are skipped\n- Startup time is significantly reduced\n\n**What counts as \"satisfied\"?**\n\n- Only **required** keys (no `optional: true`, no `default` value) trigger early termination\n- Optional variables and variables with defaults do **not** prevent calling remaining resolvers\n\n#### 2. Parallel execution with `priority: 'last'`\n\nWhen using `priority: 'last'` (the default), all resolvers are called **in parallel** for maximum performance:\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { postgres, string } from 'node-env-resolver/validators';\nimport { awsSecrets, awsSsm } from 'node-env-resolver-aws';\n\nconst config = await resolveAsync({\n  resolvers: [\n    [awsSecrets(), { DATABASE_URL: postgres() }], // 100ms\n    [awsSsm(), { API_KEY: string() }], // 100ms\n  ],\n  // Default: priority: 'last'\n});\n// Total time: ~100ms (parallel) instead of ~300ms (sequential)\n```\n\nSince `priority: 'last'` means \"last write wins\", the order doesn't matter for conflict resolution, so all resolvers can run concurrently.\n\n**Use cases:**\n\n- Production environments loading from multiple remote secret stores\n- Fetching different variables from different sources\n- Significant speedup when resolvers have network latency\n\n## Safe error handling\n\nLike Zod's `safeParse()`, use `safeResolve()` to get a result object instead of throwing:\n\n```ts\nimport { safeResolve, safeResolveAsync } from 'node-env-resolver';\nimport { number, postgres } from 'node-env-resolver/validators';\n\n// Synchronous safe resolve\nconst result = safeResolve({\n  PORT: number(),\n  DATABASE_URL: postgres(),\n});\n\n// Asynchronous safe resolve\nconst result = await safeResolveAsync({\n  resolvers: [\n    [processEnv(), { PORT: number() }],\n    [awsSecrets(), { DATABASE_URL: postgres() }],\n  ],\n});\n\nif (result.success) {\n  // Use result.data with full type safety\n  console.log(result.data.PORT);\n} else {\n  // Handle error gracefully\n  console.error(result.error);\n  process.exit(1);\n}\n```\n\nAll functions have safe variants:\n\n- `resolve()` → `safeResolve()` (both synchronous)\n- `resolveAsync()` → `safeResolveAsync()` (both async)\n\n## Synchronous resolution\n\n`resolve()` is **synchronous by default** when reading from `process.env`:\n\n```ts\nimport { resolve } from 'node-env-resolver';\nimport { string, url, postgres } from 'node-env-resolver/validators';\n\n// Synchronous - no await needed, works with ALL types\nconst config = resolve({\n  PORT: 3000,\n  NODE_ENV: ['development', 'production'] as const,\n  API_KEY: string(),\n  API_URL: url(), // Advanced types work synchronously!\n  DATABASE_URL: postgres(),\n  DEBUG: false,\n});\n```\n\n`resolveAsync()` is **async** when using custom resolvers:\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { processEnv, dotenv } from 'node-env-resolver/resolvers';\nimport { postgres, url } from 'node-env-resolver/validators';\n\n// Async - await required when using custom resolvers\nconst config = await resolveAsync({\n  resolvers: [\n    [processEnv(), { PORT: 3000 }],\n    [dotenv(), { DATABASE_URL: postgres(), API_URL: url() }],\n  ],\n});\n```\n\n## Advanced features\n\n### CLI\n\nThe `ner` CLI ships with the package. Install globally or run via `npx ner`.\n\n#### `ner scan` — secret scanner\n\nScans files for hardcoded secrets (Stripe keys, GitHub tokens, JWTs, DB connection strings, AWS keys, private keys, and more):\n\n```bash\n# Scan a directory\nner scan src/\n\n# Scan only git-staged files (ideal for pre-commit hooks)\nner scan --staged\n\n# Show surrounding line context\nner scan --context src/\n\n# Exclude patterns\nner scan --ignore \"fixtures\" --ignore \"\\.test\\.\" src/\n```\n\n**Pre-commit hook setup:**\n\n```bash\necho 'ner scan --staged' >> .git/hooks/pre-commit\nchmod +x .git/hooks/pre-commit\n```\n\n#### `ner run` — run with resolved env vars\n\nLoads a `.env` file, resolves any reference URIs, then spawns your command. No code changes needed in your app.\n\n```bash\n# Basic usage\nner run -- node server.js\n\n# Use a different env file\nner run --env .env.staging -- node deploy.js\n\n# Skip reference resolution (equivalent to node --env-file)\nner run --no-resolve -- node server.js\n\n# Warn if .env contains hardcoded secrets before running\nner run --scan -- node server.js\n```\n\n**Reference resolution** — the key differentiator from `node --env-file`:\n\n```bash\n# .env\nDATABASE_URL=aws-sm://prod/database-credentials\nAPI_KEY=aws-ssm://prod/payments/api-key\n```\n\n```bash\n# ner run resolves these before process start:\nner run -- node server.js\n# → DATABASE_URL and API_KEY injected as their real values\n```\n\nRequires `node-env-resolver-aws` for `aws-sm://` and `aws-ssm://` support:\n\n```bash\nnpm install node-env-resolver-aws\n```\n\n### Runtime Protection\n\nPrevent accidental secret leaks in console output and HTTP responses.\n\n#### One-call setup\n\n```ts\nimport { protect } from 'node-env-resolver/runtime';\n\nconst config = resolve({ DATABASE_URL: postgres(), API_KEY: string() });\n\n// Patches all console methods to redact secrets automatically\nconst unprotect = protect(config);\n\nconsole.log('DB:', config.DATABASE_URL); // DB: [REDACTED]\nconsole.log('Key:', config.API_KEY); // Key: [REDACTED]\n\n// Restore originals when done (e.g. in tests)\nunprotect();\n```\n\n**Options:**\n\n```ts\nprotect(config, {\n  console: {\n    methods: ['log', 'error', 'warn'], // which methods to patch (default: all)\n    enabled: true,\n  },\n  // console: false  — disable console patching entirely\n});\n```\n\n#### Response middleware (Express / Connect / Hono)\n\nIntercepts `res.end()` to scan outgoing responses for secret leaks:\n\n```ts\nimport { createResponseMiddleware } from 'node-env-resolver/runtime';\n\napp.use(createResponseMiddleware(config, { mode: 'redact' }));\n// mode: 'redact' — replace secrets in response body\n// mode: 'warn'   — log a warning, pass body through (default in production)\n// mode: 'throw'  — throw on any detected leak (default in development)\n```\n\n#### Edge runtime (Cloudflare Workers, Deno Deploy)\n\n```ts\nimport { wrapFetchResponse } from 'node-env-resolver/runtime';\n\nexport default {\n  async fetch(request: Request) {\n    const response = await handler(request);\n    return wrapFetchResponse(response, config, { mode: 'redact' });\n  },\n};\n```\n\n#### Low-level primitives\n\n```ts\nimport {\n  createRedactor,\n  extractSensitiveValues,\n  createConsoleRedactor,\n  scanBodyForSecrets,\n} from 'node-env-resolver/runtime';\n\n// Build a redactor from a config object\nconst secrets = extractSensitiveValues(config); // Map of sensitive key→value pairs\nconst redactor = createRedactor(secrets);\nredactor.redactString('key is sk_live_abc123'); // 'key is [REDACTED]'\nredactor.maskValue('super-secret'); // 'su****et'\nredactor.createFingerprint('secret'); // 'sha256:a1b2c3d4'\n\n// Scan a response body manually\nconst { safe, redacted } = scanBodyForSecrets(body, config);\n\n// Custom sensitive key patterns\nconst secrets2 = extractSensitiveValues(config, {\n  sensitiveKeys: ['MY_PREFIX'],\n});\n```\n\n### Computed fields\n\nDerive properties from resolved configuration:\n\n```ts\nimport { resolve } from 'node-env-resolver';\nimport { withComputed } from 'node-env-resolver/utils';\n\nconst config = resolve({\n  HOST: 'localhost',\n  PORT: 3000,\n  SSL_ENABLED: false,\n  NODE_ENV: ['development', 'production'] as const,\n});\n\n// Add computed properties\nconst appConfig = withComputed(config, {\n  // Build URLs from components\n  url: (c) => `${c.SSL_ENABLED ? 'https' : 'http'}://${c.HOST}:${c.PORT}`,\n\n  // Environment checks\n  isProd: (c) => c.NODE_ENV === 'production',\n  isDev: (c) => c.NODE_ENV === 'development',\n\n  // Complex derived config\n  serverOptions: (c) => ({\n    host: c.HOST,\n    port: c.PORT,\n    cors: c.NODE_ENV !== 'production',\n    compression: c.NODE_ENV === 'production',\n  }),\n});\n\nconsole.log(appConfig.url); // 'http://localhost:3000'\nconsole.log(appConfig.isProd); // false\nconsole.log(appConfig.serverOptions); // { host: 'localhost', ... }\n```\n\n**Common patterns:**\n\n```ts\n// Build database connection URLs\nwithComputed(config, {\n  databaseUrl: (c) =>\n    `postgres://${c.DB_USER}:${c.DB_PASSWORD}@${c.DB_HOST}:${c.DB_PORT}/${c.DB_NAME}`,\n});\n\n// Derive API endpoints\nwithComputed(config, {\n  endpoints: (c) => ({\n    users: `${c.API_BASE_URL}/${c.API_VERSION}/users`,\n    posts: `${c.API_BASE_URL}/${c.API_VERSION}/posts`,\n  }),\n});\n\n// Feature flags based on environment\nwithComputed(config, {\n  features: (c) => ({\n    analytics: c.ENABLE_ANALYTICS && c.NODE_ENV === 'production',\n    debug: c.NODE_ENV === 'development',\n  }),\n});\n```\n\n**Bundle size:** ~200 bytes (included in utils)\n\n### Zod integration\n\nUse Zod schemas for powerful validation:\n\n```ts\nimport { resolveZod } from 'node-env-resolver/zod';\nimport * as z from 'zod'; // ✅ Recommended import pattern (better tree-shaking)\n\nconst schema = z.object({\n  PORT: z.coerce.number().default(3000),\n  DATABASE_URL: z.string().url(),\n  NODE_ENV: z.enum(['development', 'production', 'test']),\n  DEBUG: z.coerce.boolean().optional(),\n});\n\nconst config = await resolveZod(schema);\n// config.PORT is number, config.DATABASE_URL is string, etc.\n```\n\n**Safe error handling** with field-level errors:\n\n```ts\nimport { safeResolveZod } from 'node-env-resolver/zod';\nimport * as z from 'zod';\n\nconst schema = z.object({\n  PORT: z.coerce.number(),\n  DATABASE_URL: z.string().url(),\n});\n\nconst result = await safeResolveZod(schema);\n\nif (result.success) {\n  console.log(result.data.PORT);\n} else {\n  console.error(result.error); // Summary message\n  result.issues.forEach((issue) => {\n    // Field-level details: path, message, code\n    console.log(`${issue.path.join('.')}: ${issue.message}`);\n  });\n}\n```\n\n**Available functions:**\n\n- `resolveZod()` - Async, throws on error\n- `safeResolveZod()` - Async, returns `{ success, data/error, issues }`\n- `resolveSyncZod()` - Sync, throws on error\n- `safeResolveSyncZod()` - Sync, returns `{ success, data/error, issues }`\n\n### Valibot integration\n\nUse Valibot for lightweight, modular validation:\n\n```ts\nimport { resolveValibot } from 'node-env-resolver/valibot';\nimport * as v from 'valibot'; // User imports valibot separately\n\nconst schema = v.object({\n  PORT: v.pipe(v.string(), v.transform(Number)),\n  DATABASE_URL: v.pipe(v.string(), v.url()),\n  NODE_ENV: v.picklist(['development', 'production', 'test']),\n  DEBUG: v.optional(v.pipe(v.string(), v.transform(Boolean))),\n});\n\nconst config = await resolveValibot(schema);\n```\n\n**Safe error handling** with unified error format:\n\n```ts\nimport { safeResolveValibot } from 'node-env-resolver/valibot';\nimport * as v from 'valibot';\n\nconst schema = v.object({\n  PORT: v.pipe(v.string(), v.transform(Number)),\n  DATABASE_URL: v.pipe(v.string(), v.url()),\n});\n\nconst result = await safeResolveValibot(schema);\n\nif (result.success) {\n  console.log(result.data.PORT);\n} else {\n  console.error(result.error); // Summary message\n  result.issues.forEach((issue) => {\n    // Same format as Zod - consistent across validators!\n    console.log(`${issue.path.join('.')}: ${issue.message}`);\n  });\n}\n```\n\n**Available functions:**\n\n- `resolveValibot()` - Async, throws on error\n- `safeResolveValibot()` - Async, returns `{ success, data/error, issues }`\n- `resolveSyncValibot()` - Sync, throws on error\n- `safeResolveSyncValibot()` - Sync, returns `{ success, data/error, issues }`\n\n**Why unified errors?** Switch between Zod and Valibot without changing error handling code!\n\n### Custom resolvers\n\nCreate resolvers to load configuration from any source:\n\n```ts\nimport { resolveAsync, type Resolver } from 'node-env-resolver';\nimport { processEnv } from 'node-env-resolver/resolvers';\nimport { string } from 'node-env-resolver/validators';\n\nconst databaseResolver: Resolver = {\n  name: 'database',\n  async load() {\n    const rows = await db.query('SELECT key, value FROM config');\n    return Object.fromEntries(rows.map((r) => [r.key, r.value]));\n  },\n};\n\nconst config = await resolveAsync({\n  resolvers: [\n    [processEnv(), { PORT: 3000 }],\n    [databaseResolver, { API_KEY: string() }],\n  ],\n});\n```\n\n### Built-in process-env references\n\nUse `process-env://...` when one config value should resolve from another environment variable.\nThis keeps reference-style config consistent across backends such as `process-env://`, `aws-sm://`, or `vault://`, without requiring a custom handler.\n`process-env` is built in, so no `references` object is required.\n\n```ts\nimport { resolve } from 'node-env-resolver';\nimport { string } from 'node-env-resolver/validators';\n\nprocess.env.API_KEY = 'real-secret-value';\nprocess.env.OPENAI_API_KEY = 'process-env://API_KEY';\n\nconst config = resolve(\n  {\n    OPENAI_API_KEY: string(),\n  },\n);\n\nconsole.log(config.OPENAI_API_KEY); // real-secret-value\n```\n\nThis keeps `OPENAI_API_KEY` from containing the raw secret directly, but it does not protect secrets from code that can already read `process.env`.\nFor stronger secret isolation, prefer an external secret backend such as AWS Secrets Manager or Vault.\n\n```env\nOPENAI_API_KEY=process-env://API_KEY\n```\n\nThis is useful when you want `OPENAI_API_KEY` to point at `API_KEY` without duplicating the raw value in the config entry.\n\n### AWS Secrets Manager & SSM\n\nInstall the AWS package:\n\n```bash\nnpm install node-env-resolver-aws\n```\n\n#### Reference URIs (recommended)\n\nStore references in your `.env` and resolve at startup — no AWS SDK imports needed in app code:\n\n```bash\n# .env\nDATABASE_URL=aws-sm://prod/database-credentials\nDB_PASSWORD=aws-sm://prod/database#password   # extract a JSON key\nAPI_KEY=aws-ssm://prod/payments/api-key\n```\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { dotenv } from 'node-env-resolver/resolvers';\nimport { postgres, string } from 'node-env-resolver/validators';\nimport {\n  createAwsSecretHandler,\n  createAwsSsmHandler,\n} from 'node-env-resolver-aws';\n\nconst config = await resolveAsync({\n  resolvers: [\n    [\n      dotenv(),\n      { DATABASE_URL: postgres(), DB_PASSWORD: string(), API_KEY: string() },\n    ],\n  ],\n  references: {\n    handlers: {\n      'aws-sm': createAwsSecretHandler({ region: 'us-east-1' }),\n      'aws-ssm': createAwsSsmHandler({ region: 'us-east-1' }),\n    },\n  },\n});\n```\n\nOr use the pre-configured singletons (picks up `AWS_REGION` from environment):\n\n```ts\nimport { awsSecretHandler, awsSsmHandler } from 'node-env-resolver-aws';\n\nconst config = await resolveAsync({\n  resolvers: [[dotenv(), schema]],\n  references: {\n    handlers: { 'aws-sm': awsSecretHandler, 'aws-ssm': awsSsmHandler },\n  },\n});\n```\n\nEach `createAwsSecretHandler()` / `createAwsSsmHandler()` call creates its own SDK client, so multi-region setups work correctly without interference.\n\n#### Resolver pattern (bulk load)\n\nLoads all keys from a secret or parameter path as a resolver:\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { processEnv } from 'node-env-resolver/resolvers';\nimport { postgres, string } from 'node-env-resolver/validators';\nimport { awsSecrets, awsSsm } from 'node-env-resolver-aws';\n\nconst config = await resolveAsync({\n  resolvers: [\n    [processEnv(), { PORT: 3000 }],\n    [awsSecrets({ secretId: 'app/secrets' }), { DATABASE_URL: postgres() }],\n    [awsSsm({ path: '/app/config' }), { API_KEY: string() }],\n  ],\n});\n```\n\nSee the [AWS package documentation](../node-env-resolver-aws/README.md) for credentials, caching, and best practices.\n\n### TTL caching\n\nCache expensive operations like AWS API calls:\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { cached, TTL } from 'node-env-resolver/utils';\nimport { postgres, string } from 'node-env-resolver/validators';\nimport { awsSecrets } from 'node-env-resolver-aws';\n\nexport const getConfig = async () => {\n  return await resolveAsync({\n    resolvers: [\n      [\n        cached(awsSecrets({ secretId: 'app/secrets' }), { ttl: TTL.minutes5 }),\n        {\n          DATABASE_URL: postgres(),\n          API_KEY: string(),\n        },\n      ],\n    ],\n  });\n};\n\n// Call getConfig() in your handlers\napp.get('/api/data', async (req, res) => {\n  const config = await getConfig(); // Fast after first call\n});\n```\n\nPerformance:\n\n- First call: ~200ms (loads from AWS)\n- Subsequent calls (< 5min): <1ms (cached)\n- After 5min: ~200ms (refresh from AWS)\n\n**Important:** Call `resolve()` every time. The `cached()` wrapper handles the caching.\n\n### Polling remote config\n\nUse `poll()` when you need to observe changes over time, such as re-reading AWS Secrets Manager on a schedule.\nIt is polling, not push-based events, so it fits cases where you want periodic refresh and change detection.\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { cached, poll } from 'node-env-resolver/utils';\nimport { postgres, string } from 'node-env-resolver/validators';\nimport { awsSecrets } from 'node-env-resolver-aws';\n\nexport const getConfig = async () => {\n  return resolveAsync({\n    resolvers: [\n      [\n        cached(awsSecrets({ secretId: 'app/secrets' }), { ttl: 10_000 }),\n        {\n          DATABASE_URL: postgres(),\n          API_KEY: string(),\n        },\n      ],\n    ],\n  });\n};\n\nconst watcher = poll(getConfig, {\n  intervalMs: 10_000,\n  onChange: (next, previous) => {\n    console.log('Config updated', { previous, next });\n  },\n  onError: (error) => {\n    console.error('Polling failed', error);\n  },\n});\n\n// Read the last loaded value whenever you need it.\nconsole.log(watcher.getCurrent());\n\n// Stop polling during shutdown.\nprocess.on('SIGINT', () => watcher.stop());\n```\n\n**When to use this:**\n\n- You need to detect config changes without restarting the process\n- You want a small, explicit polling loop instead of an event system\n- You are reading from a remote source that changes on a schedule\n\n**When not to use this:**\n\n- You only need startup-time validation\n- You want push notifications from a backend that already supports events\n- You are on the Next.js config path, which must stay synchronous\n\n**Advanced caching options:**\n\n```ts\nimport { cached, TTL } from 'node-env-resolver/utils';\n\n// Stale-while-revalidate: serve stale data while refreshing in background\nconst resolver = cached(awsSecrets(), {\n  ttl: TTL.minutes5, // Fresh for 5 minutes\n  maxAge: TTL.hour, // Force refresh after 1 hour\n  staleWhileRevalidate: true, // Serve stale data during refresh\n});\n\n// Custom cache key for debugging\nconst resolver = cached(awsSecrets(), {\n  ttl: TTL.minutes15,\n  key: 'prod-secrets-v2',\n});\n```\n\n## API Reference\n\n### Function variants\n\n| Function             | Behaviour                    | Use case                                     |\n| -------------------- | ---------------------------- | -------------------------------------------- |\n| `resolve()`          | Sync, throws on error        | Most applications (reading from process.env) |\n| `safeResolve()`      | Sync, returns result object  | Graceful error handling                      |\n| `resolveAsync()`     | Async, throws on error       | Multiple sources (dotenv, AWS, etc.)         |\n| `safeResolveAsync()` | Async, returns result object | Multiple sources with error handling         |\n\n### Resolver API Reference\n\nImport resolver functions from `'node-env-resolver/resolvers'`:\n\n```ts\nimport {\n  string,\n  number,\n  boolean,\n  url,\n  email,\n  port,\n  json,\n  postgres,\n  mysql,\n  mongodb,\n  redis,\n  http,\n  https,\n  date,\n  timestamp,\n  duration,\n  file,\n} from 'node-env-resolver/validators';\n```\n\n| Syntax                                          | Type                      | Description                                         |\n| ----------------------------------------------- | ------------------------- | --------------------------------------------------- |\n| `string()`                                      | `string`                  | Required string (empty strings rejected by default) |\n| `string({optional: true})`                      | `string \\| undefined`     | Optional string                                     |\n| `number()`                                      | `number`                  | Required number (coerced from string)               |\n| `number({optional: true})`                      | `number \\| undefined`     | Optional number                                     |\n| `boolean()`                                     | `boolean`                 | Required boolean (coerced from string)              |\n| `boolean({optional: true})`                     | `boolean \\| undefined`    | Optional boolean                                    |\n| `url()`                                         | `string`                  | Validated URL (returns string)                      |\n| `url({optional: true})`                         | `string \\| undefined`     | Optional URL                                        |\n| `email()`                                       | `string`                  | Validated email address                             |\n| `port()`                                        | `number`                  | Validated port number (1-65535)                     |\n| `json()`                                        | `unknown`                 | Parsed JSON (returns object/array)                  |\n| `postgres()` or `postgresql()`                  | `string`                  | Validated PostgreSQL URL                            |\n| `mysql()`                                       | `string`                  | Validated MySQL connection string                   |\n| `mongodb()`                                     | `string`                  | Validated MongoDB connection string                 |\n| `redis()`                                       | `string`                  | Validated Redis connection string                   |\n| `http()`                                        | `string`                  | HTTP or HTTPS URL                                   |\n| `https()`                                       | `string`                  | HTTPS-only URL                                      |\n| `date()`                                        | `string`                  | Validated ISO 8601 date                             |\n| `timestamp()`                                   | `number`                  | Validated Unix timestamp                            |\n| `duration()`                                    | `number`                  | Time duration (`5s`, `2m`, `1h` → milliseconds)     |\n| `file()`                                        | `string`                  | Read content from file path                         |\n| `3000`                                          | `number`                  | Number with default value                           |\n| `false`                                         | `boolean`                 | Boolean with default value                          |\n| `'defaultValue'`                                | `string`                  | String with default value                           |\n| `['a', 'b'] as const`                           | `'a' \\| 'b'`              | Required enum (requires `as const`)                 |\n| `optional(['a', 'b'] as const)`                 | `'a' \\| 'b' \\| undefined` | Optional enum (clean syntax)                        |\n| `enumOf(['a', 'b'] as const)`                   | `'a' \\| 'b'`              | Required enum (explicit function)                   |\n| `enumOf(['a', 'b'] as const, {optional: true})` | `'a' \\| 'b' \\| undefined` | Optional enum (explicit function)                   |\n| `enumOf(['a', 'b'] as const, {default: 'a'})`   | `'a' \\| 'b'`              | Enum with default value                             |\n| `oneOf(['a', 'b'] as const)`                    | `'a' \\| 'b'`              | Alias for enumOf (backward compatible)              |\n\n## Configuration Options\n\nAll `resolve()` functions accept an optional `options` parameter to control behaviour:\n\n```ts\n// Single source (process.env) - options as second parameter\nconst config = resolve(schema, {\n  interpolate: false,\n  strict: true,\n  policies: {...},\n  enableAudit: true\n});\n\n// Multiple sources - options in config object\nconst config = await resolveAsync({\n  resolvers: [\n    [resolver1, schema],\n    [resolver2, schema]\n  ],\n  options: {\n    interpolate: false,\n    strict: true,\n    policies: {...},\n    enableAudit: true,\n    priority: 'last'\n  }\n});\n```\n\n**Note:** The `resolvers` option has been removed. For single source resolution, use `resolve()` directly (defaults to `process.env`). For multiple sources, use `resolveAsync()` syntax.\n\n### `interpolate`\n\n**What:** Enables variable interpolation using `${VAR_NAME}` syntax.\n\n**When:** Use when environment variables reference other variables.\n\n**Why:** Keeps configuration DRY and maintainable.\n\n**Default:** `true` in `resolveAsync()`, `false` in `resolve()`\n\n```ts\nimport { resolve } from 'node-env-resolver';\nimport { url } from 'node-env-resolver/validators';\n\n// With interpolation\nprocess.env.BASE_URL = 'https://api.example.com';\nprocess.env.API_ENDPOINT = '${BASE_URL}/v1';\n\nconst config = resolve(\n  {\n    BASE_URL: url(),\n    API_ENDPOINT: url(),\n  },\n  {\n    interpolate: true,\n  },\n);\n\n// config.API_ENDPOINT === 'https://api.example.com/v1'\n```\n\n### `strict`\n\n**What:** Controls whether resolver failures stop the entire resolution process.\n\n**When:**\n\n- `strict: true` (default) - Production environments where you want fail-fast behaviour\n- `strict: false` - Graceful degradation when some sources might be unavailable\n\n**Why:**\n\n- `true`: Ensures all resolvers work correctly (reliability)\n- `false`: Allows partial success when some resolvers fail (availability)\n\n**Default:** `true`\n\n```ts\nconst flakyResolver = {\n  name: 'external-api',\n  async load() {\n    throw new Error('Service unavailable');\n  },\n};\n\n// ❌ Throws immediately\nawait resolveAsync({\n  resolvers: [\n    [flakyResolver, schema],\n    [processEnv(), schema],\n  ],\n  options: { strict: true }, // default\n});\n\n// ✅ Continues with processEnv()\nawait resolveAsync({\n  resolvers: [\n    [flakyResolver, schema],\n    [processEnv(), schema],\n  ],\n  options: { strict: false }, // graceful degradation\n});\n```\n\n**Note:** In sync mode with `strict: true`, resolvers without `loadSync()` method will throw errors.\n\n### `priority`\n\n**What:** Controls merge strategy when multiple resolvers provide the same variable.\n\n**When:**\n\n- `priority: 'last'` (default) - Production: cloud secrets override local env\n- `priority: 'first'` - Development: local overrides override cloud secrets\n\n**Why:** Different environments need different precedence rules.\n\n**Default:** `'last'`\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { processEnv, dotenv } from 'node-env-resolver/resolvers';\nimport { postgres } from 'node-env-resolver/validators';\nimport { awsSecrets } from 'node-env-resolver-aws';\n\n// Production: AWS secrets override process.env\nawait resolveAsync({\n  resolvers: [\n    [processEnv(), { DATABASE_URL: postgres() }],\n    [awsSecrets(), { DATABASE_URL: postgres() }],\n  ],\n  // priority: 'last' (default) - AWS wins\n});\n\n// Development: Local .env overrides cloud\nawait resolveAsync({\n  resolvers: [\n    [dotenv(), { DATABASE_URL: postgres() }],\n    [awsSecrets(), { DATABASE_URL: postgres() }],\n  ],\n  options: { priority: 'first' }, // dotenv wins\n});\n```\n\n**See:** \"Controlling merge behaviour\" section above for details.\n\n### `policies`\n\n**What:** Security policies to enforce where variables can be loaded from.\n\n**When:** Use in production to enforce security requirements.\n\n**Why:** Prevent accidental use of `.env` files or ensure secrets come from secure sources.\n\n**Default:** `undefined` (no policies enforced)\n\n```ts\nawait resolveAsync({\n  resolvers: [\n    [processEnv(), schema],\n    [awsSecrets(), schema],\n  ],\n  options: {\n    policies: {\n      // Block .env in production (default behaviour)\n      allowDotenvInProduction: false,\n\n      // Force secrets to come from AWS\n      enforceAllowedSources: {\n        DATABASE_PASSWORD: ['aws-secrets'],\n        API_KEY: ['aws-secrets'],\n      },\n    },\n  },\n});\n```\n\n**See:** \"Security Policies\" section below for complete documentation.\n\n### `enableAudit`\n\n**What:** Enables audit logging to track where each variable was loaded from.\n\n**When:**\n\n- Production monitoring and compliance\n- Debugging configuration issues\n- Security audits\n\n**Why:** Track configuration sources for compliance and troubleshooting.\n\n**Default:** `false` (disabled in development), automatically `true` in production (`NODE_ENV === 'production'`)\n\n```ts\nawait resolveAsync({\n  resolvers: [\n    [processEnv(), schema],\n    [awsSecrets(), schema],\n  ],\n  options: { enableAudit: true }, // Explicitly enable in development\n});\n\nconst logs = getAuditLog();\n// [\n//   { type: 'env_loaded', key: 'DATABASE_URL', source: 'aws-secrets', ... },\n//   { type: 'validation_success', ... }\n// ]\n```\n\n**See:** \"Audit Logging\" section below for complete documentation.\n\n### Complete Interface\n\n```ts\ninterface ResolveOptions {\n  interpolate?: boolean; // Variable interpolation (default: true in .async())\n  strict?: boolean; // Fail-fast behaviour (default: true)\n  priority?: 'first' | 'last'; // Merge strategy (default: 'last')\n  policies?: PolicyOptions; // Security policies (default: undefined)\n  enableAudit?: boolean; // Audit logging (default: auto in production)\n  secretsDir?: string; // Base directory for file secrets (Docker/K8s)\n  preventProcessEnvWrite?: boolean; // Keep resolved values out of process.env (default: true)\n}\n\ninterface PolicyOptions {\n  allowDotenvInProduction?: boolean | string[]; // .env in production control\n  enforceAllowedSources?: Record<string, string[]>; // Source restrictions\n}\n```\n\n## Framework examples\n\n### Express\n\n```ts\nimport express from 'express';\nimport { resolve } from 'node-env-resolver';\nimport { postgres, string } from 'node-env-resolver/validators';\n\nconst config = resolve({\n  PORT: 3000,\n  DATABASE_URL: postgres(),\n  SESSION_SECRET: string(),\n});\n\nconst app = express();\napp.listen(config.PORT);\n```\n\n### Next.js\n\n```ts\n// env.mjs\nimport { resolve } from 'node-env-resolver/nextjs';\nimport { postgres, string, url } from 'node-env-resolver/validators';\n\nexport const env = resolve({\n  server: {\n    DATABASE_URL: postgres(),\n    API_SECRET: string(),\n  },\n  client: {\n    NEXT_PUBLIC_APP_URL: url(),\n  },\n});\n```\n\n### AWS Lambda\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { cached, TTL } from 'node-env-resolver/utils';\nimport { postgres } from 'node-env-resolver/validators';\nimport { awsSecrets } from 'node-env-resolver-aws';\n\nconst getConfig = async () => {\n  return await resolveAsync({\n    resolvers: [\n      [\n        cached(awsSecrets({ secretId: 'lambda/config' }), {\n          ttl: TTL.minutes5,\n        }),\n        {\n          DATABASE_URL: postgres(),\n        },\n      ],\n    ],\n  });\n};\n\nexport const handler = async (event) => {\n  const config = await getConfig();\n  // Use config\n};\n```\n\n## Security Policies\n\nControl where environment variables can be loaded from to enforce security requirements.\n\n### Policy: `allowDotenvInProduction`\n\nBy default, `.env` files are **completely blocked in production** for security. Production platforms (Vercel, AWS, Docker) inject environment variables via `process.env`, NOT `.env` files.\n\n**Default behavior (secure):**\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { dotenv } from 'node-env-resolver/resolvers';\nimport { postgres } from 'node-env-resolver/validators';\n\n// In production (NODE_ENV=production)\nconst config = await resolveAsync({\n  resolvers: [\n    [\n      dotenv(),\n      {\n        DATABASE_URL: postgres(),\n      },\n    ],\n  ],\n});\n// ❌ Throws: \"DATABASE_URL cannot be sourced from .env files in production\"\n```\n\n**Allow all .env variables (NOT recommended):**\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { dotenv } from 'node-env-resolver/resolvers';\nimport { postgres } from 'node-env-resolver/validators';\n\nconst config = await resolveAsync({\n  resolvers: [\n    [\n      dotenv(),\n      {\n        DATABASE_URL: postgres(),\n      },\n    ],\n  ],\n  options: {\n    policies: {\n      allowDotenvInProduction: true, // Allow all (risky!)\n    },\n  },\n});\n```\n\n**Allow specific variables only (recommended if needed):**\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { dotenv } from 'node-env-resolver/resolvers';\nimport { postgres } from 'node-env-resolver/validators';\n\nconst config = await resolveAsync({\n  resolvers: [\n    [\n      dotenv(),\n      {\n        PORT: 3000,\n        DATABASE_URL: postgres(),\n      },\n    ],\n  ],\n  options: {\n    policies: {\n      allowDotenvInProduction: ['PORT'], // Only PORT allowed from .env\n      // DATABASE_URL must come from process.env or cloud resolvers\n    },\n  },\n});\n```\n\n### Policy: `enforceAllowedSources`\n\nRestrict sensitive variables to specific resolvers (e.g., force secrets to come from AWS):\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { processEnv } from 'node-env-resolver/resolvers';\nimport { string } from 'node-env-resolver/validators';\nimport { awsSecrets } from 'node-env-resolver-aws';\n\nconst config = await resolveAsync({\n  resolvers: [\n    [\n      processEnv(),\n      {\n        PORT: 3000,\n      },\n    ],\n    [\n      awsSecrets({ secretId: 'prod/secrets' }),\n      {\n        DATABASE_PASSWORD: string(),\n        API_KEY: string(),\n      },\n    ],\n  ],\n  options: {\n    policies: {\n      enforceAllowedSources: {\n        DATABASE_PASSWORD: ['aws-secrets'], // Must come from AWS\n        API_KEY: ['aws-secrets'], // Must come from AWS\n        // PORT not restricted - can come from any resolver\n      },\n    },\n  },\n});\n```\n\n**Use case:** Ensure production secrets only come from AWS Secrets Manager, never from `.env` or `process.env`:\n\n```ts\nimport { resolveAsync } from 'node-env-resolver';\nimport { processEnv } from 'node-env-resolver/resolvers';\nimport { string } from 'node-env-resolver/validators';\nimport { awsSecrets } from 'node-env-resolver-aws';\n\nconst config = await resolveAsync({\n  resolvers: [\n    [processEnv(), {}],\n    [\n      awsSecrets({ secretId: 'prod/db' }),\n      {\n        DATABASE_PASSWORD: string(),\n        STRIPE_SECRET: string(),\n      },\n    ],\n  ],\n  options: {\n    policies: {\n      enforceAllowedSources: {\n        DATABASE_PASSWORD: ['aws-secrets'],\n        STRIPE_SECRET: ['aws-secrets'],\n      },\n    },\n  },\n});\n\n// ✅ If secrets come from AWS → Success\n// ❌ If secrets come from process.env → Throws policy violation error\n```\n\n### PolicyOptions Interface\n\n```ts\ninterface PolicyOptions {\n  /**\n   * Control loading from .env files in production.\n   *\n   * - undefined (default): .env files completely ignored in production\n   * - true: Allow all vars from .env in production (NOT recommended)\n   * - string[]: Allow only specific vars from .env in production\n   */\n  allowDotenvInProduction?: boolean | string[];\n\n  /**\n   * Restrict variables to specific resolvers.\n   *\n   * Example: { DATABASE_PASSWORD: ['aws-secrets'] }\n   */\n  enforceAllowedSources?: Record<string, string[]>;\n}\n```\n\n### Reference-first hardening preset\n\nFor incident response hardening, keep secret *values* out of Vercel env vars.\nStore references such as `aws-sm://prod/stripe-key` and resolve the value at\nruntime via reference handlers.\n\n```ts\nimport { resolveAsync, strictReferenceResolveOptions } from 'node-env-resolver';\nimport { processEnv } from 'node-env-resolver/resolvers';\nimport { string } from 'node-env-resolver/validators';\nimport { createAwsSecretHandler } from 'node-env-resolver-aws';\n\nconst config = await resolveAsync({\n  resolvers: [[processEnv(), { STRIPE_KEY: string() }]],\n  references: {\n    handlers: {\n      'aws-sm': createAwsSecretHandler({ region: 'us-east-1' }),\n    },\n  },\n  options: strictReferenceResolveOptions({\n    sensitiveKeys: ['STRIPE_KEY'],\n    secretSources: ['aws-secrets'],\n  }),\n});\n```\n\nWhat this enforces:\n\n- `allowDotenvInProduction: false` (secure default)\n- `enforceAllowedSources` for sensitive keys (prevents accidental fallback)\n- `enableAudit: true` for source reconstruction via `getAuditLog()`\n\nIf you only want policies (not full resolve options), use:\n\n```ts\nimport { strictReferencePolicies } from 'node-env-resolver';\n\nconst policies = strictReferencePolicies({\n  sensitiveKeys: ['STRIPE_KEY', 'DATABASE_URL'],\n  secretSources: ['aws-secrets'],\n});\n```\n\nNote on `process.env` mutation:\n\n- `resolve()` / `resolveAsync()` keep resolved values out of `process.env` by default (`preventProcessEnvWrite: true`).\n- Resolved values live in the returned typed config object unless your app\n  explicitly re-exports or assigns them.\n- If you explicitly set `preventProcessEnvWrite: false`, primitive resolved values are written to `process.env`.\n\n## Audit Logging\n\nTrack environment variable resolution for security and compliance monitoring.\n\n### Important: Audit is Disabled by Default in Development\n\n**Audit logging is only enabled automatically in production** (`NODE_ENV === 'production'`) for performance reasons. In development, you must explicitly enable it.\n\n### Enable Audit Logging\n\n```ts\nimport { resolve, getAuditLog, clearAuditLog } from 'node-env-resolver';\nimport { postgres, string } from 'node-env-resolver/validators';\n\n// Option 1: Explicitly enable (works in any environment)\nconst config = resolve(\n  {\n    DATABASE_URL: postgres(),\n    API_KEY: string(),\n  },\n  {\n    enableAudit: true, // ← Enable audit logging\n  },\n);\n\nconsole.log(getAuditLog());\n// [\n//   { type: 'env_loaded', key: 'DATABASE_URL', source: 'process.env', timestamp: ... },\n//   { type: 'env_loaded', key: 'API_KEY', source: 'process.env', timestamp: ... },\n//   { type: 'validation_success', metadata: { variableCount: 2 }, timestamp: ... }\n// ]\n\n// Clear the log\nclearAuditLog();\n```\n\n```ts\nimport { resolve, getAuditLog } from 'node-env-resolver';\nimport { postgres } from 'node-env-resolver/validators';\n\n// Option 2: Automatic in production\nprocess.env.NODE_ENV = 'production';\n\nconst config = resolve({\n  DATABASE_URL: postgres(),\n});\n\n// Audit automatically enabled in production\nconsole.log(getAuditLog());\n```\n\n### Per-Config Audit Tracking\n\nWhen you have multiple `resolve()` calls, you can now get audit logs **specific to each config object**:\n\n```ts\nimport { resolve, getAuditLog } from 'node-env-resolver';\nimport { string, postgres } from 'node-env-resolver/validators';\n\nconst appConfig = resolve(\n  {\n    PORT: 3000,\n    API_KEY: string(),\n  },\n  { enableAudit: true },\n);\n\nconst dbConfig = resolve(\n  {\n    DATABASE_URL: postgres(),\n    DB_POOL_SIZE: 10,\n  },\n  { enableAudit: true },\n);\n\n// Get audit logs for specific config (NEW!)\nconst appAudit = getAuditLog(appConfig); // Only PORT and API_KEY events\nconst dbAudit = getAuditLog(dbConfig); // Only DATABASE_URL and DB_POOL_SIZE events\n\n// Still works: get ALL audit events (backward compatible)\nconst allAudit = getAuditLog(); // All events from both configs\n\nconsole.log('App config audit:', appAudit);\n// [\n//   { type: 'env_loaded', key: 'PORT', source: 'process.env', ... },\n//   { type: 'env_loaded', key: 'API_KEY', source: 'process.env', ... },\n//   { type: 'validation_success', ... }\n// ]\n\nconsole.log('DB config audit:', dbAudit);\n// [\n//   { type: 'env_loaded', key: 'DATABASE_URL', source: 'process.env', ... },\n//   { type: 'env_loaded', key: 'DB_POOL_SIZE', source: 'process.env', ... },\n//   { type: 'validation_success', ... }\n// ]\n```\n\n**Use cases:**\n\n- Multi-tenant applications with separate configs per tenant\n- Microservices with different config sources\n- Testing/debugging specific configuration loads\n- Isolating audit trails in complex applications\n\n### Audit Event Types\n\n| Event Type           | When It Occurs                                           |\n| -------------------- | -------------------------------------------------------- |\n| `env_loaded`         | Environment variable successfully loaded from a resolver |\n| `validation_success` | All variables validated successfully                     |\n| `validation_failure` | Variable validation failed                               |\n| `policy_violation`   | Security policy check failed                             |\n| `resolver_error`     | Resolver failed to load data                             |\n\n### Monitoring Cache Performance\n\nAudit logs include cache metadata to help monitor performance:\n\n```ts\nimport { resolveAsync, getAuditLog } from 'node-env-resolver';\nimport { cached, TTL } from 'node-env-resolver/utils';\nimport { postgres } from 'node-env-resolver/validators';\nimport { awsSecrets } from 'node-env-resolver-aws';\n\nconst config = await resolveAsync({\n  resolvers: [\n    [\n      cached(awsSecrets({ secretId: 'prod/db' }), { ttl: TTL.minutes5 }),\n      {\n        DATABASE_URL: postgres(),\n      },\n    ],\n  ],\n  options: { enableAudit: true },\n});\n\nconst logs = getAuditLog();\nlogs.forEach((log) => {\n  if (log.type === 'env_loaded') {\n    console.log(\n      `${log.key} from ${log.source}`,\n      log.metadata?.cached ? '[CACHED]' : '[FRESH]',\n    );\n  }\n});\n// Output:\n// DATABASE_URL from cached(aws-secrets) [FRESH]\n// (subsequent calls show [CACHED])\n```\n\n### Production Security Monitoring\n\nUse audit logs for compliance and security monitoring:\n\n```ts\nimport { resolveAsync, getAuditLog } from 'node-env-resolver';\nimport { processEnv } from 'node-env-resolver/resolvers';\nimport { string } from 'node-env-resolver/validators';\nimport { awsSecrets } from 'node-env-resolver-aws';\n\n// In production\nconst config = await resolveAsync({\n  resolvers: [\n    [processEnv(), {}],\n    [\n      awsSecrets(),\n      {\n        DATABASE_PASSWORD: string(),\n        API_KEY: string(),\n      },\n    ],\n  ],\n  options: {\n    policies: {\n      enforceAllowedSources: {\n        DATABASE_PASSWORD: ['aws-secrets'],\n        API_KEY: ['aws-secrets'],\n      },\n    },\n    // enableAudit: true automatically in production\n  },\n});\n\n// Send audit logs to your monitoring system\nconst logs = getAuditLog();\nconst policyViolations = logs.filter((l) => l.type === 'policy_violation');\n\nif (policyViolations.length > 0) {\n  // Alert: Secrets loaded from unauthorized source!\n  console.error('Security violation:', policyViolations);\n}\n```\n\n## Troubleshooting\n\n### TypeScript: Cannot find module 'node-env-resolver/resolvers' or 'node-env-resolver/validators'\n\nThis package uses modern [package.json `exports`](https://nodejs.org/api/packages.html#exports) for subpath exports (like `node-env-resolver/resolvers`). TypeScript requires a modern module resolution strategy to understand these exports.\n\n**If you see this error:**\n\n```\nCannot find module 'node-env-resolver/resolvers' or its corresponding type declarations.\nThere are types at '.../node_modules/node-env-resolver/dist/resolvers.d.ts',\nbut this result could not be resolved under your current 'moduleResolution' setting.\nConsider updating to 'node16', 'nodenext', or 'bundler'.\n```\n\n**Solution:** Update your `tsconfig.json` to use a modern module resolution strategy.\n\n**Example - if your config currently has:**\n\n```json\n{\n  \"compilerOptions\": {\n    \"module\": \"CommonJS\",\n    \"moduleResolution\": \"node\"\n  }\n}\n```\n\n**Change to one of these options:**\n\n1. **`moduleResolution: \"NodeNext\"`** (recommended for most Node.js projects):\n\n```json\n{\n  \"compilerOptions\": {\n    \"module\": \"NodeNext\", // Changed from \"CommonJS\"\n    \"moduleResolution\": \"NodeNext\" // Changed from \"node\"\n  }\n}\n```\n\n2. **`moduleResolution: \"bundler\"`** (for bundler-based projects like Vite, Webpack, etc.):\n\n```json\n{\n  \"compilerOptions\": {\n    \"module\": \"CommonJS\", // Can keep this or use \"ESNext\"\n    \"moduleResolution\": \"bundler\" // Changed from \"node\"\n  }\n}\n```\n\n3. **`moduleResolution: \"node16\"`** (alternative to NodeNext):\n\n```json\n{\n  \"compilerOptions\": {\n    \"module\": \"node16\", // Changed from \"CommonJS\"\n    \"moduleResolution\": \"node16\" // Changed from \"node\"\n  }\n}\n```\n\n**Why this is required:**\n\n- The legacy `moduleResolution: \"node\"` strategy doesn't understand package.json `exports` field\n- Modern resolution strategies (`node16`, `nodenext`, `bundler`) properly support subpath exports\n- This is a TypeScript configuration requirement, not a runtime issue - your code will run correctly regardless\n\n**Note:** The runtime will work correctly regardless of TypeScript's resolution mode. This is purely a TypeScript type-checking issue.\n\n## Testing\n\n### Recommended: Dependency Injection\n\nFor testable code, accept resolvers as parameters rather than importing them directly:\n\n```typescript\n// config.ts - Production code\nimport { resolveAsync, type Resolver } from 'node-env-resolver';\nimport { processEnv } from 'node-env-resolver/resolvers';\nimport { awsSecrets } from 'node-env-resolver-aws';\nimport { string, number } from 'node-env-resolver/validators';\n\nconst schema = {\n  DATABASE_URL: string(),\n  PORT: number({ default: 3000 }),\n};\n\n// Accept resolvers as parameter with sensible defaults\nexport async function getConfig(\n  resolvers: Resolver[] = [processEnv(), awsSecrets({ secretId: 'my-app' })],\n) {\n  return resolveAsync({\n    resolvers: resolvers.map((r) => [r, schema]),\n  });\n}\n```\n\n```typescript\n// config.test.ts - Test code\nimport { getConfig } from './config';\n\ndescribe('getConfig', () => {\n  it('should resolve environment variables', async () => {\n    // Create a simple inline mock resolver - no jest.mock() needed!\n    const mockResolver = {\n      name: 'test-env',\n      load: async () => ({\n        DATABASE_URL: 'postgres://test:5432/testdb',\n        PORT: '8080',\n      }),\n      loadSync: () => ({\n        DATABASE_URL: 'postgres://test:5432/testdb',\n        PORT: '8080',\n      }),\n    };\n\n    const config = await getConfig([mockResolver]);\n\n    expect(config.DATABASE_URL).toBe('postgres://test:5432/testdb');\n    expect(config.PORT).toBe(8080);\n  });\n\n  it('should use default PORT when not provided', async () => {\n    const mockResolver = {\n      name: 'test-env',\n      load: async () => ({ DATABASE_URL: 'postgres://localhost/db' }),\n      loadSync: () => ({ DATABASE_URL: 'postgres://localhost/db' }),\n    };\n\n    const config = await getConfig([mockResolver]);\n\n    expect(config.PORT).toBe(3000); // default value\n  });\n});\n```\n\n### Creating Mock Resolvers\n\nA resolver is just an object with `name` and `load`/`loadSync` methods:\n\n```typescript\n// Minimal async-only resolver\nconst asyncMock = {\n  name: 'async-mock',\n  load: async () => ({ KEY: 'value' }),\n};\n\n// Sync-compatible resolver (works with both resolve() and resolveAsync())\nconst syncMock = {\n  name: 'sync-mock',\n  load: async () => ({ KEY: 'value' }),\n  loadSync: () => ({ KEY: 'value' }),\n};\n\n// Dynamic mock that can be configured per-test\nconst createMock = (env: Record<string, string>) => ({\n  name: 'configurable-mock',\n  load: async () => env,\n  loadSync: () => env,\n});\n\n// Usage\nconst config = await resolveAsync({\n  resolvers: [[createMock({ API_KEY: 'test-key' }), { API_KEY: string() }]],\n});\n```\n\n### Why Avoid Module Mocking\n\nModule-level mocking (`jest.mock()`) creates tight coupling between tests and implementation:\n\n```typescript\n// ❌ Avoid: Requires mocking internal imports\njest.mock('node-env-resolver/resolvers', () => ({\n  processEnv: jest.fn(() => ({ load: jest.fn(), name: 'processEnv' })),\n}));\n\n// ✅ Better: Use dependency injection\nconst config = await getConfig([mockResolver]);\n```\n\nBenefits of dependency injection:\n\n- Tests are simpler and more readable\n- No need to understand internal module structure\n- Refactoring production code doesn't break tests\n- Works with any test framework (Jest, Vitest, Mocha, etc.)\n\n## Error messages\n\nThe library provides clear, actionable error messages:\n\n```text\nEnvironment validation failed:\n  - Missing required environment variable: DATABASE_URL\n  - PORT: Invalid port number (1-65535)\n  - NODE_ENV: must be one of: development, production (got: \"staging\")\n```\n\n## Licence\n\nMIT\n","readmeFilename":"README.md"}