About joi
joi is a JavaScript schema-validation skill for developers who need to validate input and compose structured rules. It covers built-in types, conditional schemas, cross-field references, custom extensions, and error handling.
Key features
- 01Schema validation with validate() and attempt()
- 02Composable object, array, and alternatives schemas
- 03Conditional rules with .when()
- 04Cross-field references with Joi.ref()
- 05Custom types through Joi.extend()
- 06Custom validation error messages
Use cases
- 01Validating data at an application boundary
- 02Checking fields based on another field's value
- 03Ensuring confirmation fields match
- 04Adding domain-specific validation types
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ damusix/ skills --skill joiAfter installing, type/joiin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
.tessl-plugin/plugin.jsonreference/any.mdconditionals.mderrors.mdextensions.mdmetadata.mdreferences.mdtesting.mdtypes.mdvalidation.mdDetails
From the project READMEJoi
Quick Start
const Joi = require('joi');
const schema = Joi.object({
name: Joi.string().min(1).max(100).required(),
age: Joi.number().integer().min(0),
email: Joi.string().email()
});
const { error, value } = schema.validate(input);
Critical Rules
- Schemas are immutable - Every method returns a new schema instance; never mutate
- Validate at boundaries - Use
validate()orattempt()at input boundaries; see validation - Types extend base - All types inherit from
any(); see types overview - Refs for cross-field - Use
Joi.ref()for dynamic values across fields; see references - Extend for custom types - Use
Joi.extend()to create custom types; see extensions
Workflow
- Choose a type - types overview for all built-in types
- Add constraints - Chain rules like
.min(),.max(),.pattern(),.valid() - Compose schemas - Nest
Joi.object(),Joi.array(),Joi.alternatives() - Add conditionals - Use
.when()for dynamic schemas; see conditionals - Customize errors - Override messages via
.messages()or.error(); see errors
Common Patterns
Conditional validation with .when()
const schema = Joi.object({
type: Joi.string().valid('email', 'sms').required(),
address: Joi.when('type', {
is: 'email',
then: Joi.string().email().required(),
otherwise: Joi.string().pattern(/^\+?[1-9]\d{1,14}$/).required()
})
});
Cross-field references with Joi.ref()
const schema = Joi.object({
password: Joi.string().min(8).required(),
confirmPassword: Joi.string().valid(Joi.ref('password')).required()
.messages({ 'any.only': 'passwords must match' }),
startDate: Joi.date().required(),
endDate: Joi.date().greater(Joi.ref('startDate')).required()
});
Key Patterns
| Topic | Reference |
|---|---|
| All built-in types | types |
| Validation & options | validation |
| References & templates | references |
| Conditional schemas | conditionals |
| Error handling | errors |
| Custom extensions | extensions |
| Metadata & introspection | metadata |
| Common methods (any) | any |
| Testing patterns | testing |
Comments
Markdown supported