@procedures/collections 0.3.0 → 0.5.0
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/CHANGELOG.md +27 -0
- package/README.md +53 -3
- package/dist/.tsbuildinfo +1 -1
- package/dist/storage/interface.d.ts +25 -4
- package/dist/storage/interface.d.ts.map +1 -1
- package/dist/storage/interface.js.map +1 -1
- package/dist/storage/memory.d.ts +39 -7
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js +104 -53
- package/dist/storage/memory.js.map +1 -1
- package/dist/testing/check.d.ts +25 -0
- package/dist/testing/check.d.ts.map +1 -0
- package/dist/testing/check.js +85 -0
- package/dist/testing/check.js.map +1 -0
- package/dist/testing/index.d.ts +10 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +10 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/storage-contract.d.ts +70 -0
- package/dist/testing/storage-contract.d.ts.map +1 -0
- package/dist/testing/storage-contract.js +527 -0
- package/dist/testing/storage-contract.js.map +1 -0
- package/package.json +5 -1
- package/src/storage/interface.ts +26 -4
- package/src/storage/memory.ts +120 -54
- package/src/testing/check.ts +81 -0
- package/src/testing/index.ts +19 -0
- package/src/testing/storage-contract.ts +623 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-contract.js","sourceRoot":"","sources":["../../src/testing/storage-contract.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package",
|
|
3
3
|
"name": "@procedures/collections",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.5.0",
|
|
5
5
|
"description": "Collections for TypeScript: ArrayList, LinkedList, ArrayDeque, HashMap, LinkedHashMap, TreeMap (red-black), PriorityQueue, LRU and TTL maps, async queues, channels and collectors, tested with fast-check.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"collections",
|
|
@@ -36,6 +36,10 @@
|
|
|
36
36
|
".": {
|
|
37
37
|
"types": "./dist/index.d.ts",
|
|
38
38
|
"import": "./dist/index.js"
|
|
39
|
+
},
|
|
40
|
+
"./testing": {
|
|
41
|
+
"types": "./dist/testing/index.d.ts",
|
|
42
|
+
"import": "./dist/testing/index.js"
|
|
39
43
|
}
|
|
40
44
|
},
|
|
41
45
|
"files": [
|
package/src/storage/interface.ts
CHANGED
|
@@ -17,6 +17,15 @@
|
|
|
17
17
|
* All methods return Promise<T> to ensure consistent async behavior.
|
|
18
18
|
* This guarantees client code remains agnostic to the storage backend,
|
|
19
19
|
* enabling seamless switching between local and remote storage.
|
|
20
|
+
*
|
|
21
|
+
* The contract (the suite of `@procedures/collections/testing` tests it for each storage):
|
|
22
|
+
* - A storage keeps a copy of each value that a write takes, and each read gives a new copy. A
|
|
23
|
+
* change of a written or a read value does not change the stored item.
|
|
24
|
+
* - A stored `null` reads back as `null`. A missing id reads back as `undefined`.
|
|
25
|
+
* - The entries keep the order of the first set of each id, as a `Map` does.
|
|
26
|
+
* - A delta of `getChangesSince` follows the order of the last change of each id.
|
|
27
|
+
* - After `close()`, each operation rejects with an error whose message says "closed". A second
|
|
28
|
+
* `close()` does nothing.
|
|
20
29
|
*/
|
|
21
30
|
export interface CollectionStorage<T> {
|
|
22
31
|
//
|
|
@@ -27,7 +36,7 @@ export interface CollectionStorage<T> {
|
|
|
27
36
|
* Get item by ID.
|
|
28
37
|
*
|
|
29
38
|
* @param id - Item identifier
|
|
30
|
-
* @returns Promise resolving to item or undefined if not found
|
|
39
|
+
* @returns Promise resolving to a copy of the item, or undefined if not found. A stored null is null.
|
|
31
40
|
*/
|
|
32
41
|
get(id: string): Promise<T | undefined>;
|
|
33
42
|
|
|
@@ -46,9 +55,19 @@ export interface CollectionStorage<T> {
|
|
|
46
55
|
*/
|
|
47
56
|
getEntries?(): Promise<Array<[string, T]>>;
|
|
48
57
|
|
|
58
|
+
/**
|
|
59
|
+
* The ids of the items, in the order of the entries. The storage does not read or copy the
|
|
60
|
+
* values, so a sync that needs only the ids does not copy each item. A storage that cannot
|
|
61
|
+
* give the ids cheaply does not have this method, and a caller uses `getEntries()`.
|
|
62
|
+
*
|
|
63
|
+
* @returns Promise resolving to the ids, as a new array
|
|
64
|
+
*/
|
|
65
|
+
getIds?(): Promise<string[]>;
|
|
66
|
+
|
|
49
67
|
/**
|
|
50
68
|
* The changes after a version (roadmap R28). A storage without a change log does not have
|
|
51
|
-
* this method, and a sync uses `getEntries()`.
|
|
69
|
+
* this method, and a sync uses `getEntries()`. A full result follows the order of the entries.
|
|
70
|
+
* A delta follows the order of the last change of each id.
|
|
52
71
|
*
|
|
53
72
|
* @param since - A `version` that an earlier call gave. Without it, the result has all items.
|
|
54
73
|
* @returns Promise resolving to the changed items, the deleted ids and the new version
|
|
@@ -147,8 +166,9 @@ export interface CollectionStorage<T> {
|
|
|
147
166
|
flush?(): Promise<void>;
|
|
148
167
|
|
|
149
168
|
/**
|
|
150
|
-
*
|
|
151
|
-
*
|
|
169
|
+
* This method closes the storage and releases its resources. After it, each operation rejects
|
|
170
|
+
* with an error whose message says "closed". A second `close()` does nothing. A durable storage
|
|
171
|
+
* keeps its items for a new storage of the same place.
|
|
152
172
|
*
|
|
153
173
|
* @returns Promise resolving when cleanup completes
|
|
154
174
|
*/
|
|
@@ -172,6 +192,8 @@ export interface CollectionStorage<T> {
|
|
|
172
192
|
* the first call, a version of an older run, or a change log that dropped old deletes.
|
|
173
193
|
* - When `full` is false, `changed` has the items that changed after the version, and `deleted`
|
|
174
194
|
* has the ids that were deleted after it.
|
|
195
|
+
* - The order of a full result is the order of the entries. The order of a delta is the order of
|
|
196
|
+
* the last change of each id: an id that changed again comes after the ids that changed before.
|
|
175
197
|
*/
|
|
176
198
|
export interface StorageChanges<T> {
|
|
177
199
|
/** The version of the storage that includes these changes. */
|
package/src/storage/memory.ts
CHANGED
|
@@ -15,13 +15,28 @@ export interface InMemoryStorageOptions {
|
|
|
15
15
|
* @default 10000
|
|
16
16
|
*/
|
|
17
17
|
maxTombstones?: number;
|
|
18
|
+
/**
|
|
19
|
+
* True: the storage keeps a copy of each value that a write takes, and each read gives a new
|
|
20
|
+
* copy (`structuredClone`). Then a change of a written or a read value does not change the
|
|
21
|
+
* stored item, as in each other storage.
|
|
22
|
+
*
|
|
23
|
+
* False: the storage keeps the values themselves, and the reads give them. This is faster.
|
|
24
|
+
* Give it only when no caller changes a value after a write or a read.
|
|
25
|
+
* @default true
|
|
26
|
+
*/
|
|
27
|
+
copies?: boolean;
|
|
18
28
|
}
|
|
19
29
|
|
|
20
|
-
/** A new epoch: a version of another storage
|
|
30
|
+
/** A new epoch: a version of another storage does not match it. */
|
|
21
31
|
function newEpoch(): string {
|
|
22
32
|
return Math.random().toString(36).slice(2, 10);
|
|
23
33
|
}
|
|
24
34
|
|
|
35
|
+
/** The copy of a value: `structuredClone`, or the value itself without copies. */
|
|
36
|
+
type Copy = <V>(value: V) => V;
|
|
37
|
+
const same: Copy = (value) => value;
|
|
38
|
+
const clone: Copy = (value) => structuredClone(value);
|
|
39
|
+
|
|
25
40
|
/**
|
|
26
41
|
* In-memory storage backed by JavaScript Map.
|
|
27
42
|
*
|
|
@@ -30,7 +45,12 @@ function newEpoch(): string {
|
|
|
30
45
|
* - No persistence (data lost on restart)
|
|
31
46
|
* - Memory-bound (limited by available RAM)
|
|
32
47
|
* - Returns Promises for API consistency with remote storage
|
|
48
|
+
* - Each error is a rejected promise: an error of a `find` predicate does not throw at once
|
|
33
49
|
* - A change log: `getChangesSince(version)` gives the changes after a version (roadmap R28)
|
|
50
|
+
* - Copies: a change of a written or a read value does not change the stored item (the option
|
|
51
|
+
* `copies: false` turns this off)
|
|
52
|
+
* - `getIds()` gives the ids without a copy of the values
|
|
53
|
+
* - After `close()`, each operation rejects, and a second `close()` does nothing
|
|
34
54
|
*
|
|
35
55
|
* @example
|
|
36
56
|
* ```typescript
|
|
@@ -44,110 +64,133 @@ export class InMemoryStorage<T> implements CollectionStorage<T> {
|
|
|
44
64
|
|
|
45
65
|
// The change log (roadmap R28). Each write gets the next number of `seq`. A version is
|
|
46
66
|
// `<epoch>:<seq>`.
|
|
47
|
-
private epoch = newEpoch();
|
|
67
|
+
private readonly epoch = newEpoch();
|
|
48
68
|
private seq = 0;
|
|
49
|
-
/** The number of the last write of each id that has an item */
|
|
69
|
+
/** The number of the last write of each id that has an item, the oldest first */
|
|
50
70
|
private readonly changedAt = new Map<string, number>();
|
|
51
71
|
/** The number of the delete of each id that has no item, the oldest first (the tombstones) */
|
|
52
72
|
private readonly deletedAt = new Map<string, number>();
|
|
53
73
|
/** The log does not know the deletes at or below this number: they were dropped */
|
|
54
74
|
private floor = 0;
|
|
55
75
|
private readonly maxTombstones: number;
|
|
76
|
+
private readonly copy: Copy;
|
|
77
|
+
private closed = false;
|
|
56
78
|
|
|
57
79
|
constructor(options: InMemoryStorageOptions = {}) {
|
|
58
80
|
this.maxTombstones = Math.max(0, options.maxTombstones ?? 10_000);
|
|
81
|
+
this.copy = options.copies === false ? same : clone;
|
|
59
82
|
}
|
|
60
83
|
|
|
61
84
|
//
|
|
62
85
|
// ═══ Read Operations ═══
|
|
63
86
|
//
|
|
64
87
|
|
|
65
|
-
get(id: string): Promise<T | undefined> {
|
|
66
|
-
|
|
88
|
+
async get(id: string): Promise<T | undefined> {
|
|
89
|
+
this.checkOpen();
|
|
90
|
+
return this.copy(this.data.get(id));
|
|
67
91
|
}
|
|
68
92
|
|
|
69
|
-
getAll(): Promise<T[]> {
|
|
70
|
-
|
|
93
|
+
async getAll(): Promise<T[]> {
|
|
94
|
+
this.checkOpen();
|
|
95
|
+
return Array.from(this.data.values(), this.copy);
|
|
71
96
|
}
|
|
72
97
|
|
|
73
|
-
getEntries(): Promise<Array<[string, T]>> {
|
|
74
|
-
|
|
98
|
+
async getEntries(): Promise<Array<[string, T]>> {
|
|
99
|
+
this.checkOpen();
|
|
100
|
+
return this.copiedEntries();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** The ids of the items, in the order of the entries. This method copies no value. */
|
|
104
|
+
async getIds(): Promise<string[]> {
|
|
105
|
+
this.checkOpen();
|
|
106
|
+
return Array.from(this.data.keys());
|
|
75
107
|
}
|
|
76
108
|
|
|
77
109
|
/**
|
|
78
|
-
* The changes after a version (roadmap R28). A version of another storage,
|
|
79
|
-
*
|
|
110
|
+
* The changes after a version (roadmap R28). A version of another storage, or older than the
|
|
111
|
+
* dropped deletes, gives all items (`full: true`) in the order of the entries. A delta gives
|
|
112
|
+
* the changed items and the deleted ids in the order of the last change of each id.
|
|
80
113
|
*/
|
|
81
|
-
getChangesSince(since?: string): Promise<StorageChanges<T>> {
|
|
114
|
+
async getChangesSince(since?: string): Promise<StorageChanges<T>> {
|
|
115
|
+
this.checkOpen();
|
|
82
116
|
const version = `${this.epoch}:${this.seq}`;
|
|
83
117
|
const from = this.parseVersion(since);
|
|
84
118
|
if (from === undefined || from < this.floor) {
|
|
85
|
-
return
|
|
119
|
+
return { version, full: true, changed: this.copiedEntries(), deleted: [] };
|
|
86
120
|
}
|
|
87
121
|
const changed: Array<[string, T]> = [];
|
|
88
122
|
for (const [id, at] of this.changedAt) {
|
|
89
|
-
if (at > from) changed.push([id, this.data.get(id) as T]);
|
|
123
|
+
if (at > from) changed.push([id, this.copy(this.data.get(id) as T)]);
|
|
90
124
|
}
|
|
91
125
|
const deleted: string[] = [];
|
|
92
126
|
for (const [id, at] of this.deletedAt) {
|
|
93
127
|
if (at > from) deleted.push(id);
|
|
94
128
|
}
|
|
95
|
-
return
|
|
129
|
+
return { version, full: false, changed, deleted };
|
|
96
130
|
}
|
|
97
131
|
|
|
98
|
-
|
|
132
|
+
/** The items for which the predicate gives true. The predicate gets a copy of each item. */
|
|
133
|
+
async find(predicate: (item: T) => boolean): Promise<T[]> {
|
|
134
|
+
this.checkOpen();
|
|
99
135
|
const results: T[] = [];
|
|
100
|
-
for (const
|
|
136
|
+
for (const stored of this.data.values()) {
|
|
137
|
+
const item = this.copy(stored);
|
|
101
138
|
if (predicate(item)) {
|
|
102
139
|
results.push(item);
|
|
103
140
|
}
|
|
104
141
|
}
|
|
105
|
-
return
|
|
142
|
+
return results;
|
|
106
143
|
}
|
|
107
144
|
|
|
108
|
-
has(id: string): Promise<boolean> {
|
|
109
|
-
|
|
145
|
+
async has(id: string): Promise<boolean> {
|
|
146
|
+
this.checkOpen();
|
|
147
|
+
return this.data.has(id);
|
|
110
148
|
}
|
|
111
149
|
|
|
112
|
-
size(): Promise<number> {
|
|
113
|
-
|
|
150
|
+
async size(): Promise<number> {
|
|
151
|
+
this.checkOpen();
|
|
152
|
+
return this.data.size;
|
|
114
153
|
}
|
|
115
154
|
|
|
116
155
|
//
|
|
117
156
|
// ═══ Write Operations ═══
|
|
118
157
|
//
|
|
119
158
|
|
|
120
|
-
set(id: string, value: T): Promise<void> {
|
|
121
|
-
this.
|
|
159
|
+
async set(id: string, value: T): Promise<void> {
|
|
160
|
+
this.checkOpen();
|
|
161
|
+
this.data.set(id, this.copy(value));
|
|
122
162
|
this.noteSet(id);
|
|
123
|
-
return Promise.resolve();
|
|
124
163
|
}
|
|
125
164
|
|
|
126
|
-
delete(id: string): Promise<boolean> {
|
|
165
|
+
async delete(id: string): Promise<boolean> {
|
|
166
|
+
this.checkOpen();
|
|
127
167
|
const existed = this.data.delete(id);
|
|
128
168
|
if (existed) this.noteDelete(id);
|
|
129
|
-
return
|
|
169
|
+
return existed;
|
|
130
170
|
}
|
|
131
171
|
|
|
132
|
-
clear(): Promise<void> {
|
|
172
|
+
async clear(): Promise<void> {
|
|
173
|
+
this.checkOpen();
|
|
133
174
|
for (const id of this.data.keys()) this.noteDelete(id);
|
|
134
175
|
this.data.clear();
|
|
135
|
-
return Promise.resolve();
|
|
136
176
|
}
|
|
137
177
|
|
|
138
178
|
//
|
|
139
179
|
// ═══ Bulk Operations ═══
|
|
140
180
|
//
|
|
141
181
|
|
|
142
|
-
|
|
143
|
-
|
|
182
|
+
/** This method sets several items. When one value has no copy, nothing changes. */
|
|
183
|
+
async setBatch(items: Array<[string, T]>): Promise<void> {
|
|
184
|
+
this.checkOpen();
|
|
185
|
+
const copies = items.map(([id, value]): [string, T] => [id, this.copy(value)]);
|
|
186
|
+
for (const [id, value] of copies) {
|
|
144
187
|
this.data.set(id, value);
|
|
145
188
|
this.noteSet(id);
|
|
146
189
|
}
|
|
147
|
-
return Promise.resolve();
|
|
148
190
|
}
|
|
149
191
|
|
|
150
|
-
deleteBatch(ids: string[]): Promise<number> {
|
|
192
|
+
async deleteBatch(ids: string[]): Promise<number> {
|
|
193
|
+
this.checkOpen();
|
|
151
194
|
let deleted = 0;
|
|
152
195
|
for (const id of ids) {
|
|
153
196
|
if (this.data.delete(id)) {
|
|
@@ -155,49 +198,51 @@ export class InMemoryStorage<T> implements CollectionStorage<T> {
|
|
|
155
198
|
deleted++;
|
|
156
199
|
}
|
|
157
200
|
}
|
|
158
|
-
return
|
|
201
|
+
return deleted;
|
|
159
202
|
}
|
|
160
203
|
|
|
161
|
-
getBatch(ids: string[]): Promise<Map<string, T>> {
|
|
204
|
+
async getBatch(ids: string[]): Promise<Map<string, T>> {
|
|
205
|
+
this.checkOpen();
|
|
162
206
|
const result = new Map<string, T>();
|
|
163
207
|
for (const id of ids) {
|
|
164
208
|
const value = this.data.get(id);
|
|
165
209
|
if (value !== undefined) {
|
|
166
|
-
result.set(id, value);
|
|
210
|
+
result.set(id, this.copy(value));
|
|
167
211
|
}
|
|
168
212
|
}
|
|
169
|
-
return
|
|
213
|
+
return result;
|
|
170
214
|
}
|
|
171
215
|
|
|
172
216
|
//
|
|
173
217
|
// ═══ Lifecycle & Metadata ═══
|
|
174
218
|
//
|
|
175
219
|
|
|
176
|
-
|
|
177
|
-
|
|
220
|
+
/**
|
|
221
|
+
* This method closes the storage and drops its items. After it, each operation rejects (and
|
|
222
|
+
* each method of the `Map` interface throws). A second `close()` does nothing.
|
|
223
|
+
*/
|
|
224
|
+
async close(): Promise<void> {
|
|
225
|
+
if (this.closed) return;
|
|
226
|
+
this.closed = true;
|
|
178
227
|
this.data.clear();
|
|
179
|
-
// A new epoch: a version of the closed storage gives all items
|
|
180
228
|
this.changedAt.clear();
|
|
181
229
|
this.deletedAt.clear();
|
|
182
|
-
this.epoch = newEpoch();
|
|
183
|
-
this.seq = 0;
|
|
184
|
-
this.floor = 0;
|
|
185
|
-
return Promise.resolve();
|
|
186
230
|
}
|
|
187
231
|
|
|
188
|
-
getMetadata(): Promise<StorageMetadata> {
|
|
232
|
+
async getMetadata(): Promise<StorageMetadata> {
|
|
233
|
+
this.checkOpen();
|
|
189
234
|
// Rough memory estimation:
|
|
190
235
|
// Each entry has ~overhead of 100 bytes (key string + Map entry overhead)
|
|
191
236
|
const estimatedEntrySize = 100;
|
|
192
237
|
const memoryUsage = this.data.size * estimatedEntrySize;
|
|
193
238
|
|
|
194
|
-
return
|
|
239
|
+
return {
|
|
195
240
|
type: "memory",
|
|
196
241
|
size: this.data.size,
|
|
197
242
|
stats: {
|
|
198
243
|
memoryUsage,
|
|
199
244
|
},
|
|
200
|
-
}
|
|
245
|
+
};
|
|
201
246
|
}
|
|
202
247
|
|
|
203
248
|
//
|
|
@@ -210,48 +255,69 @@ export class InMemoryStorage<T> implements CollectionStorage<T> {
|
|
|
210
255
|
* @returns Iterator of keys
|
|
211
256
|
*/
|
|
212
257
|
keys(): IterableIterator<string> {
|
|
258
|
+
this.checkOpen();
|
|
213
259
|
return this.data.keys();
|
|
214
260
|
}
|
|
215
261
|
|
|
216
262
|
/**
|
|
217
|
-
*
|
|
263
|
+
* The values in storage: copies, unless the option `copies` is false.
|
|
218
264
|
*
|
|
219
265
|
* @returns Iterator of values
|
|
220
266
|
*/
|
|
221
267
|
values(): IterableIterator<T> {
|
|
222
|
-
|
|
268
|
+
this.checkOpen();
|
|
269
|
+
return this.copiedEntries().map(([, value]) => value)[Symbol.iterator]();
|
|
223
270
|
}
|
|
224
271
|
|
|
225
272
|
/**
|
|
226
|
-
*
|
|
273
|
+
* The entries in storage: copies of the values, unless the option `copies` is false.
|
|
227
274
|
*
|
|
228
275
|
* @returns Iterator of [id, value] tuples
|
|
229
276
|
*/
|
|
230
277
|
entries(): IterableIterator<[string, T]> {
|
|
231
|
-
|
|
278
|
+
this.checkOpen();
|
|
279
|
+
return this.copiedEntries()[Symbol.iterator]();
|
|
232
280
|
}
|
|
233
281
|
|
|
234
282
|
/**
|
|
235
|
-
* Iterate over storage entries.
|
|
283
|
+
* Iterate over storage entries. The callback gets a copy of each value, and a `Map` of the
|
|
284
|
+
* copies, unless the option `copies` is false.
|
|
236
285
|
*
|
|
237
286
|
* @param callback - Function to call for each entry
|
|
238
287
|
*/
|
|
239
288
|
forEach(callback: (value: T, key: string, map: Map<string, T>) => void): void {
|
|
240
|
-
this.
|
|
289
|
+
this.checkOpen();
|
|
290
|
+
new Map(this.copiedEntries()).forEach(callback);
|
|
241
291
|
}
|
|
242
292
|
|
|
243
293
|
/**
|
|
244
294
|
* Make storage iterable.
|
|
245
295
|
*/
|
|
246
296
|
[Symbol.iterator](): IterableIterator<[string, T]> {
|
|
247
|
-
return this.
|
|
297
|
+
return this.entries();
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
//
|
|
301
|
+
// ═══ Internal Helpers ═══
|
|
302
|
+
//
|
|
303
|
+
|
|
304
|
+
/** This method throws after `close()`. In an async method, the throw rejects the promise. */
|
|
305
|
+
private checkOpen(): void {
|
|
306
|
+
if (this.closed) throw new Error("The InMemoryStorage is closed");
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/** The entries with copies of the values. */
|
|
310
|
+
private copiedEntries(): Array<[string, T]> {
|
|
311
|
+
return Array.from(this.data, ([id, value]): [string, T] => [id, this.copy(value)]);
|
|
248
312
|
}
|
|
249
313
|
|
|
250
314
|
//
|
|
251
315
|
// ═══ The change log ═══
|
|
252
316
|
//
|
|
253
317
|
|
|
318
|
+
/** A set moves the id to the end of the order of the log: the order of the last change. */
|
|
254
319
|
private noteSet(id: string): void {
|
|
320
|
+
this.changedAt.delete(id);
|
|
255
321
|
this.changedAt.set(id, ++this.seq);
|
|
256
322
|
this.deletedAt.delete(id);
|
|
257
323
|
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The checks of the contract suite. The suite does not import a test framework, so a runtime
|
|
3
|
+
* entry of this package never loads one. A failed check throws `ContractViolation`.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/** The error of a failed check of the contract suite. */
|
|
7
|
+
export class ContractViolation extends Error {
|
|
8
|
+
override readonly name = "ContractViolation";
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** This function gives the text of a value for a message: JSON, with a `Map` as its entries. */
|
|
12
|
+
export function show(value: unknown): string {
|
|
13
|
+
if (value === undefined) return "undefined";
|
|
14
|
+
try {
|
|
15
|
+
return JSON.stringify(value, (_key, item: unknown) => (item instanceof Map ? { Map: [...item.entries()] } : item === undefined ? "<undefined>" : item));
|
|
16
|
+
} catch {
|
|
17
|
+
return String(value);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
22
|
+
if (typeof value !== "object" || value === null) return false;
|
|
23
|
+
const prototype = Object.getPrototypeOf(value) as unknown;
|
|
24
|
+
return prototype === Object.prototype || prototype === null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* This function compares two values deeply: JSON values, arrays, plain objects and maps. Two maps
|
|
29
|
+
* are equal when they have the same keys with equal values, in any order.
|
|
30
|
+
*/
|
|
31
|
+
export function deepEqual(actual: unknown, expected: unknown): boolean {
|
|
32
|
+
if (Object.is(actual, expected)) return true;
|
|
33
|
+
if (actual instanceof Map && expected instanceof Map) {
|
|
34
|
+
if (actual.size !== expected.size) return false;
|
|
35
|
+
for (const [key, value] of actual) {
|
|
36
|
+
if (!expected.has(key) || !deepEqual(value, expected.get(key))) return false;
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
if (Array.isArray(actual) && Array.isArray(expected)) {
|
|
41
|
+
return actual.length === expected.length && actual.every((item, index) => deepEqual(item, expected[index]));
|
|
42
|
+
}
|
|
43
|
+
if (isPlainObject(actual) && isPlainObject(expected)) {
|
|
44
|
+
const keys = Object.keys(actual);
|
|
45
|
+
if (keys.length !== Object.keys(expected).length) return false;
|
|
46
|
+
return keys.every((key) => Object.prototype.hasOwnProperty.call(expected, key) && deepEqual(actual[key], expected[key]));
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** This function throws `ContractViolation` when the two values are not deeply equal. */
|
|
52
|
+
export function same(actual: unknown, expected: unknown, what: string): void {
|
|
53
|
+
if (!deepEqual(actual, expected)) {
|
|
54
|
+
throw new ContractViolation(`${what}: expected ${show(expected)}, got ${show(actual)}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** This function throws `ContractViolation` when the condition is false. */
|
|
59
|
+
export function holds(condition: boolean, what: string): void {
|
|
60
|
+
if (!condition) throw new ContractViolation(what);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* This function starts an operation that must fail with a rejected promise, and gives the error.
|
|
65
|
+
* A synchronous throw breaks the contract too: each method of a storage gives a promise.
|
|
66
|
+
*/
|
|
67
|
+
export async function rejects(start: () => Promise<unknown>, what: string): Promise<unknown> {
|
|
68
|
+
let promise: Promise<unknown>;
|
|
69
|
+
try {
|
|
70
|
+
promise = start();
|
|
71
|
+
} catch (error) {
|
|
72
|
+
throw new ContractViolation(`${what}: the method threw at once (${show(error instanceof Error ? error.message : error)}), and did not give a rejected promise`);
|
|
73
|
+
}
|
|
74
|
+
holds(typeof promise?.then === "function", `${what}: the method did not give a promise`);
|
|
75
|
+
try {
|
|
76
|
+
await promise;
|
|
77
|
+
} catch (error) {
|
|
78
|
+
return error;
|
|
79
|
+
}
|
|
80
|
+
throw new ContractViolation(`${what}: the promise did not reject`);
|
|
81
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@procedures/collections/testing`: the test-only entry of this package.
|
|
3
|
+
*
|
|
4
|
+
* This entry holds the contract suite of `CollectionStorage`. A storage package runs it in its
|
|
5
|
+
* tests with a factory of its storage. The entry imports no test framework: the caller gives
|
|
6
|
+
* `describe` and `it`. The runtime entries of the package do not import this entry.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export {
|
|
10
|
+
collectionStorageContract,
|
|
11
|
+
describeCollectionStorageContract,
|
|
12
|
+
type CollectionStorageContractOptions,
|
|
13
|
+
type ContractCase,
|
|
14
|
+
type ContractItem,
|
|
15
|
+
type ContractStorage,
|
|
16
|
+
type ContractTestApi,
|
|
17
|
+
type ContractTestContext,
|
|
18
|
+
} from "./storage-contract.js";
|
|
19
|
+
export { ContractViolation, deepEqual } from "./check.js";
|