@smounters/data
v2.22.1
Published
Reusable MikroORM entity fragments: UUIDv7 primary key, audit columns, per-user settings bag
Maintainers
Readme
@smounters/data
Готовые куски модели данных для MikroORM: первичный ключ UUIDv7, колонки аудита, мешок настроек пользователя.
npm i @smounters/data @mikro-orm/core @mikro-orm/decoratorsЧто такое фрагмент
Фрагмент — это абстрактный класс без @Entity(). Колонки принадлежат пакету, а таблица, индексы
и связи — проекту. Разделение не случайное: колонки у всех проектов одинаковые, внешние ключи —
никогда. Поэтому пакет не может объявить связь с вашим пользователем, а вы не обязаны переписывать
одни и те же четыре колонки аудита в каждом новом сервисе.
| фрагмент | колонки |
|---|---|
| BaseEntity | id — uuid, default uuidv7() |
| AuditableEntity | то же + created_at, updated_at (timestamptz, серверные значения по умолчанию, updated_at обновляется на записи), created_by, updated_by (uuid, допускают NULL) |
| UserSettingBase | то же + section (varchar(50), по умолчанию default), key (varchar(100)), value (jsonb, допускает NULL) |
Как подключить
import { AuditableEntity, UserSettingBase } from "@smounters/data";
@Entity({ tableName: "orders" })
export class Order extends AuditableEntity {
/* свои колонки */
}
// Связь и уникальность объявляет проект — только он знает, где живут его пользователи.
@Entity({ tableName: "user_settings" })
@Unique({ properties: ["user", "section", "key"] })
export class UserSetting extends UserSettingBase {
@ManyToOne(() => User, { deleteRule: "cascade" })
@Index()
user!: Rel<User>;
}UserSettingBase — это хранилище, в которое пишет @smounters/ui через UiProvider.useSetting
(видимость и порядок колонок таблицы, ширина сайдбара). Значение бэкенд не разбирает: его схему знает
фронт.
Требования
- PostgreSQL 18+:
idберёт значение изuuidv7(), а эта функция появилась в 18-й версии. На более старом сервере либо завести функцию с таким именем, либо переопределить свойство у себя. @mikro-orm/coreи@mikro-orm/decorators— peer-зависимости: ядро ORM в приложении должно быть ровно одно, иначе метаданные окажутся в разных реестрах и сущности «не найдутся».- Колонки объявлены с ЯВНЫМ типом у каждого декоратора. Ничего не выводится из
emitDecoratorMetadata, поэтому собранный пакет ведёт себя так же, как тот же код внутри приложения: отражённые типы через границу пакета не переживают сборку надёжно.
Порядок колонок
Унаследованные колонки идут в CREATE TABLE перед объявленными в проекте, поэтому у уже
существующей таблицы порядок в свежем дампе будет другим. На сравнение схемы это не влияет: MikroORM
сверяет набор колонок, а не их порядок, — проверено на 111 сущностях (расхождение с живой базой до и
после перехода на фрагменты совпало полностью). Переупорядочить колонки в PostgreSQL всё равно нельзя.
