Changelog

#3043
fix: correct function type in alternatives error
#3037
fix: `stripUnknown` should honor local explicit `.unknown(false)`
#3034
fix: label false should also hide explicit labels
#3033
Setting `errors.label` to `false` does not remove labels from error messages for keys with labels
#3032
feat: support encoding uri (follow-up to #3027)
#3027
feat: Support encoding uri
#2889
string().uri() not working with accented characters
#3026
fix: handle bigint in unique rule
#3018
Fix issue 2730 - Wrong State['path'] type
#2730
Wrong `State['path']` type
#3016
fix: domain default tld validation
#3015
fix: domain default tld validation
#3007
Domain validation not checking IANA registry by default
#3014
feat: hex prefix
#3011
Allow 0x prefix for hex strings
#2386
Allow 0x prefix for hex strings
#3013
fix: precision issue on number().multiple()
#3009
fix: LanguageMessages type now supports languages in TypeScript
#3001
fix: do not override existing labels of underlying schemas in alternatives
#2962
Multiple doesn't work correct
#2875
Fix for #2874
#2874
Missing helper.error() method parameter type definition
#2720
Type declaration for `messages` option of any.validate() inconsistent with the documentation and actual code
#2988
feat: allow custom expression functions
#2986
fix: missing template reference
#2985
Unit test showing example of formula parsing bug
#2974
Unable to access object property with a space in its key via expression templates
#2983
fix: allow any.error() return type to be ErrorReport[]
#2975
property metas in Description
#2964
#2963 make return value of validate match type definitions
#2961
Associate Buffer with BinarySchema
#2960
feat: support bindary buffer that has been JSON.parse(JSON.strinified())
#2957
feat: support uuidv6, uuidv7 and uuidv8 guid types
#2954
Coerce toJSON'ed Buffer to real Buffer
#2945
fix: commit states to avoid memory leak
#2932
fix: do not trigger warnings and externals on arrays and alternatives mismatches
#2931
feat: improve external helpers
#2928
fix: validation warning types
#2927
Type definition incorrect for "warning" return type from validateAsync
#2919
chore: revert 17.8.x line
#2917
Cannot find module '@hapi/hoek/assert' from 'index.js'
#2914
Support for older Node versions maybe lost in v17.8
#2913
node_modules/@hapi/hoek/lib/deepEqual.js:274  
#2916
fix: properly transform domain
#2915
Email validation error in v17.8.1
#2910
fix: transpile optional chaining
#2909
chore: use latest address module
#2630
Joi.string().domain() treats '_http._tcp.archive.ubuntu.com' as invalid domain name, even though it works
#2905
Upgrade `@sideway/formula` to `3.0.1` for `CVE-2023-25166`
#2892
Allow null values in BooleanSchema methods
#2867
fix: better unsafe check of exponential numbers
#2762
Add isPresent option to object dependencies
#2672
Some exponential notation strings are validated as unsafe numbers
#2542
Number validation fails on some strings with E-notation
#2859
Fix/throwing errors if required argument is omitted
#2729
Some validation methods don't throw an error when their required argument is omitted
#2860
fix: allow all schema types to be defined and inferred
#2857
Typing issues with `attempt()`
#2753
Typescript typing on `Joi.string().validate(...)`
#2851
Try improving handling of unions
#2850
fix: do not confuse booleans for alernatives in strict mode
#2848
Strict object schema with a boolean property expects alternative, not boolean
#2844
types: support strict alternatives
#2843
chore: update license
#2842
Fix spelling
#2841
Allow sub-objects for TypeScript strict object schema
#2838
feat: change validateAsync return type to match options
#2836
fix(d.ts): allow nested object schema for strictly typed object
#2829
fix(d.ts)!: type details param of ValidationError constructor
#2819
Add artifact to typings.
#2818
Typescript support for .artifact()
#2813
Fix Joi issue #2746
#2808
feat(d.ts): Add type information for `maxDomainSegments` to `EmailOptions` and `DomainOptions` interfaces
#2797
feat(d.ts): improve attempt return type
#2788
Include local into `ErrorReport` type
#2785
fix(typings): incompatible type issue for nested strict object schemas
#2764
Incompatible type expected for object schemas nested in strict object schemas
#2749
fixed typo
#2746
Using `Joi.attempt` with `{ convert: false }` does not prevent conversion.
#2727
Fix validateAsync return type
#2663
Property "local" does not exist on type "ErrorReport"
#2732
Support length() in templates
#2708
How can I define both specific error messages and a default error message?
#2706
Error messages do not distinguish between numbers and strings!Easily misleading
#2703
issue #2606: pass TSchema from ObjectSchema to .validate function
#2698
Add Date -> Joi.DateSchema map to ObjectPropertiesSchema<T>
#2687
string().min(0) is failing to validate a zero-length string
#2666
Updated `multiple` rule to support decimal/float base
#2665
Fix typings on any.external(): add helpers argument
#2651
Fix label elimination for externals
#2649
fix: Joi.string().hostname() not returning errors for CIDR notation
#2648
Incorrect hostname validation
#2635
any.external: can't disable label
#2605
"ExternalValidationFunction" type is missing "helpers" parameter in index.d.ts
#2600
Joi.external() error message
#2590
defaults in alternatives should work recursively
#2589
merge subschema matches when subchemas are objects, or alternatives of objects
#2577
add subschema property validation failures to context
#2685
Joi.string().email() passes for `foo@bar%2ecom`
#2642
Fix issue with only required items. Fixes #2620.
#2624
Fix Web Workers compatibility
#2620
If all elements of array is required, it does not validate unknown items
#2251
`dist/joi-browser.min.js` doesn't work in workers
#2627
Add object type guards schema
#2586
fix isSchema type definition
#2585
type problem in Joi.isSchema function
#2573
Add option array type to AlternativesSchema.conditional
#2556
fix: any.when() options parameters not supported as Array in index.d.ts
#2555
Type definition for the function `any.when()` mismatch the documentation and usage
#2551
feat: Make Joi.Schema generic
#2548
fix: defaults in ordered array are not filled
#2543
URI validation, allowRelative with domain
#2536
merge the results of a .match('all') if all the subschemas are objects
#2535
defaults in alternatives with a match mode set are not returned
#2534
Remove incorrect errors type
#2532
Fix confusing message when refs are passed
#2528
Added guid separator and made version optional
#2523
errors is always undefined in ValidationResult
#2521
Fix type of schema passed to alter functions
#2518
fix for stripUnknown not working for nested object on invalid object
#2502
Appends the allowed object keys in typescript
#2479
Inconsistency with stripUnknown: true and failing validation rules
#2471
Joi.object().xor() throws with "must be a string or a reference" when passed a reference
#2459
stripUnknown doesn't work for nested objects
#2404
defaults in ordered array are not filled
#2477
Add RegExp to the supported types for Extension.type
#2475
Add render property to ReferenceOptions TS def
#2465
@hapi/formula@2.0.0 Deprecated
#2455
Expose prefs in external()
#2454
CustomValidator return type adjusted in typescript
#2442
Update index.d.ts
#2441
Wrong field name in ValidationError (index.d.ts)
#2450
Update dev site
17.2.0
breaking changes
#2431
Import types from DT
#2421
Support ISO8601 with hours timeshift only
#2419
isoDate doesn't recognize correct string
#2408
Fix number padding (e.g. 00000) and trailing decimal points (e.g. 2.)
#2407
"2." throws number.unsafe
#2406
"00000" throws number.unsafe
#2398
Support maxDomainSegments
#2380
Joi.build() does not work with complex extension bases
#2377
Add extension validation for "cast"
#2361
Validation artifacts collected from successful rules
#2348
object.default() broke when object is extended
#2337
tlds fails to error on invalid segment
#2330
Consistently apply wrap setting
#2320
invalid GUID/UUID is validated as valid
#2318
`larger than` is incorrect for comparing quanties
#2303
Add option to resolve `.ref()` and `.in()` values in error messages.
#2284
Array item could not be an Error
#2316
Validate domain in relative uri
#2293
Fix error on changeless forks. Fixes #2292.
#2292
Fork object with option already applied
#2280
isError()
#2279
Remove annotate() from assert() when used in the browser
#2269
Ensure keys term always has right constructor
#2268
Move flag back to proto
#2263
Update deps
#2262
17.0.0 Release Notes
#2261
Remove ValidationError.annotate() from browser build
#2260
object.regex()
#2254
Giving an array argument to any.valid returns incorrect error
#2243
Allow `_` in alias, arg, flag, modifier, override, rule, and term names
#2242
Can you allow `_` in rule names?
#2231
Change errors.wrapArrays to errors.wrap.array
#2219
Add the ability to extend all types in place
#2200
Move ip and uri logic to address
#2199
Remove node 8, 10
#2189
Change default function second argument to full helpers (from prefs)
#2182
Remove quotation marks from error messages
#2163
string().hostiname() - validation of non-ASCII chars containing domains
#2226
object.with and object.without throw error on $ prefixed keys
#2218
Maximum call stack size exceeded​​ error for dataUri validation
#2212
Joi.string().email() considers "a@a.com/asd" as valid email
#2208
fix: describe() on schema with default value null
#2207
describe() on schema with default value null results in "Cannot read property 'Symbol(literal)' of null"
#2205
Cannot require a minimal number of matching object properties with `pattern`
#2190
Joi.string().domain() treats an email address as a valid domain name
#2187
Giving an array argument to any.allow(...values) gives incorrect error
#2181
Joi.alternatives produces confusing message when used with nested object and `{ abortEarly: false }`
#2176
joi.types() is missing `func` alias
#2173
[Request] Allow mixing patch version
#2168
Date fails to enforce format when value is a number string
#2167
Error.captureStackTrace can't be used in all browser builds
#2165
Cannot read property 'delete' of undefined
#2156
node.get is not a function when validating
#2147
Joi v16: TypeError issue with valid(Joi.ref(x)).error()
#2134
Joi.any().default(<object>).describe() throws validation errors
#2131
TypeError: false.byteLength is not a function
#2128
when() fails when combined with prefs()
#2119
Use ^version
#2118
array.items() fails to invalidate when custom item error is used
#2116
Support `.when({ is, then })` without subject ref
#2113
Valid emails are considered invalid
#2111
Joi.only is not a function
#2103
Support errors in manifest
#2102
Always convert -0 to 0
#2101
Apply link.concat() on resolved schema
#2099
Add when() break
#2097
Number validation fails with "1E3"
#2096
Apply link whens on linked schema, not the link
#2093
Manifest type conflicts with key type
#2092
Support Joi.in() for object keys
#2091
"-0" throw number.unsafe
#2089
Joi.in()
#2088
Always perform deep equal on valid() and invalid()
#2087
Fix comparison of array values (literals and references)
#2086
Preference to change label to path edge instead of full path
#2085
Default assert() to include stack
#2084
Shared schemas in links
#2083
Add a browser build to the github repo and npm package
#2082
Fix error thrown in the browser build. Closes #2081
#2081
The browser build (produced by webpack) throws an error when loading
#2080
Named schema links
#2079
Support `no` in when()
#2078
Default `is` to Joi.invalid(null, false, 0, '').required()
#2077
Compile valid values into valid+override
#2076
Allow/disallow list override
#2075
Log when() partials
#2074
Compile function into Joi.custom()
#2073
When object.pattern() matches option is not an array(), apply to each item
#2072
Custom function error shortcut
#2068
schema.describe() does not work, when default value is assigned to array in schema
#2065
Change alternatives to be consistent with other spread arguments
#2064
Throw on invalid schema during validation
#2062
Support chained when()
#2061
Keep switch as single condition on when() and conditional()
#2060
object.assert() ref should be relative to parent, not self
#2059
Support multiple usage of same schema with id
#2056
Schema test coverage
#2054
Rename alternatives.when() to alternatives.conditional()
#2051
Support for combine schema: allOf, oneOf, anyOf
#2049
Compile literals into any type with exact literal
#2048
Replace marker with Symbol.for()
#2046
Cast multi values of into a single type with valid()
#2041
Exclude error stack trace by default
#2040
Replace boolean.insensitive() with sensitive() and not apply to allow()
#2039
Allow mapping flags to rule methods with a different name
#2038
Stop matching object patterns once a match is found
#2037
v16.0.0 Release Notes
#2036
{ result, error } changed to error undefined instead of null
#2035
Skip error rendering preference
#2034
Consolidate date format errors
#2033
msg() template function to access other messages
#2032
Support custom sync functions for rules
#2031
Remove object and array string coerce
#2030
string.isoDate() fails on allow() and convert:false
#2027
Support templates as object.assert() subject
#2026
Change object.assert error context and rule argument name
#2024
Remove binary and string encoding support from the browser
#2023
Rule arguments validation
#2022
Support reverse order coerce
#2019
Consolidate refs with args
#2018
Support joi schema in refs assert
#2016
Consolidate refs assert's message/code
#2015
Ensure all levels of coerce are only called on non-undefined values
#2014
Change all _methods used on schema to use definition
#2013
Expose all internal extend() options externally
#2012
Rename func to function
#2010
New extension API
#2009
Global defaults
#2007
Change Infinity errors from any.invalid to number.infinity
#2006
Change error code any.empty to string.empty
#2005
Merging of two empty() should allow '' if it was explicitly defined
#2002
Remove prefs schema validation
#2001
Remove joi.defaults()
#1999
Fix outdated use of Joi.func().ref()
#1998
Split validate() to sync and async versions
#1995
Replace strip flag with result flag
#1994
Joi.string().uri() accepts 'http:/' as valid URL
#1993
Root reference
#1987
Extension build() support
#1986
Improve schema description validation
#1985
Refactor root
#1983
Change any.notes() to any.note() and require separate arguments
#1982
Change any.tags() to any.tag() and require separate arguments
#1981
Change any.example() to append by default
#1980
Rename string.regex() to string.pattern()
#1979
Link to root (regardless of depth)
#1978
Change only() to flag instead of alias of valid()
#1977
Replace date multiple and timestamp flag with format
#1976
Rename object.allowUnknown error to object.unknown
#1975
Remove description for `default()` function
#1974
Deep clone all values returned in describe()
#1973
Behavior of .concat() with tests redefinition
#1972
Applying `raw` after successful validation
#1968
Repalce lazy with link
#1965
How to properly detect domains?
#1962
Don't require pre function to take 3 arguments
#1961
Lazy once ignored when using with when()
#1960
Fix object peer dependencies error path
#1959
Debug tools
#1958
Warnings
#1957
Feature: Marking options as deprecated
#1956
Extension messages override base
#1954
Schema specialization
#1952
Support fork into array and alternatives
#1951
Remove requiredKeys(), optionalKeys(), and forbiddenKeys()
#1950
any.fork()
#1949
Replace Joi.reach() with schema.extract()
#1948
Cannot read property 'ancestors' of null
#1946
Remove applyFunctionToChildren()
#1945
Throw when Joi.reach() is reaching into non-object
#1944
Remove any._getLabel()
#1943
Rename any.schemaType to any.type
#1942
Rename object.type() to object.instance()
#1941
Remove root.validate() and root.describe()
#1940
Array validation with .error()
#1939
Replace attempt() with assert() alias
#1938
Remove callback support
#1937
Support post-validation async operations
#1935
Rename var to expression and x
#1932
Support base parameters in extend()
#1930
Template calculations
#1929
Cast date and boolean to number
#1925
Cast to string
#1924
Move dateFormat pref out of errors
#1922
Support ref into Set and Map cast values
#1921
Replace raw flag with result flag in description
#1920
Remove support for raw(false)
#1919
Cannot combine function rules with object keys
#1917
Complex conditional validation
#1914
A way to cast the result of a array to Set and object to Map
#1913
Prevent mixing different versions of joi schema types
#1912
Identify blocked schema (valid + invalid = no valid options)
#1911
Unknown object keys ignore abortEarly flag
#1907
Support ref in prefs.errors.language
#1906
Precompile prefs.messages and extensions
#1905
Move error related prefs to `errors`
#1904
Remove ability to change template for implicit label prefix in error messages
#1903
Remove implicit label prefix for error messages
#1902
Rename `language` preference to `messages`
#1901
Rename messages.wrapArrays with wrapArrays
#1898
Change object.rename() from description to { regex } when using from pattern
#1896
Support `{.}` in error for value
#1895
Remove isJoi from Errors.Report
#1894
Pre-compile error messages
#1893
Language format requires # prefix for error context
#1892
Change "context:" ref prefix in errors to "ref:global:"
#1891
Replace ref.type description to ref.ref
#1890
Replace {{!var}} notation with {var}
#1889
Replace escapeHtml with escapeErrors
#1888
Joi.ref() is not a function
#1887
Remove object.rename.regex.multiple and object.rename.regex.override errors
#1886
Change object.rename() override option to not delete existing if nothing match
#1885
array().sort([{ order, by }])
#1884
Fix: Exponential decimal #1876
#1881
Mark rule for keep
#1878
Flatten language object
#1877
Rule sets
#1876
Joi.number() throws error for "0.00000095" string.
#1875
Labels only used on path edge
#1874
Remove flags argument from createError()
#1873
Add object.schema() type support
#1872
Replace alternatives.child with alternatives.match error code
#1870
New alternatives.types error code
#1869
Remove support for string or array or errors return value from error() function
#1867
Bidirectional describe() <-> build()
#1866
Support multiple languages at the same time
#1865
Joi.ref() map option
#1864
Merge positive and negative number rules into single sign rule
#1862
Consistently use Utils.assertOptions() in all rules with options
#1860
when() switch statement
#1859
Remove any.createOverrideError()
#1858
Remove this from error() function
#1857
Remove self option from error()
#1856
Remove automatic example validation
#1854
.rename() causes errors when nothing has to be renamed
#1853
Remove case flag
#1852
Remove trim flag
#1851
Remove byteAligned flag
#1850
Remove precision flag
#1849
Error on unreachable when() statement
#1848
Forbid chaining when() calls when the first was not on alternatives type
#1847
any.error() fails to clear self option in override call
#1846
Skip type check if valids fail
#1843
Change object and array errors to use path instead of nested errors
#1842
String multiple email address
#1840
Limit array.single() to only non-array items
#1839
Remove Hoek.reach() options from Ref
#1838
Unique tests duplicated on concat()
#1837
Perform base type conversions before extension pre
#1836
Apply array.single() regardless of options.convert
#1835
Run extension coerce only if options.convert is true
#1834
Remove isJoi from schema
#1833
Array items using references to array peers are ignored in order of processing
#1832
Change reference view in array item rules
#1831
Move func().ref() to object().ref()
#1830
Change Ref to class
#1828
Remove isRegExp from object.rename description
#1827
string min/max/length description missing encoding
#1826
string.truncate() doesn't account for max with ref
#1825
Apply only last min/max/length rules
#1824
string methods change provided options
#1823
Description changes
#1822
Inconsistent reference error reporting
#1819
Reduce reach
#1812
Multiple email address validation
#1807
Ability to perform custom calculations on referenced fields
#1806
Number validation fails with a valid number (".30")
#1796
fix: copy object including Symbols
#1778
Make certain rules (min/max/length) override themselves revisited
#1770
Don't delete object key when it equals the rename.to in a rename with regex
#1769
Merge v14 changes
#1767
V14 temp
#1762
Customize formatting for dates in error messages of min/max/greater/less (with ISO default)
#1746
Validate base64 URI safe strings
#1737
Translate validation messages based on header request
#1736
truthy() / falsy() values apply when convert is false
#1732
Joi.string().uri() accepts "https://" as a valid url
#1730
Continue array validation even if items() fails
#1727
Caching for strings / numbers / booleans
#1723
Allow validate options to be passed through assert/attempt #1722
#1722
Check all errors on joi.assert and joi.attempt
#1705
Validate URI domain
#1702
Ref inside top-level array items/ordered
#1696
Joi should not strip non-enumerable properties of an object
#1695
Support schema keys with '.' (without forcing path reach)
#1687
Validation fails with valid UUID 3
#1652
Throw typed ValidationErrors
#1651
Reference above parent. Closes #1650
#1650
Support references above the parent
#1648
Move object rename to own function
#1646
Remove flatten arguments. Closes #1644
#1645
Support self references. Closes #1569
#1644
Remove all arguments flattening
#1623
Check for valid/invalid values after conversion only
#1613
Support ISO 8601 duration as a string validator
#1612
Validate ISO Duration string
#1606
schema.describe minor issues and feature suggestions
#1569
Allow self references
#1535
failover() support for default on errors
#1457
Specify required matches for .pattern()
#1403
Support regexp capture group for rename
#1264
Override rule message with any.message() rule
#1244
Throw typed errors
#925
Validating a FQDN
#667
Validate a number, which depends on other validate numbers
#2047
Replace marker with Symbol.for()
#1926
Add legacy API
#1808
bool() cannot be binded
#1801
remove strip from defaults now that it has been removed
15.0.1
breaking changes
#1761
Validate object keys related to another value
#1753
Override extension language
#1750
Pass options to pattern validation to support refs
#1748
.pattern doesn't respect .valid when using .ref
#1747
Extension which has a return value in setup() does not call validate()
#1714
Undocumented strip option on Joi.validate
#1704
Resolved issue of maximum call stack exceeded
#1700
base64 validation returns RangeError
#1776
Replace isemail with @hapi/address
#1768
Fix dependency
#1928
Add legacy API
#1766
Change module namespace
#1691
joi.bind yields any() methods not fully bound
#1665
path-related methods (`with(), `nand()`...) broken when applied on `func()`
#1631
Destructuring Throws Fatal
#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
#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.
#1634
Remove engines
#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
#1568
Trying to get multiple custom error messages in details array with {abortEarly: false}
#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
#1558
Add value to number.base errors
#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 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 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() 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 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+
12.1.0
breaking changes
#1757
Commercial version of v12 branch
#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
#1311
import { any } does not work on v11
#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
#1289
Feature request: Unicode normalization
#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
#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 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 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()
#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
#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().unique() is wrong
10.0.6
breaking changes
#1065
Fix boolean strings parsing
#1054
adding validation for unnecessary arguments in primary types.
#1009
Request: Warn when functions are passed unexpected arguments
#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
#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
#1008
Bugfix/error annotate
#1002
Ref will not be converted if it is inside array passed to default
#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
#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
#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)
#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
#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
#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 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
#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 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
#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 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).required()
#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
#728
Allow functions to act as objects. Closes #727
#727
Allow function types to behave as object (e.g. have keys)
#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.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 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 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
#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 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
#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
#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
#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 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 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.
#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 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
#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 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 (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 date object
#355
Don't rename when there is nothing to rename.
#299
Sanitizing blanks
#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
4.3.0
breaking changes
#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
#328
Support references to external context
#324
Test for retaining ignored values
#323
Joi.forbidden()
#322
Make callback optional argument
#318
Convert tests to actual async style
#296
Allow valid to take buffer values
#291
remove extra var internals. Closes #290
#290
extra var internals in binary.js
#287
object.unknown()
#285
Fix to make object.and all-or-nothing - fixes #284
#284
Bug Hunt: object.and is supposed to be all-or-nothing
4.0.0
breaking changes
#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
#345
Describe references as such
#343
Ref and Alternatives.when don't handle empty string keys
3.0.0
breaking changes
#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
#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()
2.0.0
breaking changes
#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
#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
#25
Rewrite Readme.md
#23
Add validation tests for every type's methods with complex combinations
#20
String().valid doesn't invalidate bad values
#19
StringType.min(3) doesn't validate undefined correctly
#18
Adding tests to joi