1.1.4 • Published 4 years ago

vqp v1.1.4

Weekly downloads
2
License
MIT
Repository
github
Last release
4 years ago

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.path(). Свойства также создаются внутри, когда объект передается конструктору схемы.

Parameters

  • name String название свойства
  • schema Schema вложеная схема

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, default true)
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
  • rules (Object | Number) ОбЪект с .min и .max свойствами или Number
    • rules.min Number минимальная длина
    • rules.max Number максимальная длина
Examples
prop.length({ min: 8, max: 255 })
prop.length(10)

Returns Property

size

Регистрирует валидатор, который проверяет размер.

Parameters
  • rules (Object | Number) ОбЪект с .min и .max свойствами или Number
    • rules.min Number минимальный размер
    • rules.max Number максимальный размер
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, default this.name)
Examples
prop.type(Number)
assert(prop.validate(2) == null)
assert(prop.validate('hello world') instanceof Error)

Returns ValidationError

Schema

Схема определяет структуру, по которой объекты должны проверяться.

Parameters

  • obj Object? определение схемы (optional, default {})
  • opts Object? опции (optional, default {})
    • opts.typecast Boolean Типовые значения перед проверкой (optional, default false)
    • opts.strip Boolean свойства не определены в схеме (optional, default true)
    • opts.strict Boolean проверка завершается неудачно, когда объект содержит свойства, не определенные в схеме (optional, default false)

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
Examples
const schema = new Schema()
schema.path('name.first', { type: String })
schema.path('name.last').type(String).required()

Returns Property

validate

Проверить obj.

Parameters
  • obj Object объект для проверки
  • opts Object? варианты см. Schema (optional, default {})
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

1.1.1

4 years ago

1.1.0

4 years ago

1.1.4

4 years ago

1.1.3

4 years ago

1.1.2

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago