@forge/kvs

1.2.7-next.0-experimental-2682d7a1.2.7-next.0-experimental-d997307
~

Modified (34 files)

Index: package/out/entity-query.js
===================================================================
--- package/out/entity-query.js
+++ package/out/entity-query.js
@@ -3,14 +3,17 @@
 exports.FilterBuilder = exports.BaseFilter = exports.KvsIndexQueryBuilder = void 0;
 class KvsIndexQueryBuilder {
     entityName;
     storageApi;
-    constructor(entityName, storageApi) {
+    options;
+    constructor(entityName, storageApi, options) {
         this.entityName = entityName;
         this.storageApi = storageApi;
+        this.options = options;
     }
     index(name, indexOptions) {
         return new KvsEntityQueryBuilder(this.storageApi, {
+            ...this.options,
             entityName: this.entityName,
             indexName: name,
             partition: indexOptions?.partition,
             filters: []
@@ -53,18 +56,22 @@
         }
         return undefined;
     }
     async getMany() {
-        const { filters, filterOperator, ...rest } = this.queryOptions;
+        const maybeOptions = {
+            ...(this.queryOptions?.metadataFields ? { options: { metadataFields: this.queryOptions.metadataFields } } : {})
+        };
+        const { filters, filterOperator, metadataFields, ...rest } = this.queryOptions;
         if (filters && filterOperator && filters.length > 0) {
             return this.storageApi.queryEntity({
                 ...rest,
+                ...maybeOptions,
                 filters: {
                     [filterOperator]: filters
                 }
             });
         }
-        return this.storageApi.queryEntity(rest);
+        return this.storageApi.queryEntity({ ...rest, ...maybeOptions });
     }
 }
 class BaseFilter {
     items;
Index: package/out/entity.js
===================================================================
--- package/out/entity.js
+++ package/out/entity.js
@@ -15,22 +15,23 @@
             key,
             options
         });
     }
-    set(key, value) {
+    set(key, value, options) {
         return this.storageApi.setEntity({
             entityName: this.entityName,
             key,
-            value
+            value,
+            options
         });
     }
     delete(key) {
         return this.storageApi.deleteEntity({
             entityName: this.entityName,
             key
         });
     }
-    query() {
-        return new entity_query_1.KvsIndexQueryBuilder(this.entityName, this.storageApi);
+    query(options) {
+        return new entity_query_1.KvsIndexQueryBuilder(this.entityName, this.storageApi, options);
     }
 }
 exports.EntityImpl = EntityImpl;
Index: package/out/__test__/index.test.js
===================================================================
--- package/out/__test__/index.test.js
+++ package/out/__test__/index.test.js
@@ -29,28 +29,67 @@
         expect(apiClient).toHaveBeenCalledWith('/api/v1/get', expect.objectContaining({
             body: JSON.stringify({ key: 'foo' })
         }));
     });
-    it('should get with metadata fields correctly', async () => {
-        const response = new Response(JSON.stringify({ key: 'foo', value: 'bar', createdAt: 1718236800, updatedAt: 1718236800 }), {
+    it('should get with metadata fields correctly for get', async () => {
+        const response = new Response(JSON.stringify({
+            key: 'foo',
+            value: 'bar',
+            createdAt: 1718236800,
+            updatedAt: 1718236800,
+            expireTime: '2025-01-12T13:00:00Z'
+        }), {
             status: 200,
             headers: { 'x-trace-id': traceId }
         });
         const { sut, apiClient } = prepare(response);
-        const rs = await sut.get('foo', { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT] });
+        const rs = await sut.get('foo', {
+            metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+        });
         expect(rs).toEqual({
             key: 'foo',
             value: 'bar',
             createdAt: 1718236800,
-            updatedAt: 1718236800
+            updatedAt: 1718236800,
+            expireTime: '2025-01-12T13:00:00Z'
         });
         expect(apiClient).toHaveBeenCalledWith('/api/v1/get', expect.objectContaining({
             body: JSON.stringify({
                 key: 'foo',
-                options: { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT] }
+                options: { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME] }
             })
         }));
     });
+    it('should get with metadata fields correctly for entity.get', async () => {
+        const response = new Response(JSON.stringify({
+            key: 'key-foo',
+            value: { foo: 'bar' },
+            createdAt: 1718236800,
+            updatedAt: 1718236800,
+            expireTime: '2025-01-12T13:00:00Z'
+        }), {
+            status: 200,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const rs = await sut.entity('foo').get('key-foo', {
+            metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+        });
+        expect(rs).toEqual({
+            key: 'key-foo',
+            value: { foo: 'bar' },
+            createdAt: 1718236800,
+            updatedAt: 1718236800,
+            expireTime: '2025-01-12T13:00:00Z'
+        });
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/get', expect.objectContaining({
+            body: JSON.stringify({
+                entityName: 'foo',
+                key: 'key-foo',
+                options: { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME] }
+            })
+        }));
+    });
     it('should return undefined when get receives 404', async () => {
         const response = new Response(JSON.stringify({ code: 'KEY_NOT_FOUND', message: 'Provided key does not exist' }), {
             status: 404,
             headers: { 'x-trace-id': traceId }
@@ -103,24 +142,33 @@
             body: JSON.stringify({ key: 'foo' })
         }));
     });
     it('should getSecret with metadata fields correctly', async () => {
-        const response = new Response(JSON.stringify({ key: 'foo', value: 'bar', createdAt: 1718236800, updatedAt: 1718236800 }), {
+        const response = new Response(JSON.stringify({
+            key: 'foo',
+            value: 'bar',
+            createdAt: 1718236800,
+            updatedAt: 1718236800,
+            expireTime: '2025-01-12T13:00:00Z'
+        }), {
             status: 200,
             headers: { 'x-trace-id': traceId }
         });
         const { sut, apiClient } = prepare(response);
-        const rs = await sut.getSecret('foo', { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT] });
+        const rs = await sut.getSecret('foo', {
+            metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+        });
         expect(rs).toEqual({
             key: 'foo',
             value: 'bar',
             createdAt: 1718236800,
-            updatedAt: 1718236800
+            updatedAt: 1718236800,
+            expireTime: '2025-01-12T13:00:00Z'
         });
         expect(apiClient).toHaveBeenCalledWith('/api/v1/secret/get', expect.objectContaining({
             body: JSON.stringify({
                 key: 'foo',
-                options: { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT] }
+                options: { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME] }
             })
         }));
     });
     it('should return undefined when getSecret receives 404', async () => {
@@ -147,27 +195,34 @@
             body: JSON.stringify({ entityName: 'employees', key: 'foo' })
         }));
     });
     it('should getEntity with metadata fields correctly', async () => {
-        const response = new Response(JSON.stringify({ key: 'foo', value: { name: 'Jane Doe' }, createdAt: 1718236800, updatedAt: 1718236800 }), {
+        const response = new Response(JSON.stringify({
+            key: 'foo',
+            value: { name: 'Jane Doe' },
+            createdAt: 1718236800,
+            updatedAt: 1718236800,
+            expireTime: '2025-01-12T13:00:00Z'
+        }), {
             status: 200,
             headers: { 'x-trace-id': traceId }
         });
         const { sut, apiClient } = prepare(response);
         const rs = await sut
             .entity('employees')
-            .get('foo', { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT] });
+            .get('foo', { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME] });
         expect(rs).toEqual({
             key: 'foo',
             value: { name: 'Jane Doe' },
             createdAt: 1718236800,
-            updatedAt: 1718236800
+            updatedAt: 1718236800,
+            expireTime: '2025-01-12T13:00:00Z'
         });
         expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/get', expect.objectContaining({
             body: JSON.stringify({
                 entityName: 'employees',
                 key: 'foo',
-                options: { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT] }
+                options: { metadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME] }
             })
         }));
     });
     it('should return undefined when getEntity receives 404', async () => {
@@ -193,8 +248,95 @@
         expect(apiClient).toHaveBeenCalledWith('/api/v1/set', expect.objectContaining({
             body: JSON.stringify({ key: 'foo', value: 'bar' })
         }));
     });
+    it('should set correctly with TTL', async () => {
+        const response = new Response(undefined, {
+            status: 204,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const rs = await sut.set('foo', 'bar', { ttl: { value: 5, unit: 'MINUTES' } });
+        expect(rs).toBeUndefined();
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/set', expect.objectContaining({
+            body: JSON.stringify({ key: 'foo', value: 'bar', options: { ttl: { value: 5, unit: 'MINUTES' } } })
+        }));
+    });
+    it('should set correctly with keyPolicy "FAIL_IF_EXISTS"', async () => {
+        const response = new Response(undefined, {
+            status: 204,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const rs = await sut.set('foo', 'bar', { ttl: { value: 5, unit: 'MINUTES' }, keyPolicy: 'FAIL_IF_EXISTS' });
+        expect(rs).toBeUndefined();
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/set', expect.objectContaining({
+            body: JSON.stringify({
+                key: 'foo',
+                value: 'bar',
+                options: { ttl: { value: 5, unit: 'MINUTES' }, keyPolicy: 'FAIL_IF_EXISTS' }
+            })
+        }));
+    });
+    it('should set correctly with keyPolicy "OVERRIDE" and return value', async () => {
+        const responseBody = {
+            key: 'foo',
+            value: 'bar',
+            createdAt: Date.now(),
+            updatedAt: Date.now(),
+            expireTime: '2025-01-12T13:00:00Z'
+        };
+        const response = new Response(JSON.stringify(responseBody), {
+            status: 200,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const rs = await sut.set('foo', 'bar', {
+            ttl: { value: 5, unit: 'MINUTES' },
+            keyPolicy: 'OVERRIDE',
+            returnValue: 'LATEST',
+            returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+        });
+        expect(rs).toEqual(responseBody);
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/set', expect.objectContaining({
+            body: JSON.stringify({
+                key: 'foo',
+                value: 'bar',
+                options: {
+                    ttl: { value: 5, unit: 'MINUTES' },
+                    keyPolicy: 'OVERRIDE',
+                    returnValue: 'LATEST',
+                    returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+                }
+            })
+        }));
+    });
+    it('should set and return undefined when no previous value exists', async () => {
+        const response = new Response(undefined, {
+            status: 204,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const rs = await sut.set('foo', 'bar', {
+            ttl: { value: 5, unit: 'MINUTES' },
+            keyPolicy: 'OVERRIDE',
+            returnValue: 'PREVIOUS',
+            returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+        });
+        expect(rs).toEqual(undefined);
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/set', expect.objectContaining({
+            body: JSON.stringify({
+                key: 'foo',
+                value: 'bar',
+                options: {
+                    ttl: { value: 5, unit: 'MINUTES' },
+                    keyPolicy: 'OVERRIDE',
+                    returnValue: 'PREVIOUS',
+                    returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+                }
+            })
+        }));
+    });
     it('should setSecret correctly', async () => {
         const response = new Response(undefined, {
             status: 204,
             headers: { 'x-trace-id': traceId }
@@ -205,8 +347,95 @@
         expect(apiClient).toHaveBeenCalledWith('/api/v1/secret/set', expect.objectContaining({
             body: JSON.stringify({ key: 'foo', value: 'bar' })
         }));
     });
+    it('should setSecret correctly with TTL', async () => {
+        const response = new Response(undefined, {
+            status: 204,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const rs = await sut.setSecret('foo', 'bar', { ttl: { value: 5, unit: 'MINUTES' } });
+        expect(rs).toBeUndefined();
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/secret/set', expect.objectContaining({
+            body: JSON.stringify({ key: 'foo', value: 'bar', options: { ttl: { value: 5, unit: 'MINUTES' } } })
+        }));
+    });
+    it('should setSecret correctly with keyPolicy "FAIL_IF_EXISTS"', async () => {
+        const response = new Response(undefined, {
+            status: 204,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const rs = await sut.setSecret('foo', 'bar', { ttl: { value: 5, unit: 'MINUTES' }, keyPolicy: 'FAIL_IF_EXISTS' });
+        expect(rs).toBeUndefined();
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/secret/set', expect.objectContaining({
+            body: JSON.stringify({
+                key: 'foo',
+                value: 'bar',
+                options: { ttl: { value: 5, unit: 'MINUTES' }, keyPolicy: 'FAIL_IF_EXISTS' }
+            })
+        }));
+    });
+    it('should setSecret correctly with keyPolicy "OVERRIDE" and return value', async () => {
+        const responseBody = {
+            key: 'foo',
+            value: 'bar',
+            createdAt: Date.now(),
+            updatedAt: Date.now(),
+            expireTime: '2025-01-12T13:00:00Z'
+        };
+        const response = new Response(JSON.stringify(responseBody), {
+            status: 200,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const rs = await sut.setSecret('foo', 'bar', {
+            ttl: { value: 5, unit: 'MINUTES' },
+            keyPolicy: 'OVERRIDE',
+            returnValue: 'LATEST',
+            returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+        });
+        expect(rs).toEqual(responseBody);
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/secret/set', expect.objectContaining({
+            body: JSON.stringify({
+                key: 'foo',
+                value: 'bar',
+                options: {
+                    ttl: { value: 5, unit: 'MINUTES' },
+                    keyPolicy: 'OVERRIDE',
+                    returnValue: 'LATEST',
+                    returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+                }
+            })
+        }));
+    });
+    it('should setSecret and return undefined when no previous value exists', async () => {
+        const response = new Response(undefined, {
+            status: 204,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const rs = await sut.setSecret('foo', 'bar', {
+            ttl: { value: 5, unit: 'MINUTES' },
+            keyPolicy: 'OVERRIDE',
+            returnValue: 'PREVIOUS',
+            returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+        });
+        expect(rs).toEqual(undefined);
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/secret/set', expect.objectContaining({
+            body: JSON.stringify({
+                key: 'foo',
+                value: 'bar',
+                options: {
+                    ttl: { value: 5, unit: 'MINUTES' },
+                    keyPolicy: 'OVERRIDE',
+                    returnValue: 'PREVIOUS',
+                    returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+                }
+            })
+        }));
+    });
     it('should setEntity correctly', async () => {
         const response = new Response(undefined, {
             status: 204,
             headers: { 'x-trace-id': traceId }
@@ -217,8 +446,105 @@
         expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/set', expect.objectContaining({
             body: JSON.stringify({ entityName: 'employees', key: 'foo', value: { name: 'Jane Doe' } })
         }));
     });
+    it('should setEntity correctly with TTL', async () => {
+        const response = new Response(undefined, {
+            status: 204,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const rs = await sut.entity('employees').set('foo', { name: 'Jane Doe' }, { ttl: { value: 5, unit: 'MINUTES' } });
+        expect(rs).toBeUndefined();
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/set', expect.objectContaining({
+            body: JSON.stringify({
+                entityName: 'employees',
+                key: 'foo',
+                value: { name: 'Jane Doe' },
+                options: { ttl: { value: 5, unit: 'MINUTES' } }
+            })
+        }));
+    });
+    it('should setEntity correctly with "FAIL_IF_EXISTS"', async () => {
+        const response = new Response(undefined, {
+            status: 204,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const rs = await sut
+            .entity('employees')
+            .set('foo', { name: 'Jane Doe' }, { ttl: { value: 5, unit: 'MINUTES' }, keyPolicy: 'FAIL_IF_EXISTS' });
+        expect(rs).toBeUndefined();
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/set', expect.objectContaining({
+            body: JSON.stringify({
+                entityName: 'employees',
+                key: 'foo',
+                value: { name: 'Jane Doe' },
+                options: { ttl: { value: 5, unit: 'MINUTES' }, keyPolicy: 'FAIL_IF_EXISTS' }
+            })
+        }));
+    });
+    it('should setEntity correctly with "OVERRIDE" and return value', async () => {
+        const responseBody = {
+            key: 'foo',
+            value: 'bar',
+            createdAt: Date.now(),
+            updatedAt: Date.now(),
+            expireTime: '2025-01-12T13:00:00Z'
+        };
+        const response = new Response(JSON.stringify(responseBody), {
+            status: 200,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const rs = await sut.entity('employees').set('foo', { name: 'Jane Doe' }, {
+            ttl: { value: 5, unit: 'MINUTES' },
+            keyPolicy: 'OVERRIDE',
+            returnValue: 'LATEST',
+            returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+        });
+        expect(rs).toEqual(responseBody);
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/set', expect.objectContaining({
+            body: JSON.stringify({
+                entityName: 'employees',
+                key: 'foo',
+                value: { name: 'Jane Doe' },
+                options: {
+                    ttl: { value: 5, unit: 'MINUTES' },
+                    keyPolicy: 'OVERRIDE',
+                    returnValue: 'LATEST',
+                    returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+                }
+            })
+        }));
+    });
+    it('should setEntity and return undefined when no previous value exists', async () => {
+        const response = new Response(undefined, {
+            status: 204,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const rs = await sut.entity('employees').set('foo', { name: 'Jane Doe' }, {
+            ttl: { value: 5, unit: 'MINUTES' },
+            keyPolicy: 'OVERRIDE',
+            returnValue: 'PREVIOUS',
+            returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+        });
+        expect(rs).toBeUndefined();
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/set', expect.objectContaining({
+            body: JSON.stringify({
+                entityName: 'employees',
+                key: 'foo',
+                value: { name: 'Jane Doe' },
+                options: {
+                    ttl: { value: 5, unit: 'MINUTES' },
+                    keyPolicy: 'OVERRIDE',
+                    returnValue: 'PREVIOUS',
+                    returnMetadataFields: [types_1.MetadataField.CREATED_AT, types_1.MetadataField.UPDATED_AT, types_1.MetadataField.EXPIRE_TIME]
+                }
+            })
+        }));
+    });
     it('should delete correctly', async () => {
         const response = new Response(undefined, {
             status: 204,
             headers: { 'x-trace-id': traceId }
@@ -313,8 +639,38 @@
                 where: [{ property: 'key', condition: 'BEGINS_WITH', values: ['fo'] }]
             })
         }));
     });
+    it('should query correctly with TTL fields', async () => {
+        const response = new Response(JSON.stringify({
+            cursor: 'third-page',
+            data: [{ key: 'foo', value: 'bar', expireTime: '2025-01-12T13:00:00Z' }]
+        }), {
+            status: 200,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const rs = await sut
+            .query({ metadataFields: [types_1.MetadataField.EXPIRE_TIME] })
+            .cursor('second-page')
+            .limit(1)
+            .where('key', conditions_1.WhereConditions.beginsWith('fo'))
+            .getMany();
+        expect(rs).toEqual({
+            results: [{ key: 'foo', value: 'bar', expireTime: '2025-01-12T13:00:00Z' }],
+            nextCursor: 'third-page'
+        });
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/query', expect.objectContaining({
+            body: JSON.stringify({
+                limit: 1,
+                after: 'second-page',
+                where: [{ property: 'key', condition: 'BEGINS_WITH', values: ['fo'] }],
+                options: {
+                    metadataFields: [types_1.MetadataField.EXPIRE_TIME]
+                }
+            })
+        }));
+    });
     it('should getOne out of a list of results', async () => {
         const response = new Response(JSON.stringify({
             data: [
                 { key: 'foo', value: 'bar' },
@@ -342,27 +698,30 @@
         expect(apiClient).toHaveBeenCalledWith('/api/v1/query', expect.objectContaining({
             body: JSON.stringify({ limit: 1 })
         }));
     });
-    it('should query entity correctly and pass partition with index', async () => {
-        const response = new Response(JSON.stringify({ data: [{ key: 'foo', value: { name: 'Jane Doe' } }] }), {
+    it('should query entity correctly and pass partition with index and metadata fields', async () => {
+        const response = new Response(JSON.stringify({ data: [{ key: 'foo', value: { name: 'Jane Doe' }, expireTime: '2025-01-12T13:00:00Z' }] }), {
             status: 200,
             headers: { 'x-trace-id': traceId }
         });
         const { sut, apiClient } = prepare(response);
         const rs = await sut
             .entity('employees')
-            .query()
+            .query({ metadataFields: [types_1.MetadataField.EXPIRE_TIME] })
             .index('by-employmentyear', { partition: [2000] })
             .getMany();
         expect(rs).toEqual({
-            results: [{ key: 'foo', value: { name: 'Jane Doe' } }]
+            results: [{ key: 'foo', value: { name: 'Jane Doe' }, expireTime: '2025-01-12T13:00:00Z' }]
         });
         expect(apiClient).toHaveBeenCalledWith('/api/v1/entity/query', expect.objectContaining({
             body: JSON.stringify({
                 entityName: 'employees',
                 indexName: 'by-employmentyear',
-                partition: [2000]
+                partition: [2000],
+                options: {
+                    metadataFields: [types_1.MetadataField.EXPIRE_TIME]
+                }
             })
         }));
     });
     it('should query entity correctly (without any filters)', async () => {
@@ -657,8 +1016,26 @@
                 delete: [{ key: 'bar' }]
             })
         }));
     });
+    it('should sumbit transaction correctly with TTL', async () => {
+        const response = new Response(undefined, {
+            status: 200,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        await sut
+            .transact()
+            .set('foo', 'bar', undefined, { ttl: { unit: 'SECONDS', value: 5 } })
+            .delete('bar')
+            .execute();
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/transaction', expect.objectContaining({
+            body: JSON.stringify({
+                set: [{ key: 'foo', value: 'bar', options: { ttl: { unit: 'SECONDS', value: 5 } } }],
+                delete: [{ key: 'bar' }]
+            })
+        }));
+    });
     it('should batchSet correctly with mixed entity and non-entity items', async () => {
         const response = new Response(JSON.stringify({
             successfulKeys: [{ key: 'foo', entityName: 'employees' }, { key: 'bar' }],
             failedKeys: [
@@ -692,8 +1069,45 @@
         expect(apiClient).toHaveBeenCalledWith('/api/v1/batch/set', expect.objectContaining({
             body: JSON.stringify(items)
         }));
     });
+    it('should batchSet correctly with mixed entity and non-entity items with TTL', async () => {
+        const response = new Response(JSON.stringify({
+            successfulKeys: [{ key: 'foo', entityName: 'employees' }, { key: 'bar' }, { key: 'xxx' }],
+            failedKeys: [
+                {
+                    key: 'baz',
+                    entityName: 'departments',
+                    error: { code: 'VALIDATION_ERROR', message: 'Invalid value' }
+                }
+            ]
+        }), {
+            status: 200,
+            headers: { 'x-trace-id': traceId }
+        });
+        const { sut, apiClient } = prepare(response);
+        const ttl = { value: 10, unit: 'MINUTES' };
+        const items = [
+            { key: 'foo', value: 'John Doe', entityName: 'employees', options: { ttl } },
+            { key: 'bar', value: 'simple value', options: { ttl } },
+            { key: 'baz', value: 'IT Department', entityName: 'departments', options: { ttl } },
+            { key: 'xxx', value: 'yyy', options: { ttl } }
+        ];
+        const rs = await sut.batchSet(items);
+        expect(rs).toEqual({
+            successfulKeys: [{ key: 'foo', entityName: 'employees' }, { key: 'bar' }, { key: 'xxx' }],
+            failedKeys: [
+                {
+                    key: 'baz',
+                    entityName: 'departments',
+                    error: { code: 'VALIDATION_ERROR', message: 'Invalid value' }
+                }
+            ]
+        });
+        expect(apiClient).toHaveBeenCalledWith('/api/v1/batch/set', expect.objectContaining({
+            body: JSON.stringify(items)
+        }));
+    });
     it('should handle batchSet with all successful keys', async () => {
         const response = new Response(JSON.stringify({
             successfulKeys: [{ key: 'foo' }, { key: 'bar' }],
             failedKeys: []
Index: package/out/kvs.js
===================================================================
--- package/out/kvs.js
+++ package/out/kvs.js
@@ -11,25 +11,25 @@
     }
     get(key, options) {
         return this.storageApi.get({ key, options });
     }
-    set(key, value) {
-        return this.storageApi.set({ key, value });
+    set(key, value, options) {
+        return this.storageApi.set({ key, value, options });
     }
     batchSet(items) {
         return this.storageApi.batchSet(items);
     }
     delete(key) {
         return this.storageApi.delete({ key });
     }
-    query() {
-        return new query_1.KvsQueryBuilder(this.storageApi);
+    query(options) {
+        return new query_1.KvsQueryBuilder(this.storageApi, options);
     }
     getSecret(key, options) {
         return this.storageApi.getSecret({ key, options });
     }
-    setSecret(key, value) {
-        return this.storageApi.setSecret({ key, value });
+    setSecret(key, value, options) {
+        return this.storageApi.setSecret({ key, value, options });
     }
     deleteSecret(key) {
         return this.storageApi.deleteSecret({ key });
     }
Index: package/out/query.js
===================================================================
--- package/out/query.js
+++ package/out/query.js
@@ -27,12 +27,16 @@
         }
         return undefined;
     }
     getMany() {
+        const maybeOptions = {
+            ...(this.options?.metadataFields ? { options: { metadataFields: this.options.metadataFields } } : {})
+        };
         return this.storageApi.query({
             limit: this.options.limit,
             after: this.options.cursor,
-            where: this.options.where
+            where: this.options.where,
+            ...maybeOptions
         });
     }
 }
 exports.KvsQueryBuilder = KvsQueryBuilder;
Index: package/out/storage-api.js
===================================================================
--- package/out/storage-api.js
+++ package/out/storage-api.js
@@ -3,78 +3,87 @@
 exports.StorageApi = void 0;
 const types_1 = require("./interfaces/types");
 const error_handling_1 = require("./utils/error-handling");
 const errors_1 = require("./errors");
+var ResponseType;
+(function (ResponseType) {
+    ResponseType[ResponseType["NONE"] = 0] = "NONE";
+    ResponseType[ResponseType["EXPECTED"] = 1] = "EXPECTED";
+    ResponseType[ResponseType["OPTIONAL"] = 2] = "OPTIONAL";
+})(ResponseType || (ResponseType = {}));
 class StorageApi {
     apiClient;
     constructor(apiClient) {
         this.apiClient = apiClient;
     }
     async get(body) {
         const rs = await this.handleKeyNotFound(async () => {
-            return this.request('/api/v1/get', body, true);
+            return this.request('/api/v1/get', body, ResponseType.EXPECTED);
         });
-        return this.processGetResponse(rs, body.options?.metadataFields);
+        return this.processGetResponse(rs, body.options);
     }
     async getSecret(body) {
         const rs = await this.handleKeyNotFound(async () => {
-            return this.request('/api/v1/secret/get', body, true);
+            return this.request('/api/v1/secret/get', body, ResponseType.EXPECTED);
         });
-        return this.processGetResponse(rs, body.options?.metadataFields);
+        return this.processGetResponse(rs, body.options);
     }
     async getEntity(body) {
         const rs = await this.handleKeyNotFound(async () => {
-            return this.request('/api/v1/entity/get', body, true);
+            return this.request('/api/v1/entity/get', body, ResponseType.EXPECTED);
         });
-        return this.processGetResponse(rs, body.options?.metadataFields);
+        return this.processGetResponse(rs, body.options);
     }
     async set(body) {
-        await this.request('/api/v1/set', body, false);
+        const rs = await this.request('/api/v1/set', body, ResponseType.OPTIONAL);
+        return rs && (0, types_1.isOverrideAndReturnOptions)(body.options) ? this.processSetResponse(rs, body.options) : undefined;
     }
     async setSecret(body) {
-        await this.request('/api/v1/secret/set', body, false);
+        const rs = await this.request('/api/v1/secret/set', body, ResponseType.OPTIONAL);
+        return rs && (0, types_1.isOverrideAndReturnOptions)(body.options) ? this.processSetResponse(rs, body.options) : undefined;
     }
     async setEntity(body) {
-        await this.request('/api/v1/entity/set', body, false);
+        const rs = await this.request('/api/v1/entity/set', body, ResponseType.OPTIONAL);
+        return rs && (0, types_1.isOverrideAndReturnOptions)(body.options) ? this.processSetResponse(rs, body.options) : undefined;
     }
     async delete(body) {
         await this.handleKeyNotFound(async () => {
-            return this.request('/api/v1/delete', body, false);
+            return this.request('/api/v1/delete', body, ResponseType.NONE);
         });
     }
     async deleteSecret(body) {
         await this.handleKeyNotFound(async () => {
-            return this.request('/api/v1/secret/delete', body, false);
+            return this.request('/api/v1/secret/delete', body, ResponseType.NONE);
         });
     }
     async deleteEntity(body) {
         await this.handleKeyNotFound(async () => {
-            return this.request('/api/v1/entity/delete', body, false);
+            return this.request('/api/v1/entity/delete', body, ResponseType.NONE);
         });
     }
     async query(body) {
-        const rs = await this.request('/api/v1/query', body, true);
+        const rs = await this.request('/api/v1/query', body, ResponseType.EXPECTED);
         return {
             results: rs.data,
             nextCursor: rs.cursor
         };
     }
     async queryEntity(body) {
-        const rs = await this.request('/api/v1/entity/query', body, true);
+        const rs = await this.request('/api/v1/entity/query', body, ResponseType.EXPECTED);
         return {
             results: rs.data,
             nextCursor: rs.cursor
         };
     }
     async batchSet(body) {
-        const rs = await this.request('/api/v1/batch/set', body, true);
+        const rs = await this.request('/api/v1/batch/set', body, ResponseType.EXPECTED);
         return {
             successfulKeys: rs.successfulKeys,
             failedKeys: rs.failedKeys
         };
     }
     async transact(transactionRequest) {
-        await this.request('/api/v1/transaction', transactionRequest, false);
+        await this.request('/api/v1/transaction', transactionRequest, ResponseType.NONE);
     }
     async handleKeyNotFound(fn) {
         try {
             return await fn();
@@ -85,9 +94,9 @@
             }
             throw e;
         }
     }
-    async request(path, body, isResponseExpected) {
+    async request(path, body, responseType) {
         const requestBody = {
             method: 'POST',
             body: JSON.stringify(body),
             headers: {
@@ -95,34 +104,53 @@
             }
         };
         const response = await this.apiClient(path, requestBody);
         await (0, error_handling_1.checkResponseError)(response);
-        if (!isResponseExpected) {
-            return {};
+        if (responseType === ResponseType.NONE) {
+            return;
         }
         const responseText = await response.text();
+        if (responseType === ResponseType.OPTIONAL && !responseText) {
+            return undefined;
+        }
         try {
             return JSON.parse(responseText);
         }
         catch (error) {
             throw new errors_1.ForgeKvsError(`Unexpected error. Response was not valid JSON: ${responseText}`);
         }
     }
-    processGetResponse(response, requestedMetadataFields) {
-        if (response && requestedMetadataFields?.length) {
-            const maybeCreatedAt = requestedMetadataFields.includes(types_1.MetadataField.CREATED_AT)
+    processGetResponse(response, options) {
+        if (response && options) {
+            const maybeCreatedAt = options.metadataFields?.includes(types_1.MetadataField.CREATED_AT)
                 ? { createdAt: response.createdAt }
                 : {};
-            const maybeUpdatedAt = requestedMetadataFields.includes(types_1.MetadataField.UPDATED_AT)
+            const maybeUpdatedAt = options.metadataFields?.includes(types_1.MetadataField.UPDATED_AT)
                 ? { updatedAt: response.updatedAt }
                 : {};
+            const maybeExpireTime = options.metadataFields?.includes(types_1.MetadataField.EXPIRE_TIME)
+                ? { expireTime: response.expireTime }
+                : {};
             return {
                 key: response.key,
                 value: response.value,
                 ...maybeCreatedAt,
-                ...maybeUpdatedAt
+                ...maybeUpdatedAt,
+                ...maybeExpireTime
             };
         }
         return response?.value;
     }
+    processSetResponse(response, options) {
+        if (!response) {
+            return undefined;
+        }
+        return {
+            key: response.key,
+            value: response.value,
+            ...(options.returnMetadataFields?.includes(types_1.MetadataField.CREATED_AT) && { createdAt: response.createdAt }),
+            ...(options.returnMetadataFields?.includes(types_1.MetadataField.UPDATED_AT) && { updatedAt: response.updatedAt }),
+            ...(options.returnMetadataFields?.includes(types_1.MetadataField.EXPIRE_TIME) && { expireTime: response.expireTime })
+        };
+    }
 }
 exports.StorageApi = StorageApi;
Index: package/out/transaction-api.js
===================================================================
--- package/out/transaction-api.js
+++ package/out/transaction-api.js
@@ -12,12 +12,13 @@
         this.sets = sets;
         this.deletes = deletes;
         this.checks = checks;
     }
-    set(key, value, entity) {
+    set(key, value, entity, options) {
         const transactSet = {
             key,
-            value
+            value,
+            options
         };
         if (entity) {
             transactSet.entity = {
                 entityName: entity.entityName,
Index: package/out/utils/transaction-request-builder.js
===================================================================
--- package/out/utils/transaction-request-builder.js
+++ package/out/utils/transaction-request-builder.js
@@ -13,16 +13,17 @@
         [filter.operator()]: filter.filters()
     };
 }
 const buildRequestSet = (setOperation) => {
-    const { key, value, entity } = setOperation;
+    const { key, value, entity, options } = setOperation;
     const entityName = entity?.entityName;
     const conditions = buildConditionsRequest(entity?.conditions);
     return {
         key,
         value,
         entityName,
-        conditions
+        conditions,
+        options
     };
 };
 exports.buildRequestSet = buildRequestSet;
 const buildRequestDeletes = (deleteOperation) => {
Index: package/out/interfaces/types.js
===================================================================
--- package/out/interfaces/types.js
+++ package/out/interfaces/types.js
@@ -1,12 +1,17 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.Sort = exports.MetadataField = void 0;
+exports.Sort = exports.isOverrideAndReturnOptions = exports.MetadataField = void 0;
 var MetadataField;
 (function (MetadataField) {
     MetadataField["CREATED_AT"] = "CREATED_AT";
     MetadataField["UPDATED_AT"] = "UPDATED_AT";
+    MetadataField["EXPIRE_TIME"] = "EXPIRE_TIME";
 })(MetadataField = exports.MetadataField || (exports.MetadataField = {}));
+function isOverrideAndReturnOptions(options) {
+    return options !== undefined && 'returnValue' in options;
+}
+exports.isOverrideAndReturnOptions = isOverrideAndReturnOptions;
 var Sort;
 (function (Sort) {
     Sort["ASC"] = "ASC";
     Sort["DESC"] = "DESC";
Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@forge/kvs",
-  "version": "1.2.7-next.0-experimental-2682d7a",
+  "version": "1.2.7-next.0-experimental-d997307",
   "description": "Forge Key Value Store SDK",
   "author": "Atlassian",
   "license": "SEE LICENSE IN LICENSE.txt",
   "main": "out/index.js",
@@ -18,9 +18,9 @@
     "@atlassian/xen-test-util": "^4.2.0",
     "@types/node": "20.19.1"
   },
   "dependencies": {
-    "@forge/api": "^7.0.1-next.0-experimental-2682d7a"
+    "@forge/api": "^7.0.1-next.0-experimental-d997307"
   },
   "publishConfig": {
     "registry": "https://packages.atlassian.com/api/npm/npm-public/"
   }
Index: package/out/entity-query.d.ts.map
===================================================================
--- package/out/entity-query.d.ts.map
+++ package/out/entity-query.d.ts.map
@@ -1,1 +1,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"}
\ No newline at end of file
+{"version":3,"file":"entity-query.d.ts","sourceRoot":"","sources":["../src/entity-query.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAElB,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;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAFR,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,4CAAgC;IAG3D,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC;CAU3E;AA4DD,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"}
\ No newline at end of file
Index: package/out/interfaces/entity-query.d.ts.map
===================================================================
--- package/out/interfaces/entity-query.d.ts.map
+++ package/out/interfaces/entity-query.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"entity-query.d.ts","sourceRoot":"","sources":["../../src/interfaces/entity-query.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"entity-query.d.ts","sourceRoot":"","sources":["../../src/interfaces/entity-query.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,aAAa,EACb,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,wBAAwB,EACxB,cAAc,EACd,qBAAqB,EACrB,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,MAAM,EACN,IAAI,EACJ,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB,oBAAY,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AAEvE,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,KAAK,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC3C,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACnD,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACzC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;CACnC;AAED,oBAAY,UAAU,CAAC,CAAC,IAAI,mBAAmB,GAAG;IAChD,QAAQ,EAAE,MAAM,CAAC,CAAC;CACnB,CAAC;AAEF,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,mBAAmB,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAClE,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,mBAAmB,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC1D;AAED,oBAAY,mBAAmB,GAC3B,aAAa,CAAC,cAAc,CAAC,GAC7B,gBAAgB,GAChB,YAAY,GACZ,eAAe,GACf,iBAAiB,GACjB,wBAAwB,GACxB,cAAc,GACd,qBAAqB,GACrB,cAAc,GACd,iBAAiB,GACjB,aAAa,GACb,gBAAgB,CAAC;AAErB,oBAAY,kBAAkB,GAC1B,aAAa,CAAC,cAAc,CAAC,GAC7B,gBAAgB,GAChB,aAAa,GACb,iBAAiB,GACjB,wBAAwB,GACxB,cAAc,GACd,qBAAqB,CAAC;AAE1B,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CAClC"}
\ No newline at end of file
Index: package/out/entity.d.ts.map
===================================================================
--- package/out/entity.d.ts.map
+++ package/out/entity.d.ts.map
@@ -1,1 +1,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"}
\ No newline at end of file
+{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,UAAU,EACV,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,2BAA2B,EAC3B,SAAS,EAEV,MAAM,oBAAoB,CAAC;AAC5B,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,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAC/D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IACpE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAU1G,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlC,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;CAGrF"}
\ No newline at end of file
Index: package/out/interfaces/kvs-api.d.ts.map
===================================================================
--- package/out/interfaces/kvs-api.d.ts.map
+++ package/out/interfaces/kvs-api.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"kvs-api.d.ts","sourceRoot":"","sources":["../../src/interfaces/kvs-api.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"kvs-api.d.ts","sourceRoot":"","sources":["../../src/interfaces/kvs-api.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
Index: package/out/interfaces/kvs.d.ts.map
===================================================================
--- package/out/interfaces/kvs.d.ts.map
+++ package/out/interfaces/kvs.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"kvs.d.ts","sourceRoot":"","sources":["../../src/interfaces/kvs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE7D,MAAM,WAAW,GAAG;IAClB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC5C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC5E,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAChG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,YAAY,CAAC;IAEtB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAClD,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAClF,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAE5C,QAAQ,IAAI,kBAAkB,CAAC;CAChC;AAED,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACzE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC;CAC/B"}
\ No newline at end of file
+{"version":3,"file":"kvs.d.ts","sourceRoot":"","sources":["../../src/interfaces/kvs.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
Index: package/out/kvs.d.ts.map
===================================================================
--- package/out/kvs.d.ts.map
+++ package/out/kvs.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"kvs.d.ts","sourceRoot":"","sources":["../src/kvs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAExE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,qBAAa,OAAQ,YAAW,GAAG;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAEnD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAC3C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAK3E,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAI/F,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,IAAI,YAAY;IAIrB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IACjD,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAKjF,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAI3C,QAAQ,IAAI,kBAAkB;CAG/B"}
\ No newline at end of file
+{"version":3,"file":"kvs.d.ts","sourceRoot":"","sources":["../src/kvs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACL,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,2BAA2B,EAC3B,SAAS,EAEV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,qBAAa,OAAQ,YAAW,GAAG;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAEnD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAC3C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAI3E,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAClE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IACvE,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAK7G,QAAQ,CAAC,CAAC,EACR,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC,GACjF,OAAO,CAAC,WAAW,CAAC;IAIvB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,GAAG,YAAY;IAInE,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IACjD,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAKjF,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IACxE,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAC7E,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAKnH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAI3C,QAAQ,IAAI,kBAAkB;CAG/B"}
\ No newline at end of file
Index: package/out/interfaces/query.d.ts.map
===================================================================
--- package/out/interfaces/query.d.ts.map
+++ package/out/interfaces/query.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/interfaces/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE/D,oBAAY,WAAW,GAAG,gBAAgB,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,GAAG,YAAY,CAAC;IAC7D,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC;IACrC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC;IACnC,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAA;KAAE,GAAG,WAAW,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
\ No newline at end of file
+{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/interfaces/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE9E,oBAAY,WAAW,GAAG,gBAAgB,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,GAAG,YAAY,CAAC;IAC7D,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC;IACrC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC;IACnC,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,KAAK,CAAA;KAAE,GAAG,WAAW,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CAClC"}
\ No newline at end of file
Index: package/out/query.d.ts.map
===================================================================
--- package/out/query.d.ts.map
+++ package/out/query.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,qBAAa,eAAgB,YAAW,YAAY;IAEhD,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;gBADP,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,YAAiB;IAGpC,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI;IAKpD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK5B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKpB,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAQjD,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;CAOrC"}
\ No newline at end of file
+{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,qBAAa,eAAgB,YAAW,YAAY;IAEhD,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;gBADP,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,YAAiB;IAGpC,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI;IAKpD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK5B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKpB,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAQjD,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;CAWrC"}
\ No newline at end of file
Index: package/out/storage-api.d.ts.map
===================================================================
--- package/out/storage-api.d.ts.map
+++ package/out/storage-api.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"storage-api.d.ts","sourceRoot":"","sources":["../src/storage-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAiB,MAAM,oBAAoB,CAAC;AAGvF,OAAO,EACL,eAAe,EAEf,aAAa,EAEb,mBAAmB,EAEnB,gBAAgB,EAEhB,kBAAkB,EAElB,gBAAgB,EAEhB,UAAU,EAEV,YAAY,EAEZ,mBAAmB,EAEnB,gBAAgB,EAEhB,gBAAgB,EAEhB,UAAU,EAEV,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAE9B,qBAAa,UAAU;IACT,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,WAAW;IAEpC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAO/D,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAO3E,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAO3E,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1C,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtD,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtD,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAQpD,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAQhE,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAQ3D,QAAQ,CAAC,CAAC,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAI7D,iBAAiB;YAWjB,OAAO;IA0BrB,OAAO,CAAC,kBAAkB;CAoB3B"}
\ No newline at end of file
+{"version":3,"file":"storage-api.d.ts","sourceRoot":"","sources":["../src/storage-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EACL,SAAS,EACT,UAAU,EACV,WAAW,EAGX,SAAS,EAGV,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,eAAe,EAEf,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAEhB,kBAAkB,EAElB,gBAAgB,EAChB,UAAU,EAEV,YAAY,EAEZ,mBAAmB,EACnB,gBAAgB,EAEhB,gBAAgB,EAChB,UAAU,EAEV,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAQ9B,qBAAa,UAAU;IACT,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,WAAW;IAEpC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAO/D,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAO3E,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAO3E,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAKrE,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAKjF,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAKjF,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1C,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtD,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtD,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAQpD,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAQhE,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAQ3D,QAAQ,CAAC,CAAC,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAI7D,iBAAiB;YAWjB,OAAO;IAiCrB,OAAO,CAAC,kBAAkB;IAyB1B,OAAO,CAAC,kBAAkB;CAgB3B"}
\ No newline at end of file
Index: package/out/transaction-api.d.ts.map
===================================================================
--- package/out/transaction-api.d.ts.map
+++ package/out/transaction-api.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"transaction-api.d.ts","sourceRoot":"","sources":["../src/transaction-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAIlC,qBAAa,sBAAuB,YAAW,kBAAkB;IAE7D,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE;IACtC,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE;IAC5C,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE;gBAHzB,UAAU,EAAE,UAAU,EAC7B,IAAI,GAAE,WAAW,CAAC,OAAO,CAAC,EAAO,EACjC,OAAO,GAAE,cAAc,CAAC,OAAO,CAAC,EAAO,EACvC,MAAM,GAAE,aAAa,CAAC,OAAO,CAAC,EAAO;IAGjD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;IAkBjE,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;IAiB1D,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI;IAa9E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAY/B"}
\ No newline at end of file
+{"version":3,"file":"transaction-api.d.ts","sourceRoot":"","sources":["../src/transaction-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,qBAAa,sBAAuB,YAAW,kBAAkB;IAE7D,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE;IACtC,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE;IAC5C,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE;gBAHzB,UAAU,EAAE,UAAU,EAC7B,IAAI,GAAE,WAAW,CAAC,OAAO,CAAC,EAAO,EACjC,OAAO,GAAE,cAAc,CAAC,OAAO,CAAC,EAAO,EACvC,MAAM,GAAE,aAAa,CAAC,OAAO,CAAC,EAAO;IAGjD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAmBvF,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;IAiB1D,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI;IAa9E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAY/B"}
\ No newline at end of file
Index: package/out/utils/transaction-request-builder.d.ts.map
===================================================================
--- package/out/utils/transaction-request-builder.d.ts.map
+++ package/out/utils/transaction-request-builder.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"transaction-request-builder.d.ts","sourceRoot":"","sources":["../../src/utils/transaction-request-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACpG,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAoBvF,eAAO,MAAM,eAAe,oDAW3B,CAAC;AAEF,eAAO,MAAM,mBAAmB,6CAA4C,aAU3E,CAAC;AAEF,eAAO,MAAM,kBAAkB,2CAA0C,YAUxE,CAAC"}
\ No newline at end of file
+{"version":3,"file":"transaction-request-builder.d.ts","sourceRoot":"","sources":["../../src/utils/transaction-request-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACpG,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAoBvF,eAAO,MAAM,eAAe,oDAY3B,CAAC;AAEF,eAAO,MAAM,mBAAmB,6CAA4C,aAU3E,CAAC;AAEF,eAAO,MAAM,kBAAkB,2CAA0C,YAUxE,CAAC"}
\ No newline at end of file
Index: package/out/interfaces/transaction.d.ts.map
===================================================================
--- package/out/interfaces/transaction.d.ts.map
+++ package/out/interfaces/transaction.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/interfaces/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAK7C,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,CAAC,CAAC;IACT,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAC9B;AAKD,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAC9B;AAKD,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC;CACrC;AAKD,oBAAY,gBAAgB,CAAC,CAAC,IAAI;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CAC5B,CAAC;AAKF,oBAAY,wBAAwB,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG;IAClF,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CAC3B,CAAC;AAKF,oBAAY,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;AAMnF,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAClE,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC3D,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACjE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B"}
\ No newline at end of file
+{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/interfaces/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAKrC,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,CAAC,CAAC;IACT,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAKD,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAC9B;AAKD,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC;CACrC;AAKD,oBAAY,gBAAgB,CAAC,CAAC,IAAI;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CAC5B,CAAC;AAKF,oBAAY,wBAAwB,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG;IAClF,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CAC3B,CAAC;AAKF,oBAAY,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;AAMnF,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACxF,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC3D,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACjE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B"}
\ No newline at end of file
Index: package/out/interfaces/types.d.ts.map
===================================================================
--- package/out/interfaces/types.d.ts.map
+++ package/out/interfaces/types.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/interfaces/types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/interfaces/types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
Index: package/out/entity-query.d.ts
===================================================================
--- package/out/entity-query.d.ts
+++ package/out/entity-query.d.ts
@@ -1,10 +1,11 @@
-import { EntityFilterClauses, AndFilter, EntityQueryBuilder, IndexQueryBuilder, Filter, FilterItem, IndexOptions, OrFilter } from './interfaces/entity-query';
+import { EntityFilterClauses, EntityQueryOptions, AndFilter, EntityQueryBuilder, IndexQueryBuilder, Filter, FilterItem, IndexOptions, OrFilter } from './interfaces/entity-query';
 import { StorageApi } from './storage-api';
 export declare class KvsIndexQueryBuilder<T> implements IndexQueryBuilder<T> {
     private readonly entityName;
     private readonly storageApi;
-    constructor(entityName: string, storageApi: StorageApi);
+    private readonly options?;
+    constructor(entityName: string, storageApi: StorageApi, options?: Partial<EntityQueryOptions<T>> | undefined);
     index(name: string, indexOptions?: IndexOptions<T>): EntityQueryBuilder<T>;
 }
 export declare abstract class BaseFilter<T> {
     protected readonly items: Array<FilterItem<T>>;
Index: package/out/interfaces/entity-query.d.ts
===================================================================
--- package/out/interfaces/entity-query.d.ts
+++ package/out/interfaces/entity-query.d.ts
@@ -1,5 +1,5 @@
-import { BeginsWithClause, BetweenClause, ContainsClause, EqualToClause, ExistsClause, FilterOperator, GreaterThanClause, GreaterThanEqualToClause, LessThanClause, LessThanEqualToClause, ListResult, NotContainsClause, NotEqualToClause, NotExistsClause, Result, Sort, StringOrNumber } from './types';
+import { BeginsWithClause, BetweenClause, ContainsClause, EqualToClause, ExistsClause, FilterOperator, GreaterThanClause, GreaterThanEqualToClause, LessThanClause, LessThanEqualToClause, ListResult, MetadataField, NotContainsClause, NotEqualToClause, NotExistsClause, Result, Sort, StringOrNumber } from './types';
 export declare type IndexOptions<T> = Pick<EntityQueryOptions<T>, 'partition'>;
 export interface IndexQueryBuilder<T> {
     index(name: string, indexOptions?: IndexOptions<T>): EntityQueryBuilder<T>;
 }
@@ -36,6 +36,7 @@
     filters?: Array<FilterItem<T>>;
     filterOperator?: FilterOperator;
     cursor?: string;
     limit?: number;
+    metadataFields?: MetadataField[];
 }
 //# sourceMappingURL=entity-query.d.ts.map
\ No newline at end of file
Index: package/out/entity.d.ts
===================================================================
--- package/out/entity.d.ts
+++ package/out/entity.d.ts
@@ -1,15 +1,17 @@
-import { IndexQueryBuilder } from './interfaces/entity-query';
+import { EntityQueryOptions, IndexQueryBuilder } from './interfaces/entity-query';
 import { KvsEntity } from './interfaces/kvs';
-import { GetOptions, GetResult } from './interfaces/types';
+import { GetOptions, GetResult, SetOptions, PolicySetOptions, OverrideAndReturnSetOptions, SetResult } from './interfaces/types';
 import { StorageApi } from './storage-api';
 export declare class EntityImpl<T> implements KvsEntity<T> {
     private readonly entityName;
     private readonly storageApi;
     constructor(entityName: string, storageApi: StorageApi);
     get(key: string): Promise<T | undefined>;
     get(key: string, options: GetOptions): Promise<GetResult<T> | undefined>;
-    set(key: string, value: T): Promise<void>;
+    set(key: string, value: T, options?: SetOptions): Promise<void>;
+    set(key: string, value: T, options: PolicySetOptions): Promise<void>;
+    set<U = T>(key: string, value: T, options: OverrideAndReturnSetOptions): Promise<SetResult<U> | undefined>;
     delete(key: string): Promise<void>;
-    query(): IndexQueryBuilder<T>;
+    query(options?: Pick<EntityQueryOptions<T>, 'metadataFields'>): IndexQueryBuilder<T>;
 }
 //# sourceMappingURL=entity.d.ts.map
\ No newline at end of file
Index: package/out/interfaces/kvs-api.d.ts
===================================================================
--- package/out/interfaces/kvs-api.d.ts
+++ package/out/interfaces/kvs-api.d.ts
@@ -1,21 +1,23 @@
-import { GetOptions } from './types';
+import { ExtendedSetOptions, GetOptions, MetadataField, SetOptions } from './types';
 declare type KeySchema = {
     key: string;
 };
 declare type KeyValueSchema<T> = KeySchema & {
     value: T;
     createdAt?: number;
     updatedAt?: number;
+    expireTime?: string;
 };
 export declare type GetRequest = KeySchema & {
     options?: GetOptions;
 };
 export declare type GetResponse<T> = KeyValueSchema<T>;
-export declare type SetRequest<T> = KeyValueSchema<T>;
-export declare type SetResponse = void;
+export declare type SetRequest<T> = Pick<KeyValueSchema<T>, 'key' | 'value'> & {
+    options?: ExtendedSetOptions;
+};
+export declare type SetResponse<T> = KeyValueSchema<T>;
 export declare type DeleteRequest = KeySchema;
-export declare type DeleteResponse = void;
 declare type QueryWhere = {
     condition: 'BEGINS_WITH';
     property: 'key';
     values: Array<unknown>;
@@ -23,8 +25,11 @@
 export declare type QueryRequest = {
     limit?: number;
     after?: string;
     where?: Array<QueryWhere>;
+    options?: {
+        metadataFields?: Array<MetadataField>;
+    };
 };
 export declare type QueryResponse<T> = {
     data: Array<KeyValueSchema<T>>;
     cursor?: string;
@@ -32,29 +37,30 @@
 export declare type SecretGetRequest = KeySchema & {
     options?: GetOptions;
 };
 export declare type SecretGetResponse<T> = KeyValueSchema<T>;
-export declare type SecretSetRequest<T> = KeyValueSchema<T>;
-export declare type SecretSetResponse = void;
+export declare type SecretSetRequest<T> = KeyValueSchema<T> & {
+    options?: ExtendedSetOptions;
+};
 export declare type SecretDeleteRequest = KeySchema;
-export declare type SecretDeleteResponse = void;
 declare type EntityKeySchema = {
     entityName: string;
     key: string;
 };
 declare type EntityKeyValueSchema<T> = EntityKeySchema & {
     value: T;
     createdAt?: number;
     updatedAt?: number;
+    expireTime?: string;
 };
 export declare type EntityGetRequest = EntityKeySchema & {
     options?: GetOptions;
 };
 export declare type EntityGetResponse<T> = EntityKeyValueSchema<T>;
-export declare type EntitySetRequest<T> = EntityKeyValueSchema<T>;
-export declare type EntitySetResponse = void;
+export declare type EntitySetRequest<T> = EntityKeyValueSchema<T> & {
+    options?: ExtendedSetOptions;
+};
 export declare type EntityDeleteRequest = EntityKeySchema;
-export declare type EntityDeleteResponse = void;
 export declare type EntityQueryFilter = {
     condition: 'BEGINS_WITH' | 'BETWEEN' | 'CONTAINS' | 'EQUAL_TO' | 'EXISTS' | 'GREATER_THAN' | 'GREATER_THAN_EQUAL_TO' | 'LESS_THAN' | 'LESS_THAN_EQUAL_TO' | 'NOT_CONTAINS' | 'NOT_EQUAL_TO' | 'NOT_EXISTS';
     property: string;
     values: Array<unknown>;
@@ -74,8 +80,9 @@
     sort?: 'ASC' | 'DESC';
     partition?: Array<unknown>;
     entityName: string;
     indexName: string;
+    metadataFields?: Array<MetadataField>;
 };
 export declare type EntityQueryResponse<T> = {
     data: Array<KeyValueSchema<T>>;
     cursor?: string;
@@ -85,8 +92,9 @@
     key: string;
     value: T;
     entityName?: string;
     conditions?: TransactionCondition;
+    options?: SetOptions;
 };
 export declare type RequestDelete = {
     key: string;
     entityName?: string;
@@ -105,8 +113,9 @@
 export declare type BatchSetItem<T> = {
     entityName?: string;
     key: string;
     value: T;
+    options?: SetOptions;
 };
 export declare type BatchSetRequest<T> = Array<BatchSetItem<T>>;
 export declare type BatchSetResponse = {
     successfulKeys: BatchItemSuccess[];
Index: package/out/interfaces/kvs.d.ts
===================================================================
--- package/out/interfaces/kvs.d.ts
+++ package/out/interfaces/kvs.d.ts
@@ -1,30 +1,37 @@
 import { IndexQueryBuilder } from './entity-query';
 import { QueryBuilder } from './query';
 import { TransactionBuilder } from './transaction';
-import { GetOptions, GetResult, BatchResult } from './types';
+import { GetOptions, GetResult, BatchResult, PolicySetOptions, OverrideAndReturnSetOptions, SetResult, SetOptions, QueryOptions } from './types';
 export interface Kvs {
     get<T>(key: string): Promise<T | undefined>;
     get<T>(key: string, options: GetOptions): Promise<GetResult<T> | undefined>;
-    set<T>(key: string, value: T): Promise<void>;
+    set<T>(key: string, value: T, options?: SetOptions): Promise<void>;
+    set<T>(key: string, value: T, options: PolicySetOptions): Promise<void>;
+    set<T, U = T>(key: string, value: T, options: OverrideAndReturnSetOptions): Promise<SetResult<U> | undefined>;
     batchSet<T>(items: Array<{
         key: string;
         value: T;
         entityName?: string;
+        options?: SetOptions;
     }>): Promise<BatchResult>;
     delete(key: string): Promise<void>;
-    query(): QueryBuilder;
+    query(options?: QueryOptions): QueryBuilder;
     getSecret<T>(key: string): Promise<T | undefined>;
     getSecret<T>(key: string, options: GetOptions): Promise<GetResult<T> | undefined>;
-    setSecret<T>(key: string, value: T): Promise<void>;
+    setSecret<T>(key: string, value: T, options?: SetOptions): Promise<void>;
+    setSecret<T>(key: string, value: T, options: PolicySetOptions): Promise<void>;
+    setSecret<T, U = T>(key: string, value: T, options: OverrideAndReturnSetOptions): Promise<SetResult<U> | undefined>;
     deleteSecret(key: string): Promise<void>;
     entity<T>(entityName: string): KvsEntity<T>;
     transact(): TransactionBuilder;
 }
 export interface KvsEntity<T> {
     get(key: string): Promise<T | undefined>;
     get(key: string, options: GetOptions): Promise<GetResult<T> | undefined>;
-    set(key: string, value: T): Promise<void>;
+    set(key: string, value: T, options?: SetOptions): Promise<void>;
+    set(key: string, value: T, options: PolicySetOptions): Promise<void>;
+    set<U = T>(key: string, value: T, options: OverrideAndReturnSetOptions): Promise<SetResult<U> | undefined>;
     delete(key: string): Promise<void>;
-    query(): IndexQueryBuilder<T>;
+    query(options?: QueryOptions): IndexQueryBuilder<T>;
 }
 //# sourceMappingURL=kvs.d.ts.map
\ No newline at end of file
Index: package/out/kvs.d.ts
===================================================================
--- package/out/kvs.d.ts
+++ package/out/kvs.d.ts
@@ -1,25 +1,30 @@
 import { KvsEntity, Kvs } from './interfaces/kvs';
-import { QueryBuilder } from './interfaces/query';
+import { QueryBuilder, QueryOptions } from './interfaces/query';
 import { TransactionBuilder } from './interfaces/transaction';
-import { GetOptions, GetResult, BatchResult } from './interfaces/types';
+import { GetOptions, GetResult, BatchResult, SetOptions, PolicySetOptions, OverrideAndReturnSetOptions, SetResult } from './interfaces/types';
 import { StorageApi } from './storage-api';
 export declare class KvsImpl implements Kvs {
     private readonly storageApi;
     constructor(storageApi: StorageApi);
     get<T>(key: string): Promise<T | undefined>;
     get<T>(key: string, options: GetOptions): Promise<GetResult<T> | undefined>;
-    set<T>(key: string, value: T): Promise<void>;
+    set<T>(key: string, value: T, options?: SetOptions): Promise<void>;
+    set<T>(key: string, value: T, options: PolicySetOptions): Promise<void>;
+    set<T, U = T>(key: string, value: T, options: OverrideAndReturnSetOptions): Promise<SetResult<U> | undefined>;
     batchSet<T>(items: Array<{
         key: string;
         value: T;
         entityName?: string;
+        options?: SetOptions;
     }>): Promise<BatchResult>;
     delete(key: string): Promise<void>;
-    query(): QueryBuilder;
+    query(options?: Pick<QueryOptions, 'metadataFields'>): QueryBuilder;
     getSecret<T>(key: string): Promise<T | undefined>;
     getSecret<T>(key: string, options: GetOptions): Promise<GetResult<T> | undefined>;
-    setSecret<T>(key: string, value: T): Promise<void>;
+    setSecret<T>(key: string, value: T, options?: SetOptions): Promise<void>;
+    setSecret<T>(key: string, value: T, options: PolicySetOptions): Promise<void>;
+    setSecret<T, U = T>(key: string, value: T, options: OverrideAndReturnSetOptions): Promise<SetResult<U> | undefined>;
     deleteSecret(key: string): Promise<void>;
     entity<T>(entityName: string): KvsEntity<T>;
     transact(): TransactionBuilder;
 }
Index: package/out/interfaces/query.d.ts
===================================================================
--- package/out/interfaces/query.d.ts
+++ package/out/interfaces/query.d.ts
@@ -1,5 +1,5 @@
-import { BeginsWithClause, ListResult, Result } from './types';
+import { BeginsWithClause, ListResult, MetadataField, Result } from './types';
 export declare type WhereClause = BeginsWithClause;
 export interface QueryBuilder {
     where(property: 'key', condition: WhereClause): QueryBuilder;
     cursor(cursor: string): QueryBuilder;
@@ -12,6 +12,7 @@
         property: 'key';
     } & WhereClause>;
     cursor?: string;
     limit?: number;
+    metadataFields?: MetadataField[];
 }
 //# sourceMappingURL=query.d.ts.map
\ No newline at end of file
Index: package/out/storage-api.d.ts
===================================================================
--- package/out/storage-api.d.ts
+++ package/out/storage-api.d.ts
@@ -1,16 +1,16 @@
 import { FetchMethod } from '@forge/api';
-import { GetResult, ListResult, BatchResult } from './interfaces/types';
+import { GetResult, ListResult, BatchResult, SetResult } from './interfaces/types';
 import { BatchSetRequest, DeleteRequest, EntityDeleteRequest, EntityGetRequest, EntityQueryRequest, EntitySetRequest, GetRequest, QueryRequest, SecretDeleteRequest, SecretGetRequest, SecretSetRequest, SetRequest, TransactionRequest } from './interfaces/kvs-api';
 export declare class StorageApi {
     private apiClient;
     constructor(apiClient: FetchMethod);
     get<T>(body: GetRequest): Promise<T | GetResult<T> | undefined>;
     getSecret<T>(body: SecretGetRequest): Promise<T | GetResult<T> | undefined>;
     getEntity<T>(body: EntityGetRequest): Promise<T | GetResult<T> | undefined>;
-    set<T>(body: SetRequest<T>): Promise<void>;
-    setSecret<T>(body: SecretSetRequest<T>): Promise<void>;
-    setEntity<T>(body: EntitySetRequest<T>): Promise<void>;
+    set<T, U = T>(body: SetRequest<T>): Promise<SetResult<U> | undefined>;
+    setSecret<T, U = T>(body: SecretSetRequest<T>): Promise<SetResult<U> | undefined>;
+    setEntity<T, U = T>(body: EntitySetRequest<T>): Promise<SetResult<U> | undefined>;
     delete(body: DeleteRequest): Promise<void>;
     deleteSecret(body: SecretDeleteRequest): Promise<void>;
     deleteEntity(body: EntityDeleteRequest): Promise<void>;
     query<T>(body: QueryRequest): Promise<ListResult<T>>;
@@ -19,6 +19,7 @@
     transact<T>(transactionRequest: TransactionRequest<T>): Promise<void>;
     private handleKeyNotFound;
     private request;
     private processGetResponse;
+    private processSetResponse;
 }
 //# sourceMappingURL=storage-api.d.ts.map
\ No newline at end of file
Index: package/out/transaction-api.d.ts
===================================================================
--- package/out/transaction-api.d.ts
+++ package/out/transaction-api.d.ts
@@ -1,13 +1,14 @@
 import { StorageApi } from './storage-api';
 import { EntityConditions, EntityRequiredConditions, TransactCheck, TransactDelete, TransactionBuilder, TransactSet } from './interfaces/transaction';
+import { SetOptions } from './interfaces/types';
 export declare class TransactionBuilderImpl implements TransactionBuilder {
     private readonly storageApi;
     protected sets: TransactSet<unknown>[];
     protected deletes: TransactDelete<unknown>[];
     protected checks: TransactCheck<unknown>[];
     constructor(storageApi: StorageApi, sets?: TransactSet<unknown>[], deletes?: TransactDelete<unknown>[], checks?: TransactCheck<unknown>[]);
-    set<T>(key: string, value: T, entity?: EntityConditions<T>): this;
+    set<T>(key: string, value: T, entity?: EntityConditions<T>, options?: SetOptions): this;
     delete<T>(key: string, entity?: EntityConditions<T>): this;
     check<T>(key: string, { entityName, conditions }: EntityRequiredConditions<T>): this;
     execute(): Promise<void>;
 }
Index: package/out/interfaces/transaction.d.ts
===================================================================
--- package/out/interfaces/transaction.d.ts
+++ package/out/interfaces/transaction.d.ts
@@ -1,9 +1,11 @@
 import { BaseFilter } from '../entity-query';
+import { SetOptions } from './types';
 export interface TransactSet<T> {
     key: string;
     value: T;
     entity?: EntityConditions<T>;
+    options?: SetOptions;
 }
 export interface TransactDelete<T> {
     key: string;
     entity?: EntityConditions<T>;
@@ -20,9 +22,9 @@
     conditions: BaseFilter<T>;
 };
 export declare type StorageValue = string | number | boolean | Record<string, any> | any[];
 export interface TransactionBuilder {
-    set<T>(key: string, value: T, entity?: EntityConditions<T>): this;
+    set<T>(key: string, value: T, entity?: EntityConditions<T>, options?: SetOptions): this;
     delete<T>(key: string, entity?: EntityConditions<T>): this;
     check<T>(key: string, entity: EntityRequiredConditions<T>): this;
     execute(): Promise<void>;
 }
Index: package/out/interfaces/types.d.ts
===================================================================
--- package/out/interfaces/types.d.ts
+++ package/out/interfaces/types.d.ts
@@ -1,20 +1,51 @@
 export declare enum MetadataField {
     CREATED_AT = "CREATED_AT",
-    UPDATED_AT = "UPDATED_AT"
+    UPDATED_AT = "UPDATED_AT",
+    EXPIRE_TIME = "EXPIRE_TIME"
 }
 export interface GetOptions {
     metadataFields?: MetadataField[];
 }
+export interface QueryOptions {
+    metadataFields?: MetadataField[];
+}
+export declare type TtlUnit = 'SECONDS' | 'MINUTES' | 'HOURS' | 'DAYS';
+export declare type Ttl = {
+    value: number;
+    unit: TtlUnit;
+};
+export interface SetOptions {
+    ttl?: Ttl;
+}
 export interface GetResult<T> {
     key: string;
     value: T;
     createdAt?: number;
     updatedAt?: number;
+    expireTime?: string;
 }
+export interface PolicySetOptions extends SetOptions {
+    keyPolicy: 'OVERRIDE' | 'FAIL_IF_EXISTS';
+}
+export interface OverrideAndReturnSetOptions extends SetOptions {
+    keyPolicy: 'OVERRIDE';
+    returnValue: 'PREVIOUS' | 'LATEST';
+    returnMetadataFields?: MetadataField[];
+}
+export declare function isOverrideAndReturnOptions(options?: ExtendedSetOptions): options is OverrideAndReturnSetOptions;
+export declare type ExtendedSetOptions = PolicySetOptions | OverrideAndReturnSetOptions;
+export interface SetResult<T> {
+    key: string;
+    value: T;
+    createdAt?: number;
+    updatedAt?: number;
+    expireTime?: string;
+}
 export interface Result<T> {
     key: string;
     value: T;
+    expireTime?: string;
 }
 export interface ListResult<T> {
     results: Result<T>[];
     nextCursor?: string;