From 08d91d155d3926927d542781319f6e15ef31f21f Mon Sep 17 00:00:00 2001 From: Brian Evans <53117772+mrbrianevans@users.noreply.github.com> Date: Thu, 23 Sep 2021 13:28:17 +0100 Subject: [PATCH 1/6] Added event typing for change streams Added typescript generic typing to ChangeStreamEvents --- src/change_stream.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/change_stream.ts b/src/change_stream.ts index 60b7cf7500..f3e7767fab 100644 --- a/src/change_stream.ts +++ b/src/change_stream.ts @@ -184,14 +184,14 @@ export interface UpdateDescription { } /** @public */ -export type ChangeStreamEvents = { +export type ChangeStreamEvents = { resumeTokenChanged(token: ResumeToken): void; - init(response: Document): void; - more(response?: Document | undefined): void; + init(response: TSchema): void; + more(response?: TSchema | undefined): void; response(): void; end(): void; error(error: Error): void; - change(change: ChangeStreamDocument): void; + change(change: ChangeStreamDocument): void; } & AbstractCursorEvents; /** @@ -200,7 +200,7 @@ export type ChangeStreamEvents = { */ export class ChangeStream< TSchema extends Document = Document -> extends TypedEventEmitter { +> extends TypedEventEmitter> { pipeline: Document[]; options: ChangeStreamOptions; parent: MongoClient | Db | Collection; From 53123fe790448d79a8dbb3977bc977f3150765ee Mon Sep 17 00:00:00 2001 From: Brian Evans Date: Fri, 22 Oct 2021 13:49:43 +0100 Subject: [PATCH 2/6] style(NODE-3692): fix eslint formatting Signed-off-by: Brian Evans --- src/change_stream.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/change_stream.ts b/src/change_stream.ts index f3e7767fab..684eec7097 100644 --- a/src/change_stream.ts +++ b/src/change_stream.ts @@ -198,9 +198,9 @@ export type ChangeStreamEvents = { * Creates a new Change Stream instance. Normally created using {@link Collection#watch|Collection.watch()}. * @public */ -export class ChangeStream< - TSchema extends Document = Document -> extends TypedEventEmitter> { +export class ChangeStream extends TypedEventEmitter< + ChangeStreamEvents +> { pipeline: Document[]; options: ChangeStreamOptions; parent: MongoClient | Db | Collection; From 42339e52b6fb64c37906495601731b4a6abfb293 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Tue, 9 Nov 2021 16:21:26 +0100 Subject: [PATCH 3/6] test(NODE-3692): add type tests --- test/types/mongodb.test-d.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/types/mongodb.test-d.ts b/test/types/mongodb.test-d.ts index 3ec4f79db5..267ded4108 100644 --- a/test/types/mongodb.test-d.ts +++ b/test/types/mongodb.test-d.ts @@ -3,6 +3,7 @@ import { MongoClient } from '../../src/mongo_client'; import { Collection } from '../../src/collection'; import { AggregationCursor } from '../../src/cursor/aggregation_cursor'; import type { FindCursor } from '../../src/cursor/find_cursor'; +import type { ChangeStream, ChangeStreamDocument } from '../../src/change_stream'; import type { Document } from 'bson'; import { Db } from '../../src'; import { Topology } from '../../src/sdam/topology'; @@ -38,6 +39,16 @@ const composedMap = mappedAgg.map(x => x.toString()); expectType>(composedMap); expectType(await composedMap.next()); expectType(await composedMap.toArray()); +const changeStream = coll.watch(); +changeStream.on('init', (doc) => { + expectType(doc); +}); +changeStream.on('more', (doc) => { + expectType(doc); +}); +changeStream.on('change', (doc) => { + expectType>(doc); +}); const builtCursor = coll.aggregate(); // should allow string values for the out helper From 0a2bcef9c2c53f814f9d1041158e87b7929467e9 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Wed, 10 Nov 2021 13:47:01 +0100 Subject: [PATCH 4/6] test(NODE-3692): update to check TSchema --- test/types/mongodb.test-d.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/test/types/mongodb.test-d.ts b/test/types/mongodb.test-d.ts index 267ded4108..ea8f26c16a 100644 --- a/test/types/mongodb.test-d.ts +++ b/test/types/mongodb.test-d.ts @@ -3,7 +3,7 @@ import { MongoClient } from '../../src/mongo_client'; import { Collection } from '../../src/collection'; import { AggregationCursor } from '../../src/cursor/aggregation_cursor'; import type { FindCursor } from '../../src/cursor/find_cursor'; -import type { ChangeStream, ChangeStreamDocument } from '../../src/change_stream'; +import type { ChangeStreamDocument } from '../../src/change_stream'; import type { Document } from 'bson'; import { Db } from '../../src'; import { Topology } from '../../src/sdam/topology'; @@ -20,6 +20,9 @@ expectDeprecated(Db.prototype.unref); expectDeprecated(MongoDBDriver.ObjectID); expectNotDeprecated(MongoDBDriver.ObjectId); +interface TSchema extends Document { +} + // test mapped cursor types const client = new MongoClient(''); const coll = client.db('test').collection('test'); @@ -40,14 +43,14 @@ expectType>(composedMap); expectType(await composedMap.next()); expectType(await composedMap.toArray()); const changeStream = coll.watch(); -changeStream.on('init', (doc) => { - expectType(doc); +changeStream.on('init', doc => { + expectType(doc); }); -changeStream.on('more', (doc) => { - expectType(doc); +changeStream.on('more', doc => { + expectType(doc); }); -changeStream.on('change', (doc) => { - expectType>(doc); +changeStream.on('change', doc => { + expectType>(doc); }); const builtCursor = coll.aggregate(); From 4a3003a74b84fb5325e6fb6d6c0a885f9237e0a6 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Wed, 10 Nov 2021 14:27:14 +0100 Subject: [PATCH 5/6] test(NODE-3692): fix lint errors --- test/types/mongodb.test-d.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/types/mongodb.test-d.ts b/test/types/mongodb.test-d.ts index ea8f26c16a..19b119b881 100644 --- a/test/types/mongodb.test-d.ts +++ b/test/types/mongodb.test-d.ts @@ -21,11 +21,13 @@ expectDeprecated(MongoDBDriver.ObjectID); expectNotDeprecated(MongoDBDriver.ObjectId); interface TSchema extends Document { + name?: string; } // test mapped cursor types const client = new MongoClient(''); -const coll = client.db('test').collection('test'); +const db = client.db('test'); +const coll = db.collection('test'); const findCursor = coll.find(); expectType(await findCursor.next()); const mappedFind = findCursor.map(obj => Object.keys(obj).length); @@ -42,7 +44,8 @@ const composedMap = mappedAgg.map(x => x.toString()); expectType>(composedMap); expectType(await composedMap.next()); expectType(await composedMap.toArray()); -const changeStream = coll.watch(); +const tschemaColl = db.collection('test'); +const changeStream = tschemaColl.watch(); changeStream.on('init', doc => { expectType(doc); }); From 0f0fa276cbda6078d59a6010e020dc47d573183f Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Wed, 10 Nov 2021 17:25:40 +0100 Subject: [PATCH 6/6] fix(NODE-3692): make TSchema attribute non optional --- test/types/mongodb.test-d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/types/mongodb.test-d.ts b/test/types/mongodb.test-d.ts index 19b119b881..204c5ca934 100644 --- a/test/types/mongodb.test-d.ts +++ b/test/types/mongodb.test-d.ts @@ -21,7 +21,7 @@ expectDeprecated(MongoDBDriver.ObjectID); expectNotDeprecated(MongoDBDriver.ObjectId); interface TSchema extends Document { - name?: string; + name: string; } // test mapped cursor types