export type QuerySortDirection = 'asc' | 'desc'; export type StringKeys = Extract; export type QuerySortPart = { [k in StringKeys | string]: QuerySortDirection; }; export type PropertyType = string extends Property ? unknown : Property extends keyof Type ? Type[Property] : Property extends `${number}` ? Type extends ReadonlyArray ? ArrayType : unknown : Property extends `${infer Key}.${infer Rest}` ? Key extends `${number}` ? Type extends ReadonlyArray ? PropertyType : unknown : Key extends keyof Type ? Type[Key] extends Map ? MapType : PropertyType : unknown : unknown; export interface QueryOperators { $eq?: PathValueType; $gt?: PathValueType; $gte?: PathValueType; $lt?: PathValueType; $lte?: PathValueType; $ne?: PathValueType; $in?: PathValueType[]; $nin?: PathValueType[]; $regex?: string | RegExp; $options?: string; $exists?: boolean; $type?: 'null' | 'boolean' | 'number' | 'string' | 'array' | 'object'; $mod?: number; $not?: PathValueType; $size?: number; $elemMatch?: QuerySelector; } type Join = K extends string | number ? P extends string | number ? `${K}${'' extends P ? '' : '.'}${P}` : never : never; type Prev = [ never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...0[] ]; export type Paths = [D] extends [never] ? never : T extends object ? { [K in keyof T]-?: K extends string | number ? `${K}` | (Paths extends infer R ? Join : never) : never; }[keyof T] : ''; export type QuerySelector = Partial<{ [Property in Paths]: QueryOperators | PropertyType; }> & { $and?: QuerySelector[]; $or?: QuerySelector[]; $nor?: QuerySelector[]; }; export type QuerySelectorAndIndex = { selector?: QuerySelector; index?: string | string[]; }; export type QueryNoLimit = QuerySelectorAndIndex & { sort?: QuerySortPart[]; }; export type Query = QueryNoLimit & { skip?: number; limit?: number; }; export type MigrationStrategy = (oldDocumentData: DocData) => Promise | DocData | null; export type MigrationStrategies = { [toVersion: number]: MigrationStrategy; }; export {};