vqp v1.1.4
VQP
Проверьте свойства объекта в javascript.
Использование
Определить схему и вызвать .validate()
с объектом, который вы хотите проверить.
Эта функция возвращает массив ошибок проверки.
import Schema from 'vqp'
const user = new Schema({
username: {
type: String,
required: true,
length: { min: 3, max: 32 }
},
pets: [{
name: {
type: String
required: true
},
animal: {
type: String
enum: ['cat', 'dog', 'cow']
}
}],
address: {
street: {
type: String,
required: true
},
city: {
type: String,
required: true
}
zip: {
type: String,
match: /^[0-9]+$/,
required: true
}
}
})
const errors = user.validate(obj)
Каждая ошибка имеет .path
, описывающий полный путь свойства, которое не прошло проверку, и.message
, описывающий ошибку.
errors[0].path //=> 'address.street'
errors[0].message //=> 'address.street is required.'
Собственные сообщения об ошибках
Вы можете переопределить сообщения об ошибках по умолчанию, передав объект Schema#message()
.
const post = new Schema({
title: { required: true }
})
post.message({
required: (path) => `${path} не может быть пустым.`
})
const [error] = post.validate({})
assert(error.message = 'Название не может быть пустым.')
Также возможно определить сообщения для отдельных свойств:
const post = new Schema({
title: {
required: true,
message: 'Название обязательно.'
}
})
И для отдельных валидаторов:
const post = new Schema({
title: {
type: String,
required: true,
message: {
type: 'Название должно быть строкой.',
required: 'Название обязательно.'
}
}
})
Вложенность
Объекты и массивы могут быть вложены так глубоко, как вы хотите:
const event = new Schema({
title: {
type: String,
required: true
},
participants: [{
name: String,
email: {
type: String,
required: true
},
things: [{
name: String,
amount: Number
}]
}]
})
Массивы могут быть определены неявно, как в примере выше, или явно:
const post = new Schema({
keywords: {
type: Array,
each: { type: String }
}
})
Элементы массива также могут быть определены индивидуально:
const user = new Schema({
something: {
type: Array,
elements: [
{ type: Number },
{ type: String }
]
}
})
Вложенность также работает со схемами:
const user = new Schema({
name: {
type: String,
required: true
},
email: {
type: String,
required: true
}
})
const post = new Schema({
title: {
type: String,
required: true
},
content: {
type: String,
required: true
},
author: user
})
Если вы думаете, что это должно сработать, то это, вероятно, работает.
Naming conflicts
Проверка будет наивно предполагать, что вложенный объект, в котором имена свойств all являются валидаторами, не является вложенным объектом.
const schema = new Schema({
pet: {
type: {
required: true,
type: String,
enum: ['cat', 'dog']
}
}
});
В этом примере свойство pet.type
будет интерпретироваться как правилоtype
, и проверки не будут работать так, как задумано. Чтобы обойти это, мы могли бы использовать более подробное правило properties
:
const schema = new Schema({
pet: {
properties: {
type: {
required: true,
type: String,
enum: ['cat', 'dog']
}
}
}
});
В этом случае свойство type
для pets.properties` будет интерпретироваться как вложенное свойство, и проверки будут работать так, как задумано.
Пользовательские валидаторы
Пользовательские валидаторы могут быть определены путем передачи объекта с именованными валидаторами в .use
:
const hexColor = val => /^#[0-9a-fA-F]$/.test(val)
const car = new Schema({
color: {
type: String,
use: { hexColor }
}
})
Определите пользовательское сообщение об ошибке для валидатора:
car.message({
hexColor: path => `${path} должен быть действительным цветом.`
})
Пользовательские типы
Передайте конструктор в .type
для проверки на соответствие пользовательскому типу:
class Car {}
const user = new Schema({
car: { type: Car }
})
Цепочка API
Если вы хотите избежать построения больших объектов, вы можете добавить пути к схеме с помощью цепочки API:
const user = new Schema()
user
.path('username').type(String).required()
.path('address.zip').type(String).required()
Элементы массива могут быть определены с помощью $
в качестве заполнителя для индексов:
const user = new Schema()
user.path('pets.$').type(String)
Это эквивалентно написанию
const user = new Schema({ pets: [{ type: String }]})
Приведение типов
Значения могут быть автоматически переданы перед проверкой.
Чтобы включить приведение типов, передайте объект параметров конструктору Schema
с параметром typecast, установленным в значение true.
const user = new Schema(definition, { typecast: true })
Вы можете переопределить этот параметр, передав опцию .validate()
.
user.validate(obj, { typecast: false })
Чтобы настраивать пользовательские типы, вы можете зарегистрировать собственный тип:
class Car {}
const user = new Schema({
car: { type: Car }
})
user.typecaster({
Car: (val) => new Car(val)
})
Property stripping
По умолчанию все значения, не определенные в схеме, будут удалены из объекта.
Установите .strip = false
на объекте параметров, чтобы отключить это поведение. Это, вероятно, будет изменено в будущей версии.
Строгий режим
Когда строгий режим включен, свойства, которые не определены в схеме, вызовут ошибку проверки. Установите .strict = true
для объекта параметров, чтобы включить строгий режим.
API
Table of Contents
- Property
- Schema
Property
Экземпляр свойства возвращается при каждом вызове schema.path()
.
Свойства также создаются внутри, когда объект передается конструктору схемы.
Parameters
message
Регистрирует сообщения.
Parameters
Examples
prop.message('что-то не так')
prop.message({ required: 'параметр обязателен.' })
Returns Property
schema
Смонтировать заданную схему на текущем пути.
Parameters
schema
Schema схема для монтирования
Examples
const user = new Schema({ email: String })
prop.schema(user)
Returns Property
use
Проверка с использованием именованных функций из данного объекта.
Сообщения об ошибках можно определить, предоставив объекту
именованные сообщения об ошибках / генераторы для schema.message()
Генератор сообщений получает проверяемое значение, объект, к которому он принадлежит, и любые дополнительные аргументы.
Parameters
fns
Object объект с именованными функциями проверки для вызова
Examples
const schema = new Schema()
const prop = schema.path('some.path')
schema.message({
binary: (path, ctx) => `${path} must be binary.`,
bits: (path, ctx, bits) => `${path} must be ${bits}-bit`
})
prop.use({
binary: (val, ctx) => /^[01]+$/i.test(val),
bits: [(val, ctx, bits) => val.length == bits, 32]
})
Returns Property
required
Регистрирует валидатор, который проверяет наличие.
Parameters
bool
Boolean?true
если требуется,false
в противном случае (optional, defaulttrue
)
Examples
prop.required()
Returns Property
type
Регистрирует валидатор, который проверяет, имеет ли значение заданный тип
Parameters
Examples
prop.type(String)
prop.type('string')
Returns Property
string
Удобный метод для установки типа в String
Examples
prop.string()
Returns Property
number
Удобный метод для установки типа на Number
Examples
prop.number()
Returns Property
array
Удобный метод для установки типа в Array
Examples
prop.array()
Returns Property
date
Удобный метод для установки типа на Date
Examples
prop.date()
Returns Property
length
Регистрирует валидатор, который проверяет длину.
Parameters
Examples
prop.length({ min: 8, max: 255 })
prop.length(10)
Returns Property
size
Регистрирует валидатор, который проверяет размер.
Parameters
Examples
prop.size({ min: 8, max: 255 })
prop.size(10)
Returns Property
enum
Регистрирует валидатор для перечислений.
Parameters
enums
rules
Array допустимые значения
Examples
prop.enum(['cat', 'dog'])
Returns Property
match
Регистрирует валидатор, который проверяет, соответствует ли значение заданному regexp
.
Parameters
regexp
RegExp регулярное выражение для соответствия
Examples
prop.match(/some\sregular\sexpression/)
Returns Property
each
Регистрирует валидатор, который проверяет каждое значение в массиве на соответствие заданным «правилам».
Parameters
Examples
prop.each({ type: String })
prop.each([{ type: Number }])
prop.each({ things: [{ type: String }]})
prop.each(schema)
Returns Property
elements
Регистрирует пути для элементов массива в родительской схеме с заданным массивом правил.
Parameters
arr
Array массив правил для использования
Examples
prop.elements([{ type: String }, { type: Number }])
Returns Property
properties
Регистрирует все свойства данного объекта как вложенные свойства
Parameters
props
Object свойства с правилами
Examples
prop.properties({
name: String,
email: String
})
Returns Property
path
Прокси-метод для пути к схеме. Упрощает сцепление свойств.
Parameters
args
...any
Examples
schema
.path('name').type(String).required()
.path('email').type(String).required()
typecast
Приводит значение к заданому типу
Parameters
value
Mixed значение
Examples
prop.type(String)
prop.typecast(123) // => '123'
Returns Mixed
validate
Проверка заданного "значения"
Parameters
value
Mixed значение для проверкиctx
Object объект, содержащий значениеpath
String? путь к проверяемому значению (optional, defaultthis.name
)
Examples
prop.type(Number)
assert(prop.validate(2) == null)
assert(prop.validate('hello world') instanceof Error)
Returns ValidationError
Schema
Схема определяет структуру, по которой объекты должны проверяться.
Parameters
Examples
const post = new Schema({
title: {
type: String,
required: true,
length: { min: 1, max: 255 }
},
content: {
type: String,
required: true
},
published: {
type: Date,
required: true
},
keywords: [{ type: String }]
})
const author = new Schema({
name: {
type: String,
required: true
},
email: {
type: String,
required: true
},
posts: [post]
})
path
Создать или обновить путь
с помощью заданных правил.
Parameters
path
String полный путь с использованием dot-notationrules
(Object | Array | String | Schema | Property)? правила для применения
Examples
const schema = new Schema()
schema.path('name.first', { type: String })
schema.path('name.last').type(String).required()
Returns Property
validate
Проверить obj
.
Parameters
Examples
const schema = new Schema({ name: { required: true }})
const errors = schema.validate({})
assert(errors.length == 1)
assert(errors[0].message == 'name is required')
assert(errors[0].path == 'name')
Returns Array
assert
Утверждайте, что данный "объект" является валидным.
Parameters
Examples
const schema = new Schema({ name: String })
schema.assert({ name: 1 }) // Throws an error
message
Переопределить сообщения об ошибках по умолчанию.
Parameters
name
(String | Object) имя валидатора или объекта с парами имя-сообщениеmessage
(String | Function)? сообщение или генератор сообщений для использования
Examples
const hex = (val) => /^0x[0-9a-f]+$/.test(val)
schema.path('some.path').use({ hex })
schema.message('hex', path => `${path} must be hexadecimal`)
schema.message({ hex: path => `${path} must be hexadecimal` })
Returns Schema
validator
Переопределить валидаторы по умолчанию.
Parameters
name
(String | Object) имя валидатора или объекта с парами имя-функцияfn
Function? функция обратного вызова
Examples
schema.validator('required', val => val != null)
schema.validator({ required: val => val != null })
Returns Schema
typecaster
Переопределить стандартные типы типов.
Parameters
name
(String | Object) имя валидатора или объекта с парами имя-функцияfn
Function? функция обратного вызова
Examples
schema.typecaster('SomeClass', val => new SomeClass(val))
schema.typecaster({ SomeClass: val => new SomeClass(val) })
Returns Schema
Licence
MIT