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()) })),
}),
},
})