A flexible, chainable validation rule factory for TypeScript/JavaScript.
- Chainable API for building complex validation rules
- Supports string, number, array, boolean, object, symbol, bigint, null, undefined
- Customizable error messages
- Easy to extend and integrate
- TypeScript support
pnpm add ruler-factory
# or
npm install ruler-factory
# or
yarn add ruler-factoryimport { rulerFactory } from 'ruler-factory'
const ruler = rulerFactory()
const rules = ruler().string('Must be a string').min(3, 'Too short').max(10, 'Too long').done()
const value = 'abc'
const errors = rules.map((rule) => rule(value)).filter((e) => e instanceof Error)
if (errors) {
// handle errors
}<script setup lang="ts">
import { rulerFactory } from 'ruler-factory'
const ruler = rulerFactory((validator) => {
return (value) => {
const e = validator(value)
return e instanceof Error ? e.message : true
}
})
const model = ref({
name: '',
email: '',
})
</script>
<template>
<var-form>
<var-input v-model="model.name" placeholder="Name" :rules="ruler().required('Cannot be empty').min(2, 'Wrong length')" />
<var-input v-model="model.age" placeholder="Email" :rules="ruler().email('Must be email format')" />
</var-form>
</template><script setup lang="ts">
import { rulerFactory } from 'ruler-factory'
import { FormItemRule } from 'naive-ui'
const ruler = rulerFactory<FormItemRule>((validator, params = {}) => ({
trigger: ['blur', 'change', 'input'],
validator: (_, value) => validator(value),
...params,
}))
const model = ref({
name: '',
age: 20,
})
</script>
<template>
<n-form :model>
<n-form-item path="name" label="Name" :rule="ruler().required('Cannot be empty').min(2, 'Wrong length')">
<n-input v-model:value="model.name" />
</n-form-item>
<n-form-item path="age" label="Age" :rule="ruler().number().required('Cannot be empty').min(0, 'Cannot be negative')">
<n-input-number v-model:value="model.age" />
</n-form-item>
</n-form>
</template>Take Naive UI as an example
import { FormItemRule } from 'naive-ui'
import { rulerFactory, RulerFactoryMessage } from 'ruler-factory'
function customRuler() {
const ruler = rulerFactory<FormItemRule>((validator, params = {}) => ({
trigger: ['blur', 'change', 'input'],
validator: (_, value) => validator(value),
...params,
}))
function ip(message: RulerFactoryMessage, params?: FormItemRule) {
ruler.addRule((value) => {
// Implement isString and isIP by yourself
if (!isString(value) || !isIP(value)) {
return new Error(ruler.getMessage(message))
}
}, params)
return ruler
}
Object.assign(ctx, { ip })
return ruler as typeof ctx & { ip: typeof ip }
}.string(message?, params?).number(message?, params?).array(message?, params?).boolean(message?, params?).object(message?, params?).symbol(message?, params?).bigint(message?, params?).null(message?, params?).undefined(message?, params?).true(message?, params?).false(message?, params?)
.required(message)
.min(value, message, params?).max(value, message, params?).length(value, message, params?).regex(regexp, message, params?).startsWith(value, message, params?).endsWith(value, message, params?).includes(value, message, params?).uppercase(message, params?).lowercase(message, params?).email(message, params?)
.number().min(value, message, params?).number().max(value, message, params?).number().gt(value, message, params?).number().gte(value, message, params?)alias .min.number().lt(value, message, params?).number().lte(value, message, params?)alias .max.number().positive(value, message, params?).number().negative(value, message, params?)
.bigint().min(value, message, params?).bigint().max(value, message, params?).bigint().gt(value, message, params?).bigint().gte(value, message, params?)alias .min.bigint().lt(value, message, params?).bigint().lte(value, message, params?)alias .max.bigint().positive(value, message, params?).bigint().negative(value, message, params?)
.array().min(value, message, params?).array().max(value, message, params?).array().length(value, message, params?).array().includes(value, message, params?)
.is(fn, message, params?).not(fn, message, params?)
.done()
.addRule(validator)
.trim().toLowerCase().toUpperCase().transform(fn)
MIT