diff --git a/packages/shell-api/src/bulk.ts b/packages/shell-api/src/bulk.ts index c289b1414..4d01872b1 100644 --- a/packages/shell-api/src/bulk.ts +++ b/packages/shell-api/src/bulk.ts @@ -21,6 +21,7 @@ import { asPrintable } from './enums'; import { assertArgsDefinedType, shallowClone } from './helpers'; import { BulkWriteResult } from './result'; import type { CollectionWithSchema } from './collection'; +import type { MQLDocument, MQLQuery } from './mql-types'; @shellApiClassDefault export class BulkFindOp extends ShellApiWithMongoClass { @@ -202,14 +203,14 @@ export default class Bulk extends ShellApiWithMongoClass { @returnType('BulkFindOp') @apiVersions([1]) - find(query: Document): BulkFindOp { + find(query: MQLQuery): BulkFindOp { assertArgsDefinedType([query], [true], 'Bulk.find'); return new BulkFindOp(this._serviceProviderBulkOp.find(query), this); } @returnType('Bulk') @apiVersions([1]) - insert(document: Document): Bulk { + insert(document: MQLDocument): Bulk { this._batchCounts.nInsertOps++; assertArgsDefinedType([document], [true], 'Bulk.insert'); this._serviceProviderBulkOp.insert(document); diff --git a/packages/shell-api/src/collection.ts b/packages/shell-api/src/collection.ts index 5b4db3941..26682438d 100644 --- a/packages/shell-api/src/collection.ts +++ b/packages/shell-api/src/collection.ts @@ -96,6 +96,7 @@ import { HIDDEN_COMMANDS } from '@mongosh/history'; import PlanCache from './plan-cache'; import ChangeStreamCursor from './change-stream-cursor'; import { ShellApiErrors } from './error-codes'; +import type { MQLDocument, MQLQuery, MQLPipeline } from './mql-types'; export type CollectionWithSchema< M extends GenericServerSideSchema = GenericServerSideSchema, @@ -116,6 +117,7 @@ export type CollectionWithSchema< export class Collection< M extends GenericServerSideSchema = GenericServerSideSchema, D extends GenericDatabaseSchema = M[keyof M], + // eslint-disable-next-line @typescript-eslint/no-unused-vars C extends GenericCollectionSchema = D[keyof D], N extends StringKey = StringKey > extends ShellApiWithMongoClass { @@ -188,20 +190,20 @@ export class Collection< * @returns {Promise} The promise of aggregation results. */ async aggregate( - pipeline: Document[], + pipeline: MQLPipeline, options: AggregateOptions & { explain: ExplainVerbosityLike } ): Promise; async aggregate( - pipeline: Document[], + pipeline: MQLPipeline, options?: AggregateOptions ): Promise; - async aggregate(...stages: Document[]): Promise; + async aggregate(...stages: MQLPipeline): Promise; @returnsPromise @returnType('AggregationCursor') @apiVersions([1]) async aggregate(...args: unknown[]): Promise { let options: AggregateOptions; - let pipeline: Document[]; + let pipeline: MQLPipeline; if (args.length === 0 || Array.isArray(args[0])) { options = args[1] || {}; pipeline = (args[0] as Document[]) || []; @@ -320,7 +322,7 @@ export class Collection< @serverVersions(['4.0.3', ServerVersions.latest]) @apiVersions([1]) async countDocuments( - query?: Document, + query?: MQLQuery, options: CountDocumentsOptions = {} ): Promise { this._emitCollectionApiCall('countDocuments', { query, options }); @@ -413,17 +415,17 @@ export class Collection< * @returns {Array} The promise of the result. */ async distinct(field: string): Promise; - async distinct(field: string, query: Document): Promise; + async distinct(field: string, query: MQLQuery): Promise; async distinct( field: string, - query: Document, + query: MQLQuery, options: DistinctOptions ): Promise; @returnsPromise @apiVersions([]) async distinct( field: string, - query?: Document, + query?: MQLQuery, options: DistinctOptions = {} ): Promise { this._emitCollectionApiCall('distinct', { field, query, options }); @@ -476,7 +478,7 @@ export class Collection< @apiVersions([1]) @returnsPromise async find( - query?: Document, + query?: MQLQuery, projection?: Document, options: FindOptions = {} ): Promise { @@ -560,10 +562,10 @@ export class Collection< @returnType('Document') @apiVersions([1]) async findOne( - query: Document = {}, + query: MQLQuery = {}, projection?: Document, options: FindOptions = {} - ): Promise { + ): Promise { if (projection) { options.projection = projection; } @@ -757,7 +759,7 @@ export class Collection< @serverVersions([ServerVersions.earliest, '3.6.0']) @apiVersions([1]) async insert( - docs: Document | Document[], + docs: MQLDocument | MQLDocument[], options: BulkWriteOptions = {} ): Promise { await this._instanceState.printDeprecationWarning( @@ -801,7 +803,7 @@ export class Collection< @serverVersions(['3.2.0', ServerVersions.latest]) @apiVersions([1]) async insertMany( - docs: Document[], + docs: MQLDocument[], options: BulkWriteOptions = {} ): Promise { assertArgsDefinedType([docs], [true], 'Collection.insertMany'); @@ -837,7 +839,7 @@ export class Collection< @serverVersions(['3.2.0', ServerVersions.latest]) @apiVersions([1]) async insertOne( - doc: Document, + doc: MQLDocument, options: InsertOneOptions = {} ): Promise { assertArgsDefinedType([doc], [true], 'Collection.insertOne'); @@ -893,7 +895,7 @@ export class Collection< @serverVersions([ServerVersions.earliest, '3.2.0']) @apiVersions([1]) async remove( - query: Document, + query: MQLQuery, options: boolean | RemoveShellOptions = {} ): Promise { await this._instanceState.printDeprecationWarning( @@ -2332,7 +2334,7 @@ export class Collection< @apiVersions([1]) @returnsPromise async watch( - pipeline: Document[] | ChangeStreamOptions = [], + pipeline: MQLPipeline | ChangeStreamOptions = [], options: ChangeStreamOptions = {} ): Promise { if (!Array.isArray(pipeline)) { diff --git a/packages/shell-api/src/database.ts b/packages/shell-api/src/database.ts index ccdb61ec5..4f4414c03 100644 --- a/packages/shell-api/src/database.ts +++ b/packages/shell-api/src/database.ts @@ -61,6 +61,7 @@ import type { ExplainVerbosityLike, AggregateOptions, } from '@mongosh/service-provider-core'; +import type { MQLPipeline } from './mql-types'; export type CollectionNamesWithTypes = { name: string; @@ -443,26 +444,26 @@ export class Database< * @returns {Promise} The promise of aggregation results. */ async aggregate( - pipeline: Document[], + pipeline: MQLPipeline, options: AggregateOptions & { explain: ExplainVerbosityLike } ): Promise; async aggregate( - pipeline: Document[], + pipeline: MQLPipeline, options?: AggregateOptions ): Promise; - async aggregate(...stages: Document[]): Promise; + async aggregate(...stages: MQLPipeline): Promise; @returnsPromise @returnType('AggregationCursor') @apiVersions([1]) async aggregate(...args: unknown[]): Promise { let options: AggregateOptions; - let pipeline: Document[]; + let pipeline: MQLPipeline; if (args.length === 0 || Array.isArray(args[0])) { options = args[1] || {}; - pipeline = (args[0] as Document[]) || []; + pipeline = (args[0] as MQLPipeline) || []; } else { options = {}; - pipeline = (args as Document[]) || []; + pipeline = (args as MQLPipeline) || []; } if ('background' in options) { @@ -855,7 +856,7 @@ export class Database< async createView( name: string, source: string, - pipeline: Document[], + pipeline: MQLPipeline, options: CreateCollectionOptions = {} ): Promise<{ ok: number }> { assertArgsDefinedType( @@ -1085,7 +1086,7 @@ export class Database< ? { $all: opts, $ownOps: false } : { $all: !!opts.$all, $ownOps: !!opts.$ownOps }; - const pipeline: Document[] = [ + const pipeline: MQLPipeline = [ { $currentOp: { allUsers: !legacyCurrentOpOptions.$ownOps, @@ -1739,7 +1740,7 @@ export class Database< @apiVersions([1]) @returnsPromise async watch( - pipeline: Document[] | ChangeStreamOptions = [], + pipeline: MQLPipeline | ChangeStreamOptions = [], options: ChangeStreamOptions = {} ): Promise { if (!Array.isArray(pipeline)) { diff --git a/packages/shell-api/src/explainable.ts b/packages/shell-api/src/explainable.ts index 875493267..4a6f5c79c 100644 --- a/packages/shell-api/src/explainable.ts +++ b/packages/shell-api/src/explainable.ts @@ -33,6 +33,7 @@ import type { FindOneAndUpdateOptions, FindOptions, } from '@mongosh/service-provider-core'; +import type { MQLDocument, MQLPipeline, MQLQuery } from './mql-types'; @shellApiClassDefault export default class Explainable extends ShellApiWithMongoClass { @@ -97,7 +98,7 @@ export default class Explainable extends ShellApiWithMongoClass { @apiVersions([1]) @returnsPromise async find( - query?: Document, + query?: MQLQuery, projection?: Document, options: FindOptions = {} ): Promise { @@ -107,14 +108,14 @@ export default class Explainable extends ShellApiWithMongoClass { return new ExplainableCursor(this._mongo, cursor, this._verbosity); } - async aggregate(pipeline: Document[], options: Document): Promise; - async aggregate(...stages: Document[]): Promise; + async aggregate(pipeline: MQLPipeline, options: Document): Promise; + async aggregate(...stages: MQLPipeline): Promise; @returnsPromise @apiVersions([1]) async aggregate(...args: any[]): Promise { this._emitExplainableApiCall('aggregate', { args }); let options: Document; - let pipeline: Document[]; + let pipeline: MQLPipeline; if (Array.isArray(args[0])) { pipeline = args[0]; options = args[1] ?? {}; @@ -147,17 +148,17 @@ export default class Explainable extends ShellApiWithMongoClass { } async distinct(field: string): Promise; - async distinct(field: string, query: Document): Promise; + async distinct(field: string, query: MQLQuery): Promise; async distinct( field: string, - query: Document, + query: MQLQuery, options: DistinctOptions ): Promise; @returnsPromise @apiVersions([1]) async distinct( field: string, - query?: Document, + query?: MQLQuery, options: DistinctOptions = {} ): Promise { this._emitExplainableApiCall('distinct', { field, query, options }); @@ -182,7 +183,7 @@ export default class Explainable extends ShellApiWithMongoClass { @returnsPromise @apiVersions([1]) async findOneAndDelete( - filter: Document, + filter: MQLQuery, options: FindOneAndDeleteOptions = {} ): Promise { this._emitExplainableApiCall('findOneAndDelete', { filter, options }); @@ -195,8 +196,8 @@ export default class Explainable extends ShellApiWithMongoClass { @returnsPromise @apiVersions([1]) async findOneAndReplace( - filter: Document, - replacement: Document, + filter: MQLQuery, + replacement: MQLDocument, options: FindAndModifyShellOptions = {} ): Promise { this._emitExplainableApiCall('findOneAndReplace', { filter, options }); @@ -209,8 +210,8 @@ export default class Explainable extends ShellApiWithMongoClass { @returnsPromise @apiVersions([1]) async findOneAndUpdate( - filter: Document, - update: Document, + filter: MQLQuery, + update: MQLDocument, options: FindAndModifyShellOptions = {} ): Promise { this._emitExplainableApiCall('findOneAndUpdate', { filter, options }); @@ -223,7 +224,7 @@ export default class Explainable extends ShellApiWithMongoClass { @returnsPromise @apiVersions([1]) async remove( - query: Document, + query: MQLQuery, options: boolean | RemoveShellOptions = {} ): Promise { this._emitExplainableApiCall('remove', { query, options }); diff --git a/packages/shell-api/src/helpers.ts b/packages/shell-api/src/helpers.ts index 1ab76f841..b2c5f2b5e 100644 --- a/packages/shell-api/src/helpers.ts +++ b/packages/shell-api/src/helpers.ts @@ -32,6 +32,7 @@ import type { AbstractCursor } from './abstract-cursor'; import type ChangeStreamCursor from './change-stream-cursor'; import type { ShellBson } from './shell-bson'; import { inspect } from 'util'; +import type { MQLPipeline, MQLQuery } from './mql-types'; /** * Helper method to adapt aggregation pipeline options. @@ -882,7 +883,7 @@ export async function iterate( // This is only used by collection.findAndModify() itself. export type FindAndModifyMethodShellOptions = { - query: Document; + query: MQLQuery; sort?: ( | FindOneAndDeleteOptions | FindOneAndReplaceOptions @@ -1111,7 +1112,9 @@ export function isValidCollectionName(name: string): boolean { return !!name && !/[$\0]/.test(name); } -export function shouldRunAggregationImmediately(pipeline: Document[]): boolean { +export function shouldRunAggregationImmediately( + pipeline: MQLPipeline +): boolean { return pipeline.some((stage) => Object.keys(stage).some( (stageName) => stageName === '$merge' || stageName === '$out' diff --git a/packages/shell-api/src/mongo.ts b/packages/shell-api/src/mongo.ts index 9af7198b7..e6bb28c26 100644 --- a/packages/shell-api/src/mongo.ts +++ b/packages/shell-api/src/mongo.ts @@ -67,6 +67,7 @@ import type { LogEntry } from './log-entry'; import { parseAnyLogEntry } from './log-entry'; import type { CollectionWithSchema } from './collection'; import type { ShellBson } from './shell-bson'; +import type { MQLPipeline } from './mql-types'; /* Utility, inverse of Readonly */ type Mutable = { @@ -845,7 +846,7 @@ export default class Mongo< @apiVersions([1]) @returnsPromise async watch( - pipeline: Document[] | ChangeStreamOptions = [], + pipeline: MQLPipeline | ChangeStreamOptions = [], options: ChangeStreamOptions = {} ): Promise { if (!Array.isArray(pipeline)) { diff --git a/packages/shell-api/src/mql-types.ts b/packages/shell-api/src/mql-types.ts new file mode 100644 index 000000000..1219b6e8f --- /dev/null +++ b/packages/shell-api/src/mql-types.ts @@ -0,0 +1,7 @@ +import type { Document } from '@mongosh/service-provider-core'; + +export type MQLQuery = Document; + +export type MQLPipeline = Document[]; + +export type MQLDocument = Document; diff --git a/packages/shell-api/src/plan-cache.ts b/packages/shell-api/src/plan-cache.ts index 0da8453a6..d53ba4146 100644 --- a/packages/shell-api/src/plan-cache.ts +++ b/packages/shell-api/src/plan-cache.ts @@ -11,6 +11,7 @@ import type { CollectionWithSchema } from './collection'; import { asPrintable, ServerVersions } from './enums'; import { MongoshDeprecatedError } from '@mongosh/errors'; import type Mongo from './mongo'; +import type { MQLPipeline, MQLQuery } from './mql-types'; @shellApiClassDefault export default class PlanCache extends ShellApiWithMongoClass { @@ -41,7 +42,7 @@ export default class PlanCache extends ShellApiWithMongoClass { @returnsPromise @apiVersions([]) async clearPlansByQuery( - query: Document, + query: MQLQuery, projection?: Document, sort?: Document ): Promise { @@ -58,7 +59,7 @@ export default class PlanCache extends ShellApiWithMongoClass { @serverVersions(['4.4.0', ServerVersions.latest]) @returnsPromise @apiVersions([]) - async list(pipeline?: Document[]): Promise { + async list(pipeline?: MQLPipeline): Promise { const p = pipeline || []; const agg = await this._collection.aggregate([ { $planCacheStats: {} }, diff --git a/packages/shell-api/src/shard.ts b/packages/shell-api/src/shard.ts index 67520e052..81bf3e3d7 100644 --- a/packages/shell-api/src/shard.ts +++ b/packages/shell-api/src/shard.ts @@ -31,6 +31,7 @@ import type Mongo from './mongo'; import type AggregationCursor from './aggregation-cursor'; import type RunCommandCursor from './run-command-cursor'; import semver from 'semver'; +import type { MQLQuery } from './mql-types'; @shellApiClassDefault export default class Shard< @@ -449,7 +450,7 @@ export default class Shard< @returnsPromise @apiVersions([]) - async splitAt(ns: string, query: Document): Promise { + async splitAt(ns: string, query: MQLQuery): Promise { assertArgsDefinedType([ns, query], ['string', 'object'], 'Shard.splitAt'); this._emitShardApiCall('splitAt', { ns, query }); return this._database._runAdminCommand({ @@ -460,7 +461,7 @@ export default class Shard< @returnsPromise @apiVersions([]) - async splitFind(ns: string, query: Document): Promise { + async splitFind(ns: string, query: MQLQuery): Promise { assertArgsDefinedType([ns, query], ['string', 'object'], 'Shard.splitFind'); this._emitShardApiCall('splitFind', { ns, query }); return this._database._runAdminCommand({ @@ -473,7 +474,7 @@ export default class Shard< @apiVersions([]) async moveChunk( ns: string, - query: Document, + query: MQLQuery, destination: string ): Promise { assertArgsDefinedType( diff --git a/packages/shell-api/src/stream-processor.ts b/packages/shell-api/src/stream-processor.ts index 0a436d05c..39a2cc715 100644 --- a/packages/shell-api/src/stream-processor.ts +++ b/packages/shell-api/src/stream-processor.ts @@ -10,6 +10,7 @@ import { } from './decorators'; import type { Streams } from './streams'; +import type { MQLPipeline } from './mql-types'; @shellApiClassDefault export class StreamProcessor extends ShellApiWithMongoClass { @@ -71,11 +72,11 @@ export class StreamProcessor extends ShellApiWithMongoClass { * sp.name.modify(newPipeline, {resumeFromCheckpoint: false}) */ async modify(options: Document): Promise; - async modify(pipeline: Document[], options?: Document): Promise; + async modify(pipeline: MQLPipeline, options?: Document): Promise; @returnsPromise async modify( - pipelineOrOptions: Document[] | Document, + pipelineOrOptions: MQLPipeline | Document, options?: Document ): Promise { if (Array.isArray(pipelineOrOptions)) { diff --git a/packages/shell-api/src/streams.ts b/packages/shell-api/src/streams.ts index c0963521b..1a1797909 100644 --- a/packages/shell-api/src/streams.ts +++ b/packages/shell-api/src/streams.ts @@ -11,6 +11,7 @@ import { ADMIN_DB, asPrintable, shellApiType } from './enums'; import type { Database, DatabaseWithSchema } from './database'; import type Mongo from './mongo'; import type { GenericDatabaseSchema, GenericServerSideSchema } from './helpers'; +import type { MQLPipeline } from './mql-types'; @shellApiClassDefault export class Streams< @@ -54,7 +55,7 @@ export class Streams< } @returnsPromise - async process(pipeline: Document[], options?: Document) { + async process(pipeline: MQLPipeline, options?: Document) { if (!Array.isArray(pipeline) || !pipeline.length) { throw new MongoshInvalidInputError( 'Invalid pipeline', @@ -98,7 +99,7 @@ export class Streams< @returnsPromise async createStreamProcessor( name: string, - pipeline: Document[], + pipeline: MQLPipeline, options?: Document ) { if (typeof name !== 'string' || name.trim() === '') {