Skip to content

Commit 95a03cb

Browse files
authored
Merge pull request #15368 from Automattic/vkarpov15/gh-15359
types(connection): add Connection.prototype.bulkWrite() to types
2 parents c5393d1 + d2f3f75 commit 95a03cb

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

test/connection.test.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1720,7 +1720,8 @@ describe('connections:', function() {
17201720
const Test = db.model('Test', new Schema({ name: { type: String, required: true } }));
17211721

17221722
await Test.deleteMany({});
1723-
await db.bulkWrite([{ model: 'Test', name: 'insertOne', document: { name: 'test1' } }]);
1723+
const res = await db.bulkWrite([{ model: 'Test', name: 'insertOne', document: { name: 'test1' } }]);
1724+
assert.equal(res.insertedCount, 1);
17241725
assert.ok(await Test.exists({ name: 'test1' }));
17251726

17261727
await db.bulkWrite([{ model: Test, name: 'insertOne', document: { name: 'test2' } }]);

test/types/connection.test.ts

+17
Original file line numberDiff line numberDiff line change
@@ -154,3 +154,20 @@ function schemaInstanceMethodsAndQueryHelpersOnConnection() {
154154

155155
const TestModel = connection.model<User, UserModel, UserQueryHelpers>('User', userSchema);
156156
}
157+
158+
async function gh15359() {
159+
const res = await conn.bulkWrite([{ model: 'Test', name: 'insertOne', document: { name: 'test1' } }]);
160+
expectType<number>(res.insertedCount);
161+
expectError(res.mongoose.validationErrors);
162+
163+
const res2 = await conn.bulkWrite([{ model: 'Test', name: 'insertOne', document: { name: 'test2' } }], { ordered: false });
164+
expectType<number>(res2.insertedCount);
165+
expectType<Error[] | undefined>(res2.mongoose?.validationErrors);
166+
167+
const res3 = await conn.bulkWrite([
168+
{ model: 'Test', name: 'updateOne', filter: { name: 'test5' }, update: { $set: { num: 42 } } },
169+
{ model: 'Test', name: 'updateOne', filter: { name: 'test4' }, update: { $set: { num: 'not a number' } } }
170+
], { ordered: false });
171+
expectType<number>(res3.insertedCount);
172+
expectType<Error[] | undefined>(res3.mongoose?.validationErrors);
173+
}

types/connection.d.ts

+22
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,34 @@ declare module 'mongoose' {
5858
sanitizeFilter?: boolean;
5959
}
6060

61+
export type AnyConnectionBulkWriteModel<TSchema extends AnyObject> = Omit<mongodb.ClientInsertOneModel<TSchema>, 'namespace'>
62+
| Omit<mongodb.ClientReplaceOneModel<TSchema>, 'namespace'>
63+
| Omit<mongodb.ClientUpdateOneModel<TSchema>, 'namespace'>
64+
| Omit<mongodb.ClientUpdateManyModel<TSchema>, 'namespace'>
65+
| Omit<mongodb.ClientDeleteOneModel<TSchema>, 'namespace'>
66+
| Omit<mongodb.ClientDeleteManyModel<TSchema>, 'namespace'>;
67+
68+
export type ConnectionBulkWriteModel<SchemaMap extends Record<string, AnyObject> = Record<string, AnyObject>> = {
69+
[ModelName in keyof SchemaMap]: AnyConnectionBulkWriteModel<SchemaMap[ModelName]> & {
70+
model: ModelName;
71+
};
72+
}[keyof SchemaMap];
73+
6174
class Connection extends events.EventEmitter implements SessionStarter {
6275
aggregate<ResultType = unknown>(pipeline?: PipelineStage[] | null, options?: AggregateOptions): Aggregate<Array<ResultType>>;
6376

6477
/** Returns a promise that resolves when this connection successfully connects to MongoDB */
6578
asPromise(): Promise<this>;
6679

80+
bulkWrite<TSchemaMap extends Record<string, AnyObject>>(
81+
ops: Array<ConnectionBulkWriteModel<TSchemaMap>>,
82+
options: mongodb.ClientBulkWriteOptions & { ordered: false }
83+
): Promise<mongodb.ClientBulkWriteResult & { mongoose?: { validationErrors: Error[], results: Array<Error | mongodb.WriteError | null> } }>;
84+
bulkWrite<TSchemaMap extends Record<string, AnyObject>>(
85+
ops: Array<ConnectionBulkWriteModel<TSchemaMap>>,
86+
options?: mongodb.ClientBulkWriteOptions
87+
): Promise<mongodb.ClientBulkWriteResult>;
88+
6789
/** Closes the connection */
6890
close(force?: boolean): Promise<void>;
6991

0 commit comments

Comments
 (0)