import { Keyof } from "@fabric/core"; import { FieldToType } from "./fields/field-to-type.js"; import { Field, FieldDefinition } from "./fields/index.js"; export type CustomModelFields = Record; export const DefaultModelFields = { id: Field.uuid({ isPrimaryKey: true }), streamId: Field.uuid({ isIndexed: true }), streamVersion: Field.integer({ isUnsigned: true, hasArbitraryPrecision: true, }), }; export interface Model< TName extends string = string, TFields extends CustomModelFields = CustomModelFields, > { name: TName; fields: typeof DefaultModelFields & TFields; } export function defineModel< TName extends string, TFields extends CustomModelFields, >(name: TName, fields: TFields): Model { return { name, fields: { ...DefaultModelFields, ...fields }, } as const; } export type ModelToType = { [K in Keyof]: FieldToType; }; export type ModelFieldNames = Keyof< TModel["fields"] >; export type ModelAddressableFields = { [K in Keyof]: TModel["fields"][K] extends { isUnique: true } ? K : never; }[Keyof];