ts-patch-mongoose 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -32,9 +32,35 @@ const deleteMethods = [
32
32
  'deleteOne',
33
33
  'deleteMany'
34
34
  ];
35
+ function splitUpdateAndCommands(updateQuery) {
36
+ let update = {};
37
+ const commands = [];
38
+ if (!lodash_1.default.isEmpty(updateQuery) && !lodash_1.default.isArray(updateQuery) && lodash_1.default.isObjectLike(updateQuery)) {
39
+ update = lodash_1.default.cloneDeep(updateQuery);
40
+ const keys = lodash_1.default.keys(update).filter((key) => key.startsWith('$'));
41
+ if (!lodash_1.default.isEmpty(keys)) {
42
+ lodash_1.default.forEach(keys, (key) => {
43
+ commands.push({ [key]: update[key] });
44
+ delete update[key];
45
+ });
46
+ }
47
+ }
48
+ return { update, commands };
49
+ }
50
+ function assignUpdate(document, update, commands) {
51
+ let updated = (0, power_assign_1.assign)(document, update);
52
+ lodash_1.default.forEach(commands, (command) => {
53
+ try {
54
+ updated = (0, power_assign_1.assign)(updated, command);
55
+ }
56
+ catch {
57
+ }
58
+ });
59
+ return updated;
60
+ }
35
61
  exports.patchEventEmitter = em_1.default;
36
62
  const patchHistoryPlugin = function plugin(schema, opts) {
37
- schema.pre('save', async function (next) {
63
+ schema.pre('save', async function () {
38
64
  const current = this.toObject(toObjectOptions);
39
65
  const model = this.constructor;
40
66
  const context = {
@@ -52,9 +78,8 @@ const patchHistoryPlugin = function plugin(schema, opts) {
52
78
  await (0, patch_1.updatePatch)(opts, context, current, original);
53
79
  }
54
80
  }
55
- next();
56
81
  });
57
- schema.post('insertMany', async function (docs, next) {
82
+ schema.post('insertMany', async function (docs) {
58
83
  const context = {
59
84
  op: 'create',
60
85
  modelName: opts.modelName ?? this.modelName,
@@ -62,61 +87,47 @@ const patchHistoryPlugin = function plugin(schema, opts) {
62
87
  createdDocs: docs
63
88
  };
64
89
  await (0, patch_1.createPatch)(opts, context);
65
- next();
66
90
  });
67
- schema.pre(updateMethods, async function (next) {
91
+ schema.pre(updateMethods, async function () {
68
92
  const options = this.getOptions();
69
93
  if (options.ignoreHook)
70
- return next();
94
+ return;
71
95
  const filter = this.getFilter();
72
- const update = lodash_1.default.cloneDeep(this.getUpdate());
73
96
  const count = await this.model.count(filter).exec();
74
- const commands = [];
75
97
  this._context = {
76
98
  op: this.op,
77
99
  modelName: opts.modelName ?? this.model.modelName,
78
100
  collectionName: opts.collectionName ?? this.model.collection.collectionName,
79
101
  isNew: options.upsert && count === 0
80
102
  };
81
- const keys = lodash_1.default.keys(update).filter((key) => key.startsWith('$'));
82
- if (update && !lodash_1.default.isEmpty(keys)) {
83
- lodash_1.default.forEach(keys, (key) => {
84
- commands.push({ [key]: update[key] });
85
- delete update[key];
86
- });
87
- }
103
+ const updateQuery = this.getUpdate();
104
+ const { update, commands } = splitUpdateAndCommands(updateQuery);
88
105
  const cursor = this.model.find(filter).cursor();
89
106
  await cursor.eachAsync(async (doc) => {
90
- let current = doc.toObject(toObjectOptions);
107
+ const current = assignUpdate(doc.toObject(toObjectOptions), update, commands);
91
108
  const original = doc.toObject(toObjectOptions);
92
- current = (0, power_assign_1.assign)(current, update);
93
- lodash_1.default.forEach(commands, (command) => {
94
- try {
95
- current = (0, power_assign_1.assign)(current, command);
96
- }
97
- catch (error) {
98
- }
99
- });
100
109
  await (0, patch_1.updatePatch)(opts, this._context, current, original);
101
110
  });
102
- next();
103
111
  });
104
- schema.post(updateMethods, async function (_, next) {
112
+ schema.post(updateMethods, async function () {
105
113
  const options = this.getOptions();
106
114
  if (options.ignoreHook)
107
115
  return;
108
- const update = this.getUpdate();
109
- if (!update || !this._context.isNew)
116
+ if (!this._context.isNew)
110
117
  return;
111
- const found = await this.model.findOne(update).exec();
112
- if (found) {
113
- const current = found.toObject(toObjectOptions);
114
- this._context.createdDocs = [current];
115
- await (0, patch_1.createPatch)(opts, this._context);
118
+ const updateQuery = this.getUpdate();
119
+ const { update, commands } = splitUpdateAndCommands(updateQuery);
120
+ const filter = assignUpdate({}, update, commands);
121
+ if (!lodash_1.default.isEmpty(filter)) {
122
+ const found = await this.model.findOne(update).exec();
123
+ if (found) {
124
+ const current = found.toObject(toObjectOptions);
125
+ this._context.createdDocs = [current];
126
+ await (0, patch_1.createPatch)(opts, this._context);
127
+ }
116
128
  }
117
- next();
118
129
  });
119
- schema.post('remove', async function (_, next) {
130
+ schema.post('remove', async function () {
120
131
  const original = this.toObject(toObjectOptions);
121
132
  const model = this.constructor;
122
133
  const context = {
@@ -128,12 +139,11 @@ const patchHistoryPlugin = function plugin(schema, opts) {
128
139
  em_1.default.emit(opts.eventDeleted, { oldDoc: original });
129
140
  }
130
141
  await (0, patch_1.deletePatch)(opts, context);
131
- next();
132
142
  });
133
- schema.pre(deleteMethods, options, async function (next) {
143
+ schema.pre(deleteMethods, options, async function () {
134
144
  const options = this.getOptions();
135
145
  if (options.ignoreHook)
136
- return next();
146
+ return;
137
147
  const filter = this.getFilter();
138
148
  this._context = {
139
149
  op: this.op,
@@ -155,14 +165,12 @@ const patchHistoryPlugin = function plugin(schema, opts) {
155
165
  if (opts.preDeleteCallback && lodash_1.default.isArray(this._context.deletedDocs) && !lodash_1.default.isEmpty(this._context.deletedDocs)) {
156
166
  await opts.preDeleteCallback(this._context.deletedDocs);
157
167
  }
158
- next();
159
168
  });
160
- schema.post(deleteMethods, options, async function (_, next) {
169
+ schema.post(deleteMethods, options, async function () {
161
170
  const options = this.getOptions();
162
171
  if (options.ignoreHook)
163
172
  return;
164
173
  await (0, patch_1.deletePatch)(opts, this._context);
165
- next();
166
174
  });
167
175
  };
168
176
  exports.patchHistoryPlugin = patchHistoryPlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGA,OAAO,KAAK,EAAoB,KAAK,EAA2B,MAAM,EAAmB,MAAM,UAAU,CAAA;AAEzG,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AAwC7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IA+JlG,CAAA"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGA,OAAO,KAAK,EAAoB,KAAK,EAA2B,MAAM,EAA+D,MAAM,UAAU,CAAA;AAErJ,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AAwE7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IAoIlG,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -28,9 +28,35 @@ const deleteMethods = [
28
28
  'deleteOne',
29
29
  'deleteMany'
30
30
  ];
31
+ function splitUpdateAndCommands(updateQuery) {
32
+ let update = {};
33
+ const commands = [];
34
+ if (!_.isEmpty(updateQuery) && !_.isArray(updateQuery) && _.isObjectLike(updateQuery)) {
35
+ update = _.cloneDeep(updateQuery);
36
+ const keys = _.keys(update).filter((key) => key.startsWith('$'));
37
+ if (!_.isEmpty(keys)) {
38
+ _.forEach(keys, (key) => {
39
+ commands.push({ [key]: update[key] });
40
+ delete update[key];
41
+ });
42
+ }
43
+ }
44
+ return { update, commands };
45
+ }
46
+ function assignUpdate(document, update, commands) {
47
+ let updated = assign(document, update);
48
+ _.forEach(commands, (command) => {
49
+ try {
50
+ updated = assign(updated, command);
51
+ }
52
+ catch {
53
+ }
54
+ });
55
+ return updated;
56
+ }
31
57
  export const patchEventEmitter = em;
32
58
  export const patchHistoryPlugin = function plugin(schema, opts) {
33
- schema.pre('save', async function (next) {
59
+ schema.pre('save', async function () {
34
60
  const current = this.toObject(toObjectOptions);
35
61
  const model = this.constructor;
36
62
  const context = {
@@ -48,9 +74,8 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
48
74
  await updatePatch(opts, context, current, original);
49
75
  }
50
76
  }
51
- next();
52
77
  });
53
- schema.post('insertMany', async function (docs, next) {
78
+ schema.post('insertMany', async function (docs) {
54
79
  const context = {
55
80
  op: 'create',
56
81
  modelName: opts.modelName ?? this.modelName,
@@ -58,61 +83,47 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
58
83
  createdDocs: docs
59
84
  };
60
85
  await createPatch(opts, context);
61
- next();
62
86
  });
63
- schema.pre(updateMethods, async function (next) {
87
+ schema.pre(updateMethods, async function () {
64
88
  const options = this.getOptions();
65
89
  if (options.ignoreHook)
66
- return next();
90
+ return;
67
91
  const filter = this.getFilter();
68
- const update = _.cloneDeep(this.getUpdate());
69
92
  const count = await this.model.count(filter).exec();
70
- const commands = [];
71
93
  this._context = {
72
94
  op: this.op,
73
95
  modelName: opts.modelName ?? this.model.modelName,
74
96
  collectionName: opts.collectionName ?? this.model.collection.collectionName,
75
97
  isNew: options.upsert && count === 0
76
98
  };
77
- const keys = _.keys(update).filter((key) => key.startsWith('$'));
78
- if (update && !_.isEmpty(keys)) {
79
- _.forEach(keys, (key) => {
80
- commands.push({ [key]: update[key] });
81
- delete update[key];
82
- });
83
- }
99
+ const updateQuery = this.getUpdate();
100
+ const { update, commands } = splitUpdateAndCommands(updateQuery);
84
101
  const cursor = this.model.find(filter).cursor();
85
102
  await cursor.eachAsync(async (doc) => {
86
- let current = doc.toObject(toObjectOptions);
103
+ const current = assignUpdate(doc.toObject(toObjectOptions), update, commands);
87
104
  const original = doc.toObject(toObjectOptions);
88
- current = assign(current, update);
89
- _.forEach(commands, (command) => {
90
- try {
91
- current = assign(current, command);
92
- }
93
- catch (error) {
94
- }
95
- });
96
105
  await updatePatch(opts, this._context, current, original);
97
106
  });
98
- next();
99
107
  });
100
- schema.post(updateMethods, async function (_, next) {
108
+ schema.post(updateMethods, async function () {
101
109
  const options = this.getOptions();
102
110
  if (options.ignoreHook)
103
111
  return;
104
- const update = this.getUpdate();
105
- if (!update || !this._context.isNew)
112
+ if (!this._context.isNew)
106
113
  return;
107
- const found = await this.model.findOne(update).exec();
108
- if (found) {
109
- const current = found.toObject(toObjectOptions);
110
- this._context.createdDocs = [current];
111
- await createPatch(opts, this._context);
114
+ const updateQuery = this.getUpdate();
115
+ const { update, commands } = splitUpdateAndCommands(updateQuery);
116
+ const filter = assignUpdate({}, update, commands);
117
+ if (!_.isEmpty(filter)) {
118
+ const found = await this.model.findOne(update).exec();
119
+ if (found) {
120
+ const current = found.toObject(toObjectOptions);
121
+ this._context.createdDocs = [current];
122
+ await createPatch(opts, this._context);
123
+ }
112
124
  }
113
- next();
114
125
  });
115
- schema.post('remove', async function (_, next) {
126
+ schema.post('remove', async function () {
116
127
  const original = this.toObject(toObjectOptions);
117
128
  const model = this.constructor;
118
129
  const context = {
@@ -124,12 +135,11 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
124
135
  em.emit(opts.eventDeleted, { oldDoc: original });
125
136
  }
126
137
  await deletePatch(opts, context);
127
- next();
128
138
  });
129
- schema.pre(deleteMethods, options, async function (next) {
139
+ schema.pre(deleteMethods, options, async function () {
130
140
  const options = this.getOptions();
131
141
  if (options.ignoreHook)
132
- return next();
142
+ return;
133
143
  const filter = this.getFilter();
134
144
  this._context = {
135
145
  op: this.op,
@@ -151,14 +161,12 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
151
161
  if (opts.preDeleteCallback && _.isArray(this._context.deletedDocs) && !_.isEmpty(this._context.deletedDocs)) {
152
162
  await opts.preDeleteCallback(this._context.deletedDocs);
153
163
  }
154
- next();
155
164
  });
156
- schema.post(deleteMethods, options, async function (_, next) {
165
+ schema.post(deleteMethods, options, async function () {
157
166
  const options = this.getOptions();
158
167
  if (options.ignoreHook)
159
168
  return;
160
169
  await deletePatch(opts, this._context);
161
- next();
162
170
  });
163
171
  };
164
172
  //# sourceMappingURL=plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGA,OAAO,KAAK,EAAoB,KAAK,EAA2B,MAAM,EAAmB,MAAM,UAAU,CAAA;AAEzG,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AAwC7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IA+JlG,CAAA"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGA,OAAO,KAAK,EAAoB,KAAK,EAA2B,MAAM,EAA+D,MAAM,UAAU,CAAA;AAErJ,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AAwE7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IAoIlG,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-patch-mongoose",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "Patch history & events for mongoose models",
5
5
  "author": "Alex Eagle",
6
6
  "license": "MIT",
@@ -83,16 +83,16 @@
83
83
  "devDependencies": {
84
84
  "@shelf/jest-mongodb": "4.1.7",
85
85
  "@swc/cli": "0.1.62",
86
- "@swc/core": "1.3.51",
86
+ "@swc/core": "1.3.53",
87
87
  "@swc/helpers": "0.5.0",
88
88
  "@swc/jest": "0.2.26",
89
89
  "@swc/register": "0.1.10",
90
- "@types/jest": "29.5.0",
90
+ "@types/jest": "29.5.1",
91
91
  "@types/lodash": "4.14.194",
92
- "@types/node": "18.15.11",
92
+ "@types/node": "18.15.13",
93
93
  "@typescript-eslint/eslint-plugin": "5.59.0",
94
94
  "@typescript-eslint/parser": "5.59.0",
95
- "eslint": "8.38.0",
95
+ "eslint": "8.39.0",
96
96
  "eslint-config-standard": "17.0.0",
97
97
  "eslint-plugin-import": "2.27.5",
98
98
  "eslint-plugin-jest": "27.2.1",
package/src/plugin.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import _ from 'lodash'
2
2
  import { assign } from 'power-assign'
3
3
 
4
- import type { HydratedDocument, Model, MongooseQueryMiddleware, Schema, ToObjectOptions } from 'mongoose'
4
+ import type { HydratedDocument, Model, MongooseQueryMiddleware, Schema, ToObjectOptions, UpdateQuery, UpdateWithAggregationPipeline } from 'mongoose'
5
5
 
6
6
  import type IPluginOptions from './interfaces/IPluginOptions'
7
7
  import type IContext from './interfaces/IContext'
@@ -40,6 +40,38 @@ const deleteMethods = [
40
40
  'deleteMany'
41
41
  ]
42
42
 
43
+ function splitUpdateAndCommands<T> (updateQuery: UpdateWithAggregationPipeline | UpdateQuery<T> | null): { update: UpdateQuery<T>, commands: Record<string, unknown>[] } {
44
+ let update: UpdateQuery<T> = {}
45
+ const commands: Record<string, unknown>[] = []
46
+
47
+ if (!_.isEmpty(updateQuery) && !_.isArray(updateQuery) && _.isObjectLike(updateQuery)) {
48
+ update = _.cloneDeep(updateQuery)
49
+ const keys = _.keys(update).filter((key) => key.startsWith('$'))
50
+ if (!_.isEmpty(keys)) {
51
+ _.forEach(keys, (key) => {
52
+ commands.push({ [key]: update[key] as unknown })
53
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
54
+ delete update[key]
55
+ })
56
+ }
57
+ }
58
+
59
+ return { update, commands }
60
+ }
61
+
62
+ function assignUpdate<T> (document: HydratedDocument<T>, update: UpdateQuery<T>, commands: Record<string, unknown>[]): HydratedDocument<T> {
63
+ let updated = assign(document, update)
64
+ _.forEach(commands, (command) => {
65
+ try {
66
+ updated = assign(updated, command)
67
+ } catch {
68
+ // we catch assign keys that are not implemented
69
+ }
70
+ })
71
+
72
+ return updated
73
+ }
74
+
43
75
  /**
44
76
  * @description Patch patch event emitter
45
77
  */
@@ -52,7 +84,7 @@ export const patchEventEmitter = em
52
84
  * @returns {void}
53
85
  */
54
86
  export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: IPluginOptions<T>): void {
55
- schema.pre('save', async function (next) {
87
+ schema.pre('save', async function () {
56
88
  const current = this.toObject(toObjectOptions) as HydratedDocument<T>
57
89
  const model = this.constructor as Model<T>
58
90
 
@@ -71,11 +103,9 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
71
103
  await updatePatch(opts, context, current, original)
72
104
  }
73
105
  }
74
-
75
- next()
76
106
  })
77
107
 
78
- schema.post('insertMany', async function (docs, next) {
108
+ schema.post('insertMany', async function (docs) {
79
109
  const context = {
80
110
  op: 'create',
81
111
  modelName: opts.modelName ?? this.modelName,
@@ -84,18 +114,14 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
84
114
  }
85
115
 
86
116
  await createPatch(opts, context)
87
-
88
- next()
89
117
  })
90
118
 
91
- schema.pre(updateMethods as MongooseQueryMiddleware[], async function (this: IHookContext<T>, next) {
119
+ schema.pre(updateMethods as MongooseQueryMiddleware[], async function (this: IHookContext<T>) {
92
120
  const options = this.getOptions()
93
- if (options.ignoreHook) return next()
121
+ if (options.ignoreHook) return
94
122
 
95
123
  const filter = this.getFilter()
96
- const update = _.cloneDeep(this.getUpdate()) as Record<string, Partial<T>> | null
97
124
  const count = await this.model.count(filter).exec()
98
- const commands: Record<string, Partial<T>>[] = []
99
125
 
100
126
  this._context = {
101
127
  op: this.op,
@@ -104,55 +130,40 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
104
130
  isNew: options.upsert && count === 0
105
131
  }
106
132
 
107
- const keys = _.keys(update).filter((key) => key.startsWith('$'))
108
- if (update && !_.isEmpty(keys)) {
109
- _.forEach(keys, (key) => {
110
- commands.push({ [key]: update[key] })
111
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
112
- delete update[key]
113
- })
114
- }
133
+ const updateQuery = this.getUpdate()
134
+ const { update, commands } = splitUpdateAndCommands(updateQuery)
115
135
 
116
136
  const cursor = this.model.find<HydratedDocument<T>>(filter).cursor()
117
137
  await cursor.eachAsync(async (doc) => {
118
- let current = doc.toObject(toObjectOptions) as HydratedDocument<T>
138
+ const current = assignUpdate(doc.toObject(toObjectOptions) as HydratedDocument<T>, update, commands)
119
139
  const original = doc.toObject(toObjectOptions) as HydratedDocument<T>
120
140
 
121
- current = assign(current, update)
122
- _.forEach(commands, (command) => {
123
- try {
124
- current = assign(current, command)
125
- } catch (error) {
126
- // we catch assign keys that are not implemented
127
- }
128
- })
129
-
130
141
  await updatePatch(opts, this._context, current, original)
131
142
  })
132
-
133
- next()
134
143
  })
135
144
 
136
- schema.post(updateMethods as MongooseQueryMiddleware[], async function (this: IHookContext<T>, _, next) {
145
+ schema.post(updateMethods as MongooseQueryMiddleware[], async function (this: IHookContext<T>) {
137
146
  const options = this.getOptions()
138
147
  if (options.ignoreHook) return
139
148
 
140
- const update = this.getUpdate()
149
+ if (!this._context.isNew) return
141
150
 
142
- if (!update || !this._context.isNew) return
151
+ const updateQuery = this.getUpdate()
152
+ const { update, commands } = splitUpdateAndCommands(updateQuery)
143
153
 
144
- const found = await this.model.findOne<HydratedDocument<T>>(update).exec()
145
- if (found) {
146
- const current = found.toObject(toObjectOptions) as HydratedDocument<T>
147
- this._context.createdDocs = [current]
154
+ const filter = assignUpdate({} as HydratedDocument<T>, update, commands)
155
+ if (!_.isEmpty(filter)) {
156
+ const found = await this.model.findOne<HydratedDocument<T>>(update).exec()
157
+ if (found) {
158
+ const current = found.toObject(toObjectOptions) as HydratedDocument<T>
159
+ this._context.createdDocs = [current]
148
160
 
149
- await createPatch(opts, this._context)
161
+ await createPatch(opts, this._context)
162
+ }
150
163
  }
151
-
152
- next()
153
164
  })
154
165
 
155
- schema.post('remove', async function (this: HydratedDocument<T>, _, next) {
166
+ schema.post('remove', async function (this: HydratedDocument<T>) {
156
167
  const original = this.toObject(toObjectOptions)
157
168
  const model = this.constructor as Model<T>
158
169
 
@@ -167,13 +178,11 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
167
178
  }
168
179
 
169
180
  await deletePatch(opts, context)
170
-
171
- next()
172
181
  })
173
182
 
174
- schema.pre(deleteMethods as MongooseQueryMiddleware[], options, async function (this: IHookContext<T>, next) {
183
+ schema.pre(deleteMethods as MongooseQueryMiddleware[], options, async function (this: IHookContext<T>) {
175
184
  const options = this.getOptions()
176
- if (options.ignoreHook) return next()
185
+ if (options.ignoreHook) return
177
186
 
178
187
  const filter = this.getFilter()
179
188
 
@@ -198,16 +207,12 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
198
207
  if (opts.preDeleteCallback && _.isArray(this._context.deletedDocs) && !_.isEmpty(this._context.deletedDocs)) {
199
208
  await opts.preDeleteCallback(this._context.deletedDocs)
200
209
  }
201
-
202
- next()
203
210
  })
204
211
 
205
- schema.post(deleteMethods as MongooseQueryMiddleware[], options, async function (this: IHookContext<T>, _, next) {
212
+ schema.post(deleteMethods as MongooseQueryMiddleware[], options, async function (this: IHookContext<T>) {
206
213
  const options = this.getOptions()
207
214
  if (options.ignoreHook) return
208
215
 
209
216
  await deletePatch(opts, this._context)
210
-
211
- next()
212
217
  })
213
218
  }
@@ -54,6 +54,12 @@ describe('plugin - event created & patch history disabled', () => {
54
54
  updatedAt: john.updatedAt
55
55
  })
56
56
  })
57
+
58
+ // Check if the document is saved
59
+ const found = await User.findOne({})
60
+ expect(found).not.toBeNull()
61
+ expect(found?.name).toBe('John')
62
+ expect(found?.role).toBe('user')
57
63
  })
58
64
 
59
65
  it('should create() and emit one create event', async () => {
@@ -72,6 +78,12 @@ describe('plugin - event created & patch history disabled', () => {
72
78
  updatedAt: user.updatedAt
73
79
  })
74
80
  })
81
+
82
+ // Check if the document is saved
83
+ const found = await User.findOne({})
84
+ expect(found).not.toBeNull()
85
+ expect(found?.name).toBe('John')
86
+ expect(found?.role).toBe('user')
75
87
  })
76
88
 
77
89
  it('should insertMany() and emit three create events', async () => {
@@ -79,7 +91,7 @@ describe('plugin - event created & patch history disabled', () => {
79
91
  { name: 'John', role: 'user' },
80
92
  { name: 'Alice', role: 'user' },
81
93
  { name: 'Bob', role: 'user' }
82
- ])
94
+ ], { ordered: true })
83
95
 
84
96
  const [john, alice, bob] = users
85
97
 
@@ -114,6 +126,21 @@ describe('plugin - event created & patch history disabled', () => {
114
126
  updatedAt: bob.updatedAt
115
127
  })
116
128
  })
129
+
130
+ // Check if the documents are saved
131
+ const found = await User.find({})
132
+ expect(found).toHaveLength(3)
133
+
134
+ const [foundJohn, foundAlice, foundBob] = found
135
+
136
+ expect(foundJohn.name).toBe('John')
137
+ expect(foundJohn.role).toBe('user')
138
+
139
+ expect(foundAlice.name).toBe('Alice')
140
+ expect(foundAlice.role).toBe('user')
141
+
142
+ expect(foundBob.name).toBe('Bob')
143
+ expect(foundBob.role).toBe('user')
117
144
  })
118
145
  })
119
146
 
@@ -140,6 +167,12 @@ describe('plugin - event created & patch history disabled', () => {
140
167
  // Upsert does not set createdAt and updatedAt
141
168
  })
142
169
  })
170
+
171
+ // Check if the document is saved
172
+ const found = await User.findOne({})
173
+ expect(found).not.toBeNull()
174
+ expect(found?.name).toBe('John')
175
+ expect(found?.role).toBe('admin')
143
176
  })
144
177
 
145
178
  it('should updateOne() + upsert and emit one create event', async () => {
@@ -164,6 +197,12 @@ describe('plugin - event created & patch history disabled', () => {
164
197
  // Upsert does not set createdAt and updatedAt
165
198
  })
166
199
  })
200
+
201
+ // Check if the document is saved
202
+ const found = await User.findOne({})
203
+ expect(found).not.toBeNull()
204
+ expect(found?.name).toBe('John')
205
+ expect(found?.role).toBe('admin')
167
206
  })
168
207
 
169
208
  it('should replaceOne() + upsert and emit one create event', async () => {
@@ -188,6 +227,12 @@ describe('plugin - event created & patch history disabled', () => {
188
227
  // Upsert does not set createdAt and updatedAt
189
228
  })
190
229
  })
230
+
231
+ // Check if the document is saved
232
+ const found = await User.findOne({})
233
+ expect(found).not.toBeNull()
234
+ expect(found?.name).toBe('John')
235
+ expect(found?.role).toBe('admin')
191
236
  })
192
237
 
193
238
  it('should updateMany() + upsert and emit one create event', async () => {
@@ -211,6 +256,12 @@ describe('plugin - event created & patch history disabled', () => {
211
256
  // Upsert does not set createdAt and updatedAt
212
257
  })
213
258
  })
259
+
260
+ // Check if the document is saved
261
+ const found = await User.findById(users?._id)
262
+ expect(found).not.toBeNull()
263
+ expect(found?.name).toBe('Steve')
264
+ expect(found?.role).toBe('admin')
214
265
  })
215
266
 
216
267
  it('should findOneAndUpdate() + upsert and emit one create event', async () => {
@@ -235,6 +286,12 @@ describe('plugin - event created & patch history disabled', () => {
235
286
  // Upsert does not set createdAt and updatedAt
236
287
  })
237
288
  })
289
+
290
+ // Check if the document is saved
291
+ const found = await User.findOne({})
292
+ expect(found).not.toBeNull()
293
+ expect(found?.name).toBe('John')
294
+ expect(found?.role).toBe('admin')
238
295
  })
239
296
 
240
297
  it('should findOneAndReplace() + upsert and emit one create event', async () => {
@@ -259,6 +316,12 @@ describe('plugin - event created & patch history disabled', () => {
259
316
  // Upsert does not set createdAt and updatedAt
260
317
  })
261
318
  })
319
+
320
+ // Check if the document is saved
321
+ const found = await User.findOne({})
322
+ expect(found).not.toBeNull()
323
+ expect(found?.name).toBe('John')
324
+ expect(found?.role).toBe('admin')
262
325
  })
263
326
 
264
327
  it('should findByIdAndUpdate() + upsert and emit one create event', async () => {
@@ -279,6 +342,12 @@ describe('plugin - event created & patch history disabled', () => {
279
342
  role: user?.role
280
343
  })
281
344
  })
345
+
346
+ // Check if the document is saved
347
+ const found = await User.findOne({})
348
+ expect(found).not.toBeNull()
349
+ expect(found?.name).toBe('John')
350
+ expect(found?.role).toBe('admin')
282
351
  })
283
352
  })
284
353
  })
@@ -54,6 +54,10 @@ describe('plugin - event delete & patch history disabled', () => {
54
54
  expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
55
55
  oldDoc: expect.objectContaining(john.toObject(toObjectOptions))
56
56
  })
57
+
58
+ // Check if data is deleted
59
+ const user = await User.findById(john._id)
60
+ expect(user).toBeNull()
57
61
  })
58
62
 
59
63
  it('should remove() and emit two delete events', async () => {
@@ -67,10 +71,6 @@ describe('plugin - event delete & patch history disabled', () => {
67
71
 
68
72
  await User.remove({ role: 'user' }).exec()
69
73
 
70
- const remaining = await User.find({})
71
-
72
- expect(remaining).toHaveLength(1)
73
-
74
74
  const history = await History.find({})
75
75
  expect(history).toHaveLength(0)
76
76
 
@@ -81,6 +81,16 @@ describe('plugin - event delete & patch history disabled', () => {
81
81
  expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
82
82
  oldDoc: expect.objectContaining(alice.toObject(toObjectOptions))
83
83
  })
84
+
85
+ // Check if data is deleted
86
+ const deletedJohn = await User.findById(john._id)
87
+ expect(deletedJohn).toBeNull()
88
+
89
+ const deletedAlice = await User.findById(alice._id)
90
+ expect(deletedAlice).toBeNull()
91
+
92
+ const remaining = await User.find({})
93
+ expect(remaining).toHaveLength(1)
84
94
  })
85
95
 
86
96
  it('should remove() and emit one delete event { single: true }', async () => {
@@ -101,6 +111,13 @@ describe('plugin - event delete & patch history disabled', () => {
101
111
  expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
102
112
  oldDoc: expect.objectContaining(john.toObject(toObjectOptions))
103
113
  })
114
+
115
+ // Check if data is deleted
116
+ const deletedJohn = await User.findById(john._id)
117
+ expect(deletedJohn).toBeNull()
118
+
119
+ const remaining = await User.find({})
120
+ expect(remaining).toHaveLength(2)
104
121
  })
105
122
 
106
123
  it('should findOneAndDelete() and emit one delete event', async () => {
@@ -121,6 +138,13 @@ describe('plugin - event delete & patch history disabled', () => {
121
138
  expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
122
139
  oldDoc: expect.objectContaining(john.toObject(toObjectOptions))
123
140
  })
141
+
142
+ // Check if data is deleted
143
+ const deletedJohn = await User.findById(john._id)
144
+ expect(deletedJohn).toBeNull()
145
+
146
+ const remaining = await User.find({})
147
+ expect(remaining).toHaveLength(2)
124
148
  })
125
149
 
126
150
  it('should findOneAndRemove() and emit one delete event', async () => {
@@ -141,6 +165,13 @@ describe('plugin - event delete & patch history disabled', () => {
141
165
  expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
142
166
  oldDoc: expect.objectContaining(john.toObject(toObjectOptions))
143
167
  })
168
+
169
+ // Check if data is deleted
170
+ const deletedJohn = await User.findById(john._id)
171
+ expect(deletedJohn).toBeNull()
172
+
173
+ const remaining = await User.find({ name: { $in: ['Alice', 'Bob'] } })
174
+ expect(remaining).toHaveLength(2)
144
175
  })
145
176
 
146
177
  it('should findByIdAndDelete() and emit one delete event', async () => {
@@ -161,6 +192,13 @@ describe('plugin - event delete & patch history disabled', () => {
161
192
  expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
162
193
  oldDoc: expect.objectContaining(john.toObject(toObjectOptions))
163
194
  })
195
+
196
+ // Check if data is deleted
197
+ const deletedJohn = await User.findById(john._id)
198
+ expect(deletedJohn).toBeNull()
199
+
200
+ const remaining = await User.find({ name: { $in: ['Alice', 'Bob'] } })
201
+ expect(remaining).toHaveLength(2)
164
202
  })
165
203
 
166
204
  it('should findByIdAndRemove() and emit one delete event', async () => {
@@ -181,6 +219,13 @@ describe('plugin - event delete & patch history disabled', () => {
181
219
  expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
182
220
  oldDoc: expect.objectContaining(john.toObject(toObjectOptions))
183
221
  })
222
+
223
+ // Check if data is deleted
224
+ const deletedJohn = await User.findById(john._id)
225
+ expect(deletedJohn).toBeNull()
226
+
227
+ const remaining = await User.find({ name: { $in: ['Alice', 'Bob'] } })
228
+ expect(remaining).toHaveLength(2)
184
229
  })
185
230
 
186
231
  it('should deleteOne() and emit one delete event', async () => {
@@ -201,6 +246,13 @@ describe('plugin - event delete & patch history disabled', () => {
201
246
  expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
202
247
  oldDoc: expect.objectContaining(john.toObject(toObjectOptions))
203
248
  })
249
+
250
+ // Check if data is deleted
251
+ const deletedJohn = await User.findById(john._id)
252
+ expect(deletedJohn).toBeNull()
253
+
254
+ const remaining = await User.find({ name: { $in: ['Alice', 'Bob'] } })
255
+ expect(remaining).toHaveLength(2)
204
256
  })
205
257
 
206
258
  it('should deleteMany() and emit two delete events', async () => {
@@ -224,6 +276,16 @@ describe('plugin - event delete & patch history disabled', () => {
224
276
  expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
225
277
  oldDoc: expect.objectContaining(alice.toObject(toObjectOptions))
226
278
  })
279
+
280
+ // Check if data is deleted
281
+ const deletedJohn = await User.findById(john._id)
282
+ expect(deletedJohn).toBeNull()
283
+
284
+ const deletedAlice = await User.findById(alice._id)
285
+ expect(deletedAlice).toBeNull()
286
+
287
+ const remaining = await User.find({})
288
+ expect(remaining).toHaveLength(1)
227
289
  })
228
290
 
229
291
  it('should deleteMany() and emit one delete event { single: true }', async () => {
@@ -244,6 +306,13 @@ describe('plugin - event delete & patch history disabled', () => {
244
306
  expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
245
307
  oldDoc: expect.objectContaining(john.toObject(toObjectOptions))
246
308
  })
309
+
310
+ // Check if data is deleted
311
+ const deletedJohn = await User.findById(john._id)
312
+ expect(deletedJohn).toBeNull()
313
+
314
+ const remaining = await User.find({})
315
+ expect(remaining).toHaveLength(2)
247
316
  })
248
317
 
249
318
  it('should create then delete and emit one delete event', async () => {
@@ -257,35 +326,43 @@ describe('plugin - event delete & patch history disabled', () => {
257
326
  expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
258
327
  oldDoc: expect.objectContaining(john.toObject(toObjectOptions))
259
328
  })
329
+
330
+ // Check if data is deleted
331
+ const deletedJohn = await User.findById(john._id)
332
+ expect(deletedJohn).toBeNull()
333
+
334
+ const remaining = await User.find({})
335
+ expect(remaining).toHaveLength(0)
260
336
  })
261
337
 
262
338
  it('should ignoreHook option on deleteMany', async () => {
263
- await User.create({ name: 'John', role: 'user' })
339
+ const john = await User.create({ name: 'John', role: 'user' })
264
340
  await User.deleteMany({ role: 'user' }, { ignoreHook: true }).exec()
265
341
 
266
342
  const history = await History.find({})
267
343
  expect(history).toHaveLength(0)
268
344
 
269
345
  expect(em.emit).toHaveBeenCalledTimes(0)
346
+
347
+ // Check if data is deleted
348
+ const deletedJohn = await User.findById(john._id)
349
+ expect(deletedJohn).toBeNull()
270
350
  })
271
351
 
272
352
  it('should ignoreHook option on deleteOne', async () => {
273
- await User.create({ name: 'John', role: 'user' })
353
+ const john = await User.create({ name: 'John', role: 'user' })
274
354
  await User.deleteOne({ role: 'user' }, { ignoreHook: true }).exec()
275
355
 
276
356
  const history = await History.find({})
277
357
  expect(history).toHaveLength(0)
278
358
 
279
359
  expect(em.emit).toHaveBeenCalledTimes(0)
280
- })
281
360
 
282
- it('should ignoreHook option on updateMany', async () => {
283
- await User.create({ name: 'John', role: 'user' })
284
- await User.updateMany({ role: 'user' }, { role: 'admin' }, { ignoreHook: true }).exec()
361
+ // Check if data is deleted
362
+ const deletedJohn = await User.findById(john._id)
363
+ expect(deletedJohn).toBeNull()
285
364
 
286
- const history = await History.find({})
287
- expect(history).toHaveLength(0)
288
-
289
- expect(em.emit).toHaveBeenCalledTimes(0)
365
+ const remaining = await User.find({})
366
+ expect(remaining).toHaveLength(0)
290
367
  })
291
368
  })
@@ -72,6 +72,13 @@ describe('plugin - event updated & patch history disabled', () => {
72
72
  { op: 'replace', path: '/name', value: 'John Doe' }
73
73
  ])
74
74
  })
75
+
76
+ // Confirm that the document is updated
77
+ const users = await User.find({})
78
+ expect(users).toHaveLength(2)
79
+ const [bob, john] = users
80
+ expect(bob.name).toBe('Bob')
81
+ expect(john.name).toBe('John Doe')
75
82
  })
76
83
 
77
84
  it('should update() and emit three update event', async () => {
@@ -89,6 +96,14 @@ describe('plugin - event updated & patch history disabled', () => {
89
96
  expect(history).toHaveLength(0)
90
97
 
91
98
  expect(em.emit).toHaveBeenCalledTimes(3)
99
+
100
+ // Confirm that the document is updated
101
+ const updated = await User.find({})
102
+ expect(updated).toHaveLength(3)
103
+ const [alice, bob, john] = updated
104
+ expect(alice.role).toBe('manager')
105
+ expect(bob.role).toBe('manager')
106
+ expect(john.role).toBe('manager')
92
107
  })
93
108
 
94
109
  it('should updateOne() and emit one update event', async () => {
@@ -106,6 +121,14 @@ describe('plugin - event updated & patch history disabled', () => {
106
121
  expect(history).toHaveLength(0)
107
122
 
108
123
  expect(em.emit).toHaveBeenCalledTimes(1)
124
+
125
+ // Confirm that the document is updated
126
+ const updated = await User.find({})
127
+ expect(updated).toHaveLength(3)
128
+ const [alice, bob, john] = updated
129
+ expect(alice.role).toBe('user')
130
+ expect(bob.role).toBe('manager')
131
+ expect(john.role).toBe('user')
109
132
  })
110
133
 
111
134
  it('should replaceOne() and emit two update event', async () => {
@@ -147,6 +170,14 @@ describe('plugin - event updated & patch history disabled', () => {
147
170
  { op: 'replace', path: '/role', value: 'manager' }
148
171
  ])
149
172
  })
173
+
174
+ // Confirm that the document is updated
175
+ const updated = await User.find({})
176
+ expect(updated).toHaveLength(3)
177
+ const [alice, bob, john] = updated
178
+ expect(alice.role).toBe('user')
179
+ expect(bob.role).toBe('manager')
180
+ expect(john.role).toBe('user')
150
181
  })
151
182
 
152
183
  it('should updateMany() and emit two update event', async () => {
@@ -164,6 +195,14 @@ describe('plugin - event updated & patch history disabled', () => {
164
195
  expect(history).toHaveLength(0)
165
196
 
166
197
  expect(em.emit).toHaveBeenCalledTimes(3)
198
+
199
+ // Confirm that the document is updated
200
+ const updated = await User.find({})
201
+ expect(updated).toHaveLength(3)
202
+ const [alice, bob, john] = updated
203
+ expect(alice.role).toBe('manager')
204
+ expect(bob.role).toBe('manager')
205
+ expect(john.role).toBe('manager')
167
206
  })
168
207
 
169
208
  it('should findOneAndUpdate() and emit one update event', async () => {
@@ -199,6 +238,10 @@ describe('plugin - event updated & patch history disabled', () => {
199
238
  { op: 'replace', path: '/name', value: 'John Doe' }
200
239
  ])
201
240
  })
241
+
242
+ // Confirm that the document is updated
243
+ expect(updated?.name).toBe('John Doe')
244
+ expect(updated?.role).toBe('manager')
202
245
  })
203
246
 
204
247
  it('should findOneAndReplace() and emit one update event', async () => {
@@ -236,6 +279,10 @@ describe('plugin - event updated & patch history disabled', () => {
236
279
  { op: 'replace', path: '/role', value: 'manager' }
237
280
  ])
238
281
  })
282
+
283
+ // Confirm that the document is updated
284
+ expect(updated?.name).toBe('John Doe')
285
+ expect(updated?.role).toBe('manager')
239
286
  })
240
287
 
241
288
  it('should findByIdAndUpdate() and emit one update event', async () => {
@@ -268,6 +315,11 @@ describe('plugin - event updated & patch history disabled', () => {
268
315
  { op: 'replace', path: '/role', value: 'manager' }
269
316
  ])
270
317
  })
318
+
319
+ // Confirm that the document is updated
320
+ const updated = await User.findById(created._id).exec()
321
+ expect(updated?.name).toBe('John Doe')
322
+ expect(updated?.role).toBe('manager')
271
323
  })
272
324
 
273
325
  it('should update and emit one update event', async () => {
@@ -303,6 +355,10 @@ describe('plugin - event updated & patch history disabled', () => {
303
355
  { op: 'replace', path: '/name', value: 'John Doe' }
304
356
  ])
305
357
  })
358
+
359
+ // Confirm that the document is updated
360
+ expect(updated?.name).toBe('John Doe')
361
+ expect(updated?.role).toBe('manager')
306
362
  })
307
363
 
308
364
  it('should updateMany and emit two update events', async () => {
@@ -362,5 +418,66 @@ describe('plugin - event updated & patch history disabled', () => {
362
418
  { op: 'replace', path: '/name', value: 'John Doe' }
363
419
  ])
364
420
  })
421
+
422
+ // Confirm that the documents are updated
423
+ expect(updated1?.name).toBe('John Doe')
424
+ expect(updated1?.role).toBe('manager')
425
+
426
+ expect(updated2?.name).toBe('John Doe')
427
+ expect(updated2?.role).toBe('manager')
428
+ })
429
+
430
+ it('should findOneAndUpdate $set and emit one update event', async () => {
431
+ const created = await User.create({ name: 'Bob', role: 'user' })
432
+ await User.findOneAndUpdate({ _id: created._id }, { $set: { name: 'John Doe', role: 'manager' } })
433
+ const updated = await User.findById(created._id).exec()
434
+ expect(updated).not.toBeNull()
435
+ expect(updated?.name).toBe('John Doe')
436
+ expect(updated?.role).toBe('manager')
437
+
438
+ const history = await History.find({})
439
+ expect(history).toHaveLength(0)
440
+
441
+ expect(em.emit).toHaveBeenCalledTimes(1)
442
+ expect(em.emit).toHaveBeenCalledWith(USER_UPDATED, {
443
+ oldDoc: expect.objectContaining({
444
+ __v: 0,
445
+ _id: created._id,
446
+ name: created.name,
447
+ role: created.role,
448
+ createdAt: created.createdAt
449
+ }),
450
+ doc: expect.objectContaining({
451
+ __v: 0,
452
+ _id: updated?._id,
453
+ name: updated?.name,
454
+ role: updated?.role,
455
+ createdAt: created.createdAt
456
+ }),
457
+ patch: expect.arrayContaining([
458
+ { op: 'test', path: '/name', value: 'Bob' },
459
+ { op: 'replace', path: '/name', value: 'John Doe' },
460
+ { op: 'test', path: '/role', value: 'user' },
461
+ { op: 'replace', path: '/role', value: 'manager' }
462
+ ])
463
+ })
464
+
465
+ // Confirm that the document is updated
466
+ expect(updated?.name).toBe('John Doe')
467
+ expect(updated?.role).toBe('manager')
468
+ })
469
+
470
+ it('should ignoreHook option on updateMany', async () => {
471
+ const john = await User.create({ name: 'John', role: 'user' })
472
+ await User.updateMany({ role: 'user' }, { role: 'admin' }, { ignoreHook: true }).exec()
473
+
474
+ const history = await History.find({})
475
+ expect(history).toHaveLength(0)
476
+
477
+ expect(em.emit).toHaveBeenCalledTimes(0)
478
+
479
+ // Confirm that the document is updated
480
+ const updated = await User.findById(john._id).exec()
481
+ expect(updated?.role).toBe('admin')
365
482
  })
366
483
  })