UNPKG

zater-cep

Version:

ZAter cep correios e via cep

1,515 lines (1,119 loc) 48.2 kB
<!-- version --> # 6.10.1 API Reference <!-- versionstop --> <img src="https://raw.github.com/hapijs/joi/master/images/validation.png" align="right" /> <!-- toc --> - [Joi](#joi) - [`validate(value, schema, [options], [callback])`](#validatevalue-schema-options-callback) - [`compile(schema)`](#compileschema) - [`assert(value, schema, [message])`](#assertvalue-schema-message) - [`attempt(value, schema, [message])`](#attemptvalue-schema-message) - [`isRef(ref)`](#isrefref) - [`any`](#any) - [`any.allow(value)`](#anyallowvalue) - [`any.valid(value)` - aliases: `only`, `equal`](#anyvalidvalue---aliases-only-equal) - [`any.invalid(value)` - aliases: `disallow`, `not`](#anyinvalidvalue---aliases-disallow-not) - [`any.required()`](#anyrequired) - [`any.optional()`](#anyoptional) - [`any.forbidden()`](#anyforbidden) - [`any.strip()`](#anystrip) - [`any.description(desc)`](#anydescriptiondesc) - [`any.notes(notes)`](#anynotesnotes) - [`any.tags(tags)`](#anytagstags) - [`any.meta(meta)`](#anymetameta) - [`any.example(value)`](#anyexamplevalue) - [`any.unit(name)`](#anyunitname) - [`any.options(options)`](#anyoptionsoptions) - [`any.strict(isStrict)`](#anystrictisstrict) - [`any.default([value, [description]])`](#anydefaultvalue-description) - [`any.concat(schema)`](#anyconcatschema) - [`any.when(ref, options)`](#anywhenref-options) - [`any.label(name)`](#anylabelname) - [`any.raw(isRaw)`](#anyrawisraw) - [`any.empty(schema)`](#anyemptyschema) - [`array`](#array) - [`array.sparse(enabled)`](#arraysparseenabled) - [`array.single(enabled)`](#arraysingleenabled) - [`array.items(type)`](#arrayitemstype) - [`array.ordered(type)`](#arrayorderedtype) - [`array.min(limit)`](#arrayminlimit) - [`array.max(limit)`](#arraymaxlimit) - [`array.length(limit)`](#arraylengthlimit) - [`array.unique()`](#arrayunique) - [`boolean`](#boolean) - [`binary`](#binary) - [`binary.encoding(encoding)`](#binaryencodingencoding) - [`binary.min(limit)`](#binaryminlimit) - [`binary.max(limit)`](#binarymaxlimit) - [`binary.length(limit)`](#binarylengthlimit) - [`date`](#date) - [`date.min(date)`](#datemindate) - [`date.max(date)`](#datemaxdate) - [`date.format(format)`](#dateformatformat) - [`date.iso()`](#dateiso) - [`func`](#func) - [`number`](#number) - [`number.min(limit)`](#numberminlimit) - [`number.max(limit)`](#numbermaxlimit) - [`number.greater(limit)`](#numbergreaterlimit) - [`number.less(limit)`](#numberlesslimit) - [`number.integer()`](#numberinteger) - [`number.precision(limit)`](#numberprecisionlimit) - [`number.multiple(base)`](#numbermultiplebase) - [`number.positive()`](#numberpositive) - [`number.negative()`](#numbernegative) - [`object`](#object) - [`object.keys([schema])`](#objectkeysschema) - [`{} notation`](#-notation) - [`Joi.object([schema]) notation`](#joiobjectschema-notation) - [`Joi.object().keys([schema]) notation`](#joiobjectkeysschema-notation) - [`object.min(limit)`](#objectminlimit) - [`object.max(limit)`](#objectmaxlimit) - [`object.length(limit)`](#objectlengthlimit) - [`object.pattern(regex, schema)`](#objectpatternregex-schema) - [`object.and(peers)`](#objectandpeers) - [`object.nand(peers)`](#objectnandpeers) - [`object.or(peers)`](#objectorpeers) - [`object.xor(peers)`](#objectxorpeers) - [`object.with(key, peers)`](#objectwithkey-peers) - [`object.without(key, peers)`](#objectwithoutkey-peers) - [`object.rename(from, to, [options])`](#objectrenamefrom-to-options) - [`object.assert(ref, schema, [message])`](#objectassertref-schema-message) - [`object.unknown([allow])`](#objectunknownallow) - [`object.type(constructor, [name])`](#objecttypeconstructor-name) - [`object.requiredKeys(children)`](#objectrequiredkeyschildren) - [`object.optionalKeys(children)`](#objectoptionalkeyschildren) - [`string`](#string) - [`string.insensitive()`](#stringinsensitive) - [`string.min(limit, [encoding])`](#stringminlimit-encoding) - [`string.max(limit, [encoding])`](#stringmaxlimit-encoding) - [`string.creditCard()`](#stringcreditcard) - [`string.length(limit, [encoding])`](#stringlengthlimit-encoding) - [`string.regex(pattern, [name])`](#stringregexpattern-name) - [`string.replace(pattern, replacement)`](#stringreplacepattern-replacement) - [`string.alphanum()`](#stringalphanum) - [`string.token()`](#stringtoken) - [`string.email([options])`](#stringemailoptions) - [`string.ip([options])`](#stringipoptions) - [`string.uri([options])`](#stringurioptions) - [`string.guid()`](#stringguid) - [`string.hex()`](#stringhex) - [`string.hostname()`](#stringhostname) - [`string.lowercase()`](#stringlowercase) - [`string.uppercase()`](#stringuppercase) - [`string.trim()`](#stringtrim) - [`string.isoDate()`](#stringisodate) - [`alternatives`](#alternatives) - [`alternatives.try(schemas)`](#alternativestryschemas) - [`alternatives.when(ref, options)`](#alternativeswhenref-options) - [`ref(key, [options])`](#refkey-options) - [Errors](#errors) <!-- tocstop --> ## Joi ### `validate(value, schema, [options], [callback])` Validates a value using the given schema and options where: - `value` - the value being validated. - `schema` - the validation schema. Can be a **joi** type object or a plain object where every key is assigned a **joi** type object. - `options` - an optional object with the following optional keys: - `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`. - `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`. - `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`. - `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`. - `stripUnknown` - when `true`, unknown keys are deleted (only when value is an object or an array). Defaults to `false`. - `language` - overrides individual error messages, when `'label'` is set, it overrides the key name in the error message. Defaults to no override (`{}`). - `presence` - sets the default presence requirements. Supported modes: `'optional'`, `'required'`, and `'forbidden'`. Defaults to `'optional'`. - `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to `validate()` and not using `any.options()`. - `noDefaults` - when `true`, do not apply default values. Defaults to `false`. - `callback` - the optional synchronous callback method using the signature `function(err, value)` where: - `err` - if validation failed, the [error](#errors) reason, otherwise `null`. - `value` - the validated value with any type conversions and other modifiers applied (the input is left unchanged). `value` can be incomplete if validation failed and `abortEarly` is `true`. If callback is not provided, then returns an object with [error](#errors) and value properties. ```javascript var schema = { a: Joi.number() }; var value = { a: '123' }; Joi.validate(value, schema, function (err, value) { }); // err -> null // value.a -> 123 (number, not string) // or var result = Joi.validate(value, schema); // result.error -> null // result.value -> { "a" : 123 } ``` ### `compile(schema)` Converts literal schema definition to **joi** schema object (or returns the same back if already a **joi** schema object) where: - `schema` - the schema definition to compile. ```javascript var definition = ['key', 5, { a: true, b: [/^a/, 'boom'] }]; var schema = Joi.compile(definition); // Same as: var schema = Joi.alternatives().try([ Joi.string().valid('key'), Joi.number().valid(5), Joi.object().keys({ a: Joi.boolean().valid(true), b: Joi.alternatives().try([ Joi.string().regex(/^a/), Joi.string().valid('boom') ]) }) ]); ``` ### `assert(value, schema, [message])` Validates a value against a schema and [throws](#errors) if validation fails where: - `value` - the value to validate. - `schema` - the schema object. - `message` - optional message string prefix added in front of the error message. may also be an Error object. ```javascript Joi.assert('x', Joi.number()); ``` ### `attempt(value, schema, [message])` Validates a value against a schema, returns valid object, and [throws](#errors) if validation fails where: - `value` - the value to validate. - `schema` - the schema object. - `message` - optional message string prefix added in front of the error message. may also be an Error object. ```javascript Joi.attempt('x', Joi.number()); // throws error var result = Joi.attempt('4', Joi.number()); // result -> 4 ``` ### `isRef(ref)` Checks whether or not the provided argument is a reference. It's especially useful if you want to post-process error messages. ```js var ref = Joi.ref('a'); Joi.isRef(ref); // returns true ``` ### `any` Generates a schema object that matches any data type. ```javascript var any = Joi.any(); any.validate('a', function (err, value) { }); ``` #### `any.allow(value)` Whitelists a value where: - `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules. `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). Note that this whitelist of allowed values is in *addition* to any other permitted values. To create an exclusive whitelist of values, see [`any.valid(value)`](#anyvalidvalue). ```javascript var schema = { a: Joi.any().allow('a'), b: Joi.any().allow('b', 'B'), c: Joi.any().allow(['c', 'C']) }; ``` #### `any.valid(value)` - aliases: `only`, `equal` Adds the provided values into the allowed whitelist and marks them as the only valid values allowed where: - `value` - the allowed value which can be of any type and will be matched against the validated value before applying any other rules. `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). ```javascript var schema = { a: Joi.any().valid('a'), b: Joi.any().valid('b', 'B'), c: Joi.any().valid(['c', 'C']) }; ``` #### `any.invalid(value)` - aliases: `disallow`, `not` Blacklists a value where: - `value` - the forbidden value which can be of any type and will be matched against the validated value before applying any other rules. `value` can be an array of values, or multiple values can be passed as individual arguments. `value` supports [references](#refkey-options). ```javascript var schema = { a: Joi.any().invalid('a'), b: Joi.any().invalid('b', 'B'), c: Joi.any().invalid(['c', 'C']) }; ``` #### `any.required()` Marks a key as required which will not allow `undefined` as value. All keys are optional by default. ```javascript var schema = Joi.any().required(); ``` #### `any.optional()` Marks a key as optional which will allow `undefined` as values. Used to annotate the schema for readability as all keys are optional by default. ```javascript var schema = Joi.any().optional(); ``` #### `any.forbidden()` Marks a key as forbidden which will not allow any value except `undefined`. Used to explicitly forbid keys. ```javascript var schema = { a: Joi.any().forbidden() }; ``` #### `any.strip()` Marks a key to be removed from a resulting object or array after validation. Used to sanitize output. ```javascript var schema = { username: Joi.string(), password: Joi.string().strip() }; schema.validate({ username: 'test', password: 'hunter2' }, function (err, value) { // value = { username: 'test' } }); var schema = Joi.array().items(Joi.string(), Joi.any().strip()); schema.validate(['one', 'two', true, false, 1, 2], function (err, value) { // value = ['one', 'two'] }); ``` #### `any.description(desc)` Annotates the key where: - `desc` - the description string. ```javascript var schema = Joi.any().description('this key will match anything you give it'); ``` #### `any.notes(notes)` Annotates the key where: - `notes` - the notes string or array of strings. ```javascript var schema = Joi.any().notes(['this is special', 'this is important']); ``` #### `any.tags(tags)` Annotates the key where: - `tags` - the tag string or array of strings. ```javascript var schema = Joi.any().tags(['api', 'user']); ``` #### `any.meta(meta)` Attaches metadata to the key where: - `meta` - the meta object to attach. ```javascript var schema = Joi.any().meta({ index: true }); ``` #### `any.example(value)` Annotates the key where: - `value` - an example value. If the example fails to pass validation, the function will throw. ```javascript var schema = Joi.string().min(4).example('abcd'); ``` #### `any.unit(name)` Annotates the key where: - `name` - the unit name of the value. ```javascript var schema = Joi.number().unit('milliseconds'); ``` #### `any.options(options)` Overrides the global `validate()` options for the current key and any sub-key where: - `options` - an object with the same optional keys as [`Joi.validate(value, schema, options, callback)`](#validatevalue-schema-options-callback). ```javascript var schema = Joi.any().options({ convert: false }); ``` #### `any.strict(isStrict)` Strict mode sets the `options.convert` options to `false` which prevent type casting for the current key and any child keys. - `isStrict` - whether strict mode is enabled or not. Defaults to true. ```javascript var schema = Joi.any().strict(); ``` #### `any.default([value, [description]])` Sets a default value if the original value is undefined where: - `value` - the value. - `value` supports [references](#refkey-options). - `value` may also be a function which returns the default value. If `value` is specified as a function that accepts a single parameter, that parameter will be a context object that can be used to derive the resulting value. **This clones the object however, which incurs some overhead so if you don't need access to the context define your method so that it does not accept any parameters**. - without any `value`, `default` has no effect, except for `object` that will then create nested defaults (applying inner defaults of that object). Note that if `value` is an object, any changes to the object after `default()` is called will change the reference and any future assignment. Additionally, when specifying a method you must either have a `description` property on your method or the second parameter is required. ```javascript var generateUsername = function (context) { return context.firstname.toLowerCase() + '-' + context.lastname.toLowerCase(); }; generateUsername.description = 'generated username'; var schema = { username: Joi.string().default(generateUsername), firstname: Joi.string(), lastname: Joi.string(), created: Joi.date().default(Date.now, 'time of creation'), status: Joi.string().default('registered') }; Joi.validate({ firstname: 'Jane', lastname: 'Doe' }, schema, function (err, value) { // value.status === 'registered' // value.username === 'jane-doe' // value.created will be the time of validation }); ``` #### `any.concat(schema)` Returns a new type that is the result of adding the rules of one type to another where: - `schema` - a **joi** type to merge into the current schema. Can only be of the same type as the context type or `any`. If applied to an `any` type, the schema can be any other schema. ```javascript var a = Joi.string().valid('a'); var b = Joi.string().valid('b'); var ab = a.concat(b); ``` #### `any.when(ref, options)` Converts the type into an [`alternatives`](#alternatives) type where the conditions are merged into the type definition where: - `ref` - the key name or [reference](#refkey-options). - `options` - an object with: - `is` - the required condition **joi** type. - `then` - the alternative schema type if the condition is true. Required if `otherwise` is missing. - `otherwise` - the alternative schema type if the condition is false. Required if `then` is missing. ```javascript var schema = { a: Joi.any().valid('x').when('b', { is: 5, then: Joi.valid('y'), otherwise: Joi.valid('z') }), b: Joi.any() }; ``` Alternatively, if you want to specify a specific type such as `string`, `array`, etc, you can do so like this: ```javascript var schema = { a: Joi.valid('a', 'b', 'other'), other: Joi.string() .when('a', { is: 'other', then: Joi.required() }), }; ``` #### `any.label(name)` Overrides the key name in error messages. - `name` - the name of the key. ```javascript var schema = { first_name: Joi.string().label('First Name') }; ``` #### `any.raw(isRaw)` Outputs the original untouched value instead of the casted value. - `isRaw` - whether to enable raw mode or not. Defaults to true. ```javascript var schema = { timestamp: Joi.date().format('YYYYMMDD').raw() }; ``` #### `any.empty(schema)` Considers anything that matches the schema to be empty (`undefined`). - `schema` - any object or joi schema to match. An undefined schema unsets that rule. ```js var schema = Joi.string().empty(''); schema.validate(''); // returns { error: null, value: undefined } schema = schema.empty(); schema.validate(''); // returns { error: "value" is not allowed to be empty, value: '' } ``` ### `array` Generates a schema object that matches an array data type. Note that undefined values inside arrays are not allowed by default but can be by using `sparse()`. Supports the same methods of the [`any()`](#any) type. ```javascript var array = Joi.array().items(Joi.string().valid('a', 'b')); array.validate(['a', 'b', 'a'], function (err, value) { }); ``` #### `array.sparse(enabled)` Allow this array to be sparse. `enabled` can be used with a falsy value to go back to the default behavior. ```javascript var schema = Joi.array().sparse(); // undefined values are now allowed schema = schema.sparse(false); // undefined values are now denied ``` #### `array.single(enabled)` Allow single values to be checked against rules as if it were provided as an array. `enabled` can be used with a falsy value to go back to the default behavior. ```javascript var schema = Joi.array().items(Joi.number()).single(); schema.validate([4]); // returns `{ error: null, value: [ 4 ] }` schema.validate(4); // returns `{ error: null, value: [ 4 ] }` ``` #### `array.items(type)` List the types allowed for the array values where: - `type` - a **joi** schema object to validate each array item against. `type` can be an array of values, or multiple values can be passed as individual arguments. If a given type is `.required()` then there must be a matching item in the array. If a type is `.forbidden()` then it cannot appear in the array. Required items can be added multiple times to signify that multiple items must be found. Errors will contain the number of items that didn't match. Any unmatched item having a [label](#anylabelname) will be mentioned explicitly. ```javascript var schema = Joi.array().items(Joi.string(), Joi.number()); // array may contain strings and numbers var schema = Joi.array().items(Joi.string().required(), Joi.string().required()); // array must contain at least two strings var schema = Joi.array().items(Joi.string().valid('not allowed').forbidden(), Joi.string()); // array may contain strings, but none of those strings can match 'not allowed' var schema = Joi.array().items(Joi.string().label('My string').required(), Joi.number().required()); // If this fails it can result in `[ValidationError: "value" does not contain [My string] and 1 other required value(s)]` ``` #### `array.ordered(type)` List the types in sequence order for the array values where: - `type` - a **joi** schema object to validate against each array item in sequence order. `type` can be an array of values, or multiple values can be passed as individual arguments. If a given type is `.required()` then there must be a matching item with the same index position in the array. Errors will contain the number of items that didn't match. Any unmatched item having a [label](#anylabelname) will be mentioned explicitly. ```javascript var schema = Joi.array().ordered(Joi.string().required(), Joi.number().required()); // array must have first item as string and second item as number var schema = Joi.array().ordered(Joi.string().required()).items(Joi.number().required()); // array must have first item as string and 1 or more subsequent items as number var schema = Joi.array().ordered(Joi.string().required(), Joi.number()); // array must have first item as string and optionally second item as number ``` #### `array.min(limit)` Specifies the minimum number of items in the array where: - `limit` - the lowest number of array items allowed. ```javascript var schema = Joi.array().min(2); ``` #### `array.max(limit)` Specifies the maximum number of items in the array where: - `limit` - the highest number of array items allowed. ```javascript var schema = Joi.array().max(10); ``` #### `array.length(limit)` Specifies the exact number of items in the array where: - `limit` - the number of array items allowed. ```javascript var schema = Joi.array().length(5); ``` #### `array.unique()` Requires the array values to be unique. Be aware that a deep equality is performed on elements of the array having a type of `object`, a performance penalty is to be expected for this kind of operation. ```javascript var schema = Joi.array().unique(); ``` ### `boolean` Generates a schema object that matches a boolean data type (as well as the strings 'true', 'false', 'yes', 'no', 'on' or 'off'). Can also be called via `bool()`. Supports the same methods of the [`any()`](#any) type. ```javascript var boolean = Joi.boolean(); boolean.validate(true, function (err, value) { }); ``` ### `binary` Generates a schema object that matches a Buffer data type (as well as the strings which will be converted to Buffers). Supports the same methods of the [`any()`](#any) type. ```javascript var schema = Joi.binary(); ``` #### `binary.encoding(encoding)` Sets the string encoding format if a string input is converted to a buffer where: - `encoding` - the encoding scheme. ```javascript var schema = Joi.binary().encoding('base64'); ``` #### `binary.min(limit)` Specifies the minimum length of the buffer where: - `limit` - the lowest size of the buffer. ```javascript var schema = Joi.binary().min(2); ``` #### `binary.max(limit)` Specifies the maximum length of the buffer where: - `limit` - the highest size of the buffer. ```javascript var schema = Joi.binary().max(10); ``` #### `binary.length(limit)` Specifies the exact length of the buffer: - `limit` - the size of buffer allowed. ```javascript var schema = Joi.binary().length(5); ``` ### `date` Generates a schema object that matches a date type (as well as a JavaScript date string or number of milliseconds). Supports the same methods of the [`any()`](#any) type. ```javascript var date = Joi.date(); date.validate('12-21-2012', function (err, value) { }); ``` #### `date.min(date)` Specifies the oldest date allowed where: - `date` - the oldest date allowed. ```javascript var schema = Joi.date().min('1-1-1974'); ``` Notes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future. ```javascript var schema = Joi.date().min('now'); ``` It can also be a reference to another field. ```javascript var schema = Joi.object({ from: Joi.date().required(), to: Joi.date().min(Joi.ref('from')).required() }); ``` #### `date.max(date)` Specifies the latest date allowed where: - `date` - the latest date allowed. ```javascript var schema = Joi.date().max('12-31-2020'); ``` Notes: `'now'` can be passed in lieu of `date` so as to always compare relatively to the current date, allowing to explicitly ensure a date is either in the past or in the future. ```javascript var schema = Joi.date().max('now'); ``` It can also be a reference to another field. ```javascript var schema = Joi.object({ from: Joi.date().max(Joi.ref('to')).required(), to: Joi.date().required() }); ``` #### `date.format(format)` Specifies the allowed date format: - `format` - string or array of strings that follow the `moment.js` [format](http://momentjs.com/docs/#/parsing/string-format/). ```javascript var schema = Joi.date().format('YYYY/MM/DD'); ``` #### `date.iso()` Requires the string value to be in valid ISO 8601 date format. ```javascript var schema = Joi.date().iso(); ``` ### `func` Generates a schema object that matches a function type. Supports the same methods of the [`object()`](#object) type. Note that validating a function keys will cause the function to be cloned. While the function will retain its prototype and closure, it will lose its `length` property value (will be set to `0`). ```javascript var func = Joi.func(); func.validate(function () {}, function (err, value) { }); ``` ### `number` Generates a schema object that matches a number data type (as well as strings that can be converted to numbers). `Infinity` and `-Infinity` are invalid by default, you can change that behavior by calling `allow(Infinity, -Infinity)`. Supports the same methods of the [`any()`](#any) type. ```javascript var number = Joi.number(); number.validate(5, function (err, value) { }); ``` #### `number.min(limit)` Specifies the minimum value where: - `limit` - the minimum value allowed. ```javascript var schema = Joi.number().min(2); ``` It can also be a reference to another field. ```javascript var schema = Joi.object({ min: Joi.number().required(), max: Joi.number().min(Joi.ref('min')).required() }); ``` #### `number.max(limit)` Specifies the maximum value where: - `limit` - the maximum value allowed. ```javascript var schema = Joi.number().max(10); ``` It can also be a reference to another field. ```javascript var schema = Joi.object({ min: Joi.number().max(Joi.ref('max')).required(), max: Joi.number().required() }); ``` #### `number.greater(limit)` Specifies that the value must be greater than `limit`. ```javascript var schema = Joi.number().greater(5); ``` ```javascript var schema = Joi.object({ min: Joi.number().required(), max: Joi.number().greater(Joi.ref('min')).required() }); ``` #### `number.less(limit)` Specifies that the value must be less than `limit`. ```javascript var schema = Joi.number().less(10); ``` It can also be a reference to another field. ```javascript var schema = Joi.object({ min: Joi.number().less(Joi.ref('max')).required(), max: Joi.number().required() }); ``` #### `number.integer()` Requires the number to be an integer (no floating point). ```javascript var schema = Joi.number().integer(); ``` #### `number.precision(limit)` Specifies the maximum number of decimal places where: - `limit` - the maximum number of decimal places allowed. ```javascript var schema = Joi.number().precision(2); ``` #### `number.multiple(base)` Specifies that the value must be a multiple of `base`: ```javascript var schema = Joi.number().multiple(3); ``` #### `number.positive()` Requires the number to be positive. ```javascript var schema = Joi.number().positive(); ``` #### `number.negative()` Requires the number to be negative. ```javascript var schema = Joi.number().negative(); ``` ### `object` Generates a schema object that matches an object data type (as well as JSON strings that parsed into objects). Defaults to allowing any child key. Supports the same methods of the [`any()`](#any) type. ```javascript var object = Joi.object().keys({ a: Joi.number().min(1).max(10).integer(), b: 'some string' }); object.validate({ a: 5 }, function (err, value) { }); ``` #### `object.keys([schema])` Sets or extends the allowed object keys where: - `schema` - optional object where each key is assigned a **joi** type object. If `schema` is `{}` no keys allowed. If `schema` is `null` or `undefined`, any key allowed. If `schema` is an object with keys, the keys are added to any previously defined keys (but narrows the selection if all keys previously allowed). Defaults to 'undefined' which allows any child key. ```javascript var base = Joi.object().keys({ a: Joi.number(), b: Joi.string() }); // Validate keys a, b and c. var extended = base.keys({ c: Joi.boolean() }); ``` Notes: We have three different ways to define a schema for performing a validation - Using the plain JS object notation: ```javascript var schema = { a: Joi.string(), b: Joi.number() }; ``` - Using the `Joi.object([schema])` notation ```javascript var schema = Joi.object({ a: Joi.string(), b: Joi.number() }); ``` - Using the `Joi.object().keys([schema])` notation ```javascript var schema = Joi.object().keys({ a: Joi.string(), b: Joi.number() }); ``` While all these three objects defined above will result in the same validation object, there are some differences in using one or another: ##### `{} notation` When using the `{}` notation, you are just defining a plain JS object, which isn't a schema object. You can pass it to the validation method but you can't call `validate()` method of the object because it's just a plain JS object. Besides, passing the `{}` object to the `validate()` method each time, will perform an expensive schema compilation operation on every validation. ##### `Joi.object([schema]) notation` Using `Joi.object([schema])` will return a schema object, so you can call the `validate()` method directly, e.g: ```javascript var schema = Joi.object({ a: Joi.boolean() }); schema.validate(true, function (err, value) { console.log('err: ', err); }); ``` When you use `Joi.object([schema])`, it gets compiled the first time, so you can pass it to the `validate()` method multiple times and no overhead is added. Another benefits of using `Joi.object([schema])` instead of a plain JS object is that you can set any options on the object like allowing unknown keys, e.g: ```javascript var schema = Joi.object({ arg: Joi.string().valid('firstname', 'lastname', 'title', 'company', 'jobtitle'), value: Joi.string(), }).pattern(/firstname|lastname/, Joi.string().min(2)); ``` ##### `Joi.object().keys([schema]) notation` This is basically the same as `Joi.object([schema])`, but using `Joi.object().keys([schema])` is more useful when you want to add more keys (e.g. call `keys()` multiple times). If you are only adding one set of keys, you can skip the `keys()` method and just use `object()` directly. Some people like to use `keys()` to make the code more explicit (this is style only). #### `object.min(limit)` Specifies the minimum number of keys in the object where: - `limit` - the lowest number of keys allowed. ```javascript var schema = Joi.object().min(2); ``` #### `object.max(limit)` Specifies the maximum number of keys in the object where: - `limit` - the highest number of object keys allowed. ```javascript var schema = Joi.object().max(10); ``` #### `object.length(limit)` Specifies the exact number of keys in the object where: - `limit` - the number of object keys allowed. ```javascript var schema = Joi.object().length(5); ``` #### `object.pattern(regex, schema)` Specify validation rules for unknown keys matching a pattern where: - `regex` - a regular expression tested against the unknown key names. - `schema` - the schema object matching keys much validate against. ```javascrip var schema = Joi.object({ a: Joi.string() }).pattern(/\w\d/, Joi.boolean()); ``` #### `object.and(peers)` Defines an all-or-nothing relationship between keys where if one of the peers is present, all of them are required as well where: - `peers` - the key names of which if one present, all are required. `peers` can be a single string value, an array of string values, or each peer provided as an argument. ```javascript var schema = Joi.object().keys({ a: Joi.any(), b: Joi.any() }).and('a', 'b'); ``` #### `object.nand(peers)` Defines a relationship between keys where not all peers can be present at the same time where: - `peers` - the key names of which if one present, the others may not all be present. `peers` can be a single string value, an array of string values, or each peer provided as an argument. ```javascript var schema = Joi.object().keys({ a: Joi.any(), b: Joi.any() }).nand('a', 'b'); ``` #### `object.or(peers)` Defines a relationship between keys where one of the peers is required (and more than one is allowed) where: - `peers` - the key names of which at least one must appear. `peers` can be a single string value, an array of string values, or each peer provided as an argument. ```javascript var schema = Joi.object().keys({ a: Joi.any(), b: Joi.any() }).or('a', 'b'); ``` #### `object.xor(peers)` Defines an exclusive relationship between a set of keys where one of them is required but not at the same time where: - `peers` - the exclusive key names that must not appear together but where one of them is required. `peers` can be a single string value, an array of string values, or each peer provided as an argument. ```javascript var schema = Joi.object().keys({ a: Joi.any(), b: Joi.any() }).xor('a', 'b'); ``` #### `object.with(key, peers)` Requires the presence of other keys whenever the specified key is present where: - `key` - the reference key. - `peers` - the required peer key names that must appear together with `key`. `peers` can be a single string value or an array of string values. Note that unlike [`object.and()`](#objectandpeers), `with()` creates a dependency only between the `key` and each of the `peers`, not between the `peers` themselves. ```javascript var schema = Joi.object().keys({ a: Joi.any(), b: Joi.any() }).with('a', 'b'); ``` #### `object.without(key, peers)` Forbids the presence of other keys whenever the specified is present where: - `key` - the reference key. - `peers` - the forbidden peer key names that must not appear together with `key`. `peers` can be a single string value or an array of string values. ```javascript var schema = Joi.object().keys({ a: Joi.any(), b: Joi.any() }).without('a', ['b']); ``` #### `object.rename(from, to, [options])` Renames a key to another name (deletes the renamed key) where: - `from` - the original key name. - `to` - the new key name. - `options` - an optional object with the following optional keys: - `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`. - `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`. - `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`. - `ignoreUndefined` - if `true`, skip renaming of a key if it's undefined. Defaults to `false`. Keys are renamed before any other validation rules are applied. ```javascript var object = Joi.object().keys({ a: Joi.number() }).rename('b', 'a'); object.validate({ b: 5 }, function (err, value) { }); ``` #### `object.assert(ref, schema, [message])` Verifies an assertion where: - `ref` - the key name or [reference](#refkey-options). - `schema` - the validation rules required to satisfy the assertion. If the `schema` includes references, they are resolved against the object value, not the value of the `ref` target. - `message` - optional human-readable message used when the assertion fails. Defaults to 'failed to pass the assertion test'. ```javascript var schema = Joi.object().keys({ a: { b: Joi.string(), c: Joi.number() }, d: { e: Joi.any() } }).assert('d.e', Joi.ref('a.c'), 'equal to a.c'); ``` #### `object.unknown([allow])` Overrides the handling of unknown keys for the scope of the current object only (does not apply to children) where: - `allow` - if `false`, unknown keys are not allowed, otherwise unknown keys are ignored. ```javascript var schema = Joi.object({ a: Joi.any() }).unknown(); ``` #### `object.type(constructor, [name])` Requires the object to be an instance of a given constructor where: - `constructor` - the constructor function that the object must be an instance of. - `name` - an alternate name to use in validation errors. This is useful when the constructor function does not have a name. ```javascript var schema = Joi.object().type(RegExp); ``` #### `object.requiredKeys(children)` Sets the specified children to required. - `children` - can be a single string value, an array of string values, or each child provided as an argument. ```javascript var schema = Joi.object().keys({ a: { b: Joi.number() }, c: { d: Joi.string() } }); var requiredSchema = schema.requiredKeys('', 'a.b', 'c', 'c.d'); ``` Note that in this example `''` means the current object, `a` is not required but `b` is, as well as `c` and `d`. #### `object.optionalKeys(children)` Sets the specified children to optional. - `children` - can be a single string value, an array of string values, or each child provided as an argument. ```javascript var schema = Joi.object().keys({ a: { b: Joi.number().required() }, c: { d: Joi.string().required() } }); var requiredSchema = schema.optionalKeys('a.b', 'c.d'); ``` The behavior is exactly the same as `requiredKeys`. ### `string` Generates a schema object that matches a string data type. Note that empty strings are not allowed by default and must be enabled with `allow('')`. Supports the same methods of the [`any()`](#any) type. ```javascript var schema = Joi.string().min(1).max(10); schema.validate('12345', function (err, value) { }); ``` #### `string.insensitive()` Allows the value to match any whitelist of blacklist item in a case insensitive comparison. ```javascript var schema = Joi.string().valid('a').insensitive(); ``` #### `string.min(limit, [encoding])` Specifies the minimum number string characters where: - `limit` - the minimum number of string characters required. - `encoding` - is specified, the string length is calculated in bytes using the provided encoding. ```javascript var schema = Joi.string().min(2); ``` It can also be a reference to another field. ```javascript var schema = Joi.object({ min: Joi.string().required(), value: Joi.string().min(Joi.ref('min'), 'utf8').required() }); ``` #### `string.max(limit, [encoding])` Specifies the maximum number of string characters where: - `limit` - the maximum number of string characters allowed. - `encoding` - is specified, the string length is calculated in bytes using the provided encoding. ```javascript var schema = Joi.string().max(10); ``` It can also be a reference to another field. ```javascript var schema = Joi.object({ max: Joi.string().required(), value: Joi.string().max(Joi.ref('max'), 'utf8').required() }); ``` #### `string.creditCard()` Requires the number to be a credit card number (Using [Lunh Algorithm](http://en.wikipedia.org/wiki/Luhn_algorithm)). ```javascript var schema = Joi.string().creditCard(); ``` #### `string.length(limit, [encoding])` Specifies the exact string length required where: - `limit` - the required string length. - `encoding` - is specified, the string length is calculated in bytes using the provided encoding. ```javascript var schema = Joi.string().length(5); ``` It can also be a reference to another field. ```javascript var schema = Joi.object({ length: Joi.string().required(), value: Joi.string().length(Joi.ref('length'), 'utf8').required() }); ``` #### `string.regex(pattern, [name])` Defines a regular expression rule where: - `pattern` - a regular expression object the string value must match against. - `name` - optional name for patterns (useful with multiple patterns). Defaults to 'required'. ```javascript var schema = Joi.string().regex(/^[abc]+$/); ``` #### `string.replace(pattern, replacement)` Replace characters matching the given _pattern_ with the specified _replacement_ string where: - `pattern` - a regular expression object to match against, or a string of which _all_ occurrences will be replaced. - `replacement` - the string that will replace the pattern. ```javascript var schema = Joi.string().replace(/b/gi, 'x'); schema.validate('abBc', function (err, value) { // here value will be 'axxc' }); ``` When `pattern` is a _string_ all its occurrences will be replaced. #### `string.alphanum()` Requires the string value to only contain a-z, A-Z, and 0-9. ```javascript var schema = Joi.string().alphanum(); ``` #### `string.token()` Requires the string value to only contain a-z, A-Z, 0-9, and underscore _. ```javascript var schema = Joi.string().token(); ``` #### `string.email([options])` Requires the string value to be a valid email address. - `options` - optional settings: - `errorLevel` - Numerical threshold at which an email address is considered invalid. - `tldWhitelist` - Specifies a list of acceptable TLDs. - `minDomainAtoms` - Number of atoms required for the domain. Be careful since some domains, such as `io`, directly allow email. ```javascript var schema = Joi.string().email(); ``` #### `string.ip([options])` Requires the string value to be a valid ip address. - `options` - optional settings: - `version` - One or more IP address versions to validate against. Valid values: `ipv4`, `ipv6`, `ipvfuture` - `cidr` - Used to determine if a CIDR is allowed or not. Valid values: `optional`, `required`, `forbidden` ```javascript // Accept only ipv4 and ipv6 addresses with a CIDR var schema = Joi.string().ip({ version: [ 'ipv4', 'ipv6' ], cidr: 'required' }); ``` #### `string.uri([options])` Requires the string value to be a valid [RFC 3986](http://tools.ietf.org/html/rfc3986) URI. - `options` - optional settings: - `scheme` - Specifies one or more acceptable Schemes, should only include the scheme name. Can be an Array or String (strings are automatically escaped for use in a Regular Expression). ```javascript // Accept git or git http/https var schema = Joi.string().uri({ scheme: [ 'git', /git\+https?/ ] }); ``` #### `string.guid()` Requires the string value to be a valid GUID. ```javascript var schema = Joi.string().guid(); ``` #### `string.hex()` Requires the string value to be a valid hexadecimal string. ```javascript var schema = Joi.string().hex(); ``` #### `string.hostname()` Requires the string value to be a valid hostname as per [RFC1123](http://tools.ietf.org/html/rfc1123). ```javascript var schema = Joi.string().hostname(); ``` #### `string.lowercase()` Requires the string value to be all lowercase. If the validation `convert` option is on (enabled by default), the string will be forced to lowercase. ```javascript var schema = Joi.string().lowercase(); ``` #### `string.uppercase()` Requires the string value to be all uppercase. If the validation `convert` option is on (enabled by default), the string will be forced to uppercase. ```javascript var schema = Joi.string().uppercase(); ``` #### `string.trim()` Requires the string value to contain no whitespace before or after. If the validation `convert` option is on (enabled by default), the string will be trimmed. ```javascript var schema = Joi.string().trim(); ``` #### `string.isoDate()` Requires the string value to be in valid ISO 8601 date format. ```js var schema = Joi.string().isoDate(); ``` ### `alternatives` Generates a type that will match one of the provided alternative schemas via the [`try()`](#alternativestryschemas) method. If no schemas are added, the type will not match any value except for `undefined`. Supports the same methods of the [`any()`](#any) type. Alternatives can be expressed using the shorter `[]` notation. ```javascript var alt = Joi.alternatives().try(Joi.number(), Joi.string()); // Same as [Joi.number(), Joi.string()] ``` #### `alternatives.try(schemas)` Adds an alternative schema type for attempting to match against the validated value where: - `schema` - an array of alternative **joi** types. Also supports providing each type as a separate argument. ```javascript var alt = Joi.alternatives().try(Joi.number(), Joi.string()); alt.validate('a', function (err, value) { }); ``` #### `alternatives.when(ref, options)` Adds a conditional alternative schema type based on another key (not the same as `any.when()`) value where: - `ref` - the key name or [reference](#refkey-options). - `options` - an object with: - `is` - the required condition **joi** type. - `then` - the alternative schema type to **try** if the condition is true. Required if `otherwise` is missing. - `otherwise` - the alternative schema type to **try** if the condition is false. Required if `then` is missing. ```javascript var schema = { a: Joi.alternatives().when('b', { is: 5, then: Joi.string(), otherwise: Joi.number() }), b: Joi.any() }; ``` Note that `when()` only adds additional alternatives to try and does not impact the overall type. Setting a `required()` rule on a single alternative will not apply to the overall key. For example, this definition of `a`: ```javascript var schema = { a: Joi.alternatives().when('b', { is: true, then: Joi.required() }), b: Joi.boolean() }; ``` Does not turn `a` into a required key when `b` is `true`. Instead, it tells the validator to try and match the value to anything that's not `undefined`. However, since `Joi.alternatives()` by itself allows `undefined`, the rule does not accomplish turning `a` to a required value. This rule is the same as `Joi.alternatives([Joi.required()])` when `b` is `true` which will allow any value including `undefined`. To accomplish the desired result above use: ```javascript var schema = { a: Joi.when('b', { is: true, then: Joi.required() }), b: Joi.boolean() }; ``` ### `ref(key, [options])` Generates a reference to the value of the named key. References are resolved at validation time and in order of dependency so that if one key validation depends on another, the dependent key is validated second after the reference is validated. References support the following arguments: - `key` - the reference target. References cannot point up the object tree, only to sibling keys, but they can point to their siblings' children (e.g. 'a.b.c') using the `.` separator. If a `key` starts with `$` is signifies a context reference which is looked up in the `context` option object. - `options` - optional settings: - `separator` - overrides the default `.` hierarchy separator. - `contextPrefix` - overrides the default `$` context prefix signifier. Note that references can only be used where explicitly supported such as in `valid()` or `invalid()` rules. If upwards (parents) references are needed, use [`object.assert()`](#objectassertref-schema-message). ```javascript var schema = Joi.object().keys({ a: Joi.ref('b.c'), b: { c: Joi.any() }, c: Joi.ref('$x') }); Joi.validate({ a: 5, b: { c: 5 } }, schema, { context: { x: 5 } }, function (err, value) {}); ``` ## Errors Joi throws classical javascript `Error`s containing : - `name` - `ValidationError`. - `details` - an array of errors : - `message` - string with a description of the error. - `path` - dotted path to the key where the error happened. - `type` - type of the error. - `context` - object providing context of the error. - `annotate` - function that returns a string with an annotated version of the object pointing at the places where errors occured. - `_object` - the original object to validate.