useRules
Validation rule management with Standard Schema support and custom aliases.
Installation
Register the plugin with your app-wide aliases:
import { createApp } from 'vue'
import { createRulesPlugin } from '@vuetify/v0'
import App from './App.vue'
const app = createApp(App)
app.use(
createRulesPlugin({
aliases: {
required: v => (v === 0 || !!v) || 'Required',
email: v => !v || /^.+@\S+\.\S+$/.test(String(v)) || 'Invalid email',
slug: v => !v || /^[a-z][a-z0-9-]*$/.test(String(v)) || 'Invalid slug',
},
})
)
app.mount('#app') Return false instead of a string to defer the error message to the locale plugin. When useLocale is installed, false resolves to locale.t('$rules.<aliasName>'). Without locale, it falls back to the alias name.
Usage
In a Component
createValidation resolves aliases automatically via useRules() — no manual wiring needed:
<script setup lang="ts">
import { createValidation } from '@vuetify/v0'
import { shallowRef } from 'vue'
const name = shallowRef('')
const validation = createValidation({
value: name,
rules: ['required', 'slug'],
})
</script>Standalone
createRules works without a plugin for use outside component scope:
import { createRules } from '@vuetify/v0'
const rules = createRules({
aliases: {
required: v => !!v || 'Required',
},
})
rules.resolve(['required'])Custom Aliases
An alias is a predicate — a FormValidationRule that returns true, a string, or false:
app.use(
createRulesPlugin({
aliases: {
// String return — inline error message
required: v => !!v || 'This field is required',
// String return — domain-specific
slug: v => !v || /^[a-z][a-z0-9-]*$/.test(String(v)) || 'Invalid slug',
// false return — defers to locale plugin for message
email: v => !v || /^.+@\S+\.\S+$/.test(String(v)) || false,
},
})
)Architecture
useRules resolves aliases, functions, and Standard Schema objects into FormValidationRule[] for use with createValidation:
Reactivity
useRules has no reactive state. Aliases are plain predicate functions — resolve() wraps them with locale-aware error message lookup when they return false.
| Property | Reactive | Notes |
|---|---|---|
aliases | Static map of predicate functions | |
resolve() | Pure function, returns array of rule functions |
Examples
Validation State
Key Name
valid: null
errors: 0
rules: 2/2
Owner Email
valid: null
errors: 0
rules: 2/2
Rate Limit (req/s)
valid: null
errors: 0
rules: 2/2
Prefix
valid: null
errors: 0
rules: 2/2
aggregate isValid: null
fields: 4
Recipes
Standard Schema
useRules supports Standard Schema↗︎ — a universal interface for validation libraries. Pass schema objects directly in rules arrays alongside alias strings and inline functions — resolve() auto-detects and wraps them.
Zod
<script setup lang="ts">
import { z } from 'zod'
import { createValidation } from '@vuetify/v0'
import { shallowRef } from 'vue'
const email = shallowRef('')
const emailValidation = createValidation({
value: email,
rules: ['required', z.string().email('Invalid email')],
})
const age = shallowRef('')
const ageValidation = createValidation({
value: age,
rules: [z.coerce.number().int().min(18, 'Must be 18+').max(120)],
})
</script>Valibot
<script setup lang="ts">
import * as v from 'valibot'
import { createValidation } from '@vuetify/v0'
import { shallowRef } from 'vue'
const username = shallowRef('')
const validation = createValidation({
value: username,
rules: ['required', v.pipe(v.string(), v.minLength(3), v.maxLength(20))],
})
</script>ArkType
<script setup lang="ts">
import { type } from 'arktype'
import { createValidation } from '@vuetify/v0'
import { shallowRef } from 'vue'
const score = shallowRef('')
const validation = createValidation({
value: score,
rules: [type('1 <= number <= 100')],
})
</script> Schema objects produce async rules. createValidation handles this transparently — no special handling needed in components.
Compatible Libraries
Any library that implements the Standard Schema v1 spec↗︎ works out of the box:
| Library | Version | Import |
|---|---|---|
| Zod↗︎ | v3.24+ | import { z } from 'zod' |
| Valibot↗︎ | v1.0+ | import * as v from 'valibot' |
| ArkType↗︎ | v2.0+ | import { type } from 'arktype' |
isStandardSchema()
isStandardSchema(value) is exported for use in custom rule factories. Returns true if the value implements the Standard Schema v1 interface (~standard.version === 1):
import { isStandardSchema } from '@vuetify/v0'
function myRuleFactory (input: unknown) {
if (isStandardSchema(input)) {
// wrap as standard schema rule
}
}FAQ
Pass the schema object directly in a createValidation rules array, alongside alias strings and inline functions — resolve() auto-detects Standard Schema↗︎ objects and wraps them. They produce async rules, which createValidation handles transparently.
A string is the inline error message shown on failure. Returning false defers the message to the locale plugin — it resolves to locale.t('$rules.<aliasName>') when useLocale is installed, falling back to the alias name otherwise.
createValidation resolves its alias strings through useRules() automatically, so you rarely call resolve() yourself. useRules owns the alias map and turns aliases, functions, and schemas into a FormValidationRule[].
Yes. createRules works standalone outside component scope, and createRulesContext with provideRules() shares aliases through provide/inject for a subtree. The app-wide createRulesPlugin is just the global option — pick whichever scope fits.