import { WithDocument } from "../db/Document"; export interface AnyObject { [k: string | number | symbol]: any; } export type ObjectWithId = AnyObject & ReservedValues; export type ReservedObject = T & ReservedValues; export const FilterMethods = ["$or"] as const; export interface GetInType { $in?: T[]; $nin?: T[]; } export const FilterMethodsIn: ReadonlyArray> = [ "$in", "$nin", ]; export type FilterMethodType = typeof FilterMethods[number]; export type FilterMethodInType = typeof FilterMethodsIn[number]; export type Filter = | ({ [k in keyof T]?: | T[k] | { [n in FilterMethodInType]?: GetInType[n]; }; } & { [k: string | number]: | any | { [n in FilterMethodInType]?: GetInType[n]; }; }) | { [k in FilterMethodType]?: { [k in keyof T]?: | T[k] | { [n in FilterMethodInType]?: GetInType[n]; }; } & { [k: string | number]: | any | { [n in FilterMethodInType]?: GetInType[n]; }; }; } | ((document: WithDocument) => boolean); export const UpdateMethods = ["$set", "$inc", "$push"] as const; export type UpdateMethodType = typeof UpdateMethods[number]; interface ParseUpdateType { $set: T; $inc: number; $push: T extends any[] ? T[number] : any; } export type Update = { [u in UpdateMethodType]?: { [k in keyof T]?: ParseUpdateType[u]; } & { [k: string | number]: any }; }; export interface ReservedValues { _id: string; _createdAt: Date; } export const ReservedWordsArray: Array = [ "_createdAt", "_id", ];