npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@e22m4u/js-data-projector

v0.2.0

Published

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

Downloads

518

Readme

@e22m4u/js-data-projector

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

Содержание

Установка

npm install @e22m4u/js-data-projector

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

ESM

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

CommonJS

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

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

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

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

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

{
  name: true, // поле "name" доступно
  address: {  // поле "address" доступно
    city: true,  // поле "address.city" доступно
    zip: false   // поле "address.zip" скрыто
  }
}

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

{
  name: true,        // поле "name" доступно
  contact: 'address' // поле "contact" доступно
  // поле "contact" использует вложенную схему "address"
}

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

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

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

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

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

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

const data = {
  name: 'Fedor',       // допускается, явное правило
  password: 'pass123', // исключается, явное правило
  extra: 10,           // исключается в режиме по умолчанию
};

const result = projectData(data, schema);
console.log(result);
// {
//   name: 'Fedor'
// }

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

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(data, schema);
console.log(result);
// [
//   {id: 1},
//   {id: 2}
// ]

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

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

const schema = {
  id: false,
  name: true,
  // вложенная схема
  city: {
    id: false,
    name: true,
  },
};

const data = {
  id: 10, // исключается, явное правило
  name: 'Fedor',
  city: {
    id: 20, // исключается, явное правило
    name: 'Moscow',
  },
};

const result = projectData(data, schema);
console.log(result);
// {
//   name: 'Fedor',
//   city: {
//     name: 'Moscow',
//   }
// }

Неуказанные поля

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

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

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

const data = {
  name: 'Fedor',       // допускается, явное правило
  password: 'pass123', // исключается, явное правило
  extra: 10,           // допускается в режиме "keepUnknown"
};

const result = projectData(data, schema, {
  keepUnknown: true, // <= допуск неуказанных полей
});
console.log(result);
// {
//   name: 'Fedor',
//   extra: 10
// }

Переопределение параметра keepUnknown схемой проекции.

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

const schema = {
  $keepUnknown: true, // <= допускать неуказанные поля
  name: true,
  password: false,
  // in-line параметр "$keepUnknown" определяет режим только
  // для текущего уровня вложенности, и если данная схема
  // объекта имеет вложенные схемы, то на них переопределение
  // не влияет
};

const data = {
  name: 'Fedor',       // допускается, явное правило
  password: 'pass123', // исключается, явное правило
  extra: 10,           // допускается, in-line параметр "$keepUnknown"
};

const result = projectData(data, schema, {
  keepUnknown: false, // <= допуск неуказанных полей запрещен
});
console.log(result);
// {
//   name: 'Fedor',
//   extra: 10
// }

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

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

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

// фабрика возвращает объект схемы
const getSchema = () => {
  return {
    id: true,
    hiddenField: false,
  };
};

const data = {
  id: 1,
  hiddenField: 'secret',
};

// передача функции вместо объекта
const result = projectData(data, getSchema);
console.log(result);
// {
//   id: 1
// }

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

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

// фабрика для вложенных данных
const getAddressSchema = () => {
  return {
    city: true,
    zip: false,
  };
};

const userSchema = {
  name: true,
  address: getAddressSchema, // <= использование фабрики
};

const data = {
  name: 'Fedor',
  address: {
    city: 'Moscow',
    zip: 123456,
  },
};

const result = projectData(data, userSchema);
console.log(result);
// {
//   name: 'Fedor',
//   address: {
//     city: 'Moscow'
//   }
// }

Установка аргументов вызова фабричных функций.

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

// объект "logger" будет передан
// в параметры фабрики,
const logger = {
  log: (message) => console.log(message),
};

// фабрика использует "logger"
const getSchema = (logger) => {
  logger.log('Factory was invoked!');
  return {name: true, secret: false};
};

const data = {
  name: 'John',
  secret: 'john123',
};

const result = projectData(data, getSchema, {
  factoryArgs: [logger], // <= передача "logger" в фабрику
});
// Factory was invoked!
console.log(result);
// {
//   name: 'John',
// }

Доступ к сервис-контейнеру внутри фабрики.

import {ServiceContainer} from '@e22m4u/js-service';
import {DataProjector} from '@e22m4u/js-data-projector';

// сервис-контейнер доступен только
// при использовании DataProjector
const projector = new DataProjector();

// сервис-контейнер передается
// первым аргументом фабрики
const getSchema = (container) => {
  console.log(container instanceof ServiceContainer); // true
  return {name: true, secret: false};
}

const data = {
  name: 'John',
  secret: 'john123',
};

const result = projector.project(data, getSchema);
console.log(result);
// {
//   name: 'John',
// }

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

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

import {DataProjector} from '@e22m4u/js-data-projector';

const projector = new DataProjector();

// регистрация схемы
projector.defineSchema({
  name: 'user', // <= имя схемы
  schema: {
    id: true,
    username: true,
    email: false,
  },
});

const data = {
  id: 10,
  username: 'admin',
  email: '[email protected]',
};

// проекция данных по зарегистрированному имени
const result = projector.project(data, 'user');
console.log(result);
// {
//   id: 10,
//   username: 'admin'
// }

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

import {DataProjector} from '@e22m4u/js-data-projector';

const projector = new DataProjector();

// регистрация схемы "address"
projector.defineSchema({
  name: 'address',
  schema: {
    city: true,
    zip: false,
  },
});

// регистрация схемы "user"
projector.defineSchema({
  name: 'user',
  schema: {
    name: true,
    address: 'address', // <= имя вложенной схемы
  },
});

const data = {
  name: 'Fedor',
  address: {
    city: 'Moscow',
    zip: 123456,
  },
};

const result = projector.project(data, 'user');
console.log(result);
// {
//   name: 'Fedor',
//   address: {
//     city: 'Moscow'
//   }
// }

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

import {DataProjector} from '@e22m4u/js-data-projector';

const projector = new DataProjector();

// регистрация основной схемы
projector.defineSchema({
  name: 'user',
  schema: {
    id: true,
    name: true,
    email: false,
  },
});

// регистрация псевдонима
projector.defineSchema({
  name: 'author', // имя псевдонима
  schema: 'user', // <= имя основной схемы
});

const data = {
  id: 10,
  name: 'Fedor',
  email: '[email protected]',
};

// проекция данных по имени псевдонима
const result = projector.project(data, 'author');
console.log(result);
// {
//   id: 10,
//   name: 'Fedor'
// }

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

import {DataProjector} from '@e22m4u/js-data-projector';

const projector = new DataProjector();

// создание фабрики
const getUserSchema = () => {
  return {
    id: true,
    name: true,
    email: false,
  };
};

// регистрация схемы
projector.defineSchema({
  name: 'user',
  schema: getUserSchema, // <= фабрика вместо схемы
});

const data = {
  id: 10,
  name: 'Fedor',
  email: '[email protected]',
};

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

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

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

// функция разрешения имен
const nameResolver = 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(
  data,
  'user', // <= вместо схемы передается имя
  {nameResolver}, // <= разрешающая функция
);
console.log(result);
// {
//   id: 1,
//   name: 'Fedor'
// }

Тесты

npm run test

Лицензия

MIT