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 🙏

© 2024 – Pkg Stats / Ryan Hefner

collection-store

v3.0.0-beta.20

Published

very flexible collection for in-memory operations with flexible indexing

Downloads

98

Readme

#collection-store

It is simple and effective in-memory object store can be used both on browser and server side.

for usage please see tests.

features:

  • ttl: each item can have ttl;
  • indexes: collection can have multiple indexes;
  • schema: collection must have schema for all indexed items;
  • simple CRUD.
  • simple persistence
  • extensible persistence.
  • serialize/load schema within storage

find

можно добавить валидацию можно добавить интеграцию с удаленным хранилищем через хранилище можно добавить graphql можно добавить полнотекстовый поиск

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

[x] чистить пустые индексные записи для Array интегрировать с filter и плотнее с lodash [x] уровень хранения сделать адаптером, а не отдельным классом кастомные индексы туда же можно включить сохранение в firebase

[x] предварительная обработка ключевых полей, функция, [x] ignoreCase [x] возможность строгой типизации коллекций с бонусами в ts - intellisence для индексов

[] поиск по нескольким ключам [] сложные индексы(более двух полей) [] fuzzy поиск по коллекциям

[x] index all fields [x] default adapter and list for Collection

[] интегрировать с google spreadsheet

сделать сервер для работы с библиотекой в смысле сдлать программу сервер

посмотреть lunr.js для поиска по индексам сделать индексы btree ... для поиска больше меньше и прочее

// https://medium.com/swlh/binary-search-tree-in-javascript-31cb74d8263b

// https://medium.com/swlh/key-value-pair-database-internals-18f52c36bb70 // https://medium.com/swlh/guide-to-database-storage-engines-2b188bd3e9e3

использоваь splay-tree https://github.com/w8r/splay-tree чел пишет алгоритмы сам использовать статический поиск без расширения staticFind

для поиска использовать FlexSearch.js

поддержка русского языка https://github.com/alex-shpak/hugo-book/issues/80

поиск: сделать дерево простых значений, как хэш таблиц для множественного поиска использовать два и более индексов проверять unique/non unique в узлах хранить ссылки на ключи, массив или один сделать сериализацию: сохранение и восстанровление индекса из/в JSON сделать индекс для lunr.js

сделать сериализацию и десериализацию rotate

можно сделать дополнительные адаптеры для работы с базами данных, тогда такая локальная коллекция будет загружаться в начале работы и сохраняться в конце. можно сделать чтото типа транзакий или логгирования

  • проблемы с перекрестными обновлениями нужно отрабатывать как конфликты
  • можно придумать механизмавтоматической подгрузки данных в коллекцию по определенному запросу
  • вопросы с индексами: можно как-то придумать как лазить по вложенным структурам в typescript
    • https://stackoverflow.com/questions/58434389/typescript-deep-keyof-of-a-nested-object

[x] вспомнить где лежит библиотека filter

  • [x] оттуда можно взять преобразование всего чего нужно... была в библиотеках oda

вводим типы ключевых полей

  • объекты сериализуются в строку, все
    • если(!) хранить в нативном формате
      • тогда надо будет чтобы как-то определять чем мы сериализовали
        • в виде пар значений
  • для поиска по интервалам и прочее
    • два основных типа:
      • строка
      • число
      • дата == строка и число
      • boolean = True/False или 1/0
    • нужны быстрые операции пересечения
      • это можно сделать на хэшах
        • преобразуем по известному алогритму в строку
        • пересечение
        • объединение
        • разница справа
        • разница слева

вставка элементов, с проверкой, на sparse если sparce, тогда нужно вставлять, если нет, то не нужно

[x]list заменить на persistence adapter

[x] rotation сделать с переносом всех файлов в другую директорию, а не просто метаданных

сделать адаптер для redis

[x] путь к диреткории с файлами указывать, сейчас удален

проверка коллекции на консистентность: вдруг файл был удален или добавлен новый только для

!!! все операции обновления делать только над копиями данных, чтобы не изменять состояние базы без явного обновления...

counter для первичных ключей не обновляется!!!

  • сделать кэш для операций чтения

    • кашируем файл для чтения, до тех пор пока он на диске физически не изменится
    • где нужно?
      • в средах с конкурентными данными...
  • [x]хранить как-то ключ по которому сохранялся объект, служебная информация

    • решено через получение ключа по id в tree
  • история изменений (audit) https://habr.com/ru/post/101544/

    • смотрим patch
    • берем копию данных
  • версия данных

    • для конкурентного изменения данных
    • выдавать ошибку версии
  • [x] валидация и поля со значениями по-умлочанию

    • все можно сделать в одном через схему
  • загрузка и восстановление индексов после инициализации? посмотреть

  • сурогатные ключи и комбинированные уникальные и первичные с многими полями

    • просто выбираем ключи и ставим между ними ":"
    • задаем очередность полей ключа
    • это полезно для версионных структур данных
  • noupdate режим для коллекции

    • отключает удаление, и обновление записей

весионность: инкрементировать версию и записывать патч, в файл с историей

готово! версионность:

  • добавляем поле версия
  • все изменения патчим и храним отдельным полем... в каждой сущности
  • и индексом по номеру версии
  • если таблица с аудитом, то данные хранятся в отдельной секции, в другой хроаним историю изменений
  • при удалении, запись только помечается удаленной

все структуры должны быть обнолены до вида похожего на firebase { id: первичный ключ, название файла data: data // может не иметь первичного ключа next_version: autoinc current_version: next_version - 1 created: timestamp updated: timestamp deleted: timestamp schema: validation schema --- схема по которой хранится запись history: [ { next_version: autoinc version: number // связаны c next_version schema: схема валидации записи на тот момент date: timestamp diff: } ]

}

полнотекстовый поиск https://github.com/lucaong/minisearch https://github.com/fergiemcdowall/search-index

платформа для базы данных https://github.com/Level/levelup сделать levelup down совместимым

!!! сделать адаптер для mem-fs, redis, mongodb, gitfs, firebase, firestore, googlesheet