Schema Libraries

Valibot

Valibot is a modular validation library with excellent tree-shaking. Only the functions you use are bundled.

Valibot is a modular validation library with excellent tree-shaking. Only the functions you use are bundled.

Installation

npm install valibot

Basic Schema

nuxt.config.ts
import { number, object, optional, string } from 'valibot'

export default defineNuxtConfig({
  modules: ['nuxt-safe-runtime-config'],
  runtimeConfig: {
    databaseUrl: '',
    secretKey: '',
    port: 3000,
    public: { apiBase: 'https://api.example.com', appName: 'My App' },
  },
  safeRuntimeConfig: {
    $schema: object({
      public: object({ apiBase: string(), appName: optional(string()) }),
      databaseUrl: string(),
      secretKey: string(),
      port: optional(number()),
    }),
  },
})

Common Patterns

Required vs Optional

import { number, object, optional, string } from 'valibot'

object({
  required: string(), // must exist, must be string
  optional: optional(string()), // can be undefined
  withDefault: optional(number(), 3000), // default if undefined
})

String Validations

import { email, maxLength, minLength, pipe, regex, string, url } from 'valibot'

object({
  email: pipe(string(), email()),
  apiUrl: pipe(string(), url()),
  token: pipe(string(), minLength(32)),
  slug: pipe(string(), regex(/^[a-z-]+$/)),
})

Number Validations

import { integer, maxValue, minValue, number, pipe } from 'valibot'

object({
  port: pipe(number(), integer(), minValue(1), maxValue(65535)),
  timeout: pipe(number(), minValue(0)),
})

Enums

import { picklist } from 'valibot'

object({
  logLevel: picklist(['debug', 'info', 'warn', 'error']),
  cacheStrategy: picklist(['memory', 'redis', 'none']),
})

Nested Objects

import { number, object, string } from 'valibot'

object({
  public: object({
    api: object({
      baseUrl: string(),
      version: string(),
    }),
  }),
  redis: object({
    host: string(),
    port: number(),
  }),
})

Full Example

nuxt.config.ts
import { email, number, object, optional, picklist, pipe, string, url } from 'valibot'

export default defineNuxtConfig({
  modules: ['nuxt-safe-runtime-config'],
  safeRuntimeConfig: {
    $schema: object({
      public: object({
        apiBase: pipe(string(), url()),
        appName: string(),
        logLevel: picklist(['debug', 'info', 'warn', 'error']),
      }),
      database: object({ url: string(), poolSize: optional(number()) }),
      auth: object({ jwtSecret: string(), sessionTtl: number() }),
      smtp: optional(object({ host: string(), port: number(), from: pipe(string(), email()) })),
    }),
  },
})
Copyright © 2026