export type BuildObj = { type: "String" | "Date" | "Float" | "Int" | "Boolean"; required?: boolean; }; 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 >;