ts-cache-mongoose 1.0.0 → 1.0.2
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 +5 -0
- package/dist/cjs/extend/aggregate.js +1 -3
- package/dist/cjs/extend/aggregate.js.map +1 -1
- package/dist/cjs/extend/query.js +9 -7
- package/dist/cjs/extend/query.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/esm/extend/aggregate.js +1 -2
- package/dist/esm/extend/aggregate.js.map +1 -1
- package/dist/esm/extend/query.js +9 -6
- package/dist/esm/extend/query.js.map +1 -1
- package/dist/esm/types/extend/aggregate.d.ts.map +1 -1
- package/dist/esm/types/extend/query.d.ts.map +1 -1
- package/package.json +8 -9
- package/src/extend/aggregate.ts +1 -3
- package/src/extend/query.ts +11 -8
- package/tests/cache-redis.test.ts +50 -15
- package/tests/{crypto.test.ts → key.test.ts} +16 -0
package/README.md
CHANGED
|
@@ -114,3 +114,8 @@ const books = await Book.aggregate([
|
|
|
114
114
|
}
|
|
115
115
|
]).cache('1 minute').exec()
|
|
116
116
|
```
|
|
117
|
+
|
|
118
|
+
## Check my other projects
|
|
119
|
+
|
|
120
|
+
- [ts-migrate-mongoose](https://github.com/ilovepixelart/ts-migrate-mongoose) - Migration framework for mongoose
|
|
121
|
+
- [ts-patch-mongoose](https://github.com/ilovepixelart/ts-patch-mongoose) - Patch history & events plugin for mongoose
|
|
@@ -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();
|
|
@@ -48,15 +46,19 @@ function extendQuery(mongoose, cache) {
|
|
|
48
46
|
console.error(err);
|
|
49
47
|
});
|
|
50
48
|
if (resultCache) {
|
|
51
|
-
if (isCount || isDistinct
|
|
49
|
+
if (isCount || isDistinct) {
|
|
52
50
|
return resultCache;
|
|
53
51
|
}
|
|
54
52
|
const constructor = mongoose.model(model);
|
|
55
|
-
if (
|
|
56
|
-
return resultCache.map((item) =>
|
|
53
|
+
if (Array.isArray(resultCache)) {
|
|
54
|
+
return resultCache.map((item) => {
|
|
55
|
+
const hydrated = constructor.hydrate(item);
|
|
56
|
+
return mongooseOptions.lean ? hydrated.toObject() : hydrated;
|
|
57
|
+
});
|
|
57
58
|
}
|
|
58
59
|
else {
|
|
59
|
-
|
|
60
|
+
const hydrated = constructor.hydrate(resultCache);
|
|
61
|
+
return mongooseOptions.lean ? hydrated.toObject() : hydrated;
|
|
60
62
|
}
|
|
61
63
|
}
|
|
62
64
|
const result = await mongooseExec.call(this);
|
|
@@ -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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"}
|
|
@@ -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,CAoF3E"}
|
|
@@ -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();
|
|
@@ -45,15 +44,19 @@ export default function extendQuery(mongoose, cache) {
|
|
|
45
44
|
console.error(err);
|
|
46
45
|
});
|
|
47
46
|
if (resultCache) {
|
|
48
|
-
if (isCount || isDistinct
|
|
47
|
+
if (isCount || isDistinct) {
|
|
49
48
|
return resultCache;
|
|
50
49
|
}
|
|
51
50
|
const constructor = mongoose.model(model);
|
|
52
|
-
if (
|
|
53
|
-
return resultCache.map((item) =>
|
|
51
|
+
if (Array.isArray(resultCache)) {
|
|
52
|
+
return resultCache.map((item) => {
|
|
53
|
+
const hydrated = constructor.hydrate(item);
|
|
54
|
+
return mongooseOptions.lean ? hydrated.toObject() : hydrated;
|
|
55
|
+
});
|
|
54
56
|
}
|
|
55
57
|
else {
|
|
56
|
-
|
|
58
|
+
const hydrated = constructor.hydrate(resultCache);
|
|
59
|
+
return mongooseOptions.lean ? hydrated.toObject() : hydrated;
|
|
57
60
|
}
|
|
58
61
|
}
|
|
59
62
|
const result = await mongooseExec.call(this);
|
|
@@ -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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"}
|
|
@@ -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,CAoF3E"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-cache-mongoose",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Cache plugin for mongoose Queries and Aggregate (in-memory, redis)",
|
|
5
5
|
"author": "Alex Eagle",
|
|
6
6
|
"license": "MIT",
|
|
@@ -32,7 +32,8 @@
|
|
|
32
32
|
"store",
|
|
33
33
|
"memory",
|
|
34
34
|
"ttl",
|
|
35
|
-
"query"
|
|
35
|
+
"query",
|
|
36
|
+
"aggregate"
|
|
36
37
|
],
|
|
37
38
|
"engines": {
|
|
38
39
|
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
|
|
@@ -71,27 +72,25 @@
|
|
|
71
72
|
"build": "npm run clean && npm run build:cjs && npm run build:esm",
|
|
72
73
|
"build:cjs": "tsc -p config/tsconfig.cjs.json",
|
|
73
74
|
"build:esm": "tsc -p config/tsconfig.esm.json && mv ./dist/esm/plugin.js ./dist/esm/plugin.mjs",
|
|
74
|
-
"release": "npm
|
|
75
|
+
"release": "npm run lint && npm run build && np"
|
|
75
76
|
},
|
|
76
77
|
"dependencies": {
|
|
77
78
|
"ioredis": "5.3.2",
|
|
78
|
-
"lodash": "4.17.21",
|
|
79
79
|
"ms": "2.1.3",
|
|
80
80
|
"sort-keys": "4.2.0"
|
|
81
81
|
},
|
|
82
82
|
"devDependencies": {
|
|
83
83
|
"@shelf/jest-mongodb": "4.1.7",
|
|
84
84
|
"@swc/cli": "0.1.62",
|
|
85
|
-
"@swc/core": "1.3.
|
|
85
|
+
"@swc/core": "1.3.56",
|
|
86
86
|
"@swc/helpers": "0.5.1",
|
|
87
87
|
"@swc/jest": "0.2.26",
|
|
88
88
|
"@swc/register": "0.1.10",
|
|
89
89
|
"@types/jest": "29.5.1",
|
|
90
|
-
"@types/lodash": "4.14.194",
|
|
91
90
|
"@types/ms": "^0.7.31",
|
|
92
|
-
"@types/node": "18.16.
|
|
93
|
-
"@typescript-eslint/eslint-plugin": "5.59.
|
|
94
|
-
"@typescript-eslint/parser": "5.59.
|
|
91
|
+
"@types/node": "18.16.3",
|
|
92
|
+
"@typescript-eslint/eslint-plugin": "5.59.2",
|
|
93
|
+
"@typescript-eslint/parser": "5.59.2",
|
|
95
94
|
"eslint": "8.39.0",
|
|
96
95
|
"eslint-config-standard": "17.0.0",
|
|
97
96
|
"eslint-plugin-import": "2.27.5",
|
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
|
|
|
@@ -65,15 +63,20 @@ export default function extendQuery (mongoose: Mongoose, cache: Cache): void {
|
|
|
65
63
|
})
|
|
66
64
|
|
|
67
65
|
if (resultCache) {
|
|
68
|
-
if (isCount || isDistinct
|
|
66
|
+
if (isCount || isDistinct) {
|
|
69
67
|
return resultCache
|
|
70
68
|
}
|
|
71
69
|
|
|
72
|
-
const constructor = mongoose.model(model)
|
|
73
|
-
|
|
74
|
-
|
|
70
|
+
const constructor = mongoose.model<unknown>(model)
|
|
71
|
+
|
|
72
|
+
if (Array.isArray(resultCache)) {
|
|
73
|
+
return resultCache.map((item) => {
|
|
74
|
+
const hydrated = constructor.hydrate(item)
|
|
75
|
+
return mongooseOptions.lean ? hydrated.toObject() : hydrated
|
|
76
|
+
})
|
|
75
77
|
} else {
|
|
76
|
-
|
|
78
|
+
const hydrated = constructor.hydrate(resultCache)
|
|
79
|
+
return mongooseOptions.lean ? hydrated.toObject() : hydrated
|
|
77
80
|
}
|
|
78
81
|
}
|
|
79
82
|
|
|
@@ -13,7 +13,7 @@ describe('cache redis', () => {
|
|
|
13
13
|
host: 'localhost',
|
|
14
14
|
port: 6379
|
|
15
15
|
},
|
|
16
|
-
defaultTTL: '
|
|
16
|
+
defaultTTL: '10 seconds'
|
|
17
17
|
})
|
|
18
18
|
|
|
19
19
|
beforeAll(async () => {
|
|
@@ -69,9 +69,9 @@ describe('cache redis', () => {
|
|
|
69
69
|
role: 'admin'
|
|
70
70
|
})
|
|
71
71
|
|
|
72
|
-
const cache1 = await User.findById(user._id).cache('
|
|
72
|
+
const cache1 = await User.findById(user._id).cache('30 seconds', 'custom-key-1').exec()
|
|
73
73
|
await User.findOneAndUpdate({ _id: user._id }, { name: 'John Doe 2' })
|
|
74
|
-
const cache2 = await User.findById(user._id).cache('
|
|
74
|
+
const cache2 = await User.findById(user._id).cache('30 seconds', 'custom-key-1').exec()
|
|
75
75
|
|
|
76
76
|
expect(cache1).not.toBeNull()
|
|
77
77
|
expect(cache2).not.toBeNull()
|
|
@@ -85,10 +85,10 @@ describe('cache redis', () => {
|
|
|
85
85
|
role: 'admin'
|
|
86
86
|
})
|
|
87
87
|
|
|
88
|
-
const cache1 = await User.findById(user._id).cache('
|
|
88
|
+
const cache1 = await User.findById(user._id).cache('30 seconds', 'custom-key-2').exec()
|
|
89
89
|
await User.updateOne({ _id: user._id }, { name: 'Steve' })
|
|
90
90
|
await cache.clear('custom-key-2')
|
|
91
|
-
const cache2 = await User.findById(user._id).cache('
|
|
91
|
+
const cache2 = await User.findById(user._id).cache('30 seconds', 'custom-key-2').exec()
|
|
92
92
|
|
|
93
93
|
expect(cache1).not.toBeNull()
|
|
94
94
|
expect(cache2).not.toBeNull()
|
|
@@ -144,14 +144,14 @@ describe('cache redis', () => {
|
|
|
144
144
|
const cache1 = await User.aggregate([
|
|
145
145
|
{ $match: { role: 'admin' } },
|
|
146
146
|
{ $group: { _id: '$role', count: { $sum: 1 } } }
|
|
147
|
-
]).cache('
|
|
147
|
+
]).cache('30 seconds')
|
|
148
148
|
|
|
149
149
|
await User.create({ name: 'Mark', role: 'admin' })
|
|
150
150
|
|
|
151
151
|
const cache2 = await User.aggregate([
|
|
152
152
|
{ $match: { role: 'admin' } },
|
|
153
153
|
{ $group: { _id: '$role', count: { $sum: 1 } } }
|
|
154
|
-
]).cache('
|
|
154
|
+
]).cache('30 seconds')
|
|
155
155
|
|
|
156
156
|
expect(cache1).not.toBeNull()
|
|
157
157
|
expect(cache2).not.toBeNull()
|
|
@@ -168,14 +168,14 @@ describe('cache redis', () => {
|
|
|
168
168
|
const cache1 = await User.aggregate([
|
|
169
169
|
{ $match: { role: 'admin' } },
|
|
170
170
|
{ $group: { _id: '$role', count: { $sum: 1 } } }
|
|
171
|
-
]).cache('
|
|
171
|
+
]).cache('30 seconds', 'aggregate-custom-key')
|
|
172
172
|
|
|
173
173
|
await User.create({ name: 'Mark', role: 'admin' })
|
|
174
174
|
|
|
175
175
|
const cache2 = await User.aggregate([
|
|
176
176
|
{ $match: { role: 'admin' } },
|
|
177
177
|
{ $group: { _id: '$role', count: { $sum: 1 } } }
|
|
178
|
-
]).cache('
|
|
178
|
+
]).cache('30 seconds', 'aggregate-custom-key')
|
|
179
179
|
|
|
180
180
|
// Don't use cache key
|
|
181
181
|
const cache3 = await User.aggregate([
|
|
@@ -197,9 +197,9 @@ describe('cache redis', () => {
|
|
|
197
197
|
{ name: 'Alice', role: 'user' }
|
|
198
198
|
])
|
|
199
199
|
|
|
200
|
-
const cache1 = await User.find({ role: 'admin' }).lean().cache('
|
|
200
|
+
const cache1 = await User.find({ role: 'admin' }).lean().cache('30 seconds')
|
|
201
201
|
await User.create({ name: 'Mark', role: 'admin' })
|
|
202
|
-
const cache2 = await User.find({ role: 'admin' }).lean().cache('
|
|
202
|
+
const cache2 = await User.find({ role: 'admin' }).lean().cache('30 seconds')
|
|
203
203
|
|
|
204
204
|
expect(cache1).not.toBeNull()
|
|
205
205
|
expect(cache2).not.toBeNull()
|
|
@@ -213,20 +213,55 @@ describe('cache redis', () => {
|
|
|
213
213
|
{ name: 'Andy', role: 'user' }
|
|
214
214
|
])
|
|
215
215
|
|
|
216
|
-
const cache1 = await User.find({ name: /^J/ }).cache('
|
|
216
|
+
const cache1 = await User.find({ name: /^J/ }).cache('30 seconds')
|
|
217
217
|
await User.create({ name: 'Jenifer', role: 'admin' })
|
|
218
|
-
const cache2 = await User.find({ name: /^J/ }).cache('
|
|
218
|
+
const cache2 = await User.find({ name: /^J/ }).cache('30 seconds')
|
|
219
219
|
|
|
220
220
|
expect(cache1).not.toBeNull()
|
|
221
221
|
expect(cache2).not.toBeNull()
|
|
222
222
|
expect(cache1?.length).toEqual(cache2?.length)
|
|
223
223
|
|
|
224
|
-
const cache3 = await User.find({ name: /^A/ }).cache('
|
|
224
|
+
const cache3 = await User.find({ name: /^A/ }).cache('30 seconds')
|
|
225
225
|
await User.create({ name: 'Alex', role: 'admin' })
|
|
226
|
-
const cache4 = await User.find({ name: /^A/ }).cache('
|
|
226
|
+
const cache4 = await User.find({ name: /^A/ }).cache('30 seconds')
|
|
227
227
|
|
|
228
228
|
expect(cache3).not.toBeNull()
|
|
229
229
|
expect(cache4).not.toBeNull()
|
|
230
230
|
expect(cache3?.length).toEqual(cache4?.length)
|
|
231
231
|
})
|
|
232
|
+
|
|
233
|
+
it('should findOne', async () => {
|
|
234
|
+
await User.create([
|
|
235
|
+
{ name: 'C', role: 'admin' },
|
|
236
|
+
{ name: 'V', role: 'user' },
|
|
237
|
+
{ name: 'G', role: 'user' }
|
|
238
|
+
])
|
|
239
|
+
|
|
240
|
+
const cache1 = await User.findOne({ name: 'G' }).lean().cache('30 seconds').exec()
|
|
241
|
+
expect(cache1).not.toBeNull()
|
|
242
|
+
expect(cache1?._id instanceof mongoose.Types.ObjectId).toBeTruthy()
|
|
243
|
+
expect(cache1).toHaveProperty('name', 'G')
|
|
244
|
+
|
|
245
|
+
const cache2 = await User.findOne({ name: 'G' }).lean().cache('30 seconds').exec()
|
|
246
|
+
expect(cache2).not.toBeNull()
|
|
247
|
+
expect(cache2?._id instanceof mongoose.Types.ObjectId).toBeTruthy()
|
|
248
|
+
expect(cache2).toHaveProperty('name', 'G')
|
|
249
|
+
expect(cache1).toEqual(cache2)
|
|
250
|
+
|
|
251
|
+
const cache3 = await User.findOne({ name: 'G' }).lean().cache('30 seconds').exec()
|
|
252
|
+
expect(cache3).not.toBeNull()
|
|
253
|
+
expect(cache3).toHaveProperty('name', 'G')
|
|
254
|
+
expect(cache2).toEqual(cache3)
|
|
255
|
+
|
|
256
|
+
const cache4 = await User.findOne({ name: 'V' }).lean().cache('30 seconds').exec()
|
|
257
|
+
expect(cache4).not.toBeNull()
|
|
258
|
+
expect(cache4).toHaveProperty('name', 'V')
|
|
259
|
+
expect(cache3).not.toEqual(cache4)
|
|
260
|
+
|
|
261
|
+
const cache5 = await User.findOne({ name: 'O' }).lean().cache('30 seconds').exec()
|
|
262
|
+
const cache6 = await User.findOne({ name: 'O' }).lean().cache('30 seconds').exec()
|
|
263
|
+
expect(cache5).toBeNull()
|
|
264
|
+
expect(cache6).toBeNull()
|
|
265
|
+
expect(cache5).toEqual(cache6)
|
|
266
|
+
})
|
|
232
267
|
})
|
|
@@ -82,4 +82,20 @@ describe('generateHash()', () => {
|
|
|
82
82
|
expect(hash1).not.toEqual(hash3)
|
|
83
83
|
expect(hash3).not.toEqual(hash4)
|
|
84
84
|
})
|
|
85
|
+
|
|
86
|
+
it('should test dates', async () => {
|
|
87
|
+
const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))
|
|
88
|
+
const date = new Date()
|
|
89
|
+
const hash1 = getKey({
|
|
90
|
+
name: 'John Doe',
|
|
91
|
+
date: { $lte: date }
|
|
92
|
+
})
|
|
93
|
+
await wait(50)
|
|
94
|
+
const date2 = new Date()
|
|
95
|
+
const hash2 = getKey({
|
|
96
|
+
name: 'John Doe',
|
|
97
|
+
date: { $lte: date2 }
|
|
98
|
+
})
|
|
99
|
+
expect(hash1).not.toEqual(hash2)
|
|
100
|
+
})
|
|
85
101
|
})
|