Skip to content

Global configuration

If your app includes multiple forms, it can be helpful to define a global configuration that centralizes your custom validators, error messages, and modifiers. This eliminates the need to declare these settings repeatedly for every useRegle call, improving both code consistency and developer experience with features like autocompletion and type checking.

Replace built-in rules messages

Each @regle/rules rule provides a default error message. You may may not want to call withMessage every time you need to use one with a custom error message.

defineRegleConfig allows you to redefine the default messages of built-in rules.

ts
import { 
defineRegleConfig
} from '@regle/core';
import {
withMessage
,
minLength
,
required
} from '@regle/rules';
const {
useRegle
:
useCustomRegle
} =
defineRegleConfig
({
rules
: () => ({
required
:
withMessage
(
required
, 'You need to provide a value'),
minLength
:
withMessage
(
minLength
, ({
$value
,
$params
: [
max
] }) => {
return `Minimum length is ${
max
}. Current length: ${
$value
?.
length
}`;
}) }) }) const {
r$
} =
useCustomRegle
({
name
: '' }, {
name
: {
required
,
minLength
:
minLength
(6)
} })

Result:

TIP

If you use Nuxt, check out the Nuxt module for a even better DX.
It provides a way to add your custom global config to your auto-imports.

i18n

You can also use any i18n library directly inside the config.

ts
import { defineRegleConfig } from '@regle/core';
import { withMessage, minLength, required } from '@regle/rules';
import { useI18n } from 'vue-i18n';

const { useRegle: useCustomRegle } = defineRegleConfig({
  rules: () => {
    const { t } = useI18n()

    return {
      required: withMessage(required, t('general.required')),
      minLength: withMessage(minLength, ({ $value, $params: [max] }) => {
        return t('general.minLength', {max});
      })
    }
  }
})

Declare new rules

While useRegle allows you to use any rule key, adding custom rules to the global configuration provides autocompletion and type checking. This improves maintainability and consistency across your application.

ts
import { 
defineRegleConfig
,
createRule
,
Maybe
} from '@regle/core';
import {
withMessage
,
isFilled
} from '@regle/rules';
const
asyncEmail
=
createRule
({
async
validator
(
value
:
Maybe
<string>) {
if (!
isFilled
(
value
)) {
return true; } const
result
= await
someAsyncCall
();
return
result
;
},
message
: 'Email already exists',
}); const {
useRegle
:
useCustomRegle
} =
defineRegleConfig
({
rules
: () => ({
asyncEmail
}) }) const {
r$
} =
useCustomRegle
({
name
: '' }, {
name
: {
asy
} })

Declare modifiers

You can include global modifiers in your configuration to automatically apply them wherever you use the useRegle composable. This avoids repetitive declarations and keeps your code clean.

ts
import { 
defineRegleConfig
} from '@regle/core';
import {
withMessage
,
minLength
,
required
} from '@regle/rules';
export const {
useRegle
:
useCustomRegle
} =
defineRegleConfig
({
modifiers
: {
autoDirty
: false,
silent
: true,
lazy
: true,
rewardEarly
: true
} })

Export scoped inferRules helper

defineRegleConfig also returns a scoped inferRules helper, similar to the one exported from @regle/core, but that will autocomplete and check your custom rules.

For information about inferRules, check Typing rules docs

ts
import { 
defineRegleConfig
} from '@regle/core';
import {
withMessage
,
minLength
,
required
} from '@regle/rules';
export const {
useRegle
,
inferRules
} =
defineRegleConfig
({/* */})

Extend global config

It's also possible to add additional config to an already created custom useRegle.

With extendRegleConfig, you can recreate a custom one with a existing composable as an input.

ts
import { 
defineRegleConfig
,
extendRegleConfig
,
createRule
} from '@regle/core';
import {
withMessage
,
required
} from '@regle/rules';
const {
useRegle
:
useCustomRegle
} =
defineRegleConfig
({
rules
: () => ({
customRule
:
withMessage
(
required
, 'Custom rule'),
}) }) const {
useRegle
:
useExtendedRegle
} =
extendRegleConfig
(
useCustomRegle
, {
rules
: () => ({
customRuleExtended
:
withMessage
(
required
, 'Custom rule 2'),
}) })
useExtendedRegle
({
name
: ''}, {
name
: {
custom
} })

Released under the MIT License. Logo by Johannes Lacourly