ts-cache-mongoose 0.0.6 → 1.0.1
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 +45 -13
- package/dist/cjs/cache/Cache.js +5 -5
- package/dist/cjs/cache/Cache.js.map +1 -1
- package/dist/cjs/extend/aggregate.js +1 -3
- package/dist/cjs/extend/aggregate.js.map +1 -1
- package/dist/cjs/extend/query.js +2 -4
- package/dist/cjs/extend/query.js.map +1 -1
- package/dist/cjs/plugin.js +0 -2
- package/dist/cjs/plugin.js.map +1 -1
- package/dist/cjs/types/extend/aggregate.d.ts.map +1 -1
- package/dist/cjs/types/extend/query.d.ts.map +1 -1
- package/dist/cjs/types/plugin.d.ts.map +1 -1
- package/dist/esm/cache/Cache.js +5 -5
- package/dist/esm/cache/Cache.js.map +1 -1
- package/dist/esm/extend/aggregate.js +1 -2
- package/dist/esm/extend/aggregate.js.map +1 -1
- package/dist/esm/extend/query.js +2 -3
- package/dist/esm/extend/query.js.map +1 -1
- package/dist/esm/plugin.js.map +1 -1
- package/dist/esm/plugin.mjs +0 -2
- package/dist/esm/types/extend/aggregate.d.ts.map +1 -1
- package/dist/esm/types/extend/query.d.ts.map +1 -1
- package/dist/esm/types/plugin.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/cache/Cache.ts +5 -5
- package/src/extend/aggregate.ts +1 -3
- package/src/extend/query.ts +2 -4
- package/src/plugin.ts +0 -1
- package/tests/cache-memory.test.ts +1 -0
- package/tests/cache-redis.test.ts +129 -58
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ts-cache-mongoose
|
|
2
2
|
|
|
3
|
-
Cache
|
|
3
|
+
Cache query and aggregate in mongoose using in-memory or redis
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/ts-cache-mongoose)
|
|
6
6
|
[](https://www.npmjs.com/package/ts-cache-mongoose)
|
|
@@ -20,25 +20,31 @@ Cache queries in mongoose using memory or redis
|
|
|
20
20
|
ts-cache-mongoose is a plugin for mongoose
|
|
21
21
|
\
|
|
22
22
|
Caching queries is a good way to improve performance of your application
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
|
|
24
|
+
## Supports and tested with
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"node": "16.x || 18.x || 20.x",
|
|
29
|
+
"mongoose": ">=6.6.x || 7.x",
|
|
30
|
+
}
|
|
31
|
+
```
|
|
27
32
|
|
|
28
33
|
## Features
|
|
29
34
|
|
|
30
|
-
- [x]
|
|
35
|
+
- [x] In-memory caching
|
|
31
36
|
- [x] Redis caching
|
|
32
37
|
- [x] Cache expiration
|
|
33
38
|
- [x] Cache invalidation
|
|
34
39
|
- [x] Cache key generation
|
|
35
40
|
- [x] Cache key prefix
|
|
36
|
-
- [x] Query caching
|
|
37
|
-
- [x] Aggregate caching
|
|
38
|
-
- [ ] More tests
|
|
41
|
+
- [x] Query caching
|
|
42
|
+
- [x] Aggregate caching
|
|
39
43
|
|
|
40
44
|
## Installation
|
|
41
45
|
|
|
46
|
+
- Locally inside your project
|
|
47
|
+
|
|
42
48
|
```bash
|
|
43
49
|
npm install ts-cache-mongoose
|
|
44
50
|
yard add ts-cache-mongoose
|
|
@@ -55,14 +61,14 @@ npm install mongoose@latest
|
|
|
55
61
|
yarn add mongoose@latest
|
|
56
62
|
```
|
|
57
63
|
|
|
58
|
-
##
|
|
64
|
+
## Example
|
|
59
65
|
|
|
60
66
|
```typescript
|
|
61
67
|
// On your application startup
|
|
62
68
|
import mongoose from 'mongoose'
|
|
63
69
|
import cache from 'ts-cache-mongoose'
|
|
64
70
|
|
|
65
|
-
// In
|
|
71
|
+
// In-memory example
|
|
66
72
|
const cache = cache.init(mongoose, {
|
|
67
73
|
engine: 'memory',
|
|
68
74
|
})
|
|
@@ -79,6 +85,32 @@ const cache = cache.init(mongoose, {
|
|
|
79
85
|
mongoose.connect('mongodb://localhost:27017/my-database')
|
|
80
86
|
|
|
81
87
|
// Somewhere in your code
|
|
82
|
-
const
|
|
83
|
-
|
|
88
|
+
const users = await User.find({ role: 'user' }).cache('10 seconds').exec()
|
|
89
|
+
// Cache hit
|
|
90
|
+
const users = await User.find({ role: 'user' }).cache('10 seconds').exec()
|
|
91
|
+
|
|
92
|
+
const book = await Book.findById(id).cache('1 hour').exec()
|
|
93
|
+
const bookCount = await Book.countDocuments().cache('1 minute').exec()
|
|
94
|
+
const authors = await Book.distinct('author').cache('30 seconds').exec()
|
|
95
|
+
|
|
96
|
+
const books = await Book.aggregate([
|
|
97
|
+
{
|
|
98
|
+
$match: {
|
|
99
|
+
genre: 'fantasy',
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
$group: {
|
|
104
|
+
_id: '$author',
|
|
105
|
+
count: { $sum: 1 },
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
$project: {
|
|
110
|
+
_id: 0,
|
|
111
|
+
author: '$_id',
|
|
112
|
+
count: 1,
|
|
113
|
+
},
|
|
114
|
+
}
|
|
115
|
+
]).cache('1 minute').exec()
|
|
84
116
|
```
|
package/dist/cjs/cache/Cache.js
CHANGED
|
@@ -22,20 +22,20 @@ class CacheEngine {
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
async get(key) {
|
|
25
|
-
return
|
|
25
|
+
return this.engine.get(key);
|
|
26
26
|
}
|
|
27
27
|
async set(key, value, ttl) {
|
|
28
28
|
const actualTTL = ttl ? (0, ms_1.default)(ttl) : this.defaultTTL;
|
|
29
|
-
return
|
|
29
|
+
return this.engine.set(key, value, actualTTL);
|
|
30
30
|
}
|
|
31
31
|
async del(key) {
|
|
32
|
-
return
|
|
32
|
+
return this.engine.del(key);
|
|
33
33
|
}
|
|
34
34
|
async clear() {
|
|
35
|
-
return
|
|
35
|
+
return this.engine.clear();
|
|
36
36
|
}
|
|
37
37
|
async close() {
|
|
38
|
-
return
|
|
38
|
+
return this.engine.close();
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
exports.default = CacheEngine;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../../src/cache/Cache.ts"],"names":[],"mappings":";;;AAAA,oDAAmB;AAKnB,2FAA0D;AAC1D,yFAAwD;AAExD,MAAM,WAAW;IAKf,YAAa,YAA2B;QAFvB,YAAO,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAU,CAAA;QAGrD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;YAC/C,MAAM,IAAI,KAAK,CAAC,wBAAwB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;SAC/D;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;YAClE,MAAM,IAAI,KAAK,CAAC,mCAAmC,YAAY,CAAC,MAAM,SAAS,CAAC,CAAA;SACjF;QAED,IAAI,CAAC,UAAU,GAAG,IAAA,YAAE,EAAC,YAAY,CAAC,UAAU,IAAI,UAAU,CAAC,CAAA;QAE3D,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,YAAY,CAAC,aAAa,EAAE;YACjE,IAAI,CAAC,MAAM,GAAG,IAAI,0BAAgB,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;SAC/D;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE;YACpC,IAAI,CAAC,MAAM,GAAG,IAAI,2BAAiB,EAAE,CAAA;SACtC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,OAAO,
|
|
1
|
+
{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../../src/cache/Cache.ts"],"names":[],"mappings":";;;AAAA,oDAAmB;AAKnB,2FAA0D;AAC1D,yFAAwD;AAExD,MAAM,WAAW;IAKf,YAAa,YAA2B;QAFvB,YAAO,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAU,CAAA;QAGrD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;YAC/C,MAAM,IAAI,KAAK,CAAC,wBAAwB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;SAC/D;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;YAClE,MAAM,IAAI,KAAK,CAAC,mCAAmC,YAAY,CAAC,MAAM,SAAS,CAAC,CAAA;SACjF;QAED,IAAI,CAAC,UAAU,GAAG,IAAA,YAAE,EAAC,YAAY,CAAC,UAAU,IAAI,UAAU,CAAC,CAAA;QAE3D,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,YAAY,CAAC,aAAa,EAAE;YACjE,IAAI,CAAC,MAAM,GAAG,IAAI,0BAAgB,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;SAC/D;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE;YACpC,IAAI,CAAC,MAAM,GAAG,IAAI,2BAAiB,EAAE,CAAA;SACtC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW,EAAE,KAA0D,EAAE,GAAY;QAC9F,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,IAAA,YAAE,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAA;QACjD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;CACF;AAED,kBAAe,WAAW,CAAA"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
|
-
const lodash_1 = tslib_1.__importDefault(require("lodash"));
|
|
5
3
|
const key_1 = require("../key");
|
|
6
4
|
function extendQuery(mongoose, cache) {
|
|
7
5
|
const mongooseExec = mongoose.Aggregate.prototype.exec;
|
|
@@ -19,7 +17,7 @@ function extendQuery(mongoose, cache) {
|
|
|
19
17
|
return this;
|
|
20
18
|
};
|
|
21
19
|
mongoose.Aggregate.prototype.exec = async function () {
|
|
22
|
-
if (!
|
|
20
|
+
if (!Object.prototype.hasOwnProperty.call(this, '_ttl')) {
|
|
23
21
|
return mongooseExec.apply(this);
|
|
24
22
|
}
|
|
25
23
|
const key = this.getCacheKey();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/extend/aggregate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/extend/aggregate.ts"],"names":[],"mappings":";;AAGA,gCAA+B;AAE/B,SAAwB,WAAW,CAAE,QAAkB,EAAE,KAAY;IAEnE,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAA;IAGtD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG;QACzC,OAAO,IAAA,YAAM,EAAC;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAA;IACJ,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG;QACzC,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,GAAG,UAAU,GAAY,EAAE,SAAkB;QAC7E,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;QACrB,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK;QACvC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;YACvD,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;SAChC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAE9B,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACrD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,IAAI,WAAW,EAAE;YACf,OAAO,WAAW,CAAA;SACnB;QAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAwD,CAAA;QACnG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACxC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;AACH,CAAC;AA/CD,8BA+CC"}
|
package/dist/cjs/extend/query.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
|
-
const lodash_1 = tslib_1.__importDefault(require("lodash"));
|
|
5
3
|
const key_1 = require("../key");
|
|
6
4
|
function extendQuery(mongoose, cache) {
|
|
7
5
|
const mongooseExec = mongoose.Query.prototype.exec;
|
|
@@ -35,7 +33,7 @@ function extendQuery(mongoose, cache) {
|
|
|
35
33
|
return this;
|
|
36
34
|
};
|
|
37
35
|
mongoose.Query.prototype.exec = async function () {
|
|
38
|
-
if (!
|
|
36
|
+
if (!Object.prototype.hasOwnProperty.call(this, '_ttl')) {
|
|
39
37
|
return mongooseExec.apply(this);
|
|
40
38
|
}
|
|
41
39
|
const key = this.getCacheKey();
|
|
@@ -52,7 +50,7 @@ function extendQuery(mongoose, cache) {
|
|
|
52
50
|
return resultCache;
|
|
53
51
|
}
|
|
54
52
|
const constructor = mongoose.model(model);
|
|
55
|
-
if (
|
|
53
|
+
if (Array.isArray(resultCache)) {
|
|
56
54
|
return resultCache.map((item) => constructor.hydrate(item));
|
|
57
55
|
}
|
|
58
56
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/extend/query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/extend/query.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/plugin.js
CHANGED
|
@@ -8,8 +8,6 @@ class CacheMongoose {
|
|
|
8
8
|
constructor() {
|
|
9
9
|
}
|
|
10
10
|
static init(mongoose, cacheOptions) {
|
|
11
|
-
if (typeof mongoose.Model.hydrate !== 'function')
|
|
12
|
-
throw new Error('Cache is only compatible with versions of mongoose that implement the `model.hydrate` method');
|
|
13
11
|
if (!this.instance) {
|
|
14
12
|
this.instance = new CacheMongoose();
|
|
15
13
|
this.instance.cache = new Cache_1.default(cacheOptions);
|
package/dist/cjs/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;AAAA,kEAAiC;AAKjC,mEAAwC;AACxC,2EAAgD;AAyBhD,MAAM,aAAa;IAKjB;IAEA,CAAC;IAEM,MAAM,CAAC,IAAI,CAAE,QAAkB,EAAE,YAA2B;QACjE,IAAI,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;AAAA,kEAAiC;AAKjC,mEAAwC;AACxC,2EAAgD;AAyBhD,MAAM,aAAa;IAKjB;IAEA,CAAC;IAEM,MAAM,CAAC,IAAI,CAAE,QAAkB,EAAE,YAA2B;QACjE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAA;YACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,eAAK,CAAC,YAAY,CAAC,CAAA;YAE7C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAA;YAEjC,IAAA,eAAW,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YAC5B,IAAA,mBAAe,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;SACjC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAEM,KAAK,CAAC,KAAK,CAAE,SAAkB;QACpC,IAAI,SAAS,EAAE;YACb,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;SAChC;aAAM;YACL,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;SACzB;IACH,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC;CACF;AAED,kBAAe,aAAa,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../../src/extend/aggregate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../../src/extend/aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAIvC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CA+C3E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/extend/query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/extend/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAIvC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CA+E3E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAA;AAK3D,OAAO,QAAQ,UAAU,CAAC;IACxB,UAAU,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU;QACvD,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;QACzG,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,MAAM,CAAA;QAC/E,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;QAC3F,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,WAAW,CAAC,EAAE,OAAO,CAAA;KACtB;IAED,UAAU,SAAS,CAAC,UAAU;QAC5B,KAAK,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;QAC9E,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,MAAM,CAAA;QACpD,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;KACjE;CACF;AAED,cAAM,aAAa;IAEjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2B;IAClD,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO;WAIO,IAAI,CAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,GAAG,aAAa;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAA;AAK3D,OAAO,QAAQ,UAAU,CAAC;IACxB,UAAU,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU;QACvD,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;QACzG,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,MAAM,CAAA;QAC/E,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;QAC3F,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,WAAW,CAAC,EAAE,OAAO,CAAA;KACtB;IAED,UAAU,SAAS,CAAC,UAAU;QAC5B,KAAK,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;QAC9E,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,MAAM,CAAA;QACpD,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;KACjE;CACF;AAED,cAAM,aAAa;IAEjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2B;IAClD,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO;WAIO,IAAI,CAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,GAAG,aAAa;IActE,KAAK,CAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzC,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;CAGrC;AAED,eAAe,aAAa,CAAA"}
|
package/dist/esm/cache/Cache.js
CHANGED
|
@@ -19,20 +19,20 @@ class CacheEngine {
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
async get(key) {
|
|
22
|
-
return
|
|
22
|
+
return this.engine.get(key);
|
|
23
23
|
}
|
|
24
24
|
async set(key, value, ttl) {
|
|
25
25
|
const actualTTL = ttl ? ms(ttl) : this.defaultTTL;
|
|
26
|
-
return
|
|
26
|
+
return this.engine.set(key, value, actualTTL);
|
|
27
27
|
}
|
|
28
28
|
async del(key) {
|
|
29
|
-
return
|
|
29
|
+
return this.engine.del(key);
|
|
30
30
|
}
|
|
31
31
|
async clear() {
|
|
32
|
-
return
|
|
32
|
+
return this.engine.clear();
|
|
33
33
|
}
|
|
34
34
|
async close() {
|
|
35
|
-
return
|
|
35
|
+
return this.engine.close();
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
export default CacheEngine;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../../src/cache/Cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AAKnB,OAAO,iBAAiB,MAAM,4BAA4B,CAAA;AAC1D,OAAO,gBAAgB,MAAM,2BAA2B,CAAA;AAExD,MAAM,WAAW;IAKf,YAAa,YAA2B;QAFvB,YAAO,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAU,CAAA;QAGrD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;YAC/C,MAAM,IAAI,KAAK,CAAC,wBAAwB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;SAC/D;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;YAClE,MAAM,IAAI,KAAK,CAAC,mCAAmC,YAAY,CAAC,MAAM,SAAS,CAAC,CAAA;SACjF;QAED,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,IAAI,UAAU,CAAC,CAAA;QAE3D,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,YAAY,CAAC,aAAa,EAAE;YACjE,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAgB,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;SAC/D;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE;YACpC,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAA;SACtC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,OAAO,
|
|
1
|
+
{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../../src/cache/Cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AAKnB,OAAO,iBAAiB,MAAM,4BAA4B,CAAA;AAC1D,OAAO,gBAAgB,MAAM,2BAA2B,CAAA;AAExD,MAAM,WAAW;IAKf,YAAa,YAA2B;QAFvB,YAAO,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAU,CAAA;QAGrD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;YAC/C,MAAM,IAAI,KAAK,CAAC,wBAAwB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;SAC/D;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;YAClE,MAAM,IAAI,KAAK,CAAC,mCAAmC,YAAY,CAAC,MAAM,SAAS,CAAC,CAAA;SACjF;QAED,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,IAAI,UAAU,CAAC,CAAA;QAE3D,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,YAAY,CAAC,aAAa,EAAE;YACjE,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAgB,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;SAC/D;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE;YACpC,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAA;SACtC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW,EAAE,KAA0D,EAAE,GAAY;QAC9F,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAA;QACjD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAW;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;CACF;AAED,eAAe,WAAW,CAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import _ from 'lodash';
|
|
2
1
|
import { getKey } from '../key';
|
|
3
2
|
export default function extendQuery(mongoose, cache) {
|
|
4
3
|
const mongooseExec = mongoose.Aggregate.prototype.exec;
|
|
@@ -16,7 +15,7 @@ export default function extendQuery(mongoose, cache) {
|
|
|
16
15
|
return this;
|
|
17
16
|
};
|
|
18
17
|
mongoose.Aggregate.prototype.exec = async function () {
|
|
19
|
-
if (!
|
|
18
|
+
if (!Object.prototype.hasOwnProperty.call(this, '_ttl')) {
|
|
20
19
|
return mongooseExec.apply(this);
|
|
21
20
|
}
|
|
22
21
|
const key = this.getCacheKey();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/extend/aggregate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/extend/aggregate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,CAAC,OAAO,UAAU,WAAW,CAAE,QAAkB,EAAE,KAAY;IAEnE,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAA;IAGtD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG;QACzC,OAAO,MAAM,CAAC;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAA;IACJ,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,GAAG;QACzC,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,GAAG,UAAU,GAAY,EAAE,SAAkB;QAC7E,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;QACrB,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAGD,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK;QACvC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;YACvD,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;SAChC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAE9B,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACrD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,IAAI,WAAW,EAAE;YACf,OAAO,WAAW,CAAA;SACnB;QAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAwD,CAAA;QACnG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACxC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;AACH,CAAC"}
|
package/dist/esm/extend/query.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import _ from 'lodash';
|
|
2
1
|
import { getKey } from '../key';
|
|
3
2
|
export default function extendQuery(mongoose, cache) {
|
|
4
3
|
const mongooseExec = mongoose.Query.prototype.exec;
|
|
@@ -32,7 +31,7 @@ export default function extendQuery(mongoose, cache) {
|
|
|
32
31
|
return this;
|
|
33
32
|
};
|
|
34
33
|
mongoose.Query.prototype.exec = async function () {
|
|
35
|
-
if (!
|
|
34
|
+
if (!Object.prototype.hasOwnProperty.call(this, '_ttl')) {
|
|
36
35
|
return mongooseExec.apply(this);
|
|
37
36
|
}
|
|
38
37
|
const key = this.getCacheKey();
|
|
@@ -49,7 +48,7 @@ export default function extendQuery(mongoose, cache) {
|
|
|
49
48
|
return resultCache;
|
|
50
49
|
}
|
|
51
50
|
const constructor = mongoose.model(model);
|
|
52
|
-
if (
|
|
51
|
+
if (Array.isArray(resultCache)) {
|
|
53
52
|
return resultCache.map((item) => constructor.hydrate(item));
|
|
54
53
|
}
|
|
55
54
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/extend/query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/extend/query.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,eAAe,CAAA;AAKjC,OAAO,WAAW,MAAM,gBAAgB,CAAA;AACxC,OAAO,eAAe,MAAM,oBAAoB,CAAA;AAyBhD,MAAM,aAAa;IAKjB;IAEA,CAAC;IAEM,MAAM,CAAC,IAAI,CAAE,QAAkB,EAAE,YAA2B;QACjE,IAAI,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,eAAe,CAAA;AAKjC,OAAO,WAAW,MAAM,gBAAgB,CAAA;AACxC,OAAO,eAAe,MAAM,oBAAoB,CAAA;AAyBhD,MAAM,aAAa;IAKjB;IAEA,CAAC;IAEM,MAAM,CAAC,IAAI,CAAE,QAAkB,EAAE,YAA2B;QACjE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAA;YACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;YAE7C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAA;YAEjC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YAC5B,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;SACjC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAEM,KAAK,CAAC,KAAK,CAAE,SAAkB;QACpC,IAAI,SAAS,EAAE;YACb,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;SAChC;aAAM;YACL,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;SACzB;IACH,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC;CACF;AAED,eAAe,aAAa,CAAA"}
|
package/dist/esm/plugin.mjs
CHANGED
|
@@ -5,8 +5,6 @@ class CacheMongoose {
|
|
|
5
5
|
constructor() {
|
|
6
6
|
}
|
|
7
7
|
static init(mongoose, cacheOptions) {
|
|
8
|
-
if (typeof mongoose.Model.hydrate !== 'function')
|
|
9
|
-
throw new Error('Cache is only compatible with versions of mongoose that implement the `model.hydrate` method');
|
|
10
8
|
if (!this.instance) {
|
|
11
9
|
this.instance = new CacheMongoose();
|
|
12
10
|
this.instance.cache = new Cache(cacheOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../../src/extend/aggregate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../../src/extend/aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAIvC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CA+C3E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/extend/query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/extend/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AAIvC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CA+E3E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAA;AAK3D,OAAO,QAAQ,UAAU,CAAC;IACxB,UAAU,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU;QACvD,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;QACzG,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,MAAM,CAAA;QAC/E,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;QAC3F,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,WAAW,CAAC,EAAE,OAAO,CAAA;KACtB;IAED,UAAU,SAAS,CAAC,UAAU;QAC5B,KAAK,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;QAC9E,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,MAAM,CAAA;QACpD,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;KACjE;CACF;AAED,cAAM,aAAa;IAEjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2B;IAClD,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO;WAIO,IAAI,CAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,GAAG,aAAa;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAA;AAK3D,OAAO,QAAQ,UAAU,CAAC;IACxB,UAAU,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU;QACvD,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;QACzG,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,MAAM,CAAA;QAC/E,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;QAC3F,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,WAAW,CAAC,EAAE,OAAO,CAAA;KACtB;IAED,UAAU,SAAS,CAAC,UAAU;QAC5B,KAAK,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;QAC9E,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,MAAM,CAAA;QACpD,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;KACjE;CACF;AAED,cAAM,aAAa;IAEjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2B;IAClD,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO;WAIO,IAAI,CAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,GAAG,aAAa;IActE,KAAK,CAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzC,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;CAGrC;AAED,eAAe,aAAa,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-cache-mongoose",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Cache plugin for mongoose",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Cache plugin for mongoose Queries and Aggregate (in-memory, redis)",
|
|
5
5
|
"author": "Alex Eagle",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"examples": "examples"
|
|
17
17
|
},
|
|
18
18
|
"keywords": [
|
|
19
|
+
"backend",
|
|
19
20
|
"mongo",
|
|
20
21
|
"mongodb",
|
|
21
22
|
"mongoose",
|
|
@@ -31,7 +32,8 @@
|
|
|
31
32
|
"store",
|
|
32
33
|
"memory",
|
|
33
34
|
"ttl",
|
|
34
|
-
"query"
|
|
35
|
+
"query",
|
|
36
|
+
"aggregate"
|
|
35
37
|
],
|
|
36
38
|
"engines": {
|
|
37
39
|
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
|
|
@@ -74,21 +76,19 @@
|
|
|
74
76
|
},
|
|
75
77
|
"dependencies": {
|
|
76
78
|
"ioredis": "5.3.2",
|
|
77
|
-
"lodash": "4.17.21",
|
|
78
79
|
"ms": "2.1.3",
|
|
79
80
|
"sort-keys": "4.2.0"
|
|
80
81
|
},
|
|
81
82
|
"devDependencies": {
|
|
82
83
|
"@shelf/jest-mongodb": "4.1.7",
|
|
83
84
|
"@swc/cli": "0.1.62",
|
|
84
|
-
"@swc/core": "1.3.
|
|
85
|
+
"@swc/core": "1.3.56",
|
|
85
86
|
"@swc/helpers": "0.5.1",
|
|
86
87
|
"@swc/jest": "0.2.26",
|
|
87
88
|
"@swc/register": "0.1.10",
|
|
88
89
|
"@types/jest": "29.5.1",
|
|
89
|
-
"@types/lodash": "4.14.194",
|
|
90
90
|
"@types/ms": "^0.7.31",
|
|
91
|
-
"@types/node": "18.16.
|
|
91
|
+
"@types/node": "18.16.3",
|
|
92
92
|
"@typescript-eslint/eslint-plugin": "5.59.1",
|
|
93
93
|
"@typescript-eslint/parser": "5.59.1",
|
|
94
94
|
"eslint": "8.39.0",
|
package/src/cache/Cache.ts
CHANGED
|
@@ -32,24 +32,24 @@ class CacheEngine {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
async get (key: string): Promise<Record<string, unknown> | Record<string, unknown>[] | undefined> {
|
|
35
|
-
return
|
|
35
|
+
return this.engine.get(key)
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
async set (key: string, value: Record<string, unknown> | Record<string, unknown>[], ttl?: string): Promise<void> {
|
|
39
39
|
const actualTTL = ttl ? ms(ttl) : this.defaultTTL
|
|
40
|
-
return
|
|
40
|
+
return this.engine.set(key, value, actualTTL)
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
async del (key: string): Promise<void> {
|
|
44
|
-
return
|
|
44
|
+
return this.engine.del(key)
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
async clear (): Promise<void> {
|
|
48
|
-
return
|
|
48
|
+
return this.engine.clear()
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
async close (): Promise<void> {
|
|
52
|
-
return
|
|
52
|
+
return this.engine.close()
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
|
package/src/extend/aggregate.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import _ from 'lodash'
|
|
2
|
-
|
|
3
1
|
import type { Mongoose } from 'mongoose'
|
|
4
2
|
import type Cache from '../cache/Cache'
|
|
5
3
|
|
|
@@ -30,7 +28,7 @@ export default function extendQuery (mongoose: Mongoose, cache: Cache): void {
|
|
|
30
28
|
|
|
31
29
|
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
32
30
|
mongoose.Aggregate.prototype.exec = async function () {
|
|
33
|
-
if (!
|
|
31
|
+
if (!Object.prototype.hasOwnProperty.call(this, '_ttl')) {
|
|
34
32
|
return mongooseExec.apply(this)
|
|
35
33
|
}
|
|
36
34
|
|
package/src/extend/query.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import _ from 'lodash'
|
|
2
|
-
|
|
3
1
|
import type { Mongoose } from 'mongoose'
|
|
4
2
|
import type Cache from '../cache/Cache'
|
|
5
3
|
|
|
@@ -48,7 +46,7 @@ export default function extendQuery (mongoose: Mongoose, cache: Cache): void {
|
|
|
48
46
|
|
|
49
47
|
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
50
48
|
mongoose.Query.prototype.exec = async function () {
|
|
51
|
-
if (!
|
|
49
|
+
if (!Object.prototype.hasOwnProperty.call(this, '_ttl')) {
|
|
52
50
|
return mongooseExec.apply(this)
|
|
53
51
|
}
|
|
54
52
|
|
|
@@ -70,7 +68,7 @@ export default function extendQuery (mongoose: Mongoose, cache: Cache): void {
|
|
|
70
68
|
}
|
|
71
69
|
|
|
72
70
|
const constructor = mongoose.model(model)
|
|
73
|
-
if (
|
|
71
|
+
if (Array.isArray(resultCache)) {
|
|
74
72
|
return resultCache.map((item) => constructor.hydrate(item) as Record<string, unknown>)
|
|
75
73
|
} else {
|
|
76
74
|
return constructor.hydrate(resultCache) as Record<string, unknown>
|
package/src/plugin.ts
CHANGED
|
@@ -39,7 +39,6 @@ class CacheMongoose {
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
public static init (mongoose: Mongoose, cacheOptions: ICacheOptions): CacheMongoose {
|
|
42
|
-
if (typeof mongoose.Model.hydrate !== 'function') throw new Error('Cache is only compatible with versions of mongoose that implement the `model.hydrate` method')
|
|
43
42
|
if (!this.instance) {
|
|
44
43
|
this.instance = new CacheMongoose()
|
|
45
44
|
this.instance.cache = new Cache(cacheOptions)
|
|
@@ -18,6 +18,7 @@ describe('cache redis', () => {
|
|
|
18
18
|
|
|
19
19
|
beforeAll(async () => {
|
|
20
20
|
await mongoose.connect(uri)
|
|
21
|
+
await cache.clear()
|
|
21
22
|
})
|
|
22
23
|
|
|
23
24
|
afterAll(async () => {
|
|
@@ -29,75 +30,73 @@ describe('cache redis', () => {
|
|
|
29
30
|
await mongoose.connection.collection('users').deleteMany({})
|
|
30
31
|
})
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
role: 'admin'
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
const user1 = await User.findById(user._id).cache()
|
|
40
|
-
await User.findOneAndUpdate({ _id: user._id }, { name: 'John Doe 2' })
|
|
41
|
-
const user2 = await User.findById(user._id).cache()
|
|
42
|
-
|
|
43
|
-
expect(user1).not.toBeNull()
|
|
44
|
-
expect(user2).not.toBeNull()
|
|
45
|
-
expect(user1?._id).toEqual(user2?._id)
|
|
46
|
-
expect(user1?.name).toEqual(user2?.name)
|
|
33
|
+
it('should use cache', async () => {
|
|
34
|
+
const user = await User.create({
|
|
35
|
+
name: 'John Doe',
|
|
36
|
+
role: 'admin'
|
|
47
37
|
})
|
|
48
38
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
role: 'admin'
|
|
53
|
-
})
|
|
39
|
+
const user1 = await User.findById(user._id).cache()
|
|
40
|
+
await User.findOneAndUpdate({ _id: user._id }, { name: 'John Doe 2' })
|
|
41
|
+
const user2 = await User.findById(user._id).cache()
|
|
54
42
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
43
|
+
expect(user1).not.toBeNull()
|
|
44
|
+
expect(user2).not.toBeNull()
|
|
45
|
+
expect(user1?._id).toEqual(user2?._id)
|
|
46
|
+
expect(user1?.name).toEqual(user2?.name)
|
|
47
|
+
})
|
|
59
48
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
49
|
+
it('should clear cache', async () => {
|
|
50
|
+
const user = await User.create({
|
|
51
|
+
name: 'John Doe',
|
|
52
|
+
role: 'admin'
|
|
64
53
|
})
|
|
65
54
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
})
|
|
55
|
+
const cache1 = await User.findById(user._id).cache().exec()
|
|
56
|
+
await User.findByIdAndUpdate(user._id, { name: 'Steve' }).exec()
|
|
57
|
+
await cache.clear()
|
|
58
|
+
const cache2 = await User.findById(user._id).cache().exec()
|
|
71
59
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
60
|
+
expect(cache1).not.toBeNull()
|
|
61
|
+
expect(cache2).not.toBeNull()
|
|
62
|
+
expect(cache1?._id).toEqual(cache2?._id)
|
|
63
|
+
expect(cache1?.name).not.toEqual(cache2?.name)
|
|
64
|
+
})
|
|
75
65
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
66
|
+
it('should use cache with custom-key-1', async () => {
|
|
67
|
+
const user = await User.create({
|
|
68
|
+
name: 'John Doe',
|
|
69
|
+
role: 'admin'
|
|
80
70
|
})
|
|
81
71
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
role: 'admin'
|
|
86
|
-
})
|
|
72
|
+
const cache1 = await User.findById(user._id).cache('1 minute', 'custom-key-1').exec()
|
|
73
|
+
await User.findOneAndUpdate({ _id: user._id }, { name: 'John Doe 2' })
|
|
74
|
+
const cache2 = await User.findById(user._id).cache('1 minute', 'custom-key-1').exec()
|
|
87
75
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
76
|
+
expect(cache1).not.toBeNull()
|
|
77
|
+
expect(cache2).not.toBeNull()
|
|
78
|
+
expect(cache1?._id).toEqual(cache2?._id)
|
|
79
|
+
expect(cache1?.name).toEqual(cache2?.name)
|
|
80
|
+
})
|
|
92
81
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
82
|
+
it('should clear custom-key-2', async () => {
|
|
83
|
+
const user = await User.create({
|
|
84
|
+
name: 'John Doe',
|
|
85
|
+
role: 'admin'
|
|
97
86
|
})
|
|
87
|
+
|
|
88
|
+
const cache1 = await User.findById(user._id).cache('1 minute', 'custom-key-2').exec()
|
|
89
|
+
await User.updateOne({ _id: user._id }, { name: 'Steve' })
|
|
90
|
+
await cache.clear('custom-key-2')
|
|
91
|
+
const cache2 = await User.findById(user._id).cache('1 minute', 'custom-key-2').exec()
|
|
92
|
+
|
|
93
|
+
expect(cache1).not.toBeNull()
|
|
94
|
+
expect(cache2).not.toBeNull()
|
|
95
|
+
expect(cache1?._id).toEqual(cache2?._id)
|
|
96
|
+
expect(cache1?.name).not.toEqual(cache2?.name)
|
|
98
97
|
})
|
|
99
98
|
|
|
100
|
-
it('should use
|
|
99
|
+
it('should use cache without cache options', async () => {
|
|
101
100
|
expect(cache).toBeDefined()
|
|
102
101
|
|
|
103
102
|
const user = await User.create({
|
|
@@ -116,17 +115,17 @@ describe('cache redis', () => {
|
|
|
116
115
|
|
|
117
116
|
await User.create([
|
|
118
117
|
{
|
|
119
|
-
name: '
|
|
118
|
+
name: 'Alice',
|
|
120
119
|
role: 'admin'
|
|
121
120
|
},
|
|
122
121
|
{
|
|
123
|
-
name: '
|
|
122
|
+
name: 'Bob',
|
|
124
123
|
role: 'admin'
|
|
125
124
|
}
|
|
126
125
|
])
|
|
127
126
|
|
|
128
127
|
const cache3 = await User.find({ role: 'admin' }).cache()
|
|
129
|
-
await User.updateMany({ role: 'admin' }, { name: '
|
|
128
|
+
await User.updateMany({ role: 'admin' }, { name: 'Steve' })
|
|
130
129
|
const cache4 = await User.find({ role: 'admin' }).cache()
|
|
131
130
|
|
|
132
131
|
expect(cache3).not.toBeNull()
|
|
@@ -135,7 +134,7 @@ describe('cache redis', () => {
|
|
|
135
134
|
expect(cache3?.[0].name).toEqual(cache4?.[0].name)
|
|
136
135
|
})
|
|
137
136
|
|
|
138
|
-
it('should use
|
|
137
|
+
it('should use cache on aggregate', async () => {
|
|
139
138
|
await User.create([
|
|
140
139
|
{ name: 'John', role: 'admin' },
|
|
141
140
|
{ name: 'Bob', role: 'admin' },
|
|
@@ -158,4 +157,76 @@ describe('cache redis', () => {
|
|
|
158
157
|
expect(cache2).not.toBeNull()
|
|
159
158
|
expect(cache1?.[0].count).toEqual(cache2?.[0].count)
|
|
160
159
|
})
|
|
160
|
+
|
|
161
|
+
it('should use cache on aggregate with custom-key', async () => {
|
|
162
|
+
await User.create([
|
|
163
|
+
{ name: 'John', role: 'admin' },
|
|
164
|
+
{ name: 'Bob', role: 'admin' },
|
|
165
|
+
{ name: 'Alice', role: 'user' }
|
|
166
|
+
])
|
|
167
|
+
|
|
168
|
+
const cache1 = await User.aggregate([
|
|
169
|
+
{ $match: { role: 'admin' } },
|
|
170
|
+
{ $group: { _id: '$role', count: { $sum: 1 } } }
|
|
171
|
+
]).cache('1 minute', 'aggregate-custom-key')
|
|
172
|
+
|
|
173
|
+
await User.create({ name: 'Mark', role: 'admin' })
|
|
174
|
+
|
|
175
|
+
const cache2 = await User.aggregate([
|
|
176
|
+
{ $match: { role: 'admin' } },
|
|
177
|
+
{ $group: { _id: '$role', count: { $sum: 1 } } }
|
|
178
|
+
]).cache('1 minute', 'aggregate-custom-key')
|
|
179
|
+
|
|
180
|
+
// Don't use cache key
|
|
181
|
+
const cache3 = await User.aggregate([
|
|
182
|
+
{ $match: { role: 'admin' } },
|
|
183
|
+
{ $group: { _id: '$role', count: { $sum: 1 } } }
|
|
184
|
+
])
|
|
185
|
+
|
|
186
|
+
expect(cache1).not.toBeNull()
|
|
187
|
+
expect(cache2).not.toBeNull()
|
|
188
|
+
expect(cache3).not.toBeNull()
|
|
189
|
+
expect(cache1?.[0].count).toEqual(cache2?.[0].count)
|
|
190
|
+
expect(cache1?.[0].count).not.toEqual(cache3?.[0].count)
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
it('should test lean cache', async () => {
|
|
194
|
+
await User.create([
|
|
195
|
+
{ name: 'John', role: 'admin' },
|
|
196
|
+
{ name: 'Bob', role: 'admin' },
|
|
197
|
+
{ name: 'Alice', role: 'user' }
|
|
198
|
+
])
|
|
199
|
+
|
|
200
|
+
const cache1 = await User.find({ role: 'admin' }).lean().cache('1 minute')
|
|
201
|
+
await User.create({ name: 'Mark', role: 'admin' })
|
|
202
|
+
const cache2 = await User.find({ role: 'admin' }).lean().cache('1 minute')
|
|
203
|
+
|
|
204
|
+
expect(cache1).not.toBeNull()
|
|
205
|
+
expect(cache2).not.toBeNull()
|
|
206
|
+
expect(cache1?.length).toEqual(cache2?.length)
|
|
207
|
+
})
|
|
208
|
+
|
|
209
|
+
it('should cache with regex query', async () => {
|
|
210
|
+
await User.create([
|
|
211
|
+
{ name: 'John', role: 'admin' },
|
|
212
|
+
{ name: 'Alice', role: 'user' },
|
|
213
|
+
{ name: 'Andy', role: 'user' }
|
|
214
|
+
])
|
|
215
|
+
|
|
216
|
+
const cache1 = await User.find({ name: /^J/ }).cache('1 minute')
|
|
217
|
+
await User.create({ name: 'Jenifer', role: 'admin' })
|
|
218
|
+
const cache2 = await User.find({ name: /^J/ }).cache('1 minute')
|
|
219
|
+
|
|
220
|
+
expect(cache1).not.toBeNull()
|
|
221
|
+
expect(cache2).not.toBeNull()
|
|
222
|
+
expect(cache1?.length).toEqual(cache2?.length)
|
|
223
|
+
|
|
224
|
+
const cache3 = await User.find({ name: /^A/ }).cache('1 hour')
|
|
225
|
+
await User.create({ name: 'Alex', role: 'admin' })
|
|
226
|
+
const cache4 = await User.find({ name: /^A/ }).cache('1 hour')
|
|
227
|
+
|
|
228
|
+
expect(cache3).not.toBeNull()
|
|
229
|
+
expect(cache4).not.toBeNull()
|
|
230
|
+
expect(cache3?.length).toEqual(cache4?.length)
|
|
231
|
+
})
|
|
161
232
|
})
|