import { Expression, sql } from 'kysely'; import { Between, LessThanOrEqual, MoreThanOrEqual } from 'typeorm'; /** * Allows optional values unlike the regular Between and uses MoreThanOrEqual * or LessThanOrEqual when only one parameter is specified. */ export function OptionalBetween(from?: T, to?: T) { if (from && to) { return Between(from, to); } else if (from) { return MoreThanOrEqual(from); } else if (to) { return LessThanOrEqual(to); } } export const asUuid = (id: string | Expression) => sql`${id}::uuid`; export const anyUuid = (ids: string[]) => sql`any(${`{${ids}}`}::uuid[])`; export const asVector = (embedding: number[]) => sql`${`[${embedding}]`}::vector`; export const unnest = (array: string[]) => sql>`unnest(array[${sql.join(array)}]::text[])`; export const removeUndefinedKeys = (update: T, template: unknown) => { for (const key in update) { if ((template as T)[key] === undefined) { delete update[key]; } } return update; }; /** * Mainly for type debugging to make VS Code display a more useful tooltip. * Source: https://stackoverflow.com/a/69288824 */ export type Expand = T extends infer O ? { [K in keyof O]: O[K] } : never; /** Recursive version of {@link Expand} from the same source. */ export type ExpandRecursively = T extends object ? T extends infer O ? { [K in keyof O]: ExpandRecursively } : never : T;