JavaScript модуль для работы с проекцией данных

e22m4u 22b5a33b5f chore: initial commit 1 week ago
.husky 22b5a33b5f chore: initial commit 1 week ago
dist 22b5a33b5f chore: initial commit 1 week ago
src 22b5a33b5f chore: initial commit 1 week ago
.c8rc 22b5a33b5f chore: initial commit 1 week ago
.commitlintrc 22b5a33b5f chore: initial commit 1 week ago
.editorconfig 22b5a33b5f chore: initial commit 1 week ago
.gitignore 22b5a33b5f chore: initial commit 1 week ago
.mocharc.cjs 22b5a33b5f chore: initial commit 1 week ago
.prettierrc 22b5a33b5f chore: initial commit 1 week ago
LICENSE 22b5a33b5f chore: initial commit 1 week ago
README.md 22b5a33b5f chore: initial commit 1 week ago
build-cjs.js 22b5a33b5f chore: initial commit 1 week ago
eslint.config.js 22b5a33b5f chore: initial commit 1 week ago
package.json 22b5a33b5f chore: initial commit 1 week ago
tsconfig.json 22b5a33b5f chore: initial commit 1 week ago

README.md

@e22m4u/js-data-projector

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();

const schema = {
  name: true,
  password: false,
}

const data = {
  name: 'Fedor',
  password: 'pass123', // будет скрыто
  extra: 10
}

const result = projector.project(schema, data);
console.log(result);
// {
//   name: 'Fedor',
//   extra: 10
// }

Создание проекции с помощью именной схемы.

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