|
|
@@ -18,6 +18,9 @@ JavaScript модуль для работы с проекцией данных.
|
|
|
- [Область проекции](#область-проекции)
|
|
|
- [Фабричные функции](#фабричные-функции)
|
|
|
- [Именованные схемы](#именованные-схемы)
|
|
|
+ - [Класс `DataProjector`](#класс-dataprojector)
|
|
|
+ - [Метод `defineSchema`](#метод-defineschema)
|
|
|
+ - [Метод `project`](#метод-project)
|
|
|
- [Тесты](#тесты)
|
|
|
- [Лицензия](#лицензия)
|
|
|
|
|
|
@@ -56,8 +59,7 @@ projectData(schemaOrFactory, data, [options])
|
|
|
|
|
|
*Тип: `object` | `object[]` | `any`*
|
|
|
|
|
|
-Исходные данные для проекции. Если передан массив, проекция применяется
|
|
|
-к каждому элементу. Примитивы возвращаются без изменений.
|
|
|
+Исходные данные для проекции.
|
|
|
|
|
|
**options** (необязательно)
|
|
|
|
|
|
@@ -408,6 +410,214 @@ console.log(result);
|
|
|
// }
|
|
|
```
|
|
|
|
|
|
+
|
|
|
+### Класс `DataProjector`
|
|
|
+
|
|
|
+Для централизованного управления схемами и удобной работы в рамках
|
|
|
+сервис-ориентированной архитектуры модуль предоставляет класс `DataProjector`.
|
|
|
+Он позволяет регистрировать именованные схемы в реестре и применять их по имени
|
|
|
+без необходимости вручную передавать функцию `resolver` при каждом вызове.
|
|
|
+
|
|
|
+Создание экземпляра:
|
|
|
+
|
|
|
+```js
|
|
|
+import {DataProjector} from '@e22m4u/js-data-projection';
|
|
|
+
|
|
|
+const projector = new DataProjector();
|
|
|
+```
|
|
|
+
|
|
|
+### Метод `defineSchema`
|
|
|
+
|
|
|
+Регистрирует новую схему в реестре проектора. Метод принимает объект
|
|
|
+определения, содержащий уникальное имя схемы и правила проекции. Возвращает
|
|
|
+текущий экземпляр `DataProjector`, что позволяет использовать цепочки вызовов.
|
|
|
+
|
|
|
+**Сигнатура вызова:**
|
|
|
+
|
|
|
+```js
|
|
|
+defineSchema(schemaDef)
|
|
|
+```
|
|
|
+
|
|
|
+**schemaDef**
|
|
|
+
|
|
|
+*Тип: `{name: string, schema: object}`*
|
|
|
+
|
|
|
+Объект определения схемы, связывающий название схемы с правилами проекции.
|
|
|
+
|
|
|
+- `name: string`: название новой схемы;
|
|
|
+- `schema: object`: объект схемы проекции;
|
|
|
+
|
|
|
+**Возвращаемое значение:**
|
|
|
+
|
|
|
+Текущий экземпляр `DataProjector`.
|
|
|
+
|
|
|
+**Примеры:**
|
|
|
+
|
|
|
+Регистрация именованной схемы.
|
|
|
+
|
|
|
+```js
|
|
|
+import {DataProjector} from '@e22m4u/js-data-projection';
|
|
|
+
|
|
|
+const projector = new DataProjector();
|
|
|
+
|
|
|
+projector.defineSchema({
|
|
|
+ name: 'user',
|
|
|
+ schema: {
|
|
|
+ id: true,
|
|
|
+ name: true,
|
|
|
+ password: false,
|
|
|
+ },
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+Регистрация вложенных схем.
|
|
|
+
|
|
|
+```js
|
|
|
+import {DataProjector} from '@e22m4u/js-data-projection';
|
|
|
+
|
|
|
+const projector = new DataProjector();
|
|
|
+
|
|
|
+projector.defineSchema({
|
|
|
+ name: 'address',
|
|
|
+ schema: {
|
|
|
+ city: true,
|
|
|
+ zip: false,
|
|
|
+ },
|
|
|
+});
|
|
|
+
|
|
|
+projector.defineSchema({
|
|
|
+ name: 'user',
|
|
|
+ schema: {
|
|
|
+ name: true,
|
|
|
+ address: {
|
|
|
+ select: true, // видимость поля address
|
|
|
+ schema: 'address', // <= вложенная схема
|
|
|
+ },
|
|
|
+ },
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+### Метод `project`
|
|
|
+
|
|
|
+Выполняет проекцию данных, используя возможности внутреннего реестра схем. Метод работает аналогично функции `projectData`, но автоматически предоставляет механизм разрешения имен (resolver), связанный с добавленными ранее схемами. Это позволяет передавать в качестве первого аргумента строковое имя зарегистрированной схемы без необходимости указывать функцию `resolver` в опциях вручную.
|
|
|
+
|
|
|
+**Сигнатура вызова:**
|
|
|
+
|
|
|
+```js
|
|
|
+project(schemaOrFactory, data, [options])
|
|
|
+```
|
|
|
+
|
|
|
+**schemaOrFactory**
|
|
|
+
|
|
|
+*Тип: `object` | `Function` | `string`*
|
|
|
+
|
|
|
+Определяет правила проекции. Принимает:
|
|
|
+- `object`: объект схемы проекции;
|
|
|
+- `Function`: фабрика, возвращающая схему (или имя схемы);
|
|
|
+- `string`: зарегистрированное имя схемы;
|
|
|
+
|
|
|
+**data**
|
|
|
+
|
|
|
+*Тип: `object` | `object[]` | `any`*
|
|
|
+
|
|
|
+Исходные данные для проекции.
|
|
|
+
|
|
|
+**options** (необязательно)
|
|
|
+
|
|
|
+*Тип: `object`*
|
|
|
+
|
|
|
+Объект с дополнительными настройками:
|
|
|
+
|
|
|
+- `strict?: boolean`: включает строгий режим;
|
|
|
+- `scope?: string`: имя активной области проекции;
|
|
|
+
|
|
|
+**Возвращаемое значение:**
|
|
|
+
|
|
|
+Метод возвращает проекцию исходных данных в соответствии с переданной схемой
|
|
|
+и настройками.
|
|
|
+
|
|
|
+**Примеры:**
|
|
|
+
|
|
|
+Использование зарегистрированной схемы.
|
|
|
+
|
|
|
+```js
|
|
|
+import {DataProjector} from '@e22m4u/js-data-projection';
|
|
|
+
|
|
|
+const projector = new DataProjector();
|
|
|
+
|
|
|
+// регистрация схемы
|
|
|
+projector.defineSchema({
|
|
|
+ name: 'publicUser',
|
|
|
+ schema: {
|
|
|
+ id: true,
|
|
|
+ username: true,
|
|
|
+ email: false,
|
|
|
+ },
|
|
|
+});
|
|
|
+
|
|
|
+const data = {
|
|
|
+ id: 10,
|
|
|
+ username: 'admin',
|
|
|
+ email: 'admin@example.com',
|
|
|
+};
|
|
|
+
|
|
|
+// проекция данных по имени схемы
|
|
|
+const result = projector.project('publicUser', data);
|
|
|
+console.log(result);
|
|
|
+// {
|
|
|
+// id: 10,
|
|
|
+// username: 'admin'
|
|
|
+// }
|
|
|
+```
|
|
|
+
|
|
|
+Использование вложенных именованных схем.
|
|
|
+
|
|
|
+```js
|
|
|
+import {DataProjector} from '@e22m4u/js-data-projection';
|
|
|
+
|
|
|
+const projector = new DataProjector();
|
|
|
+
|
|
|
+// регистрация вложенной схемы
|
|
|
+projector.defineSchema({
|
|
|
+ name: 'address',
|
|
|
+ schema: {
|
|
|
+ city: true,
|
|
|
+ zip: false,
|
|
|
+ },
|
|
|
+});
|
|
|
+
|
|
|
+// регистрация основной схемы, использующей вложенную по имени
|
|
|
+projector.defineSchema({
|
|
|
+ name: 'user',
|
|
|
+ schema: {
|
|
|
+ name: true,
|
|
|
+ contact: {
|
|
|
+ select: true, // поле будет включено в результат
|
|
|
+ schema: 'address', // <= имя вложенной схемы
|
|
|
+ },
|
|
|
+ },
|
|
|
+});
|
|
|
+
|
|
|
+const data = {
|
|
|
+ name: 'Fedor',
|
|
|
+ contact: {
|
|
|
+ city: 'Moscow',
|
|
|
+ zip: 123456,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+// при создании проекции схемы 'user', вложенная
|
|
|
+// схема 'address' будет найдена автоматически
|
|
|
+const result = projector.project('user', data);
|
|
|
+console.log(result);
|
|
|
+// {
|
|
|
+// name: 'Fedor',
|
|
|
+// contact: {
|
|
|
+// city: 'Moscow'
|
|
|
+// }
|
|
|
+// }
|
|
|
+```
|
|
|
+
|
|
|
## Тесты
|
|
|
|
|
|
```bash
|