Skip to content
Snippets Groups Projects
Schema.ts 1.45 KiB
Newer Older
type BuildObjBase<T extends string> = {
  type: T;
Frank Bessou's avatar
Frank Bessou committed

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;

Frank Bessou's avatar
Frank Bessou committed
export type Cardinality = "*" | "1" | "?" | "+";

export type CardinalityPair = `${Cardinality}${Cardinality}`;

export type RelationDefinition<EntityType extends string> = {
  name: string;
  cardinality: CardinalityPair;
  subject: EntityType;
  object: EntityType;
};
Frank Bessou's avatar
Frank Bessou committed

export type EntitySchema = Record<string, BuildObj>;

export type EntitiesSchemas<EntityTypes extends string> = Record<
  EntityTypes,
  EntitySchema
>;
Frank Bessou's avatar
Frank Bessou committed

// 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;
Frank Bessou's avatar
Frank Bessou committed
};

export type SchemaEntityTypes<S extends Schema<string>> = Extract<
  keyof S["entities"],
  string
>;