ts-patch-mongoose 2.6.6 → 2.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +7 -3
  2. package/dist/cjs/helpers.js +32 -1
  3. package/dist/cjs/helpers.js.map +1 -1
  4. package/dist/cjs/hooks/delete-hooks.js.map +1 -1
  5. package/dist/cjs/plugin.js +3 -1
  6. package/dist/cjs/plugin.js.map +1 -1
  7. package/dist/cjs/types/helpers.d.ts +1 -0
  8. package/dist/cjs/types/helpers.d.ts.map +1 -1
  9. package/dist/cjs/types/models/History.d.ts +3 -3
  10. package/dist/cjs/types/plugin.d.ts +1 -0
  11. package/dist/cjs/types/plugin.d.ts.map +1 -1
  12. package/dist/esm/helpers.js +29 -0
  13. package/dist/esm/helpers.js.map +1 -1
  14. package/dist/esm/hooks/delete-hooks.js.map +1 -1
  15. package/dist/esm/plugin.js +1 -0
  16. package/dist/esm/plugin.js.map +1 -1
  17. package/dist/esm/types/helpers.d.ts +1 -0
  18. package/dist/esm/types/helpers.d.ts.map +1 -1
  19. package/dist/esm/types/models/History.d.ts +3 -3
  20. package/dist/esm/types/plugin.d.ts +1 -0
  21. package/dist/esm/types/plugin.d.ts.map +1 -1
  22. package/package.json +13 -13
  23. package/src/helpers.ts +43 -0
  24. package/src/hooks/delete-hooks.ts +2 -2
  25. package/src/plugin.ts +2 -0
  26. package/tests/em.test.ts +4 -2
  27. package/tests/helpers.test.ts +86 -0
  28. package/tests/mongo/.gitignore +3 -0
  29. package/tests/mongo/server.ts +32 -0
  30. package/tests/patch.test.ts +14 -9
  31. package/tests/plugin-event-created.test.ts +14 -9
  32. package/tests/plugin-event-deleted.test.ts +19 -9
  33. package/tests/plugin-event-updated.test.ts +14 -9
  34. package/tests/plugin-global.test.ts +13 -7
  35. package/tests/plugin-omit-all.test.ts +13 -6
  36. package/tests/plugin-patch-history-disabled.test.ts +13 -6
  37. package/tests/plugin-pre-delete.test.ts +13 -7
  38. package/tests/plugin-pre-save.test.ts +12 -6
  39. package/tests/plugin.test.ts +15 -7
  40. package/vite.config.mts +12 -0
  41. package/jest-mongodb-config.ts +0 -10
  42. package/jest.config.ts +0 -18
package/README.md CHANGED
@@ -13,8 +13,6 @@ Patch history (audit log) & events plugin for mongoose
13
13
  [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=ilovepixelart_ts-patch-mongoose&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=ilovepixelart_ts-patch-mongoose)
14
14
  [![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=ilovepixelart_ts-patch-mongoose&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=ilovepixelart_ts-patch-mongoose)
15
15
 
16
- [![npm](https://nodei.co/npm/ts-patch-mongoose.png)](https://www.npmjs.com/package/ts-patch-mongoose)
17
-
18
16
  ## Motivation
19
17
 
20
18
  ts-patch-mongoose is a plugin for mongoose
@@ -107,9 +105,15 @@ import { Schema, model } from 'mongoose'
107
105
  import type { HydratedDocument, Types } from 'mongoose'
108
106
  import type IBook from '../interfaces/IBook'
109
107
 
110
- import { patchHistoryPlugin } from 'ts-patch-mongoose'
108
+ import { patchHistoryPlugin, setPatchHistoryTTL } from 'ts-patch-mongoose'
111
109
  import { BOOK_CREATED, BOOK_UPDATED, BOOK_DELETED } from '../constants/events'
112
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
+
113
117
  const BookSchema = new Schema<IBook>({
114
118
  name: {
115
119
  title: String,
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":";;;AAEO,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"}
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 +1 @@
1
- {"version":3,"file":"delete-hooks.js","sourceRoot":"","sources":["../../../src/hooks/delete-hooks.ts"],"names":[],"mappings":";;;;AAAA,4DAAsB;AAEtB,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,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAA;YACnD,IAAI,CAAC,gBAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,IAA6B,CAAA;YAC3D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAA;YACrD,IAAI,CAAC,gBAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,GAAG,CAA0B,CAAA;YAC5D,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,IAAI,gBAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACpG,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
+ {"version":3,"file":"delete-hooks.js","sourceRoot":"","sources":["../../../src/hooks/delete-hooks.ts"],"names":[],"mappings":";;;;AAAA,4DAAsB;AAEtB,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,gBAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,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,gBAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,GAAG,CAA0B,CAAA;YAC5D,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,IAAI,gBAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACpG,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,6 +1,6 @@
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
5
  const lodash_1 = tslib_1.__importDefault(require("lodash"));
6
6
  const em_1 = tslib_1.__importDefault(require("./em"));
@@ -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);
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;AAAA,4DAAsB;AACtB,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;AAQ5B,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,gBAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3C,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
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;AAAA,4DAAsB;AACtB,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,gBAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3C,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":"AAAA,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"}
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"}
@@ -3,15 +3,15 @@ import type IHistory from '../interfaces/IHistory';
3
3
  declare const History: import("mongoose").Model<IHistory, {}, {}, {}, import("mongoose").Document<unknown, {}, IHistory> & IHistory & {
4
4
  _id: import("mongoose").Types.ObjectId;
5
5
  } & {
6
- __v?: number;
6
+ __v: number;
7
7
  }, Schema<IHistory, import("mongoose").Model<IHistory, any, any, any, import("mongoose").Document<unknown, any, IHistory> & IHistory & {
8
8
  _id: import("mongoose").Types.ObjectId;
9
9
  } & {
10
- __v?: number;
10
+ __v: number;
11
11
  }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, IHistory, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<IHistory>> & import("mongoose").FlatRecord<IHistory> & {
12
12
  _id: import("mongoose").Types.ObjectId;
13
13
  } & {
14
- __v?: number;
14
+ __v: number;
15
15
  }>>;
16
16
  export default History;
17
17
  //# sourceMappingURL=History.d.ts.map
@@ -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;AAQnC,eAAO,MAAM,kBAAkB,GAAmB,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,QAAQ,cAAc,CAAC,CAAC,CAAC,KAAG,IA8CjG,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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAEA,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"}
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 +1 @@
1
- {"version":3,"file":"delete-hooks.js","sourceRoot":"","sources":["../../../src/hooks/delete-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AAEtB,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,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAA;YACnD,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,IAA6B,CAAA;YAC3D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAA;YACrD,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,GAAG,CAA0B,CAAA;YAC5D,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACpG,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
+ {"version":3,"file":"delete-hooks.js","sourceRoot":"","sources":["../../../src/hooks/delete-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AAEtB,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,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,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,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,GAAG,CAA0B,CAAA;YAC5D,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACpG,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"}
@@ -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);
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AACtB,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;AAQnC,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,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3C,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
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AACtB,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,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3C,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":"AAAA,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"}
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"}
@@ -3,15 +3,15 @@ import type IHistory from '../interfaces/IHistory';
3
3
  declare const History: import("mongoose").Model<IHistory, {}, {}, {}, import("mongoose").Document<unknown, {}, IHistory> & IHistory & {
4
4
  _id: import("mongoose").Types.ObjectId;
5
5
  } & {
6
- __v?: number;
6
+ __v: number;
7
7
  }, Schema<IHistory, import("mongoose").Model<IHistory, any, any, any, import("mongoose").Document<unknown, any, IHistory> & IHistory & {
8
8
  _id: import("mongoose").Types.ObjectId;
9
9
  } & {
10
- __v?: number;
10
+ __v: number;
11
11
  }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, IHistory, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<IHistory>> & import("mongoose").FlatRecord<IHistory> & {
12
12
  _id: import("mongoose").Types.ObjectId;
13
13
  } & {
14
- __v?: number;
14
+ __v: number;
15
15
  }>>;
16
16
  export default History;
17
17
  //# sourceMappingURL=History.d.ts.map
@@ -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;AAQnC,eAAO,MAAM,kBAAkB,GAAmB,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,QAAQ,cAAc,CAAC,CAAC,CAAC,KAAG,IA8CjG,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.6",
3
+ "version": "2.6.8",
4
4
  "description": "Patch history & events for mongoose models",
5
5
  "author": "Alex Eagle",
6
6
  "license": "MIT",
@@ -45,8 +45,7 @@
45
45
  "tests",
46
46
  ".swcrc",
47
47
  "tsconfig.json",
48
- "jest.config.ts",
49
- "jest-mongodb-config.ts",
48
+ "vite.config.mts",
50
49
  "biome.json"
51
50
  ],
52
51
  "exports": {
@@ -67,8 +66,8 @@
67
66
  "scripts": {
68
67
  "biome": "npx @biomejs/biome check",
69
68
  "biome:fix": "npx @biomejs/biome check --write .",
70
- "test": "jest --config jest.config.ts --detectOpenHandles --coverage",
71
- "test:open": "npm run test && open-cli coverage/lcov-report/index.html",
69
+ "test": "vitest run --coverage",
70
+ "test:open": "vitest run --coverage && open-cli coverage/lcov-report/index.html",
72
71
  "clean": "rm -rf ./dist",
73
72
  "build": "npm run clean && npm run build:cjs && npm run build:esm",
74
73
  "build:cjs": "tsc -p config/tsconfig.cjs.json",
@@ -78,23 +77,24 @@
78
77
  "dependencies": {
79
78
  "fast-json-patch": "3.1.1",
80
79
  "lodash": "4.17.21",
80
+ "ms": "2.1.3",
81
81
  "omit-deep": "0.3.0",
82
82
  "power-assign": "0.2.10",
83
83
  "semver": "7.6.3"
84
84
  },
85
85
  "devDependencies": {
86
86
  "@biomejs/biome": "1.9.4",
87
- "@shelf/jest-mongodb": "4.3.2",
88
- "@swc-node/jest": "1.8.12",
89
- "@types/jest": "29.5.14",
90
- "@types/lodash": "4.17.12",
91
- "@types/node": "22.8.1",
87
+ "@types/lodash": "4.17.13",
88
+ "@types/ms": "0.7.34",
89
+ "@types/node": "22.10.1",
92
90
  "@types/semver": "7.5.8",
93
- "jest": "29.7.0",
91
+ "@vitest/coverage-v8": "2.1.8",
94
92
  "merge": "2.1.1",
95
- "mongoose": "8.7.3",
93
+ "mongodb-memory-server": "10.1.2",
94
+ "mongoose": "8.8.4",
96
95
  "open-cli": "8.0.0",
97
- "typescript": "5.6.3"
96
+ "typescript": "5.7.2",
97
+ "vitest": "2.1.8"
98
98
  },
99
99
  "peerDependencies": {
100
100
  "mongoose": ">=6.6.0 < 9"
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
+ }
@@ -26,12 +26,12 @@ export const deleteHooksInitialize = <T>(schema: Schema<T>, opts: IPluginOptions
26
26
  }
27
27
 
28
28
  if (['remove', 'deleteMany'].includes(this._context.op) && !options.single) {
29
- const docs = await model.find(filter).lean().exec()
29
+ const docs = await model.find<T>(filter).lean().exec()
30
30
  if (!_.isEmpty(docs)) {
31
31
  this._context.deletedDocs = docs as HydratedDocument<T>[]
32
32
  }
33
33
  } else {
34
- const doc = await model.findOne(filter).lean().exec()
34
+ const doc = await model.findOne<T>(filter).lean().exec()
35
35
  if (!_.isEmpty(doc)) {
36
36
  this._context.deletedDocs = [doc] as HydratedDocument<T>[]
37
37
  }
package/src/plugin.ts CHANGED
@@ -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
package/tests/em.test.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { describe, expect, it, vi } from 'vitest'
2
+
1
3
  import { emitEvent } from '../src/patch'
2
4
  import { patchEventEmitter } from '../src/plugin'
3
5
 
@@ -16,7 +18,7 @@ describe('em', () => {
16
18
  })
17
19
 
18
20
  it('emitEvent', async () => {
19
- const fn = jest.fn()
21
+ const fn = vi.fn()
20
22
  patchEventEmitter.on('test', fn)
21
23
 
22
24
  const context = {
@@ -32,7 +34,7 @@ describe('em', () => {
32
34
  })
33
35
 
34
36
  it('emitEvent ignore', async () => {
35
- const fn = jest.fn()
37
+ const fn = vi.fn()
36
38
  patchEventEmitter.on('test', fn)
37
39
 
38
40
  const context = {
@@ -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
+ })
@@ -0,0 +1,3 @@
1
+ *
2
+ !.gitignore
3
+ !server.ts
@@ -0,0 +1,32 @@
1
+ import fs from 'node:fs'
2
+ import mongoose from 'mongoose'
3
+
4
+ import { MongoMemoryServer } from 'mongodb-memory-server'
5
+
6
+ const server = (dbName: string) => {
7
+ let mongo: MongoMemoryServer
8
+ const dbPath = `./tests/mongo/${dbName}`
9
+
10
+ const create = async () => {
11
+ fs.mkdirSync(dbPath, { recursive: true })
12
+ mongo = await MongoMemoryServer.create({
13
+ instance: {
14
+ dbName,
15
+ dbPath,
16
+ },
17
+ })
18
+
19
+ const uri = mongo.getUri()
20
+ await mongoose.connect(uri)
21
+ }
22
+
23
+ const destroy = async () => {
24
+ await mongoose.connection.dropDatabase()
25
+ await mongoose.connection.close()
26
+ await mongo.stop({ doCleanup: true, force: true })
27
+ }
28
+
29
+ return { create, destroy }
30
+ }
31
+
32
+ export default server
@@ -1,3 +1,5 @@
1
+ import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'
2
+
1
3
  import mongoose, { model } from 'mongoose'
2
4
 
3
5
  import { bulkPatch, getData, getJsonOmit, getMetadata, getReason, getUser, getValue, updatePatch } from '../src/patch'
@@ -13,16 +15,15 @@ import type { User } from '../src/interfaces/IPluginOptions'
13
15
  import type IPluginOptions from '../src/interfaces/IPluginOptions'
14
16
  import type IUser from './interfaces/IUser'
15
17
 
18
+ import { afterEach } from 'node:test'
19
+ import { update } from 'lodash'
16
20
  import em from '../src/em'
21
+ import server from './mongo/server'
17
22
 
18
- jest.mock('../src/em', () => {
19
- return {
20
- emit: jest.fn(),
21
- }
22
- })
23
+ vi.mock('../src/em', () => ({ default: { emit: vi.fn() } }))
23
24
 
24
25
  describe('patch tests', () => {
25
- const uri = `${globalThis.__MONGO_URI__}${globalThis.__MONGO_DB_NAME__}`
26
+ const instance = server('patch')
26
27
 
27
28
  UserSchema.plugin(patchHistoryPlugin, {
28
29
  eventDeleted: USER_DELETED,
@@ -32,11 +33,11 @@ describe('patch tests', () => {
32
33
  const User = model('User', UserSchema)
33
34
 
34
35
  beforeAll(async () => {
35
- await mongoose.connect(uri)
36
+ await instance.create()
36
37
  })
37
38
 
38
39
  afterAll(async () => {
39
- await mongoose.connection.close()
40
+ await instance.destroy()
40
41
  })
41
42
 
42
43
  beforeEach(async () => {
@@ -44,6 +45,10 @@ describe('patch tests', () => {
44
45
  await mongoose.connection.collection('patches').deleteMany({})
45
46
  })
46
47
 
48
+ afterEach(async () => {
49
+ vi.restoreAllMocks()
50
+ })
51
+
47
52
  describe('getObjects', () => {
48
53
  it('should omit properties from currentObject and originalObject based on the opts', async () => {
49
54
  const original = await User.create({ name: 'John', role: 'user' })
@@ -140,7 +145,7 @@ describe('patch tests', () => {
140
145
  }
141
146
 
142
147
  await updatePatch(pluginOptions, context, current, {} as HydratedDocument<IUser>)
143
- expect(em.emit).not.toHaveBeenCalled()
148
+ expect(em.emit).toHaveBeenCalled()
144
149
  })
145
150
  })
146
151