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 23 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
- #1008 Bugfix/error annotate
- #1002 Ref will not be converted if it is inside array passed to default
One column per quarter.
- #989 Adds UUID Support
- #947 .without(), runs before .empty()
- #945 required() does not catch specific empty values
- #960 Coercion doesn't run early enough
- #949 Returning credit card number when is valid, fixes #948 - #948 Credit Card returning null when valid
#949 Returning credit card number when is valid, fixes #948
#948 Credit Card returning null when valid
- #934 Fix missing top-level methods - #933 Extended Joi does not contain certain top-level functions - #929 labels don't always get included in error
#934 Fix missing top-level methods
#933 Extended Joi does not contain certain top-level functions
#929 labels don't always get included in error messages with Joi.extend()
#928 Different error message for date().format()
#927 Check error messages in tests
#920 9.0.0 Release Notes
#918 number.multiple() enhancement - Issue #916
#916 number.multiple() throws exception for non-integer and ref values
#899 Treat empty string as null
#894 Add Joi.object().schema()
#893 Fix item ref. Closes #892
#892 References in array items() do not work
#880 Add synchronous extensibility
#874 any.label() significantly slows validation of large arrays
#860 Add the ability to specify a comparator for array.unique() for objects only
#859 custom compare for Joi.array().unique()
#856 Allow 1 to be true and 0 to be false.
#577 RFC: Joi plugins/extensions/custom functions
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
- #919 joi.date().timestamp() failing validation for millisecond value
- #909 Using empty in items on sparse array allows undefined elements.
- #884 Synchronous schema.validate fails if called with options
- #904 Add stripUnknownKeys option to Joi.validate - #903 stripUnknown: What is the expected behavior when validating nested data? (array)
#904 Add stripUnknownKeys option to Joi.validate
#903 stripUnknown: What is the expected behavior when validating nested data? (array)
Nothing published for this version
- #833 Proposal: string().truncate() - #379 Recursive schema (tree-like) validation
#833 Proposal: string().truncate()
#379 Recursive schema (tree-like) validation
- #900 When using reach, changing the label doesn't get applied, when an existing label is there
- #883 Support error override per rule. Closes #882 - #882 Support error override per rule
#883 Support error override per rule. Closes #882
#882 Support error override per rule
- #851 Joi 8.x breaks describe().meta in alternatives
- #837 Fix RegEx translation of IP6 BNF, where [] denotes an option
- #834 TypeError: cannot delete property '0' of [object String]
- #830 Return any.empty error for trimmed whitespace (fixes #827) - #828 Example for Array Schema Not Possible - #827 Unexpected Errors with Strings
#830 Return any.empty error for trimmed whitespace (fixes #827)
#828 Example for Array Schema Not Possible
#827 Unexpected Errors with Strings
- #824 Description of assert modifying the original value
- #823 8.0.0 Release Notes - #822 Problem with multiple when and conditional forbidden field - #763 Multiple alternatives with default - #735 Print st
#823 8.0.0 Release Notes
#822 Problem with multiple when and conditional forbidden field
#763 Multiple alternatives with default
#735 Print string versions of NaN, Infinity and -Infinity - resolves #696
#696 NaN printed in cosole as null
#592 Some refs not converted in .describe()
- #815 uri() fails RFC3986 4.2 relative reference URIs - #807 Question: Validate against sub-schema? - #565 Combine uppercase with valid
#815 uri() fails RFC3986 4.2 relative reference URIs
#807 Question: Validate against sub-schema?
#565 Combine uppercase with valid
- #812 Improve error message
- #803 Label declaration/Validation
- #800 Generate versioned API Reference link in README
- #791 Date enhancements and support for Unix Timestamps - #789 Date() does not validate Unix timestamp with fractional seconds (decimals) - #787 Add
#791 Date enhancements and support for Unix Timestamps
#789 Date() does not validate Unix timestamp with fractional seconds (decimals)
#787 Add a arity predicate for functions
- #779 Throw custom Joi Errors
- #774 Fix any.default() returns default object reference - #773 Joi.validate() returns default object reference instead of clone
#774 Fix any.default() returns default object reference
#773 Joi.validate() returns default object reference instead of clone
- #759 7.0.0 Release Notes - #756 es6. Closes #754. Closes 755 - #755 Don't annotate non-object values - #754 ES6 style changes and node v4 ## Version
#759 7.0.0 Release Notes
#756 es6. Closes #754. Closes 755
#755 Don't annotate non-object values
#754 ES6 style changes and node v4
- #777 Fix any.default() returns default object reference
- #753 Add default status 400 to error thrown by Joi.assert() - #747 removes leading "." from path at root object level - #740 Exception throw on unde
#753 Add default status 400 to error thrown by Joi.assert()
#747 removes leading "." from path at root object level
#740 Exception throw on undefined object key makes it difficult to track down issue
- #745 Describe ordered arrays - #737 makes allow/valid/invalid not accept undefined #734 - #734 Joi shouldn't allow Joi.any().valid(undefined).requir
#745 Describe ordered arrays
#737 makes allow/valid/invalid not accept undefined #734
#734 Joi shouldn't allow Joi.any().valid(undefined).required()
- #688 Toggable ordered flag for array to match items against input in order - #659 Allow treating arrays as objects
#688 Toggable ordered flag for array to match items against input in order
#659 Allow treating arrays as objects
- #730 Fix function properties validation. Closes #729 - #729 Function keys validation converts function to object
#730 Fix function properties validation. Closes #729
#729 Function keys validation converts function to object
- #721 The index of an incorrect array entry is returned instead of the field name
- #710 Extending a schema - #708 add attempt function - #703 No dependency validation when object stripUnknown set to true - #702 add hapi to package.
#710 Extending a schema
#708 add attempt function
#703 No dependency validation when object stripUnknown set to true
#702 add hapi to package.json keywords so joi is searchable
- #693 Use hasOwnProperty from native object
- #690 removes trailing "." from or path - #684 fix unknown nested key path - #683 Add the "noDefaults" option - #682 Validate without applying defaul
#690 removes trailing "." from or path
#684 fix unknown nested key path
#683 Add the "noDefaults" option
#682 Validate without applying default values
- #668 allow passing an error object as message to assert - #656 Updated regexp for more robust ISO 8601 validation - #649 Implementation of white spa
#668 allow passing an error object as message to assert
#656 Updated regexp for more robust ISO 8601 validation
#649 Implementation of white space normalisation.
#648 Allow normalisation of white space
#586 [request] string().replace(pattern)
- #660 stripUnkown on arrays removes valid objects when multiple items are defined
- #654 Fix allowing context refs on some string, number and date methods
Nothing published for this version
- #629 help with .or()
- #632 Nested whens don't work
- #413 Create default [highly nested] object easily?
- #628 Alternatives throw typeError when "is: null" is used
- #627 Property is always required even when my When() condition isn't met.
- #619 Add IP Address Validation and Separate IP and URI Logic to Files - #616 Add ignoreUndefined flag for rename() - #614 Error when .rename() from
#619 Add IP Address Validation and Separate IP and URI Logic to Files
#616 Add ignoreUndefined flag for rename()
#614 Error when .rename() from undefined
#611 Number compare functions allow decimal numbers
#610 Support for decimal numbers for min, max, less, greater number methods
#609 number min/max/greater/less do not allow decimal values
#597 Add reference support for String.min/max/length
#596 Add reference support for Number.min/max/greater/less
#583 do ref-able operations support referring to a list?
#560 References for Number comparisons?
#380 Comparison between fields
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →