ts-patch-mongoose 3.1.0 → 4.0.0
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.
- package/README.md +39 -27
- package/dist/index.cjs +287 -32
- package/dist/index.d.cts +23 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +23 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +287 -32
- package/package.json +19 -24
- package/biome.json +0 -47
- package/src/em.ts +0 -6
- package/src/helpers.ts +0 -174
- package/src/hooks/delete-hooks.ts +0 -49
- package/src/hooks/save-hooks.ts +0 -30
- package/src/hooks/update-hooks.ts +0 -125
- package/src/index.ts +0 -65
- package/src/model.ts +0 -50
- package/src/modules/power-assign.d.ts +0 -3
- package/src/ms.ts +0 -66
- package/src/omit-deep.ts +0 -56
- package/src/patch.ts +0 -154
- package/src/types.ts +0 -53
- package/src/version.ts +0 -13
- package/tests/constants/events.ts +0 -7
- package/tests/em.test.ts +0 -70
- package/tests/helpers.test.ts +0 -373
- package/tests/mongo/.gitignore +0 -3
- package/tests/mongo/server.ts +0 -31
- package/tests/ms.test.ts +0 -113
- package/tests/omit-deep.test.ts +0 -235
- package/tests/patch.test.ts +0 -200
- package/tests/plugin-all-features.test.ts +0 -844
- package/tests/plugin-complex-data.test.ts +0 -2647
- package/tests/plugin-event-created.test.ts +0 -371
- package/tests/plugin-event-deleted.test.ts +0 -400
- package/tests/plugin-event-updated.test.ts +0 -503
- package/tests/plugin-global.test.ts +0 -545
- package/tests/plugin-omit-all.test.ts +0 -349
- package/tests/plugin-patch-history-disabled.test.ts +0 -162
- package/tests/plugin-pre-delete.test.ts +0 -160
- package/tests/plugin-pre-save.test.ts +0 -54
- package/tests/plugin.test.ts +0 -576
- package/tests/schemas/Description.ts +0 -15
- package/tests/schemas/Product.ts +0 -38
- package/tests/schemas/User.ts +0 -22
- package/tsconfig.json +0 -32
- package/vite.config.mts +0 -24
|
@@ -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(() => {
|
|
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).toHaveBeenCalledOnce()
|
|
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).toHaveBeenCalledOnce()
|
|
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).toHaveBeenCalledOnce()
|
|
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).toHaveBeenCalledOnce()
|
|
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).toHaveBeenCalledOnce()
|
|
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).toHaveBeenCalledOnce()
|
|
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).toHaveBeenCalledOnce()
|
|
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).toHaveBeenCalledOnce()
|
|
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).toHaveBeenCalledOnce()
|
|
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
|
-
})
|