ts-patch-mongoose 1.0.2 → 1.0.4
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 +42 -4
- package/dist/cjs/plugin.d.ts.map +1 -1
- package/dist/cjs/plugin.js +31 -60
- package/dist/cjs/plugin.js.map +1 -1
- package/dist/esm/plugin.d.ts.map +1 -1
- package/dist/esm/plugin.js +31 -60
- package/dist/esm/plugin.js.map +1 -1
- package/dist/types/plugin.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/plugin.ts +32 -67
- package/tests/mongose.test.ts +4 -4
- package/tests/plugin-omit-all.test.ts +337 -0
- package/tests/plugin-patch-history-disabled.test.ts +150 -0
- package/tests/plugin.test.ts +376 -52
- package/tests/schemas/UserSchema.ts +16 -0
- package/tests/models/User.ts +0 -29
package/README.md
CHANGED
|
@@ -15,13 +15,34 @@ Patch history & events for mongoose models
|
|
|
15
15
|
|
|
16
16
|
[](https://www.npmjs.com/package/ts-patch-mongoose)
|
|
17
17
|
|
|
18
|
+
## Motivation
|
|
19
|
+
|
|
20
|
+
ts-patch-mongoose is a plugin for mongoose and requires it as peer dependency
|
|
21
|
+
\
|
|
22
|
+
I needed to track changes in my mongoose models and save them as patch history (audit log) in separate collection. Events will allow me to track changes in my models and react to them in other parts of the application. I also wanted to omit some fields from patch history.
|
|
23
|
+
|
|
24
|
+
## Features
|
|
25
|
+
|
|
26
|
+
- Track changes in mongoose models
|
|
27
|
+
- Save changes in a separate collection as a patch history
|
|
28
|
+
- Emit events when a model is created, updated or deleted
|
|
29
|
+
- Supports typescript
|
|
30
|
+
- Let you omit fields that you don't want to track in patch history
|
|
31
|
+
- Subscribe to one/many types of event
|
|
32
|
+
- You can use events or patch history or both
|
|
33
|
+
|
|
18
34
|
## Installation
|
|
19
35
|
|
|
36
|
+
- Locally inside your project
|
|
37
|
+
|
|
20
38
|
```bash
|
|
21
39
|
npm install ts-patch-mongoose
|
|
40
|
+
yarn add ts-patch-mongoose
|
|
22
41
|
```
|
|
23
42
|
|
|
24
|
-
##
|
|
43
|
+
## Example
|
|
44
|
+
|
|
45
|
+
Setup your mongoose model
|
|
25
46
|
|
|
26
47
|
```typescript
|
|
27
48
|
import { Schema, model } from 'mongoose'
|
|
@@ -43,11 +64,18 @@ const UserSchema = new Schema<IUser>({
|
|
|
43
64
|
}
|
|
44
65
|
}, { timestamps: true })
|
|
45
66
|
|
|
46
|
-
UserSchema.plugin(patchHistoryPlugin, {
|
|
67
|
+
UserSchema.plugin(patchHistoryPlugin, {
|
|
68
|
+
// In case you just want to track changes in your models using events below.
|
|
69
|
+
// And don't want to save changes to patch history collection
|
|
70
|
+
patchHistoryDisabled: true,
|
|
71
|
+
|
|
72
|
+
// Create event constants provide them to plugin and use them to subscribe to events
|
|
47
73
|
eventCreated: USER_CREATED_EVENT,
|
|
48
74
|
eventUpdated: USER_UPDATED_EVENT,
|
|
49
75
|
eventDeleted: USER_DELETED_EVENT,
|
|
50
|
-
|
|
76
|
+
|
|
77
|
+
// You can omit some properties in case you don't want to save them to patch history
|
|
78
|
+
omit: ['__v', 'createdAt', 'updatedAt']
|
|
51
79
|
})
|
|
52
80
|
|
|
53
81
|
const User = model('User', UserSchema)
|
|
@@ -55,7 +83,9 @@ const User = model('User', UserSchema)
|
|
|
55
83
|
export default User
|
|
56
84
|
```
|
|
57
85
|
|
|
58
|
-
##
|
|
86
|
+
## Subscribe
|
|
87
|
+
|
|
88
|
+
You can subscribe to events using patchEventEmitter anywhere in your application
|
|
59
89
|
|
|
60
90
|
```typescript
|
|
61
91
|
import { patchEventEmitter } from 'ts-patch-mongoose'
|
|
@@ -63,4 +93,12 @@ import { patchEventEmitter } from 'ts-patch-mongoose'
|
|
|
63
93
|
patchEventEmitter.on(USER_CREATED_EVENT, ({ doc }) => {
|
|
64
94
|
console.log('User created', doc)
|
|
65
95
|
})
|
|
96
|
+
|
|
97
|
+
patchEventEmitter.on(USER_UPDATED_EVENT, ({ doc, oldDoc, patch }) => {
|
|
98
|
+
console.log('User updated', doc, patch)
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
patchEventEmitter.on(USER_DELETED_EVENT, ({ doc }) => {
|
|
102
|
+
console.log('User deleted', doc)
|
|
103
|
+
})
|
|
66
104
|
```
|
package/dist/cjs/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,OAAO,KAAK,EAAmC,KAAK,EAAiB,MAAM,EAAS,MAAM,UAAU,CAAA;AAEpG,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,OAAO,KAAK,EAAmC,KAAK,EAAiB,MAAM,EAAS,MAAM,UAAU,CAAA;AAEpG,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AAwE7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IAgJlG,CAAA"}
|
package/dist/cjs/plugin.js
CHANGED
|
@@ -21,36 +21,6 @@ function getObjects(opts, current, original) {
|
|
|
21
21
|
}
|
|
22
22
|
return { currentObject, originalObject };
|
|
23
23
|
}
|
|
24
|
-
async function bulkPatch(opts, context) {
|
|
25
|
-
const chunks = lodash_1.default.chunk(context.deletedDocs, 1000);
|
|
26
|
-
for await (const chunk of chunks) {
|
|
27
|
-
const bulk = [];
|
|
28
|
-
for (const oldDoc of chunk) {
|
|
29
|
-
if (opts.eventDeleted) {
|
|
30
|
-
em_1.default.emit(opts.eventDeleted, { oldDoc });
|
|
31
|
-
}
|
|
32
|
-
if (!opts.patchHistoryDisabled) {
|
|
33
|
-
bulk.push({
|
|
34
|
-
insertOne: {
|
|
35
|
-
document: {
|
|
36
|
-
op: context.op,
|
|
37
|
-
modelName: context.modelName,
|
|
38
|
-
collectionName: context.collectionName,
|
|
39
|
-
collectionId: oldDoc._id,
|
|
40
|
-
doc: oldDoc,
|
|
41
|
-
version: 0
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
if (opts.patchHistoryDisabled)
|
|
48
|
-
continue;
|
|
49
|
-
await History_1.default.bulkWrite(bulk, { ordered: false }).catch((err) => {
|
|
50
|
-
console.error(err);
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
24
|
async function updatePatch(opts, context, current, original) {
|
|
55
25
|
const { currentObject, originalObject } = getObjects(opts, current, original);
|
|
56
26
|
if (lodash_1.default.isEmpty(originalObject) || lodash_1.default.isEmpty(currentObject))
|
|
@@ -161,7 +131,8 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
161
131
|
const update = this.getUpdate();
|
|
162
132
|
if (update && this._context.isNew) {
|
|
163
133
|
const cursor = this.model.findOne(update).cursor();
|
|
164
|
-
await cursor.eachAsync(async (
|
|
134
|
+
await cursor.eachAsync(async (doc) => {
|
|
135
|
+
const current = doc.toObject({ depopulate: true });
|
|
165
136
|
if (opts.eventCreated) {
|
|
166
137
|
em_1.default.emit(opts.eventCreated, { doc: current });
|
|
167
138
|
}
|
|
@@ -169,33 +140,6 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
169
140
|
});
|
|
170
141
|
}
|
|
171
142
|
});
|
|
172
|
-
schema.pre('updateMany', options, async function (next) {
|
|
173
|
-
const filter = this.getFilter();
|
|
174
|
-
const options = this.getOptions();
|
|
175
|
-
const ignore = options.__ignore;
|
|
176
|
-
const context = {
|
|
177
|
-
op: this.op,
|
|
178
|
-
modelName: opts.modelName ?? this.model.modelName,
|
|
179
|
-
collectionName: opts.collectionName ?? this.model.collection.collectionName,
|
|
180
|
-
isNew: options.upsert
|
|
181
|
-
};
|
|
182
|
-
if (!ignore) {
|
|
183
|
-
const ids = await this.model.distinct('_id', filter).exec();
|
|
184
|
-
context.updatedIds = ids;
|
|
185
|
-
}
|
|
186
|
-
this._context = context;
|
|
187
|
-
next();
|
|
188
|
-
});
|
|
189
|
-
schema.post('updateMany', options, async function () {
|
|
190
|
-
if (this._context.updatedIds?.length)
|
|
191
|
-
return;
|
|
192
|
-
const cursor = this.model.find({ _id: { $in: this._context.updatedIds } }).cursor();
|
|
193
|
-
await cursor.eachAsync((current) => {
|
|
194
|
-
if (opts.eventUpdated) {
|
|
195
|
-
em_1.default.emit(opts.eventUpdated, { doc: current });
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
});
|
|
199
143
|
schema.pre(['remove', 'findOneAndDelete', 'findOneAndRemove', 'deleteOne', 'deleteMany'], options, async function (next) {
|
|
200
144
|
const filter = this.getFilter();
|
|
201
145
|
const options = this.getOptions();
|
|
@@ -215,9 +159,36 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
215
159
|
next();
|
|
216
160
|
});
|
|
217
161
|
schema.post(['remove', 'findOneAndDelete', 'findOneAndRemove', 'deleteOne', 'deleteMany'], options, async function () {
|
|
218
|
-
if (lodash_1.default.isEmpty(this._context.deletedDocs))
|
|
162
|
+
if (lodash_1.default.isEmpty(this._context.deletedDocs) || (!opts.eventDeleted && opts.patchHistoryDisabled))
|
|
219
163
|
return;
|
|
220
|
-
|
|
164
|
+
const chunks = lodash_1.default.chunk(this._context.deletedDocs, 1000);
|
|
165
|
+
for await (const chunk of chunks) {
|
|
166
|
+
const bulk = [];
|
|
167
|
+
for (const oldDoc of chunk) {
|
|
168
|
+
if (opts.eventDeleted) {
|
|
169
|
+
em_1.default.emit(opts.eventDeleted, { oldDoc });
|
|
170
|
+
}
|
|
171
|
+
if (!opts.patchHistoryDisabled) {
|
|
172
|
+
bulk.push({
|
|
173
|
+
insertOne: {
|
|
174
|
+
document: {
|
|
175
|
+
op: this._context.op,
|
|
176
|
+
modelName: this._context.modelName,
|
|
177
|
+
collectionName: this._context.collectionName,
|
|
178
|
+
collectionId: oldDoc._id,
|
|
179
|
+
doc: oldDoc,
|
|
180
|
+
version: 0
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (!opts.patchHistoryDisabled) {
|
|
187
|
+
await History_1.default.bulkWrite(bulk, { ordered: false }).catch((err) => {
|
|
188
|
+
console.error(err);
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
221
192
|
});
|
|
222
193
|
};
|
|
223
194
|
exports.patchHistoryPlugin = patchHistoryPlugin;
|
package/dist/cjs/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;AAAA,4DAAsB;AACtB,kEAA4B;AAC5B,8EAAuC;AACvC,+CAAqC;AAQrC,sDAAqB;AACrB,uEAAsC;AAEtC,MAAM,OAAO,GAAG;IACd,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,IAAI;CACZ,CAAA;AAED,SAAS,UAAU,CAAK,IAAuB,EAAE,OAA4B,EAAE,QAA6B;IAC1G,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAe,CAAA;IACrE,IAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAe,CAAA;IAEvE,IAAI,IAAI,CAAC,IAAI,EAAE;QACb,aAAa,GAAG,IAAA,mBAAI,EAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,cAAc,GAAG,IAAA,mBAAI,EAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;KACjD;IAED,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,CAAA;AAC1C,CAAC;AAED,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,OAAO,KAAK,EAAmC,KAAK,EAAiB,MAAM,EAAS,MAAM,UAAU,CAAA;AAEpG,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,OAAO,KAAK,EAAmC,KAAK,EAAiB,MAAM,EAAS,MAAM,UAAU,CAAA;AAEpG,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AAwE7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IAgJlG,CAAA"}
|
package/dist/esm/plugin.js
CHANGED
|
@@ -17,36 +17,6 @@ function getObjects(opts, current, original) {
|
|
|
17
17
|
}
|
|
18
18
|
return { currentObject, originalObject };
|
|
19
19
|
}
|
|
20
|
-
async function bulkPatch(opts, context) {
|
|
21
|
-
const chunks = _.chunk(context.deletedDocs, 1000);
|
|
22
|
-
for await (const chunk of chunks) {
|
|
23
|
-
const bulk = [];
|
|
24
|
-
for (const oldDoc of chunk) {
|
|
25
|
-
if (opts.eventDeleted) {
|
|
26
|
-
em.emit(opts.eventDeleted, { oldDoc });
|
|
27
|
-
}
|
|
28
|
-
if (!opts.patchHistoryDisabled) {
|
|
29
|
-
bulk.push({
|
|
30
|
-
insertOne: {
|
|
31
|
-
document: {
|
|
32
|
-
op: context.op,
|
|
33
|
-
modelName: context.modelName,
|
|
34
|
-
collectionName: context.collectionName,
|
|
35
|
-
collectionId: oldDoc._id,
|
|
36
|
-
doc: oldDoc,
|
|
37
|
-
version: 0
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
if (opts.patchHistoryDisabled)
|
|
44
|
-
continue;
|
|
45
|
-
await History.bulkWrite(bulk, { ordered: false }).catch((err) => {
|
|
46
|
-
console.error(err);
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
20
|
async function updatePatch(opts, context, current, original) {
|
|
51
21
|
const { currentObject, originalObject } = getObjects(opts, current, original);
|
|
52
22
|
if (_.isEmpty(originalObject) || _.isEmpty(currentObject))
|
|
@@ -157,7 +127,8 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
157
127
|
const update = this.getUpdate();
|
|
158
128
|
if (update && this._context.isNew) {
|
|
159
129
|
const cursor = this.model.findOne(update).cursor();
|
|
160
|
-
await cursor.eachAsync(async (
|
|
130
|
+
await cursor.eachAsync(async (doc) => {
|
|
131
|
+
const current = doc.toObject({ depopulate: true });
|
|
161
132
|
if (opts.eventCreated) {
|
|
162
133
|
em.emit(opts.eventCreated, { doc: current });
|
|
163
134
|
}
|
|
@@ -165,33 +136,6 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
165
136
|
});
|
|
166
137
|
}
|
|
167
138
|
});
|
|
168
|
-
schema.pre('updateMany', options, async function (next) {
|
|
169
|
-
const filter = this.getFilter();
|
|
170
|
-
const options = this.getOptions();
|
|
171
|
-
const ignore = options.__ignore;
|
|
172
|
-
const context = {
|
|
173
|
-
op: this.op,
|
|
174
|
-
modelName: opts.modelName ?? this.model.modelName,
|
|
175
|
-
collectionName: opts.collectionName ?? this.model.collection.collectionName,
|
|
176
|
-
isNew: options.upsert
|
|
177
|
-
};
|
|
178
|
-
if (!ignore) {
|
|
179
|
-
const ids = await this.model.distinct('_id', filter).exec();
|
|
180
|
-
context.updatedIds = ids;
|
|
181
|
-
}
|
|
182
|
-
this._context = context;
|
|
183
|
-
next();
|
|
184
|
-
});
|
|
185
|
-
schema.post('updateMany', options, async function () {
|
|
186
|
-
if (this._context.updatedIds?.length)
|
|
187
|
-
return;
|
|
188
|
-
const cursor = this.model.find({ _id: { $in: this._context.updatedIds } }).cursor();
|
|
189
|
-
await cursor.eachAsync((current) => {
|
|
190
|
-
if (opts.eventUpdated) {
|
|
191
|
-
em.emit(opts.eventUpdated, { doc: current });
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
139
|
schema.pre(['remove', 'findOneAndDelete', 'findOneAndRemove', 'deleteOne', 'deleteMany'], options, async function (next) {
|
|
196
140
|
const filter = this.getFilter();
|
|
197
141
|
const options = this.getOptions();
|
|
@@ -211,9 +155,36 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
211
155
|
next();
|
|
212
156
|
});
|
|
213
157
|
schema.post(['remove', 'findOneAndDelete', 'findOneAndRemove', 'deleteOne', 'deleteMany'], options, async function () {
|
|
214
|
-
if (_.isEmpty(this._context.deletedDocs))
|
|
158
|
+
if (_.isEmpty(this._context.deletedDocs) || (!opts.eventDeleted && opts.patchHistoryDisabled))
|
|
215
159
|
return;
|
|
216
|
-
|
|
160
|
+
const chunks = _.chunk(this._context.deletedDocs, 1000);
|
|
161
|
+
for await (const chunk of chunks) {
|
|
162
|
+
const bulk = [];
|
|
163
|
+
for (const oldDoc of chunk) {
|
|
164
|
+
if (opts.eventDeleted) {
|
|
165
|
+
em.emit(opts.eventDeleted, { oldDoc });
|
|
166
|
+
}
|
|
167
|
+
if (!opts.patchHistoryDisabled) {
|
|
168
|
+
bulk.push({
|
|
169
|
+
insertOne: {
|
|
170
|
+
document: {
|
|
171
|
+
op: this._context.op,
|
|
172
|
+
modelName: this._context.modelName,
|
|
173
|
+
collectionName: this._context.collectionName,
|
|
174
|
+
collectionId: oldDoc._id,
|
|
175
|
+
doc: oldDoc,
|
|
176
|
+
version: 0
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (!opts.patchHistoryDisabled) {
|
|
183
|
+
await History.bulkWrite(bulk, { ordered: false }).catch((err) => {
|
|
184
|
+
console.error(err);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
217
188
|
});
|
|
218
189
|
};
|
|
219
190
|
//# sourceMappingURL=plugin.js.map
|
package/dist/esm/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AACtB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,SAAS,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAQrC,OAAO,EAAE,MAAM,MAAM,CAAA;AACrB,OAAO,OAAO,MAAM,kBAAkB,CAAA;AAEtC,MAAM,OAAO,GAAG;IACd,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,IAAI;CACZ,CAAA;AAED,SAAS,UAAU,CAAK,IAAuB,EAAE,OAA4B,EAAE,QAA6B;IAC1G,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAe,CAAA;IACrE,IAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAe,CAAA;IAEvE,IAAI,IAAI,CAAC,IAAI,EAAE;QACb,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;KACjD;IAED,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,CAAA;AAC1C,CAAC;AAED,KAAK,UAAU,
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,OAAO,KAAK,EAAmC,KAAK,EAAiB,MAAM,EAAS,MAAM,UAAU,CAAA;AAEpG,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,OAAO,KAAK,EAAmC,KAAK,EAAiB,MAAM,EAAS,MAAM,UAAU,CAAA;AAEpG,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AAwE7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IAgJlG,CAAA"}
|
package/package.json
CHANGED
package/src/plugin.ts
CHANGED
|
@@ -29,37 +29,6 @@ function getObjects<T> (opts: IPluginOptions<T>, current: HydratedDocument<T>, o
|
|
|
29
29
|
return { currentObject, originalObject }
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
async function bulkPatch<T> (opts: IPluginOptions<T>, context: IContext<T>): Promise<void> {
|
|
33
|
-
const chunks = _.chunk(context.deletedDocs, 1000)
|
|
34
|
-
for await (const chunk of chunks) {
|
|
35
|
-
const bulk = []
|
|
36
|
-
for (const oldDoc of chunk) {
|
|
37
|
-
if (opts.eventDeleted) {
|
|
38
|
-
em.emit(opts.eventDeleted, { oldDoc })
|
|
39
|
-
}
|
|
40
|
-
if (!opts.patchHistoryDisabled) {
|
|
41
|
-
bulk.push({
|
|
42
|
-
insertOne: {
|
|
43
|
-
document: {
|
|
44
|
-
op: context.op,
|
|
45
|
-
modelName: context.modelName,
|
|
46
|
-
collectionName: context.collectionName,
|
|
47
|
-
collectionId: oldDoc._id as Types.ObjectId,
|
|
48
|
-
doc: oldDoc,
|
|
49
|
-
version: 0
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
})
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (opts.patchHistoryDisabled) continue
|
|
57
|
-
await History.bulkWrite(bulk, { ordered: false }).catch((err: MongooseError) => {
|
|
58
|
-
console.error(err)
|
|
59
|
-
})
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
32
|
async function updatePatch<T> (opts: IPluginOptions<T>, context: IContext<T>, current: HydratedDocument<T>, original: HydratedDocument<T>): Promise<void> {
|
|
64
33
|
const { currentObject, originalObject } = getObjects(opts, current, original)
|
|
65
34
|
|
|
@@ -195,7 +164,8 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
|
|
|
195
164
|
|
|
196
165
|
if (update && this._context.isNew) {
|
|
197
166
|
const cursor = this.model.findOne(update).cursor()
|
|
198
|
-
await cursor.eachAsync(async (
|
|
167
|
+
await cursor.eachAsync(async (doc: HydratedDocument<T>) => {
|
|
168
|
+
const current = doc.toObject({ depopulate: true }) as HydratedDocument<T>
|
|
199
169
|
if (opts.eventCreated) {
|
|
200
170
|
em.emit(opts.eventCreated, { doc: current })
|
|
201
171
|
}
|
|
@@ -204,39 +174,6 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
|
|
|
204
174
|
}
|
|
205
175
|
})
|
|
206
176
|
|
|
207
|
-
schema.pre('updateMany', options, async function (this: IHookContext<T>, next) {
|
|
208
|
-
const filter = this.getFilter()
|
|
209
|
-
const options = this.getOptions()
|
|
210
|
-
const ignore = options.__ignore as boolean
|
|
211
|
-
|
|
212
|
-
const context: IContext<T> = {
|
|
213
|
-
op: this.op,
|
|
214
|
-
modelName: opts.modelName ?? this.model.modelName,
|
|
215
|
-
collectionName: opts.collectionName ?? this.model.collection.collectionName,
|
|
216
|
-
isNew: options.upsert
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
if (!ignore) {
|
|
220
|
-
const ids = await this.model.distinct<Types.ObjectId>('_id', filter).exec()
|
|
221
|
-
context.updatedIds = ids
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
this._context = context
|
|
225
|
-
|
|
226
|
-
next()
|
|
227
|
-
})
|
|
228
|
-
|
|
229
|
-
schema.post('updateMany', options, async function (this: IHookContext<T>) {
|
|
230
|
-
if (this._context.updatedIds?.length) return
|
|
231
|
-
|
|
232
|
-
const cursor = this.model.find({ _id: { $in: this._context.updatedIds } }).cursor()
|
|
233
|
-
await cursor.eachAsync((current: HydratedDocument<T>) => {
|
|
234
|
-
if (opts.eventUpdated) {
|
|
235
|
-
em.emit(opts.eventUpdated, { doc: current })
|
|
236
|
-
}
|
|
237
|
-
})
|
|
238
|
-
})
|
|
239
|
-
|
|
240
177
|
schema.pre(['remove', 'findOneAndDelete', 'findOneAndRemove', 'deleteOne', 'deleteMany'], options, async function (this: IHookContext<T>, next) {
|
|
241
178
|
const filter = this.getFilter()
|
|
242
179
|
const options = this.getOptions()
|
|
@@ -260,8 +197,36 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
|
|
|
260
197
|
})
|
|
261
198
|
|
|
262
199
|
schema.post(['remove', 'findOneAndDelete', 'findOneAndRemove', 'deleteOne', 'deleteMany'], options, async function (this: IHookContext<T>) {
|
|
263
|
-
if (_.isEmpty(this._context.deletedDocs)) return
|
|
200
|
+
if (_.isEmpty(this._context.deletedDocs) || (!opts.eventDeleted && opts.patchHistoryDisabled)) return
|
|
201
|
+
|
|
202
|
+
const chunks = _.chunk(this._context.deletedDocs, 1000)
|
|
203
|
+
for await (const chunk of chunks) {
|
|
204
|
+
const bulk = []
|
|
205
|
+
for (const oldDoc of chunk) {
|
|
206
|
+
if (opts.eventDeleted) {
|
|
207
|
+
em.emit(opts.eventDeleted, { oldDoc })
|
|
208
|
+
}
|
|
209
|
+
if (!opts.patchHistoryDisabled) {
|
|
210
|
+
bulk.push({
|
|
211
|
+
insertOne: {
|
|
212
|
+
document: {
|
|
213
|
+
op: this._context.op,
|
|
214
|
+
modelName: this._context.modelName,
|
|
215
|
+
collectionName: this._context.collectionName,
|
|
216
|
+
collectionId: oldDoc._id as Types.ObjectId,
|
|
217
|
+
doc: oldDoc,
|
|
218
|
+
version: 0
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
})
|
|
222
|
+
}
|
|
223
|
+
}
|
|
264
224
|
|
|
265
|
-
|
|
225
|
+
if (!opts.patchHistoryDisabled) {
|
|
226
|
+
await History.bulkWrite(bulk, { ordered: false }).catch((err: MongooseError) => {
|
|
227
|
+
console.error(err)
|
|
228
|
+
})
|
|
229
|
+
}
|
|
230
|
+
}
|
|
266
231
|
})
|
|
267
232
|
}
|
package/tests/mongose.test.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import mongoose from 'mongoose'
|
|
2
2
|
|
|
3
|
-
describe('mongoose', () => {
|
|
3
|
+
describe('mongoose - in-memory test', () => {
|
|
4
4
|
const uri = `${globalThis.__MONGO_URI__}${globalThis.__MONGO_DB_NAME__}`
|
|
5
5
|
|
|
6
6
|
beforeAll(async () => {
|
|
@@ -19,10 +19,10 @@ describe('mongoose', () => {
|
|
|
19
19
|
it('should insert a doc into collection', async () => {
|
|
20
20
|
const users = mongoose.connection.db.collection('users')
|
|
21
21
|
|
|
22
|
-
const
|
|
23
|
-
const user = await users.insertOne(
|
|
22
|
+
const doc = { name: 'John' }
|
|
23
|
+
const user = await users.insertOne(doc)
|
|
24
24
|
|
|
25
25
|
const insertedUser = await users.findOne({ _id: user.insertedId })
|
|
26
|
-
expect(insertedUser).toEqual(
|
|
26
|
+
expect(insertedUser).toEqual(doc)
|
|
27
27
|
})
|
|
28
28
|
})
|