import type { Binary, Document, ObjectId, BSONRegExp, Timestamp, Decimal128, Double, Int32, Long } from './bson'; import { EventEmitter } from 'events'; import type { Sort } from './sort'; /** @internal */ export type TODO_NODE_3286 = any; /** Given an object shaped type, return the type of the _id field or default to ObjectId @public */ export type InferIdType = TSchema extends { _id: infer IdType } // user has defined a type for _id ? // eslint-disable-next-line @typescript-eslint/ban-types {} extends IdType // TODO(NODE-3285): Improve type readability ? // eslint-disable-next-line @typescript-eslint/ban-types Exclude : unknown extends IdType ? ObjectId : IdType : ObjectId; // user has not defined _id on schema /** Add an _id field to an object shaped type @public */ export type WithId = EnhancedOmit & { _id: InferIdType }; /** * Add an optional _id field to an object shaped type * @public * * @privateRemarks * `ObjectId extends TSchema['_id']` is a confusing ordering at first glance. Rather than ask * `TSchema['_id'] extends ObjectId` which translated to "Is the _id property ObjectId?" * we instead ask "Does ObjectId look like (have the same shape) as the _id?" */ export type OptionalId = TSchema extends { _id?: any } ? ObjectId extends TSchema['_id'] // a Schema with ObjectId _id type or "any" or "indexed type" provided ? EnhancedOmit & { _id?: InferIdType } // a Schema provided but _id type is not ObjectId : WithId : EnhancedOmit & { _id?: InferIdType }; // TODO(NODE-3285): Improve type readability /** TypeScript Omit (Exclude to be specific) does not work for objects with an "any" indexed type, and breaks discriminated unions @public */ export type EnhancedOmit = string extends keyof TRecordOrUnion ? TRecordOrUnion // TRecordOrUnion has indexed type e.g. { _id: string; [k: string]: any; } or it is "any" : TRecordOrUnion extends any ? Pick> // discriminated unions : never; /** Remove the _id field from an object shaped type @public */ export type WithoutId = Omit; /** A MongoDB filter can be some portion of the schema or a set of operators @public */ export type Filter = { [P in keyof TSchema]?: Condition; } & RootFilterOperators; /** @public */ export type Condition = AlternativeType | FilterOperators>; /** * It is possible to search using alternative types in mongodb e.g. * string types can be searched using a regex in mongo * array types can be searched using their element type * @public */ export type AlternativeType = T extends ReadonlyArray ? T | RegExpOrString : RegExpOrString; /** @public */ export type RegExpOrString = T extends string ? BSONRegExp | RegExp | T : T; /** @public */ export interface RootFilterOperators extends Document { $and?: Filter[]; $nor?: Filter[]; $or?: Filter[]; $text?: { $search: string; $language?: string; $caseSensitive?: boolean; $diacriticSensitive?: boolean; }; $where?: string | ((this: TSchema) => boolean); $comment?: string | Document; } /** @public */ export interface FilterOperators extends Document { // Comparison $eq?: TValue; $gt?: TValue; $gte?: TValue; $in?: ReadonlyArray; $lt?: TValue; $lte?: TValue; $ne?: TValue; $nin?: ReadonlyArray; // Logical $not?: TValue extends string ? FilterOperators | RegExp : FilterOperators; // Element /** * When `true`, `$exists` matches the documents that contain the field, * including documents where the field value is null. */ $exists?: boolean; $type?: BSONType | BSONTypeAlias; // Evaluation $expr?: Record; $jsonSchema?: Record; $mod?: TValue extends number ? [number, number] : never; $regex?: TValue extends string ? RegExp | BSONRegExp | string : never; $options?: TValue extends string ? string : never; // Geospatial $geoIntersects?: { $geometry: Document }; $geoWithin?: Document; $near?: Document; $nearSphere?: Document; $maxDistance?: number; // Array $all?: ReadonlyArray; $elemMatch?: Document; $size?: TValue extends ReadonlyArray ? number : never; // Bitwise $bitsAllClear?: BitwiseFilter; $bitsAllSet?: BitwiseFilter; $bitsAnyClear?: BitwiseFilter; $bitsAnySet?: BitwiseFilter; $rand?: Record; } /** @public */ export type BitwiseFilter = | number /** numeric bit mask */ | Binary /** BinData bit mask */ | ReadonlyArray; /** `[ , , ... ]` */ /** @public */ export const BSONType = Object.freeze({ double: 1, string: 2, object: 3, array: 4, binData: 5, undefined: 6, objectId: 7, bool: 8, date: 9, null: 10, regex: 11, dbPointer: 12, javascript: 13, symbol: 14, javascriptWithScope: 15, int: 16, timestamp: 17, long: 18, decimal: 19, minKey: -1, maxKey: 127 } as const); /** @public */ export type BSONType = typeof BSONType[keyof typeof BSONType]; /** @public */ export type BSONTypeAlias = keyof typeof BSONType; /** * @public * Projection is flexible to permit the wide array of aggregation operators * @deprecated since v4.1.0: Since projections support all aggregation operations we have no plans to narrow this type further */ // eslint-disable-next-line @typescript-eslint/no-unused-vars export type Projection = Document; /** * @public * @deprecated since v4.1.0: Since projections support all aggregation operations we have no plans to narrow this type further */ export type ProjectionOperators = Document; /** @public */ export type IsAny = true extends false & Type ? ResultIfAny : ResultIfNotAny; /** @public */ export type Flatten = Type extends ReadonlyArray ? Item : Type; /** @public */ export type SchemaMember = { [P in keyof T]?: V } | { [key: string]: V }; /** @public */ export type IntegerType = number | Int32 | Long; /** @public */ export type NumericType = IntegerType | Decimal128 | Double; /** @public */ export type FilterOperations = T extends Record ? { [key in keyof T]?: FilterOperators } : FilterOperators; /** @public */ export type KeysOfAType = { [key in keyof TSchema]: NonNullable extends Type ? key : never; }[keyof TSchema]; /** @public */ export type KeysOfOtherType = { [key in keyof TSchema]: NonNullable extends Type ? never : key; }[keyof TSchema]; /** @public */ export type AcceptedFields = { readonly [key in KeysOfAType]?: AssignableType; }; /** It avoids using fields with not acceptable types @public */ export type NotAcceptedFields = { readonly [key in KeysOfOtherType]?: never; }; /** @public */ export type OnlyFieldsOfType = IsAny< TSchema[keyof TSchema], Record, AcceptedFields & NotAcceptedFields & Record >; /** @public */ export type MatchKeysAndValues = Readonly> & Record; /** @public */ export type AddToSetOperators = { $each?: Array>; }; /** @public */ export type ArrayOperator = { $each?: Array>; $slice?: number; $position?: number; $sort?: Sort; }; /** @public */ export type SetFields = ({ readonly [key in KeysOfAType | undefined>]?: | OptionalId> | AddToSetOperators>>>; } & NotAcceptedFields | undefined>) & { readonly [key: string]: AddToSetOperators | any; }; /** @public */ export type PushOperator = ({ readonly [key in KeysOfAType>]?: | Flatten | ArrayOperator>>; } & NotAcceptedFields>) & { readonly [key: string]: ArrayOperator | any; }; /** @public */ export type PullOperator = ({ readonly [key in KeysOfAType>]?: | Partial> | FilterOperations>; } & NotAcceptedFields>) & { readonly [key: string]: FilterOperators | any; }; /** @public */ export type PullAllOperator = ({ readonly [key in KeysOfAType>]?: TSchema[key]; } & NotAcceptedFields>) & { readonly [key: string]: ReadonlyArray; }; /** @public */ export type UpdateFilter = { $currentDate?: OnlyFieldsOfType< TSchema, Date | Timestamp, true | { $type: 'date' | 'timestamp' } >; $inc?: OnlyFieldsOfType; $min?: MatchKeysAndValues; $max?: MatchKeysAndValues; $mul?: OnlyFieldsOfType; $rename?: Record; $set?: MatchKeysAndValues; $setOnInsert?: MatchKeysAndValues; $unset?: OnlyFieldsOfType; $addToSet?: SetFields; $pop?: OnlyFieldsOfType, 1 | -1>; $pull?: PullOperator; $push?: PushOperator; $pullAll?: PullAllOperator; $bit?: OnlyFieldsOfType< TSchema, NumericType | undefined, { and: IntegerType } | { or: IntegerType } | { xor: IntegerType } >; } & Document; /** @public */ export type Nullable = AnyType | null | undefined; /** @public */ export type OneOrMore = T | ReadonlyArray; /** @public */ export type GenericListener = (...args: any[]) => void; /** * Event description type * @public */ export type EventsDescription = Record; /** @public */ export type CommonEvents = 'newListener' | 'removeListener'; /** * Typescript type safe event emitter * @public */ export declare interface TypedEventEmitter extends EventEmitter { addListener(event: EventKey, listener: Events[EventKey]): this; addListener( event: CommonEvents, listener: (eventName: string | symbol, listener: GenericListener) => void ): this; addListener(event: string | symbol, listener: GenericListener): this; on(event: EventKey, listener: Events[EventKey]): this; on( event: CommonEvents, listener: (eventName: string | symbol, listener: GenericListener) => void ): this; on(event: string | symbol, listener: GenericListener): this; once(event: EventKey, listener: Events[EventKey]): this; once( event: CommonEvents, listener: (eventName: string | symbol, listener: GenericListener) => void ): this; once(event: string | symbol, listener: GenericListener): this; removeListener(event: EventKey, listener: Events[EventKey]): this; removeListener( event: CommonEvents, listener: (eventName: string | symbol, listener: GenericListener) => void ): this; removeListener(event: string | symbol, listener: GenericListener): this; off(event: EventKey, listener: Events[EventKey]): this; off( event: CommonEvents, listener: (eventName: string | symbol, listener: GenericListener) => void ): this; off(event: string | symbol, listener: GenericListener): this; removeAllListeners( event?: EventKey | CommonEvents | symbol | string ): this; listeners( event: EventKey | CommonEvents | symbol | string ): Events[EventKey][]; rawListeners( event: EventKey | CommonEvents | symbol | string ): Events[EventKey][]; emit( event: EventKey | symbol, ...args: Parameters ): boolean; listenerCount( type: EventKey | CommonEvents | symbol | string ): number; prependListener(event: EventKey, listener: Events[EventKey]): this; prependListener( event: CommonEvents, listener: (eventName: string | symbol, listener: GenericListener) => void ): this; prependListener(event: string | symbol, listener: GenericListener): this; prependOnceListener( event: EventKey, listener: Events[EventKey] ): this; prependOnceListener( event: CommonEvents, listener: (eventName: string | symbol, listener: GenericListener) => void ): this; prependOnceListener(event: string | symbol, listener: GenericListener): this; eventNames(): string[]; getMaxListeners(): number; setMaxListeners(n: number): this; } /** * Typescript type safe event emitter * @public */ // eslint-disable-next-line @typescript-eslint/no-unused-vars export class TypedEventEmitter extends EventEmitter {} /** @public */ export class CancellationToken extends TypedEventEmitter<{ cancel(): void }> {}