taon 21.0.126 → 21.0.130
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/VERIFIED-BUILD-DATA.jsonc +2 -2
- package/browser/fesm2022/taon-browser.mjs +186 -5
- package/browser/fesm2022/taon-browser.mjs.map +1 -1
- package/browser/package.json +1 -1
- package/browser/types/taon-browser.d.ts +31 -4
- package/browser-prod/fesm2022/taon-browser-prod.mjs +187 -6
- package/browser-prod/fesm2022/taon-browser-prod.mjs.map +1 -1
- package/browser-prod/package.json +1 -1
- package/browser-prod/types/taon-browser-prod.d.ts +31 -4
- package/lib/base-classes/base-kv-repository.d.ts +0 -3
- package/lib/base-classes/base-kv-repository.js +51 -58
- package/lib/base-classes/base-kv-repository.js.map +1 -1
- package/lib/base-classes/base-kv-repository.test.d.ts +1 -0
- package/lib/base-classes/base-kv-repository.test.js +291 -0
- package/lib/base-classes/base-kv-repository.test.js.map +1 -0
- package/lib/base-classes/base-kv-sync-repository.d.ts +30 -0
- package/lib/base-classes/base-kv-sync-repository.js +151 -0
- package/lib/base-classes/base-kv-sync-repository.js.map +1 -0
- package/lib/base-classes/base-kv-sync-repository.test.d.ts +1 -0
- package/lib/base-classes/base-kv-sync-repository.test.js +281 -0
- package/lib/base-classes/base-kv-sync-repository.test.js.map +1 -0
- package/lib/build-info._auto-generated_.d.ts +1 -1
- package/lib/build-info._auto-generated_.js +1 -1
- package/lib/endpoint-context.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/ui/index.js +2 -2
- package/lib/ui/taon-admin-mode-configuration/index.js +2 -2
- package/lib-esm/app.electron.d.ts +1 -1
- package/lib-esm/app.electron.js +1 -1
- package/lib-esm/app.vscode.d.ts +1 -1
- package/lib-esm/app.vscode.js +1 -1
- package/lib-esm/lib/base-classes/base-kv-repository.d.ts +0 -3
- package/lib-esm/lib/base-classes/base-kv-repository.js +21 -28
- package/lib-esm/lib/base-classes/base-kv-repository.js.map +1 -1
- package/lib-esm/lib/base-classes/base-kv-repository.test.d.ts +1 -0
- package/lib-esm/lib/base-classes/base-kv-repository.test.js +289 -0
- package/lib-esm/lib/base-classes/base-kv-repository.test.js.map +1 -0
- package/lib-esm/lib/base-classes/base-kv-sync-repository.d.ts +30 -0
- package/lib-esm/lib/base-classes/base-kv-sync-repository.js +142 -0
- package/lib-esm/lib/base-classes/base-kv-sync-repository.js.map +1 -0
- package/lib-esm/lib/base-classes/base-kv-sync-repository.test.d.ts +1 -0
- package/lib-esm/lib/base-classes/base-kv-sync-repository.test.js +279 -0
- package/lib-esm/lib/base-classes/base-kv-sync-repository.test.js.map +1 -0
- package/lib-esm/lib/build-info._auto-generated_.d.ts +1 -1
- package/lib-esm/lib/build-info._auto-generated_.js +1 -1
- package/lib-esm/lib/endpoint-context.js.map +1 -1
- package/lib-esm/lib/index.d.ts +1 -0
- package/lib-esm/lib/index.js +1 -0
- package/lib-esm/lib/index.js.map +1 -1
- package/lib-esm/lib/ui/index.d.ts +1 -1
- package/lib-esm/lib/ui/index.js +1 -1
- package/lib-esm/lib/ui/taon-admin-mode-configuration/index.d.ts +1 -1
- package/lib-esm/lib/ui/taon-admin-mode-configuration/index.js +1 -1
- package/lib-prod/base-classes/base-kv-repository.d.ts +0 -3
- package/lib-prod/base-classes/base-kv-repository.js +21 -28
- package/lib-prod/base-classes/base-kv-repository.js.map +1 -1
- package/lib-prod/base-classes/base-kv-repository.test.d.ts +1 -0
- package/lib-prod/base-classes/base-kv-repository.test.js +289 -0
- package/lib-prod/base-classes/base-kv-repository.test.js.map +1 -0
- package/lib-prod/base-classes/base-kv-sync-repository.d.ts +30 -0
- package/lib-prod/base-classes/base-kv-sync-repository.js +142 -0
- package/lib-prod/base-classes/base-kv-sync-repository.js.map +1 -0
- package/lib-prod/base-classes/base-kv-sync-repository.test.d.ts +1 -0
- package/lib-prod/base-classes/base-kv-sync-repository.test.js +279 -0
- package/lib-prod/base-classes/base-kv-sync-repository.test.js.map +1 -0
- package/lib-prod/build-info._auto-generated_.d.ts +1 -1
- package/lib-prod/build-info._auto-generated_.js +1 -1
- package/lib-prod/create-context.js.map +1 -1
- package/lib-prod/endpoint-context.js.map +1 -1
- package/lib-prod/index.d.ts +1 -0
- package/lib-prod/index.js +1 -0
- package/lib-prod/index.js.map +1 -1
- package/lib-prod/package.json +1 -1
- package/lib-prod/realtime/realtime-client.js.map +1 -1
- package/lib-prod/realtime/realtime-core.js.map +1 -1
- package/lib-prod/realtime/realtime-server.js.map +1 -1
- package/lib-prod/ui/index.d.ts +1 -1
- package/lib-prod/ui/index.js +1 -1
- package/lib-prod/ui/taon-admin-mode-configuration/index.d.ts +1 -1
- package/lib-prod/ui/taon-admin-mode-configuration/index.js +1 -1
- package/package.json +5 -1
- package/websql/fesm2022/taon-websql.mjs +186 -5
- package/websql/fesm2022/taon-websql.mjs.map +1 -1
- package/websql/package.json +1 -1
- package/websql/types/taon-websql.d.ts +31 -4
- package/websql-prod/fesm2022/taon-websql-prod.mjs +187 -6
- package/websql-prod/fesm2022/taon-websql-prod.mjs.map +1 -1
- package/websql-prod/package.json +1 -1
- package/websql-prod/types/taon-websql-prod.d.ts +31 -4
|
@@ -1635,9 +1635,6 @@ declare abstract class TaonBaseCrudController<Entity, UPLOAD_FILE_QUERY_PARAMS =
|
|
|
1635
1635
|
}
|
|
1636
1636
|
|
|
1637
1637
|
declare const KVexpirationsDbMetaKey = "__kvMeta.expirations";
|
|
1638
|
-
/**
|
|
1639
|
-
* Please override property entityClassFn with entity class.
|
|
1640
|
-
*/
|
|
1641
1638
|
declare abstract class TaonBaseKvRepository<KV extends Record<string, any> = Record<string, any>> extends TaonBaseCustomRepository {
|
|
1642
1639
|
private normalizeKey;
|
|
1643
1640
|
private expirationPath;
|
|
@@ -1657,6 +1654,36 @@ declare abstract class TaonBaseKvRepository<KV extends Record<string, any> = Rec
|
|
|
1657
1654
|
getAllData(): Promise<Partial<KV>>;
|
|
1658
1655
|
}
|
|
1659
1656
|
|
|
1657
|
+
declare abstract class TaonBaseKvSyncRepository<KV extends Record<string, any> = Record<string, any>> extends TaonBaseCustomRepository {
|
|
1658
|
+
/**
|
|
1659
|
+
* In-memory data owned by this repository instance.
|
|
1660
|
+
*
|
|
1661
|
+
* Nothing is persisted to disk.
|
|
1662
|
+
*/
|
|
1663
|
+
private readonly data;
|
|
1664
|
+
/**
|
|
1665
|
+
* Expiration timestamp indexed by normalized KV key.
|
|
1666
|
+
*/
|
|
1667
|
+
private readonly expirations;
|
|
1668
|
+
private normalizeKey;
|
|
1669
|
+
private getExpirationTimestamp;
|
|
1670
|
+
private cleanupIfExpired;
|
|
1671
|
+
/**
|
|
1672
|
+
* Similar to set(), but when both the existing and incoming values
|
|
1673
|
+
* are objects, only incoming leaf properties are overwritten.
|
|
1674
|
+
*
|
|
1675
|
+
* Arrays are treated as values and replaced entirely.
|
|
1676
|
+
*/
|
|
1677
|
+
merge<K extends keyof KV>(key: K, currentValue: KV[K]): void;
|
|
1678
|
+
set<K extends keyof KV>(key: K, value: KV[K]): void;
|
|
1679
|
+
get<K extends keyof KV>(key: K): KV[K] | undefined;
|
|
1680
|
+
delete<K extends keyof KV>(key: K): void;
|
|
1681
|
+
has<K extends keyof KV>(key: K): boolean;
|
|
1682
|
+
expire<K extends keyof KV>(key: K, ttlSeconds: number): void;
|
|
1683
|
+
ttl<K extends keyof KV>(key: K): number | undefined;
|
|
1684
|
+
getAllData(): Partial<KV>;
|
|
1685
|
+
}
|
|
1686
|
+
|
|
1660
1687
|
/**
|
|
1661
1688
|
* Configurable file upload middleware (multer based)
|
|
1662
1689
|
*/
|
|
@@ -2228,5 +2255,5 @@ declare const TAON_FLATTEN_MAPPING: {
|
|
|
2228
2255
|
};
|
|
2229
2256
|
};
|
|
2230
2257
|
|
|
2231
|
-
export { BaseTaonClassesNames, Body, BooleanColumn, CURRENT_HOST_BACKEND_PORT, CURRENT_HOST_URL, ClassHelpers__NS__asyncHandler, ClassHelpers__NS__ensureClassConfig, ClassHelpers__NS__ensureMethodConfig, ClassHelpers__NS__getClassConfig, ClassHelpers__NS__getClassFnFromObject, ClassHelpers__NS__getControllerConfigs, ClassHelpers__NS__getFullInternalName, ClassHelpers__NS__getMethodsNames, ClassHelpers__NS__getName, ClassHelpers__NS__getOrginalClass, ClassHelpers__NS__getUniqueKey, ClassHelpers__NS__hasParentClassWithName, ClassHelpers__NS__isContextClassObject, ClassHelpers__NS__setName, ContextDbMigrations, ContextsEndpointStorage, ControllerConfig, Cookie, DELETE, DITaonContainer, DateTimeColumn, DecimalNumberColumn, DecoratorAbstractOpt, EndpointContext, EntityProcess, FormlyHorizontalWrapper, GET, HEAD, HTML, Header, KVexpirationsDbMetaKey, MethodConfig, MockNamespaceIpc, MockServerIpc, MockSocketIpc, Models__NS__ClassType, Models__NS__ClassTypeKey, Models__NS__DatabaseConfig, Models__NS__DatabaseConfigTypeOrm, Models__NS__DatabasesFolder, Models__NS__KVDatabaseConfig, NumberColumn, PATCH, POST, PUT, ParamConfig, Path, Query, RealtimeClient, RealtimeCore, RealtimeServer, RealtimeStrategy, RealtimeStrategyIpc, RealtimeStrategyMock, RealtimeStrategySocketIO, RealtimeSubsManager, RegisterComponentType, RegisterComponentTypeForEntity, RepeatTypeComponent, SimpleJsonColumn, String100Column, String200Column, String20Column, String45Column, String500Column, String50Column, StringColumn, Symbols__NS__REALTIME, Symbols__NS__classMethodsNames, Symbols__NS__ctxInClassOrClassObj, Symbols__NS__fullClassNameStaticProperty, Symbols__NS__metadata, Symbols__NS__old, Symbols__NS__orignalClassClonesObj, Symbols__NS__taonInstanceId, TAON_CONTEXT, TAON_FLATTEN_MAPPING, TaonAdmin, TaonAdminPanelMode, TaonAdminService, TaonBaseAbstractEntity, TaonBaseAngularService, TaonBaseClass, TaonBaseContext, TaonBaseController, TaonBaseCrudController, TaonBaseCustomRepository, TaonBaseEntity, TaonBaseFileUploadMiddleware, TaonBaseInjector, TaonBaseKvRepository, TaonBaseMiddleware, TaonBaseMigration, TaonBaseProvider, TaonBaseRepository, TaonBaseRepositoryClassName, TaonBaseSubscriberForEntity, TaonController, TaonControllerOptions, TaonEntity, TaonEntityKeysToOmitArr, TaonEntityOptions, TaonHelpers__NS__defaultType, TaonHelpers__NS__fillUpTo, TaonHelpers__NS__firstStringOrElemFromArray, TaonHelpers__NS__getExpressPath, TaonHelpers__NS__ipcKeyNameRequest, TaonHelpers__NS__ipcKeyNameResponse, TaonHelpers__NS__isGoodPath, TaonHelpers__NS__isPlainFileOrFolder, TaonHelpers__NS__parseJSONwithStringJSONs, TaonHelpers__NS__tryTransformParam, TaonHelpers__NS__websqlMocks, TaonMiddleware, TaonMiddlewareOptions, TaonMigration, TaonMigrationOptions, TaonProvider, TaonProviderOptions, TaonRepository, TaonRepositoryOptions, TaonRestResponseWrapper, TaonSubscriber, TaonSubscriberOptions, TaonTempDatabasesFolder, TaonTempRoutesFolder, Taon__NS__LANG_IMPORT_MAP, Taon__NS____FILE_RELATIVE_PATH, Taon__NS__asset, Taon__NS__assetsFrom, Taon__NS__assetsListFrom, Taon__NS__createContext, Taon__NS__createContextTemplate, Taon__NS__error, Taon__NS__getResponseValue, Taon__NS__isBrowser, Taon__NS__isElectron, Taon__NS__isNode, Taon__NS__isWebSQL, Taon__NS__removeLoader, Validators__NS__checkIfMethodsWithReponseTYpeAlowed, Validators__NS__classNameVlidation, Validators__NS__preventUndefinedModel, Validators__NS__validateClassFunctions, apiPrefix, cloneObj, controllerConfigFrom, createContext, createContextTemplate, findTypeForEntity, getFromlyConfigFor, getRegisteredComponents, getResponseValue, getTransformFunction, singleTransform, typeFromEntity, typeFromName };
|
|
2258
|
+
export { BaseTaonClassesNames, Body, BooleanColumn, CURRENT_HOST_BACKEND_PORT, CURRENT_HOST_URL, ClassHelpers__NS__asyncHandler, ClassHelpers__NS__ensureClassConfig, ClassHelpers__NS__ensureMethodConfig, ClassHelpers__NS__getClassConfig, ClassHelpers__NS__getClassFnFromObject, ClassHelpers__NS__getControllerConfigs, ClassHelpers__NS__getFullInternalName, ClassHelpers__NS__getMethodsNames, ClassHelpers__NS__getName, ClassHelpers__NS__getOrginalClass, ClassHelpers__NS__getUniqueKey, ClassHelpers__NS__hasParentClassWithName, ClassHelpers__NS__isContextClassObject, ClassHelpers__NS__setName, ContextDbMigrations, ContextsEndpointStorage, ControllerConfig, Cookie, DELETE, DITaonContainer, DateTimeColumn, DecimalNumberColumn, DecoratorAbstractOpt, EndpointContext, EntityProcess, FormlyHorizontalWrapper, GET, HEAD, HTML, Header, KVexpirationsDbMetaKey, MethodConfig, MockNamespaceIpc, MockServerIpc, MockSocketIpc, Models__NS__ClassType, Models__NS__ClassTypeKey, Models__NS__DatabaseConfig, Models__NS__DatabaseConfigTypeOrm, Models__NS__DatabasesFolder, Models__NS__KVDatabaseConfig, NumberColumn, PATCH, POST, PUT, ParamConfig, Path, Query, RealtimeClient, RealtimeCore, RealtimeServer, RealtimeStrategy, RealtimeStrategyIpc, RealtimeStrategyMock, RealtimeStrategySocketIO, RealtimeSubsManager, RegisterComponentType, RegisterComponentTypeForEntity, RepeatTypeComponent, SimpleJsonColumn, String100Column, String200Column, String20Column, String45Column, String500Column, String50Column, StringColumn, Symbols__NS__REALTIME, Symbols__NS__classMethodsNames, Symbols__NS__ctxInClassOrClassObj, Symbols__NS__fullClassNameStaticProperty, Symbols__NS__metadata, Symbols__NS__old, Symbols__NS__orignalClassClonesObj, Symbols__NS__taonInstanceId, TAON_CONTEXT, TAON_FLATTEN_MAPPING, TaonAdmin, TaonAdminPanelMode, TaonAdminService, TaonBaseAbstractEntity, TaonBaseAngularService, TaonBaseClass, TaonBaseContext, TaonBaseController, TaonBaseCrudController, TaonBaseCustomRepository, TaonBaseEntity, TaonBaseFileUploadMiddleware, TaonBaseInjector, TaonBaseKvRepository, TaonBaseKvSyncRepository, TaonBaseMiddleware, TaonBaseMigration, TaonBaseProvider, TaonBaseRepository, TaonBaseRepositoryClassName, TaonBaseSubscriberForEntity, TaonController, TaonControllerOptions, TaonEntity, TaonEntityKeysToOmitArr, TaonEntityOptions, TaonHelpers__NS__defaultType, TaonHelpers__NS__fillUpTo, TaonHelpers__NS__firstStringOrElemFromArray, TaonHelpers__NS__getExpressPath, TaonHelpers__NS__ipcKeyNameRequest, TaonHelpers__NS__ipcKeyNameResponse, TaonHelpers__NS__isGoodPath, TaonHelpers__NS__isPlainFileOrFolder, TaonHelpers__NS__parseJSONwithStringJSONs, TaonHelpers__NS__tryTransformParam, TaonHelpers__NS__websqlMocks, TaonMiddleware, TaonMiddlewareOptions, TaonMigration, TaonMigrationOptions, TaonProvider, TaonProviderOptions, TaonRepository, TaonRepositoryOptions, TaonRestResponseWrapper, TaonSubscriber, TaonSubscriberOptions, TaonTempDatabasesFolder, TaonTempRoutesFolder, Taon__NS__LANG_IMPORT_MAP, Taon__NS____FILE_RELATIVE_PATH, Taon__NS__asset, Taon__NS__assetsFrom, Taon__NS__assetsListFrom, Taon__NS__createContext, Taon__NS__createContextTemplate, Taon__NS__error, Taon__NS__getResponseValue, Taon__NS__isBrowser, Taon__NS__isElectron, Taon__NS__isNode, Taon__NS__isWebSQL, Taon__NS__removeLoader, Validators__NS__checkIfMethodsWithReponseTYpeAlowed, Validators__NS__classNameVlidation, Validators__NS__preventUndefinedModel, Validators__NS__validateClassFunctions, apiPrefix, cloneObj, controllerConfigFrom, createContext, createContextTemplate, findTypeForEntity, getFromlyConfigFor, getRegisteredComponents, getResponseValue, getTransformFunction, singleTransform, typeFromEntity, typeFromName };
|
|
2232
2259
|
export type { AbstractEntityOmitKeys, FormlyArrayTransformFn, FormlyEntityType, FormlyInputType, MigrationStatus, Models__NS__ConnectionOptionsLogs, Models__NS__ContextOptions, Models__NS__DBRecreateMode, Models__NS__FrameworkMode, Models__NS__Http__NS__AsyncResponse, Models__NS__Http__NS__ClientAction, Models__NS__Http__NS__ContextENDPOINT, Models__NS__Http__NS__ExpressContext, Models__NS__Http__NS__FormlyFromType, Models__NS__Http__NS__MixResponse, Models__NS__Http__NS__PromiseObservableMix, Models__NS__Http__NS__Response, Models__NS__Http__NS__ResponseFuncOpt, Models__NS__Http__NS__SyncResponse, Models__NS__Http__NS__SyncResponseFunc, Models__NS__MiddlewareType, Models__NS__StartParams, Models__NS__TaonCtxCloneParams, Models__NS__TaonInitializeParams, MulterFileUploadResponse, RealtimeModels__NS__ChangeOption, RealtimeModels__NS__EventHandler, RealtimeModels__NS__SubsManagerOpt, TaonAdditionalMiddlewareMethodInfo, TaonAdminTab, TaonContext, TaonEntityKeysToOmit, TaonHttpDecoratorOptions, TaonMiddlewareFunction, TaonMiddlewareInheritanceObj, Taon__NS__Response, Taon__NS__ResponseHtml, Taon__NS__StartParams };
|
|
@@ -6,9 +6,6 @@ type KvLowDbShape<KV extends Record<string, any>> = KV & {
|
|
|
6
6
|
};
|
|
7
7
|
};
|
|
8
8
|
export declare const KVexpirationsDbMetaKey = "__kvMeta.expirations";
|
|
9
|
-
/**
|
|
10
|
-
* Please override property entityClassFn with entity class.
|
|
11
|
-
*/
|
|
12
9
|
export declare abstract class TaonBaseKvRepository<KV extends Record<string, any> = Record<string, any>> extends TaonBaseCustomRepository {
|
|
13
10
|
private lowDB;
|
|
14
11
|
private defaultDb;
|
|
@@ -8,16 +8,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.TaonBaseKvRepository = exports.KVexpirationsDbMetaKey = void 0;
|
|
10
10
|
//#region imports
|
|
11
|
-
const lib_1 = require("
|
|
12
|
-
const lib_2 = require("tnp-core/lib");
|
|
11
|
+
const lib_1 = require("lodash-walk-object/lib");
|
|
12
|
+
const lib_2 = require("tnp-core/lib");
|
|
13
|
+
const lib_3 = require("tnp-core/lib"); // @backend
|
|
13
14
|
const repository_decorator_1 = require("../decorators/classes/repository-decorator");
|
|
14
|
-
const base_custom_repository_1 = require("./base-custom-repository");
|
|
15
15
|
const class_helpers_1 = require("../helpers/class-helpers");
|
|
16
|
-
const
|
|
16
|
+
const base_custom_repository_1 = require("./base-custom-repository");
|
|
17
17
|
exports.KVexpirationsDbMetaKey = '__kvMeta.expirations';
|
|
18
|
-
/**
|
|
19
|
-
* Please override property entityClassFn with entity class.
|
|
20
|
-
*/
|
|
21
18
|
let TaonBaseKvRepository = class TaonBaseKvRepository extends base_custom_repository_1.TaonBaseCustomRepository {
|
|
22
19
|
//#region lowdb for development
|
|
23
20
|
//#region @backend
|
|
@@ -38,8 +35,8 @@ let TaonBaseKvRepository = class TaonBaseKvRepository extends base_custom_reposi
|
|
|
38
35
|
let dbLocation;
|
|
39
36
|
if (!this.useInMemoryDB()) {
|
|
40
37
|
dbLocation = this.jsonDbLocation;
|
|
41
|
-
if (!
|
|
42
|
-
|
|
38
|
+
if (!lib_2.Helpers.exists(lib_2.path.dirname(dbLocation))) {
|
|
39
|
+
lib_2.Helpers.mkdirp(lib_2.path.dirname(dbLocation));
|
|
43
40
|
}
|
|
44
41
|
}
|
|
45
42
|
if (this.useInMemoryDB()) {
|
|
@@ -49,17 +46,17 @@ let TaonBaseKvRepository = class TaonBaseKvRepository extends base_custom_reposi
|
|
|
49
46
|
this.ctx.logDb && console.log(`USING KV DB FROM ${dbLocation}`);
|
|
50
47
|
}
|
|
51
48
|
try {
|
|
52
|
-
this.lowDB = await (0,
|
|
49
|
+
this.lowDB = await (0, lib_3.JSONFilePreset)(dbLocation, this.defaultDb, this.useInMemoryDB());
|
|
53
50
|
}
|
|
54
51
|
catch (error) {
|
|
55
52
|
console.error(error);
|
|
56
|
-
|
|
53
|
+
lib_2.Helpers.error(`[taon-helpers] Cannot use db.json file for projects in location, restoring default db.`, true, true);
|
|
57
54
|
if (!this.useInMemoryDB()) {
|
|
58
|
-
|
|
55
|
+
lib_2.Helpers.writeJson(dbLocation, this.defaultDb);
|
|
59
56
|
}
|
|
60
|
-
this.lowDB = await (0,
|
|
57
|
+
this.lowDB = await (0, lib_3.JSONFilePreset)(dbLocation, this.defaultDb, this.useInMemoryDB());
|
|
61
58
|
}
|
|
62
|
-
|
|
59
|
+
lib_2._.set(this.lowDB.data, exports.KVexpirationsDbMetaKey, lib_2._.get(this.lowDB.data, exports.KVexpirationsDbMetaKey, {}));
|
|
63
60
|
//#endregion
|
|
64
61
|
}
|
|
65
62
|
if (!this.useInMemoryDB()) {
|
|
@@ -80,19 +77,19 @@ let TaonBaseKvRepository = class TaonBaseKvRepository extends base_custom_reposi
|
|
|
80
77
|
async getExpirationTimestamp(key) {
|
|
81
78
|
//#region @backendFunc
|
|
82
79
|
const connection = await this.getConnection();
|
|
83
|
-
const expiresAt =
|
|
80
|
+
const expiresAt = lib_2._.get(connection.data, this.expirationPath(key));
|
|
84
81
|
return typeof expiresAt === 'number' ? expiresAt : undefined;
|
|
85
82
|
//#endregion
|
|
86
83
|
}
|
|
87
84
|
async cleanupIfExpired(key) {
|
|
88
85
|
//#region @backendFunc
|
|
89
86
|
const connection = await this.getConnection();
|
|
90
|
-
const expiresAt =
|
|
91
|
-
if (!
|
|
87
|
+
const expiresAt = lib_2._.get(connection.data, this.expirationPath(key));
|
|
88
|
+
if (!lib_2._.isNumber(expiresAt) || Date.now() < expiresAt) {
|
|
92
89
|
return false;
|
|
93
90
|
}
|
|
94
|
-
|
|
95
|
-
|
|
91
|
+
lib_2._.unset(connection.data, this.normalizeKey(key));
|
|
92
|
+
lib_2._.unset(connection.data, this.expirationPath(key));
|
|
96
93
|
await connection.write();
|
|
97
94
|
return true;
|
|
98
95
|
//#endregion
|
|
@@ -104,38 +101,34 @@ let TaonBaseKvRepository = class TaonBaseKvRepository extends base_custom_reposi
|
|
|
104
101
|
*/
|
|
105
102
|
async merge(key, currentValue) {
|
|
106
103
|
//#region @backendFunc
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
lib_1._.isFunction(value) ||
|
|
116
|
-
(lib_1._.isObject(value) && !Array.isArray(value)) // I can set array
|
|
117
|
-
) {
|
|
118
|
-
// skipping
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
lib_1._.set(existedData, lodashPath, value);
|
|
122
|
-
}
|
|
123
|
-
}, {
|
|
124
|
-
walkGetters: false,
|
|
125
|
-
});
|
|
104
|
+
const existingValue = await this.get(key);
|
|
105
|
+
const canMerge = lib_2._.isObject(existingValue) &&
|
|
106
|
+
!Array.isArray(existingValue) &&
|
|
107
|
+
lib_2._.isObject(currentValue) &&
|
|
108
|
+
!Array.isArray(currentValue);
|
|
109
|
+
if (!canMerge) {
|
|
110
|
+
await this.set(key, currentValue);
|
|
111
|
+
return;
|
|
126
112
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
113
|
+
lib_1.walk.Object(currentValue, (value, lodashPath) => {
|
|
114
|
+
if (lib_2._.isNil(value) ||
|
|
115
|
+
lib_2._.isFunction(value) ||
|
|
116
|
+
(lib_2._.isObject(value) && !Array.isArray(value))) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
lib_2._.set(existingValue, lodashPath, value);
|
|
120
|
+
}, {
|
|
121
|
+
walkGetters: false,
|
|
122
|
+
});
|
|
123
|
+
await this.set(key, existingValue);
|
|
131
124
|
//#endregion
|
|
132
125
|
}
|
|
133
126
|
async set(key, value) {
|
|
134
127
|
//#region @backendFunc
|
|
135
128
|
const connection = await this.getConnection();
|
|
136
|
-
|
|
129
|
+
lib_2._.set(connection.data, this.normalizeKey(key), value);
|
|
137
130
|
// overwrite should remove previous expiration unless expire() is called again
|
|
138
|
-
|
|
131
|
+
lib_2._.unset(connection.data, this.expirationPath(key));
|
|
139
132
|
await connection.write();
|
|
140
133
|
//#endregion
|
|
141
134
|
}
|
|
@@ -146,14 +139,14 @@ let TaonBaseKvRepository = class TaonBaseKvRepository extends base_custom_reposi
|
|
|
146
139
|
return undefined;
|
|
147
140
|
}
|
|
148
141
|
const connection = await this.getConnection();
|
|
149
|
-
return
|
|
142
|
+
return lib_2._.get(connection.data, this.normalizeKey(key));
|
|
150
143
|
//#endregion
|
|
151
144
|
}
|
|
152
145
|
async delete(key) {
|
|
153
146
|
//#region @backendFunc
|
|
154
147
|
const connection = await this.getConnection();
|
|
155
|
-
|
|
156
|
-
|
|
148
|
+
lib_2._.unset(connection.data, this.normalizeKey(key));
|
|
149
|
+
lib_2._.unset(connection.data, this.expirationPath(key));
|
|
157
150
|
await connection.write();
|
|
158
151
|
//#endregion
|
|
159
152
|
}
|
|
@@ -164,17 +157,17 @@ let TaonBaseKvRepository = class TaonBaseKvRepository extends base_custom_reposi
|
|
|
164
157
|
return false;
|
|
165
158
|
}
|
|
166
159
|
const connection = await this.getConnection();
|
|
167
|
-
return
|
|
160
|
+
return lib_2._.has(connection.data, this.normalizeKey(key));
|
|
168
161
|
//#endregion
|
|
169
162
|
}
|
|
170
163
|
async expire(key, ttlSeconds) {
|
|
171
164
|
//#region @backendFunc
|
|
172
165
|
const connection = await this.getConnection();
|
|
173
|
-
if (!
|
|
166
|
+
if (!lib_2._.has(connection.data, this.normalizeKey(key))) {
|
|
174
167
|
return;
|
|
175
168
|
}
|
|
176
169
|
const expiresAt = Date.now() + ttlSeconds * 1000;
|
|
177
|
-
|
|
170
|
+
lib_2._.set(connection.data, this.expirationPath(key), expiresAt);
|
|
178
171
|
await connection.write();
|
|
179
172
|
//#endregion
|
|
180
173
|
}
|
|
@@ -185,11 +178,11 @@ let TaonBaseKvRepository = class TaonBaseKvRepository extends base_custom_reposi
|
|
|
185
178
|
return undefined;
|
|
186
179
|
}
|
|
187
180
|
const connection = await this.getConnection();
|
|
188
|
-
if (!
|
|
181
|
+
if (!lib_2._.has(connection.data, this.normalizeKey(key))) {
|
|
189
182
|
return undefined;
|
|
190
183
|
}
|
|
191
|
-
const expiresAt =
|
|
192
|
-
if (!
|
|
184
|
+
const expiresAt = lib_2._.get(connection.data, this.expirationPath(key));
|
|
185
|
+
if (!lib_2._.isNumber(expiresAt)) {
|
|
193
186
|
return undefined;
|
|
194
187
|
}
|
|
195
188
|
const diffMs = expiresAt - Date.now();
|
|
@@ -203,20 +196,20 @@ let TaonBaseKvRepository = class TaonBaseKvRepository extends base_custom_reposi
|
|
|
203
196
|
async getAllData() {
|
|
204
197
|
//#region @backendFunc
|
|
205
198
|
const connection = await this.getConnection();
|
|
206
|
-
const expirations =
|
|
199
|
+
const expirations = lib_2._.get(connection.data, exports.KVexpirationsDbMetaKey, {});
|
|
207
200
|
let changed = false;
|
|
208
201
|
const now = Date.now();
|
|
209
202
|
for (const [key, expiresAt] of Object.entries(expirations)) {
|
|
210
|
-
if (
|
|
211
|
-
|
|
212
|
-
|
|
203
|
+
if (lib_2._.isNumber(expiresAt) && now >= expiresAt) {
|
|
204
|
+
lib_2._.unset(connection.data, key);
|
|
205
|
+
lib_2._.unset(connection.data, `${exports.KVexpirationsDbMetaKey}.${key}`);
|
|
213
206
|
changed = true;
|
|
214
207
|
}
|
|
215
208
|
}
|
|
216
209
|
if (changed) {
|
|
217
210
|
await connection.write();
|
|
218
211
|
}
|
|
219
|
-
const data =
|
|
212
|
+
const data = lib_2._.cloneDeep(connection.data || {});
|
|
220
213
|
delete data.__kvMeta;
|
|
221
214
|
return data;
|
|
222
215
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-kv-repository.js","sourceRoot":"","sources":[""],"names":[],"mappings":";;;;;;;;;AAAA,iBAAiB;AACjB,sCAAgD;AAEhD,sCAA8C,CAAC,WAAW;
|
|
1
|
+
{"version":3,"file":"base-kv-repository.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const cjs_1 = require("vitest/cjs");
|
|
4
|
+
const base_kv_repository_1 = require("./base-kv-repository");
|
|
5
|
+
class TestKvRepository extends base_kv_repository_1.TaonBaseKvRepository {
|
|
6
|
+
useInMemoryDB() {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
describe('TaonBaseKvRepository', () => {
|
|
11
|
+
let repository;
|
|
12
|
+
function createRepository() {
|
|
13
|
+
const instance = new TestKvRepository();
|
|
14
|
+
Object.defineProperty(instance, 'ctx', {
|
|
15
|
+
configurable: true,
|
|
16
|
+
writable: true,
|
|
17
|
+
value: {
|
|
18
|
+
logDb: false,
|
|
19
|
+
kvDbJsonLocationForClass: cjs_1.vi.fn((className) => `/tmp/${className}.json`),
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
return instance;
|
|
23
|
+
}
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
repository = createRepository();
|
|
26
|
+
});
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
cjs_1.vi.useRealTimers();
|
|
29
|
+
cjs_1.vi.restoreAllMocks();
|
|
30
|
+
});
|
|
31
|
+
describe('set / get', () => {
|
|
32
|
+
it('stores and returns a value asynchronously', async () => {
|
|
33
|
+
await repository.set('name', 'Taon');
|
|
34
|
+
await expect(repository.get('name')).resolves.toBe('Taon');
|
|
35
|
+
});
|
|
36
|
+
it('returns undefined for a missing key', async () => {
|
|
37
|
+
await expect(repository.get('name')).resolves.toBeUndefined();
|
|
38
|
+
});
|
|
39
|
+
it('overwrites an existing value', async () => {
|
|
40
|
+
await repository.set('counter', 1);
|
|
41
|
+
await repository.set('counter', 2);
|
|
42
|
+
await expect(repository.get('counter')).resolves.toBe(2);
|
|
43
|
+
});
|
|
44
|
+
it('can store null as a value', async () => {
|
|
45
|
+
await repository.set('nullable', null);
|
|
46
|
+
await expect(repository.has('nullable')).resolves.toBe(true);
|
|
47
|
+
await expect(repository.get('nullable')).resolves.toBeNull();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe('has', () => {
|
|
51
|
+
it('returns true when a key exists', async () => {
|
|
52
|
+
await repository.set('name', 'Taon');
|
|
53
|
+
await expect(repository.has('name')).resolves.toBe(true);
|
|
54
|
+
});
|
|
55
|
+
it('returns false when a key does not exist', async () => {
|
|
56
|
+
await expect(repository.has('name')).resolves.toBe(false);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('delete', () => {
|
|
60
|
+
it('removes an existing value', async () => {
|
|
61
|
+
await repository.set('name', 'Taon');
|
|
62
|
+
await repository.delete('name');
|
|
63
|
+
await expect(repository.has('name')).resolves.toBe(false);
|
|
64
|
+
await expect(repository.get('name')).resolves.toBeUndefined();
|
|
65
|
+
});
|
|
66
|
+
it('does not throw when deleting a missing key', async () => {
|
|
67
|
+
await expect(repository.delete('name')).resolves.toBeUndefined();
|
|
68
|
+
});
|
|
69
|
+
it('also removes expiration metadata', async () => {
|
|
70
|
+
await repository.set('name', 'Taon');
|
|
71
|
+
await repository.expire('name', 100);
|
|
72
|
+
await repository.delete('name');
|
|
73
|
+
await repository.set('name', 'New Taon');
|
|
74
|
+
await expect(repository.ttl('name')).resolves.toBeUndefined();
|
|
75
|
+
await expect(repository.get('name')).resolves.toBe('New Taon');
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe('merge', () => {
|
|
79
|
+
it('merges object properties without removing existing properties', async () => {
|
|
80
|
+
await repository.set('settings', {
|
|
81
|
+
theme: 'light',
|
|
82
|
+
nested: {
|
|
83
|
+
enabled: false,
|
|
84
|
+
label: 'original',
|
|
85
|
+
},
|
|
86
|
+
tags: ['one'],
|
|
87
|
+
});
|
|
88
|
+
await repository.merge('settings', {
|
|
89
|
+
theme: 'dark',
|
|
90
|
+
nested: {
|
|
91
|
+
enabled: true,
|
|
92
|
+
},
|
|
93
|
+
tags: ['two', 'three'],
|
|
94
|
+
});
|
|
95
|
+
await expect(repository.get('settings')).resolves.toEqual({
|
|
96
|
+
theme: 'dark',
|
|
97
|
+
nested: {
|
|
98
|
+
enabled: true,
|
|
99
|
+
label: 'original',
|
|
100
|
+
},
|
|
101
|
+
tags: ['two', 'three'],
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
it('replaces arrays instead of merging their indexes', async () => {
|
|
105
|
+
await repository.set('settings', {
|
|
106
|
+
theme: 'light',
|
|
107
|
+
nested: {
|
|
108
|
+
enabled: false,
|
|
109
|
+
},
|
|
110
|
+
tags: ['one', 'two', 'three'],
|
|
111
|
+
});
|
|
112
|
+
await repository.merge('settings', {
|
|
113
|
+
theme: 'light',
|
|
114
|
+
nested: {
|
|
115
|
+
enabled: false,
|
|
116
|
+
},
|
|
117
|
+
tags: ['replacement'],
|
|
118
|
+
});
|
|
119
|
+
expect((await repository.get('settings'))?.tags).toEqual(['replacement']);
|
|
120
|
+
});
|
|
121
|
+
it('sets the value when the key does not exist yet', async () => {
|
|
122
|
+
await repository.merge('settings', {
|
|
123
|
+
theme: 'dark',
|
|
124
|
+
nested: {
|
|
125
|
+
enabled: true,
|
|
126
|
+
},
|
|
127
|
+
tags: [],
|
|
128
|
+
});
|
|
129
|
+
await expect(repository.get('settings')).resolves.toEqual({
|
|
130
|
+
theme: 'dark',
|
|
131
|
+
nested: {
|
|
132
|
+
enabled: true,
|
|
133
|
+
},
|
|
134
|
+
tags: [],
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
it('overwrites primitive values', async () => {
|
|
138
|
+
await repository.set('counter', 1);
|
|
139
|
+
await repository.merge('counter', 2);
|
|
140
|
+
await expect(repository.get('counter')).resolves.toBe(2);
|
|
141
|
+
});
|
|
142
|
+
it('ignores undefined leaf values during an object merge', async () => {
|
|
143
|
+
await repository.set('settings', {
|
|
144
|
+
theme: 'light',
|
|
145
|
+
nested: {
|
|
146
|
+
enabled: false,
|
|
147
|
+
label: 'keep me',
|
|
148
|
+
},
|
|
149
|
+
tags: [],
|
|
150
|
+
});
|
|
151
|
+
await repository.merge('settings', {
|
|
152
|
+
theme: 'dark',
|
|
153
|
+
nested: {
|
|
154
|
+
enabled: true,
|
|
155
|
+
label: undefined,
|
|
156
|
+
},
|
|
157
|
+
tags: [],
|
|
158
|
+
});
|
|
159
|
+
await expect(repository.get('settings')).resolves.toEqual({
|
|
160
|
+
theme: 'dark',
|
|
161
|
+
nested: {
|
|
162
|
+
enabled: true,
|
|
163
|
+
label: 'keep me',
|
|
164
|
+
},
|
|
165
|
+
tags: [],
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
describe('expire / ttl', () => {
|
|
170
|
+
it('sets TTL for an existing key', async () => {
|
|
171
|
+
cjs_1.vi.useFakeTimers();
|
|
172
|
+
cjs_1.vi.setSystemTime(new Date('2026-07-12T12:00:00.000Z'));
|
|
173
|
+
await repository.set('name', 'Taon');
|
|
174
|
+
await repository.expire('name', 10);
|
|
175
|
+
await expect(repository.ttl('name')).resolves.toBe(10);
|
|
176
|
+
});
|
|
177
|
+
it('returns rounded-up TTL seconds', async () => {
|
|
178
|
+
cjs_1.vi.useFakeTimers();
|
|
179
|
+
cjs_1.vi.setSystemTime(new Date('2026-07-12T12:00:00.000Z'));
|
|
180
|
+
await repository.set('name', 'Taon');
|
|
181
|
+
await repository.expire('name', 10);
|
|
182
|
+
cjs_1.vi.advanceTimersByTime(1_500);
|
|
183
|
+
await expect(repository.ttl('name')).resolves.toBe(9);
|
|
184
|
+
});
|
|
185
|
+
it('removes a key after its TTL expires', async () => {
|
|
186
|
+
cjs_1.vi.useFakeTimers();
|
|
187
|
+
cjs_1.vi.setSystemTime(new Date('2026-07-12T12:00:00.000Z'));
|
|
188
|
+
await repository.set('name', 'Taon');
|
|
189
|
+
await repository.expire('name', 5);
|
|
190
|
+
cjs_1.vi.advanceTimersByTime(5_000);
|
|
191
|
+
await expect(repository.get('name')).resolves.toBeUndefined();
|
|
192
|
+
await expect(repository.has('name')).resolves.toBe(false);
|
|
193
|
+
await expect(repository.ttl('name')).resolves.toBeUndefined();
|
|
194
|
+
});
|
|
195
|
+
it('does nothing when expire is called for a missing key', async () => {
|
|
196
|
+
cjs_1.vi.useFakeTimers();
|
|
197
|
+
await repository.expire('name', 10);
|
|
198
|
+
await expect(repository.ttl('name')).resolves.toBeUndefined();
|
|
199
|
+
await expect(repository.has('name')).resolves.toBe(false);
|
|
200
|
+
});
|
|
201
|
+
it('removes the previous expiration when set is called again', async () => {
|
|
202
|
+
cjs_1.vi.useFakeTimers();
|
|
203
|
+
cjs_1.vi.setSystemTime(new Date('2026-07-12T12:00:00.000Z'));
|
|
204
|
+
await repository.set('name', 'Old value');
|
|
205
|
+
await repository.expire('name', 5);
|
|
206
|
+
cjs_1.vi.advanceTimersByTime(2_000);
|
|
207
|
+
await repository.set('name', 'New value');
|
|
208
|
+
cjs_1.vi.advanceTimersByTime(10_000);
|
|
209
|
+
await expect(repository.get('name')).resolves.toBe('New value');
|
|
210
|
+
await expect(repository.ttl('name')).resolves.toBeUndefined();
|
|
211
|
+
});
|
|
212
|
+
it('supports immediate expiration with zero TTL', async () => {
|
|
213
|
+
cjs_1.vi.useFakeTimers();
|
|
214
|
+
cjs_1.vi.setSystemTime(new Date('2026-07-12T12:00:00.000Z'));
|
|
215
|
+
await repository.set('name', 'Taon');
|
|
216
|
+
await repository.expire('name', 0);
|
|
217
|
+
await expect(repository.get('name')).resolves.toBeUndefined();
|
|
218
|
+
await expect(repository.has('name')).resolves.toBe(false);
|
|
219
|
+
});
|
|
220
|
+
it('does not expire the value before its TTL', async () => {
|
|
221
|
+
cjs_1.vi.useFakeTimers();
|
|
222
|
+
cjs_1.vi.setSystemTime(new Date('2026-07-12T12:00:00.000Z'));
|
|
223
|
+
await repository.set('name', 'Taon');
|
|
224
|
+
await repository.expire('name', 10);
|
|
225
|
+
cjs_1.vi.advanceTimersByTime(9_999);
|
|
226
|
+
await expect(repository.get('name')).resolves.toBe('Taon');
|
|
227
|
+
await expect(repository.ttl('name')).resolves.toBe(1);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
describe('getAllData', () => {
|
|
231
|
+
it('returns all stored values without KV metadata', async () => {
|
|
232
|
+
await repository.set('name', 'Taon');
|
|
233
|
+
await repository.set('counter', 5);
|
|
234
|
+
await repository.expire('name', 100);
|
|
235
|
+
const result = await repository.getAllData();
|
|
236
|
+
expect(result).toEqual({
|
|
237
|
+
name: 'Taon',
|
|
238
|
+
counter: 5,
|
|
239
|
+
});
|
|
240
|
+
expect(result).not.toHaveProperty('__kvMeta');
|
|
241
|
+
});
|
|
242
|
+
it('removes expired entries before returning data', async () => {
|
|
243
|
+
cjs_1.vi.useFakeTimers();
|
|
244
|
+
cjs_1.vi.setSystemTime(new Date('2026-07-12T12:00:00.000Z'));
|
|
245
|
+
await repository.set('name', 'Taon');
|
|
246
|
+
await repository.set('counter', 5);
|
|
247
|
+
await repository.expire('name', 2);
|
|
248
|
+
cjs_1.vi.advanceTimersByTime(2_000);
|
|
249
|
+
await expect(repository.getAllData()).resolves.toEqual({
|
|
250
|
+
counter: 5,
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
it('returns a deep clone and does not expose internal state', async () => {
|
|
254
|
+
await repository.set('settings', {
|
|
255
|
+
theme: 'light',
|
|
256
|
+
nested: {
|
|
257
|
+
enabled: true,
|
|
258
|
+
},
|
|
259
|
+
tags: ['one'],
|
|
260
|
+
});
|
|
261
|
+
const result = await repository.getAllData();
|
|
262
|
+
result.settings.theme = 'changed';
|
|
263
|
+
result.settings.nested.enabled = false;
|
|
264
|
+
result.settings.tags.push('two');
|
|
265
|
+
await expect(repository.get('settings')).resolves.toEqual({
|
|
266
|
+
theme: 'light',
|
|
267
|
+
nested: {
|
|
268
|
+
enabled: true,
|
|
269
|
+
},
|
|
270
|
+
tags: ['one'],
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
describe('repository isolation', () => {
|
|
275
|
+
it('keeps in-memory databases separate between repository instances', async () => {
|
|
276
|
+
const firstRepository = createRepository();
|
|
277
|
+
const secondRepository = createRepository();
|
|
278
|
+
await firstRepository.set('name', 'First');
|
|
279
|
+
await expect(firstRepository.get('name')).resolves.toBe('First');
|
|
280
|
+
await expect(secondRepository.get('name')).resolves.toBeUndefined();
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
describe('ctx mock', () => {
|
|
284
|
+
it('does not request a JSON location when using the in-memory database', async () => {
|
|
285
|
+
const ctx = repository.ctx;
|
|
286
|
+
await repository.set('name', 'Taon');
|
|
287
|
+
expect(ctx.kvDbJsonLocationForClass).not.toHaveBeenCalled();
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
//# sourceMappingURL=base-kv-repository.test.js.map
|