Newer
Older
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
>;