Typed schema-based validation with low calories
A lightweight schema-based validation library similar to Zod and VineJS. It is used by the @adonisjs/env package for validating environment variables, as bundling a full-blown validation library to validate environment variables seems like overkill.
Install the module from the npm registry as follows:
npm install @poppinss/validator-liteyarn add @poppinss/validator-litepnpm add @poppinss/validator-liteThe following example shows how to use the validator :
import { schema } from '@poppinss/validator-lite'
/**
* Define a schema
*/
const envSchema = {
HOST: schema.string({ format: 'host' }),
PORT: schema.number(),
APP_URL: schema.string.optional({ type: 'url', tld: false }),
}
/**
* Define the data
*/
const envVariables = {
HOST: 'localhost',
PORT: '3333'
}
/**
* Validate the data
*/
for (let [key, schemaFn] of Object.entries(envSchema)) {
schemaFn(key, envVariables[key])
}Following is the list of available methods :
Validate the value to exist and be a valid non-empty string.
{
APP_KEY: schema.string()
}{
APP_KEY: schema.string.optional()
}You can also force the value to have one of the pre-defined formats.
/**
* Must be a valid host (URL or IP address)
*/
schema.string({ format: 'host' })
/**
* Must be a valid URL with or without tld
*/
schema.string({ format: 'url' })
schema.string({ format: 'url', tld: false })
/**
* Must be a valid email address
*/
schema.string({ format: 'email' })
/**
* Must be a valid UUID
*/
schema.string({ format: 'uuid' })When validating the url format, you can also define additional options to force/ignore the tld and protocol.
schema.string({
format: 'url',
tld: false, // allow URL without .com, .net, and so on
protocol: false
})Validate the value to exist and be a valid non-empty boolean value. The following values will be cast to a JavaScript boolean data type.
'1', 'true'are casted toBoolean(true)'0', 'false'are casted toBoolean(false)
{
CACHE_VIEWS: schema.boolean()
}{
CACHE_VIEWS: schema.boolean.optional()
}Validate the value to exist and be a valid non-empty numeric value. The string representation of a number value will be cast to a JavaScript number data type.
{
PORT: schema.number()
}{
PORT: schema.number.optional()
}Validate the value to exist and must be one of the pre-defined values.
{
NODE_ENV: schema.enum(['development', 'production'] as const)
}{
MY_ENUM: schema.enum.optional(['development', 'production'] as const)
}For all other validation use cases, you can use custom functions. A custom function can throw errors for invalid values and must return the final output value.
{
PORT: (key, value) => {
if (!value) {
throw new Error('Value for PORT is required')
}
if (isNaN(Number(value))) {
throw new Error('Value for PORT must be a valid number')
}
return Number(value)
}
}