UNPKG

@fjell/core

Version:

Core Item and Key Framework for Fjell

122 lines (109 loc) 3.36 kB
import deepmerge from 'deepmerge'; import { Item } from '../items'; import { primaryType } from '../key/KUtils'; import { ComKey, PriKey } from '../keys'; export class IFactory< V extends Item<S, L1, L2, L3, L4, L5>, S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never> { private item: any = { }; public constructor(props: Record<string, any> = {}) { this.item = deepmerge(this.item, props); } public addRef(i: Item<any, any|never, any|never, any|never, any|never, any|never>, name?: string) { const ik: ComKey<any, any|never, any|never, any|never, any|never, any|never> | PriKey<any> = i.key; const refName = name || primaryType(ik); if (!this.item.refs) { this.item.refs = {}; } this.item.refs[refName] = ik; return this; } public static addRef< V extends Item<S, L1, L2, L3, L4, L5>, S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never >(i: V, name?: string) { return new IFactory<V, S, L1, L2, L3, L4, L5>().addRef(i, name); } public addDefaultEvents() { if (!this.item.events) { this.item.events = {}; } const now = new Date(); if (!this.item.events.created) { this.item.events.created = { at: now }; } if (!this.item.events.updated) { this.item.events.updated = { at: now }; } if (!this.item.events.deleted) { this.item.events.deleted = { at: null }; } return this; } public addEvent( name: string, at: Date | null, by?: ComKey<any, any|never, any|never, any|never, any|never, any|never> | PriKey<any> ) { if (!this.item.events) { this.item.events = {}; } this.item.events[name] = { at, by }; return this; } public static addEvent< V extends Item<S, L1, L2, L3, L4, L5>, S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never >(name: string, at: Date | null, by?: ComKey<S, L1, L2, L3, L4, L5> | PriKey<S>) { return new IFactory<V, S, L1, L2, L3, L4, L5>().addEvent(name, at, by); } public addProp(name: string, value: string | number | boolean | Date) { this.item[name] = value; return this; } public static addProp< V extends Item<S, L1, L2, L3, L4, L5>, S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never >(name: string, value: string | number | boolean | Date) { return new IFactory<V, S, L1, L2, L3, L4, L5>().addProp(name, value); } public addProps(props: Record<string, any>) { this.item = deepmerge(this.item, props); return this; } public static addProps< V extends Item<S, L1, L2, L3, L4, L5>, S extends string, L1 extends string = never, L2 extends string = never, L3 extends string = never, L4 extends string = never, L5 extends string = never >(props: Record<string, any>) { return new IFactory<V, S, L1, L2, L3, L4, L5>().addProps(props); } toItem(): V { return this.item as V; } }