@actdim/utico 0.9.6 → 0.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/array.es.js.map +1 -1
- package/dist/arrayExtensions.es.js.map +1 -1
- package/dist/{mutex.d.ts → asyncMutex.d.ts} +1 -1
- package/dist/asyncMutex.d.ts.map +1 -0
- package/dist/{mutex.es.js → asyncMutex.es.js} +1 -1
- package/dist/asyncMutex.es.js.map +1 -0
- package/dist/cache/cacheContracts.d.ts +21 -0
- package/dist/cache/cacheContracts.d.ts.map +1 -0
- package/dist/cache/cacheContracts.es.js +13 -0
- package/dist/cache/cacheContracts.es.js.map +1 -0
- package/dist/cache/memoryCache.es.js.map +1 -1
- package/dist/cache/persistentCache.d.ts +26 -15
- package/dist/cache/persistentCache.d.ts.map +1 -1
- package/dist/cache/persistentCache.es.js +124 -72
- package/dist/cache/persistentCache.es.js.map +1 -1
- package/dist/dataFormats.es.js.map +1 -1
- package/dist/dateTimeDataFormat.es.js.map +1 -1
- package/dist/gfx/canvasUtils.es.js.map +1 -1
- package/dist/gfx/color.es.js.map +1 -1
- package/dist/i18n/cultures.es.js.map +1 -1
- package/dist/i18n/enUsCulture.es.js.map +1 -1
- package/dist/math.es.js.map +1 -1
- package/dist/metadata.es.js.map +1 -1
- package/dist/patterns.es.js.map +1 -1
- package/dist/store/dataStore.d.ts +68 -25
- package/dist/store/dataStore.d.ts.map +1 -1
- package/dist/store/dataStore.es.js +213 -114
- package/dist/store/dataStore.es.js.map +1 -1
- package/dist/store/persistentStore.d.ts +3 -5
- package/dist/store/persistentStore.d.ts.map +1 -1
- package/dist/store/persistentStore.es.js +10 -18
- package/dist/store/persistentStore.es.js.map +1 -1
- package/dist/store/storeContracts.d.ts +55 -5
- package/dist/store/storeContracts.d.ts.map +1 -1
- package/dist/store/storeContracts.es.js +15 -1
- package/dist/store/storeContracts.es.js.map +1 -1
- package/dist/store/storeDb.es.js +84 -53
- package/dist/store/storeDb.es.js.map +1 -1
- package/dist/stringCore.es.js.map +1 -1
- package/dist/structEvent.es.js.map +1 -1
- package/dist/typeCore.d.ts +20 -0
- package/dist/typeCore.d.ts.map +1 -1
- package/dist/typeCore.es.js.map +1 -1
- package/dist/typeUtils.es.js.map +1 -1
- package/dist/utils.es.js.map +1 -1
- package/dist/watchable.es.js.map +1 -1
- package/package.json +28 -23
- package/dist/mutex.d.ts.map +0 -1
- package/dist/mutex.es.js.map +0 -1
- package/dist/store/storeDb.d.ts +0 -42
- package/dist/store/storeDb.d.ts.map +0 -1
|
@@ -1,133 +1,232 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { v4 as u } from "uuid";
|
|
2
|
+
import { keyOf as h } from "../typeUtils.es.js";
|
|
3
|
+
import { StoreDb as f } from "./storeDb.es.js";
|
|
4
|
+
function* w(d) {
|
|
5
|
+
const t = [...d.keys()];
|
|
6
|
+
for (let e = t.length - 1; e >= 0; e--)
|
|
7
|
+
yield d.get(t[e]);
|
|
8
|
+
}
|
|
9
|
+
class c {
|
|
10
|
+
_metadata;
|
|
11
|
+
constructor(t) {
|
|
12
|
+
this._metadata = t;
|
|
13
|
+
}
|
|
14
|
+
get db() {
|
|
15
|
+
return this._metadata.db;
|
|
16
|
+
}
|
|
17
|
+
async toArrayAsync(t, e, a = "r") {
|
|
18
|
+
const r = this.db;
|
|
19
|
+
return r.execAsync(async () => {
|
|
20
|
+
const n = /* @__PURE__ */ new Map();
|
|
21
|
+
let s = this._metadata.each;
|
|
22
|
+
t && e && (s = (await this._metadata.sortBy(t)).forEach), s((i) => {
|
|
23
|
+
n.set(i.key, {
|
|
24
|
+
metadata: i
|
|
25
|
+
// data: undefined
|
|
26
|
+
});
|
|
15
27
|
});
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
28
|
+
const y = [...n.keys()], o = await r.data.bulkGet(y);
|
|
29
|
+
for (const i of o)
|
|
30
|
+
n.get(i.key).data = i;
|
|
31
|
+
return e === "desc" ? [...w(n)] : [...n.values()];
|
|
32
|
+
}, a);
|
|
33
|
+
}
|
|
34
|
+
orderByAsync(t, e, a = "r") {
|
|
35
|
+
return this.toArrayAsync(t, e, a);
|
|
36
|
+
}
|
|
37
|
+
filter(t) {
|
|
38
|
+
const e = this._metadata.filter(t);
|
|
39
|
+
return new c(e);
|
|
40
|
+
}
|
|
41
|
+
limit(t) {
|
|
42
|
+
return new c(this._metadata.limit(t));
|
|
43
|
+
}
|
|
44
|
+
offset(t) {
|
|
45
|
+
return new c(this._metadata.offset(t));
|
|
46
|
+
}
|
|
47
|
+
getKeysAsync() {
|
|
48
|
+
return this._metadata.primaryKeys();
|
|
49
|
+
}
|
|
50
|
+
getCountAsync() {
|
|
51
|
+
return this._metadata.count();
|
|
52
|
+
}
|
|
53
|
+
getFilterKeysAsync(t) {
|
|
54
|
+
return t ? this._metadata.uniqueKeys : this._metadata.keys;
|
|
55
|
+
}
|
|
56
|
+
modifyMetadataAsync(t, e = "rw") {
|
|
57
|
+
if (!t)
|
|
58
|
+
throw new Error("callback cannot be undefined.");
|
|
59
|
+
return this.db.execAsync(async () => this._metadata.modify((a) => {
|
|
60
|
+
t(a);
|
|
61
|
+
}), e);
|
|
62
|
+
}
|
|
63
|
+
modifyDataAsync(t, e = "rw") {
|
|
64
|
+
if (!t)
|
|
65
|
+
throw new Error("callback cannot be undefined.");
|
|
66
|
+
return this.db.execAsync(async () => {
|
|
67
|
+
const a = await this.getKeysAsync();
|
|
68
|
+
return await this.db.data.where(h("key")).anyOf(a).modify((r) => {
|
|
69
|
+
t(r.value);
|
|
70
|
+
});
|
|
71
|
+
}, e);
|
|
72
|
+
}
|
|
73
|
+
modifyAsync(t, e, a = "rw") {
|
|
74
|
+
return this.db.execAsync(async () => {
|
|
75
|
+
const r = [];
|
|
76
|
+
let n;
|
|
77
|
+
return t && (n = await this._metadata.modify((s) => {
|
|
78
|
+
r.push(s.key), t(s);
|
|
79
|
+
})), e && await this.db.data.where(h("key")).anyOf(r).modify((s) => {
|
|
80
|
+
e(s.value);
|
|
81
|
+
}), n;
|
|
82
|
+
}, a);
|
|
22
83
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
return
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
await this._db.open();
|
|
44
|
-
else
|
|
45
|
-
throw t;
|
|
46
|
-
}
|
|
84
|
+
}
|
|
85
|
+
function m(d, t) {
|
|
86
|
+
const e = /* @__PURE__ */ new WeakMap();
|
|
87
|
+
return new Proxy(d, {
|
|
88
|
+
get(a, r, n) {
|
|
89
|
+
const s = Reflect.get(a, r, n);
|
|
90
|
+
return typeof s == "function" ? (e.has(s) || e.set(s, new Proxy(s, {
|
|
91
|
+
apply(y, o, i) {
|
|
92
|
+
return t(Reflect.apply(y, o, i));
|
|
93
|
+
}
|
|
94
|
+
})), e.get(s)) : s;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
class p {
|
|
99
|
+
_db;
|
|
100
|
+
constructor(t, e) {
|
|
101
|
+
if (!t)
|
|
102
|
+
throw new Error("Name cannot be empty.");
|
|
103
|
+
this._db = new f(t, e);
|
|
47
104
|
}
|
|
48
105
|
dispose() {
|
|
49
|
-
this.
|
|
50
|
-
}
|
|
51
|
-
async $execAsync(t, s = "rw") {
|
|
52
|
-
await this.openAsync();
|
|
53
|
-
try {
|
|
54
|
-
return await this._db.transaction(s, this._db.registry, this._db.data, async () => await t());
|
|
55
|
-
} catch (e) {
|
|
56
|
-
throw this._db.isOpen(), e;
|
|
57
|
-
}
|
|
106
|
+
this._db?.dispose(), this._db = null;
|
|
58
107
|
}
|
|
59
|
-
|
|
60
|
-
return
|
|
108
|
+
openAsync() {
|
|
109
|
+
return this._db.openAsync();
|
|
61
110
|
}
|
|
62
|
-
|
|
63
|
-
return
|
|
64
|
-
const s = await this._db.registry.get(t);
|
|
65
|
-
if (s) {
|
|
66
|
-
const e = await this._db.data.get(t);
|
|
67
|
-
return { ...s, ...e };
|
|
68
|
-
}
|
|
69
|
-
return null;
|
|
70
|
-
}, "readonly");
|
|
111
|
+
execAsync(t, e = "r!") {
|
|
112
|
+
return this._db.execAsync(t, e);
|
|
71
113
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
let r = {
|
|
81
|
-
id: a,
|
|
82
|
-
value: void 0
|
|
83
|
-
};
|
|
84
|
-
s[a] = { ...i[a], ...r };
|
|
85
|
-
}
|
|
86
|
-
return s;
|
|
87
|
-
}, "readonly");
|
|
88
|
-
}
|
|
89
|
-
async containsAsync(t) {
|
|
90
|
-
return await this.$execAsync(async () => await this._db.registry.get(t) != null);
|
|
91
|
-
}
|
|
92
|
-
async deleteAsync(t) {
|
|
93
|
-
await this.$execAsync(async () => {
|
|
94
|
-
await this._db.registry.delete(t), await this._db.data.delete(t);
|
|
95
|
-
});
|
|
114
|
+
getKeysAsync() {
|
|
115
|
+
return this._db.getKeysAsync();
|
|
116
|
+
}
|
|
117
|
+
containsAsync(t, e = "r") {
|
|
118
|
+
return this._db.containsAsync(t, e);
|
|
119
|
+
}
|
|
120
|
+
deleteAsync(t, e = "rw") {
|
|
121
|
+
return this._db.deleteAsync(t, e);
|
|
96
122
|
}
|
|
97
123
|
// deleteManyAsync
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
124
|
+
bulkDeleteAsync(t, e = "rw") {
|
|
125
|
+
return this._db.bulkDeleteAsync(t, e);
|
|
126
|
+
}
|
|
127
|
+
// clearAllAsync
|
|
128
|
+
clearAsync(t = "rw") {
|
|
129
|
+
return this._db.clearAsync(t);
|
|
130
|
+
}
|
|
131
|
+
getAsync(t, e = "r?") {
|
|
132
|
+
return this.execAsync(async () => {
|
|
133
|
+
const a = await this._db.metadata.get(t), r = await this._db.data.get(t);
|
|
134
|
+
return {
|
|
135
|
+
metadata: a,
|
|
136
|
+
data: r
|
|
137
|
+
};
|
|
138
|
+
}, e);
|
|
102
139
|
}
|
|
103
140
|
// upsertAsync
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
value: s
|
|
115
|
-
});
|
|
116
|
-
});
|
|
141
|
+
setAsync(t, e, a = "rw") {
|
|
142
|
+
if (e === void 0)
|
|
143
|
+
throw new Error('Invalid parameter: "value".');
|
|
144
|
+
return t.key || (t.key = u()), this.execAsync(async () => {
|
|
145
|
+
const r = await this._db.metadata.put(t);
|
|
146
|
+
return await this._db.data.put({
|
|
147
|
+
key: t.key,
|
|
148
|
+
value: e
|
|
149
|
+
}), r;
|
|
150
|
+
}, a);
|
|
117
151
|
}
|
|
118
152
|
// getOrAddAsync
|
|
119
|
-
|
|
120
|
-
|
|
153
|
+
getOrSetAsync(t, e, a = "rw") {
|
|
154
|
+
if (!t.key)
|
|
155
|
+
throw new Error('Key cannot be empty. Parameter: "metadataRecord".');
|
|
156
|
+
return this.execAsync(async () => {
|
|
157
|
+
const r = await this.getAsync(t.key);
|
|
158
|
+
return r || (await this.setAsync(t, e(t)), this.getAsync(t.key));
|
|
159
|
+
}, a);
|
|
160
|
+
}
|
|
161
|
+
updateAsync(t, e, a, r = "rw") {
|
|
162
|
+
if (!t)
|
|
163
|
+
throw new Error('Key cannot be empty. Parameter: "key".');
|
|
164
|
+
if (!e && !a)
|
|
165
|
+
throw new Error("No changes provided.");
|
|
166
|
+
return this.execAsync(async () => {
|
|
167
|
+
let n;
|
|
168
|
+
return e && (n = await this._db.metadata.update(t, e)), a && await this._db.data.update(t, a), n;
|
|
169
|
+
}, r);
|
|
170
|
+
}
|
|
171
|
+
bulkUpdateAsync(t, e, a = "rw") {
|
|
172
|
+
let r;
|
|
173
|
+
if (t && (r = t.findIndex((n) => !n.key)) >= 0)
|
|
174
|
+
throw new Error(`Key cannot be empty. Parameter: "metadataChangeSets". Invalid item index: ${r}.`);
|
|
175
|
+
if (e && (r = e.findIndex((n) => !n.key)) >= 0)
|
|
176
|
+
throw new Error(`Key cannot be empty. Parameter: "valueChangeSets". Invalid item index: ${r}.`);
|
|
177
|
+
return this.execAsync(async () => {
|
|
178
|
+
let n;
|
|
179
|
+
return t && (n = await this._db.metadata.bulkUpdate(t)), e && await this._db.data.bulkUpdate(e), n;
|
|
180
|
+
}, a);
|
|
121
181
|
}
|
|
122
|
-
//
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
182
|
+
// getMany
|
|
183
|
+
bulkGetAsync(t, e = "r") {
|
|
184
|
+
return this.execAsync(async () => {
|
|
185
|
+
const a = /* @__PURE__ */ new Map(), r = await this._db.metadata.bulkGet(t);
|
|
186
|
+
for (const s of r)
|
|
187
|
+
a.set(s.key, {
|
|
188
|
+
metadata: s
|
|
189
|
+
// data: undefined
|
|
190
|
+
});
|
|
191
|
+
const n = await this._db.data.bulkGet(t);
|
|
192
|
+
for (const s of n)
|
|
193
|
+
a.get(s.key).data = s;
|
|
194
|
+
return [...a.values()];
|
|
195
|
+
}, e);
|
|
196
|
+
}
|
|
197
|
+
bulkSetAsync(t, e, a = "rw") {
|
|
198
|
+
let r;
|
|
199
|
+
if (t && (r = t.findIndex((n) => !n)) >= 0)
|
|
200
|
+
throw new Error(`Invalid metadata record. Parameter: "metadataRecords". Index: ${r}.`);
|
|
201
|
+
if (e && (r = e.findIndex((n) => !n || !n.key || n.value === void 0)) >= 0)
|
|
202
|
+
throw new Error(`Invalid data record. Parameter: "dataRecords". Index: ${r}.`);
|
|
203
|
+
if (!t && !e)
|
|
204
|
+
throw new Error("No data provided.");
|
|
205
|
+
for (const n of t)
|
|
206
|
+
n.key || (n.key = u());
|
|
207
|
+
return this.execAsync(async () => {
|
|
208
|
+
let n;
|
|
209
|
+
return t && (n = await this._db.metadata.bulkPut(t, void 0, { allKeys: !0 })), e && await this._db.data.bulkPut(e, void 0, { allKeys: !0 }), n;
|
|
210
|
+
}, a);
|
|
211
|
+
}
|
|
212
|
+
orderBy(t, e, a = !1) {
|
|
213
|
+
let r = this._db.metadata.orderBy(t);
|
|
214
|
+
return e === "desc" && (r = r.reverse()), a && (r = r.distinct()), new c(r);
|
|
215
|
+
}
|
|
216
|
+
distinct(t) {
|
|
217
|
+
const e = this._db.metadata.orderBy(t).distinct();
|
|
218
|
+
return new c(e);
|
|
219
|
+
}
|
|
220
|
+
query() {
|
|
221
|
+
return new c(this._db.metadata.toCollection());
|
|
222
|
+
}
|
|
223
|
+
// filter
|
|
224
|
+
where(t) {
|
|
225
|
+
const e = this._db.metadata.where(t);
|
|
226
|
+
return m(e, (a) => new c(a));
|
|
127
227
|
}
|
|
128
|
-
// TODO: support bulkSetAsync
|
|
129
228
|
}
|
|
130
229
|
export {
|
|
131
|
-
|
|
230
|
+
p as DataStore
|
|
132
231
|
};
|
|
133
232
|
//# sourceMappingURL=dataStore.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataStore.es.js","sources":["../../src/store/dataStore.ts"],"sourcesContent":["import { AsyncMutex } from \"@/mutex\";\r\nimport { CommonPartFromSchema } from \"@/typeCore\";\r\nimport { EntryTypes, IDataItem, StoreDb } from \"./storeDb\";\r\nimport { StructEventTarget } from \"@/structEvent\";\r\nimport Dexie, { TransactionMode } from \"dexie\";\r\nimport { v4 as uuid } from \"uuid\";\r\nimport { strictSatisfies } from \"@/typeUtils\";\r\n\r\nconst mutex = new AsyncMutex();\r\n\r\n// BaseEntry/EntryBase\r\ntype CommonEntry = CommonPartFromSchema<EntryTypes>;\r\n\r\n// TODO: update\r\nexport type IDataStoreBase = {\r\n openAsync(): PromiseLike<void>;\r\n}\r\n\r\nexport class DataStore<TEntryTemplate extends keyof EntryTypes, TEventStruct extends Record<string, any> = unknown> extends StructEventTarget<TEventStruct> implements IDataStoreBase {\r\n\r\n protected _db: StoreDb<TEntryTemplate>;\r\n\r\n protected _isDisposed: boolean;\r\n\r\n protected static async $deleteAsync(name: string) {\r\n try {\r\n await mutex.dispatch(async () => {\r\n if (await StoreDb.exists(name)) {\r\n await StoreDb.delete(name);\r\n }\r\n });\r\n } catch (err) {\r\n if (err instanceof Dexie.InvalidStateError || err instanceof Dexie.VersionError) {\r\n console.warn(`[DataStore] delete(${name}) failed:`, err);\r\n } else {\r\n throw err;\r\n }\r\n }\r\n }\r\n\r\n protected static $existsAsync(name: string) {\r\n return Dexie.exists(name);\r\n }\r\n\r\n protected static async $openAsync<T extends IDataStoreBase>(name: string, factory: (name: string) => T) {\r\n return await mutex.dispatch(async () => {\r\n const store = factory(name);\r\n await store.openAsync();\r\n return store;\r\n });\r\n }\r\n\r\n constructor(name: string, entryTemplate: TEntryTemplate) {\r\n super();\r\n if (!name) {\r\n throw new Error(\"Name cannot be empty\");\r\n }\r\n this._isDisposed = false;\r\n this._db = new StoreDb(name, entryTemplate);\r\n }\r\n\r\n async openAsync() {\r\n if (!this._db.isOpen()) {\r\n try {\r\n await this._db.open();\r\n } catch (err) {\r\n if (err instanceof Dexie.OpenFailedError) {\r\n await this._db.open();\r\n } else {\r\n throw err;\r\n }\r\n }\r\n // TODO: log (this._db.verno, this._db._dbSchema etc)\r\n }\r\n }\r\n\r\n dispose() {\r\n if (!this._isDisposed) {\r\n if (this._db) {\r\n // this.exec(async () => {\r\n // \t// ...\r\n // }).then(() => {\r\n // \tthis._db = null;\r\n // });\r\n if (this._db.isOpen()) {\r\n this._db.close();\r\n }\r\n this._db = null;\r\n }\r\n this._isDisposed = true;\r\n }\r\n }\r\n\r\n protected async $execAsync<T>(action: () => Promise<T>, transactionMode: TransactionMode = \"rw\") {\r\n await this.openAsync();\r\n try {\r\n const result = await this._db.transaction(transactionMode, this._db.registry, this._db.data, async () => {\r\n return await action();\r\n });\r\n return result;\r\n } catch (err) {\r\n if (this._db.isOpen()) {\r\n // this._db.close(); // generally speaking: we don't (never) need to close a connection\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n async getKeysAsync() {\r\n return await this._db.registry.filter((_) => true).primaryKeys();\r\n }\r\n\r\n async getAsync(key: string): Promise<Readonly<EntryTypes[TEntryTemplate] & IDataItem>> {\r\n return await this.$execAsync(async () => {\r\n const entry = await this._db.registry.get(key);\r\n // const entry = await this._db.registry.where(keyOf<IDataEntry>(\"id\")).equals(key).first();\r\n if (entry) {\r\n const data = await this._db.data.get(key);\r\n // const data = await this._db.data.where(keyOf<IDataEntry>(\"id\")).equals(key).first();\r\n return { ...entry, ...data };\r\n }\r\n return null;\r\n }, \"readonly\");\r\n }\r\n\r\n // getMany\r\n async bulkGetAsync(ids: string[]): Promise<{ [key: string]: Readonly<EntryTypes[TEntryTemplate] & IDataItem> }> {\r\n const result: { [key: string]: Readonly<EntryTypes[TEntryTemplate] & IDataItem> } = {};\r\n return await this.$execAsync(async () => {\r\n // const entries = await this._db.registry.where(keyOf<IDataEntry>(\"id\")).anyOf(ids).toArray();\r\n const entries = await this._db.registry.bulkGet(ids);\r\n const entryMap: { [key: string]: EntryTypes[TEntryTemplate] } = entries.reduce((map, entry, i) => {\r\n map[entry.id] = entry;\r\n return map;\r\n }, {});\r\n\r\n // const dataItems = this._db.data.where(keyOf<IDataEntry>(\"id\")).anyOf(ids);\r\n // await dataItems.each((dataItem) => {\r\n // result[dataItem.id] = { ...entryMap[dataItem.id], ...dataItem };\r\n // delete entryMap[dataItem.id];\r\n // });\r\n\r\n const dataItems = await this._db.data.bulkGet(ids);\r\n for (const dataItem of dataItems) {\r\n result[dataItem.id] = { ...entryMap[dataItem.id], ...dataItem };\r\n delete entryMap[dataItem.id];\r\n }\r\n\r\n // TODO: update data entry \r\n // accessedAt,\r\n // updatedAt,\r\n // expiresAt // for sliding expiration\r\n\r\n for (const key of Object.keys(entryMap)) {\r\n // abandoned/orphaned entries:\r\n let dataItem: IDataItem = {\r\n id: key,\r\n value: undefined\r\n }\r\n result[key] = { ...entryMap[key], ...dataItem };\r\n // Object.defineProperty(result[key], keyOf<IDataItem>(\"value\"), {\r\n // writable: false,\r\n // get: function () {\r\n // throw new Error(\"Not found\");\r\n // }\r\n // });\r\n }\r\n\r\n return result;\r\n }, \"readonly\");\r\n }\r\n\r\n async containsAsync(key: string) {\r\n return await this.$execAsync(async () => {\r\n const entry = await this._db.registry.get(key);\r\n // const entry = await this._db.registry.where(keyOf<IDataEntry>(\"id\")).equals(key).first();\r\n return entry != undefined;\r\n });\r\n }\r\n\r\n async deleteAsync(key: string) {\r\n await this.$execAsync(async () => {\r\n await this._db.registry.delete(key);\r\n await this._db.data.delete(key);\r\n });\r\n }\r\n\r\n // deleteManyAsync\r\n async bulkDeleteAsync(keys: string[]) {\r\n await this.$execAsync(async () => {\r\n await this._db.registry.bulkDelete(keys);\r\n await this._db.data.bulkDelete(keys);\r\n });\r\n }\r\n\r\n // upsertAsync\r\n protected async $setAsync(key: string, value: any) {\r\n return await this.$execAsync(async () => {\r\n let entry;\r\n const now = new Date().getTime();\r\n if (key) {\r\n entry = await this._db.registry.get(key);\r\n // entry = await this._db.registry.where(keyOf<IDataEntry>(\"id\")).equals(key).first();\r\n } else {\r\n key = uuid();\r\n }\r\n await this._db.registry.put(strictSatisfies<CommonEntry>()({\r\n id: key,\r\n createdAt: entry ? entry.createdAt : now,\r\n updatedAt: now\r\n }));\r\n await this._db.data.put({\r\n id: key,\r\n value: value\r\n });\r\n });\r\n }\r\n\r\n // getOrAddAsync\r\n protected async $getOrSetAsync(key: string, factory: (key: string) => any,) {\r\n return await this.$execAsync(async () => {\r\n if (!(await this.containsAsync(key))) {\r\n await this.$setAsync(key, factory(key));\r\n }\r\n return await this.getAsync(key);\r\n });\r\n }\r\n\r\n // clearAllAsync/evictAllAsync\r\n async clearAsync() {\r\n await this.$execAsync(async () => {\r\n await this._db.registry.clear();\r\n await this._db.data.clear();\r\n });\r\n }\r\n\r\n // TODO: support bulkSetAsync\r\n}"],"names":["mutex","AsyncMutex","DataStore","StructEventTarget","name","StoreDb","err","Dexie","factory","store","entryTemplate","action","transactionMode","_","key","entry","data","ids","result","entryMap","map","i","dataItems","dataItem","keys","value","now","uuid","strictSatisfies"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dataStore.es.js","sources":["D:/Src/my/actdim/public/utico/src/store/dataStore.ts"],"sourcesContent":["import * as Dexie from \"dexie\";\r\nimport { v4 as uuid } from \"uuid\";\r\nimport { keyOf } from \"@/typeUtils\";\r\nimport { KeyPathValueMap } from \"@/typeCore\";\r\nimport { ChangeSet, DataRecord, FieldDefTemplate, IndexableType, IStoreCollection, MetadataRecord, OrderDirection, StoreBase, StoreItem, TransactionMode } from \"./storeContracts\";\r\nimport { StoreDb } from \"@/store/storeDb\";\r\n\r\nfunction* reverseMapValues<K, V>(map: Map<K, V>) {\r\n const keys = [...map.keys()];\r\n for (let i = keys.length - 1; i >= 0; i--) {\r\n yield map.get(keys[i])!;\r\n }\r\n}\r\n\r\nclass StoreCollection<T extends MetadataRecord = MetadataRecord, TValue = any> implements IStoreCollection<T, TValue> {\r\n private _metadata: Dexie.Collection<T>;\r\n\r\n constructor(\r\n metadata: Dexie.Collection<T>\r\n ) {\r\n this._metadata = metadata;\r\n }\r\n\r\n private get db() {\r\n return this._metadata.db as StoreDb<T>;\r\n }\r\n\r\n async toArrayAsync(orderBy?: keyof T, orderDirection?: OrderDirection, transactionMode: TransactionMode = \"r\"): Promise<StoreItem<T, TValue>[]> {\r\n\r\n const db = this.db;\r\n\r\n // db.data.where(keyOf<DataRecord>(\"key\")).equals(key).first();\r\n\r\n return db.execAsync(async () => {\r\n const map = new Map<string, StoreItem<T, TValue>>();\r\n let populate: (callback: (metadataRecord: T) => void) => void = this._metadata.each;\r\n if (orderBy && orderDirection) {\r\n const metadataRecords = await this._metadata.sortBy(orderBy as string);\r\n populate = metadataRecords.forEach;\r\n }\r\n populate(metadataRecord => {\r\n map.set(metadataRecord.key, {\r\n metadata: metadataRecord,\r\n // data: undefined\r\n });\r\n });\r\n const keys = [...map.keys()];\r\n const dataRecords = await db.data.bulkGet(keys);\r\n for (const dataRecord of dataRecords) {\r\n map.get(dataRecord.key).data = dataRecord;\r\n }\r\n // abandoned/orphaned entries:\r\n // Object.defineProperty(storeItem, keyOf<StoreItem>(\"data\"), {\r\n // writable: false,\r\n // get: function () {\r\n // throw new Error(\"Not found\");\r\n // }\r\n // });\r\n // Array.from(map.values()) can be slower!\r\n if (orderDirection === \"desc\") {\r\n return [...reverseMapValues(map)];\r\n }\r\n return [...map.values()];\r\n }, transactionMode);\r\n }\r\n\r\n orderByAsync(field: keyof T, direction: OrderDirection, transactionMode: TransactionMode = \"r\") {\r\n return this.toArrayAsync(field, direction, transactionMode);\r\n }\r\n\r\n filter<S extends T>(filter: (x: T) => x is S) {\r\n const metadata = this._metadata.filter(filter);\r\n return new StoreCollection<S, TValue>(metadata);\r\n }\r\n\r\n limit(n: number) {\r\n return new StoreCollection<T, TValue>(this._metadata.limit(n));\r\n }\r\n\r\n offset(n: number) {\r\n return new StoreCollection<T, TValue>(this._metadata.offset(n));\r\n }\r\n\r\n getKeysAsync() {\r\n return this._metadata.primaryKeys() as Promise<T[\"key\"][]>;\r\n }\r\n\r\n getCountAsync() {\r\n return this._metadata.count();\r\n }\r\n\r\n getFilterKeysAsync(distinct: boolean) {\r\n if (distinct) {\r\n return this._metadata.uniqueKeys;\r\n }\r\n return this._metadata.keys;\r\n }\r\n\r\n modifyMetadataAsync(callback: (metadataRecord: T) => void, transactionMode: TransactionMode = \"rw\") {\r\n if (!callback) {\r\n throw new Error(\"callback cannot be undefined.\");\r\n }\r\n return this.db.execAsync(async () => {\r\n return this._metadata.modify(r => {\r\n callback(r);\r\n });\r\n }, transactionMode);\r\n }\r\n\r\n modifyDataAsync(callback: (dataRecord: DataRecord) => void, transactionMode: TransactionMode = \"rw\") {\r\n if (!callback) {\r\n throw new Error(\"callback cannot be undefined.\");\r\n }\r\n return this.db.execAsync(async () => {\r\n const keys = await this.getKeysAsync();\r\n return await this.db.data.where(keyOf<DataRecord>(\"key\")).anyOf(keys).modify(r => {\r\n callback(r.value);\r\n });\r\n }, transactionMode);\r\n }\r\n\r\n modifyAsync(metadataCallback: (metadataRecord: T) => void, dataCallback: (dataRecord: DataRecord) => void, transactionMode: TransactionMode = \"rw\") {\r\n return this.db.execAsync(async () => {\r\n const keys: string[] = [];\r\n let mc: number, dc: number;\r\n if (metadataCallback) {\r\n mc = await this._metadata.modify(r => {\r\n keys.push(r.key);\r\n metadataCallback(r);\r\n });\r\n }\r\n if (dataCallback) {\r\n dc = await this.db.data.where(keyOf<DataRecord>(\"key\")).anyOf(keys).modify(r => {\r\n dataCallback(r.value);\r\n });\r\n }\r\n return mc;\r\n }, transactionMode);\r\n }\r\n}\r\n\r\ninterface IWhereFilter<T extends IndexableType, TResult = any> {\r\n constructor(source: Dexie.WhereClause<any, any>)\r\n above(value: T): TResult;\r\n aboveOrEqual(value: T): TResult;\r\n anyOf(values: ReadonlyArray<T>): TResult;\r\n anyOfIgnoreCase(keys: T extends string ? T[] : never): T extends string ? TResult : never;\r\n below(value: T): TResult;\r\n belowOrEqual(value: T): TResult;\r\n between(lower: any, upper: any, includeLower?: boolean, includeUpper?: boolean): TResult;\r\n equals(value: T): TResult;\r\n equalsIgnoreCase(value: string): TResult;\r\n inAnyRange(ranges: ReadonlyArray<{\r\n 0: T;\r\n 1: T;\r\n }>, options?: {\r\n includeLowers?: boolean;\r\n includeUppers?: boolean;\r\n }): TResult;\r\n startsWith(prefix: T extends string ? T : never): T extends string ? TResult : never;\r\n startsWithAnyOf(prefixes: T extends string ? T[] : never): T extends string ? TResult : never;\r\n startsWithIgnoreCase(prefix: T extends string ? T : never): T extends string ? TResult : never;\r\n startsWithAnyOfIgnoreCase(prefixes: T extends string ? T[] : never): T extends string ? TResult : never;\r\n noneOf(values: ReadonlyArray<T>): TResult;\r\n notEqual(value: T): TResult;\r\n}\r\n\r\nfunction createWhereFilter<T extends IndexableType, TResult>(source: Dexie.WhereClause<any, any>, factory: (source: Dexie.Collection) => TResult) {\r\n const methodCache = new WeakMap<Function, Function>();\r\n return new Proxy(source as any, {\r\n get(target, prop, receiver) {\r\n const value = Reflect.get(target, prop, receiver);\r\n if (typeof value === \"function\") {\r\n if (!methodCache.has(value)) {\r\n methodCache.set(value, new Proxy(value, {\r\n apply(targetFn, thisArg, args) {\r\n return factory(Reflect.apply(targetFn, thisArg, args));\r\n },\r\n }));\r\n }\r\n return methodCache.get(value);\r\n }\r\n return value;\r\n },\r\n }) as IWhereFilter<T, TResult>;\r\n}\r\n\r\nexport class DataStore<T extends MetadataRecord> implements StoreBase {\r\n\r\n private _db: StoreDb<T>;\r\n\r\n constructor(name: string, metadataFieldDefTemplate: keyof T extends string ? FieldDefTemplate<keyof T> : never) {\r\n if (!name) {\r\n throw new Error(\"Name cannot be empty.\");\r\n }\r\n this._db = new StoreDb<T>(name, metadataFieldDefTemplate);\r\n }\r\n\r\n dispose() {\r\n this._db?.dispose();\r\n this._db = null;\r\n }\r\n\r\n openAsync() {\r\n return this._db.openAsync()\r\n }\r\n\r\n execAsync<T>(\r\n action: () => Promise<T>, // scope\r\n transactionMode: TransactionMode = \"r!\") {\r\n return this._db.execAsync(action, transactionMode);\r\n }\r\n\r\n getKeysAsync() {\r\n return this._db.getKeysAsync();\r\n // return this.query().keysAsync();\r\n }\r\n\r\n containsAsync(key: string, transactionMode: TransactionMode = \"r\") {\r\n return this._db.containsAsync(key, transactionMode);\r\n }\r\n\r\n deleteAsync(key: string, transactionMode: TransactionMode = \"rw\") {\r\n return this._db.deleteAsync(key, transactionMode);\r\n }\r\n\r\n // deleteManyAsync\r\n bulkDeleteAsync(keys: string[], transactionMode: TransactionMode = \"rw\") {\r\n return this._db.bulkDeleteAsync(keys, transactionMode);\r\n }\r\n\r\n // clearAllAsync\r\n clearAsync(transactionMode: TransactionMode = \"rw\") {\r\n return this._db.clearAsync(transactionMode);\r\n }\r\n\r\n getAsync<TValue = any>(key: string, transactionMode: TransactionMode = \"r?\"): Promise<StoreItem<T, TValue>> {\r\n return this.execAsync(async () => {\r\n const metadataRecord = await this._db.metadata.get(key);\r\n const dataRecord = await this._db.data.get(key);\r\n return {\r\n metadata: metadataRecord,\r\n data: dataRecord\r\n } as StoreItem<T, TValue>;\r\n }, transactionMode);\r\n }\r\n\r\n // upsertAsync\r\n setAsync<TValue = any>(metadataRecord: T, value: TValue, transactionMode: TransactionMode = \"rw\") {\r\n if (value === undefined) {\r\n throw new Error('Invalid parameter: \"value\".');\r\n }\r\n if (!metadataRecord.key) {\r\n metadataRecord.key = uuid();\r\n }\r\n return this.execAsync(async () => {\r\n const result = await this._db.metadata.put(metadataRecord);\r\n await this._db.data.put({\r\n key: metadataRecord.key,\r\n value: value\r\n });\r\n return result;\r\n }, transactionMode);\r\n }\r\n\r\n // getOrAddAsync\r\n getOrSetAsync<TValue = any>(metadataRecord: T, factory: (metadataRecord: T) => TValue, transactionMode: TransactionMode = \"rw\") {\r\n if (!metadataRecord.key) {\r\n throw new Error(`Key cannot be empty. Parameter: \"metadataRecord\".`);\r\n }\r\n return this.execAsync(async () => {\r\n const existingStoreItem = await this.getAsync(metadataRecord.key);\r\n if (existingStoreItem) {\r\n return existingStoreItem;\r\n }\r\n await this.setAsync(metadataRecord, factory(metadataRecord));\r\n return this.getAsync(metadataRecord.key);\r\n }, transactionMode);\r\n }\r\n\r\n updateAsync<TValue = any>(key: string, metadataChanges: KeyPathValueMap<T>, valueChanges?: KeyPathValueMap<TValue>, transactionMode: TransactionMode = \"rw\") {\r\n if (!key) {\r\n throw new Error('Key cannot be empty. Parameter: \"key\".');\r\n }\r\n if (!metadataChanges && !valueChanges) {\r\n throw new Error(\"No changes provided.\");\r\n }\r\n return this.execAsync(async () => {\r\n let mc: number, dc: number;\r\n if (metadataChanges) {\r\n mc = await this._db.metadata.update(key, metadataChanges as any);\r\n }\r\n if (valueChanges) {\r\n dc = await this._db.data.update(key, valueChanges);\r\n }\r\n return mc;\r\n }, transactionMode);\r\n }\r\n\r\n bulkUpdateAsync(metadataChangeSets: ChangeSet<T>[], dataChangeSets?: ChangeSet<DataRecord>[], transactionMode: TransactionMode = \"rw\") {\r\n let index: number;\r\n if (metadataChangeSets && (index = metadataChangeSets.findIndex((x) => !x.key)) >= 0) {\r\n throw new Error(`Key cannot be empty. Parameter: \"metadataChangeSets\". Invalid item index: ${index}.`);\r\n }\r\n if (dataChangeSets && (index = dataChangeSets.findIndex((x) => !x.key)) >= 0) {\r\n throw new Error(`Key cannot be empty. Parameter: \"valueChangeSets\". Invalid item index: ${index}.`);\r\n }\r\n return this.execAsync(async () => {\r\n let cm: number, dc: number;\r\n if (metadataChangeSets) {\r\n cm = await this._db.metadata.bulkUpdate(metadataChangeSets as any);\r\n }\r\n if (dataChangeSets) {\r\n dc = await this._db.data.bulkUpdate(dataChangeSets);\r\n }\r\n return cm;\r\n }, transactionMode);\r\n }\r\n\r\n // getMany\r\n bulkGetAsync<TValue = any>(keys: string[], transactionMode: TransactionMode = \"r\") {\r\n return this.execAsync(async () => {\r\n const map = new Map<string, StoreItem<T, TValue>>();\r\n const metadataRecords = await this._db.metadata.bulkGet(keys);\r\n for (const metadataRecord of metadataRecords) {\r\n map.set(metadataRecord.key, {\r\n metadata: metadataRecord,\r\n // data: undefined\r\n });\r\n }\r\n const dataRecords = await this._db.data.bulkGet(keys);\r\n for (const dataRecord of dataRecords) {\r\n map.get(dataRecord.key).data = dataRecord;\r\n }\r\n return [...map.values()];\r\n }, transactionMode);\r\n }\r\n\r\n bulkSetAsync<TValue = any>(metadataRecords: T[], dataRecords: DataRecord<TValue>[], transactionMode: TransactionMode = \"rw\") {\r\n let index: number;\r\n if (metadataRecords && (index = metadataRecords.findIndex(x => !x)) >= 0) {\r\n throw new Error(`Invalid metadata record. Parameter: \"metadataRecords\". Index: ${index}.`);\r\n }\r\n if (dataRecords && (index = dataRecords.findIndex(x => (!x || !x.key || x.value === undefined))) >= 0) {\r\n throw new Error(`Invalid data record. Parameter: \"dataRecords\". Index: ${index}.`);\r\n }\r\n if (!metadataRecords && !dataRecords) {\r\n throw new Error(\"No data provided.\");\r\n }\r\n for (const metadataRecord of metadataRecords) {\r\n if (!metadataRecord.key) {\r\n metadataRecord.key = uuid();\r\n }\r\n }\r\n return this.execAsync(async () => {\r\n let mKeys: string[], dKeys: string[];\r\n if (metadataRecords) {\r\n mKeys = await this._db.metadata.bulkPut(metadataRecords, undefined, { allKeys: true });\r\n }\r\n if (dataRecords) {\r\n dKeys = await this._db.data.bulkPut(dataRecords, undefined, { allKeys: true });\r\n }\r\n return mKeys;\r\n }, transactionMode);\r\n }\r\n\r\n orderBy(field: keyof T, direction: OrderDirection, distinct = false) {\r\n let metadata = this._db.metadata.orderBy(field as string);\r\n if (direction === \"desc\") {\r\n metadata = metadata.reverse();\r\n }\r\n if (distinct) {\r\n metadata = metadata.distinct();\r\n }\r\n return new StoreCollection(metadata);\r\n }\r\n\r\n distinct(field: keyof T) {\r\n const metadata = this._db.metadata.orderBy(field as string).distinct();\r\n return new StoreCollection(metadata);\r\n }\r\n\r\n query<TValue = any>() {\r\n return new StoreCollection<T, TValue>(this._db.metadata.toCollection());\r\n }\r\n\r\n // filter\r\n where<K extends keyof T, TValue = any>(field: K extends string ? K : never) {\r\n const source = this._db.metadata.where(field as string);\r\n return createWhereFilter<T[K] extends IndexableType ? T[K] : never, StoreCollection<T, TValue>>(source, c => new StoreCollection<T, TValue>(c));\r\n }\r\n}\r\n\r\n// and(filter: (x: T) => boolean): Collection<T, TKey, TInsertType>;\r\n// clone(props?: Object): Collection<T, TKey, TInsertType>;\r\n// count<R>(thenShortcut: ThenShortcut<number, R>): PromiseExtended<R>;\r\n// distinct(): Collection<T, TKey, TInsertType>;\r\n// each(callback: (obj: T, cursor: {\r\n// key: IndexableType;\r\n// primaryKey: TKey;\r\n// }) => any): PromiseExtended<void>;\r\n// eachKey(callback: (key: IndexableType, cursor: {\r\n// key: IndexableType;\r\n// primaryKey: TKey;\r\n// }) => any): PromiseExtended<void>;\r\n// eachPrimaryKey(callback: (key: TKey, cursor: {\r\n// key: IndexableType;\r\n// primaryKey: TKey;\r\n// }) => any): PromiseExtended<void>;\r\n// eachUniqueKey(callback: (key: IndexableType, cursor: {\r\n// key: IndexableType;\r\n// primaryKey: TKey;\r\n// }) => any): PromiseExtended<void>;\r\n// filter<S extends T>(filter: (x: T) => x is S): Collection<S, TKey>;\r\n// filter(filter: (x: T) => boolean): Collection<T, TKey, TInsertType>;\r\n// first(): PromiseExtended<T | undefined>;\r\n// first<R>(thenShortcut: ThenShortcut<T | undefined, R>): PromiseExtended<R>;\r\n// firstKey(): PromiseExtended<IndexableType | undefined>;\r\n// keys<R>(thenShortcut: ThenShortcut<IndexableTypeArray, R>): PromiseExtended<R>;\r\n// primaryKeys(): PromiseExtended<TKey[]>;\r\n// primaryKeys<R>(thenShortcut: ThenShortcut<TKey[], R>): PromiseExtended<R>;\r\n// last(): PromiseExtended<T | undefined>;\r\n// last<R>(thenShortcut: ThenShortcut<T | undefined, R>): PromiseExtended<R>;\r\n// lastKey(): PromiseExtended<IndexableType | undefined>;\r\n// or(indexOrPrimayKey: string): WhereClause<T, TKey, TInsertType>;\r\n// raw(): Collection<T, TKey, TInsertType>;\r\n// sortBy<R>(keyPath: string, thenShortcut: ThenShortcut<T[], R>): PromiseExtended<R>;\r\n// toArray(): PromiseExtended<Array<T>>;\r\n// toArray<R>(thenShortcut: ThenShortcut<T[], R>): PromiseExtended<R>;\r\n// uniqueKeys(): PromiseExtended<IndexableTypeArray>;\r\n// uniqueKeys<R>(thenShortcut: ThenShortcut<IndexableTypeArray, R>): PromiseExtended<R>;\r\n// until(filter: (value: T) => boolean, includeStopEntry?: boolean): Collection<T, TKey, TInsertType>;\r\n// // Mutating methods\r\n// delete(): PromiseExtended<number>;\r\n// modify(changeCallback: (obj: T, ctx: {\r\n// value: TInsertType;\r\n// }) => void | boolean): PromiseExtended<number>;\r\n// modify(changes: UpdateSpec<TInsertType>): PromiseExtended<number>;"],"names":["reverseMapValues","map","keys","i","StoreCollection","metadata","orderBy","orderDirection","transactionMode","db","populate","metadataRecord","dataRecords","dataRecord","field","direction","filter","n","distinct","callback","r","keyOf","metadataCallback","dataCallback","mc","createWhereFilter","source","factory","methodCache","target","prop","receiver","value","targetFn","thisArg","args","DataStore","name","metadataFieldDefTemplate","StoreDb","action","key","uuid","result","existingStoreItem","metadataChanges","valueChanges","metadataChangeSets","dataChangeSets","index","x","cm","metadataRecords","mKeys","c"],"mappings":"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"}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { DataStore } from './dataStore';
|
|
2
|
-
import {
|
|
2
|
+
import { MetadataRecord } from './storeContracts';
|
|
3
3
|
export type PersistentStoreOptions = {
|
|
4
4
|
useEncryption: boolean;
|
|
5
5
|
};
|
|
6
|
-
export declare class PersistentStore extends DataStore<
|
|
6
|
+
export declare class PersistentStore<TValue = any> extends DataStore<MetadataRecord> {
|
|
7
7
|
private _options;
|
|
8
8
|
static deleteAsync(name: string): Promise<void>;
|
|
9
9
|
static existsAsync(name: string): Promise<boolean>;
|
|
10
|
-
static openAsync(name: string, options?: PersistentStoreOptions): Promise<PersistentStore
|
|
10
|
+
static openAsync(name: string, options?: PersistentStoreOptions): Promise<PersistentStore<any>>;
|
|
11
11
|
constructor(name: string, options?: PersistentStoreOptions);
|
|
12
|
-
setAsync(key: string, value: any): Promise<void>;
|
|
13
|
-
getOrSetAsync(key: string, factory: (key: string) => any): Promise<Readonly<import('./storeDb').IDataEntry & import('./storeDb').IDataItem>>;
|
|
14
12
|
}
|
|
15
13
|
//# sourceMappingURL=persistentStore.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistentStore.d.ts","sourceRoot":"","sources":["../../src/store/persistentStore.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"persistentStore.d.ts","sourceRoot":"","sources":["../../src/store/persistentStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAY,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAM5D,MAAM,MAAM,sBAAsB,GAAG;IACjC,aAAa,EAAE,OAAO,CAAC;CAC1B,CAAC;AASF,qBAAa,eAAe,CAAC,MAAM,GAAG,GAAG,CAAE,SAAQ,SAAS,CAAC,cAAc,CAAC;IAExE,OAAO,CAAC,QAAQ,CAAyB;IAEzC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM;IAI/B,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM;IAI/B,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB;gBAInD,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB;CAI7D"}
|
|
@@ -1,31 +1,23 @@
|
|
|
1
|
-
import { DataStore as
|
|
1
|
+
import { DataStore as o } from "./dataStore.es.js";
|
|
2
|
+
import { StoreDb as s } from "./storeDb.es.js";
|
|
2
3
|
const r = {
|
|
3
4
|
useEncryption: !1
|
|
4
|
-
};
|
|
5
|
-
class n extends
|
|
5
|
+
}, c = ["&key", "createdAt", "updatedAt", "tags"];
|
|
6
|
+
class n extends o {
|
|
6
7
|
_options;
|
|
7
8
|
// TODO: support
|
|
8
9
|
static deleteAsync(t) {
|
|
9
|
-
return
|
|
10
|
+
return s.deleteAsync(t);
|
|
10
11
|
}
|
|
11
12
|
static existsAsync(t) {
|
|
12
|
-
return
|
|
13
|
-
}
|
|
14
|
-
static openAsync(t, s) {
|
|
15
|
-
return e.$openAsync(t, () => new n(t, s));
|
|
16
|
-
}
|
|
17
|
-
constructor(t, s) {
|
|
18
|
-
super(t, "default"), this._options = { ...s, ...r };
|
|
13
|
+
return s.existsAsync(t);
|
|
19
14
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return this.$setAsync(t, s);
|
|
15
|
+
static openAsync(t, e) {
|
|
16
|
+
return s.openAsync(t, () => new n(t, e));
|
|
23
17
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return this.$getOrSetAsync(t, s);
|
|
18
|
+
constructor(t, e) {
|
|
19
|
+
super(t, c), this._options = { ...e, ...r };
|
|
27
20
|
}
|
|
28
|
-
// TODO: support bulkSetAsync
|
|
29
21
|
}
|
|
30
22
|
export {
|
|
31
23
|
n as PersistentStore
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistentStore.es.js","sources":["
|
|
1
|
+
{"version":3,"file":"persistentStore.es.js","sources":["D:/Src/my/actdim/public/utico/src/store/persistentStore.ts"],"sourcesContent":["import { DataStore } from \"./dataStore\";\r\nimport { FieldDef, MetadataRecord } from \"./storeContracts\";\r\nimport { StoreDb } from \"./storeDb\";\r\n\r\n// TODO: implement real encryption:\r\n// https://stackoverflow.com/questions/18279141/javascript-string-encryption-and-decryption\r\n\r\nexport type PersistentStoreOptions = {\r\n useEncryption: boolean;\r\n};\r\n\r\nconst defaultPersistentStoreOptions = {\r\n useEncryption: false\r\n} satisfies PersistentStoreOptions;\r\n\r\n// (registry/catalog)fieldNames\r\nconst metadataFieldDefTemplate = [\"&key\", \"createdAt\", \"updatedAt\", \"tags\"] satisfies (FieldDef<keyof MetadataRecord>)[];\r\n// T extends MetadataRecord\r\nexport class PersistentStore<TValue = any> extends DataStore<MetadataRecord> {\r\n\r\n private _options: PersistentStoreOptions; // TODO: support\r\n\r\n static deleteAsync(name: string) {\r\n return StoreDb.deleteAsync(name);\r\n }\r\n\r\n static existsAsync(name: string) {\r\n return StoreDb.existsAsync(name);\r\n }\r\n\r\n static openAsync(name: string, options?: PersistentStoreOptions) {\r\n return StoreDb.openAsync(name, () => new PersistentStore(name, options));\r\n }\r\n\r\n constructor(name: string, options?: PersistentStoreOptions) {\r\n super(name, metadataFieldDefTemplate);\r\n this._options = { ...options, ...defaultPersistentStoreOptions };\r\n }\r\n}\r\n"],"names":["defaultPersistentStoreOptions","metadataFieldDefTemplate","PersistentStore","DataStore","name","StoreDb","options"],"mappings":";;AAWA,MAAMA,IAAgC;AAAA,EAClC,eAAe;AACnB,GAGMC,IAA2B,CAAC,QAAQ,aAAa,aAAa,MAAM;AAEnE,MAAMC,UAAsCC,EAA0B;AAAA,EAEjE;AAAA;AAAA,EAER,OAAO,YAAYC,GAAc;AAC7B,WAAOC,EAAQ,YAAYD,CAAI;AAAA,EACnC;AAAA,EAEA,OAAO,YAAYA,GAAc;AAC7B,WAAOC,EAAQ,YAAYD,CAAI;AAAA,EACnC;AAAA,EAEA,OAAO,UAAUA,GAAcE,GAAkC;AAC7D,WAAOD,EAAQ,UAAUD,GAAM,MAAM,IAAIF,EAAgBE,GAAME,CAAO,CAAC;AAAA,EAC3E;AAAA,EAEA,YAAYF,GAAcE,GAAkC;AACxD,UAAMF,GAAMH,CAAwB,GACpC,KAAK,WAAW,EAAE,GAAGK,GAAS,GAAGN,EAAA;AAAA,EACrC;AACJ;"}
|
|
@@ -1,7 +1,57 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { KeyPathValueMap } from './D:/Src/my/actdim/public/utico/src/typeCore';
|
|
2
|
+
import * as Dexie from "dexie";
|
|
3
|
+
export declare class MetadataRecord {
|
|
4
|
+
key?: string;
|
|
5
|
+
createdAt?: number;
|
|
6
|
+
updatedAt?: number;
|
|
7
|
+
tags?: string[];
|
|
8
|
+
}
|
|
9
|
+
export type DataRecord<TValue = any> = {
|
|
10
|
+
key: string;
|
|
11
|
+
value: TValue;
|
|
12
|
+
};
|
|
13
|
+
export type StoreItem<T extends MetadataRecord = MetadataRecord, TValue = any> = {
|
|
14
|
+
metadata?: T;
|
|
15
|
+
data?: DataRecord<TValue>;
|
|
16
|
+
};
|
|
17
|
+
export type ChangeSet<T, TKey = string> = {
|
|
18
|
+
key: TKey;
|
|
19
|
+
changes: KeyPathValueMap<T>;
|
|
6
20
|
};
|
|
21
|
+
export type BaseMetadataField = keyof MetadataRecord;
|
|
22
|
+
export type FieldDef<T extends string> = T | `&${T}` | `*${T}` | `++${T}`;
|
|
23
|
+
export type BaseFieldDef = FieldDef<BaseMetadataField>;
|
|
24
|
+
export type FieldDefTemplate<T extends string> = FieldDef<T>[];
|
|
25
|
+
export type IndexableType = Dexie.IndexableTypePart;
|
|
26
|
+
export type IndexableTypeArray = Dexie.IndexableTypeArray;
|
|
27
|
+
export type TransactionMode = Dexie.TransactionMode;
|
|
28
|
+
export type OrderDirection = "asc" | "desc";
|
|
29
|
+
export type StoreBase = {
|
|
30
|
+
openAsync(): PromiseLike<void>;
|
|
31
|
+
};
|
|
32
|
+
export interface IStoreCollection<T extends MetadataRecord = MetadataRecord, TValue = any> {
|
|
33
|
+
toArrayAsync(orderBy?: keyof T, orderDirection?: OrderDirection, transactionMode?: TransactionMode): Promise<StoreItem<T, TValue>[]>;
|
|
34
|
+
orderByAsync(field: keyof T, direction: OrderDirection, transactionMode?: TransactionMode): Promise<StoreItem<T, TValue>[]>;
|
|
35
|
+
filter<S extends T>(filter: (x: T) => x is S): IStoreCollection<S, TValue>;
|
|
36
|
+
limit(n: number): IStoreCollection<T, TValue>;
|
|
37
|
+
offset(n: number): IStoreCollection<T, TValue>;
|
|
38
|
+
getKeysAsync(): Promise<T["key"][]>;
|
|
39
|
+
getCountAsync(): Promise<number>;
|
|
40
|
+
modifyMetadataAsync(callback: (metadataRecord: T) => void, transactionMode?: TransactionMode): Promise<number>;
|
|
41
|
+
modifyDataAsync(callback: (dataRecord: DataRecord) => void, transactionMode?: TransactionMode): Promise<number>;
|
|
42
|
+
modifyAsync(metadataCallback: (metadataRecord: T) => void, dataCallback: (dataRecord: DataRecord) => void, transactionMode?: TransactionMode): Promise<number>;
|
|
43
|
+
}
|
|
44
|
+
export interface IPersistentStore<T extends MetadataRecord> {
|
|
45
|
+
openAsync(): Promise<void>;
|
|
46
|
+
getKeysAsync(): Promise<string[]>;
|
|
47
|
+
containsAsync(key: string): Promise<boolean>;
|
|
48
|
+
deleteAsync(key: string): Promise<void>;
|
|
49
|
+
bulkDeleteAsync(keys: string[]): Promise<void>;
|
|
50
|
+
clearAsync(): Promise<void>;
|
|
51
|
+
getAsync<TValue = any>(key: string): Promise<StoreItem<T, TValue>>;
|
|
52
|
+
setAsync<TValue = any>(metadataRecord: T, value: TValue): Promise<string>;
|
|
53
|
+
getOrSetAsync<TValue = any>(metadataRecord: MetadataRecord, factory: (metadataRecord: MetadataRecord) => TValue): Promise<StoreItem<T, TValue>>;
|
|
54
|
+
bulkGetAsync<TValue = any>(keys: string[]): Promise<StoreItem<T, TValue>[]>;
|
|
55
|
+
bulkSetAsync<TValue = any>(metadataRecords: MetadataRecord[], dataRecords: DataRecord<TValue>[]): Promise<string[]>;
|
|
56
|
+
}
|
|
7
57
|
//# sourceMappingURL=storeContracts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storeContracts.d.ts","sourceRoot":"","sources":["../../src/store/storeContracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"storeContracts.d.ts","sourceRoot":"","sources":["../../src/store/storeContracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
class a {
|
|
2
|
+
key;
|
|
3
|
+
createdAt;
|
|
4
|
+
updatedAt;
|
|
5
|
+
// lastModified
|
|
6
|
+
tags;
|
|
7
|
+
// timestamp?: number;
|
|
8
|
+
// weight?: number;
|
|
9
|
+
// score?: number;
|
|
10
|
+
// startDate?/endDate?
|
|
11
|
+
// validFrom?/validTo?
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
a as MetadataRecord
|
|
15
|
+
};
|
|
2
16
|
//# sourceMappingURL=storeContracts.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storeContracts.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"storeContracts.es.js","sources":["D:/Src/my/actdim/public/utico/src/store/storeContracts.ts"],"sourcesContent":["import { CommonPartFromSchema, KeyPathValueMap } from \"@/typeCore\";\r\nimport * as Dexie from \"dexie\";\r\n\r\n// Making some navigation properties non-enumerable will prevent them from being handled by IndexedDB\r\n// when doing put() or add().\r\n// Object.defineProperties(obj, {\r\n// ...: { value: [], enumerable: false, writable: true }\r\n// });\r\n\r\n// MetadataEntry\r\nexport class MetadataRecord {\r\n key?: string;\r\n createdAt?: number;\r\n updatedAt?: number; // lastModified\r\n tags?: string[];\r\n // timestamp?: number;\r\n // weight?: number;\r\n // score?: number;\r\n // startDate?/endDate?\r\n // validFrom?/validTo?\r\n}\r\n\r\n// DataEntry\r\nexport type DataRecord<TValue = any> = {\r\n key: string;\r\n value: TValue;\r\n}\r\n\r\nexport type StoreItem<T extends MetadataRecord = MetadataRecord, TValue = any> = {\r\n metadata?: T,\r\n data?: DataRecord<TValue>;\r\n}\r\n\r\nexport type ChangeSet<T, TKey = string> = {\r\n key: TKey;\r\n changes: KeyPathValueMap<T>;\r\n}\r\n\r\nexport type BaseMetadataField = keyof MetadataRecord;\r\n// ++: auto-increment primary key\r\n// &: unique\r\n// *: array\r\nexport type FieldDef<T extends string> = T | `&${T}` | `*${T}` | `++${T}`;\r\nexport type BaseFieldDef = FieldDef<BaseMetadataField>;\r\n\r\n// DbFieldTemplate\r\nexport type FieldDefTemplate<T extends string> = FieldDef<T>[];\r\n\r\nexport type IndexableType = Dexie.IndexableTypePart;\r\nexport type IndexableTypeArray = Dexie.IndexableTypeArray;\r\nexport type TransactionMode = Dexie.TransactionMode;\r\nexport type OrderDirection = \"asc\" | \"desc\";\r\n\r\nexport type StoreBase = {\r\n openAsync(): PromiseLike<void>;\r\n}\r\n\r\nexport interface IStoreCollection<T extends MetadataRecord = MetadataRecord, TValue = any> {\r\n\r\n toArrayAsync(orderBy?: keyof T, orderDirection?: OrderDirection, transactionMode?: TransactionMode): Promise<StoreItem<T, TValue>[]>;\r\n\r\n orderByAsync(field: keyof T, direction: OrderDirection, transactionMode?: TransactionMode): Promise<StoreItem<T, TValue>[]>;\r\n\r\n filter<S extends T>(filter: (x: T) => x is S): IStoreCollection<S, TValue>;\r\n\r\n limit(n: number): IStoreCollection<T, TValue>;\r\n\r\n offset(n: number): IStoreCollection<T, TValue>;\r\n\r\n getKeysAsync(): Promise<T[\"key\"][]>;\r\n\r\n getCountAsync(): Promise<number>;\r\n\r\n modifyMetadataAsync(callback: (metadataRecord: T) => void, transactionMode?: TransactionMode): Promise<number>;\r\n\r\n modifyDataAsync(callback: (dataRecord: DataRecord) => void, transactionMode?: TransactionMode): Promise<number>;\r\n\r\n modifyAsync(metadataCallback: (metadataRecord: T) => void, dataCallback: (dataRecord: DataRecord) => void, transactionMode?: TransactionMode): Promise<number>;\r\n}\r\n\r\n// IKVStore\r\nexport interface IPersistentStore<T extends MetadataRecord> {\r\n\r\n openAsync(): Promise<void>;\r\n\r\n getKeysAsync(): Promise<string[]>;\r\n\r\n containsAsync(key: string): Promise<boolean>;\r\n\r\n deleteAsync(key: string): Promise<void>;\r\n\r\n bulkDeleteAsync(keys: string[]): Promise<void>;\r\n\r\n clearAsync(): Promise<void>;\r\n\r\n getAsync<TValue = any>(key: string): Promise<StoreItem<T, TValue>>;\r\n\r\n setAsync<TValue = any>(metadataRecord: T, value: TValue): Promise<string>;\r\n\r\n getOrSetAsync<TValue = any>(metadataRecord: MetadataRecord, factory: (metadataRecord: MetadataRecord) => TValue): Promise<StoreItem<T, TValue>>\r\n\r\n bulkGetAsync<TValue = any>(keys: string[]): Promise<StoreItem<T, TValue>[]>;\r\n\r\n bulkSetAsync<TValue = any>(metadataRecords: MetadataRecord[], dataRecords: DataRecord<TValue>[]): Promise<string[]>;\r\n}"],"names":["MetadataRecord"],"mappings":"AAUO,MAAMA,EAAe;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMJ;"}
|