JavaScript модуль для работы с проекцией данных.
Модуль использует декларативные схемы для определения правил видимости полей данных. Поддерживается вложенность, именные схемы, области проекции и строгий режим.
npm install @e22m4u/js-data-projector
Модуль экспортирует функцию projectData и класс
DataProjector. Оба инструмента реализуют одинаковый
функционал создания проекций, за исключением возможности регистрации
именных схем, которая доступна только экземпляру класса.
projectDataСоздание проекции с помощью схемы.
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}
// ]
Создание проекции в строгом режиме.
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'
// }
Создание проекции с помощью вложенной схемы.
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',
// }
// }
Создание проекции для указанной области.
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Создание проекции с помощью именной схемы.
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