type BuildObjBase<T extends string> = { type: T; required?: boolean; }; interface StringBuildObj extends BuildObjBase<"String"> { default?: string; } interface DateBuidObj extends BuildObjBase<"Date"> { default?: Date | "NOW" | "TODAY"; } interface FloatBuildObj extends BuildObjBase<"Float"> { default?: number; } interface IntBuildObj extends BuildObjBase<"Int"> { default?: number; } interface BooleanBuildObj extends BuildObjBase<"Boolean"> { default?: boolean; } export type BuildObj = | StringBuildObj | DateBuidObj | FloatBuildObj | IntBuildObj | BooleanBuildObj; export type Cardinality = "*" | "1" | "?" | "+"; export type CardinalityPair = `${Cardinality}${Cardinality}`; export type RelationDefinition<EntityType extends string> = { name: string; cardinality: CardinalityPair; subject: EntityType; object: EntityType; }; export type EntitySchema = Record<string, BuildObj>; export type EntitiesSchemas<EntityTypes extends string> = Record< EntityTypes, EntitySchema >; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type Schema< EntityTypes extends string = string, ESchemas extends EntitiesSchemas<EntityTypes> = EntitiesSchemas<EntityTypes>, RDefs extends RelationDefinition<EntityTypes>[] = RelationDefinition<EntityTypes>[] > = { entities: ESchemas; relationsDefinitions: RDefs; }; export type SchemaEntityTypes<S extends Schema<string>> = Extract< keyof S["entities"], string >;