NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #1785 most downloaded on npm
Object schema validation
Last release 7 days ago
11 Sep 2026
Ships unpredictably
gaps range from 8 days to 1.1 years
Nearly every release is documented
notes for 55 of 55 stable releases
204 versions withdrawn
withdrawn after publishing
14 years old
259 releases · first in 2012
- #1659 Add array().assertItem(). Closes #1656 - #1656 Complex array validation requirements - #1608 Custom message overload another one - #1528 joi e
#1659 Add array().assertItem(). Closes #1656
#1656 Complex array validation requirements
#1608 Custom message overload another one
#1528 joi errors not overriding for nested objects
#1219 In case custom error messages are passed to Joi.any.error, joi.validate returning parent object error even if child validation fails.
- #1658 Extensions remove language of previous extension with the same base
One column per quarter.
- #1654 Bump to lab@18. Fixes #1653. - #1647 Add object().oxor(). Closes #1628 - #1628 xor but none required
#1654 Bump to lab@18. Fixes #1653.
#1647 Add object().oxor(). Closes #1628
#1628 xor but none required
- #1607 invalid mime types on data uri
- #1638 fix condition, add tests for safe numbers - #1637 Using Number.MAX_SAFE_INTEGER throw error that number unsafe.
#1638 fix condition, add tests for safe numbers
#1637 Using Number.MAX_SAFE_INTEGER throw error that number unsafe.
- #1634 Remove engines
Nothing published for this version
- #1622 Maximum call stack size exceeded error from Joi.defaults with Joi.empty flags
- #1617 object().with using nested paths validates when it shouldn't in Joi 14
- #1615 14.0.0 Release Notes - #1614 Default stripUnknown = true to only strip object keys, not arrays - #1595 Overriding array.min() when using reach
#1615 14.0.0 Release Notes
#1614 Default stripUnknown = true to only strip object keys, not arrays
#1595 Overriding array.min() when using reach
#1568 Trying to get multiple custom error messages in details array with
#1555 Chaining multiple examples does not overwrite the old examples
#1554 #1477 Add Support for nested path with Joi.object().or(), .nand(), .and(), .with(), .without(), .xor()
#1544 Error at integer validation
#1504 Max safe integers
#1478 .example SHOULD perform validation on the provided value
#1477 Joi.object().or() does not support nested paths
#1429 Joi.string().regex() with support for all modifiers
#1364 Need to override twice the key name for error messages
#1258 Feature Request: lazy once
#1247 Year-only iso date string is parsed incorrectly
#1191 Chaining string.insensitive() will not convert values with lowercase/uppercase modifiers
#1127 Make certain rules override themselves
#1113 Number validation on '0x1' reports no error with a value of 0.
- #1562 Add symbol() type - #1420 Add Symbol() support
#1562 Add symbol() type
#1420 Add Symbol() support
- #1558 Add value to number.base errors
Nothing published for this version
Nothing published for this version
- #1532 Add enabled flag to string.trim() - #1525 Add boolean flag to Joi.string().trim() - #1511 Add optional "config" param to array.unique for igno
#1532 Add enabled flag to string.trim()
#1525 Add boolean flag to Joi.string().trim()
#1511 Add optional "config" param to array.unique for ignoreUndefined. Closes #1498
#1510 Data uri validation
#1498 Validating unique optional fields in array elements.
#1487 Allow square braces in URL validation
#1461 URI validator rejects query param square brackets
#999 Where is the documentation for this.createError() ?
- #1521 Extended object does not parse JSON - #1515 Joi.reach() can no longer handles empty string path - #1514 remove indirect require reference to i
#1521 Extended object does not parse JSON
#1515 Joi.reach() can no longer handles empty string path
#1514 remove indirect require reference to index.js
#1513 require('../') statement in schemas.js causing bundler issues.
#1500 add date greater less rules
#1499 Allow object keys to be verified by schema
#1382 Add a key validator with Joi objects
#1000 Correct way to write an "identity" extension?
- #1479 Is it possible to capture the value of field being validated in custom error messages using the options - language - #1438 Use Set() for handl
#1479 Is it possible to capture the value of field being validated in custom error messages using the options - language
#1438 Use Set() for handling of unprocessed keys
#1422 Add byteAligned option to hex string
#1415 Use Set() for internal Set backend
- #1476 Cannot validate an array with 'constructor' as unique entry - #1452 Add new validation number().port() - #1448 Include describe() documentatio
#1476 Cannot validate an array with 'constructor' as unique entry
#1452 Add new validation number().port()
#1448 Include describe() documentation in API. Fixes #1447
#1435 Add an object.append() method. Fixes #1381.
#1433 Changed a separator for path parameter to pre-split array approach for Joi.reach
#1423 Avoid redundant copies of settings
#1414 Fix cloned valid() / invalid() object values
#1383 Add an separator parameter to Joi.reach
#1381 Add an object.append() method
#1346 Validate port numbers
- #1392 undefined in the array with label returns wrong missing value message
- #1395 Asserts that two arguments are provided to object.with() and object.without()
- #1386 Fix object pattern in combination with empty
- #1354 Remove validation from .example - #1350 joi.ref doesn't work properly with max() function for dependant dates - #1189 Should .example perform
#1354 Remove validation from .example
#1350 joi.ref doesn't work properly with max() function for dependant dates
#1189 Should .example perform validation on the provided value?
- #1334 Impossible to disable language.key in options
- #1328 13.0.0 Release Notes - #1327 Bump joi to node 8+ ## Version 12
#1328 13.0.0 Release Notes
#1327 Bump joi to node 8+
Nothing published for this version
- #1326 12.0.0 Release Notes - #921 $-sign in object keys are escaped in the ValidationError message ## Version 11
#1326 12.0.0 Release Notes
#921 $-sign in object keys are escaped in the ValidationError message
- #1325 Allow alternatives.when to "peek" inside the current value
- #1230 Missing language entry in joi.extend causes obscure runtime error
Nothing published for this version
Nothing published for this version
- #1240 Fixes [#1239] - #1239 Rename multiple keys to another name
#1240 Fixes [#1239]
#1239 Rename multiple keys to another name
- #1308 Add Joi.func().class()
- #1316 Remove items module dependency
- #1315 Add promise-like API to validate. Fixes #1314. - #1314 Support promises on validate() - #1291 Add string.normalize for unicode normalization -
#1315 Add promise-like API to validate. Fixes #1314.
#1314 Support promises on validate()
#1291 Add string.normalize for unicode normalization
#1289 Feature request: Unicode normalization
- #1266 remove empty flag if only reset is used - #1249 describe doesn't work for empty() breaking lout
#1266 remove empty flag if only reset is used
#1249 describe doesn't work for empty() breaking lout
- #1303 empty string is wrongly accepted as a timestamp
Nothing published for this version
- #1302 11.0.0 Release Notes - #1283 Error: Item cannot come after itself - #1282 There is a bug in 10.6.0 API Reference. - #1278 Joi.defaults(): Cann
#1302 11.0.0 Release Notes
#1283 Error: Item cannot come after itself
#1282 There is a bug in 10.6.0 API Reference.
#1278 Joi.defaults(): Cannot default object type
#1256 Add Joi.defaults()
#1254 ipv6 with cidr greater than 32
#1235 Fix Value Range for IPv6 CIDRs
#1232 ipv6 string with mask between 33 and 128 are rejected.
#1229 Update isemail from 2.x.x to 3.x.x
#1197 Allow passing an option to string().isoDate()
#1196 string isoDate should allow the string to be converted to same format as date iso schema
#1167 Errors: context.key is actually the label, not the key
#1126 Passes the "default" function to the schema description
#1121 [Request] Add detail to .describe for function defaults
#931 Email validation doesn't allow emails which are compliant with RFC 6530
- #1215 #1201 - setup can return joi object to replace origin schema - #1211 Performance Improvements for string().guid() - #1206 Added the ability to
#1215 #1201 - setup can return joi object to replace origin schema
#1211 Performance Improvements for string().guid()
#1206 Added the ability to use a reference for Array min/max/length
#1201 Question: how to extend joi to add some key by rule?
#1174 Fix #1156 - Adds support for optional base64 padding validation.
#1156 base64 validation too strict; padding is optional
#1017 Array length cannot reference to another field
- #1199 Make isemail an optional dependency
- #1203 Nested child/uncle condition causes annotate() to throw
- #1183 add forbiddenKeys method to object
- #1161 Alternatives respect subsequent "when"s if first has only "otherwise" - #1151 Alternatives based on a type with only otherwise take precedence
#1161 Alternatives respect subsequent "when"s if first has only "otherwise"
#1151 Alternatives based on a type with only otherwise take precedence over any following one
#1146 Keep converted values even when stripped for reference uses
#1132 Add "options" to describe output
#1130 Joi.any().options() should be reported in .describe()
- #1119 alternatives doesn't work with error - #844 Label in object.and()
#1119 alternatives doesn't work with error
#844 Label in object.and()
- #1131 Add basic error overriding
- #1143 number().integer() can fail for values outside MAX_SAFE_INTEGER
- #1145 Don't try to touch custom error messages with attempt message
- #1144 Possible bug in custom Error message
- #1097 Fix #964 Joi wrong value parsing - #964 Joi wrong value parsing
#1097 Fix #964 Joi wrong value parsing
#964 Joi wrong value parsing
- #1128 Avoid unnecessary clones - #1067 "Describe" behavior changes for "implicit" Any with extended Joi - #1047 Creating multiple extensions for the
#1128 Avoid unnecessary clones
#1067 "Describe" behavior changes for "implicit" Any with extended Joi
#1047 Creating multiple extensions for the same base type
#983 Unexpected interaction between Joi.object().unknown() and stripUnknown
#831 Joi valid fails, when ref is used with a stripped key.
- #1103 allow param defaults to be set by the param validations
- #1095 noDefaults behaviour with any.empty()
- #1076 Added support for ISO_8601 expansion (+/-YYYYYY)
- #1075 Allow shorthand accessor string in array().unique() - #1073 Provide value which duplicates an item in array().unique() - #1072 Path of array()
#1075 Allow shorthand accessor string in array().unique()
#1073 Provide value which duplicates an item in array().unique()
#1072 Path of array().unique() is wrong
- #1065 Fix boolean strings parsing
Nothing published for this version
Nothing published for this version
- #1052 [Request] truthy/falsy case insensitive
- #1039 trim + empty confuses me
- #1037 10.0.0 Release Notes - #1035 Implement String.regex "invalidate" configuration - #1034 added support for string.uri relativeOnly option - #103
#1037 10.0.0 Release Notes
#1035 Implement String.regex "invalidate" configuration
#1034 added support for string.uri relativeOnly option
#1032 Clean up any.valid code
#1030 Conditional validation of object properties with different parent key
#1028 Extend describe() for type
#1027 Extending describe() to include renames in metadata
#1026 object renames do not appear in describe api.
#1020 Joi.string().invalid (not, disallow) doesn't support regex?
#1016 Added a string.base64() method.
#1015 Suggestion: Joi.string().uri({ allowRelativeOnly })
#1010 Update Joi.validate options with removal of error
#998 Add support for truthy/falsy boolean values
#985 Move time rules to an extension
Your coding agent can read these notes before it upgrades. Set up the MCP server →