export const yams = { String: () => ({ type: "String" } as const), Date: () => ({ type: "Date" } as const), Float: () => ({ type: "Float" } as const), Int: () => ({ type: "Int" } as const), Boolean: () => ({ type: "Boolean" } as const), } as const; export type BuildObj = ReturnType<typeof yams[keyof typeof yams]>; 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 >;