## @e22m4u/js-data-projection
JavaScript модуль для работы с проекцией данных.
## Содержание
- [Установка](#установка)
- [Схема проекции](#схема-проекции)
- [Определение правил видимости полей](#определение-правил-видимости-полей)
- [Определение вложенной схемы](#определение-вложенной-схемы)
- [Определение правил для областей проекции](#определение-правил-для-областей-проекции)
- [Использование](#использование)
- [Создание проекции данных с помощью схемы](#создание-проекции-данных-с-помощью-схемы)
- [Применение схемы к массиву объектов](#применение-схемы-к-массиву-объектов)
- [Исключение неизвестных полей в строгом режиме](#исключение-неизвестных-полей-в-строгом-режиме)
- [Применение вложенных схем для сложных структур](#применение-вложенных-схем-для-сложных-структур)
- [Создание проекции для определенной области видимости](#создание-проекции-для-определенной-области-видимости)
- [Использование фабричной функции вместо объекта схемы](#использование-фабричной-функции-вместо-объекта-схемы)
- [Использование фабрики во вложенной схеме](#использование-фабрики-во-вложенной-схеме)
- [Регистрация именованной схемы и создание проекции](#регистрация-именованной-схемы-и-создание-проекции)
- [Использование вложенных именованных схем](#использование-вложенных-именованных-схем)
- [Реализация пользовательской функции разрешения имен](#реализация-пользовательской-функции-разрешения-имен)
- [Тесты](#тесты)
- [Лицензия](#лицензия)
## Установка
```bash
npm install @e22m4u/js-data-projection
```
Модуль поддерживает ESM и CommonJS стандарты.
*ESM*
```js
import {projectData} from '@e22m4u/js-data-projection';
```
*CommonJS*
```js
const {projectData} = require('@e22m4u/js-data-projection');
```
## Схема проекции
Определение правил видимости полей.
```js
{
foo: true, // поле доступно
bar: false // поле скрыто
}
```
Определение вложенной схемы.
```js
{
name: true, // поле name доступно
address: { // настройки поля address
select: true, // поле address доступно
schema: { // вложенная схема
city: true, // поле city доступно
zip: false // поле zip скрыто
}
}
}
```
Определение правил для областей проекции.
```js
{
password: { // настройки поля password
select: false, // поле password недоступно по умолчанию
scopes: { // настройки для областей проекции
input: true, // поле доступно для области 'input'
output: false // но скрыто для области 'output'
}
}
}
```
## Использование
Создание проекции данных с помощью схемы.
```js
import {projectData} from '@e22m4u/js-data-projection';
const schema = {
name: true,
password: false,
};
const data = {
name: 'Fedor', // будет доступно, явное правило
password: 'pass123', // будет исключено, явное правило
extra: 10, // будет доступно в режиме по умолчанию
};
const result = projectData(schema, data);
console.log(result);
// {
// name: 'Fedor',
// extra: 10
// }
```
Применение схемы к массиву объектов.
```js
import {projectData} from '@e22m4u/js-data-projection';
const schema = {
id: true,
secret: false,
};
const data = [
{id: 1, secret: 'A'},
{id: 2, secret: 'B'},
];
const result = projectData(schema, data);
console.log(result);
// [
// {id: 1},
// {id: 2}
// ]
```
Исключение неизвестных полей в строгом режиме.
```js
import {projectData} from '@e22m4u/js-data-projection';
const schema = {
name: true,
password: false,
};
const data = {
name: 'Fedor', // будет доступно, явное правило
password: 'pass123', // будет исключено, явное правило
extra: 10, // будет исключено в строгом режиме
};
const result = projectData(schema, data, {
strict: true, // <= строгий режим
});
console.log(result);
// {
// name: 'Fedor'
// }
```
Применение вложенных схем для сложных структур.
```js
import {projectData} from '@e22m4u/js-data-projection';
const schema = {
id: false,
name: true,
city: {
select: true, // правило видимости поля city
schema: { // вложенная схема
id: false,
name: true,
},
},
};
const data = {
id: 10, // будет скрыто, явное правило
name: 'Fedor',
city: {
id: 20, // будет скрыто, явное правило
name: 'Moscow',
},
};
const result = projectData(schema, data);
console.log(result);
// {
// name: 'Fedor',
// city: {
// name: 'Moscow',
// }
// }
```
Создание проекции для определенной области видимости.
```js
import {projectData} from '@e22m4u/js-data-projection';
const schema = {
name: true,
password: {
scopes: {
input: true, // правило для области 'input'
output: false, // правило для области 'output'
},
},
};
const data = {
name: 'Fedor', // будет доступно, явное правило
password: 'pass123', // будет доступно в зависимости от области
};
const inputData = projectData(schema, data, {
scope: 'input', // <= область проекции
});
console.log(inputData);
// {
// name: 'Fedor',
// password: 'pass123'
// }
const outputData = projectData(schema, data, {
scope: 'output', // <= область проекции
});
console.log(outputData);
// {
// name: 'Fedor'
// }
```
Использование фабричной функции вместо объекта схемы.
```js
import {projectData} from '@e22m4u/js-data-projection';
// фабрика возвращает объект схемы
const getSchema = () => {
return {
id: true,
hiddenField: false,
};
};
const data = {
id: 1,
hiddenField: 'secret',
};
// передача функции вместо объекта
const result = projectData(getSchema, data);
console.log(result);
// {
// id: 1
// }
```
Использование фабрики во вложенной схеме.
```js
import {projectData} from '@e22m4u/js-data-projection';
// фабрика для вложенных данных
const getAddressSchema = () => ({
city: true,
zip: false,
});
const userSchema = {
name: true,
address: {
schema: getAddressSchema, // <= использование фабрики
},
};
const data = {
name: 'Fedor',
address: {
city: 'Moscow',
zip: 123456,
},
};
const result = projectData(userSchema, data);
console.log(result);
// {
// name: 'Fedor',
// address: {
// city: 'Moscow'
// }
// }
```
Регистрация именованной схемы и создание проекции.
```js
import {DataProjector} from '@e22m4u/js-data-projection';
const projector = new DataProjector();
// регистрация схемы
projector.defineSchema({
name: 'user', // <= имя схемы
schema: {
id: true,
username: true,
email: false,
},
});
const data = {
id: 10,
username: 'admin',
email: 'admin@example.com',
};
// проекция данных по зарегистрированному имени
const result = projector.project('user', data);
console.log(result);
// {
// id: 10,
// username: 'admin'
// }
```
Использование вложенных именованных схем.
```js
import {DataProjector} from '@e22m4u/js-data-projection';
const projector = new DataProjector();
// регистрация схемы "address"
projector.defineSchema({
name: 'address',
schema: {
city: true,
zip: false,
},
});
// регистрация схемы "user"
projector.defineSchema({
name: 'user',
schema: {
name: true,
address: {
select: true, // видимость поля address
schema: 'address', // <= имя вложенной схемы
},
},
});
const data = {
name: 'Fedor',
address: {
city: 'Moscow',
zip: 123456,
},
};
const result = projector.project('user', data);
console.log(result);
// {
// name: 'Fedor',
// address: {
// city: 'Moscow'
// }
// }
```
Реализация пользовательской функции разрешения имен.
```js
import {projectData} from '@e22m4u/js-data-projection';
// функция для разрешения имен
const resolver = name => {
if (name === 'user') {
return {id: true, name: true, password: false};
}
throw new Error(`Schema "${name}" is not found!`);
};
const data = {
id: 1,
name: 'Fedor',
password: 'pass123',
};
const result = projectData(
'user', // <= вместо схемы передается имя
data,
{resolver}, // <= разрешающая функция
);
console.log(result);
// {
// id: 1,
// name: 'Fedor'
// }
```
## Тесты
```bash
npm run test
```
## Лицензия
MIT