JavaScript модуль для работы с проекцией данных
|
|
4 days ago | |
|---|---|---|
| .husky | 1 week ago | |
| dist | 4 days ago | |
| src | 4 days ago | |
| .c8rc | 1 week ago | |
| .commitlintrc | 1 week ago | |
| .editorconfig | 1 week ago | |
| .gitignore | 1 week ago | |
| .mocharc.cjs | 1 week ago | |
| .prettierrc | 1 week ago | |
| LICENSE | 1 week ago | |
| README.md | 1 week ago | |
| build-cjs.js | 1 week ago | |
| eslint.config.js | 4 days ago | |
| jsconfig.json | 4 days ago | |
| package.json | 4 days ago |
JavaScript модуль для работы с проекцией данных.
Модуль использует декларативные схемы для определения правил видимости полей данных. Поддерживается вложенность, именованные схемы, области проекции и строгий режим.
npm install @e22m4u/js-data-projector
Модуль экспортирует функцию projectData и класс
DataProjector. Оба инструмента реализуют одинаковый
функционал создания проекций, за исключением возможности регистрации
именованных схем, которая доступна только экземпляру класса.
projectDataФункция создает проекцию данных на основе переданного объекта схемы. Принимает исходные данные и дополнительные опции для управления режимом строгости и областью видимости.
Сигнатура:
projectData(schemaOrName, data, [options]) - возвращает
проекцию;
schemaOrName: string | object - схема проекции или
имя;data: object | object[] - проектируемые данные;options?: object - объект настроек;
strict?: boolean - строгий режим;scope?: string - область проекции;resolver?: Function - функция для разрешения
имени;Схема проекции описывает настройки видимости для каждого поля. Логические значения определяют видимость поля. Поля, отсутствующие в схеме, остаются в результате по умолчанию.
import {projectData} from '@e22m4u/js-data-projector';
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
// }
Если входные данные представляют собой массив, то проекция применяется к каждому элементу рекурсивно. Структура результата соответствует исходному массиву.
import {projectData} from '@e22m4u/js-data-projector';
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}
// ]
Строгий режим исключает из результата все поля, не описанные в схеме
явно. Поведение регулируется опцией strict. Данный режим
позволяет гарантировать отсутствие лишних данных в результате.
import {projectData} from '@e22m4u/js-data-projector';
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'
// }
Вложенные объекты обрабатываются с помощью свойства
schema в настройках поля. Данное свойство позволяет
определять правила видимости для вложенных структур данных.
import {projectData} from '@e22m4u/js-data-projector';
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',
// }
// }
Правила видимости полей могут зависеть от области проекции. Свойство
scopes определяет специфичные правила для разных
контекстов, передаваемых через опцию scope.
import {projectData} from '@e22m4u/js-data-projector';
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'
// }
DataProjectorКласс управляет реестром схем и предоставляет методы для их регистрации и использования. Экземпляр хранит именованные схемы в памяти, что позволяет ссылаться на них по строковому идентификатору при создании проекций.
Метод defineSchema:
defineSchema(name, schema) - возвращает
this;
name: string - имя схемы;schema: object - схема проекции;Метод project:
project(schemaOrName, data, [options]) - возвращает
проекцию;
schemaOrName: string | object - схема проекции или
имя;data: object | object[] - проектируемые данные;options?: object - объект настроек;
strict?: boolean - строгий режим;scope?: string - область проекции;Класс позволяет регистрировать схемы под уникальными именами. Метод
defineSchema сохраняет схему в реестре, а метод
project использует имя для применения правил.
import {DataProjector} from '@e22m4u/js-data-projector';
const projector = new DataProjector();
// регистрация именованной схемы
projector.defineSchema('user', {
id: true,
name: true,
password: false,
});
const data = {
id: 10,
name: 'Fedor',
password: 'pass123',
};
const result = projector.project('user', data);
console.log(result);
// {
// id: 10,
// name: 'Fedor'
// }
Именованные схемы могут быть использованы внутри других схем. Что позволяет комбинировать зарегистрированные схемы для комплексных структур данных.
import {DataProjector} from '@e22m4u/js-data-projector';
const projector = new DataProjector();
// регистрация схемы адреса
projector.defineSchema('address', {
city: true,
zip: false,
});
// регистрация схемы пользователя
projector.defineSchema('user', {
name: true,
location: {
schema: 'address', // ссылка на именованную схему
},
});
const data = {
name: 'John',
location: {
city: 'Moscow',
zip: '101000',
},
};
const result = projector.project('user', data);
console.log(result);
// {
// name: 'John',
// location: {
// city: 'Moscow'
// }
// }
npm run test
MIT