Skip to main content

Examples

App schema template​

Copy into src/env.ts:

import { createEnv, s } from "tiny-typed-env/node";

export const schema = {
NODE_ENV: s.enum(["development", "test", "production"], {
default: "development",
}),
PORT: s.port({ default: 3000 }),
DATABASE_URL: s.url(),
REDIS_URL: s.url({ optional: true }),
API_KEY: s.string({ min: 1 }),
DEBUG: s.boolean({ default: false }),
CORS_ORIGINS: s.csv({ default: [] }),
FEATURE_FLAGS: s.json<Record<string, boolean>>({ default: {} }),
TIMEOUT: s.duration({ default: "30s" }),
MAX_UPLOAD: s.bytes({ default: "10mb" }),
};

export const env = createEnv(schema);

export type Env = typeof env;

Then:

npx tiny-typed-env check
npx tiny-typed-env example
import { env } from "./env.js";

console.log(env.PORT);
console.log(env.TIMEOUT); // 30000

Nested groups​

Full guide: Nested groups.

import { createEnv, s } from "tiny-typed-env/node";

export const schema = {
server: {
DATABASE_URL: s.url(),
API_KEY: s.string({ min: 8 }),
},
public: {
APP_URL: s.url(),
},
};

export const env = createEnv(schema);

env.server.DATABASE_URL; // process.env.DATABASE_URL
env.public.APP_URL;

Workers / Deno (no .env files)​

import { loadEnv, s } from "tiny-typed-env";

export const env = loadEnv(
{
API_TOKEN: s.string({ min: 1 }),
LOG_LEVEL: s.enum(["debug", "info", "warn", "error"], {
default: "info",
}),
},
{
// Cloudflare Workers: pass env bindings
// Deno: Deno.env.toObject()
runtimeEnv: process.env,
},
);

Skip files in tests​

import { createEnv, s } from "tiny-typed-env/node";

export const env = createEnv(
{
DATABASE_URL: s.url(),
PORT: s.port({ default: 3000 }),
},
{
envFile: false,
runtimeEnv: process.env,
},
);