ts-patch-mongoose 2.6.7 → 2.6.9
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 +7 -1
- package/dist/cjs/helpers.js +32 -1
- package/dist/cjs/helpers.js.map +1 -1
- package/dist/cjs/hooks/delete-hooks.js +4 -5
- package/dist/cjs/hooks/delete-hooks.js.map +1 -1
- package/dist/cjs/hooks/update-hooks.js +10 -11
- package/dist/cjs/hooks/update-hooks.js.map +1 -1
- package/dist/cjs/patch.js +10 -10
- package/dist/cjs/patch.js.map +1 -1
- package/dist/cjs/plugin.js +5 -3
- package/dist/cjs/plugin.js.map +1 -1
- package/dist/cjs/types/helpers.d.ts +1 -0
- package/dist/cjs/types/helpers.d.ts.map +1 -1
- package/dist/cjs/types/hooks/update-hooks.d.ts.map +1 -1
- package/dist/cjs/types/plugin.d.ts +1 -0
- package/dist/cjs/types/plugin.d.ts.map +1 -1
- package/dist/esm/helpers.js +29 -0
- package/dist/esm/helpers.js.map +1 -1
- package/dist/esm/hooks/delete-hooks.js +4 -4
- package/dist/esm/hooks/delete-hooks.js.map +1 -1
- package/dist/esm/hooks/update-hooks.js +10 -10
- package/dist/esm/hooks/update-hooks.js.map +1 -1
- package/dist/esm/patch.js +10 -10
- package/dist/esm/patch.js.map +1 -1
- package/dist/esm/plugin.js +3 -2
- package/dist/esm/plugin.js.map +1 -1
- package/dist/esm/types/helpers.d.ts +1 -0
- package/dist/esm/types/helpers.d.ts.map +1 -1
- package/dist/esm/types/hooks/update-hooks.d.ts.map +1 -1
- package/dist/esm/types/plugin.d.ts +1 -0
- package/dist/esm/types/plugin.d.ts.map +1 -1
- package/package.json +7 -5
- package/src/helpers.ts +43 -0
- package/src/hooks/delete-hooks.ts +4 -4
- package/src/hooks/update-hooks.ts +11 -10
- package/src/patch.ts +10 -10
- package/src/plugin.ts +4 -2
- package/tests/helpers.test.ts +86 -0
- package/tests/plugin-event-created.test.ts +33 -1
package/README.md
CHANGED
|
@@ -105,9 +105,15 @@ import { Schema, model } from 'mongoose'
|
|
|
105
105
|
import type { HydratedDocument, Types } from 'mongoose'
|
|
106
106
|
import type IBook from '../interfaces/IBook'
|
|
107
107
|
|
|
108
|
-
import { patchHistoryPlugin } from 'ts-patch-mongoose'
|
|
108
|
+
import { patchHistoryPlugin, setPatchHistoryTTL } from 'ts-patch-mongoose'
|
|
109
109
|
import { BOOK_CREATED, BOOK_UPDATED, BOOK_DELETED } from '../constants/events'
|
|
110
110
|
|
|
111
|
+
// You can set patch history TTL in plain english or in milliseconds as you wish.
|
|
112
|
+
// This will determine how long you want to keep patch history.
|
|
113
|
+
// You don't need to use this global config in case you want to keep patch history forever.
|
|
114
|
+
// Execute this method after you connected to you database somewhere in your application.
|
|
115
|
+
setPatchHistoryTTL('1 month')
|
|
116
|
+
|
|
111
117
|
const BookSchema = new Schema<IBook>({
|
|
112
118
|
name: {
|
|
113
119
|
title: String,
|
package/dist/cjs/helpers.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toObjectOptions = exports.isHookIgnored = void 0;
|
|
3
|
+
exports.setPatchHistoryTTL = exports.toObjectOptions = exports.isHookIgnored = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const ms_1 = tslib_1.__importDefault(require("ms"));
|
|
6
|
+
const History_1 = tslib_1.__importDefault(require("./models/History"));
|
|
4
7
|
const isHookIgnored = (options) => {
|
|
5
8
|
return options.ignoreHook === true || (options.ignoreEvent === true && options.ignorePatchHistory === true);
|
|
6
9
|
};
|
|
@@ -9,4 +12,32 @@ exports.toObjectOptions = {
|
|
|
9
12
|
depopulate: true,
|
|
10
13
|
virtuals: false,
|
|
11
14
|
};
|
|
15
|
+
const setPatchHistoryTTL = async (ttl) => {
|
|
16
|
+
const name = 'createdAt_1_TTL';
|
|
17
|
+
try {
|
|
18
|
+
const indexes = await History_1.default.collection.indexes();
|
|
19
|
+
const existingIndex = indexes?.find((index) => index.name === name);
|
|
20
|
+
if (!ttl && existingIndex) {
|
|
21
|
+
await History_1.default.collection.dropIndex(name);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const milliseconds = (0, ms_1.default)(ttl);
|
|
25
|
+
if (milliseconds < 1000 && existingIndex) {
|
|
26
|
+
await History_1.default.collection.dropIndex(name);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const expireAfterSeconds = milliseconds / 1000;
|
|
30
|
+
if (existingIndex && existingIndex.expireAfterSeconds === expireAfterSeconds) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (existingIndex) {
|
|
34
|
+
await History_1.default.collection.dropIndex(name);
|
|
35
|
+
}
|
|
36
|
+
await History_1.default.collection.createIndex({ createdAt: 1 }, { expireAfterSeconds, name });
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
console.error("Couldn't create or update index for history collection", err);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
exports.setPatchHistoryTTL = setPatchHistoryTTL;
|
|
12
43
|
//# sourceMappingURL=helpers.js.map
|
package/dist/cjs/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":";;;;AAAA,oDAAmB;AAEnB,uEAAsC;AAI/B,MAAM,aAAa,GAAG,CAAI,OAAwB,EAAW,EAAE;IACpE,OAAO,OAAO,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,IAAI,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAA;AAC7G,CAAC,CAAA;AAFY,QAAA,aAAa,iBAEzB;AAEY,QAAA,eAAe,GAAoB;IAC9C,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,KAAK;CAChB,CAAA;AAEM,MAAM,kBAAkB,GAAG,KAAK,EAAE,GAAoB,EAAiB,EAAE;IAC9E,MAAM,IAAI,GAAG,iBAAiB,CAAA;IAC9B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,iBAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAA;QAClD,MAAM,aAAa,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;QAGnE,IAAI,CAAC,GAAG,IAAI,aAAa,EAAE,CAAC;YAC1B,MAAM,iBAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACxC,OAAM;QACR,CAAC;QAED,MAAM,YAAY,GAAG,IAAA,YAAE,EAAC,GAAa,CAAC,CAAA;QAGtC,IAAI,YAAY,GAAG,IAAI,IAAI,aAAa,EAAE,CAAC;YACzC,MAAM,iBAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACxC,OAAM;QACR,CAAC;QAED,MAAM,kBAAkB,GAAG,YAAY,GAAG,IAAI,CAAA;QAE9C,IAAI,aAAa,IAAI,aAAa,CAAC,kBAAkB,KAAK,kBAAkB,EAAE,CAAC;YAE7E,OAAM;QACR,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAElB,MAAM,iBAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAC1C,CAAC;QAGD,MAAM,iBAAO,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAA;IACtF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wDAAwD,EAAE,GAAG,CAAC,CAAA;IAC9E,CAAC;AACH,CAAC,CAAA;AArCY,QAAA,kBAAkB,sBAqC9B"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.deleteHooksInitialize = void 0;
|
|
4
|
-
const
|
|
5
|
-
const lodash_1 = tslib_1.__importDefault(require("lodash"));
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
6
5
|
const helpers_1 = require("../helpers");
|
|
7
6
|
const patch_1 = require("../patch");
|
|
8
7
|
const deleteMethods = ['remove', 'findOneAndDelete', 'findOneAndRemove', 'findByIdAndDelete', 'findByIdAndRemove', 'deleteOne', 'deleteMany'];
|
|
@@ -22,17 +21,17 @@ const deleteHooksInitialize = (schema, opts) => {
|
|
|
22
21
|
};
|
|
23
22
|
if (['remove', 'deleteMany'].includes(this._context.op) && !options.single) {
|
|
24
23
|
const docs = await model.find(filter).lean().exec();
|
|
25
|
-
if (!lodash_1.
|
|
24
|
+
if (!(0, lodash_1.isEmpty)(docs)) {
|
|
26
25
|
this._context.deletedDocs = docs;
|
|
27
26
|
}
|
|
28
27
|
}
|
|
29
28
|
else {
|
|
30
29
|
const doc = await model.findOne(filter).lean().exec();
|
|
31
|
-
if (!lodash_1.
|
|
30
|
+
if (!(0, lodash_1.isEmpty)(doc)) {
|
|
32
31
|
this._context.deletedDocs = [doc];
|
|
33
32
|
}
|
|
34
33
|
}
|
|
35
|
-
if (opts.preDelete && lodash_1.
|
|
34
|
+
if (opts.preDelete && (0, lodash_1.isArray)(this._context.deletedDocs) && !(0, lodash_1.isEmpty)(this._context.deletedDocs)) {
|
|
36
35
|
await opts.preDelete(this._context.deletedDocs);
|
|
37
36
|
}
|
|
38
37
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-hooks.js","sourceRoot":"","sources":["../../../src/hooks/delete-hooks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"delete-hooks.js","sourceRoot":"","sources":["../../../src/hooks/delete-hooks.ts"],"names":[],"mappings":";;;AAAA,mCAAyC;AAEzC,wCAA0C;AAC1C,oCAAsC;AAMtC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;AAEtI,MAAM,qBAAqB,GAAG,CAAI,MAAiB,EAAE,IAAuB,EAAQ,EAAE;IAC3F,MAAM,CAAC,GAAG,CAAC,aAA0C,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK;QAC5F,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACjC,IAAI,IAAA,uBAAa,EAAC,OAAO,CAAC;YAAE,OAAM;QAElC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAiB,CAAA;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAE/B,IAAI,CAAC,QAAQ,GAAG;YACd,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS;YACjD,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc;YAC3E,WAAW,EAAE,OAAO,CAAC,WAAsB;YAC3C,kBAAkB,EAAE,OAAO,CAAC,kBAA6B;SAC1D,CAAA;QAED,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3E,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAI,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAA;YACtD,IAAI,CAAC,IAAA,gBAAO,EAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,IAA6B,CAAA;YAC3D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,CAAI,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAA;YACxD,IAAI,CAAC,IAAA,gBAAO,EAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,GAAG,CAA0B,CAAA;YAC5D,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,IAAI,IAAA,gBAAO,EAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAA,gBAAO,EAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAChG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QACjD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,IAAI,CAAC,aAA0C,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK;QAC7F,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACjC,IAAI,IAAA,uBAAa,EAAC,OAAO,CAAC;YAAE,OAAM;QAElC,MAAM,IAAA,mBAAW,EAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAvCY,QAAA,qBAAqB,yBAuCjC"}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.updateHooksInitialize = exports.splitUpdateAndCommands = exports.assignUpdate = void 0;
|
|
4
|
-
const
|
|
5
|
-
const lodash_1 = tslib_1.__importDefault(require("lodash"));
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
6
5
|
const power_assign_1 = require("power-assign");
|
|
7
6
|
const helpers_1 = require("../helpers");
|
|
8
7
|
const patch_1 = require("../patch");
|
|
9
8
|
const updateMethods = ['update', 'updateOne', 'replaceOne', 'updateMany', 'findOneAndUpdate', 'findOneAndReplace', 'findByIdAndUpdate'];
|
|
10
9
|
const assignUpdate = (document, update, commands) => {
|
|
11
10
|
let updated = (0, power_assign_1.assign)(document.toObject(helpers_1.toObjectOptions), update);
|
|
12
|
-
lodash_1.
|
|
11
|
+
(0, lodash_1.forEach)(commands, (command) => {
|
|
13
12
|
try {
|
|
14
13
|
updated = (0, power_assign_1.assign)(updated, command);
|
|
15
14
|
}
|
|
@@ -25,11 +24,11 @@ exports.assignUpdate = assignUpdate;
|
|
|
25
24
|
const splitUpdateAndCommands = (updateQuery) => {
|
|
26
25
|
let update = {};
|
|
27
26
|
const commands = [];
|
|
28
|
-
if (!lodash_1.
|
|
29
|
-
update = lodash_1.
|
|
30
|
-
const
|
|
31
|
-
if (!lodash_1.
|
|
32
|
-
lodash_1.
|
|
27
|
+
if (!(0, lodash_1.isEmpty)(updateQuery) && !(0, lodash_1.isArray)(updateQuery) && (0, lodash_1.isObjectLike)(updateQuery)) {
|
|
28
|
+
update = (0, lodash_1.cloneDeep)(updateQuery);
|
|
29
|
+
const keysWithDollarSign = (0, lodash_1.keys)(update).filter((key) => key.startsWith('$'));
|
|
30
|
+
if (!(0, lodash_1.isEmpty)(keysWithDollarSign)) {
|
|
31
|
+
(0, lodash_1.forEach)(keysWithDollarSign, (key) => {
|
|
33
32
|
commands.push({ [key]: update[key] });
|
|
34
33
|
delete update[key];
|
|
35
34
|
});
|
|
@@ -71,9 +70,9 @@ const updateHooksInitialize = (schema, opts) => {
|
|
|
71
70
|
const model = this.model;
|
|
72
71
|
const updateQuery = this.getUpdate();
|
|
73
72
|
const { update, commands } = (0, exports.splitUpdateAndCommands)(updateQuery);
|
|
74
|
-
const
|
|
75
|
-
if (!lodash_1.
|
|
76
|
-
const current = await model.findOne(
|
|
73
|
+
const combined = (0, exports.assignUpdate)(model.hydrate({}), update, commands);
|
|
74
|
+
if (!(0, lodash_1.isEmpty)(combined)) {
|
|
75
|
+
const current = (await model.findOne(combined).lean().exec());
|
|
77
76
|
if (current) {
|
|
78
77
|
this._context.createdDocs = [current];
|
|
79
78
|
await (0, patch_1.createPatch)(opts, this._context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-hooks.js","sourceRoot":"","sources":["../../../src/hooks/update-hooks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update-hooks.js","sourceRoot":"","sources":["../../../src/hooks/update-hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/patch.js
CHANGED
|
@@ -14,7 +14,7 @@ exports.updatePatch = updatePatch;
|
|
|
14
14
|
exports.deletePatch = deletePatch;
|
|
15
15
|
const tslib_1 = require("tslib");
|
|
16
16
|
const fast_json_patch_1 = tslib_1.__importDefault(require("fast-json-patch"));
|
|
17
|
-
const lodash_1 =
|
|
17
|
+
const lodash_1 = require("lodash");
|
|
18
18
|
const omit_deep_1 = tslib_1.__importDefault(require("omit-deep"));
|
|
19
19
|
const em_1 = tslib_1.__importDefault(require("./em"));
|
|
20
20
|
const History_1 = tslib_1.__importDefault(require("./models/History"));
|
|
@@ -30,24 +30,24 @@ function getJsonOmit(opts, doc) {
|
|
|
30
30
|
}
|
|
31
31
|
function getObjectOmit(opts, doc) {
|
|
32
32
|
if (opts.omit) {
|
|
33
|
-
return (0, omit_deep_1.default)(lodash_1.
|
|
33
|
+
return (0, omit_deep_1.default)((0, lodash_1.isFunction)(doc?.toObject) ? doc.toObject() : doc, opts.omit);
|
|
34
34
|
}
|
|
35
35
|
return doc;
|
|
36
36
|
}
|
|
37
37
|
async function getUser(opts) {
|
|
38
|
-
if (lodash_1.
|
|
38
|
+
if ((0, lodash_1.isFunction)(opts.getUser)) {
|
|
39
39
|
return await opts.getUser();
|
|
40
40
|
}
|
|
41
41
|
return undefined;
|
|
42
42
|
}
|
|
43
43
|
async function getReason(opts) {
|
|
44
|
-
if (lodash_1.
|
|
44
|
+
if ((0, lodash_1.isFunction)(opts.getReason)) {
|
|
45
45
|
return await opts.getReason();
|
|
46
46
|
}
|
|
47
47
|
return undefined;
|
|
48
48
|
}
|
|
49
49
|
async function getMetadata(opts) {
|
|
50
|
-
if (lodash_1.
|
|
50
|
+
if ((0, lodash_1.isFunction)(opts.getMetadata)) {
|
|
51
51
|
return await opts.getMetadata();
|
|
52
52
|
}
|
|
53
53
|
return undefined;
|
|
@@ -70,10 +70,10 @@ async function bulkPatch(opts, context, eventKey, docsKey) {
|
|
|
70
70
|
const event = opts[eventKey];
|
|
71
71
|
const docs = context[docsKey];
|
|
72
72
|
const key = eventKey === 'eventCreated' ? 'doc' : 'oldDoc';
|
|
73
|
-
if (lodash_1.
|
|
73
|
+
if ((0, lodash_1.isEmpty)(docs) || (!event && !history))
|
|
74
74
|
return;
|
|
75
75
|
const [user, reason, metadata] = await getData(opts);
|
|
76
|
-
const chunks = lodash_1.
|
|
76
|
+
const chunks = (0, lodash_1.chunk)(docs, 1000);
|
|
77
77
|
for await (const chunk of chunks) {
|
|
78
78
|
const bulk = [];
|
|
79
79
|
for (const doc of chunk) {
|
|
@@ -96,7 +96,7 @@ async function bulkPatch(opts, context, eventKey, docsKey) {
|
|
|
96
96
|
});
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
|
-
if (history) {
|
|
99
|
+
if (history && !(0, lodash_1.isEmpty)(bulk)) {
|
|
100
100
|
await History_1.default.bulkWrite(bulk, { ordered: false });
|
|
101
101
|
}
|
|
102
102
|
}
|
|
@@ -108,10 +108,10 @@ async function updatePatch(opts, context, current, original) {
|
|
|
108
108
|
const history = isPatchHistoryEnabled(opts, context);
|
|
109
109
|
const currentObject = getJsonOmit(opts, current);
|
|
110
110
|
const originalObject = getJsonOmit(opts, original);
|
|
111
|
-
if (lodash_1.
|
|
111
|
+
if ((0, lodash_1.isEmpty)(originalObject) || (0, lodash_1.isEmpty)(currentObject))
|
|
112
112
|
return;
|
|
113
113
|
const patch = fast_json_patch_1.default.compare(originalObject, currentObject, true);
|
|
114
|
-
if (lodash_1.
|
|
114
|
+
if ((0, lodash_1.isEmpty)(patch))
|
|
115
115
|
return;
|
|
116
116
|
emitEvent(context, opts.eventUpdated, { oldDoc: original, doc: current, patch });
|
|
117
117
|
if (history) {
|
package/dist/cjs/patch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/patch.ts"],"names":[],"mappings":";;AAkBA,kCAQC;AAED,sCAMC;AAED,0BAKC;AAED,8BAKC;AAED,kCAKC;AAED,4BAEC;AAED,0BAIC;AAED,8BAIC;AAED,8BAwCC;AAED,kCAEC;AAED,kCAqCC;AAED,kCAEC;;AAhKD,8EAAuC;AACvC,
|
|
1
|
+
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/patch.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/plugin.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.patchHistoryPlugin = exports.patchEventEmitter = void 0;
|
|
3
|
+
exports.patchHistoryPlugin = exports.setPatchHistoryTTL = exports.patchEventEmitter = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
-
const lodash_1 =
|
|
5
|
+
const lodash_1 = require("lodash");
|
|
6
6
|
const em_1 = tslib_1.__importDefault(require("./em"));
|
|
7
7
|
const helpers_1 = require("./helpers");
|
|
8
8
|
const patch_1 = require("./patch");
|
|
@@ -12,6 +12,8 @@ const save_hooks_1 = require("./hooks/save-hooks");
|
|
|
12
12
|
const update_hooks_1 = require("./hooks/update-hooks");
|
|
13
13
|
const remove = version_1.isMongooseLessThan7 ? 'remove' : 'deleteOne';
|
|
14
14
|
exports.patchEventEmitter = em_1.default;
|
|
15
|
+
var helpers_2 = require("./helpers");
|
|
16
|
+
Object.defineProperty(exports, "setPatchHistoryTTL", { enumerable: true, get: function () { return helpers_2.setPatchHistoryTTL; } });
|
|
15
17
|
const patchHistoryPlugin = function plugin(schema, opts) {
|
|
16
18
|
(0, save_hooks_1.saveHooksInitialize)(schema, opts);
|
|
17
19
|
(0, update_hooks_1.updateHooksInitialize)(schema, opts);
|
|
@@ -28,7 +30,7 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
28
30
|
if (version_1.isMongooseLessThan8) {
|
|
29
31
|
schema.pre(remove, { document: true, query: false }, async function () {
|
|
30
32
|
const original = this.toObject(helpers_1.toObjectOptions);
|
|
31
|
-
if (opts.preDelete && !lodash_1.
|
|
33
|
+
if (opts.preDelete && !(0, lodash_1.isEmpty)(original)) {
|
|
32
34
|
await opts.preDelete([original]);
|
|
33
35
|
}
|
|
34
36
|
});
|
package/dist/cjs/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;AAAA,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;AAAA,mCAAgC;AAChC,sDAAqB;AAErB,uCAA2C;AAC3C,mCAAkD;AAClD,uCAAoE;AAEpE,uDAA4D;AAC5D,mDAAwD;AACxD,uDAA4D;AAM5D,MAAM,MAAM,GAAG,6BAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAA;AAK9C,QAAA,iBAAiB,GAAG,YAAE,CAAA;AAEnC,qCAA8C;AAArC,6GAAA,kBAAkB,OAAA;AAQpB,MAAM,kBAAkB,GAAG,SAAS,MAAM,CAAI,MAAiB,EAAE,IAAuB;IAE7F,IAAA,gCAAmB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACjC,IAAA,oCAAqB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACnC,IAAA,oCAAqB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAGnC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,WAAW,IAAI;QAC5C,MAAM,OAAO,GAAG;YACd,EAAE,EAAE,QAAQ;YACZ,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS;YAC3C,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc;YACrE,WAAW,EAAE,IAAwC;SACtD,CAAA;QAED,MAAM,IAAA,mBAAW,EAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAIF,IAAI,6BAAmB,EAAE,CAAC;QAExB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK;YAExD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,yBAAe,CAAwB,CAAA;YAEtE,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAA,gBAAO,EAAC,QAAQ,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;YAClC,CAAC;QACH,CAAC,CAAC,CAAA;QAGF,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK;YACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,yBAAe,CAAwB,CAAA;YACtE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAuB,CAAA;YAE1C,MAAM,OAAO,GAAgB;gBAC3B,EAAE,EAAE,QAAQ;gBACZ,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS;gBAC5C,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc;gBACtE,WAAW,EAAE,CAAC,QAAQ,CAAC;aACxB,CAAA;YAED,MAAM,IAAA,mBAAW,EAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAA;AA9CY,QAAA,kBAAkB,sBA8C9B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { QueryOptions, ToObjectOptions } from 'mongoose';
|
|
2
2
|
export declare const isHookIgnored: <T>(options: QueryOptions<T>) => boolean;
|
|
3
3
|
export declare const toObjectOptions: ToObjectOptions;
|
|
4
|
+
export declare const setPatchHistoryTTL: (ttl: number | string) => Promise<void>;
|
|
4
5
|
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/helpers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE7D,eAAO,MAAM,aAAa,GAAI,CAAC,WAAW,YAAY,CAAC,CAAC,CAAC,KAAG,OAE3D,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,eAG7B,CAAA;AAED,eAAO,MAAM,kBAAkB,QAAe,MAAM,GAAG,MAAM,KAAG,OAAO,CAAC,IAAI,CAqC3E,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-hooks.d.ts","sourceRoot":"","sources":["../../../../src/hooks/update-hooks.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAkC,MAAM,EAAE,WAAW,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAA;AAEpI,OAAO,KAAK,cAAc,MAAM,8BAA8B,CAAA;AAI9D,eAAO,MAAM,YAAY,GAAI,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,UAAU,WAAW,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAG,gBAAgB,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"update-hooks.d.ts","sourceRoot":"","sources":["../../../../src/hooks/update-hooks.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAkC,MAAM,EAAE,WAAW,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAA;AAEpI,OAAO,KAAK,cAAc,MAAM,8BAA8B,CAAA;AAI9D,eAAO,MAAM,YAAY,GAAI,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,UAAU,WAAW,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAG,gBAAgB,CAAC,CAAC,CAc9I,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,CAAC,eAAe,6BAA6B,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,KAAG;IAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;CAgB3K,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,QAAQ,cAAc,CAAC,CAAC,CAAC,KAAG,IAgDrF,CAAA"}
|
|
@@ -18,5 +18,6 @@ export declare const patchEventEmitter: {
|
|
|
18
18
|
prependOnceListener<K>(eventName: string | symbol, listener: (...args: any[]) => void): any;
|
|
19
19
|
eventNames(): (string | symbol)[];
|
|
20
20
|
};
|
|
21
|
+
export { setPatchHistoryTTL } from './helpers';
|
|
21
22
|
export declare const patchHistoryPlugin: <T>(schema: Schema<T>, opts: IPluginOptions<T>) => void;
|
|
22
23
|
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAA2B,MAAM,EAAE,MAAM,UAAU,CAAA;AAE/D,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AAO7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAA2B,MAAM,EAAE,MAAM,UAAU,CAAA;AAE/D,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AAO7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAAK,CAAA;AAEnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAQ9C,eAAO,MAAM,kBAAkB,GAAmB,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,QAAQ,cAAc,CAAC,CAAC,CAAC,KAAG,IA8CjG,CAAA"}
|
package/dist/esm/helpers.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import ms from 'ms';
|
|
2
|
+
import History from './models/History.js';
|
|
1
3
|
export const isHookIgnored = (options) => {
|
|
2
4
|
return options.ignoreHook === true || (options.ignoreEvent === true && options.ignorePatchHistory === true);
|
|
3
5
|
};
|
|
@@ -5,4 +7,31 @@ export const toObjectOptions = {
|
|
|
5
7
|
depopulate: true,
|
|
6
8
|
virtuals: false,
|
|
7
9
|
};
|
|
10
|
+
export const setPatchHistoryTTL = async (ttl) => {
|
|
11
|
+
const name = 'createdAt_1_TTL';
|
|
12
|
+
try {
|
|
13
|
+
const indexes = await History.collection.indexes();
|
|
14
|
+
const existingIndex = indexes?.find((index) => index.name === name);
|
|
15
|
+
if (!ttl && existingIndex) {
|
|
16
|
+
await History.collection.dropIndex(name);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const milliseconds = ms(ttl);
|
|
20
|
+
if (milliseconds < 1000 && existingIndex) {
|
|
21
|
+
await History.collection.dropIndex(name);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const expireAfterSeconds = milliseconds / 1000;
|
|
25
|
+
if (existingIndex && existingIndex.expireAfterSeconds === expireAfterSeconds) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (existingIndex) {
|
|
29
|
+
await History.collection.dropIndex(name);
|
|
30
|
+
}
|
|
31
|
+
await History.collection.createIndex({ createdAt: 1 }, { expireAfterSeconds, name });
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
console.error("Couldn't create or update index for history collection", err);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
8
37
|
//# sourceMappingURL=helpers.js.map
|
package/dist/esm/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AAEnB,OAAO,OAAO,MAAM,kBAAkB,CAAA;AAItC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAI,OAAwB,EAAW,EAAE;IACpE,OAAO,OAAO,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,IAAI,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAA;AAC7G,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,KAAK;CAChB,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,GAAoB,EAAiB,EAAE;IAC9E,MAAM,IAAI,GAAG,iBAAiB,CAAA;IAC9B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAA;QAClD,MAAM,aAAa,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;QAGnE,IAAI,CAAC,GAAG,IAAI,aAAa,EAAE,CAAC;YAC1B,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACxC,OAAM;QACR,CAAC;QAED,MAAM,YAAY,GAAG,EAAE,CAAC,GAAa,CAAC,CAAA;QAGtC,IAAI,YAAY,GAAG,IAAI,IAAI,aAAa,EAAE,CAAC;YACzC,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACxC,OAAM;QACR,CAAC;QAED,MAAM,kBAAkB,GAAG,YAAY,GAAG,IAAI,CAAA;QAE9C,IAAI,aAAa,IAAI,aAAa,CAAC,kBAAkB,KAAK,kBAAkB,EAAE,CAAC;YAE7E,OAAM;QACR,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAElB,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAC1C,CAAC;QAGD,MAAM,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAA;IACtF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wDAAwD,EAAE,GAAG,CAAC,CAAA;IAC9E,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { isArray, isEmpty } from 'lodash';
|
|
2
2
|
import { isHookIgnored } from '../helpers.js';
|
|
3
3
|
import { deletePatch } from '../patch.js';
|
|
4
4
|
const deleteMethods = ['remove', 'findOneAndDelete', 'findOneAndRemove', 'findByIdAndDelete', 'findByIdAndRemove', 'deleteOne', 'deleteMany'];
|
|
@@ -18,17 +18,17 @@ export const deleteHooksInitialize = (schema, opts) => {
|
|
|
18
18
|
};
|
|
19
19
|
if (['remove', 'deleteMany'].includes(this._context.op) && !options.single) {
|
|
20
20
|
const docs = await model.find(filter).lean().exec();
|
|
21
|
-
if (!
|
|
21
|
+
if (!isEmpty(docs)) {
|
|
22
22
|
this._context.deletedDocs = docs;
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
else {
|
|
26
26
|
const doc = await model.findOne(filter).lean().exec();
|
|
27
|
-
if (!
|
|
27
|
+
if (!isEmpty(doc)) {
|
|
28
28
|
this._context.deletedDocs = [doc];
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
-
if (opts.preDelete &&
|
|
31
|
+
if (opts.preDelete && isArray(this._context.deletedDocs) && !isEmpty(this._context.deletedDocs)) {
|
|
32
32
|
await opts.preDelete(this._context.deletedDocs);
|
|
33
33
|
}
|
|
34
34
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-hooks.js","sourceRoot":"","sources":["../../../src/hooks/delete-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"delete-hooks.js","sourceRoot":"","sources":["../../../src/hooks/delete-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAMtC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;AAE7I,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAI,MAAiB,EAAE,IAAuB,EAAQ,EAAE;IAC3F,MAAM,CAAC,GAAG,CAAC,aAA0C,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK;QAC5F,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACjC,IAAI,aAAa,CAAC,OAAO,CAAC;YAAE,OAAM;QAElC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAiB,CAAA;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAE/B,IAAI,CAAC,QAAQ,GAAG;YACd,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS;YACjD,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc;YAC3E,WAAW,EAAE,OAAO,CAAC,WAAsB;YAC3C,kBAAkB,EAAE,OAAO,CAAC,kBAA6B;SAC1D,CAAA;QAED,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3E,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAI,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAA;YACtD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,IAA6B,CAAA;YAC3D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,CAAI,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAA;YACxD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,GAAG,CAA0B,CAAA;YAC5D,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAChG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QACjD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,IAAI,CAAC,aAA0C,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK;QAC7F,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACjC,IAAI,aAAa,CAAC,OAAO,CAAC;YAAE,OAAM;QAElC,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { cloneDeep, forEach, isArray, isEmpty, isObjectLike, keys } from 'lodash';
|
|
2
2
|
import { assign } from 'power-assign';
|
|
3
3
|
import { isHookIgnored, toObjectOptions } from '../helpers.js';
|
|
4
4
|
import { createPatch, updatePatch } from '../patch.js';
|
|
5
5
|
const updateMethods = ['update', 'updateOne', 'replaceOne', 'updateMany', 'findOneAndUpdate', 'findOneAndReplace', 'findByIdAndUpdate'];
|
|
6
6
|
export const assignUpdate = (document, update, commands) => {
|
|
7
7
|
let updated = assign(document.toObject(toObjectOptions), update);
|
|
8
|
-
|
|
8
|
+
forEach(commands, (command) => {
|
|
9
9
|
try {
|
|
10
10
|
updated = assign(updated, command);
|
|
11
11
|
}
|
|
@@ -20,11 +20,11 @@ export const assignUpdate = (document, update, commands) => {
|
|
|
20
20
|
export const splitUpdateAndCommands = (updateQuery) => {
|
|
21
21
|
let update = {};
|
|
22
22
|
const commands = [];
|
|
23
|
-
if (!
|
|
24
|
-
update =
|
|
25
|
-
const
|
|
26
|
-
if (!
|
|
27
|
-
|
|
23
|
+
if (!isEmpty(updateQuery) && !isArray(updateQuery) && isObjectLike(updateQuery)) {
|
|
24
|
+
update = cloneDeep(updateQuery);
|
|
25
|
+
const keysWithDollarSign = keys(update).filter((key) => key.startsWith('$'));
|
|
26
|
+
if (!isEmpty(keysWithDollarSign)) {
|
|
27
|
+
forEach(keysWithDollarSign, (key) => {
|
|
28
28
|
commands.push({ [key]: update[key] });
|
|
29
29
|
delete update[key];
|
|
30
30
|
});
|
|
@@ -65,9 +65,9 @@ export const updateHooksInitialize = (schema, opts) => {
|
|
|
65
65
|
const model = this.model;
|
|
66
66
|
const updateQuery = this.getUpdate();
|
|
67
67
|
const { update, commands } = splitUpdateAndCommands(updateQuery);
|
|
68
|
-
const
|
|
69
|
-
if (!
|
|
70
|
-
const current = await model.findOne(
|
|
68
|
+
const combined = assignUpdate(model.hydrate({}), update, commands);
|
|
69
|
+
if (!isEmpty(combined)) {
|
|
70
|
+
const current = (await model.findOne(combined).lean().exec());
|
|
71
71
|
if (current) {
|
|
72
72
|
this._context.createdDocs = [current];
|
|
73
73
|
await createPatch(opts, this._context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-hooks.js","sourceRoot":"","sources":["../../../src/hooks/update-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"update-hooks.js","sourceRoot":"","sources":["../../../src/hooks/update-hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/patch.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import jsonpatch from 'fast-json-patch';
|
|
2
|
-
import
|
|
2
|
+
import { chunk, isEmpty, isFunction } from 'lodash';
|
|
3
3
|
import omit from 'omit-deep';
|
|
4
4
|
import em from './em.js';
|
|
5
5
|
import History from './models/History.js';
|
|
@@ -15,24 +15,24 @@ export function getJsonOmit(opts, doc) {
|
|
|
15
15
|
}
|
|
16
16
|
export function getObjectOmit(opts, doc) {
|
|
17
17
|
if (opts.omit) {
|
|
18
|
-
return omit(
|
|
18
|
+
return omit(isFunction(doc?.toObject) ? doc.toObject() : doc, opts.omit);
|
|
19
19
|
}
|
|
20
20
|
return doc;
|
|
21
21
|
}
|
|
22
22
|
export async function getUser(opts) {
|
|
23
|
-
if (
|
|
23
|
+
if (isFunction(opts.getUser)) {
|
|
24
24
|
return await opts.getUser();
|
|
25
25
|
}
|
|
26
26
|
return undefined;
|
|
27
27
|
}
|
|
28
28
|
export async function getReason(opts) {
|
|
29
|
-
if (
|
|
29
|
+
if (isFunction(opts.getReason)) {
|
|
30
30
|
return await opts.getReason();
|
|
31
31
|
}
|
|
32
32
|
return undefined;
|
|
33
33
|
}
|
|
34
34
|
export async function getMetadata(opts) {
|
|
35
|
-
if (
|
|
35
|
+
if (isFunction(opts.getMetadata)) {
|
|
36
36
|
return await opts.getMetadata();
|
|
37
37
|
}
|
|
38
38
|
return undefined;
|
|
@@ -55,10 +55,10 @@ export async function bulkPatch(opts, context, eventKey, docsKey) {
|
|
|
55
55
|
const event = opts[eventKey];
|
|
56
56
|
const docs = context[docsKey];
|
|
57
57
|
const key = eventKey === 'eventCreated' ? 'doc' : 'oldDoc';
|
|
58
|
-
if (
|
|
58
|
+
if (isEmpty(docs) || (!event && !history))
|
|
59
59
|
return;
|
|
60
60
|
const [user, reason, metadata] = await getData(opts);
|
|
61
|
-
const chunks =
|
|
61
|
+
const chunks = chunk(docs, 1000);
|
|
62
62
|
for await (const chunk of chunks) {
|
|
63
63
|
const bulk = [];
|
|
64
64
|
for (const doc of chunk) {
|
|
@@ -81,7 +81,7 @@ export async function bulkPatch(opts, context, eventKey, docsKey) {
|
|
|
81
81
|
});
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
-
if (history) {
|
|
84
|
+
if (history && !isEmpty(bulk)) {
|
|
85
85
|
await History.bulkWrite(bulk, { ordered: false });
|
|
86
86
|
}
|
|
87
87
|
}
|
|
@@ -93,10 +93,10 @@ export async function updatePatch(opts, context, current, original) {
|
|
|
93
93
|
const history = isPatchHistoryEnabled(opts, context);
|
|
94
94
|
const currentObject = getJsonOmit(opts, current);
|
|
95
95
|
const originalObject = getJsonOmit(opts, original);
|
|
96
|
-
if (
|
|
96
|
+
if (isEmpty(originalObject) || isEmpty(currentObject))
|
|
97
97
|
return;
|
|
98
98
|
const patch = jsonpatch.compare(originalObject, currentObject, true);
|
|
99
|
-
if (
|
|
99
|
+
if (isEmpty(patch))
|
|
100
100
|
return;
|
|
101
101
|
emitEvent(context, opts.eventUpdated, { oldDoc: original, doc: current, patch });
|
|
102
102
|
if (history) {
|
package/dist/esm/patch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/patch.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,iBAAiB,CAAA;AACvC,OAAO,
|
|
1
|
+
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/patch.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/plugin.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { isEmpty } from 'lodash';
|
|
2
2
|
import em from './em.js';
|
|
3
3
|
import { toObjectOptions } from './helpers.js';
|
|
4
4
|
import { createPatch, deletePatch } from './patch.js';
|
|
@@ -8,6 +8,7 @@ import { saveHooksInitialize } from './hooks/save-hooks.js';
|
|
|
8
8
|
import { updateHooksInitialize } from './hooks/update-hooks.js';
|
|
9
9
|
const remove = isMongooseLessThan7 ? 'remove' : 'deleteOne';
|
|
10
10
|
export const patchEventEmitter = em;
|
|
11
|
+
export { setPatchHistoryTTL } from './helpers';
|
|
11
12
|
export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
12
13
|
saveHooksInitialize(schema, opts);
|
|
13
14
|
updateHooksInitialize(schema, opts);
|
|
@@ -24,7 +25,7 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
24
25
|
if (isMongooseLessThan8) {
|
|
25
26
|
schema.pre(remove, { document: true, query: false }, async function () {
|
|
26
27
|
const original = this.toObject(toObjectOptions);
|
|
27
|
-
if (opts.preDelete && !
|
|
28
|
+
if (opts.preDelete && !isEmpty(original)) {
|
|
28
29
|
await opts.preDelete([original]);
|
|
29
30
|
}
|
|
30
31
|
});
|
package/dist/esm/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAChC,OAAO,EAAE,MAAM,MAAM,CAAA;AAErB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAM5D,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAA;AAK3D,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAEnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAQ9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,MAAM,CAAI,MAAiB,EAAE,IAAuB;IAE7F,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACjC,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACnC,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAGnC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,WAAW,IAAI;QAC5C,MAAM,OAAO,GAAG;YACd,EAAE,EAAE,QAAQ;YACZ,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS;YAC3C,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc;YACrE,WAAW,EAAE,IAAwC;SACtD,CAAA;QAED,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAIF,IAAI,mBAAmB,EAAE,CAAC;QAExB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK;YAExD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAwB,CAAA;YAEtE,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;YAClC,CAAC;QACH,CAAC,CAAC,CAAA;QAGF,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK;YACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAwB,CAAA;YACtE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAuB,CAAA;YAE1C,MAAM,OAAO,GAAgB;gBAC3B,EAAE,EAAE,QAAQ;gBACZ,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS;gBAC5C,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc;gBACtE,WAAW,EAAE,CAAC,QAAQ,CAAC;aACxB,CAAA;YAED,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { QueryOptions, ToObjectOptions } from 'mongoose';
|
|
2
2
|
export declare const isHookIgnored: <T>(options: QueryOptions<T>) => boolean;
|
|
3
3
|
export declare const toObjectOptions: ToObjectOptions;
|
|
4
|
+
export declare const setPatchHistoryTTL: (ttl: number | string) => Promise<void>;
|
|
4
5
|
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/helpers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE7D,eAAO,MAAM,aAAa,GAAI,CAAC,WAAW,YAAY,CAAC,CAAC,CAAC,KAAG,OAE3D,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,eAG7B,CAAA;AAED,eAAO,MAAM,kBAAkB,QAAe,MAAM,GAAG,MAAM,KAAG,OAAO,CAAC,IAAI,CAqC3E,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-hooks.d.ts","sourceRoot":"","sources":["../../../../src/hooks/update-hooks.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAkC,MAAM,EAAE,WAAW,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAA;AAEpI,OAAO,KAAK,cAAc,MAAM,8BAA8B,CAAA;AAI9D,eAAO,MAAM,YAAY,GAAI,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,UAAU,WAAW,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAG,gBAAgB,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"update-hooks.d.ts","sourceRoot":"","sources":["../../../../src/hooks/update-hooks.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAkC,MAAM,EAAE,WAAW,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAA;AAEpI,OAAO,KAAK,cAAc,MAAM,8BAA8B,CAAA;AAI9D,eAAO,MAAM,YAAY,GAAI,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,UAAU,WAAW,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAG,gBAAgB,CAAC,CAAC,CAc9I,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,CAAC,eAAe,6BAA6B,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,KAAG;IAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;CAgB3K,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,QAAQ,cAAc,CAAC,CAAC,CAAC,KAAG,IAgDrF,CAAA"}
|
|
@@ -18,5 +18,6 @@ export declare const patchEventEmitter: {
|
|
|
18
18
|
prependOnceListener<K>(eventName: string | symbol, listener: (...args: any[]) => void): any;
|
|
19
19
|
eventNames(): (string | symbol)[];
|
|
20
20
|
};
|
|
21
|
+
export { setPatchHistoryTTL } from './helpers';
|
|
21
22
|
export declare const patchHistoryPlugin: <T>(schema: Schema<T>, opts: IPluginOptions<T>) => void;
|
|
22
23
|
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAA2B,MAAM,EAAE,MAAM,UAAU,CAAA;AAE/D,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AAO7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAA2B,MAAM,EAAE,MAAM,UAAU,CAAA;AAE/D,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AAO7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAAK,CAAA;AAEnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAQ9C,eAAO,MAAM,kBAAkB,GAAmB,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,QAAQ,cAAc,CAAC,CAAC,CAAC,KAAG,IA8CjG,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-patch-mongoose",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.9",
|
|
4
4
|
"description": "Patch history & events for mongoose models",
|
|
5
5
|
"author": "Alex Eagle",
|
|
6
6
|
"license": "MIT",
|
|
@@ -77,19 +77,21 @@
|
|
|
77
77
|
"dependencies": {
|
|
78
78
|
"fast-json-patch": "3.1.1",
|
|
79
79
|
"lodash": "4.17.21",
|
|
80
|
+
"ms": "2.1.3",
|
|
80
81
|
"omit-deep": "0.3.0",
|
|
81
82
|
"power-assign": "0.2.10",
|
|
82
83
|
"semver": "7.6.3"
|
|
83
84
|
},
|
|
84
85
|
"devDependencies": {
|
|
85
86
|
"@biomejs/biome": "1.9.4",
|
|
86
|
-
"@types/lodash": "4.17.
|
|
87
|
-
"@types/
|
|
87
|
+
"@types/lodash": "4.17.14",
|
|
88
|
+
"@types/ms": "0.7.34",
|
|
89
|
+
"@types/node": "22.10.5",
|
|
88
90
|
"@types/semver": "7.5.8",
|
|
89
91
|
"@vitest/coverage-v8": "2.1.8",
|
|
90
92
|
"merge": "2.1.1",
|
|
91
|
-
"mongodb-memory-server": "10.1.
|
|
92
|
-
"mongoose": "8.
|
|
93
|
+
"mongodb-memory-server": "10.1.3",
|
|
94
|
+
"mongoose": "8.9.3",
|
|
93
95
|
"open-cli": "8.0.0",
|
|
94
96
|
"typescript": "5.7.2",
|
|
95
97
|
"vitest": "2.1.8"
|
package/src/helpers.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import ms from 'ms'
|
|
2
|
+
|
|
3
|
+
import History from './models/History'
|
|
4
|
+
|
|
1
5
|
import type { QueryOptions, ToObjectOptions } from 'mongoose'
|
|
2
6
|
|
|
3
7
|
export const isHookIgnored = <T>(options: QueryOptions<T>): boolean => {
|
|
@@ -8,3 +12,42 @@ export const toObjectOptions: ToObjectOptions = {
|
|
|
8
12
|
depopulate: true,
|
|
9
13
|
virtuals: false,
|
|
10
14
|
}
|
|
15
|
+
|
|
16
|
+
export const setPatchHistoryTTL = async (ttl: number | string): Promise<void> => {
|
|
17
|
+
const name = 'createdAt_1_TTL' // To avoid collision with user defined index / manually created index
|
|
18
|
+
try {
|
|
19
|
+
const indexes = await History.collection.indexes()
|
|
20
|
+
const existingIndex = indexes?.find((index) => index.name === name)
|
|
21
|
+
|
|
22
|
+
// Drop the index if historyTTL is not set and index exists
|
|
23
|
+
if (!ttl && existingIndex) {
|
|
24
|
+
await History.collection.dropIndex(name)
|
|
25
|
+
return
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const milliseconds = ms(ttl as string)
|
|
29
|
+
|
|
30
|
+
// Drop the index if historyTTL is less than 1 second and index exists
|
|
31
|
+
if (milliseconds < 1000 && existingIndex) {
|
|
32
|
+
await History.collection.dropIndex(name)
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const expireAfterSeconds = milliseconds / 1000
|
|
37
|
+
|
|
38
|
+
if (existingIndex && existingIndex.expireAfterSeconds === expireAfterSeconds) {
|
|
39
|
+
// Index already exists with the correct TTL, no need to recreate
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (existingIndex) {
|
|
44
|
+
// Drop the existing index if it exists and TTL is different
|
|
45
|
+
await History.collection.dropIndex(name)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Create a new index with the correct TTL if it doesn't exist or if the TTL is different
|
|
49
|
+
await History.collection.createIndex({ createdAt: 1 }, { expireAfterSeconds, name })
|
|
50
|
+
} catch (err) {
|
|
51
|
+
console.error("Couldn't create or update index for history collection", err)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { isArray, isEmpty } from 'lodash'
|
|
2
2
|
|
|
3
3
|
import { isHookIgnored } from '../helpers'
|
|
4
4
|
import { deletePatch } from '../patch'
|
|
@@ -27,17 +27,17 @@ export const deleteHooksInitialize = <T>(schema: Schema<T>, opts: IPluginOptions
|
|
|
27
27
|
|
|
28
28
|
if (['remove', 'deleteMany'].includes(this._context.op) && !options.single) {
|
|
29
29
|
const docs = await model.find<T>(filter).lean().exec()
|
|
30
|
-
if (!
|
|
30
|
+
if (!isEmpty(docs)) {
|
|
31
31
|
this._context.deletedDocs = docs as HydratedDocument<T>[]
|
|
32
32
|
}
|
|
33
33
|
} else {
|
|
34
34
|
const doc = await model.findOne<T>(filter).lean().exec()
|
|
35
|
-
if (!
|
|
35
|
+
if (!isEmpty(doc)) {
|
|
36
36
|
this._context.deletedDocs = [doc] as HydratedDocument<T>[]
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
if (opts.preDelete &&
|
|
40
|
+
if (opts.preDelete && isArray(this._context.deletedDocs) && !isEmpty(this._context.deletedDocs)) {
|
|
41
41
|
await opts.preDelete(this._context.deletedDocs)
|
|
42
42
|
}
|
|
43
43
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { cloneDeep, forEach, isArray, isEmpty, isObjectLike, keys } from 'lodash'
|
|
2
2
|
import { assign } from 'power-assign'
|
|
3
3
|
|
|
4
4
|
import { isHookIgnored, toObjectOptions } from '../helpers'
|
|
@@ -12,7 +12,8 @@ const updateMethods = ['update', 'updateOne', 'replaceOne', 'updateMany', 'findO
|
|
|
12
12
|
|
|
13
13
|
export const assignUpdate = <T>(document: HydratedDocument<T>, update: UpdateQuery<T>, commands: Record<string, unknown>[]): HydratedDocument<T> => {
|
|
14
14
|
let updated = assign(document.toObject(toObjectOptions), update)
|
|
15
|
-
|
|
15
|
+
// Try catch not working for of loop, keep it as is
|
|
16
|
+
forEach(commands, (command) => {
|
|
16
17
|
try {
|
|
17
18
|
updated = assign(updated, command)
|
|
18
19
|
} catch {
|
|
@@ -29,11 +30,11 @@ export const splitUpdateAndCommands = <T>(updateQuery: UpdateWithAggregationPipe
|
|
|
29
30
|
let update: UpdateQuery<T> = {}
|
|
30
31
|
const commands: Record<string, unknown>[] = []
|
|
31
32
|
|
|
32
|
-
if (!
|
|
33
|
-
update =
|
|
34
|
-
const
|
|
35
|
-
if (!
|
|
36
|
-
|
|
33
|
+
if (!isEmpty(updateQuery) && !isArray(updateQuery) && isObjectLike(updateQuery)) {
|
|
34
|
+
update = cloneDeep(updateQuery)
|
|
35
|
+
const keysWithDollarSign = keys(update).filter((key) => key.startsWith('$'))
|
|
36
|
+
if (!isEmpty(keysWithDollarSign)) {
|
|
37
|
+
forEach(keysWithDollarSign, (key) => {
|
|
37
38
|
commands.push({ [key]: update[key] as unknown })
|
|
38
39
|
delete update[key]
|
|
39
40
|
})
|
|
@@ -81,9 +82,9 @@ export const updateHooksInitialize = <T>(schema: Schema<T>, opts: IPluginOptions
|
|
|
81
82
|
const updateQuery = this.getUpdate()
|
|
82
83
|
const { update, commands } = splitUpdateAndCommands(updateQuery)
|
|
83
84
|
|
|
84
|
-
const
|
|
85
|
-
if (!
|
|
86
|
-
const current = await model.findOne(
|
|
85
|
+
const combined = assignUpdate(model.hydrate({}), update, commands)
|
|
86
|
+
if (!isEmpty(combined)) {
|
|
87
|
+
const current = (await model.findOne(combined).lean().exec()) as HydratedDocument<T>
|
|
87
88
|
if (current) {
|
|
88
89
|
this._context.createdDocs = [current] as HydratedDocument<T>[]
|
|
89
90
|
|
package/src/patch.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import jsonpatch from 'fast-json-patch'
|
|
2
|
-
import
|
|
2
|
+
import { chunk, isEmpty, isFunction } from 'lodash'
|
|
3
3
|
import omit from 'omit-deep'
|
|
4
4
|
|
|
5
5
|
import type { HydratedDocument, Types } from 'mongoose'
|
|
@@ -28,28 +28,28 @@ export function getJsonOmit<T>(opts: IPluginOptions<T>, doc: HydratedDocument<T>
|
|
|
28
28
|
|
|
29
29
|
export function getObjectOmit<T>(opts: IPluginOptions<T>, doc: HydratedDocument<T>): Partial<T> {
|
|
30
30
|
if (opts.omit) {
|
|
31
|
-
return omit(
|
|
31
|
+
return omit(isFunction(doc?.toObject) ? doc.toObject() : doc, opts.omit)
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
return doc
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
export async function getUser<T>(opts: IPluginOptions<T>): Promise<User | undefined> {
|
|
38
|
-
if (
|
|
38
|
+
if (isFunction(opts.getUser)) {
|
|
39
39
|
return await opts.getUser()
|
|
40
40
|
}
|
|
41
41
|
return undefined
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
export async function getReason<T>(opts: IPluginOptions<T>): Promise<string | undefined> {
|
|
45
|
-
if (
|
|
45
|
+
if (isFunction(opts.getReason)) {
|
|
46
46
|
return await opts.getReason()
|
|
47
47
|
}
|
|
48
48
|
return undefined
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
export async function getMetadata<T>(opts: IPluginOptions<T>): Promise<Metadata | undefined> {
|
|
52
|
-
if (
|
|
52
|
+
if (isFunction(opts.getMetadata)) {
|
|
53
53
|
return await opts.getMetadata()
|
|
54
54
|
}
|
|
55
55
|
return undefined
|
|
@@ -77,11 +77,11 @@ export async function bulkPatch<T>(opts: IPluginOptions<T>, context: IContext<T>
|
|
|
77
77
|
const docs = context[docsKey]
|
|
78
78
|
const key = eventKey === 'eventCreated' ? 'doc' : 'oldDoc'
|
|
79
79
|
|
|
80
|
-
if (
|
|
80
|
+
if (isEmpty(docs) || (!event && !history)) return
|
|
81
81
|
|
|
82
82
|
const [user, reason, metadata] = await getData(opts)
|
|
83
83
|
|
|
84
|
-
const chunks =
|
|
84
|
+
const chunks = chunk(docs, 1000)
|
|
85
85
|
for await (const chunk of chunks) {
|
|
86
86
|
const bulk = []
|
|
87
87
|
|
|
@@ -107,7 +107,7 @@ export async function bulkPatch<T>(opts: IPluginOptions<T>, context: IContext<T>
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
if (history) {
|
|
110
|
+
if (history && !isEmpty(bulk)) {
|
|
111
111
|
await History.bulkWrite(bulk, { ordered: false })
|
|
112
112
|
}
|
|
113
113
|
}
|
|
@@ -122,10 +122,10 @@ export async function updatePatch<T>(opts: IPluginOptions<T>, context: IContext<
|
|
|
122
122
|
|
|
123
123
|
const currentObject = getJsonOmit(opts, current)
|
|
124
124
|
const originalObject = getJsonOmit(opts, original)
|
|
125
|
-
if (
|
|
125
|
+
if (isEmpty(originalObject) || isEmpty(currentObject)) return
|
|
126
126
|
|
|
127
127
|
const patch = jsonpatch.compare(originalObject, currentObject, true)
|
|
128
|
-
if (
|
|
128
|
+
if (isEmpty(patch)) return
|
|
129
129
|
|
|
130
130
|
emitEvent(context, opts.eventUpdated, { oldDoc: original, doc: current, patch })
|
|
131
131
|
|
package/src/plugin.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { isEmpty } from 'lodash'
|
|
2
2
|
import em from './em'
|
|
3
3
|
|
|
4
4
|
import { toObjectOptions } from './helpers'
|
|
@@ -20,6 +20,8 @@ const remove = isMongooseLessThan7 ? 'remove' : 'deleteOne'
|
|
|
20
20
|
*/
|
|
21
21
|
export const patchEventEmitter = em
|
|
22
22
|
|
|
23
|
+
export { setPatchHistoryTTL } from './helpers'
|
|
24
|
+
|
|
23
25
|
/**
|
|
24
26
|
* @description Patch history plugin
|
|
25
27
|
* @param {Schema} schema
|
|
@@ -52,7 +54,7 @@ export const patchHistoryPlugin = function plugin<T>(schema: Schema<T>, opts: IP
|
|
|
52
54
|
// @ts-expect-error - Mongoose 7 and below
|
|
53
55
|
const original = this.toObject(toObjectOptions) as HydratedDocument<T>
|
|
54
56
|
|
|
55
|
-
if (opts.preDelete && !
|
|
57
|
+
if (opts.preDelete && !isEmpty(original)) {
|
|
56
58
|
await opts.preDelete([original])
|
|
57
59
|
}
|
|
58
60
|
})
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import ms from 'ms'
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
3
|
+
|
|
4
|
+
import History from '../src/models/History'
|
|
5
|
+
|
|
6
|
+
import { setPatchHistoryTTL } from '../src/helpers'
|
|
7
|
+
|
|
8
|
+
import type { Mock, MockInstance } from 'vitest'
|
|
9
|
+
|
|
10
|
+
vi.mock('../src/models/History', () => ({
|
|
11
|
+
default: {
|
|
12
|
+
collection: {
|
|
13
|
+
indexes: vi.fn(),
|
|
14
|
+
dropIndex: vi.fn(),
|
|
15
|
+
createIndex: vi.fn(),
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
}))
|
|
19
|
+
|
|
20
|
+
const name = 'createdAt_1_TTL'
|
|
21
|
+
|
|
22
|
+
describe('useTTL', () => {
|
|
23
|
+
let dropIndexSpy: MockInstance
|
|
24
|
+
let createIndexSpy: MockInstance
|
|
25
|
+
const indexes = History.collection.indexes as Mock
|
|
26
|
+
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
vi.clearAllMocks()
|
|
29
|
+
dropIndexSpy = vi.spyOn(History.collection, 'dropIndex')
|
|
30
|
+
createIndexSpy = vi.spyOn(History.collection, 'createIndex')
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
vi.restoreAllMocks()
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('should drop the index if historyTTL is not set and index exists', async () => {
|
|
38
|
+
indexes.mockResolvedValue([{ name }])
|
|
39
|
+
|
|
40
|
+
// @ts-expect-error ttl can't be undefined in this case but we want to test it
|
|
41
|
+
await setPatchHistoryTTL(undefined)
|
|
42
|
+
expect(dropIndexSpy).toHaveBeenCalledWith(name)
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('should drop the index if historyTTL is less than 1 second and index exists', async () => {
|
|
46
|
+
indexes.mockResolvedValue([{ name }])
|
|
47
|
+
|
|
48
|
+
await setPatchHistoryTTL('500ms')
|
|
49
|
+
expect(dropIndexSpy).toHaveBeenCalledWith(name)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('should not recreate the index if it already exists with the correct TTL', async () => {
|
|
53
|
+
const ttl = '1h'
|
|
54
|
+
const expireAfterSeconds = ms(ttl) / 1000
|
|
55
|
+
|
|
56
|
+
indexes.mockResolvedValue([{ name, expireAfterSeconds }])
|
|
57
|
+
|
|
58
|
+
await setPatchHistoryTTL(ttl)
|
|
59
|
+
expect(dropIndexSpy).not.toHaveBeenCalled()
|
|
60
|
+
expect(createIndexSpy).not.toHaveBeenCalled()
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
it('should drop and recreate the index if TTL is different', async () => {
|
|
64
|
+
const ttlBefore = '1h'
|
|
65
|
+
const ttlAfter = '2h'
|
|
66
|
+
|
|
67
|
+
const expireAfterSecondsBefore = ms(ttlBefore) / 1000
|
|
68
|
+
const expireAfterSecondsAfter = ms(ttlAfter) / 1000
|
|
69
|
+
|
|
70
|
+
indexes.mockResolvedValue([{ name, expireAfterSeconds: expireAfterSecondsBefore }])
|
|
71
|
+
|
|
72
|
+
await setPatchHistoryTTL(ttlAfter)
|
|
73
|
+
expect(dropIndexSpy).toHaveBeenCalledWith(name)
|
|
74
|
+
expect(createIndexSpy).toHaveBeenCalledWith({ createdAt: 1 }, { expireAfterSeconds: expireAfterSecondsAfter, name })
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
it('should create the index if it does not exist', async () => {
|
|
78
|
+
const ttl = '1h'
|
|
79
|
+
const expireAfterSeconds = ms(ttl) / 1000
|
|
80
|
+
|
|
81
|
+
indexes.mockResolvedValue([])
|
|
82
|
+
|
|
83
|
+
await setPatchHistoryTTL(ttl)
|
|
84
|
+
expect(createIndexSpy).toHaveBeenCalledWith({ createdAt: 1 }, { expireAfterSeconds, name })
|
|
85
|
+
})
|
|
86
|
+
})
|
|
@@ -12,7 +12,7 @@ import { USER_CREATED } from './constants/events'
|
|
|
12
12
|
import em from '../src/em'
|
|
13
13
|
import server from './mongo/server'
|
|
14
14
|
|
|
15
|
-
vi.mock('../src/em', () => ({ default: { emit: vi.fn() } }))
|
|
15
|
+
vi.mock('../src/em', () => ({ default: { emit: vi.fn((event: string, data: Record<string, unknown>) => console.log(event, data)) } }))
|
|
16
16
|
|
|
17
17
|
describe('plugin - event created & patch history disabled', () => {
|
|
18
18
|
const instance = server('plugin-event-created')
|
|
@@ -338,5 +338,37 @@ describe('plugin - event created & patch history disabled', () => {
|
|
|
338
338
|
expect(found?.name).toBe('John')
|
|
339
339
|
expect(found?.role).toBe('admin')
|
|
340
340
|
})
|
|
341
|
+
|
|
342
|
+
it('should findOneAndUpdate() with $set + upsert and emit one create event', async () => {
|
|
343
|
+
const _id = new Types.ObjectId()
|
|
344
|
+
const john = await User.create({ _id, name: 'John', role: 'admin' })
|
|
345
|
+
|
|
346
|
+
if (isMongooseLessThan7) {
|
|
347
|
+
// @ts-expect-error update() not available in Mongoose v6 and below
|
|
348
|
+
await User.update({ name: 'Alex', role: 'user' }, { $set: { name: 'Alex', role: 'user' } }, { upsert: true, setDefaultsOnInsert: false, overwriteDiscriminatorKey: true }).exec()
|
|
349
|
+
} else {
|
|
350
|
+
await User.findOneAndUpdate({ name: 'Alex', role: 'user' }, { $set: { name: 'Alex', role: 'user' } }, { upsert: true, setDefaultsOnInsert: false, overwriteDiscriminatorKey: true }).exec()
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
const alex = await User.findOne({ name: 'Alex', role: 'user' })
|
|
354
|
+
expect(alex).not.toBeNull()
|
|
355
|
+
|
|
356
|
+
const history = await History.find({})
|
|
357
|
+
expect(history).toHaveLength(0)
|
|
358
|
+
|
|
359
|
+
expect(em.emit).toHaveBeenCalledTimes(2)
|
|
360
|
+
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, {
|
|
361
|
+
doc: expect.objectContaining({
|
|
362
|
+
name: john?.name,
|
|
363
|
+
role: john?.role,
|
|
364
|
+
}),
|
|
365
|
+
})
|
|
366
|
+
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, {
|
|
367
|
+
doc: expect.objectContaining({
|
|
368
|
+
name: alex?.name,
|
|
369
|
+
role: alex?.role,
|
|
370
|
+
}),
|
|
371
|
+
})
|
|
372
|
+
})
|
|
341
373
|
})
|
|
342
374
|
})
|