{"_id":"@bonhomie/env-kit","name":"@bonhomie/env-kit","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@bonhomie/env-kit","version":"1.0.0","description":"Typed, validated environment variables for Node.js. Schema-based, collects all errors at once, zero dependencies.","type":"module","main":"dist/index.cjs","module":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"}},"sideEffects":false,"scripts":{"build":"tsup src/index.js --format esm,cjs --dts","prepublishOnly":"npm run build","test":"node --test test/env-kit.test.js"},"keywords":["env","environment","dotenv","config","validation","typed-env","env-validation","schema","startup","node","backend","bonhomie"],"author":{"name":"Bonhomie"},"license":"MIT","devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3"},"_id":"@bonhomie/env-kit@1.0.0","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-0zY0+PnQjSs7puj1RkwKgZjD80shyKDcSRKEcYHxTGsv0fTrBqjJi80BTY1q5D64BFn57Dn6BZ81C+7gJOUdYg==","shasum":"ab87362116bc589a0894292a09b33909d1deac11","tarball":"https://registry.npmjs.org/@bonhomie/env-kit/-/env-kit-1.0.0.tgz","fileCount":6,"unpackedSize":29615,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGuaObFh/QjWbn1GQyF2HGNb6Aqh7ORzVOyTsV+KWPCRAiApyQFKBFLedn2BTTjDGW9iBsTnPha8gXenPGYHaaqugQ=="}]},"_npmUser":{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"},"directories":{},"maintainers":[{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/env-kit_1.0.0_1777496536532_0.436646889681483"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-29T21:02:16.461Z","1.0.0":"2026-04-29T21:02:16.720Z","modified":"2026-04-29T21:02:16.945Z"},"maintainers":[{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"}],"description":"Typed, validated environment variables for Node.js. Schema-based, collects all errors at once, zero dependencies.","keywords":["env","environment","dotenv","config","validation","typed-env","env-validation","schema","startup","node","backend","bonhomie"],"author":{"name":"Bonhomie"},"license":"MIT","readme":"# @bonhomie/env-kit\n\nTyped, validated environment variables for Node.js.\n\nNo more `if (!process.env.X) throw new Error(...)` scattered across 10 files. Define a schema once — env-kit validates at startup, collects **all** errors before throwing, and returns a frozen, typed object.\n\n![npm](https://img.shields.io/npm/v/@bonhomie/env-kit)\n![license](https://img.shields.io/npm/l/@bonhomie/env-kit)\n![zero deps](https://img.shields.io/badge/dependencies-0-brightgreen)\n\n---\n\n## 📦 Installation\n\n```bash\nnpm install @bonhomie/env-kit\n```\n\n---\n\n## Quick Start\n\n```js\nimport { createEnv } from \"@bonhomie/env-kit\";\n\nexport const env = createEnv({\n  NODE_ENV:     { type: \"string\",  enum: [\"development\", \"production\", \"test\"], default: \"development\" },\n  PORT:         { type: \"port\",    default: 3000 },\n  DATABASE_URL: { type: \"url\",     required: true },\n  JWT_SECRET:   { type: \"string\",  required: true, minLength: 32 },\n  ADMIN_EMAIL:  { type: \"email\",   required: false },\n  ENABLE_CACHE: { type: \"boolean\", default: false },\n  MAX_UPLOAD:   { type: \"number\",  min: 1, max: 100, default: 10 },\n  FEATURES:     { type: \"json\",    default: {} },\n});\n\n// All values are typed and coerced\nconsole.log(env.PORT);         // number: 3000\nconsole.log(env.ENABLE_CACHE); // boolean: false\nconsole.log(env.FEATURES);     // object: {}\n```\n\nIf any field fails, startup throws with **all** errors at once:\n\n```\nEnvironment validation failed — 2 errors:\n\n  ✗  DATABASE_URL: is required but was not provided\n  ✗  JWT_SECRET: must be at least 32 characters\n```\n\n---\n\n## Types\n\n| Type      | Accepts              | Returns           |\n| --------- | -------------------- | ----------------- |\n| `string`  | Any string           | `string` (trimmed)|\n| `number`  | `\"42\"`, `\"3.14\"`     | `number`          |\n| `integer` | `\"7\"`, `\"100\"`       | `number` (integer)|\n| `boolean` | `true/false/1/0/yes/no/on/off` | `boolean` |\n| `port`    | `\"3000\"`, `\"8080\"`   | `number` (1–65535)|\n| `url`     | `\"https://...\"` (full URL) | `string`    |\n| `email`   | `\"user@domain.com\"`  | `string`          |\n| `json`    | `'{\"key\":\"val\"}'`    | Parsed value      |\n\n---\n\n## Field Options\n\n| Option       | Type              | Description                                             |\n| ------------ | ----------------- | ------------------------------------------------------- |\n| `type`       | `FieldType`       | One of the types above. Default: `\"string\"`.            |\n| `required`   | `boolean`         | Default: `true`. Set `false` to make optional.          |\n| `default`    | `any`             | Returned when the variable is missing. Makes optional automatically. |\n| `enum`       | `any[]`           | List of allowed values (checked after coercion).        |\n| `min`        | `number`          | Minimum value for number/integer/port.                  |\n| `max`        | `number`          | Maximum value for number/integer/port.                  |\n| `minLength`  | `number`          | Minimum string length.                                  |\n| `maxLength`  | `number`          | Maximum string length.                                  |\n| `validate`   | `(v) => true\\|string` | Custom validator. Return `true` to pass, or an error string. |\n| `description`| `string`          | Human-readable description (for documentation tooling). |\n\n---\n\n## Custom Validator\n\n```js\nconst env = createEnv({\n  JWT_SECRET: {\n    type: \"string\",\n    validate: (v) => v.length >= 32 || \"must be at least 32 characters\",\n  },\n  DATABASE_URL: {\n    type: \"url\",\n    validate: (v) => v.startsWith(\"postgresql://\") || \"must be a PostgreSQL URL\",\n  },\n});\n```\n\n---\n\n## Custom Source\n\nBy default reads from `process.env`. Pass any object as the second argument for testing or alternative sources:\n\n```js\nconst env = createEnv(\n  { PORT: { type: \"port\", default: 3000 } },\n  { PORT: \"4000\" }  // custom source\n);\n```\n\n---\n\n## Error Handling\n\n```js\nimport { createEnv, EnvError } from \"@bonhomie/env-kit\";\n\ntry {\n  const env = createEnv(schema);\n} catch (err) {\n  if (err instanceof EnvError) {\n    console.error(err.message);      // full formatted message\n    console.error(err.fields);       // [{ field: \"PORT\", message: \"...\" }, ...]\n  }\n}\n```\n\n---\n\n## Notes\n\n- The result is `Object.freeze`d — mutations are rejected in strict mode.\n- Whitespace-only values are treated as missing (prevents silent `Number(\"   \") → 0` bugs).\n- Zero dependencies.\n\n---\n\n## 📄 License\n\nMIT — **Bonhomie**\n","readmeFilename":"README.md","_rev":"1-c10b560599cdd0f8f393bb72a081a92a"}