{"_id":"@bymax-one/nest-config","_rev":"9-bbc529d9b1a4fe0555ac4a12878cadd2","name":"@bymax-one/nest-config","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"name":"@bymax-one/nest-config","version":"1.0.0","keywords":["nestjs","config","environment","env","zod","validation","typed-config","dependency-injection","fail-fast","configuration"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-config@1.0.0","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-config#readme","bugs":{"url":"https://github.com/bymaxone/nest-config/issues"},"dist":{"shasum":"2dbefcf84eaf99b8958cfbf60dc8673801720211","tarball":"https://registry.npmjs.org/@bymax-one/nest-config/-/nest-config-1.0.0.tgz","fileCount":16,"integrity":"sha512-5Q+8ivOKdnH2YWy2qbKiPoOvy+RuSPpI3WddI7Yh1roArtdlpxq58DmrihNcCX5KNouq+upDhd3F0xNKVx4Z0w==","signatures":[{"sig":"MEQCIB9VlQ4VmNhhHXNKJ3aM3oBmu4YPAxxHONQqNBMcsbW6AiAqnm/TkJhGSA3YrUAJObsENTzL3O6WvHRMnEu2RZeN3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143466},"main":"./dist/index.cjs","type":"module","_from":"file:bymax-one-nest-config-1.0.0.tgz","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}},"./internal":{"import":{"types":"./dist/internal/index.d.ts","default":"./dist/internal/index.mjs"},"require":{"types":"./dist/internal/index.d.cts","default":"./dist/internal/index.cjs"}},"./package.json":"./package.json"},"scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","build":"pnpm clean && tsup","clean":"node -e \"const fs=require('node:fs');for(const d of ['dist','coverage'])fs.rmSync(d,{recursive:true,force:true})\"","dogfood":"node scripts/dogfood-smoke-test.mjs","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.build.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack . --profile strict","check:runtime":"node scripts/check-consumer-runtime.mjs","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly","mutation:incremental":"stryker run --incremental"},"_npmUser":{"name":"bymax.one","email":"bymaxone.core@gmail.com"},"_resolved":"/private/var/folders/zf/_zr7t0ms60x6rcwj5zxk90cr0000gn/T/551ab1806b52202b469fae07c9689ca0/bymax-one-nest-config-1.0.0.tgz","_integrity":"sha512-5Q+8ivOKdnH2YWy2qbKiPoOvy+RuSPpI3WddI7Yh1roArtdlpxq58DmrihNcCX5KNouq+upDhd3F0xNKVx4Z0w==","repository":{"url":"git+https://github.com/bymaxone/nest-config.git","type":"git"},"_npmVersion":"11.13.0","description":"Typed and validated environment configuration entry point for NestJS 11 applications, built on Zod v4.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"typesVersions":{"*":{"testing":["./dist/testing/index.d.cts"],"internal":["./dist/internal/index.d.cts"]}},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.0.0","jest":"^30.4.2","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25","lint-staged":"^17.0.7","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","reflect-metadata":"^0.2.2","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.2","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"zod":"^4.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nest-config_1.0.0_1785842937433_0.5273341499144042","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bymax-one/nest-config","version":"1.0.1","keywords":["nestjs","config","environment","env","zod","validation","typed-config","dependency-injection","fail-fast","configuration"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-config@1.0.1","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-config#readme","bugs":{"url":"https://github.com/bymaxone/nest-config/issues"},"dist":{"shasum":"a75a5453f572cf2e461f20f7fb7b768c5fe135a1","tarball":"https://registry.npmjs.org/@bymax-one/nest-config/-/nest-config-1.0.1.tgz","fileCount":16,"integrity":"sha512-O4Vq4zdbVVu4VoDDZ6wQJtQm4jMIy7jF/NkQpxiZ6F5iqc1QOB5m6nHxwcCqUwLp7C5mN75anPz1ZsrxFo3vAg==","signatures":[{"sig":"MEUCIGalP8zPpO/UA5Jbg8IJ6J9EKim16t0WXr1zMtyfVmVFAiEA4klwdvlTy0fKNudNKxIr09J9ejazeTjjkbBZKB7V9j8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-config@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":151592},"main":"./dist/index.cjs","pnpm":{"overrides":{"qs":"^6.15.2","esbuild":"^0.28.1","fast-uri":"^3.1.4","protobufjs":"^7.6.5","brace-expansion@1":"^1.1.17","brace-expansion@2":"^2.1.3","brace-expansion@5":"^5.0.8"}},"type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}},"./internal":{"import":{"types":"./dist/internal/index.d.ts","default":"./dist/internal/index.mjs"},"require":{"types":"./dist/internal/index.d.cts","default":"./dist/internal/index.cjs"}},"./package.json":"./package.json"},"gitHead":"afc4c8166c40a66282ee9326747724a08f66a81b","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","build":"pnpm clean && tsup","clean":"node -e \"const fs=require('node:fs');for(const d of ['dist','coverage'])fs.rmSync(d,{recursive:true,force:true})\"","dogfood":"node scripts/dogfood-smoke-test.mjs","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.build.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack . --profile strict","check:runtime":"node scripts/check-consumer-runtime.mjs","prepublishOnly":"pnpm typecheck && pnpm lint && pnpm test:cov:all && pnpm build && pnpm size && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly","mutation:incremental":"stryker run --incremental"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a80fdb85-9dc9-4f22-bb76-a2090f70b98a"}},"repository":{"url":"git+https://github.com/bymaxone/nest-config.git","type":"git"},"_npmVersion":"11.16.0","description":"Typed and validated environment configuration entry point for NestJS 11 applications, built on Zod v4.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"typesVersions":{"*":{"testing":["./dist/testing/index.d.cts"],"internal":["./dist/internal/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@10.8.1","devDependencies":{"zod":"^4.0.0","jest":"^30.4.2","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25","lint-staged":"^17.0.7","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","reflect-metadata":"^0.2.2","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.2","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"zod":"^4.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nest-config_1.0.1_1785857985021_0.7743144867812901","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bymax-one/nest-config","version":"1.0.2","keywords":["nestjs","config","environment","env","zod","validation","typed-config","dependency-injection","fail-fast","configuration"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-config@1.0.2","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-config#readme","bugs":{"url":"https://github.com/bymaxone/nest-config/issues"},"dist":{"shasum":"e40e132d9d000748a1efa1e1e786e5e4c4ceeb67","tarball":"https://registry.npmjs.org/@bymax-one/nest-config/-/nest-config-1.0.2.tgz","fileCount":16,"integrity":"sha512-sYLK4fIY8AhqIl7BsmSxSFr6j8RS0MsetMH+Y5+KBinsK6bZZPK+lC0jKztwQUlkXkiwscVhzd6i1eDtlj3w2w==","signatures":[{"sig":"MEQCIFufaozLYpnQF23kkgPYh/2yiaJxqdvxzPRrrPyUZE/fAiBnrtcWmSiyyVZuEdWyW7i5ThkjT5Effao6mWpXdFCkdA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-config@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":151750},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}},"./internal":{"import":{"types":"./dist/internal/index.d.ts","default":"./dist/internal/index.mjs"},"require":{"types":"./dist/internal/index.d.cts","default":"./dist/internal/index.cjs"}},"./package.json":"./package.json"},"gitHead":"895d01d30720f73b64a27c411ec3080212dc115c","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","build":"pnpm clean && tsup","clean":"node -e \"const fs=require('node:fs');for(const d of ['dist','coverage'])fs.rmSync(d,{recursive:true,force:true})\"","dogfood":"node scripts/dogfood-smoke-test.mjs","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.build.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack . --profile strict","check:runtime":"node scripts/check-consumer-runtime.mjs","prepublishOnly":"pnpm typecheck && pnpm lint && pnpm test:cov:all && pnpm build && pnpm size && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly","mutation:incremental":"stryker run --incremental"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a80fdb85-9dc9-4f22-bb76-a2090f70b98a"}},"repository":{"url":"git+https://github.com/bymaxone/nest-config.git","type":"git"},"_npmVersion":"11.17.0","description":"Typed and validated environment configuration entry point for NestJS 11 applications, built on Zod v4.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"typesVersions":{"*":{"testing":["./dist/testing/index.d.cts"],"internal":["./dist/internal/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"zod":"^4.0.0","jest":"^30.4.2","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25","lint-staged":"^17.0.7","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","reflect-metadata":"^0.2.2","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.2","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"zod":"^4.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nest-config_1.0.2_1786015576861_0.19195001331565842","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@bymax-one/nest-config","version":"1.0.3","keywords":["nestjs","config","environment","env","zod","validation","typed-config","dependency-injection","fail-fast","configuration"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-config@1.0.3","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-config#readme","bugs":{"url":"https://github.com/bymaxone/nest-config/issues"},"dist":{"shasum":"f5c87f0ba5f31dccf13a86497ff983f5ab446aac","tarball":"https://registry.npmjs.org/@bymax-one/nest-config/-/nest-config-1.0.3.tgz","fileCount":16,"integrity":"sha512-wzzesTSGhDb0Wlfxum2JxMhGZY9W0KwdSaU7t/xXyOZPWlqLkrnvoGA4qT76EMo3DlSBoXRlYr0ZogDiWM9qeA==","signatures":[{"sig":"MEYCIQCoxsqon4WBafDT6wxvnLKfB+7AeLcql6pjGKsRIZCNswIhAOtBEubX1DrigzO8NIw5m9AfkTxgEe3OPu0nSSnzaMAV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-config@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":154636},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}},"./internal":{"import":{"types":"./dist/internal/index.d.ts","default":"./dist/internal/index.mjs"},"require":{"types":"./dist/internal/index.d.cts","default":"./dist/internal/index.cjs"}},"./package.json":"./package.json"},"gitHead":"241e3888777dffa36f7d3c2d5bc5eacb0e7cde68","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","build":"pnpm clean && tsup","clean":"node -e \"const fs=require('node:fs');for(const d of ['dist','coverage'])fs.rmSync(d,{recursive:true,force:true})\"","dogfood":"node scripts/dogfood-smoke-test.mjs","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.build.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack . --profile strict","check:mutants":"node scripts/check-mutation-directives.mjs","check:runtime":"node scripts/check-consumer-runtime.mjs","prepublishOnly":"pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm size && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly","mutation:incremental":"stryker run --incremental"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a80fdb85-9dc9-4f22-bb76-a2090f70b98a"}},"repository":{"url":"git+https://github.com/bymaxone/nest-config.git","type":"git"},"_npmVersion":"11.16.0","description":"Typed and validated environment configuration entry point for NestJS 11 applications, built on Zod v4.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"typesVersions":{"*":{"testing":["./dist/testing/index.d.cts"],"internal":["./dist/internal/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"zod":"^4.0.0","jest":"^30.4.2","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25","lint-staged":"^17.0.7","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","reflect-metadata":"^0.2.2","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.2","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"zod":"^4.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nest-config_1.0.3_1786193832514_0.9373975237595222","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bymax-one/nest-config","version":"1.1.0","keywords":["nestjs","config","environment","env","zod","validation","typed-config","dependency-injection","fail-fast","configuration"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-config@1.1.0","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-config#readme","bugs":{"url":"https://github.com/bymaxone/nest-config/issues"},"dist":{"shasum":"897f9175cc54a33ef754830d75cf394d4c81efd8","tarball":"https://registry.npmjs.org/@bymax-one/nest-config/-/nest-config-1.1.0.tgz","fileCount":16,"integrity":"sha512-utAS8L+bzLE0jyfYZTv9JlQcpOlrEcHXNU2EBXKkX97fg4FBNVJ9i8uxoKleBy8kMovqpqbW5bnpQbMojEFcWA==","signatures":[{"sig":"MEYCIQCjNoSlUR77vJpbAIEBTL9kE7Mg2sPe3D5++YmkOceM5QIhAJ6bN3IRNYpC2VengQZ1Si25h3Rebuxw8MJHAYATnyW7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-config@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":155496},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}},"./internal":{"import":{"types":"./dist/internal/index.d.ts","default":"./dist/internal/index.mjs"},"require":{"types":"./dist/internal/index.d.cts","default":"./dist/internal/index.cjs"}},"./package.json":"./package.json"},"gitHead":"062b21d108ff95828aca38aa7a7ef7e66ce25939","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","build":"pnpm clean && tsup","clean":"node -e \"const fs=require('node:fs');for(const d of ['dist','coverage'])fs.rmSync(d,{recursive:true,force:true})\"","dogfood":"node scripts/dogfood-smoke-test.mjs","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.build.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack . --profile strict","check:mutants":"node scripts/check-mutation-directives.mjs","check:runtime":"node scripts/check-consumer-runtime.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm size && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a80fdb85-9dc9-4f22-bb76-a2090f70b98a"}},"repository":{"url":"git+https://github.com/bymaxone/nest-config.git","type":"git"},"_npmVersion":"11.16.0","description":"Typed and validated environment configuration entry point for NestJS 11 applications, built on Zod v4.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"typesVersions":{"*":{"testing":["./dist/testing/index.d.cts"],"internal":["./dist/internal/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"zod":"^4.0.0","jest":"^30.4.2","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25","lint-staged":"^17.0.7","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","reflect-metadata":"^0.2.2","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.2","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"zod":"^4.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nest-config_1.1.0_1786446218957_0.9991787969699242","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@bymax-one/nest-config","version":"1.1.1","keywords":["nestjs","config","environment","env","zod","validation","typed-config","dependency-injection","fail-fast","configuration"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-config@1.1.1","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-config#readme","bugs":{"url":"https://github.com/bymaxone/nest-config/issues"},"dist":{"shasum":"130eec068d9f1903ac07ca9c96ecab933483e9d6","tarball":"https://registry.npmjs.org/@bymax-one/nest-config/-/nest-config-1.1.1.tgz","fileCount":16,"integrity":"sha512-OEtrsnmBTa6CyOO5HIgeRQVLGIunxWcPwXuK4FvztHF12QptD6AiW2cUFXSCsEd5R3KZRhk5jWyibykwMwXhgw==","signatures":[{"sig":"MEUCIAc1Y9OSEk/7BjhWSfSuPk23wjWwbJQG2QCcyuFXSu0YAiEAn1n1FD9wygOPLzZT5JaRr4wGg0Wf02L5tMs0r9Yvdsc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-config@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":163109},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}},"./internal":{"import":{"types":"./dist/internal/index.d.ts","default":"./dist/internal/index.mjs"},"require":{"types":"./dist/internal/index.d.cts","default":"./dist/internal/index.cjs"}},"./package.json":"./package.json"},"gitHead":"dd30e04466d4bcd22eff064060d349655b002c38","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","build":"pnpm clean && tsup","clean":"node -e \"const fs=require('node:fs');for(const d of ['dist','coverage'])fs.rmSync(d,{recursive:true,force:true})\"","dogfood":"node scripts/dogfood-smoke-test.mjs","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.build.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack . --profile strict","check:mutants":"node scripts/check-mutation-directives.mjs","check:runtime":"node scripts/check-consumer-runtime.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm size && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a80fdb85-9dc9-4f22-bb76-a2090f70b98a"}},"repository":{"url":"git+https://github.com/bymaxone/nest-config.git","type":"git"},"_npmVersion":"11.17.0","description":"Typed and validated environment configuration entry point for NestJS 11 applications, built on Zod v4.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"typesVersions":{"*":{"testing":["./dist/testing/index.d.cts"],"internal":["./dist/internal/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"zod":"^4.0.0","jest":"^30.4.2","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25","lint-staged":"^17.0.7","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","reflect-metadata":"^0.2.2","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.2","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"zod":"^4.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nest-config_1.1.1_1786741845586_0.1267945718964072","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@bymax-one/nest-config","version":"1.1.2","keywords":["nestjs","config","environment","env","zod","validation","typed-config","dependency-injection","fail-fast","configuration"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-config@1.1.2","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-config#readme","bugs":{"url":"https://github.com/bymaxone/nest-config/issues"},"dist":{"shasum":"258e5fddab4b20e020c85314045bfbf2a43c38b9","tarball":"https://registry.npmjs.org/@bymax-one/nest-config/-/nest-config-1.1.2.tgz","fileCount":16,"integrity":"sha512-ZtBf6PnyIJfs691JeUQ4ZitX4iWJNy5Z9DyaQ4hkfftHpzL6buH7tB+VUggcltjMTr5B5deMURcd1OZJ3bYGIQ==","signatures":[{"sig":"MEUCIQCPCyO89oVNv3WFpMnjzm6Nc8AWv9x+uVXIF+tNT4eJmAIgeJ9PRLQOg6kW+vQ1en3hNdQTZMbT12+IuoW69YQzAwU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-config@1.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":165243},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}},"./internal":{"import":{"types":"./dist/internal/index.d.ts","default":"./dist/internal/index.mjs"},"require":{"types":"./dist/internal/index.d.cts","default":"./dist/internal/index.cjs"}},"./package.json":"./package.json"},"gitHead":"49322f65cd3841657736993e41a341165113deda","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","build":"pnpm clean && tsup","clean":"node -e \"const fs=require('node:fs');for(const d of ['dist','coverage'])fs.rmSync(d,{recursive:true,force:true})\"","dogfood":"node scripts/dogfood-smoke-test.mjs","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.build.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack . --profile strict","check:mutants":"node scripts/check-mutation-directives.mjs","check:runtime":"node scripts/check-consumer-runtime.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm size && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a80fdb85-9dc9-4f22-bb76-a2090f70b98a"}},"repository":{"url":"git+https://github.com/bymaxone/nest-config.git","type":"git"},"_npmVersion":"11.17.0","description":"Typed and validated environment configuration entry point for NestJS 11 applications, built on Zod v4.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"typesVersions":{"*":{"testing":["./dist/testing/index.d.cts"],"internal":["./dist/internal/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"zod":"^4.0.0","jest":"^30.4.2","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25","lint-staged":"^17.0.7","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","reflect-metadata":"^0.2.2","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.2","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"zod":"^4.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nest-config_1.1.2_1786756906769_0.9465842719082049","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@bymax-one/nest-config","version":"1.1.3","keywords":["nestjs","config","environment","env","zod","validation","typed-config","dependency-injection","fail-fast","configuration"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-config@1.1.3","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-config#readme","bugs":{"url":"https://github.com/bymaxone/nest-config/issues"},"dist":{"shasum":"f8939d5344e9726295b1950bd9cb2049f1fb3913","tarball":"https://registry.npmjs.org/@bymax-one/nest-config/-/nest-config-1.1.3.tgz","fileCount":16,"integrity":"sha512-gHz/XQAIXiD+JzNQpkTdANGmnnLxVXeVyP6X9k98SbsypqBHRkjQxwFxNq4EB94WdrCKWfd8Mexq+y1pUtSN7g==","signatures":[{"sig":"MEYCIQDkPvItpgnVGbxhFNufpAHB5953uFzHl1CShkj54WIc/gIhANIHW9HaR9uykIxxFXqJzoN9plDLDUgLbaUbd6JEmFCy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-config@1.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":174592},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}},"./internal":{"import":{"types":"./dist/internal/index.d.ts","default":"./dist/internal/index.mjs"},"require":{"types":"./dist/internal/index.d.cts","default":"./dist/internal/index.cjs"}},"./package.json":"./package.json"},"gitHead":"e7dbe9df255bfa30c0a1541b7f7d28467b17a02c","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","build":"pnpm clean && tsup","clean":"node -e \"const fs=require('node:fs');for(const d of ['dist','coverage'])fs.rmSync(d,{recursive:true,force:true})\"","dogfood":"node scripts/dogfood-smoke-test.mjs","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.build.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack . --profile strict","check:mutants":"node scripts/check-mutation-directives.mjs","check:runtime":"node scripts/check-consumer-runtime.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm size && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a80fdb85-9dc9-4f22-bb76-a2090f70b98a"}},"repository":{"url":"git+https://github.com/bymaxone/nest-config.git","type":"git"},"_npmVersion":"11.17.0","description":"Typed and validated environment configuration entry point for NestJS 11 applications, built on Zod v4.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"typesVersions":{"*":{"testing":["./dist/testing/index.d.cts"],"internal":["./dist/internal/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"zod":"^4.0.0","jest":"^30.4.2","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25","lint-staged":"^17.0.7","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","reflect-metadata":"^0.2.2","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.2","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"zod":"^4.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nest-config_1.1.3_1787089984224_0.8609025502192316","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bymax-one/nest-config","version":"1.2.0","description":"Typed and validated environment configuration entry point for NestJS 11 applications, built on Zod v4.","author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","homepage":"https://github.com/bymaxone/nest-config#readme","repository":{"type":"git","url":"git+https://github.com/bymaxone/nest-config.git"},"bugs":{"url":"https://github.com/bymaxone/nest-config/issues"},"type":"module","sideEffects":false,"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}},"./internal":{"import":{"types":"./dist/internal/index.d.ts","default":"./dist/internal/index.mjs"},"require":{"types":"./dist/internal/index.d.cts","default":"./dist/internal/index.cjs"}},"./package.json":"./package.json"},"scripts":{"build":"pnpm clean && tsup","check:exports":"attw --pack . --profile strict","check:lint-graph":"node scripts/check-lint-graph-rules.mjs","check:mutants":"node scripts/check-mutation-directives.mjs","check:published":"node scripts/check-published-surface.mjs","check:runtime":"node scripts/check-consumer-runtime.mjs","clean":"node -e \"const fs=require('node:fs');for(const d of ['dist','coverage'])fs.rmSync(d,{recursive:true,force:true})\"","dogfood":"node scripts/dogfood-smoke-test.mjs","lint":"eslint src scripts","lint:fix":"eslint src scripts --fix","mutation":"stryker run","mutation:dry-run":"stryker run --dryRunOnly","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepare":"husky","prepublishOnly":"pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm size && pnpm check:published","release":"npm publish --provenance --access public","size":"node scripts/check-size.mjs","test":"jest","test:cov":"jest --coverage","test:cov:all":"jest --config jest.coverage.config.ts --coverage","test:e2e":"jest --config jest.e2e.config.ts","test:watch":"jest --watch","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.build.json"},"lint-staged":{"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]},"peerDependencies":{"@nestjs/common":"^11.0.16","@nestjs/core":"^11.1.18","reflect-metadata":"^0.2.0","zod":"^4.0.0"},"devDependencies":{"@arethetypeswrong/cli":"^0.18.2","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@eslint/js":"^10.0.1","@nestjs/common":"^11.1.20","@nestjs/core":"^11.1.20","@nestjs/platform-express":"^11.1.20","@nestjs/testing":"^11.1.20","@stryker-mutator/core":"^9","@stryker-mutator/jest-runner":"^9","@stryker-mutator/typescript-checker":"^9","@types/express":"^5.0.6","@types/jest":"^30.0.0","@types/node":"^25","@typescript-eslint/eslint-plugin":"^8.59.3","@typescript-eslint/parser":"^8.59.3","eslint":"^10.9.1","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.5","eslint-plugin-import-x":"^4.17.1","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","globals":"^17.6.0","husky":"^9.1.7","jest":"^30.4.2","lint-staged":"^17.0.7","prettier":"^3.8.3","reflect-metadata":"^0.2.2","ts-jest":"^29.4.9","ts-node":"^10.9.2","tsup":"^8.5.1","typescript":"^5.9.3","zod":"^4.0.0"},"keywords":["nestjs","config","environment","env","zod","validation","typed-config","dependency-injection","fail-fast","configuration"],"packageManager":"pnpm@11.20.0","engines":{"node":">=24.0.0"},"publishConfig":{"access":"public","provenance":true,"registry":"https://registry.npmjs.org/"},"main":"./dist/index.cjs","module":"./dist/index.mjs","types":"./dist/index.d.cts","typesVersions":{"*":{"testing":["./dist/testing/index.d.cts"],"internal":["./dist/internal/index.d.cts"]}},"gitHead":"0268ca9777a3764b217cba74fe41af31d820b47c","_id":"@bymax-one/nest-config@1.2.0","_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-FMK1gQ0kn3skCFuho/9aV+9US+jNsOI+KzNNYxfH3QNI+hFU9Crtwpa/9iT8te9a4OhFu4VXxCCktVAI3EL1LA==","shasum":"b534aa3b97f9028218c25bd17a118839a6d662ef","tarball":"https://registry.npmjs.org/@bymax-one/nest-config/-/nest-config-1.2.0.tgz","fileCount":16,"unpackedSize":183450,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-config@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCEFiewvmFxqAI5R9fGmt1zK+KFLeIKSlAY9KQzG720kQIgT+M9DyyobZNe/28Lc7O1rs1mOQV4V1O1I3or3oppzJ4="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a80fdb85-9dc9-4f22-bb76-a2090f70b98a"}},"directories":{},"maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nest-config_1.2.0_1788607480294_0.8619456094723739"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-04T11:28:57.199Z","modified":"2026-09-05T11:24:40.737Z","1.0.0":"2026-08-04T11:28:57.586Z","1.0.1":"2026-08-04T15:39:45.174Z","1.0.2":"2026-08-06T11:26:17.010Z","1.0.3":"2026-08-08T12:57:12.651Z","1.1.0":"2026-08-11T11:03:39.101Z","1.1.1":"2026-08-14T21:10:45.738Z","1.1.2":"2026-08-15T01:21:46.933Z","1.1.3":"2026-08-18T21:53:04.385Z","1.2.0":"2026-09-05T11:24:40.442Z"},"bugs":{"url":"https://github.com/bymaxone/nest-config/issues"},"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","homepage":"https://github.com/bymaxone/nest-config#readme","keywords":["nestjs","config","environment","env","zod","validation","typed-config","dependency-injection","fail-fast","configuration"],"repository":{"type":"git","url":"git+https://github.com/bymaxone/nest-config.git"},"description":"Typed and validated environment configuration entry point for NestJS 11 applications, built on Zod v4.","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"readme":"<p align=\"center\">\n  <img src=\"https://img.shields.io/badge/%40bymax--one-nest--config-000000?style=for-the-badge&logo=nestjs&logoColor=E0234E\" alt=\"@bymax-one/nest-config\" />\n</p>\n\n<h1 align=\"center\">@bymax-one/nest-config</h1>\n\n<p align=\"center\">\n  <strong>Typed and validated environment configuration for NestJS</strong><br />\n  <sub>Zod v4 · Fail-fast at bootstrap · Value-free errors · Typed dot-path access · Testing helpers · Zero Runtime Dependencies</sub>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@bymax-one/nest-config\"><img src=\"https://img.shields.io/npm/v/@bymax-one/nest-config?style=flat-square&colorA=000000&colorB=000000\" alt=\"npm version\" /></a>\n  <a href=\"https://www.npmjs.com/package/@bymax-one/nest-config\"><img src=\"https://img.shields.io/npm/dm/@bymax-one/nest-config?style=flat-square&colorA=000000&colorB=000000\" alt=\"npm downloads\" /></a>\n  <a href=\"https://github.com/bymaxone/nest-config/actions/workflows/ci.yml\"><img src=\"https://img.shields.io/github/actions/workflow/status/bymaxone/nest-config/ci.yml?branch=main&style=flat-square&colorA=000000&label=CI\" alt=\"CI status\" /></a>\n  <a href=\"https://github.com/bymaxone/nest-config/actions/workflows/ci.yml\"><img src=\"https://img.shields.io/badge/coverage-100%25-brightgreen?style=flat-square&colorA=000000\" alt=\"coverage\" /></a>\n  <a href=\"https://github.com/bymaxone/nest-config/blob/main/docs/mutation_testing_results.md\"><img src=\"https://img.shields.io/badge/mutation-99.62%25-brightgreen?style=flat-square&colorA=000000\" alt=\"mutation score\" /></a>\n  <a href=\"https://scorecard.dev/viewer/?uri=github.com/bymaxone/nest-config\"><img src=\"https://api.scorecard.dev/projects/github.com/bymaxone/nest-config/badge?style=flat-square\" alt=\"OpenSSF Scorecard\" /></a>\n  <a href=\"https://github.com/bymaxone/nest-config/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/bymaxone/nest-config?style=flat-square&colorA=000000&colorB=000000\" alt=\"license\" /></a>\n  <a href=\"https://www.typescriptlang.org/\"><img src=\"https://img.shields.io/badge/TypeScript-strict-3178C6?style=flat-square&logo=typescript&logoColor=white\" alt=\"TypeScript\" /></a>\n  <a href=\"https://nodejs.org/\"><img src=\"https://img.shields.io/badge/Node.js-24%2B-339933?style=flat-square&logo=node.js&logoColor=white\" alt=\"Node.js\" /></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/bymaxone/nest-config\">GitHub</a> ·\n  <a href=\"https://github.com/bymaxone/nest-config/issues\">Issues</a> ·\n  <a href=\"#-quick-start\">Quick Start</a> ·\n  <a href=\"#-api-reference\">API Reference</a> ·\n  <a href=\"https://github.com/bymaxone/nest-config-example\">Example App</a>\n</p>\n\n---\n\n## ✨ Overview\n\n`@bymax-one/nest-config` gives a NestJS application a single, typed, validated entry point\nfor environment configuration. It validates `process.env` exactly once at bootstrap against a\n[Zod](https://zod.dev) v4 schema, fails fast with one aggregated report, and exposes the\nresult as a frozen object reached through typed dot paths.\n\nThe library has **zero direct dependencies** — `zod`, `reflect-metadata` and `@nestjs/*`\narrive as peer dependencies, so you control exact versions and the supply-chain surface stays\nminimal.\n\n### Why nest-config?\n\n- **A misconfigured process does not boot.** Validation runs before the application context\n  finishes building, so a service that is missing a secret never accepts the first request\n  that would need it.\n- **One round trip to fix the environment.** Every violation is collected and reported\n  together, not the first one that fails.\n- **Errors are value-free by contract.** Configuration is where the secrets are, and the\n  report is the artifact that gets logged and pasted into issues — so generated messages\n  carry the expected constraint and the schema's own enum options, never the received\n  value. Your own `custom` messages are the documented exception: they print as written.\n- **The schema is the type.** `get('database.url')` is `string` and `get('server.port')` is\n  `number` because the schema says so; a typo in a path is a build error, not a runtime\n  `undefined`.\n\n---\n\n## 🔥 Features\n\n### ✅ Validation\n\n- ✅ **Validate once, at bootstrap** — parsed and validated a single time, before the\n  application serves traffic; there is no lazy path that could discover a problem later\n- ✅ **Fail fast, fail complete** — every violation reported together in one aggregated\n  error, so an operator fixes the environment in one round trip\n- ✅ **Never echo values** — generated messages carry variable names, paths and constraint\n  descriptions only, so a secret cannot reach a log or a crash report through this library;\n  a `custom` message you write yourself is printed as written and is yours to keep value-free\n- ✅ **Zod v4 schemas** — the full type language, including coercion, refinements and\n  defaults, with `defineEnv` shaping namespaces and leaves\n\n### 🔒 The Validated Object\n\n- ✅ **Immutable by construction** — deep-frozen before it enters the DI container;\n  configuration is a fact about the process, not a mutable bag\n- ✅ **Typed dot-path access** — `get('database.url')` is `string`, `get('server.port')` is\n  `number`, with no casts and no `any` in the chain\n- ✅ **Injectable environment** — the raw source defaults to `process.env` but is a plain\n  injectable record, so a test validates any input without touching the real environment\n\n### 🧩 Developer Experience\n\n- ✅ **Zero runtime dependencies** — `zod`, `reflect-metadata` and `@nestjs/*` all arrive as\n  peers, so you pin the versions\n- ✅ **Testing entry point** — `./testing` builds the same validated object from an explicit\n  record, so a test never passes because a variable happened to be set on the machine\n- ✅ **One class identity** — the module and its testing entry share a single `./internal`\n  bundle, so `ConfigService` is the same injection token from either, in ESM and CommonJS\n- ✅ **Dual-format output** — ESM + CJS with declarations for each format, verified against\n  the packed tarball on every run\n- ✅ **Typed end to end** — TypeScript `strict` with `exactOptionalPropertyTypes` and\n  `noUncheckedIndexedAccess`; zero `any`\n\n---\n\n## 📦 Subpath Exports\n\n| Subpath      | Contents                                                                                                                                                                   |\n| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `.`          | `BymaxConfigModule`, `ConfigService`, `defineEnv`, the DI tokens, `BymaxConfigValidationError` and every option type                                                       |\n| `./testing`  | `configTestingModule`, `createTestConfig` — a validated config for a test without booting the application's own                                                            |\n| `./internal` | The shared runtime both entry points build on. **Not public API**: it is in the `exports` map because it has to resolve at runtime, not because it is meant to be imported |\n\n`.` and `./testing` are separate bundles, and a module reached from both by a\nrelative path would be _copied_ into each — a copied class is a different injection\ntoken and a different `instanceof` target. `./internal` is the one bundle they both\nimport by package specifier, which is what gives `ConfigService` a single identity in\nESM and CommonJS alike.\n\n### Install\n\n```bash\npnpm add @bymax-one/nest-config @nestjs/common @nestjs/core reflect-metadata zod\n```\n\n### Peer requirements\n\n| Package            | Version    |\n| ------------------ | ---------- |\n| Node.js            | `>=24.0.0` |\n| `@nestjs/common`   | `^11.0.16` |\n| `@nestjs/core`     | `^11.1.18` |\n| `reflect-metadata` | `^0.2.0`   |\n| `zod`              | `^4.0.0`   |\n\n## 🚀 Quick Start\n\nDefine a schema with `defineEnv`. Top-level keys are namespaces, leaves are\nenvironment-derived values; each leaf reads a `SCREAMING_SNAKE_CASE` variable\nderived from its path (`database.url` reads `DATABASE_URL`).\n\n<!-- Source: test/e2e/fixtures/env.schema.ts -->\n\n```typescript\nimport { z } from 'zod'\nimport { defineEnv } from '@bymax-one/nest-config'\n\nexport const envSchema = defineEnv({\n  server: z.object({\n    port: z.coerce.number().int().min(1).max(65535).default(3000),\n    env: z.enum(['development', 'test', 'production']).default('development')\n  }),\n  database: z.object({\n    url: z.url()\n  }),\n  redis: z.object({\n    url: z.url()\n  }),\n  log: z.object({\n    level: z.enum(['trace', 'debug', 'info', 'warn', 'error']).default('info')\n  })\n})\n\nexport type AppConfig = typeof envSchema.infer\n```\n\nRegister `BymaxConfigModule` once in the root module (it is global by\ndefault):\n\n```typescript\nimport { Module } from '@nestjs/common'\nimport { BymaxConfigModule } from '@bymax-one/nest-config'\nimport { envSchema } from './config/env.schema'\n\n@Module({\n  imports: [BymaxConfigModule.forRoot({ schema: envSchema })]\n})\nexport class AppModule {}\n```\n\nInject the typed `ConfigService` wherever configuration is needed, no casts:\n\n<!-- Source: test/e2e/fixtures/feature.provider.ts -->\n\n```typescript\nimport { Inject, Injectable } from '@nestjs/common'\nimport { ConfigService } from '@bymax-one/nest-config'\nimport type { AppConfig } from './config/env.schema'\n\n@Injectable()\nexport class FeatureProvider {\n  public constructor(@Inject(ConfigService) private readonly config: ConfigService<AppConfig>) {}\n\n  public describeConnection(): string {\n    return `${this.config.get('database.url')}::${this.config.get('server.port')}`\n  }\n}\n```\n\nA process started with an incomplete environment exits immediately with the\naggregated report, never one violation at a time:\n\n```\nBymaxConfigValidationError: environment validation failed (3 issues)\n\n  DATABASE_URL          missing required value (expected: url)\n  AUTH_JWT_SECRET        too short (expected: string, minimum 32 characters)\n  SERVER_PORT            invalid value (expected: integer between 1 and 65535)\n\nFix the variables above and restart the process.\n```\n\nIn a message this package generates, raw values are never printed — not\ntruncated, not masked, absent. That is a hard guarantee, verified by tests. The\none exception is a message you write yourself, described next.\n\nA rule you write yourself — a `.check`, `.refine` or `.superRefine` raising a\n`custom` issue — has no structural constraint to describe, so its own message is\nwhat the report prints:\n\n```\nBymaxConfigValidationError: environment validation failed (2 issues)\n\n  STORAGE_ENDPOINT      STORAGE_ENDPOINT is required when STORAGE_ENABLED is true.\n  LOG_PRETTY            LOG_PRETTY must be false when NODE_ENV is production.\n\nFix the variables above and restart the process.\n```\n\nThe message is used whether the variable is absent or present-but-invalid — a\nconditional rule explains an absent variable better than \"missing required\nvalue\" does — while `issue.code` still classifies it as\n`BYMAX_CONFIG_MISSING` or `BYMAX_CONFIG_INVALID`. Whitespace runs collapse to\nsingle spaces so a message wrapped across source lines keeps the one-line\nlayout.\n\nA `custom` issue raised without a message falls back to `invalid value`. Zod\nfills a message-less `custom` issue with its own default text before the\nvalidator sees it, so \"no message\" is recognized by matching that default\n(`Invalid input`) rather than by its absence. Two consequences, both deliberate:\nthat exact string is reserved — a schema that authors it verbatim reports\n`invalid value` — and under a configured non-English Zod locale (or a global\ncustom error map) the default no longer matches, so the localized default is\nreported as written instead.\n\n## 📖 API Reference\n\n### `defineEnv(shape)`\n\nA thin, typed factory over `z.object(...)` that establishes the two-level\nnamespace convention: top-level keys are namespaces, leaves are\nenvironment-derived values. It composes the caller's schemas as-is, never\nrewriting, cloning, or wrapping them, so coercion and defaults stay explicit\nconsumer choices. Leaves use `z.coerce.*` because the source arrives as\nstrings (the shape of `process.env`).\n\nA leaf can override its derived variable name through schema metadata when a\nlegacy name must be preserved:\n\n```typescript\ndatabase: z.object({\n  // Reads DB_CONNECTION_STRING instead of the derived DATABASE_URL.\n  url: z.url().meta({ env: 'DB_CONNECTION_STRING' })\n})\n```\n\nA namespace can declare itself **open**, which waives strict unknown-key\ndetection for the rest of its prefix. Use it when the prefix is shared with\nanother program that reads its own variables — see\n[Strict mode and shared prefixes](#strict-mode-and-shared-prefixes):\n\n```typescript\n// OTEL_ENABLED is read and validated; every other OTEL_* variable belongs to\n// the OpenTelemetry SDK, which reads it natively.\notel: z.object({ enabled: z.stringbool().default(false) }).meta({ open: true })\n```\n\nOnly the literal `true` opens a namespace. Any other value, and any metadata\nwithout the key, leaves detection in force.\n\n### `BymaxConfigModule`\n\n| Method                  | Signature                                                         |\n| ----------------------- | ----------------------------------------------------------------- |\n| `forRoot(options)`      | `(options: BymaxConfigModuleOptions) => DynamicModule`            |\n| `forRootAsync(options)` | `(options: ConfigurableModuleAsyncOptions<...>) => DynamicModule` |\n\n`BymaxConfigModuleOptions`:\n\n| Field               | Type                                           | Required | Notes                                                                                                                                                                                                                            |\n| ------------------- | ---------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `schema`            | `EnvSchema`                                    | yes      | Produced by `defineEnv`.                                                                                                                                                                                                         |\n| `source`            | `Record<string, string \\| undefined>`          | no       | Defaults to `process.env` in the provider factory. Injectable for tests.                                                                                                                                                         |\n| `onValidationError` | `(issues: ReadonlyArray<ConfigIssue>) => void` | no       | Observability hook invoked before the fail-fast throw. Cannot suppress the failure.                                                                                                                                              |\n| `strict`            | `boolean`                                      | no       | When true, source variables matching a namespace prefix but no declared leaf raise `BYMAX_CONFIG_UNKNOWN_KEY`. Defaults to `false`. Read [Strict mode and shared prefixes](#strict-mode-and-shared-prefixes) before enabling it. |\n\n`forRootAsync` resolves the source through another provider, for example a\nsecrets-manager client composed with `process.env`:\n\n<!-- Source: test/e2e/fixtures/secrets.provider.ts, secrets.module.ts, config-boot-async.e2e-spec.ts -->\n\n```typescript\nBymaxConfigModule.forRootAsync({\n  imports: [SecretsModule],\n  useFactory: (secrets: SecretsProvider) => ({\n    schema: envSchema,\n    source: { ...process.env, ...secrets.asEnvRecord() }\n  }),\n  inject: [SecretsProvider]\n})\n```\n\n`isGlobal` defaults to `true` and can be set to `false` through the standard\nextras when an application intentionally scopes configuration to a submodule.\n\n#### Strict mode and shared prefixes\n\n**A declared namespace claims its entire variable prefix.** Under `strict`, any\nsource variable starting with that prefix and matching no declared leaf fails\nthe boot — including variables this application never reads because _another\nprogram_ reads them. A namespace named `otel` claims `OTEL_*`, so the\nOpenTelemetry SDK's own `OTEL_EXPORTER_OTLP_ENDPOINT` and `OTEL_TRACES_SAMPLER`\nare rejected; a namespace named `redis` claims `REDIS_*`, so a `REDIS_PORT` that\nonly a compose file reads is rejected too. A prefix matching no declared\nnamespace at all (`POSTGRES_*` with no `postgres` namespace) is never inspected,\nwhich is why the failure lands hardest on schemas that share a prefix with a\nlibrary or a tool — the common case, not the edge one.\n\nDeclare such a namespace **open** to waive the check for the remainder of its\nprefix:\n\n```typescript\nexport const envSchema = defineEnv({\n  // OTEL_ENABLED is declared, read and validated. Every other OTEL_* variable\n  // is the SDK's, and strict leaves it alone.\n  otel: z.object({ enabled: z.stringbool().default(false) }).meta({ open: true }),\n  database: z.object({ url: z.url() })\n})\n```\n\nWhat the waiver does and does not do:\n\n- **Declared leaves stay bound.** `OTEL_ENABLED` is still read, coerced and\n  validated. Opening a namespace waives unknown-key detection only; it never\n  weakens the validation the schema does perform.\n- **The waiver is per namespace.** A stray `DATABASE_TYPO` is still reported\n  while `otel` is open. One open namespace does not disable strict mode.\n- **The most specific namespace wins.** If a schema declares both `otel` (open)\n  and `otelExporter` (closed), `OTEL_EXPORTER_TYPO` belongs to `otelExporter`\n  and is still reported.\n\n**The cost, stated plainly:** an open namespace cannot tell a foreign variable\nfrom a misspelled local one. Under an open `otel`, a typo of `OTEL_ENABLED`\npasses silently and the leaf falls back to its default. No design removes this —\nthe two cases are indistinguishable by name — so open the namespaces whose\nprefix genuinely belongs to someone else, and leave the rest closed.\n\n> Filtering the foreign names out of `source` instead is **not** equivalent, and\n> is worse in a way that is easy to miss: removing `OTEL_*` from the source also\n> unbinds the declared `OTEL_ENABLED`, whose `.default()` then manufactures a\n> plausible value while the variable silently stops being read.\n\n### `ConfigService<TConfig>`\n\nThe typed, injectable accessor over the frozen configuration object.\n\n| Method      | Signature                                                     | Notes                                            |\n| ----------- | ------------------------------------------------------------- | ------------------------------------------------ |\n| `get(path)` | `<P extends Path<TConfig>>(path: P) => PathValue<TConfig, P>` | Dot-path access, type inferred from the schema.  |\n| `getAll()`  | `() => Readonly<TConfig>`                                     | The deep-frozen root object.                     |\n| `has(path)` | `(path: Path<TConfig>) => boolean`                            | True when the resolved value is not `undefined`. |\n\nBecause validation completed at bootstrap, `get` never throws for a declared\npath: every leaf either passed validation, received its default, or the\nprocess did not start.\n\n### `BymaxConfigValidationError` and `ConfigIssue`\n\n```typescript\nexport class BymaxConfigValidationError extends Error {\n  public readonly code: ConfigValidationCode // 'BYMAX_CONFIG_VALIDATION'\n  public readonly issues: ReadonlyArray<ConfigIssue>\n}\n\nexport interface ConfigIssue {\n  readonly path: string // e.g. \"database.url\"\n  readonly variable: string // e.g. \"DATABASE_URL\"\n  readonly code: ConfigIssueCode\n  readonly message: string // constraint description, or your own `custom` message\n}\n```\n\n`ConfigErrorCode` is the frozen catalog backing `ConfigValidationCode` (the\nerror's own `code`) and `ConfigIssueCode` (each issue's `code`); see the\nerror catalog below for every value.\n\n### Reporting the failure\n\n`onValidationError` receives `ReadonlyArray<ConfigIssue>` — four string fields per\nissue, JSON-serializable, with no error to unwrap. Every description this package\ngenerates is value-free, so it can go straight into a log as structured data. The\nexception is the one described above: a `custom` message written by your own schema\nis printed as written, so if one of yours interpolates a value, reviewing it before\nit reaches a log is the schema author's job, not this package's.\n\nIf you also log the thrown error from a bootstrap `catch`, how you pass it decides\nwhat survives. `code` and `issues` are the **only two own enumerable properties** of\n`BymaxConfigValidationError`; `name`, `message` and `stack` are non-enumerable, as\non any `Error`. That splits the outcome three ways — all three measured:\n\n| Which representation reaches the sink                                                                   | The report (`message`) | `code` and `issues` |\n| ------------------------------------------------------------------------------------------------------- | ---------------------- | ------------------- |\n| the error object, read by a serializer that extracts the standard fields **and** copies own enumerables | ✅                     | ✅                  |\n| `error.stack`                                                                                           | ✅ inside the string   | ❌                  |\n| `JSON.stringify(error)`, `{ ...error }`                                                                 | ❌                     | ✅                  |\n\nRecognizing an `Error` is not enough on its own: extracting `name`, `message` and\n`stack` is what preserves the report, and copying the own enumerables is a separate\nstep that preserves `code` and `issues`. A serializer that does only the second is\nthe third row — `code` and `issues` and no report at all — so if you build the log\nrecord by hand, add `message` explicitly.\n\n**Which representation the sink sees is decided by your logging call, and that call\nis library-specific.** These are measured, not assumed:\n\n```typescript\nconsole.error('configuration invalid', error) // report, code and issues\npino.error({ err: error }, 'configuration invalid') // report, code and issues\npino.error('configuration invalid', error) // the error is dropped entirely\n\n// @bymax-one/nest-logger 1.2.6-1.2.9: wrap it, explicitly (see the note below)\nnestLogger.error('BOOT_FAILED', new Error('bootstrap failed', { cause: error }))\n```\n\nPino only applies error serialization when the error is the merging object or sits\nunder `err`; passed as a trailing argument it is treated as an interpolation value,\nand nothing about the failure reaches the entry.\n\n> [!NOTE]\n> **`@bymax-one/nest-logger` 1.2.6 through 1.2.9 dropped this error when it was logged\n> directly.** Its redactor left `_redactionFailed: true` and no `err` field at all —\n> no report, no `code`, no `issues`. The trigger was the definition rather than any\n> freezing: this error defines `code` and `issues` as non-writable, non-configurable\n> own properties, and the redactor's clone inherited those descriptors, so rewriting\n> the object-valued one with a walked copy failed. A locked scalar was unaffected,\n> which is why `code` alone never reproduced it.\n>\n> Fixed in **1.3.0**, measured rather than taken on report: a real failure logged\n> directly now arrives with `type, message, stack, code, issues`, the full issue array\n> and the report intact, and this error is left untouched. Measured affected: 1.2.6, 1.2.7\n> and 1.2.9 — 1.2.8 was never published, and on 1.2.2 and earlier this call shape does not\n> attach the error at all, so the defect does not arise there in this form. On an affected\n> version, wrap it — a `catch` receives this error unchanged, since the\n> module rethrows the instance it caught, so wrapping is an explicit\n> `new Error(message, { cause: error })` rather than a side effect of catching. A\n> lockfile pinned below 1.3.0 does not pick the fix up from an ordinary install, so the\n> update has to be deliberate.\n\nWrapping the error as the `cause` of an error you construct keeps all of it wherever the\nserializer walks the chain — measured against `@bymax-one/nest-logger` 1.2.7 and\n1.2.9, where a fifteen-issue report crosses the chain with `code`, every issue and\nthe full multi-line `message` intact.\n\nBefore any logger exists — which is where this failure usually lands, since a `catch`\nin `main.ts` runs before the logging module is registered — `console.error` is the\nreporter, and Node's inspector prints the stack and then appends the own enumerables.\nSo `console.error(message, error)` shows the report, the `code` and the expanded\n`issues` list, while `console.error(message, error.stack)` shows the report alone.\n\nLosing the machine-readable half is easy to miss precisely because the report keeps\narriving: `code` is what separates a configuration failure from any other boot\nfailure, and `issues` is what an alert or a dashboard keys on per variable.\n\n### Injection tokens\n\n`BYMAX_CONFIG` and `BYMAX_CONFIG_OPTIONS` are module-local `Symbol` tokens,\nexported for advanced factory-style wiring that needs the raw frozen config\nor the resolved options directly instead of going through `ConfigService`:\n\n```typescript\nimport { Inject, Injectable } from '@nestjs/common'\nimport { BYMAX_CONFIG } from '@bymax-one/nest-config'\nimport type { AppConfig } from './config/env.schema'\n\n@Injectable()\nexport class RawConfigConsumer {\n  public constructor(@Inject(BYMAX_CONFIG) private readonly config: Readonly<AppConfig>) {}\n}\n```\n\n### Type utilities\n\n`EnvSchema`, `EnvShape`, `EnvOutput`, `EnvLeaf`, and `EnvNamespace` type the\ntwo-level schema shape produced by `defineEnv`; `Path<T>` and `PathValue<T, P>`\nare the template-literal utilities behind `ConfigService.get`'s compile-time\ndot-path inference, limited to the two-level namespace convention. All five\nare exported for advanced generic code (custom decorators, typed wrappers)\nthat needs to reference the schema shape directly.\n\n## 🚨 Error Catalog\n\n| Code                       | Meaning                                                |\n| -------------------------- | ------------------------------------------------------ |\n| `BYMAX_CONFIG_VALIDATION`  | One or more schema violations (top-level error code).  |\n| `BYMAX_CONFIG_MISSING`     | Required variable absent from the source (issue code). |\n| `BYMAX_CONFIG_INVALID`     | Present but failed its constraint (issue code).        |\n| `BYMAX_CONFIG_UNKNOWN_KEY` | Strict mode: source variable matches no declared leaf. |\n\n## 🏗️ Architecture\n\n```\n                          process.env\n                     (or the record you inject)\n                                │\n                                ▼\n            ┌───────────────────────────────────────┐\n            │              defineEnv                │\n            │  namespaces at the top, Zod v4 leaves │\n            └───────────────────┬───────────────────┘\n                                │\n                                ▼\n            ┌───────────────────────────────────────┐\n            │        createValidatedConfig          │\n            │   runs ONCE, at bootstrap, and        │\n            │   collects EVERY failure first        │\n            └─────────┬─────────────────┬───────────┘\n                      │                 │\n                 all valid          any invalid\n                      │                 │\n                      ▼                 ▼\n              deep-frozen        BymaxConfigValidationError\n              BYMAX_CONFIG       one aggregated boot-time report\n                      │                 │\n                      ▼                 ▼\n               ConfigService     the process does not start\n          get('db.host') typed          │\n          from the schema itself   no request is ever served\n                      │                 with a missing secret\n                      ▼\n        ┌─────────────────────────────┐\n        │  ./testing                  │\n        │  same pipeline, explicit    │\n        │  source — a test cannot     │\n        │  pass because a variable    │\n        │  happened to be set         │\n        └─────────────────────────────┘\n```\n\nValidation happens at bootstrap and nowhere else. There is no lazy read, no cache to\ninvalidate, and no path where a request-time lookup can discover that an environment\nvariable was missing — by then the process would already have refused to start.\n\n`./testing` builds the same validated object from an explicit record, so a test that\nneeds configuration does not need the application's real environment, and cannot\naccidentally pass because a variable happened to be set on the machine.\n\n### Design Principles\n\n| Principle                            | Description                                                                                                                                                                                        |\n| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 💥 **Refuse to start**               | A misconfigured process is stopped before it serves a request, rather than discovering the gap at the first call that needs the value                                                              |\n| 🤐 **Value-free by contract**        | `errors.ts`, `env-validator.ts` and `report-formatter.ts` each state it for themselves: a generated message carries the expected constraint and the schema's own options, never the received value |\n| 📋 **Report everything at once**     | Validation collects every failure before throwing, so fixing an environment is one cycle instead of one per variable                                                                               |\n| 🧊 **Frozen after validation**       | Nothing in the running process rewrites configuration under a component that already read it                                                                                                       |\n| 🔤 **The schema is the type**        | Dot paths are checked against the schema at compile time, so a typo is a build error rather than a runtime `undefined`                                                                             |\n| ⚙️ **Configuration over convention** | Everything goes through `forRoot`/`forRootAsync`. No file discovery, no magic paths, no hidden precedence rules                                                                                    |\n| 🧩 **One class identity**            | The module and `./testing` import the shared runtime by package specifier, so `ConfigService` is one injection token in ESM and CommonJS alike                                                     |\n\n---\n\n## 🔐 Security Model\n\nConfiguration is where the secrets are, and a validation report is the one artifact\nguaranteed to be printed, logged, and pasted into an issue. That shapes the whole contract.\n\n### Errors are value-free by contract\n\nEvery message this library generates states the _expected_ constraint — the type, the\nallowed enum options taken from the schema, the bound — and never the received value.\n`env-validator` and `report-formatter` each say so in their own contracts, and\nproperty-based tests hold them to it. The messages you write yourself are the exception,\ncovered below.\n\n### The service does not serialize its configuration\n\n`ConfigService` keeps the validated root in an ECMAScript private field, so\n`JSON.stringify`, `Object.entries`, object spread and `util.inspect` cannot reach the\nvalues. Those are the paths taken by code that renders an injected provider it was handed\nincidentally — a logger formatting its arguments, an error reporter capturing the scope of\na throw. `toJSON` returns the declared namespace names, so the omission reads as deliberate\nrather than as an empty object. Reading on purpose is unaffected: `get`, `has` and the\n`getAll` escape hatch return the real values.\n\n### Failing fast is the security property\n\nA service that starts with a missing `JWT_SECRET` and discovers it at the first login is a\nservice that has already accepted traffic it cannot authenticate. The whole schema is\nvalidated before the application context finishes building, so a misconfigured deployment\ndoes not serve one request.\n\n### The validated object is frozen\n\nIt is deep-frozen before it enters the container, so nothing in the running process\nrewrites configuration under a component that already read it.\n\n### Nothing is read from anywhere but the source you name\n\n`process.env` by default, or the injectable record you provide. No file, no network, no\nremote provider — there is no path by which configuration arrives from somewhere you did\nnot choose.\n\n### Your own messages are yours\n\nValue-free applies to this library's reports. A `custom` issue from your own `.check`,\n`.refine` or `.superRefine` is printed as written — it is schema text, and it is the only\nplace a conditional or cross-field rule can state itself. That also means the message is\nyours to keep value-free: if it interpolates the received value, that value reaches the\nreport.\n\n---\n\n## 🛡️ Security Table\n\n| Layer          | Implementation                                                                                                                                                                  |\n| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Error messages | Expected constraint only — type, schema-declared enum options, bounds; never the received value. A `custom` message from your own schema is the exception: it prints as written |\n| Failure mode   | Refuse to start; the whole schema is validated before the context finishes building                                                                                             |\n| Aggregation    | Every failure reported at once, so a fix cycle is one restart rather than one per variable                                                                                      |\n| Immutability   | The validated result is frozen before it is provided                                                                                                                            |\n| Service state  | The root lives in a private field; serializing the injected service yields namespace names only                                                                                 |\n| Sources        | `process.env` only — no file, no network, no remote provider                                                                                                                    |\n| Type surface   | Dot paths checked against the schema at compile time; a typo is a build error, not a runtime `undefined`                                                                        |\n| Supply chain   | `dependencies: {}`; third-party Actions pinned by commit SHA (org-internal reusables by tag); CodeQL and OpenSSF Scorecard                                                      |\n\n> [!IMPORTANT]\n> **Value-free applies to this library's own reports.** A `custom` message from your\n> schema's `.check`, `.refine` or `.superRefine` is printed as written — including a\n> value, if you interpolate one into it.\n\n---\n\n## 🧱 Tech Stack\n\n- **Runtime:** Node.js 24+\n- **Framework:** NestJS 11 (`ConfigurableModuleBuilder`, `@Global()`, `Symbol()` tokens)\n- **Validation:** Zod `^4` (peer) — the schema language, the coercion and the error source\n- **Build:** tsup — ESM + CJS per subpath, with `.d.ts` _and_ `.d.cts` declarations,\n  and one shared `./internal` bundle so the module and its testing entry point hold\n  a single class identity\n- **Tests:** Jest, including property-based tests over the report formatter + Stryker (mutation)\n- **TypeScript:** 5.x strict (`noUncheckedIndexedAccess`, `exactOptionalPropertyTypes`), zero `any`\n\n---\n\n## 🧪 Testing & Quality\n\nConfiguration decides whether a process may start at all, so the suite is held to a bar\nbeyond \"the tests pass\".\n\n- ✅ **100% line coverage** — statements, branches, functions and lines, enforced as a gate\n- ✅ **99.61% mutation score** — verified with [Stryker](https://stryker-mutator.io/) at\n  `break: 95`; ten provable equivalents carry their reason inline, and the one survivor left\n  is an equivalent no directive can reach, so it stays counted rather than silenced\n  ([report](./docs/mutation_testing_results.md))\n- ✅ **The value-free guarantee is tested, not assumed** — a sentinel secret is placed in a\n  source and the assertion is that it appears nowhere in the rendered report or in the thrown\n  error, because a guarantee about what is _absent_ is the one thing an ordinary assertion\n  about output does not cover; the schema under test writes no `custom` message, so what is\n  proven is the guarantee this package makes for its own generated text\n- ✅ **Published-artifact gates** — `check:exports` resolves the types the way each module\n  system does, `check:runtime` loads every subpath from the packed tarball in ESM and\n  CommonJS, and `check:published` compiles this README's snippets against `dist/`\n- ✅ **Every suppression carries its reason** — no coverage directives anywhere; each\n  `// Stryker disable` in the production source names, after the `:` Stryker reads it from,\n  why the mutant it silences is behaviour-preserving, and `check:mutants` proves those\n  reasons parse so they reach the mutation report rather than the `Ignored using a comment`\n  fallback\n\n```bash\npnpm test          # unit suite\npnpm test:cov      # unit suite with the 100% coverage gate\npnpm mutation      # Stryker mutation testing (break: 95)\npnpm typecheck     # tsc strict check\npnpm lint          # ESLint\n```\n\n### Testing helpers\n\n`@bymax-one/nest-config/testing` removes every excuse for touching\n`process.env` in tests. `createTestConfig` synthesizes a complete valid\nsource from the schema (defaults where declared, deterministic placeholder\nvalues elsewhere), applies selective overrides, then runs the exact\nproduction pipeline (validate, freeze), so a test exercises the same code\npath a running application does.\n\n```typescript\nimport { createTestConfig } from '@bymax-one/nest-config/testing'\nimport { envSchema } from './config/env.schema'\n\nconst config = createTestConfig(envSchema, {\n  database: { url: 'postgres://localhost:5432/test' }\n})\n```\n\n`configTestingModule` registers the production `BymaxConfigModule` with a\nsynthesized source, ready to drop into a Nest `TestingModule` graph:\n\n```typescript\nimport { Test } from '@nestjs/testing'\nimport { configTestingModule } from '@bymax-one/nest-config/testing'\nimport { envSchema } from './config/env.schema'\nimport { FeatureProvider } from './feature.provider'\n\nconst moduleRef = await Test.createTestingModule({\n  imports: [configTestingModule(envSchema, { server: { port: 0 } })],\n  providers: [FeatureProvider]\n}).compile()\n```\n\nPlaceholder synthesis never fabricates values that could accidentally pass a\nsecret-strength constraint; length and format constraints are honored. The\nsubpath has no Jest dependency and works with any runner, though the family\nstandard is Jest.\n\n## 🚫 Known Limitations\n\n1. **Two-level namespace convention.** The path-inference utilities\n   (`Path<T>`, `PathValue<T, P>`) target `namespace.leaf` schemas. Deeper\n   nesting validates correctly but is not covered by `get()` path inference;\n   `getAll()` remains fully typed for arbitrary depth.\n2. **String-shaped sources only.** The source record is\n   `Record<string, string | undefined>` by design, the shape of a process\n   environment. Structured sources must be serialized into that shape before\n   validation.\n3. **No `.env` file loading.** Process environment population is the\n   platform's job: Node's native `--env-file`, container orchestrators, or CI\n   secrets. Bundling a loader would add a dependency and a second\n   source-of-truth.\n4. **No multi-source precedence.** One source record per module\n   registration. Precedence between layers (defaults, env, secrets) is the\n   caller's composition (`{ ...a, ...b }`), kept explicit on purpose.\n5. **An open namespace cannot detect a typo in its own prefix.** A foreign\n   variable and a misspelled local one are indistinguishable by name, so\n   `meta({ open: true })` accepts both. See\n   [Strict mode and shared prefixes](#strict-mode-and-shared-prefixes).\n\n## 🤝 Contributing\n\nPull requests are welcome. Please open an issue first for significant changes.\n\n- Read [`docs/technical_specification.md`](./docs/technical_specification.md) for architecture decisions.\n- Run the full gate listed in [`CONTRIBUTING.md`](./CONTRIBUTING.md) before opening a PR.\n- Conventional Commits are enforced by `commitlint.config.cjs`.\n\n---\n\n## 🔒 Security Policy\n\nIf you discover a security vulnerability, please **do not** open a public\nissue. Instead, email us at **support@bymax.one** with `[security]\n@bymax-one/nest-config` in the subject. We take security seriously and will\nrespond promptly. See [`SECURITY.md`](./SECURITY.md) for the full policy.\n\n---\n\n## 📄 License\n\n[MIT](./LICENSE) © [Bymax One](https://github.com/bymaxone)\n\n---\n\n<p align=\"center\">\n  <sub>Built with ❤️ by <a href=\"https://github.com/bymaxone\">Bymax One</a></sub>\n</p>\n","readmeFilename":"README.md"}