import { Admin } from './admin'; import { BSONSerializeOptions, Document, resolveBSONOptions } from './bson'; import { ChangeStream, ChangeStreamDocument, ChangeStreamOptions } from './change_stream'; import { Collection, CollectionOptions } from './collection'; import * as CONSTANTS from './constants'; import { AggregationCursor } from './cursor/aggregation_cursor'; import { ListCollectionsCursor } from './cursor/list_collections_cursor'; import { MongoAPIError, MongoInvalidArgumentError } from './error'; import { Logger, LoggerOptions } from './logger'; import type { MongoClient, PkFactory } from './mongo_client'; import type { TODO_NODE_3286 } from './mongo_types'; import { AddUserOperation, AddUserOptions } from './operations/add_user'; import type { AggregateOptions } from './operations/aggregate'; import { CollectionsOperation } from './operations/collections'; import type { IndexInformationOptions } from './operations/common_functions'; import { CreateCollectionOperation, CreateCollectionOptions } from './operations/create_collection'; import { DropCollectionOperation, DropCollectionOptions, DropDatabaseOperation, DropDatabaseOptions } from './operations/drop'; import { executeOperation } from './operations/execute_operation'; import { CreateIndexesOptions, CreateIndexOperation, IndexInformationOperation, IndexSpecification } from './operations/indexes'; import type { CollectionInfo, ListCollectionsOptions } from './operations/list_collections'; import { ProfilingLevelOperation, ProfilingLevelOptions } from './operations/profiling_level'; import { RemoveUserOperation, RemoveUserOptions } from './operations/remove_user'; import { RenameOperation, RenameOptions } from './operations/rename'; import { RunCommandOperation, RunCommandOptions } from './operations/run_command'; import { ProfilingLevel, SetProfilingLevelOperation, SetProfilingLevelOptions } from './operations/set_profiling_level'; import { DbStatsOperation, DbStatsOptions } from './operations/stats'; import { ReadConcern } from './read_concern'; import { ReadPreference, ReadPreferenceLike } from './read_preference'; import { Callback, DEFAULT_PK_FACTORY, filterOptions, getTopology, MongoDBNamespace, resolveOptions } from './utils'; import { WriteConcern, WriteConcernOptions } from './write_concern'; // Allowed parameters const DB_OPTIONS_ALLOW_LIST = [ 'writeConcern', 'readPreference', 'readPreferenceTags', 'native_parser', 'forceServerObjectId', 'pkFactory', 'serializeFunctions', 'raw', 'authSource', 'ignoreUndefined', 'readConcern', 'retryMiliSeconds', 'numberOfRetries', 'loggerLevel', 'logger', 'promoteBuffers', 'promoteLongs', 'bsonRegExp', 'enableUtf8Validation', 'promoteValues', 'compression', 'retryWrites' ]; /** @internal */ export interface DbPrivate { client: MongoClient; options?: DbOptions; logger: Logger; readPreference?: ReadPreference; pkFactory: PkFactory; readConcern?: ReadConcern; bsonOptions: BSONSerializeOptions; writeConcern?: WriteConcern; namespace: MongoDBNamespace; } /** @public */ export interface DbOptions extends BSONSerializeOptions, WriteConcernOptions, LoggerOptions { /** If the database authentication is dependent on another databaseName. */ authSource?: string; /** Force server to assign _id values instead of driver. */ forceServerObjectId?: boolean; /** The preferred read preference (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, ReadPreference.SECONDARY, ReadPreference.SECONDARY_PREFERRED, ReadPreference.NEAREST). */ readPreference?: ReadPreferenceLike; /** A primary key factory object for generation of custom _id keys. */ pkFactory?: PkFactory; /** Specify a read concern for the collection. (only MongoDB 3.2 or higher supported) */ readConcern?: ReadConcern; /** Should retry failed writes */ retryWrites?: boolean; } /** * The **Db** class is a class that represents a MongoDB Database. * @public * * @example * ```ts * import { MongoClient } from 'mongodb'; * * interface Pet { * name: string; * kind: 'dog' | 'cat' | 'fish'; * } * * const client = new MongoClient('mongodb://localhost:27017'); * const db = client.db(); * * // Create a collection that validates our union * await db.createCollection('pets', { * validator: { $expr: { $in: ['$kind', ['dog', 'cat', 'fish']] } } * }) * ``` */ export class Db { /** @internal */ s: DbPrivate; public static SYSTEM_NAMESPACE_COLLECTION = CONSTANTS.SYSTEM_NAMESPACE_COLLECTION; public static SYSTEM_INDEX_COLLECTION = CONSTANTS.SYSTEM_INDEX_COLLECTION; public static SYSTEM_PROFILE_COLLECTION = CONSTANTS.SYSTEM_PROFILE_COLLECTION; public static SYSTEM_USER_COLLECTION = CONSTANTS.SYSTEM_USER_COLLECTION; public static SYSTEM_COMMAND_COLLECTION = CONSTANTS.SYSTEM_COMMAND_COLLECTION; public static SYSTEM_JS_COLLECTION = CONSTANTS.SYSTEM_JS_COLLECTION; /** * Creates a new Db instance * * @param client - The MongoClient for the database. * @param databaseName - The name of the database this instance represents. * @param options - Optional settings for Db construction */ constructor(client: MongoClient, databaseName: string, options?: DbOptions) { options = options ?? {}; // Filter the options options = filterOptions(options, DB_OPTIONS_ALLOW_LIST); // Ensure we have a valid db name validateDatabaseName(databaseName); // Internal state of the db object this.s = { // Client client, // Options options, // Logger instance logger: new Logger('Db', options), // Unpack read preference readPreference: ReadPreference.fromOptions(options), // Merge bson options bsonOptions: resolveBSONOptions(options, client), // Set up the primary key factory or fallback to ObjectId pkFactory: options?.pkFactory ?? DEFAULT_PK_FACTORY, // ReadConcern readConcern: ReadConcern.fromOptions(options), writeConcern: WriteConcern.fromOptions(options), // Namespace namespace: new MongoDBNamespace(databaseName) }; } get databaseName(): string { return this.s.namespace.db; } // Options get options(): DbOptions | undefined { return this.s.options; } /** * slaveOk specified * @deprecated Use secondaryOk instead */ get slaveOk(): boolean { return this.secondaryOk; } /** * Check if a secondary can be used (because the read preference is *not* set to primary) */ get secondaryOk(): boolean { return this.s.readPreference?.preference !== 'primary' || false; } get readConcern(): ReadConcern | undefined { return this.s.readConcern; } /** * The current readPreference of the Db. If not explicitly defined for * this Db, will be inherited from the parent MongoClient */ get readPreference(): ReadPreference { if (this.s.readPreference == null) { return this.s.client.readPreference; } return this.s.readPreference; } get bsonOptions(): BSONSerializeOptions { return this.s.bsonOptions; } // get the write Concern get writeConcern(): WriteConcern | undefined { return this.s.writeConcern; } get namespace(): string { return this.s.namespace.toString(); } /** * Create a new collection on a server with the specified options. Use this to create capped collections. * More information about command options available at https://docs.mongodb.com/manual/reference/command/create/ * * @param name - The name of the collection to create * @param options - Optional settings for the command * @param callback - An optional callback, a Promise will be returned if none is provided */ createCollection( name: string, options?: CreateCollectionOptions ): Promise>; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ createCollection( name: string, callback: Callback> ): void; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ createCollection( name: string, options: CreateCollectionOptions | undefined, callback: Callback> ): void; createCollection( name: string, options?: CreateCollectionOptions | Callback, callback?: Callback ): Promise> | void { if (typeof options === 'function') (callback = options), (options = {}); return executeOperation( this.s.client, new CreateCollectionOperation(this, name, resolveOptions(this, options)) as TODO_NODE_3286, callback ) as TODO_NODE_3286; } /** * Execute a command * * @remarks * This command does not inherit options from the MongoClient. * * @param command - The command to run * @param options - Optional settings for the command * @param callback - An optional callback, a Promise will be returned if none is provided */ command(command: Document): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ command(command: Document, callback: Callback): void; command(command: Document, options: RunCommandOptions): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ command(command: Document, options: RunCommandOptions, callback: Callback): void; command( command: Document, options?: RunCommandOptions | Callback, callback?: Callback ): Promise | void { if (typeof options === 'function') (callback = options), (options = {}); // Intentionally, we do not inherit options from parent for this operation. return executeOperation( this.s.client, new RunCommandOperation(this, command, options ?? {}), callback ); } /** * Execute an aggregation framework pipeline against the database, needs MongoDB \>= 3.6 * * @param pipeline - An array of aggregation stages to be executed * @param options - Optional settings for the command */ aggregate( pipeline: Document[] = [], options?: AggregateOptions ): AggregationCursor { if (arguments.length > 2) { throw new MongoInvalidArgumentError('Method "db.aggregate()" accepts at most two arguments'); } if (typeof pipeline === 'function') { throw new MongoInvalidArgumentError('Argument "pipeline" must not be function'); } if (typeof options === 'function') { throw new MongoInvalidArgumentError('Argument "options" must not be function'); } return new AggregationCursor( this.s.client, this.s.namespace, pipeline, resolveOptions(this, options) ); } /** Return the Admin db instance */ admin(): Admin { return new Admin(this); } /** * Returns a reference to a MongoDB Collection. If it does not exist it will be created implicitly. * * @param name - the collection name we wish to access. * @returns return the new Collection instance */ collection( name: string, options: CollectionOptions = {} ): Collection { if (typeof options === 'function') { throw new MongoInvalidArgumentError('The callback form of this helper has been removed.'); } const finalOptions = resolveOptions(this, options); return new Collection(this, name, finalOptions); } /** * Get all the db statistics. * * @param options - Optional settings for the command * @param callback - An optional callback, a Promise will be returned if none is provided */ stats(): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ stats(callback: Callback): void; stats(options: DbStatsOptions): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ stats(options: DbStatsOptions, callback: Callback): void; stats( options?: DbStatsOptions | Callback, callback?: Callback ): Promise | void { if (typeof options === 'function') (callback = options), (options = {}); return executeOperation( this.s.client, new DbStatsOperation(this, resolveOptions(this, options)), callback ); } /** * List all collections of this database with optional filter * * @param filter - Query to filter collections by * @param options - Optional settings for the command */ listCollections( filter: Document, options: Exclude & { nameOnly: true } ): ListCollectionsCursor>; listCollections( filter: Document, options: Exclude & { nameOnly: false } ): ListCollectionsCursor; listCollections< T extends Pick | CollectionInfo = | Pick | CollectionInfo >(filter?: Document, options?: ListCollectionsOptions): ListCollectionsCursor; listCollections< T extends Pick | CollectionInfo = | Pick | CollectionInfo >(filter: Document = {}, options: ListCollectionsOptions = {}): ListCollectionsCursor { return new ListCollectionsCursor(this, filter, resolveOptions(this, options)); } /** * Rename a collection. * * @remarks * This operation does not inherit options from the MongoClient. * * @param fromCollection - Name of current collection to rename * @param toCollection - New name of of the collection * @param options - Optional settings for the command * @param callback - An optional callback, a Promise will be returned if none is provided */ renameCollection( fromCollection: string, toCollection: string ): Promise>; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ renameCollection( fromCollection: string, toCollection: string, callback: Callback> ): void; renameCollection( fromCollection: string, toCollection: string, options: RenameOptions ): Promise>; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ renameCollection( fromCollection: string, toCollection: string, options: RenameOptions, callback: Callback> ): void; renameCollection( fromCollection: string, toCollection: string, options?: RenameOptions | Callback>, callback?: Callback> ): Promise> | void { if (typeof options === 'function') (callback = options), (options = {}); // Intentionally, we do not inherit options from parent for this operation. options = { ...options, readPreference: ReadPreference.PRIMARY }; // Add return new collection options.new_collection = true; return executeOperation( this.s.client, new RenameOperation( this.collection(fromCollection) as TODO_NODE_3286, toCollection, options ) as TODO_NODE_3286, callback ); } /** * Drop a collection from the database, removing it permanently. New accesses will create a new collection. * * @param name - Name of collection to drop * @param options - Optional settings for the command * @param callback - An optional callback, a Promise will be returned if none is provided */ dropCollection(name: string): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ dropCollection(name: string, callback: Callback): void; dropCollection(name: string, options: DropCollectionOptions): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ dropCollection(name: string, options: DropCollectionOptions, callback: Callback): void; dropCollection( name: string, options?: DropCollectionOptions | Callback, callback?: Callback ): Promise | void { if (typeof options === 'function') (callback = options), (options = {}); return executeOperation( this.s.client, new DropCollectionOperation(this, name, resolveOptions(this, options)), callback ); } /** * Drop a database, removing it permanently from the server. * * @param options - Optional settings for the command * @param callback - An optional callback, a Promise will be returned if none is provided */ dropDatabase(): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ dropDatabase(callback: Callback): void; dropDatabase(options: DropDatabaseOptions): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ dropDatabase(options: DropDatabaseOptions, callback: Callback): void; dropDatabase( options?: DropDatabaseOptions | Callback, callback?: Callback ): Promise | void { if (typeof options === 'function') (callback = options), (options = {}); return executeOperation( this.s.client, new DropDatabaseOperation(this, resolveOptions(this, options)), callback ); } /** * Fetch all collections for the current db. * * @param options - Optional settings for the command * @param callback - An optional callback, a Promise will be returned if none is provided */ collections(): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ collections(callback: Callback): void; collections(options: ListCollectionsOptions): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ collections(options: ListCollectionsOptions, callback: Callback): void; collections( options?: ListCollectionsOptions | Callback, callback?: Callback ): Promise | void { if (typeof options === 'function') (callback = options), (options = {}); return executeOperation( this.s.client, new CollectionsOperation(this, resolveOptions(this, options)), callback ); } /** * Creates an index on the db and collection. * * @param name - Name of the collection to create the index on. * @param indexSpec - Specify the field to index, or an index specification * @param options - Optional settings for the command * @param callback - An optional callback, a Promise will be returned if none is provided */ createIndex(name: string, indexSpec: IndexSpecification): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ createIndex(name: string, indexSpec: IndexSpecification, callback: Callback): void; createIndex( name: string, indexSpec: IndexSpecification, options: CreateIndexesOptions ): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ createIndex( name: string, indexSpec: IndexSpecification, options: CreateIndexesOptions, callback: Callback ): void; createIndex( name: string, indexSpec: IndexSpecification, options?: CreateIndexesOptions | Callback, callback?: Callback ): Promise | void { if (typeof options === 'function') (callback = options), (options = {}); return executeOperation( this.s.client, new CreateIndexOperation(this, name, indexSpec, resolveOptions(this, options)), callback ); } /** * Add a user to the database * * @param username - The username for the new user * @param password - An optional password for the new user * @param options - Optional settings for the command * @param callback - An optional callback, a Promise will be returned if none is provided */ addUser(username: string): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ addUser(username: string, callback: Callback): void; addUser(username: string, password: string): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ addUser(username: string, password: string, callback: Callback): void; addUser(username: string, options: AddUserOptions): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ addUser(username: string, options: AddUserOptions, callback: Callback): void; addUser(username: string, password: string, options: AddUserOptions): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ addUser( username: string, password: string, options: AddUserOptions, callback: Callback ): void; addUser( username: string, password?: string | AddUserOptions | Callback, options?: AddUserOptions | Callback, callback?: Callback ): Promise | void { if (typeof password === 'function') { (callback = password), (password = undefined), (options = {}); } else if (typeof password !== 'string') { if (typeof options === 'function') { (callback = options), (options = password), (password = undefined); } else { (options = password), (callback = undefined), (password = undefined); } } else { if (typeof options === 'function') (callback = options), (options = {}); } return executeOperation( this.s.client, new AddUserOperation(this, username, password, resolveOptions(this, options)), callback ); } /** * Remove a user from a database * * @param username - The username to remove * @param options - Optional settings for the command * @param callback - An optional callback, a Promise will be returned if none is provided */ removeUser(username: string): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ removeUser(username: string, callback: Callback): void; removeUser(username: string, options: RemoveUserOptions): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ removeUser(username: string, options: RemoveUserOptions, callback: Callback): void; removeUser( username: string, options?: RemoveUserOptions | Callback, callback?: Callback ): Promise | void { if (typeof options === 'function') (callback = options), (options = {}); return executeOperation( this.s.client, new RemoveUserOperation(this, username, resolveOptions(this, options)), callback ); } /** * Set the current profiling level of MongoDB * * @param level - The new profiling level (off, slow_only, all). * @param options - Optional settings for the command * @param callback - An optional callback, a Promise will be returned if none is provided */ setProfilingLevel(level: ProfilingLevel): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ setProfilingLevel(level: ProfilingLevel, callback: Callback): void; setProfilingLevel( level: ProfilingLevel, options: SetProfilingLevelOptions ): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ setProfilingLevel( level: ProfilingLevel, options: SetProfilingLevelOptions, callback: Callback ): void; setProfilingLevel( level: ProfilingLevel, options?: SetProfilingLevelOptions | Callback, callback?: Callback ): Promise | void { if (typeof options === 'function') (callback = options), (options = {}); return executeOperation( this.s.client, new SetProfilingLevelOperation(this, level, resolveOptions(this, options)), callback ); } /** * Retrieve the current profiling Level for MongoDB * * @param options - Optional settings for the command * @param callback - An optional callback, a Promise will be returned if none is provided */ profilingLevel(): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ profilingLevel(callback: Callback): void; profilingLevel(options: ProfilingLevelOptions): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ profilingLevel(options: ProfilingLevelOptions, callback: Callback): void; profilingLevel( options?: ProfilingLevelOptions | Callback, callback?: Callback ): Promise | void { if (typeof options === 'function') (callback = options), (options = {}); return executeOperation( this.s.client, new ProfilingLevelOperation(this, resolveOptions(this, options)), callback ); } /** * Retrieves this collections index info. * * @param name - The name of the collection. * @param options - Optional settings for the command * @param callback - An optional callback, a Promise will be returned if none is provided */ indexInformation(name: string): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ indexInformation(name: string, callback: Callback): void; indexInformation(name: string, options: IndexInformationOptions): Promise; /** @deprecated Callbacks are deprecated and will be removed in the next major version. See [mongodb-legacy](https://github.com/mongodb-js/nodejs-mongodb-legacy) for migration assistance */ indexInformation( name: string, options: IndexInformationOptions, callback: Callback ): void; indexInformation( name: string, options?: IndexInformationOptions | Callback, callback?: Callback ): Promise | void { if (typeof options === 'function') (callback = options), (options = {}); return executeOperation( this.s.client, new IndexInformationOperation(this, name, resolveOptions(this, options)), callback ); } /** * Unref all sockets * @deprecated This function is deprecated and will be removed in the next major version. */ unref(): void { getTopology(this).unref(); } /** * Create a new Change Stream, watching for new changes (insertions, updates, * replacements, deletions, and invalidations) in this database. Will ignore all * changes to system collections. * * @remarks * watch() accepts two generic arguments for distinct usecases: * - The first is to provide the schema that may be defined for all the collections within this database * - The second is to override the shape of the change stream document entirely, if it is not provided the type will default to ChangeStreamDocument of the first argument * * @param pipeline - An array of {@link https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/|aggregation pipeline stages} through which to pass change stream documents. This allows for filtering (using $match) and manipulating the change stream documents. * @param options - Optional settings for the command * @typeParam TSchema - Type of the data being detected by the change stream * @typeParam TChange - Type of the whole change stream document emitted */ watch< TSchema extends Document = Document, TChange extends Document = ChangeStreamDocument >(pipeline: Document[] = [], options: ChangeStreamOptions = {}): ChangeStream { // Allow optionally not specifying a pipeline if (!Array.isArray(pipeline)) { options = pipeline; pipeline = []; } return new ChangeStream(this, pipeline, resolveOptions(this, options)); } /** Return the db logger */ getLogger(): Logger { return this.s.logger; } get logger(): Logger { return this.s.logger; } } // TODO(NODE-3484): Refactor into MongoDBNamespace // Validate the database name function validateDatabaseName(databaseName: string) { if (typeof databaseName !== 'string') throw new MongoInvalidArgumentError('Database name must be a string'); if (databaseName.length === 0) throw new MongoInvalidArgumentError('Database name cannot be the empty string'); if (databaseName === '$external') return; const invalidChars = [' ', '.', '$', '/', '\\']; for (let i = 0; i < invalidChars.length; i++) { if (databaseName.indexOf(invalidChars[i]) !== -1) throw new MongoAPIError(`database names cannot contain the character '${invalidChars[i]}'`); } }