VVibeFlui

Validation

VibeFlui runs validation before submit.

Validation happens in two layers:

  1. Built-in declarative field rules.
  2. Registry validators.

Built-in rules

PropertyBehavior
requiredRejects empty string, null, undefined, and empty arrays.
minLengthChecks string length.
maxLengthChecks string length.
minChecks numeric value.
maxChecks numeric value.
patternChecks a JavaScript regular expression string.
type: "email"Checks email format.
validationMessageOverrides the built-in message for that field.
TS
export const usersSchema = {
  resource: "users",
  form: {
    fields: [
      {
        name: "name",
        label: "Name",
        type: "text",
        required: true,
        minLength: 2
      },
      {
        name: "email",
        label: "Email",
        type: "email",
        required: true
      },
      {
        name: "age",
        type: "number",
        min: 18,
        validationMessage: "Users must be at least 18 years old."
      }
    ]
  }
} as const;

Validation messages

Built-in validation uses message keys such as:

  • fieldRequired
  • fieldMinLength
  • fieldMaxLength
  • fieldMin
  • fieldMax
  • fieldPattern
  • fieldEmail

The default message catalog also contains additional keys that custom validators can reuse. Only the keys above are used by the built-in field rules.

TS
messages: {
  defaults: {
    fieldRequired: "{label} is required.",
    fieldMinLength: "{label} must be at least {min} characters."
  }
}

Registry validators

Use field.validator for custom logic.

TS
import { createRegistry } from "@vibeflui/core";

export const registry = createRegistry({
  validators: {
    "users.uniqueEmail": async (value) => {
      if (String(value).endsWith("@example.test")) {
        return "This test domain is not allowed.";
      }

      return undefined;
    }
  }
});
TS
export const usersSchema = {
  resource: "users",
  form: {
    fields: [
      {
        name: "email",
        type: "email",
        required: true,
        validator: "users.uniqueEmail"
      }
    ]
  },
  registry: {
    validators: ["users.uniqueEmail"]
  }
} as const;

Wizard step validation

In wizard layouts, the Next button validates only fields assigned to the active step. Final submit validates the full form.