ts-patch-mongoose 3.0.0 → 3.1.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.
Files changed (41) hide show
  1. package/README.md +31 -25
  2. package/dist/index.cjs +112 -115
  3. package/dist/index.d.cts +4 -1
  4. package/dist/index.d.cts.map +1 -1
  5. package/dist/index.d.mts +4 -1
  6. package/dist/index.d.mts.map +1 -1
  7. package/dist/index.mjs +112 -115
  8. package/package.json +14 -15
  9. package/src/helpers.ts +16 -3
  10. package/src/hooks/delete-hooks.ts +5 -4
  11. package/src/hooks/update-hooks.ts +47 -19
  12. package/src/index.ts +8 -5
  13. package/src/ms.ts +4 -3
  14. package/src/omit-deep.ts +24 -63
  15. package/src/patch.ts +30 -33
  16. package/src/types.ts +3 -0
  17. package/biome.json +0 -50
  18. package/tests/constants/events.ts +0 -7
  19. package/tests/em.test.ts +0 -54
  20. package/tests/helpers.test.ts +0 -311
  21. package/tests/mongo/.gitignore +0 -3
  22. package/tests/mongo/server.ts +0 -31
  23. package/tests/ms.test.ts +0 -113
  24. package/tests/omit-deep.test.ts +0 -220
  25. package/tests/patch.test.ts +0 -199
  26. package/tests/plugin-all-features.test.ts +0 -741
  27. package/tests/plugin-complex-data.test.ts +0 -1332
  28. package/tests/plugin-event-created.test.ts +0 -371
  29. package/tests/plugin-event-deleted.test.ts +0 -400
  30. package/tests/plugin-event-updated.test.ts +0 -503
  31. package/tests/plugin-global.test.ts +0 -545
  32. package/tests/plugin-omit-all.test.ts +0 -349
  33. package/tests/plugin-patch-history-disabled.test.ts +0 -162
  34. package/tests/plugin-pre-delete.test.ts +0 -160
  35. package/tests/plugin-pre-save.test.ts +0 -54
  36. package/tests/plugin.test.ts +0 -576
  37. package/tests/schemas/Description.ts +0 -15
  38. package/tests/schemas/Product.ts +0 -38
  39. package/tests/schemas/User.ts +0 -22
  40. package/tsconfig.json +0 -32
  41. package/vite.config.mts +0 -23
@@ -1,400 +0,0 @@
1
- import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'
2
-
3
- import mongoose, { model } from 'mongoose'
4
- import em from '../src/em'
5
- import { toObjectOptions } from '../src/helpers'
6
- import { patchHistoryPlugin } from '../src/index'
7
- import { HistoryModel } from '../src/model'
8
- import { isMongooseLessThan7 } from '../src/version'
9
- import { USER_DELETED } from './constants/events'
10
- import server from './mongo/server'
11
- import { type User, UserSchema } from './schemas/User'
12
-
13
- vi.mock('../src/em', () => ({ default: { emit: vi.fn() } }))
14
-
15
- describe('plugin - event delete & patch history disabled', () => {
16
- const instance = server('plugin-event-deleted')
17
-
18
- UserSchema.plugin(patchHistoryPlugin, {
19
- eventDeleted: USER_DELETED,
20
- patchHistoryDisabled: true,
21
- })
22
-
23
- const UserModel = model<User>('User', UserSchema)
24
-
25
- beforeAll(async () => {
26
- await instance.create()
27
- })
28
-
29
- afterAll(async () => {
30
- await instance.destroy()
31
- })
32
-
33
- beforeEach(async () => {
34
- await mongoose.connection.collection('users').deleteMany({})
35
- await mongoose.connection.collection('history').deleteMany({})
36
- })
37
-
38
- afterEach(async () => {
39
- vi.resetAllMocks()
40
- })
41
-
42
- it('should remove() and emit one delete event', async () => {
43
- const john = await UserModel.create({ name: 'John', role: 'user' })
44
-
45
- if (isMongooseLessThan7) {
46
- // @ts-expect-error not available in Mongoose 6 and below
47
- await john.remove()
48
- } else {
49
- await john.deleteOne()
50
- }
51
-
52
- const history = await HistoryModel.find({})
53
- expect(history).toHaveLength(0)
54
-
55
- expect(em.emit).toHaveBeenCalledTimes(1)
56
- expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
57
- oldDoc: expect.objectContaining(john.toObject(toObjectOptions)),
58
- })
59
-
60
- // Check if data is deleted
61
- const user = await UserModel.findById(john._id)
62
- expect(user).toBeNull()
63
- })
64
-
65
- it('should remove() and emit two delete events', async () => {
66
- const users = await UserModel.create([
67
- { name: 'John', role: 'user' },
68
- { name: 'Alice', role: 'user' },
69
- { name: 'Bob', role: 'admin' },
70
- ])
71
-
72
- const [john, alice] = users
73
-
74
- if (isMongooseLessThan7) {
75
- // @ts-expect-error not available in Mongoose 6 and below
76
- await UserModel.remove({ role: 'user' }).exec()
77
- } else {
78
- await UserModel.deleteMany({ role: 'user' }).exec()
79
- }
80
-
81
- const history = await HistoryModel.find({})
82
- expect(history).toHaveLength(0)
83
-
84
- expect(em.emit).toHaveBeenCalledTimes(2)
85
- expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
86
- oldDoc: expect.objectContaining(john.toObject(toObjectOptions)),
87
- })
88
- expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
89
- oldDoc: expect.objectContaining(alice.toObject(toObjectOptions)),
90
- })
91
-
92
- // Check if data is deleted
93
- const deletedJohn = await UserModel.findById(john._id)
94
- expect(deletedJohn).toBeNull()
95
-
96
- const deletedAlice = await UserModel.findById(alice._id)
97
- expect(deletedAlice).toBeNull()
98
-
99
- const remaining = await UserModel.find({})
100
- expect(remaining).toHaveLength(1)
101
- })
102
-
103
- it('should remove() and emit one delete event { single: true }', async () => {
104
- const users = await UserModel.create([
105
- { name: 'John', role: 'user' },
106
- { name: 'Alice', role: 'user' },
107
- { name: 'Bob', role: 'admin' },
108
- ])
109
-
110
- const [john] = users
111
-
112
- if (isMongooseLessThan7) {
113
- // @ts-expect-error not available in Mongoose 6 and below
114
- await UserModel.remove({ role: 'user', name: 'John' }, { single: true }).exec()
115
- } else {
116
- await UserModel.deleteOne({ role: 'user', name: 'John' }).exec()
117
- }
118
-
119
- const history = await HistoryModel.find({})
120
- expect(history).toHaveLength(0)
121
-
122
- expect(em.emit).toHaveBeenCalledTimes(1)
123
- expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
124
- oldDoc: expect.objectContaining(john.toObject(toObjectOptions)),
125
- })
126
-
127
- // Check if data is deleted
128
- const deletedJohn = await UserModel.findById(john._id)
129
- expect(deletedJohn).toBeNull()
130
-
131
- const remaining = await UserModel.find({})
132
- expect(remaining).toHaveLength(2)
133
- })
134
-
135
- it('should findOneAndDelete() and emit one delete event', async () => {
136
- const users = await UserModel.create([
137
- { name: 'John', role: 'user' },
138
- { name: 'Alice', role: 'user' },
139
- { name: 'Bob', role: 'admin' },
140
- ])
141
-
142
- const [john] = users
143
-
144
- await UserModel.findOneAndDelete({ name: 'John' }).exec()
145
-
146
- const history = await HistoryModel.find({})
147
- expect(history).toHaveLength(0)
148
-
149
- expect(em.emit).toHaveBeenCalledTimes(1)
150
- expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
151
- oldDoc: expect.objectContaining(john.toObject(toObjectOptions)),
152
- })
153
-
154
- // Check if data is deleted
155
- const deletedJohn = await UserModel.findById(john._id)
156
- expect(deletedJohn).toBeNull()
157
-
158
- const remaining = await UserModel.find({})
159
- expect(remaining).toHaveLength(2)
160
- })
161
-
162
- it('should findOneAndRemove() and emit one delete event', async () => {
163
- const users = await UserModel.create([
164
- { name: 'John', role: 'user' },
165
- { name: 'Alice', role: 'admin' },
166
- { name: 'Bob', role: 'admin' },
167
- ])
168
-
169
- const [john] = users
170
-
171
- if (isMongooseLessThan7) {
172
- // @ts-expect-error not available in Mongoose 6 and below
173
- await UserModel.findOneAndRemove({ role: 'user' }).exec()
174
- } else {
175
- await UserModel.findOneAndDelete({ role: 'user' }).exec()
176
- }
177
-
178
- const history = await HistoryModel.find({})
179
- expect(history).toHaveLength(0)
180
-
181
- expect(em.emit).toHaveBeenCalledTimes(1)
182
- expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
183
- oldDoc: expect.objectContaining(john.toObject(toObjectOptions)),
184
- })
185
-
186
- // Check if data is deleted
187
- const deletedJohn = await UserModel.findById(john._id)
188
- expect(deletedJohn).toBeNull()
189
-
190
- const remaining = await UserModel.find({ name: { $in: ['Alice', 'Bob'] } })
191
- expect(remaining).toHaveLength(2)
192
- })
193
-
194
- it('should findByIdAndDelete() and emit one delete event', async () => {
195
- const users = await UserModel.create([
196
- { name: 'John', role: 'user' },
197
- { name: 'Alice', role: 'user' },
198
- { name: 'Bob', role: 'admin' },
199
- ])
200
-
201
- const [john] = users
202
-
203
- await UserModel.findByIdAndDelete(john._id).exec()
204
-
205
- const history = await HistoryModel.find({})
206
- expect(history).toHaveLength(0)
207
-
208
- expect(em.emit).toHaveBeenCalledTimes(1)
209
- expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
210
- oldDoc: expect.objectContaining(john.toObject(toObjectOptions)),
211
- })
212
-
213
- // Check if data is deleted
214
- const deletedJohn = await UserModel.findById(john._id)
215
- expect(deletedJohn).toBeNull()
216
-
217
- const remaining = await UserModel.find({ name: { $in: ['Alice', 'Bob'] } })
218
- expect(remaining).toHaveLength(2)
219
- })
220
-
221
- it('should findByIdAndRemove() and emit one delete event', async () => {
222
- const users = await UserModel.create([
223
- { name: 'John', role: 'user' },
224
- { name: 'Alice', role: 'user' },
225
- { name: 'Bob', role: 'admin' },
226
- ])
227
-
228
- const [john] = users
229
-
230
- if (isMongooseLessThan7) {
231
- // @ts-expect-error not available in Mongoose 6 and below
232
- await UserModel.findByIdAndRemove(john._id).exec()
233
- } else {
234
- await UserModel.findByIdAndDelete(john._id).exec()
235
- }
236
-
237
- const history = await HistoryModel.find({})
238
- expect(history).toHaveLength(0)
239
-
240
- expect(em.emit).toHaveBeenCalledTimes(1)
241
- expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
242
- oldDoc: expect.objectContaining(john.toObject(toObjectOptions)),
243
- })
244
-
245
- // Check if data is deleted
246
- const deletedJohn = await UserModel.findById(john._id)
247
- expect(deletedJohn).toBeNull()
248
-
249
- const remaining = await UserModel.find({ name: { $in: ['Alice', 'Bob'] } })
250
- expect(remaining).toHaveLength(2)
251
- })
252
-
253
- it('should deleteOne() and emit one delete event', async () => {
254
- const users = await UserModel.create([
255
- { name: 'John', role: 'user' },
256
- { name: 'Alice', role: 'admin' },
257
- { name: 'Bob', role: 'admin' },
258
- ])
259
-
260
- const [john] = users
261
-
262
- await UserModel.deleteOne({ role: 'user' }).exec()
263
-
264
- const history = await HistoryModel.find({})
265
- expect(history).toHaveLength(0)
266
-
267
- expect(em.emit).toHaveBeenCalledTimes(1)
268
- expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
269
- oldDoc: expect.objectContaining(john.toObject(toObjectOptions)),
270
- })
271
-
272
- // Check if data is deleted
273
- const deletedJohn = await UserModel.findById(john._id)
274
- expect(deletedJohn).toBeNull()
275
-
276
- const remaining = await UserModel.find({ name: { $in: ['Alice', 'Bob'] } })
277
- expect(remaining).toHaveLength(2)
278
- })
279
-
280
- it('should deleteMany() and emit two delete events', async () => {
281
- const users = await UserModel.create([
282
- { name: 'John', role: 'user' },
283
- { name: 'Alice', role: 'user' },
284
- { name: 'Bob', role: 'admin' },
285
- ])
286
-
287
- const [john, alice] = users
288
-
289
- await UserModel.deleteMany({ role: 'user' }).exec()
290
-
291
- const history = await HistoryModel.find({})
292
- expect(history).toHaveLength(0)
293
-
294
- expect(em.emit).toHaveBeenCalledTimes(2)
295
- expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
296
- oldDoc: expect.objectContaining(john.toObject(toObjectOptions)),
297
- })
298
- expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
299
- oldDoc: expect.objectContaining(alice.toObject(toObjectOptions)),
300
- })
301
-
302
- // Check if data is deleted
303
- const deletedJohn = await UserModel.findById(john._id)
304
- expect(deletedJohn).toBeNull()
305
-
306
- const deletedAlice = await UserModel.findById(alice._id)
307
- expect(deletedAlice).toBeNull()
308
-
309
- const remaining = await UserModel.find({})
310
- expect(remaining).toHaveLength(1)
311
- })
312
-
313
- it('should deleteMany() and emit one delete event { single: true }', async () => {
314
- const users = await UserModel.create([
315
- { name: 'John', role: 'user' },
316
- { name: 'Alice', role: 'user' },
317
- { name: 'Bob', role: 'admin' },
318
- ])
319
-
320
- const [john] = users
321
-
322
- if (isMongooseLessThan7) {
323
- await UserModel.deleteMany({ name: 'John' }, { single: true }).exec()
324
- } else {
325
- await UserModel.deleteOne({ name: 'John' }).exec()
326
- }
327
-
328
- const history = await HistoryModel.find({})
329
- expect(history).toHaveLength(0)
330
-
331
- expect(em.emit).toHaveBeenCalledTimes(1)
332
- expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
333
- oldDoc: expect.objectContaining(john.toObject(toObjectOptions)),
334
- })
335
-
336
- // Check if data is deleted
337
- const deletedJohn = await UserModel.findById(john._id)
338
- expect(deletedJohn).toBeNull()
339
-
340
- const remaining = await UserModel.find({})
341
- expect(remaining).toHaveLength(2)
342
- })
343
-
344
- it('should create then delete and emit one delete event', async () => {
345
- const john = await UserModel.create({ name: 'John', role: 'user' })
346
-
347
- if (isMongooseLessThan7) {
348
- // @ts-expect-error not available in Mongoose 6 and below
349
- await john.delete()
350
- } else {
351
- await john.deleteOne()
352
- }
353
-
354
- const history = await HistoryModel.find({})
355
- expect(history).toHaveLength(0)
356
-
357
- expect(em.emit).toHaveBeenCalledTimes(1)
358
- expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
359
- oldDoc: expect.objectContaining(john.toObject(toObjectOptions)),
360
- })
361
-
362
- // Check if data is deleted
363
- const deletedJohn = await UserModel.findById(john._id)
364
- expect(deletedJohn).toBeNull()
365
-
366
- const remaining = await UserModel.find({})
367
- expect(remaining).toHaveLength(0)
368
- })
369
-
370
- it('should ignoreHook option on deleteMany', async () => {
371
- const john = await UserModel.create({ name: 'John', role: 'user' })
372
- await UserModel.deleteMany({ role: 'user' }, { ignoreHook: true }).exec()
373
-
374
- const history = await HistoryModel.find({})
375
- expect(history).toHaveLength(0)
376
-
377
- expect(em.emit).toHaveBeenCalledTimes(0)
378
-
379
- // Check if data is deleted
380
- const deletedJohn = await UserModel.findById(john._id)
381
- expect(deletedJohn).toBeNull()
382
- })
383
-
384
- it('should ignoreHook option on deleteOne', async () => {
385
- const john = await UserModel.create({ name: 'John', role: 'user' })
386
- await UserModel.deleteOne({ role: 'user' }, { ignoreHook: true }).exec()
387
-
388
- const history = await HistoryModel.find({})
389
- expect(history).toHaveLength(0)
390
-
391
- expect(em.emit).toHaveBeenCalledTimes(0)
392
-
393
- // Check if data is deleted
394
- const deletedJohn = await UserModel.findById(john._id)
395
- expect(deletedJohn).toBeNull()
396
-
397
- const remaining = await UserModel.find({})
398
- expect(remaining).toHaveLength(0)
399
- })
400
- })