|
|
@@ -35,61 +35,37 @@ const {DataValidator} = require('@e22m4u/js-data-schema');
|
|
|
|
|
|
### Схема данных
|
|
|
|
|
|
-Пример схемы.
|
|
|
+Схема данных позволяет указать допустимый тип значения, схему элементов
|
|
|
+массива и схему свойств объекта. Схему можно использовать для проверки
|
|
|
+входящих данных или для их преобразования к формату схемы.
|
|
|
|
|
|
-```js
|
|
|
-{
|
|
|
- type: DataType.ARRAY,
|
|
|
- items: {
|
|
|
- type: DataType.OBJECT,
|
|
|
- properties: {
|
|
|
- name: {
|
|
|
- type: DataType.STRING,
|
|
|
- required: true
|
|
|
- },
|
|
|
- age: {
|
|
|
- type: DataType.NUMBER
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-// [
|
|
|
-// {
|
|
|
-// name: 'John',
|
|
|
-// age: 27,
|
|
|
-// },
|
|
|
-// {
|
|
|
-// name: 'Frank'
|
|
|
-// }
|
|
|
-// ]
|
|
|
-```
|
|
|
-
|
|
|
-Свойства схемы (далее параметры):
|
|
|
+Свойства схемы:
|
|
|
|
|
|
-- `type` тип значения;
|
|
|
-- `items` схема элементов массива;
|
|
|
-- `properties` схема свойств объекта;
|
|
|
-- `required` исключение [пустых значений](#пустые-значения);
|
|
|
+- `type` тип данных (допускает [пустые значения](#пустые-значения));
|
|
|
+- `items` схема элементов массива, фабрика или имя схемы;
|
|
|
+- `properties` схема свойств объекта, фабрика или имя схемы;
|
|
|
+- `required` исключает *пустые значения*;
|
|
|
|
|
|
#### type
|
|
|
|
|
|
-Параметр `type` определяет тип допустимых значений. При определении схемы можно
|
|
|
-использовать константу или название типа в виде строки.
|
|
|
+Параметр `type` определяет тип данных. При определении схемы можно использовать
|
|
|
+константу или название типа в виде строки. Константы проверяются редакторами
|
|
|
+кода, что позволяет избежать опечаток при вводе типа.
|
|
|
|
|
|
| константа | значение |
|
|
|
|--------------------|-------------|
|
|
|
-| `DataType.ANY` | `'any'` |
|
|
|
-| `DataType.STRING` | `'string'` |
|
|
|
-| `DataType.NUMBER` | `'number'` |
|
|
|
-| `DataType.BOOLEAN` | `'boolean'` |
|
|
|
-| `DataType.ARRAY` | `'array'` |
|
|
|
-| `DataType.OBJECT` | `'object'` |
|
|
|
-
|
|
|
+| `DataType.ANY` | `"any"` |
|
|
|
+| `DataType.STRING` | `"string"` |
|
|
|
+| `DataType.NUMBER` | `"number"` |
|
|
|
+| `DataType.BOOLEAN` | `"boolean"` |
|
|
|
+| `DataType.ARRAY` | `"array"` |
|
|
|
+| `DataType.OBJECT` | `"object"` |
|
|
|
|
|
|
#### items
|
|
|
|
|
|
Параметр `items` позволяет указать схему для элементов массива. Параметр можно
|
|
|
-использовать, только если явно указан тип `array`.
|
|
|
+использовать только если явно указан тип `array`. В примере ниже схема массива
|
|
|
+включает описание его элементов, которые должны соответствовать числовому типу.
|
|
|
|
|
|
```js
|
|
|
{
|
|
|
@@ -98,13 +74,29 @@ const {DataValidator} = require('@e22m4u/js-data-schema');
|
|
|
type: DataType.NUMBER
|
|
|
}
|
|
|
}
|
|
|
-// [1, 2, 3]
|
|
|
+// [-1, 0, 1, undefined, null]
|
|
|
+```
|
|
|
+
|
|
|
+Так как типы допускают [пустые значения](#пустые-значения), рекомендуется
|
|
|
+использовать параметр `required` в определении схемы элемента, чтобы исключить
|
|
|
+их из возможных значений массива.
|
|
|
+
|
|
|
+```js
|
|
|
+{
|
|
|
+ type: DataType.ARRAY,
|
|
|
+ items: {
|
|
|
+ type: DataType.NUMBER,
|
|
|
+ required: true // исключает undefined, null и 0
|
|
|
+ }
|
|
|
+}
|
|
|
+// [-1, 1]
|
|
|
```
|
|
|
|
|
|
#### properties
|
|
|
|
|
|
Параметр `properties` позволяет указать схему каждого свойства объекта.
|
|
|
-Параметр можно использовать, только если явно указан тип `object`.
|
|
|
+Параметр можно использовать, только если явно указан тип `object`. В примере
|
|
|
+ниже используется схема объекта с двумя свойствами.
|
|
|
|
|
|
```js
|
|
|
{
|
|
|
@@ -119,151 +111,49 @@ const {DataValidator} = require('@e22m4u/js-data-schema');
|
|
|
}
|
|
|
}
|
|
|
// {
|
|
|
-// name: "John",
|
|
|
-// age: 32
|
|
|
+// "name": "John",
|
|
|
+// "age": 27
|
|
|
// }
|
|
|
```
|
|
|
|
|
|
-#### required
|
|
|
-
|
|
|
-Параметр `required` позволяет запретить [пустые значения](#пустые-значения).
|
|
|
-
|
|
|
-```js
|
|
|
-{
|
|
|
- type: DataType.STRING,
|
|
|
- required: true
|
|
|
-}
|
|
|
-// запрещает '', undefined и null
|
|
|
-```
|
|
|
-
|
|
|
-#### Примеры
|
|
|
-
|
|
|
-Определение типа значения.
|
|
|
-
|
|
|
-```js
|
|
|
-{
|
|
|
- type: DataType.STRING // только строки
|
|
|
-}
|
|
|
-
|
|
|
-// допустимо:
|
|
|
-// 'str'
|
|
|
-// ''
|
|
|
-// undefined
|
|
|
-// null
|
|
|
-```
|
|
|
-
|
|
|
-Исключение [пустых значений](#пустые-значения).
|
|
|
-
|
|
|
-```js
|
|
|
-{
|
|
|
- type: DataType.STRING, // допускает только строки
|
|
|
- required: true // исключает пустые значения
|
|
|
-}
|
|
|
-
|
|
|
-// допустимо:
|
|
|
-// 'str'
|
|
|
-
|
|
|
-// исключено:
|
|
|
-// ''
|
|
|
-// undefined
|
|
|
-// null
|
|
|
-```
|
|
|
-
|
|
|
-Определение схемы для элементов массива.
|
|
|
-
|
|
|
-```js
|
|
|
-{
|
|
|
- type: DataType.ARRAY,
|
|
|
- items: { // схема элементов
|
|
|
- type: DataType.NUMBER // только числа
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-// допустимо:
|
|
|
-// [1, 2, 3]
|
|
|
-// [undefined, null]
|
|
|
-// []
|
|
|
-// undefined
|
|
|
-// null
|
|
|
-```
|
|
|
-
|
|
|
-Исключение [пустых значений](#пустые-значения) для массива и его элементов.
|
|
|
-
|
|
|
-```js
|
|
|
-{
|
|
|
- type: DataType.ARRAY,
|
|
|
- items: { // схема элементов
|
|
|
- type: DataType.NUMBER, // допускает только числа
|
|
|
- required: true // исключает пустые значения
|
|
|
- },
|
|
|
- required: true // массив является обязательным
|
|
|
-}
|
|
|
-
|
|
|
-// допустимо:
|
|
|
-// [1, 2, 3]
|
|
|
-// []
|
|
|
-
|
|
|
-// исключено:
|
|
|
-// [undefined, null]
|
|
|
-// undefined
|
|
|
-// null
|
|
|
-```
|
|
|
-
|
|
|
-Определение схемы для свойств объекта.
|
|
|
+Значения свойств могут быть обязательными. Для этого используется
|
|
|
+параметр `required` в схеме соответствующего свойства. Если параметр
|
|
|
+указан, то [пустые значения](#пустые-значения) будут вызывать ошибку
|
|
|
+при проверке данного свойства.
|
|
|
|
|
|
```js
|
|
|
{
|
|
|
type: DataType.OBJECT,
|
|
|
- items: {
|
|
|
- foo: { // схема свойства foo
|
|
|
- type: DataType.STRING // только строки
|
|
|
+ properties: {
|
|
|
+ name: {
|
|
|
+ type: DataType.STRING,
|
|
|
+ required: true // исключает undefined, null и ""
|
|
|
},
|
|
|
- bar: { // схема свойства bar
|
|
|
- type: DataType.NUMBER // только числа
|
|
|
+ age: {
|
|
|
+ type: DataType.NUMBER,
|
|
|
+ required: true // исключает undefined, null и 0
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-// допустимо:
|
|
|
-// {foo: 'str', bar: 10}
|
|
|
-// {foo: null, bar: null}
|
|
|
-// {}
|
|
|
-// undefined
|
|
|
-// null
|
|
|
```
|
|
|
|
|
|
-Исключение [пустых значений](#пустые-значения) для объекта и его свойств.
|
|
|
+#### required
|
|
|
+
|
|
|
+Так как по умолчанию все типы допускают [пустые значения](#пустые-значения),
|
|
|
+параметр `required` используется чтобы явно запретить такие значения
|
|
|
+при проверке. Параметр можно использовать там, где указывается тип данных.
|
|
|
|
|
|
```js
|
|
|
{
|
|
|
- type: DataType.OBJECT,
|
|
|
- properties: {
|
|
|
- foo: { // схема свойства foo
|
|
|
- type: DataType.STRING, // допускает только строки
|
|
|
- required: true // исключает пустые значения
|
|
|
- },
|
|
|
- bar: { // схема свойства bar
|
|
|
- type: DataType.NUMBER // допускает только числа
|
|
|
- }
|
|
|
- },
|
|
|
- required: true // объект является обязательным
|
|
|
+ type: DataType.STRING, // допускает строки и пустые значения
|
|
|
+ required: true // исключает пустые значения
|
|
|
}
|
|
|
-
|
|
|
-// допустимо:
|
|
|
-// {foo: 'str', bar: 10}
|
|
|
-// {foo: 'str'}
|
|
|
-
|
|
|
-// исключено:
|
|
|
-// {foo: '', bar: 10}
|
|
|
-// {foo: null}
|
|
|
-// {}
|
|
|
-// undefined
|
|
|
-// null
|
|
|
+// "foo", "bar" ...
|
|
|
```
|
|
|
|
|
|
## Использование
|
|
|
|
|
|
-Ниже приводятся примеры использования данного модуля.
|
|
|
+Ниже приводятся примеры использования различных схем.
|
|
|
|
|
|
### Проверка данных
|
|
|
|
|
|
@@ -274,9 +164,8 @@ import {DataValidator, DataType} from '@e22m4u/js-data-schema';
|
|
|
|
|
|
const validator = new DataValidator();
|
|
|
|
|
|
-// определение схемы
|
|
|
const schema = {
|
|
|
- type: DataType.STRING, // только строки
|
|
|
+ type: DataType.STRING, // тип значения
|
|
|
};
|
|
|
|
|
|
// значение "str" соответствует схеме
|
|
|
@@ -299,10 +188,9 @@ import {DataValidator, DataType} from '@e22m4u/js-data-schema';
|
|
|
|
|
|
const validator = new DataValidator();
|
|
|
|
|
|
-// определение схемы
|
|
|
const schema = {
|
|
|
- type: DataType.NUMBER, // только числа
|
|
|
- required: true, // исключает пустые значения
|
|
|
+ type: DataType.NUMBER, // тип значения
|
|
|
+ required: true, // является обязательным
|
|
|
};
|
|
|
|
|
|
// значение 10 соответствует схеме
|
|
|
@@ -325,11 +213,10 @@ import {DataValidator, DataType} from '@e22m4u/js-data-schema';
|
|
|
|
|
|
const validator = new DataValidator();
|
|
|
|
|
|
-// определение схемы массива
|
|
|
const schema = {
|
|
|
- type: DataType.ARRAY,
|
|
|
+ type: DataType.ARRAY, // тип значения
|
|
|
items: {
|
|
|
- type: DataType.NUMBER,
|
|
|
+ type: DataType.NUMBER, // тип элемента
|
|
|
},
|
|
|
};
|
|
|
|
|
|
@@ -356,16 +243,15 @@ import {DataValidator, DataType} from '@e22m4u/js-data-schema';
|
|
|
|
|
|
const validator = new DataValidator();
|
|
|
|
|
|
-// определение схемы объекта
|
|
|
const schema = {
|
|
|
- type: DataType.OBJECT,
|
|
|
+ type: DataType.OBJECT, // тип значения
|
|
|
properties: {
|
|
|
foo: { // схема свойства "foo"
|
|
|
- type: DataType.STRING, // допускает только строки
|
|
|
+ type: DataType.STRING, // тип свойства
|
|
|
required: true, // является обязательным
|
|
|
},
|
|
|
bar: { // схема свойства "bar"
|
|
|
- type: DataType.NUMBER,
|
|
|
+ type: DataType.NUMBER, // тип свойства
|
|
|
},
|
|
|
},
|
|
|
};
|
|
|
@@ -392,9 +278,8 @@ import {DataParser, DataType} from '@e22m4u/js-data-schema';
|
|
|
|
|
|
const parser = new DataParser();
|
|
|
|
|
|
-// определение схемы
|
|
|
const schema = {
|
|
|
- type: DataType.NUMBER, // только числа
|
|
|
+ type: DataType.NUMBER, // тип значения
|
|
|
};
|
|
|
|
|
|
// приведение строки к числу
|
|
|
@@ -412,11 +297,10 @@ import {DataParser, DataType} from '@e22m4u/js-data-schema';
|
|
|
|
|
|
const parser = new DataParser();
|
|
|
|
|
|
-// определение схемы массива
|
|
|
const schema = {
|
|
|
- type: DataType.ARRAY,
|
|
|
- items: { // схема элементов
|
|
|
- type: DataType.NUMBER, // только числа
|
|
|
+ type: DataType.ARRAY, // тип значения
|
|
|
+ items: {
|
|
|
+ type: DataType.NUMBER, // тип элемента
|
|
|
},
|
|
|
};
|
|
|
|
|
|
@@ -436,16 +320,15 @@ import {DataParser, DataType} from '@e22m4u/js-data-schema';
|
|
|
|
|
|
const parser = new DataParser();
|
|
|
|
|
|
-// определение схемы объекта
|
|
|
const schema = {
|
|
|
- type: DataType.OBJECT,
|
|
|
+ type: DataType.OBJECT, // тип значения
|
|
|
properties: {
|
|
|
foo: { // схема свойства "foo"
|
|
|
- type: DataType.STRING, // допускает только строки
|
|
|
+ type: DataType.STRING, // тип свойства
|
|
|
required: true, // является обязательным
|
|
|
},
|
|
|
bar: { // схема свойства "bar"
|
|
|
- type: DataType.NUMBER,
|
|
|
+ type: DataType.NUMBER, // тип свойства
|
|
|
},
|
|
|
},
|
|
|
};
|
|
|
@@ -474,14 +357,14 @@ parser.parse('{"foo": 10}', schema); // error: DataParsingError
|
|
|
для определения наличия полезной нагрузки в значении свойства. Например,
|
|
|
параметр `required` исключает пустые значения при проверке данных.
|
|
|
|
|
|
-| тип | пустые значения |
|
|
|
-|-------------|---------------------------|
|
|
|
-| `'any'` | `undefined`, `null`, `''` |
|
|
|
-| `'string'` | `undefined`, `null`, `''` |
|
|
|
-| `'number'` | `undefined`, `null` |
|
|
|
-| `'boolean'` | `undefined`, `null` |
|
|
|
-| `'array'` | `undefined`, `null` |
|
|
|
-| `'object'` | `undefined`, `null` |
|
|
|
+| тип данных | пустые значения |
|
|
|
+|--------------------|----------------------------|
|
|
|
+| `DataType.ANY` | *значения остальных типов* |
|
|
|
+| `DataType.STRING` | `undefined`, `null`, `""` |
|
|
|
+| `DataType.NUMBER` | `undefined`, `null`, `0` |
|
|
|
+| `DataType.BOOLEAN` | `undefined`, `null` |
|
|
|
+| `DataType.ARRAY` | `undefined`, `null`, `[]` |
|
|
|
+| `DataType.OBJECT` | `undefined`, `null`, `{}` |
|
|
|
|
|
|
Управление этими наборами осуществляется через специальный сервис, который предоставляет модуль
|
|
|
[@e22m4u/js-empty-values](https://www.npmjs.com/package/@e22m4u/js-empty-values)
|