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
schemaSchema схема для монтирования
Examples
const user = new Schema({ email: String })
prop.schema(user)Returns Property
use
Проверка с использованием именованных функций из данного объекта.
Сообщения об ошибках можно определить, предоставив объекту
именованные сообщения об ошибках / генераторы для schema.message()
Генератор сообщений получает проверяемое значение, объект, к которому он принадлежит, и любые дополнительные аргументы.
Parameters
fnsObject объект с именованными функциями проверки для вызова
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
boolBoolean?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
enumsrulesArray допустимые значения
Examples
prop.enum(['cat', 'dog'])Returns Property
match
Регистрирует валидатор, который проверяет, соответствует ли значение заданному regexp.
Parameters
regexpRegExp регулярное выражение для соответствия
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
arrArray массив правил для использования
Examples
prop.elements([{ type: String }, { type: Number }])Returns Property
properties
Регистрирует все свойства данного объекта как вложенные свойства
Parameters
propsObject свойства с правилами
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
valueMixed значение
Examples
prop.type(String)
prop.typecast(123) // => '123'Returns Mixed
validate
Проверка заданного "значения"
Parameters
valueMixed значение для проверкиctxObject объект, содержащий значениеpathString? путь к проверяемому значению (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
pathString полный путь с использованием 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 errormessage
Переопределить сообщения об ошибках по умолчанию.
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) имя валидатора или объекта с парами имя-функцияfnFunction? функция обратного вызова
Examples
schema.validator('required', val => val != null)schema.validator({ required: val => val != null })Returns Schema
typecaster
Переопределить стандартные типы типов.
Parameters
name(String | Object) имя валидатора или объекта с парами имя-функцияfnFunction? функция обратного вызова
Examples
schema.typecaster('SomeClass', val => new SomeClass(val))schema.typecaster({ SomeClass: val => new SomeClass(val) })Returns Schema
Licence
MIT