## @e22m4u/js-data-schema JavaScript модуль для работы со схемой данных. ## Содержание - [Установка](#установка) - [Схема данных](#схема-данных) - [Использование](#использование) - [Проверка данных](#проверка-данных) - [Парсинг данных](#парсинг-данных) - [Пустые значения](#пустые-значения) - [Тесты](#тесты) - [Лицензия](#лицензия) ## Установка ```bash npm install @e22m4u/js-data-schema ``` Модуль поддерживает ESM и CommonJS стандарты. *ESM* ```js import {DataValidator} from '@e22m4u/js-data-schema'; ``` *CommonJS* ```js const {DataValidator} = require('@e22m4u/js-data-schema'); ``` ### Схема данных Структура: ```ts { type?: DataType; items?: DataSchemaObject | DataSchemaFactory | string; properties?: DataSchemaProperties | DataSchemaFactory | string; required?: boolean; } ``` #### type Параметр `type` определяет тип допустимых значений. | константа | значение | |--------------------|-------------| | `DataType.ANY` | `"any"` | | `DataType.STRING` | `"string"` | | `DataType.NUMBER` | `"number"` | | `DataType.BOOLEAN` | `"boolean"` | | `DataType.ARRAY` | `"array"` | | `DataType.OBJECT` | `"object"` | #### items Параметр `items` позволяет указать схему для элементов массива. Параметр можно использовать, только если явно указан тип `array` текущей схемы. ```js { type: DataType.ARRAY, items: { type: DataType.NUMBER } } // [1, 2, 3] ``` #### properties Параметр `properties` позволяет указать схему каждого свойства объекта. Параметр можно использовать, только если явно указан тип `object` текущей схемы. ```js { type: DataType.OBJECT, properties: { name: { type: DataType.STRING }, age: { type: DataType.NUMBER } } } // { // name: "John", // age: 32 // } ``` #### required Параметр `required` позволяет запретить [пустые значения](#пустые-значения). ```js { type: DataType.STRING, required: true } // запрещает '', undefined и null // см. раздел «Пустые значения» ``` ## Использование Ниже приводятся примеры использования данного модуля. ### Проверка данных Проверка примитивных значений. ```js import {DataValidator, DataType} from '@e22m4u/js-data-schema'; const schema = { type: DataType.STRING }; const validator = new DataValidator(); validator.validate('str', schema); // OK validator.validate(undefined, schema); // OK (пустое значение) validator.validate(10, schema); // error: DataValidationError validator.validate(true, schema); // error: DataValidationError ``` Проверка обязательного значения. ```js import {DataValidator, DataType} from '@e22m4u/js-data-schema'; const schema = { type: DataType.NUMBER, required: true, // <= исключает 0, undefined и null (для типа number) }; const validator = new DataValidator(); validator.validate(10, schema); // OK validator.validate('str', schema); // error: DataValidationError validator.validate(0, schema); // error: DataValidationError validator.validate(true, schema); // error: DataValidationError ``` Проверка элементов массива. ```js import {DataValidator, DataType} from '@e22m4u/js-data-schema'; const schema = { type: DataType.ARRAY, items: { type: DataType.NUMBER, }, }; const validator = new DataValidator(); validator.validate([1, 2, 3], schema); // OK validator.validate([], schema); // OK validator.validate('str', schema); // error: DataValidationError validator.validate(['a', 'b'], schema); // error: DataValidationError validator.validate({foo: 'bar'}, schema); // error: DataValidationError ``` Проверка свойств объекта. ```js import {DataValidator, DataType} from '@e22m4u/js-data-schema'; const schema = { type: DataType.OBJECT, properties: { foo: { type: DataType.STRING, }, bar: { type: DataType.NUMBER, }, }, }; const validator = new DataValidator(); validator.validate({foo: 'str', bar: 10}, schema); // OK validator.validate({}, schema); // OK validator.validate({foo: true}, schema); // error: DataValidationError validator.validate([1, 2, 3], schema); // error: DataValidationError ``` ### Парсинг данных Приведение строки к числу. ```js import {DataParser, DataType} from '@e22m4u/js-data-schema'; const parser = new DataParser(); const schema = { type: DataType.NUMBER }; const result = parser.parse('10', schema); console.log(result); // 10 // строка не является числом parser.parse('10abc', schema); // error: DataParsingError ``` Разбор JSON строки согласно схеме массива. ```js import {DataParser, DataType} from '@e22m4u/js-data-schema'; const parser = new DataParser(); const schema = { type: DataType.ARRAY, items: { type: DataType.NUMBER, // тип элементов }, }; const result = parser.parse('[1, 2, 3]', schema); console.log(result); // [1, 2, 3] // элементы массива не соответствуют схеме parser.parse('["str", true]', schema); // error: DataParsingError ``` Разбор JSON строки согласно схеме объекта. ```js import {DataParser, DataType} from '@e22m4u/js-data-schema'; const parser = new DataParser(); const schema = { type: DataType.OBJECT, properties: { foo: { type: DataType.STRING, }, bar: { type: DataType.NUMBER, }, }, }; const result = parser.parse( '{"foo": "str", "bar": 10}', schema, ); console.log(result); // { // "foo": "str", // "bar": 10 // } // значения полей не соответствуют схеме parser.parse('{"foo": true, "bar": "str"}', schema); // error: DataParsingError ``` ## Пустые значения Разные типы данных имеют свои наборы пустых значений. Эти наборы используются для определения наличия полезной нагрузки в значении свойства. Например, параметр `required` исключает пустые значения при проверке данных. | тип | пустые значения | |-------------|---------------------------| | `'any'` | `undefined`, `null` | | `'string'` | `undefined`, `null`, `''` | | `'number'` | `undefined`, `null`, `0` | | `'boolean'` | `undefined`, `null` | | `'array'` | `undefined`, `null`, `[]` | | `'object'` | `undefined`, `null`, `{}` | Управление этими наборами осуществляется через специальный сервис, который предоставляет модуль [@e22m4u/js-empty-values](https://www.npmjs.com/package/@e22m4u/js-empty-values) (не требует установки). ## Тесты ```bash npm run test ``` ## Лицензия MIT