@fjell/core
Version:
Core Item and Key Framework for Fjell
60 lines (59 loc) • 3.1 kB
TypeScript
import { ComKey, PriKey } from './keys';
export type RecursivePartial<T> = {
[P in keyof T]?: T[P] extends (infer U)[] ? RecursivePartial<U>[] : T[P] extends object | undefined ? RecursivePartial<T[P]> : T[P];
};
export type Identified<S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never> = {
key: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>;
};
/**
* This is a generic item event, and it's designed to make sure we have the ability to define not just
* the required fields, but also the optional fields.
*/
export interface ItemEvent {
at: Date | null;
by?: ComKey<any, any | never, any | never, any | never, any | never, any | never> | PriKey<any>;
agg?: Item<any, any, any, any, any, any>;
}
/**
* This is a required item event, and it's here mainly to define that there are events that must be present.
*/
export interface RequiredItemEvent extends ItemEvent {
at: Date;
}
export type Evented = Record<string, ItemEvent>;
export interface Timestamped extends Evented {
created: RequiredItemEvent;
updated: RequiredItemEvent;
}
export interface Deletable extends Partial<Evented> {
deleted: ItemEvent;
}
export type ManagedEvents = Timestamped & Deletable;
export type References = Record<string, ComKey<string, string | never, string | never, string | never, string | never, string | never> | PriKey<string>>;
export type ReferenceItem<S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never> = {
key: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>;
item: Item<S, L1, L2, L3, L4, L5>;
};
export type ReferenceItems = Record<string, ReferenceItem<string, string | never, string | never, string | never, string | never, string | never>>;
export interface Item<S extends string = never, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never> extends Identified<S, L1, L2, L3, L4, L5> {
events: ManagedEvents & Evented;
aggs?: ReferenceItems;
refs?: References;
[key: string]: any;
}
/**
* Interface for properties that can be added to items
*/
export interface Propertied {
name: string;
value: number;
}
/**
* Type for item properties without the key - equivalent to Partial<Item> without the key
*/
export type ItemProperties<S extends string = never, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never> = Partial<Omit<Item<S, L1, L2, L3, L4, L5>, 'key'>>;
/**
* Type for item properties without the key - equivalent to Partial<Item> without the key
* This is an alias for ItemProperties for backward compatibility
*/
export type TypesProperties<S extends string = never, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never> = Partial<Omit<Item<S, L1, L2, L3, L4, L5>, 'key'>>;