@tsed/adapters-redis 7.0.0-alpha.1 → 7.0.0-beta.3
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/jest.config.js +14 -0
- package/lib/{adapters → cjs/adapters}/RedisAdapter.js +6 -6
- package/lib/cjs/adapters/RedisAdapter.js.map +1 -0
- package/lib/{domain → cjs/domain}/RedisAdaptersSettings.js +0 -0
- package/lib/cjs/domain/RedisAdaptersSettings.js.map +1 -0
- package/lib/{index.js → cjs/index.js} +1 -1
- package/lib/cjs/index.js.map +1 -0
- package/lib/{services → cjs/services}/RedisFactory.js +2 -2
- package/lib/cjs/services/RedisFactory.js.map +1 -0
- package/lib/esm/adapters/RedisAdapter.js +154 -0
- package/lib/esm/adapters/RedisAdapter.js.map +1 -0
- package/lib/esm/domain/RedisAdaptersSettings.js +2 -0
- package/lib/esm/domain/RedisAdaptersSettings.js.map +1 -0
- package/lib/esm/index.js +2 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/services/RedisFactory.js +15 -0
- package/lib/esm/services/RedisFactory.js.map +1 -0
- package/lib/{adapters → types/adapters}/RedisAdapter.d.ts +0 -0
- package/lib/{domain → types/domain}/RedisAdaptersSettings.d.ts +0 -0
- package/lib/{index.d.ts → types/index.d.ts} +0 -0
- package/lib/{services → types/services}/RedisFactory.d.ts +0 -0
- package/package.json +21 -12
- package/tsconfig.compile.esm.json +23 -0
- package/.mocharc.js +0 -5
- package/lib/adapters/RedisAdapter.js.map +0 -1
- package/lib/domain/RedisAdaptersSettings.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/services/RedisFactory.js.map +0 -1
package/jest.config.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// For a detailed explanation regarding each configuration property, visit:
|
|
2
|
+
// https://jestjs.io/docs/en/configuration.html
|
|
3
|
+
|
|
4
|
+
module.exports = {
|
|
5
|
+
...require("@tsed/jest-config")(__dirname, "adapters-redis"),
|
|
6
|
+
coverageThreshold: {
|
|
7
|
+
global: {
|
|
8
|
+
branches: 70,
|
|
9
|
+
functions: 70,
|
|
10
|
+
lines: 70,
|
|
11
|
+
statements: 70
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
};
|
|
@@ -4,7 +4,7 @@ exports.RedisAdapter = void 0;
|
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const adapters_1 = require("@tsed/adapters");
|
|
6
6
|
const di_1 = require("@tsed/di");
|
|
7
|
-
const ioredis_1 = tslib_1.__importDefault(require("ioredis"));
|
|
7
|
+
const ioredis_1 = (0, tslib_1.__importDefault)(require("ioredis"));
|
|
8
8
|
const uuid_1 = require("uuid");
|
|
9
9
|
require("../services/RedisFactory");
|
|
10
10
|
class RedisAdapter extends adapters_1.Adapter {
|
|
@@ -12,7 +12,7 @@ class RedisAdapter extends adapters_1.Adapter {
|
|
|
12
12
|
return `${this.collectionName}:${id}`;
|
|
13
13
|
}
|
|
14
14
|
async create(payload, expiresAt) {
|
|
15
|
-
payload._id = uuid_1.v4();
|
|
15
|
+
payload._id = (0, uuid_1.v4)();
|
|
16
16
|
return this.insert(payload, expiresAt);
|
|
17
17
|
}
|
|
18
18
|
async upsert(id, payload, expiresAt) {
|
|
@@ -101,7 +101,7 @@ class RedisAdapter extends adapters_1.Adapter {
|
|
|
101
101
|
return result.reduce((keys, input) => keys.concat(input), []).filter(Boolean);
|
|
102
102
|
}
|
|
103
103
|
async insert(payload, expiresAt) {
|
|
104
|
-
const id = (payload._id = payload._id || uuid_1.v4());
|
|
104
|
+
const id = (payload._id = payload._id || (0, uuid_1.v4)());
|
|
105
105
|
const expiresIn = expiresAt ? Date.now() - expiresAt.getTime() : null;
|
|
106
106
|
await this.validate(payload);
|
|
107
107
|
const multi = this.db.multi();
|
|
@@ -150,9 +150,9 @@ class RedisAdapter extends adapters_1.Adapter {
|
|
|
150
150
|
return result.filter(Boolean);
|
|
151
151
|
}
|
|
152
152
|
}
|
|
153
|
-
tslib_1.__decorate([
|
|
154
|
-
di_1.Inject(ioredis_1.default),
|
|
155
|
-
tslib_1.__metadata("design:type", Object)
|
|
153
|
+
(0, tslib_1.__decorate)([
|
|
154
|
+
(0, di_1.Inject)(ioredis_1.default),
|
|
155
|
+
(0, tslib_1.__metadata)("design:type", Object)
|
|
156
156
|
], RedisAdapter.prototype, "db", void 0);
|
|
157
157
|
exports.RedisAdapter = RedisAdapter;
|
|
158
158
|
//# sourceMappingURL=RedisAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisAdapter.js","sourceRoot":"","sources":["../../../src/adapters/RedisAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import {Adapter, AdapterModel} from \"@tsed/adapters\";\nimport {Inject} from \"@tsed/di\";\nimport IoRedis, {Redis} from \"ioredis\";\nimport {v4 as uuid} from \"uuid\";\nimport \"../services/RedisFactory\";\n\nexport class RedisAdapter<T extends AdapterModel> extends Adapter<T> {\n @Inject(IoRedis)\n readonly db: Redis;\n\n key(id: string) {\n return `${this.collectionName}:${id}`;\n }\n\n public async create(payload: Partial<T>, expiresAt?: Date): Promise<T> {\n payload._id = uuid();\n\n return this.insert(payload, expiresAt);\n }\n\n public async upsert(id: string, payload: T, expiresAt?: Date): Promise<T> {\n let item = await this.findById(id);\n\n if (!item) {\n payload = {...payload, _id: id};\n\n return this.insert(payload, expiresAt);\n }\n\n return (await this.update(id, payload, expiresAt)) as T;\n }\n\n public async update(id: string, payload: T, expiresAt?: Date): Promise<T | undefined> {\n return this.updateOne({_id: id}, payload, expiresAt);\n }\n\n public async updateOne(predicate: Partial<T & any>, payload: T, expiresAt?: Date): Promise<T | undefined> {\n const item = await this.findOne(predicate);\n\n if (!item) {\n return undefined;\n }\n\n return this.insert(\n {\n ...this.updateInstance(item, payload),\n _id: item._id\n },\n expiresAt\n );\n }\n\n async findOne(predicate: Partial<T & any>): Promise<T | undefined> {\n const {_id, ...props} = predicate;\n\n if (_id) {\n return this.findById(_id);\n }\n\n const keys = Object.keys(props);\n let foundKeys = await this.findKeys(props);\n\n if (foundKeys.length < keys.length) {\n return undefined;\n }\n\n const getId = (key: string) => key.split(\":\")[2];\n\n const id = getId(foundKeys[0]);\n\n foundKeys = foundKeys.filter((key) => id === getId(key));\n\n return keys.length === foundKeys.length ? this.findById(id) : undefined;\n }\n\n async findById(_id: string): Promise<T | undefined> {\n const item = await this.db.get(this.key(_id));\n\n if (!item) {\n return undefined;\n }\n\n return this.deserialize(JSON.parse(item));\n }\n\n public async findAll(predicate: Partial<T & any> = {}): Promise<T[]> {\n const {_id, ...props} = predicate;\n\n if (_id) {\n const item = await this.findById(_id);\n return item ? [item] : [];\n }\n\n const keys = Object.keys(props);\n\n if (keys.length === 0) {\n return this.getAll();\n }\n\n return this.findAllBy(props);\n }\n\n public async deleteOne(predicate: Partial<T & any>): Promise<T | undefined> {\n const item = await this.findOne(predicate);\n\n if (item) {\n await Promise.all([this.db.del(this.key(item._id)), this.cleanIndexes(item._id)]);\n\n return this.deserialize(item);\n }\n }\n\n public async deleteById(_id: string): Promise<T | undefined> {\n return this.deleteOne({_id} as any);\n }\n\n public async deleteMany(predicate: Partial<T>): Promise<T[]> {\n const items = await this.findAll(predicate);\n\n const promises = items.map(async (item) => {\n await Promise.all([this.db.del(this.key(item._id)), this.cleanIndexes(item._id)]);\n\n return this.deserialize(item);\n });\n\n return Promise.all(promises);\n }\n\n protected async findKeys(props: any): Promise<string[]> {\n const keys: any[] = Object.keys(props);\n\n const promises = this.indexes\n .filter(({propertyKey}) => keys.includes(propertyKey))\n .map(({propertyKey}) => {\n const value = props[propertyKey];\n const patterns = this.getIndexedKey(\"*\", propertyKey, value);\n\n return this.db.keys(patterns);\n });\n\n const result = await Promise.all(promises);\n\n return result.reduce((keys: string[], input: string[]) => keys.concat(input), []).filter(Boolean);\n }\n\n protected async insert(payload: Partial<T>, expiresAt?: Date) {\n const id = (payload._id = payload._id || uuid());\n\n const expiresIn = expiresAt ? Date.now() - expiresAt.getTime() : null;\n\n await this.validate(payload as T);\n\n const multi = this.db.multi();\n const key = this.key(id);\n\n await multi.set(key, JSON.stringify(this.serialize(payload)));\n\n if (expiresIn) {\n multi.expire(key, expiresIn);\n }\n\n this.indexes.forEach(({propertyKey}) => {\n const value = payload[propertyKey];\n const indexedKey = this.getIndexedKey(id, propertyKey, value);\n\n multi.set(indexedKey, id);\n expiresIn && multi.expire(indexedKey, expiresIn);\n });\n\n await multi.exec();\n\n return this.deserialize(payload);\n }\n\n protected async cleanIndexes(id: string) {\n const key = [\"$idx\", this.key(id), \"*\"].join(\":\");\n\n const keys = await this.db.keys(key);\n\n return this.db.del(...keys);\n }\n\n protected getIndexedKey(id: string, propertyKey: string, value: any): string {\n const key = this.key(id);\n return [\"$idx\", key, `${propertyKey}(${value})`].map(String).join(\":\");\n }\n\n protected async getAll(): Promise<T[]> {\n const keys = await this.db.keys(`${this.collectionName}:*`);\n const items = await Promise.all(keys.map((key) => this.findById(key.split(\":\")[1])));\n\n return items.filter(Boolean) as T[];\n }\n\n protected async findAllBy(props: Partial<T & any>): Promise<T[]> {\n const keys = Object.keys(props);\n let foundKeys = await this.findKeys(props);\n\n if (foundKeys.length < keys.length) {\n return [];\n }\n\n const getId = (key: string) => key.split(\":\")[2];\n\n const map = foundKeys.reduce((map: Map<string, number>, key) => {\n const id = getId(key);\n const value = map.get(id) || 0;\n\n return map.set(id, value + 1);\n }, new Map());\n\n const promises = [...map.entries()].filter(([, num]) => num === keys.length).map(([id]) => this.findById(id));\n\n const result = await Promise.all(promises);\n\n return result.filter(Boolean) as T[];\n }\n}\n"]}
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisAdaptersSettings.js","sourceRoot":"","sources":["../../../src/domain/RedisAdaptersSettings.ts"],"names":[],"mappings":"","sourcesContent":["import {AdaptersSettings} from \"@tsed/adapters\";\nimport {RedisOptions} from \"ioredis\";\n\ndeclare global {\n namespace TsED {\n interface AdaptersOptions extends AdaptersSettings {\n redis: RedisOptions & {\n indexes?: {[propertyKey: string]: Record<string, any>};\n };\n }\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
|
-
tslib_1.__exportStar(require("./adapters/RedisAdapter"), exports);
|
|
4
|
+
(0, tslib_1.__exportStar)(require("./adapters/RedisAdapter"), exports);
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,uEAAwC","sourcesContent":["export * from \"./adapters/RedisAdapter\";\n"]}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
const di_1 = require("@tsed/di");
|
|
5
|
-
const ioredis_1 = tslib_1.__importDefault(require("ioredis"));
|
|
6
|
-
di_1.registerProvider({
|
|
5
|
+
const ioredis_1 = (0, tslib_1.__importDefault)(require("ioredis"));
|
|
6
|
+
(0, di_1.registerProvider)({
|
|
7
7
|
provide: ioredis_1.default,
|
|
8
8
|
deps: [di_1.Configuration],
|
|
9
9
|
useFactory(configuration) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisFactory.js","sourceRoot":"","sources":["../../../src/services/RedisFactory.ts"],"names":[],"mappings":";;;AAAA,iCAAyD;AACzD,mEAA8C;AAE9C,IAAA,qBAAgB,EAAC;IACf,OAAO,EAAE,iBAAO;IAChB,IAAI,EAAE,CAAC,kBAAa,CAAC;IACrB,UAAU,CAAC,aAA4B;QACrC,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAe,gBAAgB,CAAC,CAAC;QAElE,uBAAuB;QACvB,IAAI,OAAO,EAAE;YACX,OAAO,IAAI,iBAAO,CAAC,OAAO,CAAC,CAAC;SAC7B;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC,CAAC","sourcesContent":["import {Configuration, registerProvider} from \"@tsed/di\";\nimport IoRedis, {RedisOptions} from \"ioredis\";\n\nregisterProvider({\n provide: IoRedis,\n deps: [Configuration],\n useFactory(configuration: Configuration) {\n const options = configuration.get<RedisOptions>(\"adapters.redis\");\n\n // istanbul ignore next\n if (options) {\n return new IoRedis(options);\n }\n\n return {};\n }\n});\n"]}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { Adapter } from "@tsed/adapters";
|
|
3
|
+
import { Inject } from "@tsed/di";
|
|
4
|
+
import IoRedis from "ioredis";
|
|
5
|
+
import { v4 as uuid } from "uuid";
|
|
6
|
+
import "../services/RedisFactory";
|
|
7
|
+
export class RedisAdapter extends Adapter {
|
|
8
|
+
key(id) {
|
|
9
|
+
return `${this.collectionName}:${id}`;
|
|
10
|
+
}
|
|
11
|
+
async create(payload, expiresAt) {
|
|
12
|
+
payload._id = uuid();
|
|
13
|
+
return this.insert(payload, expiresAt);
|
|
14
|
+
}
|
|
15
|
+
async upsert(id, payload, expiresAt) {
|
|
16
|
+
let item = await this.findById(id);
|
|
17
|
+
if (!item) {
|
|
18
|
+
payload = { ...payload, _id: id };
|
|
19
|
+
return this.insert(payload, expiresAt);
|
|
20
|
+
}
|
|
21
|
+
return (await this.update(id, payload, expiresAt));
|
|
22
|
+
}
|
|
23
|
+
async update(id, payload, expiresAt) {
|
|
24
|
+
return this.updateOne({ _id: id }, payload, expiresAt);
|
|
25
|
+
}
|
|
26
|
+
async updateOne(predicate, payload, expiresAt) {
|
|
27
|
+
const item = await this.findOne(predicate);
|
|
28
|
+
if (!item) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
return this.insert({
|
|
32
|
+
...this.updateInstance(item, payload),
|
|
33
|
+
_id: item._id
|
|
34
|
+
}, expiresAt);
|
|
35
|
+
}
|
|
36
|
+
async findOne(predicate) {
|
|
37
|
+
const { _id, ...props } = predicate;
|
|
38
|
+
if (_id) {
|
|
39
|
+
return this.findById(_id);
|
|
40
|
+
}
|
|
41
|
+
const keys = Object.keys(props);
|
|
42
|
+
let foundKeys = await this.findKeys(props);
|
|
43
|
+
if (foundKeys.length < keys.length) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const getId = (key) => key.split(":")[2];
|
|
47
|
+
const id = getId(foundKeys[0]);
|
|
48
|
+
foundKeys = foundKeys.filter((key) => id === getId(key));
|
|
49
|
+
return keys.length === foundKeys.length ? this.findById(id) : undefined;
|
|
50
|
+
}
|
|
51
|
+
async findById(_id) {
|
|
52
|
+
const item = await this.db.get(this.key(_id));
|
|
53
|
+
if (!item) {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
return this.deserialize(JSON.parse(item));
|
|
57
|
+
}
|
|
58
|
+
async findAll(predicate = {}) {
|
|
59
|
+
const { _id, ...props } = predicate;
|
|
60
|
+
if (_id) {
|
|
61
|
+
const item = await this.findById(_id);
|
|
62
|
+
return item ? [item] : [];
|
|
63
|
+
}
|
|
64
|
+
const keys = Object.keys(props);
|
|
65
|
+
if (keys.length === 0) {
|
|
66
|
+
return this.getAll();
|
|
67
|
+
}
|
|
68
|
+
return this.findAllBy(props);
|
|
69
|
+
}
|
|
70
|
+
async deleteOne(predicate) {
|
|
71
|
+
const item = await this.findOne(predicate);
|
|
72
|
+
if (item) {
|
|
73
|
+
await Promise.all([this.db.del(this.key(item._id)), this.cleanIndexes(item._id)]);
|
|
74
|
+
return this.deserialize(item);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async deleteById(_id) {
|
|
78
|
+
return this.deleteOne({ _id });
|
|
79
|
+
}
|
|
80
|
+
async deleteMany(predicate) {
|
|
81
|
+
const items = await this.findAll(predicate);
|
|
82
|
+
const promises = items.map(async (item) => {
|
|
83
|
+
await Promise.all([this.db.del(this.key(item._id)), this.cleanIndexes(item._id)]);
|
|
84
|
+
return this.deserialize(item);
|
|
85
|
+
});
|
|
86
|
+
return Promise.all(promises);
|
|
87
|
+
}
|
|
88
|
+
async findKeys(props) {
|
|
89
|
+
const keys = Object.keys(props);
|
|
90
|
+
const promises = this.indexes
|
|
91
|
+
.filter(({ propertyKey }) => keys.includes(propertyKey))
|
|
92
|
+
.map(({ propertyKey }) => {
|
|
93
|
+
const value = props[propertyKey];
|
|
94
|
+
const patterns = this.getIndexedKey("*", propertyKey, value);
|
|
95
|
+
return this.db.keys(patterns);
|
|
96
|
+
});
|
|
97
|
+
const result = await Promise.all(promises);
|
|
98
|
+
return result.reduce((keys, input) => keys.concat(input), []).filter(Boolean);
|
|
99
|
+
}
|
|
100
|
+
async insert(payload, expiresAt) {
|
|
101
|
+
const id = (payload._id = payload._id || uuid());
|
|
102
|
+
const expiresIn = expiresAt ? Date.now() - expiresAt.getTime() : null;
|
|
103
|
+
await this.validate(payload);
|
|
104
|
+
const multi = this.db.multi();
|
|
105
|
+
const key = this.key(id);
|
|
106
|
+
await multi.set(key, JSON.stringify(this.serialize(payload)));
|
|
107
|
+
if (expiresIn) {
|
|
108
|
+
multi.expire(key, expiresIn);
|
|
109
|
+
}
|
|
110
|
+
this.indexes.forEach(({ propertyKey }) => {
|
|
111
|
+
const value = payload[propertyKey];
|
|
112
|
+
const indexedKey = this.getIndexedKey(id, propertyKey, value);
|
|
113
|
+
multi.set(indexedKey, id);
|
|
114
|
+
expiresIn && multi.expire(indexedKey, expiresIn);
|
|
115
|
+
});
|
|
116
|
+
await multi.exec();
|
|
117
|
+
return this.deserialize(payload);
|
|
118
|
+
}
|
|
119
|
+
async cleanIndexes(id) {
|
|
120
|
+
const key = ["$idx", this.key(id), "*"].join(":");
|
|
121
|
+
const keys = await this.db.keys(key);
|
|
122
|
+
return this.db.del(...keys);
|
|
123
|
+
}
|
|
124
|
+
getIndexedKey(id, propertyKey, value) {
|
|
125
|
+
const key = this.key(id);
|
|
126
|
+
return ["$idx", key, `${propertyKey}(${value})`].map(String).join(":");
|
|
127
|
+
}
|
|
128
|
+
async getAll() {
|
|
129
|
+
const keys = await this.db.keys(`${this.collectionName}:*`);
|
|
130
|
+
const items = await Promise.all(keys.map((key) => this.findById(key.split(":")[1])));
|
|
131
|
+
return items.filter(Boolean);
|
|
132
|
+
}
|
|
133
|
+
async findAllBy(props) {
|
|
134
|
+
const keys = Object.keys(props);
|
|
135
|
+
let foundKeys = await this.findKeys(props);
|
|
136
|
+
if (foundKeys.length < keys.length) {
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
const getId = (key) => key.split(":")[2];
|
|
140
|
+
const map = foundKeys.reduce((map, key) => {
|
|
141
|
+
const id = getId(key);
|
|
142
|
+
const value = map.get(id) || 0;
|
|
143
|
+
return map.set(id, value + 1);
|
|
144
|
+
}, new Map());
|
|
145
|
+
const promises = [...map.entries()].filter(([, num]) => num === keys.length).map(([id]) => this.findById(id));
|
|
146
|
+
const result = await Promise.all(promises);
|
|
147
|
+
return result.filter(Boolean);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
__decorate([
|
|
151
|
+
Inject(IoRedis),
|
|
152
|
+
__metadata("design:type", Object)
|
|
153
|
+
], RedisAdapter.prototype, "db", void 0);
|
|
154
|
+
//# sourceMappingURL=RedisAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisAdapter.js","sourceRoot":"","sources":["../../../src/adapters/RedisAdapter.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAe,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AAChC,OAAO,OAAgB,MAAM,SAAS,CAAC;AACvC,OAAO,EAAC,EAAE,IAAI,IAAI,EAAC,MAAM,MAAM,CAAC;AAChC,OAAO,0BAA0B,CAAC;AAElC,MAAM,OAAO,YAAqC,SAAQ,OAAU;IAIlE,GAAG,CAAC,EAAU;QACZ,OAAO,GAAG,IAAI,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;IACxC,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,OAAmB,EAAE,SAAgB;QACvD,OAAO,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;QAErB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,OAAU,EAAE,SAAgB;QAC1D,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEnC,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,GAAG,EAAC,GAAG,OAAO,EAAE,GAAG,EAAE,EAAE,EAAC,CAAC;YAEhC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;SACxC;QAED,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAM,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,OAAU,EAAE,SAAgB;QAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,EAAC,GAAG,EAAE,EAAE,EAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,SAA2B,EAAE,OAAU,EAAE,SAAgB;QAC9E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE3C,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,SAAS,CAAC;SAClB;QAED,OAAO,IAAI,CAAC,MAAM,CAChB;YACE,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC;YACrC,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,EACD,SAAS,CACV,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAA2B;QACvC,MAAM,EAAC,GAAG,EAAE,GAAG,KAAK,EAAC,GAAG,SAAS,CAAC;QAElC,IAAI,GAAG,EAAE;YACP,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;SAC3B;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE3C,IAAI,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAClC,OAAO,SAAS,CAAC;SAClB;QAED,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjD,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/B,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzD,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAE9C,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,SAAS,CAAC;SAClB;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,YAA8B,EAAE;QACnD,MAAM,EAAC,GAAG,EAAE,GAAG,KAAK,EAAC,GAAG,SAAS,CAAC;QAElC,IAAI,GAAG,EAAE;YACP,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3B;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEhC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;SACtB;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,SAA2B;QAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE3C,IAAI,IAAI,EAAE;YACR,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAElF,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;SAC/B;IACH,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,GAAW;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAC,GAAG,EAAQ,CAAC,CAAC;IACtC,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,SAAqB;QAC3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE5C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACxC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAElF,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAES,KAAK,CAAC,QAAQ,CAAC,KAAU;QACjC,MAAM,IAAI,GAAU,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEvC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO;aAC1B,MAAM,CAAC,CAAC,EAAC,WAAW,EAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;aACrD,GAAG,CAAC,CAAC,EAAC,WAAW,EAAC,EAAE,EAAE;YACrB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YAE7D,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEL,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE3C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAc,EAAE,KAAe,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpG,CAAC;IAES,KAAK,CAAC,MAAM,CAAC,OAAmB,EAAE,SAAgB;QAC1D,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;QAEjD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAEtE,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAY,CAAC,CAAC;QAElC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEzB,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE9D,IAAI,SAAS,EAAE;YACb,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;SAC9B;QAED,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAC,WAAW,EAAC,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YAE9D,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC1B,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QAEnB,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAES,KAAK,CAAC,YAAY,CAAC,EAAU;QACrC,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAElD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAErC,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9B,CAAC;IAES,aAAa,CAAC,EAAU,EAAE,WAAmB,EAAE,KAAU;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzB,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,WAAW,IAAI,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzE,CAAC;IAES,KAAK,CAAC,MAAM;QACpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAErF,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAQ,CAAC;IACtC,CAAC;IAES,KAAK,CAAC,SAAS,CAAC,KAAuB;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE3C,IAAI,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAClC,OAAO,EAAE,CAAC;SACX;QAED,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjD,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAwB,EAAE,GAAG,EAAE,EAAE;YAC7D,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YAE/B,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAChC,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAEd,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QAE9G,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE3C,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAQ,CAAC;IACvC,CAAC;CACF;AAjNC;IADC,MAAM,CAAC,OAAO,CAAC;;wCACG","sourcesContent":["import {Adapter, AdapterModel} from \"@tsed/adapters\";\nimport {Inject} from \"@tsed/di\";\nimport IoRedis, {Redis} from \"ioredis\";\nimport {v4 as uuid} from \"uuid\";\nimport \"../services/RedisFactory\";\n\nexport class RedisAdapter<T extends AdapterModel> extends Adapter<T> {\n @Inject(IoRedis)\n readonly db: Redis;\n\n key(id: string) {\n return `${this.collectionName}:${id}`;\n }\n\n public async create(payload: Partial<T>, expiresAt?: Date): Promise<T> {\n payload._id = uuid();\n\n return this.insert(payload, expiresAt);\n }\n\n public async upsert(id: string, payload: T, expiresAt?: Date): Promise<T> {\n let item = await this.findById(id);\n\n if (!item) {\n payload = {...payload, _id: id};\n\n return this.insert(payload, expiresAt);\n }\n\n return (await this.update(id, payload, expiresAt)) as T;\n }\n\n public async update(id: string, payload: T, expiresAt?: Date): Promise<T | undefined> {\n return this.updateOne({_id: id}, payload, expiresAt);\n }\n\n public async updateOne(predicate: Partial<T & any>, payload: T, expiresAt?: Date): Promise<T | undefined> {\n const item = await this.findOne(predicate);\n\n if (!item) {\n return undefined;\n }\n\n return this.insert(\n {\n ...this.updateInstance(item, payload),\n _id: item._id\n },\n expiresAt\n );\n }\n\n async findOne(predicate: Partial<T & any>): Promise<T | undefined> {\n const {_id, ...props} = predicate;\n\n if (_id) {\n return this.findById(_id);\n }\n\n const keys = Object.keys(props);\n let foundKeys = await this.findKeys(props);\n\n if (foundKeys.length < keys.length) {\n return undefined;\n }\n\n const getId = (key: string) => key.split(\":\")[2];\n\n const id = getId(foundKeys[0]);\n\n foundKeys = foundKeys.filter((key) => id === getId(key));\n\n return keys.length === foundKeys.length ? this.findById(id) : undefined;\n }\n\n async findById(_id: string): Promise<T | undefined> {\n const item = await this.db.get(this.key(_id));\n\n if (!item) {\n return undefined;\n }\n\n return this.deserialize(JSON.parse(item));\n }\n\n public async findAll(predicate: Partial<T & any> = {}): Promise<T[]> {\n const {_id, ...props} = predicate;\n\n if (_id) {\n const item = await this.findById(_id);\n return item ? [item] : [];\n }\n\n const keys = Object.keys(props);\n\n if (keys.length === 0) {\n return this.getAll();\n }\n\n return this.findAllBy(props);\n }\n\n public async deleteOne(predicate: Partial<T & any>): Promise<T | undefined> {\n const item = await this.findOne(predicate);\n\n if (item) {\n await Promise.all([this.db.del(this.key(item._id)), this.cleanIndexes(item._id)]);\n\n return this.deserialize(item);\n }\n }\n\n public async deleteById(_id: string): Promise<T | undefined> {\n return this.deleteOne({_id} as any);\n }\n\n public async deleteMany(predicate: Partial<T>): Promise<T[]> {\n const items = await this.findAll(predicate);\n\n const promises = items.map(async (item) => {\n await Promise.all([this.db.del(this.key(item._id)), this.cleanIndexes(item._id)]);\n\n return this.deserialize(item);\n });\n\n return Promise.all(promises);\n }\n\n protected async findKeys(props: any): Promise<string[]> {\n const keys: any[] = Object.keys(props);\n\n const promises = this.indexes\n .filter(({propertyKey}) => keys.includes(propertyKey))\n .map(({propertyKey}) => {\n const value = props[propertyKey];\n const patterns = this.getIndexedKey(\"*\", propertyKey, value);\n\n return this.db.keys(patterns);\n });\n\n const result = await Promise.all(promises);\n\n return result.reduce((keys: string[], input: string[]) => keys.concat(input), []).filter(Boolean);\n }\n\n protected async insert(payload: Partial<T>, expiresAt?: Date) {\n const id = (payload._id = payload._id || uuid());\n\n const expiresIn = expiresAt ? Date.now() - expiresAt.getTime() : null;\n\n await this.validate(payload as T);\n\n const multi = this.db.multi();\n const key = this.key(id);\n\n await multi.set(key, JSON.stringify(this.serialize(payload)));\n\n if (expiresIn) {\n multi.expire(key, expiresIn);\n }\n\n this.indexes.forEach(({propertyKey}) => {\n const value = payload[propertyKey];\n const indexedKey = this.getIndexedKey(id, propertyKey, value);\n\n multi.set(indexedKey, id);\n expiresIn && multi.expire(indexedKey, expiresIn);\n });\n\n await multi.exec();\n\n return this.deserialize(payload);\n }\n\n protected async cleanIndexes(id: string) {\n const key = [\"$idx\", this.key(id), \"*\"].join(\":\");\n\n const keys = await this.db.keys(key);\n\n return this.db.del(...keys);\n }\n\n protected getIndexedKey(id: string, propertyKey: string, value: any): string {\n const key = this.key(id);\n return [\"$idx\", key, `${propertyKey}(${value})`].map(String).join(\":\");\n }\n\n protected async getAll(): Promise<T[]> {\n const keys = await this.db.keys(`${this.collectionName}:*`);\n const items = await Promise.all(keys.map((key) => this.findById(key.split(\":\")[1])));\n\n return items.filter(Boolean) as T[];\n }\n\n protected async findAllBy(props: Partial<T & any>): Promise<T[]> {\n const keys = Object.keys(props);\n let foundKeys = await this.findKeys(props);\n\n if (foundKeys.length < keys.length) {\n return [];\n }\n\n const getId = (key: string) => key.split(\":\")[2];\n\n const map = foundKeys.reduce((map: Map<string, number>, key) => {\n const id = getId(key);\n const value = map.get(id) || 0;\n\n return map.set(id, value + 1);\n }, new Map());\n\n const promises = [...map.entries()].filter(([, num]) => num === keys.length).map(([id]) => this.findById(id));\n\n const result = await Promise.all(promises);\n\n return result.filter(Boolean) as T[];\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisAdaptersSettings.js","sourceRoot":"","sources":["../../../src/domain/RedisAdaptersSettings.ts"],"names":[],"mappings":"","sourcesContent":["import {AdaptersSettings} from \"@tsed/adapters\";\nimport {RedisOptions} from \"ioredis\";\n\ndeclare global {\n namespace TsED {\n interface AdaptersOptions extends AdaptersSettings {\n redis: RedisOptions & {\n indexes?: {[propertyKey: string]: Record<string, any>};\n };\n }\n }\n}\n"]}
|
package/lib/esm/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC","sourcesContent":["export * from \"./adapters/RedisAdapter\";\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Configuration, registerProvider } from "@tsed/di";
|
|
2
|
+
import IoRedis from "ioredis";
|
|
3
|
+
registerProvider({
|
|
4
|
+
provide: IoRedis,
|
|
5
|
+
deps: [Configuration],
|
|
6
|
+
useFactory(configuration) {
|
|
7
|
+
const options = configuration.get("adapters.redis");
|
|
8
|
+
// istanbul ignore next
|
|
9
|
+
if (options) {
|
|
10
|
+
return new IoRedis(options);
|
|
11
|
+
}
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=RedisFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisFactory.js","sourceRoot":"","sources":["../../../src/services/RedisFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAE,gBAAgB,EAAC,MAAM,UAAU,CAAC;AACzD,OAAO,OAAuB,MAAM,SAAS,CAAC;AAE9C,gBAAgB,CAAC;IACf,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,CAAC,aAAa,CAAC;IACrB,UAAU,CAAC,aAA4B;QACrC,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAe,gBAAgB,CAAC,CAAC;QAElE,uBAAuB;QACvB,IAAI,OAAO,EAAE;YACX,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;SAC7B;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC,CAAC","sourcesContent":["import {Configuration, registerProvider} from \"@tsed/di\";\nimport IoRedis, {RedisOptions} from \"ioredis\";\n\nregisterProvider({\n provide: IoRedis,\n deps: [Configuration],\n useFactory(configuration: Configuration) {\n const options = configuration.get<RedisOptions>(\"adapters.redis\");\n\n // istanbul ignore next\n if (options) {\n return new IoRedis(options);\n }\n\n return {};\n }\n});\n"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,30 +1,39 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tsed/adapters-redis",
|
|
3
|
-
"version": "7.0.0-
|
|
3
|
+
"version": "7.0.0-beta.3",
|
|
4
4
|
"description": "Redis adapter for Ts.ED",
|
|
5
5
|
"private": false,
|
|
6
6
|
"source": "./src/index.ts",
|
|
7
|
-
"main": "./lib/index.js",
|
|
8
|
-
"typings": "./lib/index.d.ts",
|
|
7
|
+
"main": "./lib/cjs/index.js",
|
|
8
|
+
"typings": "./lib/types/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
"types": "./lib/types/index.d.ts",
|
|
11
|
+
"import": "./lib/esm/index.js",
|
|
12
|
+
"require": "./lib/cjs/index.js",
|
|
13
|
+
"default": "./lib/esm/index.js"
|
|
14
|
+
},
|
|
9
15
|
"scripts": {
|
|
10
|
-
"build": "
|
|
11
|
-
"
|
|
16
|
+
"build": "yarn run build:esm && yarn run build:cjs",
|
|
17
|
+
"build:cjs": "tsc --build tsconfig.compile.json",
|
|
18
|
+
"build:esm": "tsc --build tsconfig.compile.esm.json",
|
|
19
|
+
"test": "cross-env NODE_ENV=test yarn jest"
|
|
12
20
|
},
|
|
13
21
|
"dependencies": {
|
|
14
|
-
"@tsed/adapters": "7.0.0-
|
|
22
|
+
"@tsed/adapters": "7.0.0-beta.3",
|
|
15
23
|
"tslib": "2.2.0"
|
|
16
24
|
},
|
|
17
25
|
"devDependencies": {
|
|
18
|
-
"@tsed/core": "7.0.0-
|
|
26
|
+
"@tsed/core": "7.0.0-beta.3",
|
|
19
27
|
"@types/ioredis": "4.17.11",
|
|
28
|
+
"@types/ioredis-mock": "^5.6.0",
|
|
20
29
|
"ioredis": "4.19.4",
|
|
21
30
|
"ioredis-mock": "5.2.0"
|
|
22
31
|
},
|
|
23
32
|
"peerDependencies": {
|
|
24
|
-
"@tsed/adapters": "^7.0.0-
|
|
25
|
-
"@tsed/common": "^7.0.0-
|
|
26
|
-
"@tsed/core": "^7.0.0-
|
|
27
|
-
"@tsed/di": "^7.0.0-
|
|
33
|
+
"@tsed/adapters": "^7.0.0-beta.3",
|
|
34
|
+
"@tsed/common": "^7.0.0-beta.3",
|
|
35
|
+
"@tsed/core": "^7.0.0-beta.3",
|
|
36
|
+
"@tsed/di": "^7.0.0-beta.3",
|
|
28
37
|
"ioredis": "^4.19.4",
|
|
29
38
|
"ioredis-mock": "^5.2.0",
|
|
30
39
|
"uuid": "8.3.2"
|
|
@@ -33,7 +42,7 @@
|
|
|
33
42
|
"bugs": {
|
|
34
43
|
"url": "https://github.com/tsedio/tsed/issues"
|
|
35
44
|
},
|
|
36
|
-
"homepage": "https://github.com/tsedio/tsed/tree/
|
|
45
|
+
"homepage": "https://github.com/tsedio/tsed/tree/beta/packages/orm/adapters-redis",
|
|
37
46
|
"author": "Romain Lenzotti",
|
|
38
47
|
"license": "MIT"
|
|
39
48
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.compile.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"baseUrl": ".",
|
|
5
|
+
"module": "ES2020",
|
|
6
|
+
"rootDir": "src",
|
|
7
|
+
"outDir": "./lib/esm",
|
|
8
|
+
"declaration": true,
|
|
9
|
+
"declarationDir": "./lib/types"
|
|
10
|
+
},
|
|
11
|
+
"exclude": [
|
|
12
|
+
"node_modules",
|
|
13
|
+
"test",
|
|
14
|
+
"lib",
|
|
15
|
+
"benchmark",
|
|
16
|
+
"coverage",
|
|
17
|
+
"spec",
|
|
18
|
+
"**/*.benchmark.ts",
|
|
19
|
+
"**/*.spec.ts",
|
|
20
|
+
"keys",
|
|
21
|
+
"jest.config.js"
|
|
22
|
+
]
|
|
23
|
+
}
|
package/.mocharc.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RedisAdapter.js","sourceRoot":"","sources":["../../src/adapters/RedisAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import {Adapter, AdapterModel} from \"@tsed/adapters\";\nimport {Inject} from \"@tsed/di\";\nimport IoRedis, {Redis} from \"ioredis\";\nimport {v4 as uuid} from \"uuid\";\nimport \"../services/RedisFactory\";\n\nexport class RedisAdapter<T extends AdapterModel> extends Adapter<T> {\n @Inject(IoRedis)\n readonly db: Redis;\n\n key(id: string) {\n return `${this.collectionName}:${id}`;\n }\n\n public async create(payload: Partial<T>, expiresAt?: Date): Promise<T> {\n payload._id = uuid();\n\n return this.insert(payload, expiresAt);\n }\n\n public async upsert(id: string, payload: T, expiresAt?: Date): Promise<T> {\n let item = await this.findById(id);\n\n if (!item) {\n payload = {...payload, _id: id};\n\n return this.insert(payload, expiresAt);\n }\n\n return (await this.update(id, payload, expiresAt)) as T;\n }\n\n public async update(id: string, payload: T, expiresAt?: Date): Promise<T | undefined> {\n return this.updateOne({_id: id}, payload, expiresAt);\n }\n\n public async updateOne(predicate: Partial<T & any>, payload: T, expiresAt?: Date): Promise<T | undefined> {\n const item = await this.findOne(predicate);\n\n if (!item) {\n return undefined;\n }\n\n return this.insert(\n {\n ...this.updateInstance(item, payload),\n _id: item._id\n },\n expiresAt\n );\n }\n\n async findOne(predicate: Partial<T & any>): Promise<T | undefined> {\n const {_id, ...props} = predicate;\n\n if (_id) {\n return this.findById(_id);\n }\n\n const keys = Object.keys(props);\n let foundKeys = await this.findKeys(props);\n\n if (foundKeys.length < keys.length) {\n return undefined;\n }\n\n const getId = (key: string) => key.split(\":\")[2];\n\n const id = getId(foundKeys[0]);\n\n foundKeys = foundKeys.filter((key) => id === getId(key));\n\n return keys.length === foundKeys.length ? this.findById(id) : undefined;\n }\n\n async findById(_id: string): Promise<T | undefined> {\n const item = await this.db.get(this.key(_id));\n\n if (!item) {\n return undefined;\n }\n\n return this.deserialize(JSON.parse(item));\n }\n\n public async findAll(predicate: Partial<T & any> = {}): Promise<T[]> {\n const {_id, ...props} = predicate;\n\n if (_id) {\n const item = await this.findById(_id);\n return item ? [item] : [];\n }\n\n const keys = Object.keys(props);\n\n if (keys.length === 0) {\n return this.getAll();\n }\n\n return this.findAllBy(props);\n }\n\n public async deleteOne(predicate: Partial<T & any>): Promise<T | undefined> {\n const item = await this.findOne(predicate);\n\n if (item) {\n await Promise.all([this.db.del(this.key(item._id)), this.cleanIndexes(item._id)]);\n\n return this.deserialize(item);\n }\n }\n\n public async deleteById(_id: string): Promise<T | undefined> {\n return this.deleteOne({_id} as any);\n }\n\n public async deleteMany(predicate: Partial<T>): Promise<T[]> {\n const items = await this.findAll(predicate);\n\n const promises = items.map(async (item) => {\n await Promise.all([this.db.del(this.key(item._id)), this.cleanIndexes(item._id)]);\n\n return this.deserialize(item);\n });\n\n return Promise.all(promises);\n }\n\n protected async findKeys(props: any): Promise<string[]> {\n const keys: any[] = Object.keys(props);\n\n const promises = this.indexes\n .filter(({propertyKey}) => keys.includes(propertyKey))\n .map(({propertyKey}) => {\n const value = props[propertyKey];\n const patterns = this.getIndexedKey(\"*\", propertyKey, value);\n\n return this.db.keys(patterns);\n });\n\n const result = await Promise.all(promises);\n\n return result.reduce((keys: string[], input: string[]) => keys.concat(input), []).filter(Boolean);\n }\n\n protected async insert(payload: Partial<T>, expiresAt?: Date) {\n const id = (payload._id = payload._id || uuid());\n\n const expiresIn = expiresAt ? Date.now() - expiresAt.getTime() : null;\n\n await this.validate(payload as T);\n\n const multi = this.db.multi();\n const key = this.key(id);\n\n await multi.set(key, JSON.stringify(this.serialize(payload)));\n\n if (expiresIn) {\n multi.expire(key, expiresIn);\n }\n\n this.indexes.forEach(({propertyKey}) => {\n const value = payload[propertyKey];\n const indexedKey = this.getIndexedKey(id, propertyKey, value);\n\n multi.set(indexedKey, id);\n expiresIn && multi.expire(indexedKey, expiresIn);\n });\n\n await multi.exec();\n\n return this.deserialize(payload);\n }\n\n protected async cleanIndexes(id: string) {\n const key = [\"$idx\", this.key(id), \"*\"].join(\":\");\n\n const keys = await this.db.keys(key);\n\n return this.db.del(...keys);\n }\n\n protected getIndexedKey(id: string, propertyKey: string, value: any): string {\n const key = this.key(id);\n return [\"$idx\", key, `${propertyKey}(${value})`].map(String).join(\":\");\n }\n\n protected async getAll(): Promise<T[]> {\n const keys = await this.db.keys(`${this.collectionName}:*`);\n const items = await Promise.all(keys.map((key) => this.findById(key.split(\":\")[1])));\n\n return items.filter(Boolean) as T[];\n }\n\n protected async findAllBy(props: Partial<T & any>): Promise<T[]> {\n const keys = Object.keys(props);\n let foundKeys = await this.findKeys(props);\n\n if (foundKeys.length < keys.length) {\n return [];\n }\n\n const getId = (key: string) => key.split(\":\")[2];\n\n const map = foundKeys.reduce((map: Map<string, number>, key) => {\n const id = getId(key);\n const value = map.get(id) || 0;\n\n return map.set(id, value + 1);\n }, new Map());\n\n const promises = [...map.entries()].filter(([, num]) => num === keys.length).map(([id]) => this.findById(id));\n\n const result = await Promise.all(promises);\n\n return result.filter(Boolean) as T[];\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RedisAdaptersSettings.js","sourceRoot":"","sources":["../../src/domain/RedisAdaptersSettings.ts"],"names":[],"mappings":"","sourcesContent":["import {AdaptersSettings} from \"@tsed/adapters\";\nimport {RedisOptions} from \"ioredis\";\n\ndeclare global {\n namespace TsED {\n interface AdaptersOptions extends AdaptersSettings {\n redis: RedisOptions & {\n indexes?: {[propertyKey: string]: Record<string, any>};\n };\n }\n }\n}\n"]}
|
package/lib/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,kEAAwC","sourcesContent":["export * from \"./adapters/RedisAdapter\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RedisFactory.js","sourceRoot":"","sources":["../../src/services/RedisFactory.ts"],"names":[],"mappings":";;;AAAA,iCAAyD;AACzD,8DAA8C;AAE9C,qBAAgB,CAAC;IACf,OAAO,EAAE,iBAAO;IAChB,IAAI,EAAE,CAAC,kBAAa,CAAC;IACrB,UAAU,CAAC,aAA4B;QACrC,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAe,gBAAgB,CAAC,CAAC;QAElE,uBAAuB;QACvB,IAAI,OAAO,EAAE;YACX,OAAO,IAAI,iBAAO,CAAC,OAAO,CAAC,CAAC;SAC7B;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC,CAAC","sourcesContent":["import {Configuration, registerProvider} from \"@tsed/di\";\nimport IoRedis, {RedisOptions} from \"ioredis\";\n\nregisterProvider({\n provide: IoRedis,\n deps: [Configuration],\n useFactory(configuration: Configuration) {\n const options = configuration.get<RedisOptions>(\"adapters.redis\");\n\n // istanbul ignore next\n if (options) {\n return new IoRedis(options);\n }\n\n return {};\n }\n});\n"]}
|