Skip to content

Typed and validated environment variables made easy

License

Notifications You must be signed in to change notification settings

arundo/typed-env

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ac39a1b · Apr 10, 2024

History

53 Commits
Apr 10, 2024
Nov 28, 2023
Jan 25, 2024
Apr 10, 2024
Jan 25, 2024
Nov 28, 2023
Nov 28, 2023
Nov 28, 2023
Nov 28, 2023
Nov 28, 2023
Apr 10, 2024
Nov 28, 2023
Apr 10, 2024
Apr 10, 2024
Jan 25, 2024
Nov 28, 2023

Repository files navigation

@arundo/typed-env

Typed environment variables using Zod.

Installation

npm install @arundo/typed-env

# or

yarn add @arundo/typed-env

# or

pnpm add @arundo/typed-env

Usage

Create a environment file with a schema and use typeEnvironment to create a typed environment object:

// environment.ts
import { z } from 'zod';
import { typeEnvironment } from '@arundo/typed-env';

export const envSchema = z.object({
  NODE_ENV: z.enum(['test', 'development', 'production']),
  PORT: z.coerce.number().int().default(3000),
});

export const environment = typeEnvironment(envSchema);

Import the environment object and use it:

// server.ts
import { environment } from './environment';

console.log(environment.NODE_ENV); // 'development' - type string
console.log(environment.PORT); // 3000 - type number

Set naming convention of environment variables:

// environment.ts

/* ... as usual ... */

export const environment = typeEnvironment(envSchema, { transform: 'camelcase' });
// server.ts
import { environment } from './environment';

console.log(environment.nodeEnv); // 'development' - type string
console.log(environment.port); // 3000 - type number

If you for some reason need to access the raw environment object, you can add types like this:

// environment.ts
import { z } from 'zod';
import { typeEnvironment } from '@arundo/typed-env';

export const envSchema = z.object({
  PORT: z.coerce.number().int().default(3000),
});

export const environment = typeEnvironment(envSchema, { transform: 'camelcase' });

declare global {
  namespace NodeJS {
    interface ProcessEnv extends Record<keyof z.infer<typeof envSchema>, string | undefined> {}
  }
}

console.log(process.env.PORT); // '3000' - type string | undefined