e22m4u 4 дней назад
Родитель
Сommit
8e8eea0fea
1 измененных файлов с 212 добавлено и 2 удалено
  1. 212 2
      README.md

+ 212 - 2
README.md

@@ -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