|
|
@@ -2,22 +2,11 @@
|
|
|
|
|
|
JavaScript модуль для работы с проекцией данных.
|
|
|
|
|
|
-Модуль использует схемы для определения правил видимости полей данных.
|
|
|
-Поддерживается вложенность, функции-фабрики, именованные схемы, области
|
|
|
-проекции и строгий режим.
|
|
|
-
|
|
|
## Содержание
|
|
|
|
|
|
- [Установка](#установка)
|
|
|
- [Схема проекции](#схема-проекции)
|
|
|
- [Использование](#использование)
|
|
|
- - [Создание проекции](#создание-проекции)
|
|
|
- - [Проекция массива](#проекция-массива)
|
|
|
- - [Строгий режим](#строгий-режим)
|
|
|
- - [Вложенные схемы](#вложенные-схемы)
|
|
|
- - [Область проекции](#область-проекции)
|
|
|
- - [Фабричные функции](#фабричные-функции)
|
|
|
- - [Именованные схемы](#именованные-схемы)
|
|
|
- [Тесты](#тесты)
|
|
|
- [Лицензия](#лицензия)
|
|
|
|
|
|
@@ -69,15 +58,7 @@ const {projectData} = require('@e22m4u/js-data-projection');
|
|
|
|
|
|
## Использование
|
|
|
|
|
|
-Модуль экспортирует функцию `projectData` для создания проекций
|
|
|
-и класс `DataProjector` с возможностью регистрации и применения
|
|
|
-именованных схем.
|
|
|
-
|
|
|
-#### Создание проекции
|
|
|
-
|
|
|
-Схема проекции описывает настройки видимости для каждого поля. Логические
|
|
|
-значения определяют видимость поля. Поля, отсутствующие в схеме, остаются
|
|
|
-в результате по умолчанию.
|
|
|
+Создание проекции данных с помощью схемы.
|
|
|
|
|
|
```js
|
|
|
import {projectData} from '@e22m4u/js-data-projection';
|
|
|
@@ -101,11 +82,7 @@ console.log(result);
|
|
|
// }
|
|
|
```
|
|
|
|
|
|
-#### Проекция массива
|
|
|
-
|
|
|
-Если входные данные представляют собой массив, то проекция применяется к
|
|
|
-каждому элементу рекурсивно. Структура результата соответствует исходному
|
|
|
-массиву.
|
|
|
+Применение схемы к массиву объектов.
|
|
|
|
|
|
```js
|
|
|
import {projectData} from '@e22m4u/js-data-projection';
|
|
|
@@ -128,11 +105,7 @@ console.log(result);
|
|
|
// ]
|
|
|
```
|
|
|
|
|
|
-#### Строгий режим
|
|
|
-
|
|
|
-Строгий режим исключает из результата все поля, не описанные в схеме явно.
|
|
|
-Поведение регулируется опцией `strict`. Данный режим позволяет гарантировать
|
|
|
-отсутствие лишних данных в результате.
|
|
|
+Исключение неизвестных полей в строгом режиме.
|
|
|
|
|
|
```js
|
|
|
import {projectData} from '@e22m4u/js-data-projection';
|
|
|
@@ -157,11 +130,7 @@ console.log(result);
|
|
|
// }
|
|
|
```
|
|
|
|
|
|
-#### Вложенные схемы
|
|
|
-
|
|
|
-Вложенные объекты обрабатываются с помощью свойства `schema` в настройках
|
|
|
-поля. Данное свойство позволяет определять правила видимости для вложенных
|
|
|
-структур данных.
|
|
|
+Применение вложенных схем для сложных структур.
|
|
|
|
|
|
```js
|
|
|
import {projectData} from '@e22m4u/js-data-projection';
|
|
|
@@ -179,10 +148,10 @@ const schema = {
|
|
|
};
|
|
|
|
|
|
const data = {
|
|
|
- id: 10, // будет скрыто, явное правило
|
|
|
+ id: 10, // будет скрыто, явное правило
|
|
|
name: 'Fedor',
|
|
|
city: {
|
|
|
- id: 20, // будет скрыто, явное правило
|
|
|
+ id: 20, // будет скрыто, явное правило
|
|
|
name: 'Moscow',
|
|
|
},
|
|
|
};
|
|
|
@@ -197,11 +166,7 @@ console.log(result);
|
|
|
// }
|
|
|
```
|
|
|
|
|
|
-#### Область проекции
|
|
|
-
|
|
|
-Правила видимости полей могут зависеть от области проекции. Свойство `scopes`
|
|
|
-определяет специфичные правила для разных контекстов, передаваемых через
|
|
|
-опцию `scope`.
|
|
|
+Определение правил видимости для областей проекции.
|
|
|
|
|
|
```js
|
|
|
import {projectData} from '@e22m4u/js-data-projection';
|
|
|
@@ -239,28 +204,7 @@ console.log(outputData);
|
|
|
// }
|
|
|
```
|
|
|
|
|
|
-Модуль экспортирует объект констант с именами часто используемых областей
|
|
|
-проекции.
|
|
|
-
|
|
|
-```js
|
|
|
-import {ProjectionScope} from '@e22m4u/js-data-projection';
|
|
|
-
|
|
|
-console.log(ProjectionScope);
|
|
|
-// {
|
|
|
-// INPUT: 'input',
|
|
|
-// OUTPUT: 'output'
|
|
|
-// }
|
|
|
-
|
|
|
-projectData(schema, data, {
|
|
|
- scope: ProjectionScope.INPUT,
|
|
|
-});
|
|
|
-```
|
|
|
-
|
|
|
-#### Фабричные функции
|
|
|
-
|
|
|
-Вместо статической схемы можно передать фабричную функцию, которая вернет
|
|
|
-объект схемы. Это полезно, если схему необходимо генерировать динамически
|
|
|
-или переиспользовать логику создания схем.
|
|
|
+Использование фабричной функции вместо объекта схемы.
|
|
|
|
|
|
```js
|
|
|
import {projectData} from '@e22m4u/js-data-projection';
|
|
|
@@ -286,8 +230,7 @@ console.log(result);
|
|
|
// }
|
|
|
```
|
|
|
|
|
|
-Фабрики также поддерживаются во вложенных структурах. Свойство `schema` может
|
|
|
-принимать функцию, возвращающую схему для вложенного объекта.
|
|
|
+Использование фабрики во вложенной схеме.
|
|
|
|
|
|
```js
|
|
|
import {projectData} from '@e22m4u/js-data-projection';
|
|
|
@@ -323,11 +266,7 @@ console.log(result);
|
|
|
// }
|
|
|
```
|
|
|
|
|
|
-#### Именованные схемы
|
|
|
-
|
|
|
-Класс `DataProjector` позволяет сохранять схемы во внутреннем реестре
|
|
|
-для их последующего использования по имени. Это удобно для переиспользования
|
|
|
-схем в разных частях приложения.
|
|
|
+Регистрация именованной схемы и создание проекции.
|
|
|
|
|
|
```js
|
|
|
import {DataProjector} from '@e22m4u/js-data-projection';
|
|
|
@@ -359,9 +298,7 @@ console.log(result);
|
|
|
// }
|
|
|
```
|
|
|
|
|
|
-Зарегистрированные схемы могут ссылаться друг на друга, что позволяет
|
|
|
-компоновать сложные схемы из более простых. В примере ниже схема `user`
|
|
|
-использует схему `address` как вложенную.
|
|
|
+Использование вложенных именованных схем.
|
|
|
|
|
|
```js
|
|
|
import {DataProjector} from '@e22m4u/js-data-projection';
|
|
|
@@ -407,19 +344,17 @@ console.log(result);
|
|
|
// }
|
|
|
```
|
|
|
|
|
|
-Для ручного разрешения имен используется опция `resolver` функции `projectData`.
|
|
|
-В опцию передается функция, которая принимает имя схемы и должна вернуть
|
|
|
-соответствующий ей объект схемы.
|
|
|
+Реализация пользовательской функции разрешения имен.
|
|
|
|
|
|
```js
|
|
|
import {projectData} from '@e22m4u/js-data-projection';
|
|
|
|
|
|
// функция для разрешения имен
|
|
|
-const resolver = key => {
|
|
|
- if (key === 'user') {
|
|
|
+const resolver = name => {
|
|
|
+ if (name === 'user') {
|
|
|
return {id: true, name: true, password: false};
|
|
|
}
|
|
|
- throw new Error(`Schema "${key}" is not found!`);
|
|
|
+ throw new Error(`Schema "${name}" is not found!`);
|
|
|
};
|
|
|
|
|
|
const data = {
|