a chain-based validation library designed for highly flexible, expressive, and dynamic form validation.
npm install risiirisii is a chain-based validation library designed for highly flexible, expressive, and dynamic form validation.
It offers:
- ✨ Declarative, fluent API
- ✨ Dynamic schema generation
- 🔒 Masked fields ()
- 🔗 Field dependencies (shouldEqualFieldValue)
- 🔁 Pre/post action hooks
- 💾 Persistent validation storage (FORMIK_DATA)
- ⚡ Field-level + form-level validation
- 🎯 Perfect for React, React Native, Vue, and plain JS
``bash`
npm install risii
`ts
import { Chain as Validator } from "risii";
const chain = new Validator();
const schema = chain.schema({
phone: chain.required().number().exactly(10).end(),
});
`Chainable validation methods
| Method | Description |
| ------------------------------ | -------------------------------- |
| required() | Field must not be empty |
| string() | Must be a string |
| number() | Must contain only digits |
| boolean() | Must be true/false |
| min(n) | Minimum length |
| max(n) | Maximum length |
| exactly(n) | Must equal length n |x
| minPieces(n) | Min number of words |
| maxPieces(n) | Max number of words |
| startsWith(x) | Value must start with |x
| endsWith(x) | Value must end with |**
| shouldBeFollowedBy([...]) | Next character must be from list |
| isEqualTo(value) | Compare with external value |
| shouldEqualFieldValue(key) | Must match another field |
| shouldMask() | Masks field () |
| shouldUpdate() | Force persistence |
| isRefferedBy(key) | Reverse dependency |
| dependsOn(key) | Depends on another field |
| messages(obj) | Override error messages |
| actionBefore(fn) | Pre-validation hook |
| actionAfter(fn) | Post-validation hook |
| isLastField() | Marks last form field |
| end() | Ends the chain |
`js
import {Chain as Validator} from 'validatr/index.ts';
const loginMessages = {
phoneNumber: {
number: 'Phone number must be a number',
exactly: 'Phone number must be exactly 9 numbers',
startsWith: 'Phone number should start with digits 7',
followedBy: 'Phone number should be followed by digits 8 or 9',
required: 'Phone number is a required field',
},
};
export const getLoginSchema = (
actionAfters = {},
actionBefores = {},
setTransporter,
doAfterAll,
) => {
let chain = new Validator();
chain.setErrorTransporter(setTransporter);
chain.setActionAfterAll(doAfterAll);
return {
schema: chain.schema({
phoneNumber: chain
.required()
.number()
.exactly(9)
.actionAfter(actionAfters?.phoneNumber)
.actionBefore(actionBefores?.phoneNumber)
.messages(loginMessages.phoneNumber)
.startsWith(7)
.shouldBeFollowedBy(['8', '9'])
.isLastField()
.end(),
}),
chain,
};
};
`Field-Level Validation
`ts
skema.chain.validate({ phoneNumber: value });
console.log(skema.chain.validated);
`
`js`
{
"phoneNumber": {
"validation": { "valid": true },
"value": "789123456"
}
}
`js`
chain.handleSubmit(validValues => {
console.log("Submitted:", validValues);
});
This performs:
- Full schema validation
- actionAfterAll
- Returns
`js`
value={value}
onChange={async e => {
const v = e.target.value;
setValue(v);
await skema.chain.validate({ phoneNumber: v });
}}
/>
`js
const LoginForm = () => {
const [values, setValues] = useState({ phoneNumber: "" });
const [errors, setErrors] = useState({});
const { schema, chain } = getLoginSchema(
null,
{ phoneNumber: v => setValues({ phoneNumber: v }) },
setErrors,
() => console.log("All valid")
);
const handleSubmit = async e => {
e.preventDefault();
await chain.validate(values);
chain.handleSubmit(v => console.log("Submitted:", v));
};
return (
For questions and support please use risiijs's Suppport page on Github repo.
Please make sure to read the Issue Reporting Checklist before opening an issue. Issues not conforming to the guidelines may be closed immediately.
Detailed changes for each release are documented in our Changelog.
A summary of release changes can be found in our Release Notes.
Please make sure to read the Contributing Guide before making a pull request. If you have an risii plugin, add it with a pull request.
MIT - see the LICENSE file for details.
copyright (c) 2018-present. Ntsako (Surprise) Mashele