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

e22m4u c8632381eb refactor: arguments validation ordering 1 день назад
.husky 22b5a33b5f chore: initial commit 2 недель назад
dist c8632381eb refactor: arguments validation ordering 1 день назад
src c8632381eb refactor: arguments validation ordering 1 день назад
.c8rc 22b5a33b5f chore: initial commit 2 недель назад
.commitlintrc 22b5a33b5f chore: initial commit 2 недель назад
.editorconfig 22b5a33b5f chore: initial commit 2 недель назад
.gitignore 22b5a33b5f chore: initial commit 2 недель назад
.mocharc.json 6f15ecb1a5 refactor: improve linting 1 неделя назад
.prettierrc 22b5a33b5f chore: initial commit 2 недель назад
LICENSE 22b5a33b5f chore: initial commit 2 недель назад
README.md f1130ee507 docs: updates README.md 2 дней назад
build-cjs.js 22b5a33b5f chore: initial commit 2 недель назад
eslint.config.js 6f15ecb1a5 refactor: improve linting 1 неделя назад
jsconfig.json e4736e35fd chore: initial commit 2 дней назад
package.json 1e311c6624 chore: updates version to 0.0.7 2 дней назад

README.md

@e22m4u/js-data-projection

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

Содержание

Установка

npm install @e22m4u/js-data-projection

Модуль поддерживает ESM и CommonJS стандарты.

ESM

import {projectData} from '@e22m4u/js-data-projection';

CommonJS

const {projectData} = require('@e22m4u/js-data-projection');

Использование

Ниже приводятся примеры использования данного модуля.

Схема проекции

Определение правил видимости полей.

{
  foo: true, // поле доступно
  bar: false // поле скрыто
}

Определение вложенной схемы.

{
  name: true, // поле name доступно
  address: {  // настройки поля address
    select: true, // поле address доступно
    schema: {     // вложенная схема
      city: true,     // поле city доступно
      zip: false      // поле zip скрыто
    }
  }
}

Определение правил для областей проекции.

{
  password: { // настройки поля password
    select: false,  // поле password недоступно по умолчанию
    scopes: {       // настройки для областей проекции
      input: true,     // поле доступно для области 'input'
      output: false    // но скрыто для области 'output'
    }
  }
}

Применение схемы

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

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
// }

Применение схемы к массиву объектов.

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}
// ]

Применение вложенной схемы для сложной структуры данных.

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',
//   }
// }

Строгий режим

Исключение полей не указанных в схеме проекции.

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'
// }

Область проекции

Создание проекции определенной области.

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'
// }

Фабричные функции

Использование фабрики вместо объекта схемы.

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
// }

Использование фабрики во вложенной схеме.

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'
//   }
// }

Именованные схемы

Регистрация и применение именованной схемы.

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'
// }

Использование вложенных именованных схем.

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'
//   }
// }

Реализация пользовательской функции разрешения имен.

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'
// }

Тесты

npm run test

Лицензия

MIT