Changelog

#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
16.0.0
breaking changes
#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
#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
#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