@forge/kvs 1.2.7-next.0-experimental-d997307 → 1.2.7-next.0-experimental-44a932f
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/out/__test__/index.test.js +18 -432
- package/out/entity-query.d.ts +2 -3
- package/out/entity-query.d.ts.map +1 -1
- package/out/entity-query.js +3 -10
- package/out/entity.d.ts +4 -6
- package/out/entity.d.ts.map +1 -1
- package/out/entity.js +4 -5
- package/out/interfaces/entity-query.d.ts +1 -2
- package/out/interfaces/entity-query.d.ts.map +1 -1
- package/out/interfaces/kvs-api.d.ts +10 -19
- package/out/interfaces/kvs-api.d.ts.map +1 -1
- package/out/interfaces/kvs.d.ts +6 -13
- package/out/interfaces/kvs.d.ts.map +1 -1
- package/out/interfaces/query.d.ts +1 -2
- package/out/interfaces/query.d.ts.map +1 -1
- package/out/interfaces/transaction.d.ts +1 -3
- package/out/interfaces/transaction.d.ts.map +1 -1
- package/out/interfaces/types.d.ts +1 -32
- package/out/interfaces/types.d.ts.map +1 -1
- package/out/interfaces/types.js +1 -6
- package/out/kvs.d.ts +5 -10
- package/out/kvs.d.ts.map +1 -1
- package/out/kvs.js +6 -6
- package/out/query.d.ts.map +1 -1
- package/out/query.js +1 -5
- package/out/storage-api.d.ts +4 -5
- package/out/storage-api.d.ts.map +1 -1
- package/out/storage-api.js +24 -52
- package/out/transaction-api.d.ts +1 -2
- package/out/transaction-api.d.ts.map +1 -1
- package/out/transaction-api.js +2 -3
- package/out/utils/transaction-request-builder.d.ts.map +1 -1
- package/out/utils/transaction-request-builder.js +2 -3
- package/package.json +2 -2
|
@@ -30,62 +30,23 @@ describe('KVS', () => {
|
|
|
30
30
|
body: JSON.stringify({ key: 'foo' })
|
|
31
31
|
}));
|
|
32
32
|
});
|
|
33
|
-
it('should get with metadata fields correctly
|
|
34
|
-
const response = new Response(JSON.stringify({
|
|
35
|
-
key: 'foo',
|
|
36
|
-
value: 'bar',
|
|
37
|
-
createdAt: 1718236800,
|
|
38
|
-
updatedAt: 1718236800,
|
|
39
|
-
expireTime: '2025-01-12T13:00:00Z'
|
|
40
|
-
}), {
|
|
33
|
+
it('should get with metadata fields correctly', async () => {
|
|
34
|
+
const response = new Response(JSON.stringify({ key: 'foo', value: 'bar', createdAt: 1718236800, updatedAt: 1718236800 }), {
|
|
41
35
|
status: 200,
|
|
42
36
|
headers: { 'x-trace-id': traceId }
|
|
43
37
|
});
|
|
44
38
|
const { sut, apiClient } = prepare(response);
|
|
45
|
-
const rs = await sut.get('foo', {
|
|
46
|
-
metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
47
|
-
});
|
|
39
|
+
const rs = await sut.get('foo', { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT] });
|
|
48
40
|
expect(rs).toEqual({
|
|
49
41
|
key: 'foo',
|
|
50
42
|
value: 'bar',
|
|
51
43
|
createdAt: 1718236800,
|
|
52
|
-
updatedAt: 1718236800
|
|
53
|
-
expireTime: '2025-01-12T13:00:00Z'
|
|
44
|
+
updatedAt: 1718236800
|
|
54
45
|
});
|
|
55
46
|
expect(apiClient).toHaveBeenCalledWith('/api/v1/get', expect.objectContaining({
|
|
56
47
|
body: JSON.stringify({
|
|
57
48
|
key: 'foo',
|
|
58
|
-
options: { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT
|
|
59
|
-
})
|
|
60
|
-
}));
|
|
61
|
-
});
|
|
62
|
-
it('should get with metadata fields correctly for entity.get', async () => {
|
|
63
|
-
const response = new Response(JSON.stringify({
|
|
64
|
-
key: 'key-foo',
|
|
65
|
-
value: { foo: 'bar' },
|
|
66
|
-
createdAt: 1718236800,
|
|
67
|
-
updatedAt: 1718236800,
|
|
68
|
-
expireTime: '2025-01-12T13:00:00Z'
|
|
69
|
-
}), {
|
|
70
|
-
status: 200,
|
|
71
|
-
headers: { 'x-trace-id': traceId }
|
|
72
|
-
});
|
|
73
|
-
const { sut, apiClient } = prepare(response);
|
|
74
|
-
const rs = await sut.entity('foo').get('key-foo', {
|
|
75
|
-
metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
76
|
-
});
|
|
77
|
-
expect(rs).toEqual({
|
|
78
|
-
key: 'key-foo',
|
|
79
|
-
value: { foo: 'bar' },
|
|
80
|
-
createdAt: 1718236800,
|
|
81
|
-
updatedAt: 1718236800,
|
|
82
|
-
expireTime: '2025-01-12T13:00:00Z'
|
|
83
|
-
});
|
|
84
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/get', expect.objectContaining({
|
|
85
|
-
body: JSON.stringify({
|
|
86
|
-
entityName: 'foo',
|
|
87
|
-
key: 'key-foo',
|
|
88
|
-
options: { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME] }
|
|
49
|
+
options: { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT] }
|
|
89
50
|
})
|
|
90
51
|
}));
|
|
91
52
|
});
|
|
@@ -143,31 +104,22 @@ describe('KVS', () => {
|
|
|
143
104
|
}));
|
|
144
105
|
});
|
|
145
106
|
it('should getSecret with metadata fields correctly', async () => {
|
|
146
|
-
const response = new Response(JSON.stringify({
|
|
147
|
-
key: 'foo',
|
|
148
|
-
value: 'bar',
|
|
149
|
-
createdAt: 1718236800,
|
|
150
|
-
updatedAt: 1718236800,
|
|
151
|
-
expireTime: '2025-01-12T13:00:00Z'
|
|
152
|
-
}), {
|
|
107
|
+
const response = new Response(JSON.stringify({ key: 'foo', value: 'bar', createdAt: 1718236800, updatedAt: 1718236800 }), {
|
|
153
108
|
status: 200,
|
|
154
109
|
headers: { 'x-trace-id': traceId }
|
|
155
110
|
});
|
|
156
111
|
const { sut, apiClient } = prepare(response);
|
|
157
|
-
const rs = await sut.getSecret('foo', {
|
|
158
|
-
metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
159
|
-
});
|
|
112
|
+
const rs = await sut.getSecret('foo', { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT] });
|
|
160
113
|
expect(rs).toEqual({
|
|
161
114
|
key: 'foo',
|
|
162
115
|
value: 'bar',
|
|
163
116
|
createdAt: 1718236800,
|
|
164
|
-
updatedAt: 1718236800
|
|
165
|
-
expireTime: '2025-01-12T13:00:00Z'
|
|
117
|
+
updatedAt: 1718236800
|
|
166
118
|
});
|
|
167
119
|
expect(apiClient).toHaveBeenCalledWith('/api/v1/secret/get', expect.objectContaining({
|
|
168
120
|
body: JSON.stringify({
|
|
169
121
|
key: 'foo',
|
|
170
|
-
options: { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT
|
|
122
|
+
options: { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT] }
|
|
171
123
|
})
|
|
172
124
|
}));
|
|
173
125
|
});
|
|
@@ -196,32 +148,25 @@ describe('KVS', () => {
|
|
|
196
148
|
}));
|
|
197
149
|
});
|
|
198
150
|
it('should getEntity with metadata fields correctly', async () => {
|
|
199
|
-
const response = new Response(JSON.stringify({
|
|
200
|
-
key: 'foo',
|
|
201
|
-
value: { name: 'Jane Doe' },
|
|
202
|
-
createdAt: 1718236800,
|
|
203
|
-
updatedAt: 1718236800,
|
|
204
|
-
expireTime: '2025-01-12T13:00:00Z'
|
|
205
|
-
}), {
|
|
151
|
+
const response = new Response(JSON.stringify({ key: 'foo', value: { name: 'Jane Doe' }, createdAt: 1718236800, updatedAt: 1718236800 }), {
|
|
206
152
|
status: 200,
|
|
207
153
|
headers: { 'x-trace-id': traceId }
|
|
208
154
|
});
|
|
209
155
|
const { sut, apiClient } = prepare(response);
|
|
210
156
|
const rs = await sut
|
|
211
157
|
.entity('employees')
|
|
212
|
-
.get('foo', { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT
|
|
158
|
+
.get('foo', { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT] });
|
|
213
159
|
expect(rs).toEqual({
|
|
214
160
|
key: 'foo',
|
|
215
161
|
value: { name: 'Jane Doe' },
|
|
216
162
|
createdAt: 1718236800,
|
|
217
|
-
updatedAt: 1718236800
|
|
218
|
-
expireTime: '2025-01-12T13:00:00Z'
|
|
163
|
+
updatedAt: 1718236800
|
|
219
164
|
});
|
|
220
165
|
expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/get', expect.objectContaining({
|
|
221
166
|
body: JSON.stringify({
|
|
222
167
|
entityName: 'employees',
|
|
223
168
|
key: 'foo',
|
|
224
|
-
options: { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT
|
|
169
|
+
options: { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT] }
|
|
225
170
|
})
|
|
226
171
|
}));
|
|
227
172
|
});
|
|
@@ -249,93 +194,6 @@ describe('KVS', () => {
|
|
|
249
194
|
body: JSON.stringify({ key: 'foo', value: 'bar' })
|
|
250
195
|
}));
|
|
251
196
|
});
|
|
252
|
-
it('should set correctly with TTL', async () => {
|
|
253
|
-
const response = new Response(undefined, {
|
|
254
|
-
status: 204,
|
|
255
|
-
headers: { 'x-trace-id': traceId }
|
|
256
|
-
});
|
|
257
|
-
const { sut, apiClient } = prepare(response);
|
|
258
|
-
const rs = await sut.set('foo', 'bar', { ttl: { value: 5, unit: 'MINUTES' } });
|
|
259
|
-
expect(rs).toBeUndefined();
|
|
260
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/set', expect.objectContaining({
|
|
261
|
-
body: JSON.stringify({ key: 'foo', value: 'bar', options: { ttl: { value: 5, unit: 'MINUTES' } } })
|
|
262
|
-
}));
|
|
263
|
-
});
|
|
264
|
-
it('should set correctly with keyPolicy "FAIL_IF_EXISTS"', async () => {
|
|
265
|
-
const response = new Response(undefined, {
|
|
266
|
-
status: 204,
|
|
267
|
-
headers: { 'x-trace-id': traceId }
|
|
268
|
-
});
|
|
269
|
-
const { sut, apiClient } = prepare(response);
|
|
270
|
-
const rs = await sut.set('foo', 'bar', { ttl: { value: 5, unit: 'MINUTES' }, keyPolicy: 'FAIL_IF_EXISTS' });
|
|
271
|
-
expect(rs).toBeUndefined();
|
|
272
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/set', expect.objectContaining({
|
|
273
|
-
body: JSON.stringify({
|
|
274
|
-
key: 'foo',
|
|
275
|
-
value: 'bar',
|
|
276
|
-
options: { ttl: { value: 5, unit: 'MINUTES' }, keyPolicy: 'FAIL_IF_EXISTS' }
|
|
277
|
-
})
|
|
278
|
-
}));
|
|
279
|
-
});
|
|
280
|
-
it('should set correctly with keyPolicy "OVERRIDE" and return value', async () => {
|
|
281
|
-
const responseBody = {
|
|
282
|
-
key: 'foo',
|
|
283
|
-
value: 'bar',
|
|
284
|
-
createdAt: Date.now(),
|
|
285
|
-
updatedAt: Date.now(),
|
|
286
|
-
expireTime: '2025-01-12T13:00:00Z'
|
|
287
|
-
};
|
|
288
|
-
const response = new Response(JSON.stringify(responseBody), {
|
|
289
|
-
status: 200,
|
|
290
|
-
headers: { 'x-trace-id': traceId }
|
|
291
|
-
});
|
|
292
|
-
const { sut, apiClient } = prepare(response);
|
|
293
|
-
const rs = await sut.set('foo', 'bar', {
|
|
294
|
-
ttl: { value: 5, unit: 'MINUTES' },
|
|
295
|
-
keyPolicy: 'OVERRIDE',
|
|
296
|
-
returnValue: 'LATEST',
|
|
297
|
-
returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
298
|
-
});
|
|
299
|
-
expect(rs).toEqual(responseBody);
|
|
300
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/set', expect.objectContaining({
|
|
301
|
-
body: JSON.stringify({
|
|
302
|
-
key: 'foo',
|
|
303
|
-
value: 'bar',
|
|
304
|
-
options: {
|
|
305
|
-
ttl: { value: 5, unit: 'MINUTES' },
|
|
306
|
-
keyPolicy: 'OVERRIDE',
|
|
307
|
-
returnValue: 'LATEST',
|
|
308
|
-
returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
309
|
-
}
|
|
310
|
-
})
|
|
311
|
-
}));
|
|
312
|
-
});
|
|
313
|
-
it('should set and return undefined when no previous value exists', async () => {
|
|
314
|
-
const response = new Response(undefined, {
|
|
315
|
-
status: 204,
|
|
316
|
-
headers: { 'x-trace-id': traceId }
|
|
317
|
-
});
|
|
318
|
-
const { sut, apiClient } = prepare(response);
|
|
319
|
-
const rs = await sut.set('foo', 'bar', {
|
|
320
|
-
ttl: { value: 5, unit: 'MINUTES' },
|
|
321
|
-
keyPolicy: 'OVERRIDE',
|
|
322
|
-
returnValue: 'PREVIOUS',
|
|
323
|
-
returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
324
|
-
});
|
|
325
|
-
expect(rs).toEqual(undefined);
|
|
326
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/set', expect.objectContaining({
|
|
327
|
-
body: JSON.stringify({
|
|
328
|
-
key: 'foo',
|
|
329
|
-
value: 'bar',
|
|
330
|
-
options: {
|
|
331
|
-
ttl: { value: 5, unit: 'MINUTES' },
|
|
332
|
-
keyPolicy: 'OVERRIDE',
|
|
333
|
-
returnValue: 'PREVIOUS',
|
|
334
|
-
returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
335
|
-
}
|
|
336
|
-
})
|
|
337
|
-
}));
|
|
338
|
-
});
|
|
339
197
|
it('should setSecret correctly', async () => {
|
|
340
198
|
const response = new Response(undefined, {
|
|
341
199
|
status: 204,
|
|
@@ -348,93 +206,6 @@ describe('KVS', () => {
|
|
|
348
206
|
body: JSON.stringify({ key: 'foo', value: 'bar' })
|
|
349
207
|
}));
|
|
350
208
|
});
|
|
351
|
-
it('should setSecret correctly with TTL', async () => {
|
|
352
|
-
const response = new Response(undefined, {
|
|
353
|
-
status: 204,
|
|
354
|
-
headers: { 'x-trace-id': traceId }
|
|
355
|
-
});
|
|
356
|
-
const { sut, apiClient } = prepare(response);
|
|
357
|
-
const rs = await sut.setSecret('foo', 'bar', { ttl: { value: 5, unit: 'MINUTES' } });
|
|
358
|
-
expect(rs).toBeUndefined();
|
|
359
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/secret/set', expect.objectContaining({
|
|
360
|
-
body: JSON.stringify({ key: 'foo', value: 'bar', options: { ttl: { value: 5, unit: 'MINUTES' } } })
|
|
361
|
-
}));
|
|
362
|
-
});
|
|
363
|
-
it('should setSecret correctly with keyPolicy "FAIL_IF_EXISTS"', async () => {
|
|
364
|
-
const response = new Response(undefined, {
|
|
365
|
-
status: 204,
|
|
366
|
-
headers: { 'x-trace-id': traceId }
|
|
367
|
-
});
|
|
368
|
-
const { sut, apiClient } = prepare(response);
|
|
369
|
-
const rs = await sut.setSecret('foo', 'bar', { ttl: { value: 5, unit: 'MINUTES' }, keyPolicy: 'FAIL_IF_EXISTS' });
|
|
370
|
-
expect(rs).toBeUndefined();
|
|
371
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/secret/set', expect.objectContaining({
|
|
372
|
-
body: JSON.stringify({
|
|
373
|
-
key: 'foo',
|
|
374
|
-
value: 'bar',
|
|
375
|
-
options: { ttl: { value: 5, unit: 'MINUTES' }, keyPolicy: 'FAIL_IF_EXISTS' }
|
|
376
|
-
})
|
|
377
|
-
}));
|
|
378
|
-
});
|
|
379
|
-
it('should setSecret correctly with keyPolicy "OVERRIDE" and return value', async () => {
|
|
380
|
-
const responseBody = {
|
|
381
|
-
key: 'foo',
|
|
382
|
-
value: 'bar',
|
|
383
|
-
createdAt: Date.now(),
|
|
384
|
-
updatedAt: Date.now(),
|
|
385
|
-
expireTime: '2025-01-12T13:00:00Z'
|
|
386
|
-
};
|
|
387
|
-
const response = new Response(JSON.stringify(responseBody), {
|
|
388
|
-
status: 200,
|
|
389
|
-
headers: { 'x-trace-id': traceId }
|
|
390
|
-
});
|
|
391
|
-
const { sut, apiClient } = prepare(response);
|
|
392
|
-
const rs = await sut.setSecret('foo', 'bar', {
|
|
393
|
-
ttl: { value: 5, unit: 'MINUTES' },
|
|
394
|
-
keyPolicy: 'OVERRIDE',
|
|
395
|
-
returnValue: 'LATEST',
|
|
396
|
-
returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
397
|
-
});
|
|
398
|
-
expect(rs).toEqual(responseBody);
|
|
399
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/secret/set', expect.objectContaining({
|
|
400
|
-
body: JSON.stringify({
|
|
401
|
-
key: 'foo',
|
|
402
|
-
value: 'bar',
|
|
403
|
-
options: {
|
|
404
|
-
ttl: { value: 5, unit: 'MINUTES' },
|
|
405
|
-
keyPolicy: 'OVERRIDE',
|
|
406
|
-
returnValue: 'LATEST',
|
|
407
|
-
returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
408
|
-
}
|
|
409
|
-
})
|
|
410
|
-
}));
|
|
411
|
-
});
|
|
412
|
-
it('should setSecret and return undefined when no previous value exists', async () => {
|
|
413
|
-
const response = new Response(undefined, {
|
|
414
|
-
status: 204,
|
|
415
|
-
headers: { 'x-trace-id': traceId }
|
|
416
|
-
});
|
|
417
|
-
const { sut, apiClient } = prepare(response);
|
|
418
|
-
const rs = await sut.setSecret('foo', 'bar', {
|
|
419
|
-
ttl: { value: 5, unit: 'MINUTES' },
|
|
420
|
-
keyPolicy: 'OVERRIDE',
|
|
421
|
-
returnValue: 'PREVIOUS',
|
|
422
|
-
returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
423
|
-
});
|
|
424
|
-
expect(rs).toEqual(undefined);
|
|
425
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/secret/set', expect.objectContaining({
|
|
426
|
-
body: JSON.stringify({
|
|
427
|
-
key: 'foo',
|
|
428
|
-
value: 'bar',
|
|
429
|
-
options: {
|
|
430
|
-
ttl: { value: 5, unit: 'MINUTES' },
|
|
431
|
-
keyPolicy: 'OVERRIDE',
|
|
432
|
-
returnValue: 'PREVIOUS',
|
|
433
|
-
returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
434
|
-
}
|
|
435
|
-
})
|
|
436
|
-
}));
|
|
437
|
-
});
|
|
438
209
|
it('should setEntity correctly', async () => {
|
|
439
210
|
const response = new Response(undefined, {
|
|
440
211
|
status: 204,
|
|
@@ -447,103 +218,6 @@ describe('KVS', () => {
|
|
|
447
218
|
body: JSON.stringify({ entityName: 'employees', key: 'foo', value: { name: 'Jane Doe' } })
|
|
448
219
|
}));
|
|
449
220
|
});
|
|
450
|
-
it('should setEntity correctly with TTL', async () => {
|
|
451
|
-
const response = new Response(undefined, {
|
|
452
|
-
status: 204,
|
|
453
|
-
headers: { 'x-trace-id': traceId }
|
|
454
|
-
});
|
|
455
|
-
const { sut, apiClient } = prepare(response);
|
|
456
|
-
const rs = await sut.entity('employees').set('foo', { name: 'Jane Doe' }, { ttl: { value: 5, unit: 'MINUTES' } });
|
|
457
|
-
expect(rs).toBeUndefined();
|
|
458
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/set', expect.objectContaining({
|
|
459
|
-
body: JSON.stringify({
|
|
460
|
-
entityName: 'employees',
|
|
461
|
-
key: 'foo',
|
|
462
|
-
value: { name: 'Jane Doe' },
|
|
463
|
-
options: { ttl: { value: 5, unit: 'MINUTES' } }
|
|
464
|
-
})
|
|
465
|
-
}));
|
|
466
|
-
});
|
|
467
|
-
it('should setEntity correctly with "FAIL_IF_EXISTS"', async () => {
|
|
468
|
-
const response = new Response(undefined, {
|
|
469
|
-
status: 204,
|
|
470
|
-
headers: { 'x-trace-id': traceId }
|
|
471
|
-
});
|
|
472
|
-
const { sut, apiClient } = prepare(response);
|
|
473
|
-
const rs = await sut
|
|
474
|
-
.entity('employees')
|
|
475
|
-
.set('foo', { name: 'Jane Doe' }, { ttl: { value: 5, unit: 'MINUTES' }, keyPolicy: 'FAIL_IF_EXISTS' });
|
|
476
|
-
expect(rs).toBeUndefined();
|
|
477
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/set', expect.objectContaining({
|
|
478
|
-
body: JSON.stringify({
|
|
479
|
-
entityName: 'employees',
|
|
480
|
-
key: 'foo',
|
|
481
|
-
value: { name: 'Jane Doe' },
|
|
482
|
-
options: { ttl: { value: 5, unit: 'MINUTES' }, keyPolicy: 'FAIL_IF_EXISTS' }
|
|
483
|
-
})
|
|
484
|
-
}));
|
|
485
|
-
});
|
|
486
|
-
it('should setEntity correctly with "OVERRIDE" and return value', async () => {
|
|
487
|
-
const responseBody = {
|
|
488
|
-
key: 'foo',
|
|
489
|
-
value: 'bar',
|
|
490
|
-
createdAt: Date.now(),
|
|
491
|
-
updatedAt: Date.now(),
|
|
492
|
-
expireTime: '2025-01-12T13:00:00Z'
|
|
493
|
-
};
|
|
494
|
-
const response = new Response(JSON.stringify(responseBody), {
|
|
495
|
-
status: 200,
|
|
496
|
-
headers: { 'x-trace-id': traceId }
|
|
497
|
-
});
|
|
498
|
-
const { sut, apiClient } = prepare(response);
|
|
499
|
-
const rs = await sut.entity('employees').set('foo', { name: 'Jane Doe' }, {
|
|
500
|
-
ttl: { value: 5, unit: 'MINUTES' },
|
|
501
|
-
keyPolicy: 'OVERRIDE',
|
|
502
|
-
returnValue: 'LATEST',
|
|
503
|
-
returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
504
|
-
});
|
|
505
|
-
expect(rs).toEqual(responseBody);
|
|
506
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/set', expect.objectContaining({
|
|
507
|
-
body: JSON.stringify({
|
|
508
|
-
entityName: 'employees',
|
|
509
|
-
key: 'foo',
|
|
510
|
-
value: { name: 'Jane Doe' },
|
|
511
|
-
options: {
|
|
512
|
-
ttl: { value: 5, unit: 'MINUTES' },
|
|
513
|
-
keyPolicy: 'OVERRIDE',
|
|
514
|
-
returnValue: 'LATEST',
|
|
515
|
-
returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
516
|
-
}
|
|
517
|
-
})
|
|
518
|
-
}));
|
|
519
|
-
});
|
|
520
|
-
it('should setEntity and return undefined when no previous value exists', async () => {
|
|
521
|
-
const response = new Response(undefined, {
|
|
522
|
-
status: 204,
|
|
523
|
-
headers: { 'x-trace-id': traceId }
|
|
524
|
-
});
|
|
525
|
-
const { sut, apiClient } = prepare(response);
|
|
526
|
-
const rs = await sut.entity('employees').set('foo', { name: 'Jane Doe' }, {
|
|
527
|
-
ttl: { value: 5, unit: 'MINUTES' },
|
|
528
|
-
keyPolicy: 'OVERRIDE',
|
|
529
|
-
returnValue: 'PREVIOUS',
|
|
530
|
-
returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
531
|
-
});
|
|
532
|
-
expect(rs).toBeUndefined();
|
|
533
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/set', expect.objectContaining({
|
|
534
|
-
body: JSON.stringify({
|
|
535
|
-
entityName: 'employees',
|
|
536
|
-
key: 'foo',
|
|
537
|
-
value: { name: 'Jane Doe' },
|
|
538
|
-
options: {
|
|
539
|
-
ttl: { value: 5, unit: 'MINUTES' },
|
|
540
|
-
keyPolicy: 'OVERRIDE',
|
|
541
|
-
returnValue: 'PREVIOUS',
|
|
542
|
-
returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
|
|
543
|
-
}
|
|
544
|
-
})
|
|
545
|
-
}));
|
|
546
|
-
});
|
|
547
221
|
it('should delete correctly', async () => {
|
|
548
222
|
const response = new Response(undefined, {
|
|
549
223
|
status: 204,
|
|
@@ -640,36 +314,6 @@ describe('KVS', () => {
|
|
|
640
314
|
})
|
|
641
315
|
}));
|
|
642
316
|
});
|
|
643
|
-
it('should query correctly with TTL fields', async () => {
|
|
644
|
-
const response = new Response(JSON.stringify({
|
|
645
|
-
cursor: 'third-page',
|
|
646
|
-
data: [{ key: 'foo', value: 'bar', expireTime: '2025-01-12T13:00:00Z' }]
|
|
647
|
-
}), {
|
|
648
|
-
status: 200,
|
|
649
|
-
headers: { 'x-trace-id': traceId }
|
|
650
|
-
});
|
|
651
|
-
const { sut, apiClient } = prepare(response);
|
|
652
|
-
const rs = await sut
|
|
653
|
-
.query({ metadataFields: [types_1.MetadataField.EXPIRE_TIME] })
|
|
654
|
-
.cursor('second-page')
|
|
655
|
-
.limit(1)
|
|
656
|
-
.where('key', conditions_1.WhereConditions.beginsWith('fo'))
|
|
657
|
-
.getMany();
|
|
658
|
-
expect(rs).toEqual({
|
|
659
|
-
results: [{ key: 'foo', value: 'bar', expireTime: '2025-01-12T13:00:00Z' }],
|
|
660
|
-
nextCursor: 'third-page'
|
|
661
|
-
});
|
|
662
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/query', expect.objectContaining({
|
|
663
|
-
body: JSON.stringify({
|
|
664
|
-
limit: 1,
|
|
665
|
-
after: 'second-page',
|
|
666
|
-
where: [{ property: 'key', condition: 'BEGINS_WITH', values: ['fo'] }],
|
|
667
|
-
options: {
|
|
668
|
-
metadataFields: [types_1.MetadataField.EXPIRE_TIME]
|
|
669
|
-
}
|
|
670
|
-
})
|
|
671
|
-
}));
|
|
672
|
-
});
|
|
673
317
|
it('should getOne out of a list of results', async () => {
|
|
674
318
|
const response = new Response(JSON.stringify({
|
|
675
319
|
data: [
|
|
@@ -699,28 +343,25 @@ describe('KVS', () => {
|
|
|
699
343
|
body: JSON.stringify({ limit: 1 })
|
|
700
344
|
}));
|
|
701
345
|
});
|
|
702
|
-
it('should query entity correctly and pass partition with index
|
|
703
|
-
const response = new Response(JSON.stringify({ data: [{ key: 'foo', value: { name: 'Jane Doe' }
|
|
346
|
+
it('should query entity correctly and pass partition with index', async () => {
|
|
347
|
+
const response = new Response(JSON.stringify({ data: [{ key: 'foo', value: { name: 'Jane Doe' } }] }), {
|
|
704
348
|
status: 200,
|
|
705
349
|
headers: { 'x-trace-id': traceId }
|
|
706
350
|
});
|
|
707
351
|
const { sut, apiClient } = prepare(response);
|
|
708
352
|
const rs = await sut
|
|
709
353
|
.entity('employees')
|
|
710
|
-
.query(
|
|
354
|
+
.query()
|
|
711
355
|
.index('by-employmentyear', { partition: [2000] })
|
|
712
356
|
.getMany();
|
|
713
357
|
expect(rs).toEqual({
|
|
714
|
-
results: [{ key: 'foo', value: { name: 'Jane Doe' }
|
|
358
|
+
results: [{ key: 'foo', value: { name: 'Jane Doe' } }]
|
|
715
359
|
});
|
|
716
360
|
expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/query', expect.objectContaining({
|
|
717
361
|
body: JSON.stringify({
|
|
718
362
|
entityName: 'employees',
|
|
719
363
|
indexName: 'by-employmentyear',
|
|
720
|
-
partition: [2000]
|
|
721
|
-
options: {
|
|
722
|
-
metadataFields: [types_1.MetadataField.EXPIRE_TIME]
|
|
723
|
-
}
|
|
364
|
+
partition: [2000]
|
|
724
365
|
})
|
|
725
366
|
}));
|
|
726
367
|
});
|
|
@@ -1017,24 +658,6 @@ describe('KVS', () => {
|
|
|
1017
658
|
})
|
|
1018
659
|
}));
|
|
1019
660
|
});
|
|
1020
|
-
it('should sumbit transaction correctly with TTL', async () => {
|
|
1021
|
-
const response = new Response(undefined, {
|
|
1022
|
-
status: 200,
|
|
1023
|
-
headers: { 'x-trace-id': traceId }
|
|
1024
|
-
});
|
|
1025
|
-
const { sut, apiClient } = prepare(response);
|
|
1026
|
-
await sut
|
|
1027
|
-
.transact()
|
|
1028
|
-
.set('foo', 'bar', undefined, { ttl: { unit: 'SECONDS', value: 5 } })
|
|
1029
|
-
.delete('bar')
|
|
1030
|
-
.execute();
|
|
1031
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/transaction', expect.objectContaining({
|
|
1032
|
-
body: JSON.stringify({
|
|
1033
|
-
set: [{ key: 'foo', value: 'bar', options: { ttl: { unit: 'SECONDS', value: 5 } } }],
|
|
1034
|
-
delete: [{ key: 'bar' }]
|
|
1035
|
-
})
|
|
1036
|
-
}));
|
|
1037
|
-
});
|
|
1038
661
|
it('should batchSet correctly with mixed entity and non-entity items', async () => {
|
|
1039
662
|
const response = new Response(JSON.stringify({
|
|
1040
663
|
successfulKeys: [{ key: 'foo', entityName: 'employees' }, { key: 'bar' }],
|
|
@@ -1070,43 +693,6 @@ describe('KVS', () => {
|
|
|
1070
693
|
body: JSON.stringify(items)
|
|
1071
694
|
}));
|
|
1072
695
|
});
|
|
1073
|
-
it('should batchSet correctly with mixed entity and non-entity items with TTL', async () => {
|
|
1074
|
-
const response = new Response(JSON.stringify({
|
|
1075
|
-
successfulKeys: [{ key: 'foo', entityName: 'employees' }, { key: 'bar' }, { key: 'xxx' }],
|
|
1076
|
-
failedKeys: [
|
|
1077
|
-
{
|
|
1078
|
-
key: 'baz',
|
|
1079
|
-
entityName: 'departments',
|
|
1080
|
-
error: { code: 'VALIDATION_ERROR', message: 'Invalid value' }
|
|
1081
|
-
}
|
|
1082
|
-
]
|
|
1083
|
-
}), {
|
|
1084
|
-
status: 200,
|
|
1085
|
-
headers: { 'x-trace-id': traceId }
|
|
1086
|
-
});
|
|
1087
|
-
const { sut, apiClient } = prepare(response);
|
|
1088
|
-
const ttl = { value: 10, unit: 'MINUTES' };
|
|
1089
|
-
const items = [
|
|
1090
|
-
{ key: 'foo', value: 'John Doe', entityName: 'employees', options: { ttl } },
|
|
1091
|
-
{ key: 'bar', value: 'simple value', options: { ttl } },
|
|
1092
|
-
{ key: 'baz', value: 'IT Department', entityName: 'departments', options: { ttl } },
|
|
1093
|
-
{ key: 'xxx', value: 'yyy', options: { ttl } }
|
|
1094
|
-
];
|
|
1095
|
-
const rs = await sut.batchSet(items);
|
|
1096
|
-
expect(rs).toEqual({
|
|
1097
|
-
successfulKeys: [{ key: 'foo', entityName: 'employees' }, { key: 'bar' }, { key: 'xxx' }],
|
|
1098
|
-
failedKeys: [
|
|
1099
|
-
{
|
|
1100
|
-
key: 'baz',
|
|
1101
|
-
entityName: 'departments',
|
|
1102
|
-
error: { code: 'VALIDATION_ERROR', message: 'Invalid value' }
|
|
1103
|
-
}
|
|
1104
|
-
]
|
|
1105
|
-
});
|
|
1106
|
-
expect(apiClient).toHaveBeenCalledWith('/api/v1/batch/set', expect.objectContaining({
|
|
1107
|
-
body: JSON.stringify(items)
|
|
1108
|
-
}));
|
|
1109
|
-
});
|
|
1110
696
|
it('should handle batchSet with all successful keys', async () => {
|
|
1111
697
|
const response = new Response(JSON.stringify({
|
|
1112
698
|
successfulKeys: [{ key: 'foo' }, { key: 'bar' }],
|
package/out/entity-query.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { EntityFilterClauses,
|
|
1
|
+
import { EntityFilterClauses, AndFilter, EntityQueryBuilder, IndexQueryBuilder, Filter, FilterItem, IndexOptions, OrFilter } from './interfaces/entity-query';
|
|
2
2
|
import { StorageApi } from './storage-api';
|
|
3
3
|
export declare class KvsIndexQueryBuilder<T> implements IndexQueryBuilder<T> {
|
|
4
4
|
private readonly entityName;
|
|
5
5
|
private readonly storageApi;
|
|
6
|
-
|
|
7
|
-
constructor(entityName: string, storageApi: StorageApi, options?: Partial<EntityQueryOptions<T>> | undefined);
|
|
6
|
+
constructor(entityName: string, storageApi: StorageApi);
|
|
8
7
|
index(name: string, indexOptions?: IndexOptions<T>): EntityQueryBuilder<T>;
|
|
9
8
|
}
|
|
10
9
|
export declare abstract class BaseFilter<T> {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-query.d.ts","sourceRoot":"","sources":["../src/entity-query.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,
|
|
1
|
+
{"version":3,"file":"entity-query.d.ts","sourceRoot":"","sources":["../src/entity-query.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAGnB,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,EACN,UAAU,EACV,YAAY,EACZ,QAAQ,EACT,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,qBAAa,oBAAoB,CAAC,CAAC,CAAE,YAAW,iBAAiB,CAAC,CAAC,CAAC;IAEhE,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,UAAU;IAGzC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC;CAQ3E;AAwDD,8BAAsB,UAAU,CAAC,CAAC;IACpB,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAA3B,KAAK,GAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAM;IAExD,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAI/B,QAAQ;CAGhB;AAED,qBAAa,aAAa,CAAC,CAAC,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAE,YAAW,MAAM,CAAC,CAAC,CAAC;IACtE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,mBAAmB,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAIxE,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,mBAAmB,GAAG,eAAe,CAAC,CAAC,CAAC;CAGvE;AAED,cAAM,gBAAgB,CAAC,CAAC,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAE,YAAW,SAAS,CAAC,CAAC,CAAC;IACrE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,mBAAmB,GAAG,IAAI;CAI1D;AAED,cAAM,eAAe,CAAC,CAAC,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAE,YAAW,QAAQ,CAAC,CAAC,CAAC;IACnE,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,mBAAmB,GAAG,IAAI;CAIzD"}
|
package/out/entity-query.js
CHANGED
|
@@ -4,15 +4,12 @@ exports.FilterBuilder = exports.BaseFilter = exports.KvsIndexQueryBuilder = void
|
|
|
4
4
|
class KvsIndexQueryBuilder {
|
|
5
5
|
entityName;
|
|
6
6
|
storageApi;
|
|
7
|
-
|
|
8
|
-
constructor(entityName, storageApi, options) {
|
|
7
|
+
constructor(entityName, storageApi) {
|
|
9
8
|
this.entityName = entityName;
|
|
10
9
|
this.storageApi = storageApi;
|
|
11
|
-
this.options = options;
|
|
12
10
|
}
|
|
13
11
|
index(name, indexOptions) {
|
|
14
12
|
return new KvsEntityQueryBuilder(this.storageApi, {
|
|
15
|
-
...this.options,
|
|
16
13
|
entityName: this.entityName,
|
|
17
14
|
indexName: name,
|
|
18
15
|
partition: indexOptions?.partition,
|
|
@@ -57,20 +54,16 @@ class KvsEntityQueryBuilder {
|
|
|
57
54
|
return undefined;
|
|
58
55
|
}
|
|
59
56
|
async getMany() {
|
|
60
|
-
const
|
|
61
|
-
...(this.queryOptions?.metadataFields ? { options: { metadataFields: this.queryOptions.metadataFields } } : {})
|
|
62
|
-
};
|
|
63
|
-
const { filters, filterOperator, metadataFields, ...rest } = this.queryOptions;
|
|
57
|
+
const { filters, filterOperator, ...rest } = this.queryOptions;
|
|
64
58
|
if (filters && filterOperator && filters.length > 0) {
|
|
65
59
|
return this.storageApi.queryEntity({
|
|
66
60
|
...rest,
|
|
67
|
-
...maybeOptions,
|
|
68
61
|
filters: {
|
|
69
62
|
[filterOperator]: filters
|
|
70
63
|
}
|
|
71
64
|
});
|
|
72
65
|
}
|
|
73
|
-
return this.storageApi.queryEntity(
|
|
66
|
+
return this.storageApi.queryEntity(rest);
|
|
74
67
|
}
|
|
75
68
|
}
|
|
76
69
|
class BaseFilter {
|
package/out/entity.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IndexQueryBuilder } from './interfaces/entity-query';
|
|
2
2
|
import { KvsEntity } from './interfaces/kvs';
|
|
3
|
-
import { GetOptions, GetResult
|
|
3
|
+
import { GetOptions, GetResult } from './interfaces/types';
|
|
4
4
|
import { StorageApi } from './storage-api';
|
|
5
5
|
export declare class EntityImpl<T> implements KvsEntity<T> {
|
|
6
6
|
private readonly entityName;
|
|
@@ -8,10 +8,8 @@ export declare class EntityImpl<T> implements KvsEntity<T> {
|
|
|
8
8
|
constructor(entityName: string, storageApi: StorageApi);
|
|
9
9
|
get(key: string): Promise<T | undefined>;
|
|
10
10
|
get(key: string, options: GetOptions): Promise<GetResult<T> | undefined>;
|
|
11
|
-
set(key: string, value: T
|
|
12
|
-
set(key: string, value: T, options: PolicySetOptions): Promise<void>;
|
|
13
|
-
set<U = T>(key: string, value: T, options: OverrideAndReturnSetOptions): Promise<SetResult<U> | undefined>;
|
|
11
|
+
set(key: string, value: T): Promise<void>;
|
|
14
12
|
delete(key: string): Promise<void>;
|
|
15
|
-
query(
|
|
13
|
+
query(): IndexQueryBuilder<T>;
|
|
16
14
|
}
|
|
17
15
|
//# sourceMappingURL=entity.d.ts.map
|
package/out/entity.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,qBAAa,UAAU,CAAC,CAAC,CAAE,YAAW,SAAS,CAAC,CAAC,CAAC;IAE9C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,UAAU;IAGzC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IACxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IASxE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlC,KAAK,IAAI,iBAAiB,CAAC,CAAC,CAAC;CAG9B"}
|