import mongoose, { SchemaDefinition, Schema, Document, Model, Types } from "mongoose"; export type MongooseModule = typeof import("mongoose"); export type MongooseModel> = Model; export type MongooseSchema = Schema; type Omit = Pick>; export type MongooseDocument = Omit & { _id: Types.ObjectId, }; export type UnionToIntersection = (T extends unknown ? (p: T) => unknown : never) extends ((p: infer U) => unknown) ? U : never; export type UnboxPromise> = T extends Promise ? U : never; export type ModelItemType> = T extends Model ? U : never; export type SchemaItemType = T extends { _interface: infer U } ? U : never; export type ReplaceModelReturnType Promise, TNewReturnType extends UnboxPromise>> = (...a: Parameters) => Promise; export type ItemTypeFromTypeSchemaFunction Promise> = ModelItemType>>; export type ModelTypeFromTypeSchemaFunction = Model; export type MongooseProperty = T extends { type: (Schema & { _interface: infer P })[] } ? P[] : T extends { type: ((...a: unknown[]) => infer P)[] } ? P[] : T extends ((...a: unknown[]) => infer P)[] ? P[] : T extends (Schema & { _interface: infer P })[] ? P[] : T extends { type: (...a: unknown[]) => infer P } ? P : T extends { type: Schema & { _interface: infer P } } ? P : T extends (...a: unknown[]) => infer P ? P : T extends Schema & { _interface: infer P } ? P : T extends { type: MongooseModule["Types"]["ObjectId"] } ? Types.ObjectId : T extends MongooseModule["Types"]["ObjectId"] ? Types.ObjectId : T extends Record ? { [P in keyof T]: MongooseProperty } : never; export type MongooseInterface = Record & { [P in keyof T]: MongooseProperty }; export type TypedSchema = Schema & { _interface: MongooseInterface }; export type TypedDocument> = Document & ( T extends { _interface: infer U } ? U : never ); export type ModelFromSchemaDefinition = ModelFromSchema }>; export type ModelFromSchema = Model>; export type DocumentFromSchemaDefinition = DocumentTypeFromSchema }>; export type DocumentTypeFromSchema = T extends Schema & { _interface: infer TI } ? TI & MongooseDocument & { schema: T } : never; export type DocumentTypeFromModel> = T extends Model ? U : never; export type FieldsOfDocument = T extends Document & infer F ? F & { id?: unknown, _id: unknown } : never; export function retrieveCurrentUnixTime(): number { return Date.now() / 1000; } export function currentDate() { return new Date(); } type Or = T & { $or?: Or[], }; type NonFunctionKeys = { [P in keyof T]: T[P] extends (...a: never[]) => unknown ? never : P }[keyof T]; interface Comparison { $eq?: T; $gt?: T; $gte?: T; $in?: T[]; $lt?: T; $lte?: T; $ne?: T; $nin?: T[]; } type PropConditions = T extends boolean ? Comparison : T extends number ? Comparison & { $mod?: [number, number] } : T extends string ? Comparison & (Record | { $regex: string, $options: string }) & (Record | { $text: { $search: string, $language?: string, $caseSensitive?: boolean, $diacriticSensitive?: boolean, }, }) : never; type Conditions = { [P in NonFunctionKeys]?: T[P] | PropConditions }; export function conditions(_items: import("mongoose").Model, c: Or>) { return c; } export function convertToObjectId(id: string): Types.ObjectId { if (id) { return new Types.ObjectId(id); } return new Types.ObjectId(); // fal;back if user provides empty string } export async function disconnectMongoose() { return mongoose.disconnect(); } export async function closeAllMongooseConnections() { if (mongoose.connections.length) { for (const connection of mongoose.connections) { await connection.close(); } } } export async function sleep(ms: number) { return new Promise(resolve => setTimeout(resolve, ms)); }