Skip to content

Intevel/h3-valibot

Repository files navigation

h3-valibot

npm version npm downloads Github Actions CI License

Schema validation for h3 using Valibot 🤖

Install

# Using npm
npm install h3-valibot

# Using yarn
yarn add h3-valibot

Validation

import { useValidatedBody, v, vh } from 'h3-valibot'

import { createApp, createRouter, eventHandler } from 'h3';
import { email, minLength, string, objectAsync } from 'valibot';

export const app = createApp();
const LoginSchema = v.object({
    email: vh.email,
    password: v.pipe(v.string(), v.minLength(8)),
 });

const router = createRouter();
app.use(router);

router.post("/login", eventHandler(async (event) => {
    const body = await useValidatedBody(event, LoginSchema);
    return body;
  }),
);

Safe Validation

// same as above

router.post("/login", eventHandler(async (event) => {
    const body = await useSafeValidatedBody(event, LoginSchema);

    if (!body.success) // do something

    return body.output;
  }),
);

Utils available

h3-valibot provides a series of utils and their safe variants (don't throw an h3 error):

  • useValidatedBody
  • useValidatedParams
  • useValidatedQuery
  • useSafeValidatedBody
  • useSafeValidatedParams
  • useSafeValidatedQuery

Each one accepts an h3 event, a valibot schema and optionally a parser config.

Helpers

It also provides a set of helpers via vh object, mainly related to string validation, particularly useful during the prototyping phase of any project. For production use we still suggest to create dedicated schemas with project-related error messages and fallbacks.

  • boolAsString
  • checkboxAsString
  • dateAsString
  • intAsString
  • numAsString
  • email
  • uuid

For more details or examples please refer to their JSdocs or source code.

Errors

h3-valibot throws an ValiError when the validation fails:

Example

{
  "statusCode": 400,
  "statusMessage": "Bad Request",
  "stack": [],
  "data": {
    "issues": [
      {
        "validation": "email",
        "origin": "value",
        "message": "Invalid email",
        "input": "github@conner-bachmande",
        "path": [
          {
            "schema": "object",
            "input": {
              "email": "github@conner-bachmande",
              "password": "12345678"
            },
            "key": "email",
            "value": "github@conner-bachmande"
          }
        ],
        "reason": "string"
      }
    ],
    "name": "ValiError"
  }
}

Nuxt auto-imports

This library supports Nuxt's auto-imports, just add it in your nuxt.config.ts:

export default defineNuxtConfig({
  modules: [
    // ...
    'h3-valibot/nuxt',
  ],
})

License

Published under MIT - Made with ❤️ by Conner Bachmann