{"_id":"@cafercangundogdu/nestjs-zod-config","_rev":"6-f278015be6b3232490aa30012a9d42dd","name":"@cafercangundogdu/nestjs-zod-config","dist-tags":{"latest":"0.3.0"},"versions":{"0.0.2":{"name":"@cafercangundogdu/nestjs-zod-config","version":"0.0.2","keywords":["nestjs","config","configuration","zod","validation","type-safe","dependency-injection"],"author":{"name":"Cafer Can Gundogdu"},"license":"MIT","_id":"@cafercangundogdu/nestjs-zod-config@0.0.2","maintainers":[{"name":"cafercangundogdu","email":"cafercangundogdu@gmail.com"}],"homepage":"https://github.com/cafercangundogdu/nestjs-zod-config#readme","bugs":{"url":"https://github.com/cafercangundogdu/nestjs-zod-config/issues"},"dist":{"shasum":"08d02d70606d80eb401f76c6fa564a6c1843fe18","tarball":"https://registry.npmjs.org/@cafercangundogdu/nestjs-zod-config/-/nestjs-zod-config-0.0.2.tgz","fileCount":9,"integrity":"sha512-km2wQeHJdDthx+y8So+AZHRa0T+iYZM71ZnAeCEDux/qdabsYjMk9H+Els3bFvbxv/BtCD/XawI2xNWr4KGx2w==","signatures":[{"sig":"MEUCIQD35YnKTxG6/GQLdd4CSByNKaBvom32aWRTdINjcpgOFwIgTGktNDxy59JV525xbnHIOTUM7Xo4FUV+nruOYbEkrNM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cafercangundogdu%2fnestjs-zod-config@0.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":15457},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"6d8ba88cb61f32f3e702e8031f3de7e427f28fef","scripts":{"lint":"biome check .","test":"jest","build":"tsc -p tsconfig.build.json","format":"biome format --write .","prepare":"husky","lint:fix":"biome check --write .","test:cov":"jest --coverage","test:watch":"jest --watch","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:78fc11c7-df14-43d7-9e3d-46cd8f371fc6"}},"repository":{"url":"git+https://github.com/cafercangundogdu/nestjs-zod-config.git","type":"git"},"_npmVersion":"11.11.1","description":"Type-safe, decorator-free NestJS configuration with Zod validation and plain constructor injection","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.6","jest":"^30.3.0","rxjs":"^7.8.2","husky":"^9.1.7","publint":"^0.3.18","ts-jest":"^29.4.6","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.5.0","@nestjs/core":"^11.1.17","@biomejs/biome":"^2.4.7","@nestjs/common":"^11.1.17","@nestjs/config":"^4.0.3","@commitlint/cli":"^20.5.0","@nestjs/testing":"^11.1.17","reflect-metadata":"^0.2.2","@arethetypeswrong/cli":"^0.18.2","@commitlint/config-conventional":"^20.5.0"},"peerDependencies":{"zod":"^3.20.0 || ^4.0.0","@nestjs/common":"^10.0.0 || ^11.0.0","@nestjs/config":"^3.0.0 || ^4.0.0","reflect-metadata":"^0.1.13 || ^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-zod-config_0.0.2_1773740153094_0.8220456412438231","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@cafercangundogdu/nestjs-zod-config","version":"0.1.0","keywords":["nestjs","config","configuration","zod","validation","type-safe","dependency-injection"],"author":{"name":"Cafer Can Gundogdu"},"license":"MIT","_id":"@cafercangundogdu/nestjs-zod-config@0.1.0","maintainers":[{"name":"cafercangundogdu","email":"cafercangundogdu@gmail.com"}],"homepage":"https://github.com/cafercangundogdu/nestjs-zod-config#readme","bugs":{"url":"https://github.com/cafercangundogdu/nestjs-zod-config/issues"},"dist":{"shasum":"8d41f546aef2f7f18fcc2ed2682a0c0cdf36b4ef","tarball":"https://registry.npmjs.org/@cafercangundogdu/nestjs-zod-config/-/nestjs-zod-config-0.1.0.tgz","fileCount":17,"integrity":"sha512-ox3ubfi8HnW9PqqtTB3KyU00EyAmv93NEhAxx/AcKLjxZifiYEszDIU3m6wsOX7ej6DFh91+qYFZ+P1pDizmIg==","signatures":[{"sig":"MEQCIBTQP1JUUbFHp1M5RzbC1PgecqkCC26mBwBJc/jvz9FOAiAkNAC38vuXNu3FTPT6ZIkgLLCOexjMekS/F3vxc2IHzw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cafercangundogdu%2fnestjs-zod-config@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":21518},"main":"./dist/cjs/index.js","type":"commonjs","types":"./dist/cjs/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}},"./package.json":"./package.json"},"gitHead":"16f385e58b7a8ed50c347b77c5735435ac0c6cc0","scripts":{"lint":"biome check .","test":"pnpm run typecheck && jest","build":"pnpm run clean && pnpm run build:cjs && pnpm run build:esm && node scripts/dist-fixup.mjs","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","format":"biome format --write .","prepare":"husky","lint:fix":"biome check --write .","test:cov":"jest --coverage","build:cjs":"tsc -p tsconfig.build.json","build:esm":"tsc -p tsconfig.build.esm.json","typecheck":"tsc -p tsconfig.json","test:watch":"jest --watch","check:package":"publint && attw --pack .","prepublishOnly":"pnpm run build && pnpm run check:package"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:78fc11c7-df14-43d7-9e3d-46cd8f371fc6"}},"repository":{"url":"git+https://github.com/cafercangundogdu/nestjs-zod-config.git","type":"git"},"_npmVersion":"12.0.1","description":"Type-safe, decorator-free NestJS configuration with Zod validation and plain constructor injection","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","jest":"^30.4.2","rxjs":"^7.8.2","husky":"^9.1.7","publint":"^0.3.21","@swc/core":"^1.15.43","@swc/jest":"^0.2.39","typescript":"^7.0.2","@types/jest":"^30.0.0","@types/node":"^26.1.1","@nestjs/core":"^11.1.28","@biomejs/biome":"^2.5.4","@nestjs/common":"^11.1.28","@nestjs/config":"^4.0.4","@commitlint/cli":"^21.2.1","@nestjs/testing":"^11.1.28","reflect-metadata":"^0.2.2","@arethetypeswrong/cli":"^0.18.5","@commitlint/config-conventional":"^21.2.0"},"peerDependencies":{"zod":"^3.20.0 || ^4.0.0","@nestjs/common":"^10.0.0 || ^11.0.0","@nestjs/config":"^3.0.0 || ^4.0.0","reflect-metadata":"^0.1.13 || ^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-zod-config_0.1.0_1784100859154_0.21620348184852145","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@cafercangundogdu/nestjs-zod-config","version":"0.2.0","keywords":["nestjs","config","configuration","zod","validation","type-safe","dependency-injection"],"author":{"name":"Cafer Can Gundogdu"},"license":"MIT","_id":"@cafercangundogdu/nestjs-zod-config@0.2.0","maintainers":[{"name":"cafercangundogdu","email":"cafercangundogdu@gmail.com"}],"homepage":"https://github.com/cafercangundogdu/nestjs-zod-config#readme","bugs":{"url":"https://github.com/cafercangundogdu/nestjs-zod-config/issues"},"dist":{"shasum":"bcb4b3b77b87c9b7bb3b6c7addabeb77e581329e","tarball":"https://registry.npmjs.org/@cafercangundogdu/nestjs-zod-config/-/nestjs-zod-config-0.2.0.tgz","fileCount":17,"integrity":"sha512-S5m7F+bjTHVgss+GkXZrQIQFoY166gu/PSAv+70c+0YxEX/gMuNeQKHjiAAVOK7sZnGp1lIb4CdFPM4tsZcVIw==","signatures":[{"sig":"MEUCIGb0piYvnJh0ogzHsxDteIEew1i/AjyRG1YBmn/gxgjmAiEAlfSLi81EDQGlVztKaEovwhpmTU+K2O5ovTpV5YXF97g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cafercangundogdu%2fnestjs-zod-config@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":21840},"main":"./dist/cjs/index.js","type":"commonjs","types":"./dist/cjs/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}},"./package.json":"./package.json"},"gitHead":"2801a1e8fc3ebd036ff04a4ee114077595902fd8","scripts":{"lint":"biome check .","test":"pnpm run typecheck && vitest run","build":"pnpm run clean && pnpm run build:cjs && pnpm run build:esm && node scripts/dist-fixup.mjs","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","format":"biome format --write .","prepare":"husky","lint:fix":"biome check --write .","test:cov":"vitest run --coverage","build:cjs":"tsc -p tsconfig.build.json","build:esm":"tsc -p tsconfig.build.esm.json","typecheck":"tsc -p tsconfig.json","test:watch":"vitest","check:package":"publint && attw --pack .","prepublishOnly":"pnpm run build && pnpm run check:package"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:78fc11c7-df14-43d7-9e3d-46cd8f371fc6"}},"repository":{"url":"git+https://github.com/cafercangundogdu/nestjs-zod-config.git","type":"git"},"_npmVersion":"12.0.2","description":"Type-safe, decorator-free NestJS configuration with Zod validation and plain constructor injection","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"packageManager":"pnpm@11.26.0","devDependencies":{"zod":"^4.5.4","rxjs":"^7.8.2","husky":"^9.1.7","vitest":"^5.0.0","publint":"^0.3.24","@swc/core":"^1.16.2","typescript":"^7.0.2","@types/node":"^26.5.0","@nestjs/core":"^12.0.1","unplugin-swc":"^1.6.0","@biomejs/biome":"^2.5.12","@nestjs/common":"^12.0.1","@nestjs/config":"^12.0.0","@commitlint/cli":"^21.2.2","@nestjs/testing":"^12.0.1","reflect-metadata":"^0.2.2","@vitest/coverage-v8":"^5.0.0","@arethetypeswrong/cli":"^0.18.5","@commitlint/config-conventional":"^21.2.2"},"peerDependencies":{"zod":"^3.20.0 || ^4.0.0","@nestjs/common":"^11.0.0 || ^12.0.0","@nestjs/config":"^4.0.0 || ^12.0.0","reflect-metadata":"^0.1.13 || ^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-zod-config_0.2.0_1788936509175_0.614390104311954","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@cafercangundogdu/nestjs-zod-config","version":"0.3.0","description":"Type-safe, decorator-free NestJS configuration with Zod validation and plain constructor injection","author":{"name":"Cafer Can Gundogdu"},"license":"MIT","type":"commonjs","main":"./dist/cjs/index.js","module":"./dist/esm/index.js","types":"./dist/cjs/index.d.ts","exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}},"./package.json":"./package.json"},"sideEffects":false,"engines":{"node":">=22.12.0"},"packageManager":"pnpm@12.3.4","scripts":{"clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","build":"pnpm run clean && pnpm run build:cjs && pnpm run build:esm && node scripts/dist-fixup.mjs","build:cjs":"tsc -p tsconfig.build.json","build:esm":"tsc -p tsconfig.build.esm.json","typecheck":"tsc -p tsconfig.json","test":"pnpm run typecheck && vitest run","test:watch":"vitest","test:cov":"vitest run --coverage","lint":"biome check .","lint:fix":"biome check --write .","format":"biome format --write .","check:package":"publint && attw --pack .","prepublishOnly":"pnpm run build && pnpm run check:package","prepare":"husky"},"keywords":["nestjs","config","configuration","zod","validation","type-safe","dependency-injection"],"repository":{"type":"git","url":"git+https://github.com/cafercangundogdu/nestjs-zod-config.git"},"peerDependencies":{"@nestjs/common":"^11.0.0 || ^12.0.0","@nestjs/config":"^4.0.0 || ^12.0.0","reflect-metadata":"^0.1.13 || ^0.2.0","zod":"^3.20.0 || ^4.0.0"},"devDependencies":{"@arethetypeswrong/cli":"^0.18.5","@biomejs/biome":"^2.5.12","@commitlint/cli":"^21.2.2","@commitlint/config-conventional":"^21.2.2","@nestjs/common":"^12.0.1","@nestjs/config":"^12.0.0","@nestjs/core":"^12.0.1","@nestjs/testing":"^12.0.1","@swc/core":"^1.16.2","@types/node":"^26.5.0","@vitest/coverage-v8":"^5.0.0","husky":"^9.1.7","publint":"^0.3.24","reflect-metadata":"^0.2.2","rxjs":"^7.8.2","typescript":"^7.0.2","unplugin-swc":"^1.6.0","vitest":"^5.0.0","zod":"^4.5.4"},"gitHead":"1ac0bbe43de316a3ec385aeaf5a7307a332af3a7","_id":"@cafercangundogdu/nestjs-zod-config@0.3.0","bugs":{"url":"https://github.com/cafercangundogdu/nestjs-zod-config/issues"},"homepage":"https://github.com/cafercangundogdu/nestjs-zod-config#readme","_nodeVersion":"22.23.2","_npmVersion":"12.0.2","dist":{"integrity":"sha512-R81M3GMujRair8Nk3wnVVSYokPo6hKFVJrDVODs4+uhGj5fmEU5hh276dywR9wbhy/n3BuEmULIxnMqP47RaAQ==","shasum":"db91cb10d412063129ac160b67caa5840f53975c","tarball":"https://registry.npmjs.org/@cafercangundogdu/nestjs-zod-config/-/nestjs-zod-config-0.3.0.tgz","fileCount":17,"unpackedSize":24109,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cafercangundogdu%2fnestjs-zod-config@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHdHSS9lSPtx2duZvImFzCPM73CiJSdZkkZon1Za9mM2AiEAyoMleE7/K0z5s8lJDRVfLA+tQMe4L+ukw7sCgRSyQdw="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:78fc11c7-df14-43d7-9e3d-46cd8f371fc6"}},"directories":{},"maintainers":[{"name":"cafercangundogdu","email":"cafercangundogdu@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nestjs-zod-config_0.3.0_1788961002536_0.6885726776311429"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-17T06:56:34.263Z","modified":"2026-09-09T13:36:42.997Z","0.0.1":"2026-03-17T06:56:34.500Z","0.0.2":"2026-03-17T09:35:53.252Z","0.1.0":"2026-07-15T07:34:19.290Z","0.2.0":"2026-09-09T06:48:29.320Z","0.3.0":"2026-09-09T13:36:42.662Z"},"bugs":{"url":"https://github.com/cafercangundogdu/nestjs-zod-config/issues"},"author":{"name":"Cafer Can Gundogdu"},"license":"MIT","homepage":"https://github.com/cafercangundogdu/nestjs-zod-config#readme","keywords":["nestjs","config","configuration","zod","validation","type-safe","dependency-injection"],"repository":{"type":"git","url":"git+https://github.com/cafercangundogdu/nestjs-zod-config.git"},"description":"Type-safe, decorator-free NestJS configuration with Zod validation and plain constructor injection","maintainers":[{"name":"cafercangundogdu","email":"cafercangundogdu@gmail.com"}],"readme":"# @cafercangundogdu/nestjs-zod-config\n\n[![npm version](https://img.shields.io/npm/v/@cafercangundogdu/nestjs-zod-config.svg)](https://www.npmjs.com/package/@cafercangundogdu/nestjs-zod-config)\n[![npm downloads](https://img.shields.io/npm/dm/@cafercangundogdu/nestjs-zod-config.svg)](https://www.npmjs.com/package/@cafercangundogdu/nestjs-zod-config)\n[![CI](https://github.com/cafercangundogdu/nestjs-zod-config/actions/workflows/ci.yml/badge.svg)](https://github.com/cafercangundogdu/nestjs-zod-config/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.4+-blue.svg)](https://www.typescriptlang.org/)\n[![NestJS](https://img.shields.io/badge/NestJS-11+%20%7C%2012+-ea2845.svg)](https://nestjs.com/)\n[![Zod](https://img.shields.io/badge/Zod-3+%20%7C%204+-3068b7.svg)](https://zod.dev/)\n\n> Type-safe, decorator-free NestJS configuration with Zod validation and plain constructor injection.\n\n## Why?\n\nNestJS configuration typically requires `@Inject()` decorators, string-based keys, or manual `ConfigService.get()` calls — all of which lose type safety or add boilerplate. This library gives you:\n\n- **Plain constructor injection** — no `@Inject()`, no string keys\n- **Zod validation at startup** — fail fast with clear error messages\n- **Full type safety** — missing properties, wrong types, and env var typos caught at compile time\n- **Zero global state** — pure `defineConfig()`, explicit `forRoot({ configs })`\n- **Dual ESM/CJS package** — native `import` and `require` entry points, validated with publint and arethetypeswrong\n\n```typescript\n@Injectable()\nexport class UserService {\n  constructor(private auth: AuthConfig) {} // fully typed, no decorators\n\n  getSecret() {\n    return this.auth.jwtSecret; // string - autocomplete works\n  }\n}\n```\n\n## Install\n\n```bash\npnpm add @cafercangundogdu/nestjs-zod-config\n```\n\nPeer dependencies:\n\n```bash\npnpm add @nestjs/common @nestjs/config zod reflect-metadata\n```\n\n## Quick start\n\n### 1. Define a config\n\n```typescript\n// config/auth.config.ts\nimport { z } from 'zod';\nimport { defineConfig } from '@cafercangundogdu/nestjs-zod-config';\n\nexport abstract class AuthConfig {\n  abstract jwtSecret: string;\n  abstract jwtExpiresIn: string;\n  abstract bcryptRounds: number;\n}\n\nexport const auth = defineConfig({\n  name: 'auth',\n  token: AuthConfig,\n  schema: z.object({\n    JWT_SECRET: z.string().min(1),\n    JWT_EXPIRES_IN: z.string().default('7d'),\n    BCRYPT_ROUNDS: z.coerce.number().default(10),\n  }),\n  map: (env) => ({\n    jwtSecret: env.JWT_SECRET,\n    jwtExpiresIn: env.JWT_EXPIRES_IN,\n    bcryptRounds: env.BCRYPT_ROUNDS,\n  }),\n});\n```\n\n### 2. Register configs in your module\n\n```typescript\n// app.module.ts\nimport { Module } from '@nestjs/common';\nimport { TypedConfigModule } from '@cafercangundogdu/nestjs-zod-config';\nimport { auth } from './config/auth.config';\nimport { database } from './config/database.config';\n\n@Module({\n  imports: [\n    TypedConfigModule.forRoot({\n      configs: [auth, database],\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\n### 3. Inject with plain constructor injection\n\n```typescript\n// user.service.ts\nimport { Injectable } from '@nestjs/common';\nimport { AuthConfig } from './config/auth.config';\nimport { DatabaseConfig } from './config/database.config';\n\n@Injectable()\nexport class UserService {\n  constructor(\n    private auth: AuthConfig,\n    private db: DatabaseConfig,\n  ) {}\n\n  getTokenExpiry() {\n    return this.auth.jwtExpiresIn; // string\n  }\n\n  getPoolSize() {\n    return this.db.poolSize; // number\n  }\n}\n```\n\nNo `@Inject()`, no string keys, no decorators. The abstract class serves as both the TypeScript type and the NestJS injection token.\n\n## API\n\n### `defineConfig(options)`\n\nPure function with no side effects. Returns a `ConfigDefinition` to pass to `TypedConfigModule.forRoot()`.\n\n| Option   | Type             | Description                                          |\n| -------- | ---------------- | ---------------------------------------------------- |\n| `name`   | `string`         | Unique namespace name for `@nestjs/config` internals |\n| `token`  | `abstract class` | Abstract class used as both DI token and type        |\n| `schema` | `z.ZodObject`    | Zod schema for env var validation                    |\n| `map`    | `(parsed) => T`  | Maps validated env vars to config shape              |\n\n### `TypedConfigModule.forRoot(options)`\n\n| Option            | Type                 | Default | Description                     |\n| ----------------- | -------------------- | ------- | ------------------------------- |\n| `configs`         | `ConfigDefinition[]` | -       | Config definitions to register  |\n| `isGlobal`        | `boolean`            | `true`  | Register as global module       |\n| `envFilePath`     | `string \\| string[]` | -       | Path to `.env` file(s)          |\n| `expandVariables` | `boolean`            | -       | Expand `$VAR` references in env |\n\nDuplicate namespace names or tokens are detected at startup and throw immediately.\n\n## How it works\n\n1. `defineConfig()` creates a Zod schema + NestJS provider pair (pure, no global state)\n2. `TypedConfigModule.forRoot({ configs })` receives the definitions explicitly and:\n   - Checks for duplicate namespaces/tokens\n   - Validates only the given schemas against `process.env` at startup\n   - Passes namespaces to `ConfigModule.forRoot({ load: [...] })`\n   - Registers providers that bridge `@nestjs/config` namespaces to abstract class tokens\n3. At injection time, NestJS resolves the abstract class token to the validated, mapped config object\n\n## Type safety\n\nThe generic chain is fully connected with compile-time checks:\n\n| Scenario                        | Caught at   | Mechanism                  |\n| ------------------------------- | ----------- | -------------------------- |\n| Missing property in `map`       | Compile     | `NoInfer<TConfig>`         |\n| Wrong property type in `map`    | Compile     | `NoInfer<TConfig>`         |\n| Typo in env var name            | Compile     | `z.infer<ZodObject>`       |\n| Invalid env var value           | Startup     | Zod validation             |\n| Missing required env var        | Startup     | Zod validation             |\n| Duplicate namespace/token       | Startup     | `checkDuplicates()`        |\n| Wrong property access on inject | Compile     | Abstract class type        |\n\n## Compatibility\n\n| Dependency          | Supported versions |\n| ------------------- | ------------------ |\n| `@nestjs/common`    | ^11.0.0 \\|\\| ^12.0.0 |\n| `@nestjs/config`    | ^4.0.0 \\|\\| ^12.0.0  |\n| `zod`               | ^3.20.0 \\|\\| ^4.0.0  |\n| `reflect-metadata`  | ^0.1.13 \\|\\| ^0.2.0  |\n| `typescript`        | >= 5.4 (requires `NoInfer`) |\n| `node`              | >= 22.12.0 |\n\nNestJS 12 packages are ESM-only. This library ships both CJS and ESM builds, so it works from either module system. A CommonJS app on NestJS 12 relies on Node's `require(esm)`, which is available without flags since Node 22.12 — the same floor as `engines.node`.\n\n## Development\n\nRequires Node 22.12+ and pnpm 12. The `packageManager` field pins the exact pnpm version: any installed pnpm 10+ switches to it automatically, and Corepack works too on Node versions that still ship it (up to 24).\n\n```bash\npnpm install\npnpm test              # typecheck + Vitest\npnpm run test:watch\npnpm run test:cov\npnpm run lint          # Biome\npnpm run typecheck\npnpm run build         # CJS + ESM\npnpm run check:package # publint + are-the-types-wrong\n```\n\nCI runs the suite on Node 22/24 × NestJS 11/12 — the lockfile pins NestJS 12 and the 11 leg swaps in `@nestjs/common`/`core`/`testing` 11 with `@nestjs/config` 4, which is that line's release of the config package.\n\npnpm enforces a 7-day `minimumReleaseAge` supply-chain policy in `pnpm-workspace.yaml`, mirroring the Dependabot cooldown, so a brand-new release will not install until it has settled.\n\nCommits follow [Conventional Commits](https://www.conventionalcommits.org/), enforced by commitlint via a husky hook.\n\nChangelog: [CHANGELOG.md](CHANGELOG.md).\n\n### Releasing\n\nReleases are driven by [release-please](https://github.com/googleapis/release-please). Every push to `main` refreshes a `chore(main): release x.y.z` pull request built from the Conventional Commits since the last tag — `feat` bumps the minor, `fix` the patch, and while the package is below 1.0.0 a `!` / `BREAKING CHANGE` bumps the minor too.\n\nMerging that PR bumps `package.json` and `.release-please-manifest.json`, rewrites `CHANGELOG.md`, and creates the `vX.Y.Z` tag and GitHub release. The publish workflow then runs on that push to `main` and publishes to npm with provenance — it skips versions already on npm, so ordinary merges are no-ops.\n\nWith the default `GITHUB_TOKEN`, CI on the release PR is created but held for a manual approval (\"Approve and run\" on the PR's checks, or `gh api -X POST repos/<owner>/<repo>/actions/runs/<run-id>/approve`). Add a `RELEASE_PLEASE_TOKEN` secret (a PAT with contents + pull-requests write) to have it run automatically. Note that release-please only refreshes the PR branch when the release content changes, so a fix landed on main afterwards is not in the PR until it is recreated (close it and re-run the workflow).\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md"}