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 6 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
- #580 Annotate fails on circular objects
- #602 Validate multiple options with presence key in it - #601 Error: stripUnknown should be one of required, optional, forbidden, ignore
#602 Validate multiple options with presence key in it
#601 Error: stripUnknown should be one of required, optional, forbidden, ignore
One column per quarter.
- #600 Fix regression on unsafe string escaping in language
- #593 .rename() does not work when new value is undefined
- #589 Joi.array().items(...) error message changes
Nothing published for this version
- #585 No conversion is done inside Joi.array().items
- #579 6.0.0 Release Notes - #578 respect stripUnknown in arrays - #572 add any.strip for objects and arrays - #569 Lost key after validation on asser
#579 6.0.0 Release Notes
#578 respect stripUnknown in arrays
#572 add any.strip for objects and arrays
#569 Lost key after validation on assert
#567 Object with 'or', keys contains an array with a 'null' element
#561 how to concat array of objects inside an object property
#559 deprecate array.includes and array.excludes, use array.items and allow required and forbidden within
#557 Incomplete validation message
#555 add some additional guards and tests for #363
#553 Does array include allow nested object properties
#547 string hex characters only
#546 Really custom messages are impossible
#545 allow passing a method to .default(), for #363
#538 added number.multiple()
#536 Consider renaming 'valid' to 'enum' or an alias
#534 Bad behavior of Joi.object().concat()
#532 multipleOf method for Number?
#511 throw when invalid options are provided
#495 joi.array().includes path and errors mismatch
#488 Allow options to be passed to string.email().
#484 Helpful regexp message
#457 Add URI Validation
#363 support factory-function in .default() ?
- #525 Strange behaviour with date + raw - #513 Make alternatives.describe more consistent - #510 Add new requiredKeys option specifically for object
#525 Strange behaviour with date + raw
#513 Make alternatives.describe more consistent
#510 Add new requiredKeys option specifically for object keys
#509 Option to validate a date format but not convert to a date object
#477 Support for references in date.min() and date.max() ?
#404 Possible referencing date field to other date field?
- #505 Convert date regex to date before comparison. Closes #503. - #503 Joi.date().iso() throws error when required() is used.
#505 Convert date regex to date before comparison. Closes #503.
#503 Joi.date().iso() throws error when required() is used.
- #502 Joi.array() modifies original array
- #501 5.0.0 Release Notes - #498 array().single() - #497 array.unique doesn't validate duplicate dates - #494 Joi.number allows Infinity - #489 add m
#501 5.0.0 Release Notes
#498 array().single()
#497 array.unique doesn't validate duplicate dates
#494 Joi.number allows Infinity
#489 add missing semicolon
#486 array().includes() should not allow undefined
#485 Round number.precision if options.convert
#462 Return context with errors.
#381 Transformation support
- #487 Code assertions requires () for exist tests - #481 Validate object constructor. - #408 Check if value is a RegEx
#487 Code assertions requires () for exist tests
#481 Validate object constructor.
#408 Check if value is a RegEx
- #480 Date "now" refers to date when schema was compiled
- #478 Retain object reference when no rules specified - #476 Upgrade Lab - #470 Address internationalization issues. - #469 change implementation of
#478 Retain object reference when no rules specified
#476 Upgrade Lab
#470 Address internationalization issues.
#469 change implementation of creditcard to use string
#466 Named string regex patterns.
#465 implements credit card validation
#464 implements nand
#461 Add greater() and less() to number type. Closes #411
#456 correction for Describe with a "0" argument
#454 Describe with a "0" argument
#449 Enable to pass "now" in date.min and date.max
#446 Use Object.create in Any.clone to improve IE9 support
#440 Added any.label method
#435 Add format and iso to date type
#422 Credit card validation
#411 Number min/max exclusive or closed ranges respectively?
#407 ensure date does not occur in the past
#396 Negative-Integer-Strings are not properly converted to Date instances
#362 Support NAND
- #437 Support optional message prefix in assert() - #434 Fix typo. - #433 Override default presence - #432 Set different default presence mode (requi
#437 Support optional message prefix in assert()
#434 Fix typo.
#433 Override default presence
#432 Set different default presence mode (required, forbidden)
#427 Added ability to validate the number of decimal places
#403 Add duplicates validation to array
#398 Upgrade lab 4.0
#397 Added check for global flag in pattern.
#389 Default Assert Message
#385 Path for array includes to contain key
#383 Describe object.pattern
- #378 Removed unused sys import.
- #366 Bug Hunt: empty object() + pattern() + unknown(false) fails to error - #359 Allow empty string after trim - #357 Cast milisecond strings to a d
#366 Bug Hunt: empty object() + pattern() + unknown(false) fails to error
#359 Allow empty string after trim
#357 Cast milisecond strings to a date object
#355 Don't rename when there is nothing to rename.
#299 Sanitizing blanks
- #360 Joi.assert() - #354 isemail 1.0
#360 Joi.assert()
#354 isemail 1.0
- #351 Add Hoek isImmutable flag
- #349 Support {{!key}} notation to securely encode unsafe values - #335 Recognize Joi errors
#349 Support {{!key}} notation to securely encode unsafe values
#335 Recognize Joi errors
Nothing published for this version
- #341 Array includes fails if called multiple times - #340 Replace internal implementation of required/optional/forbidden - #339 when() option 'is' c
#341 Array includes fails if called multiple times
#340 Replace internal implementation of required/optional/forbidden
#339 when() option 'is' cannot be falsey
#337 alternatives().when() behaves inconsistently with any().when()
#336 concat() fails to remove valid/invalid values
#334 Bug hunt: Joi.any().when is not evaluated it its value is empty even if the when condition is fulfilled.
#332 Joi.any().when is not evaluated if empty
#326 Bug Hunt: unable to rename keys that are empty strings
#325 Bug Hunt: empty string key causes incorrect validation
#321 add uppercase, lowercase, and trim for strings
#317 Bug Hunt: invalid Date objects do not cause failure.
#313 Recursively describes the includes of array schemas #312
#312 Describe should also compile and describe array's rules
#311 Feature/meta
#310 Bug Hunt: email addresses longer than 254 should not be valid
#309 Bug Hunt: email addresses with a "local part" > 64 characters should not be validated
#293 Verify encoding type is string
#292 Add test to check for valid encoding param to binary
#288 Bug Hunt: valid IPv6 domain literals in email addresses fail validation
#282 Bug Hunt: double-quoted local-parts of email addresses cause validation failure
#261 Object key rules by patterns
#241 Thoughts on something like any.meta(obj)?
#220 string().lowercase() and string().uppsercase()
- #330 Cannot override context - #329 Joi.forbidden() fails when added to an existing type
#330 Cannot override context
#329 Joi.forbidden() fails when added to an existing type
- #278 Cleanup language file - #277 date() allows boolean value - #276 binary().encoding() - #275 Support when() on any() - #274 Undo #273, remove opt
#278 Cleanup language file
#277 date() allows boolean value
#276 binary().encoding()
#275 Support when() on any()
#274 Undo #273, remove options from schema.validate()
#273 Remove module generic validate() and describe()
#272 Undo 268
#271 schema concat()
#270 Alt fails to report references
#269 Rename alternatives.attempt() with try()
#268 Move interfaces from func at root to const
#267 Add alternatives.attempt() to allow adding more schemas
#266 Make [] and alternatives() behave exactly the same
#265 object.and()
#264 Support references in default()
#263 object.assert()
#262 object.keys() append behavior
#260 Allow referencing the value of other keys in conditions
#259 Error messages should not include <root>
#258 Array should only convert string arrays
#257 Move dependencies (with,without, or, xor) to object level
#256 Keep input const and return modified value via validate callback
#255 Remove modify option
#254 4.0.0
#253 Validate callback, rename move to object
#252 Move rename() to object()
#250 Change validate() to return value via callback
#249 Alternatives bug fixes
#248 Move object() constructor args to keys() method
#247 unit() documentation method
#246 rename() applied incorrectly
#245 alternatives() fails to apply conversion when lower priority match has valid()
#244 alternatives() fails to apply conversion of matching schema
#243 alternatives() incorrectly allows null when no valids present
#239 Error inheritance is troublesome
#238 match() -> test()
#237 Support literal values as valid() condition
#234 testling support
#233 Add testling-ci badges
#226 Add support for binary type
#217 Incorrect ValidationError.annotated() output with abortEarly
#214 example() documentation method
#210 Add hostname matching to Joi.String
#206 Find full path to nested errors
#202 array() should set a specific detail.path
#196 Precompile schema
#194 Conditional rule based on value of another key
#192 64-bit limits in min()/max()/integer()
#191 Added support for buffer length
Nothing published for this version
- #231 Remove language file support - #230 3.0.0 - #229 Bring coverage back to 100% after lab logical statement support - #228 hoek 2.0 - #227 number
#231 Remove language file support
#230 3.0.0
#229 Bring coverage back to 100% after lab logical statement support
#228 hoek 2.0
#227 number allows string even with strict()
#224 Immutable schema objects. Closes #221
#221 Change object to immutable
#216 Change locale support to something that works with browserify.
- #215 Enable all any() methods on array() - #201 Allows using any.rename() and any.default() together
#215 Enable all any() methods on array()
#201 Allows using any.rename() and any.default() together
- #198 Allow language override directly via options - #197 Support for union types in schemas. - #195 Bring coverage back to 100% after lab fix - #187
#198 Allow language override directly via options
#197 Support for union types in schemas.
#195 Bring coverage back to 100% after lab fix
#187 Polluted request.payload by adding undefined field
#184 Throws error when field is missing and abortEarly=false
#183 set defaults #181
#181 setting defaults
#180 #179; add failing test for renames nested within array
#178 Embedded validators in Array().includes don't work
#177 Modify does not change internal values in array
#176 closes #175. missing required keys no longer throws.
#166 Required based on value on other key
#142 alternatives()
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
- #232 2.0.0 - #133 Array.includes() does not support more than 1 type - #128 with constraint doesn't seem to be respected - #126 Validate date suppor
#232 2.0.0
#133 Array.includes() does not support more than 1 type
#128 with constraint doesn't seem to be respected
#126 Validate date supporting arbitrary format
#124 Array doesn't validate correctly if includes() uses valid()
#122 Update error messages to not have encoded characters
#121 Array is accepted as an Object type
#112 Remove Number.float()
#88 .valid() and .invalid() need a case-insensitive mode
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
- #110 Adding support for special Any type - #107 .with and .without accept an array of args as well - #106 Add Type.Any - #105 Consistent usage of Ar
#110 Adding support for special Any type
#107 .with and .without accept an array of args as well
#106 Add Type.Any
#105 Consistent usage of Array.isArray()
#95 Custom Error Messages
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →