diff --git a/src/common/__tests__/base-store.test.ts b/src/common/__tests__/base-store.test.ts index 9a4d512062..c91f4c5bfb 100644 --- a/src/common/__tests__/base-store.test.ts +++ b/src/common/__tests__/base-store.test.ts @@ -4,12 +4,15 @@ */ import mockFs from "mock-fs"; +import type { BaseStoreDependencies } from "../base-store"; import { BaseStore } from "../base-store"; import { action, comparer, makeObservable, observable, toJS } from "mobx"; import { readFileSync } from "fs"; import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; import { getDiForUnitTesting } from "../../main/getDiForUnitTesting"; import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../logger.injectable"; +import storeMigrationVersionInjectable from "../vars/store-migration-version.injectable"; jest.mock("electron", () => ({ ipcMain: { @@ -29,8 +32,8 @@ class TestStore extends BaseStore { @observable b = ""; @observable c = ""; - constructor() { - super({ + constructor(deps: BaseStoreDependencies) { + super(deps, { configName: "test-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names syncOptions: { @@ -90,7 +93,12 @@ describe("BaseStore", () => { mockFs(mockOpts); - store = new TestStore(); + store = new TestStore({ + directoryForUserData: mainDi.inject(directoryForUserDataInjectable), + getConfigurationFileModel: mainDi.inject(getConfigurationFileModelInjectable), + logger: mainDi.inject(loggerInjectable), + storeMigrationVersion: mainDi.inject(storeMigrationVersionInjectable), + }); }); afterEach(() => { diff --git a/src/common/base-store.ts b/src/common/base-store.ts index 5372d34482..2dccf5f593 100644 --- a/src/common/base-store.ts +++ b/src/common/base-store.ts @@ -10,22 +10,26 @@ import { ipcMain, ipcRenderer } from "electron"; import type { IEqualsComparer } from "mobx"; import { makeObservable, reaction, runInAction } from "mobx"; import type { Disposer } from "./utils"; -import { toJS } from "./utils"; -import logger from "../main/logger"; +import { isPromiseLike, toJS } from "./utils"; import { broadcastMessage, ipcMainOn, ipcRendererOn } from "./ipc"; import isEqual from "lodash/isEqual"; -import { isTestEnv } from "./vars"; import { kebabCase } from "lodash"; -import { getLegacyGlobalDiForExtensionApi } from "../extensions/as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; -import directoryForUserDataInjectable from "./app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import getConfigurationFileModelInjectable from "./get-configuration-file-model/get-configuration-file-model.injectable"; -import storeMigrationVersionInjectable from "./vars/store-migration-version.injectable"; +import type { GetConfigurationFileModel } from "./get-configuration-file-model/get-configuration-file-model.injectable"; +import type { Logger } from "./logger"; export interface BaseStoreParams extends ConfOptions { syncOptions?: { fireImmediately?: boolean; equals?: IEqualsComparer; }; + configName: string; +} + +export interface BaseStoreDependencies { + readonly logger: Logger; + readonly storeMigrationVersion: string; + readonly directoryForUserData: string; + getConfigurationFileModel: GetConfigurationFileModel; } /** @@ -35,13 +39,18 @@ export abstract class BaseStore { protected storeConfig?: Config; protected syncDisposers: Disposer[] = []; - readonly displayName: string = this.constructor.name; + readonly displayName: string; - protected constructor(protected params: BaseStoreParams) { + protected constructor( + protected readonly dependencies: BaseStoreDependencies, + protected readonly params: BaseStoreParams, + ) { makeObservable(this); + this.displayName = this.params.configName; + if (ipcRenderer) { - params.migrations = undefined; // don't run migrations on renderer + this.params.migrations = undefined; // don't run migrations on renderer } } @@ -49,32 +58,22 @@ export abstract class BaseStore { * This must be called after the last child's constructor is finished (or just before it finishes) */ load() { - if (!isTestEnv) { - logger.info(`[${kebabCase(this.displayName).toUpperCase()}]: LOADING from ${this.path} ...`); - } - - const di = getLegacyGlobalDiForExtensionApi(); - - const getConfigurationFileModel = di.inject(getConfigurationFileModelInjectable); - - this.storeConfig = getConfigurationFileModel({ + this.dependencies.logger.info(`[${kebabCase(this.displayName).toUpperCase()}]: LOADING ...`); + this.storeConfig = this.dependencies.getConfigurationFileModel({ projectName: "lens", - projectVersion: di.inject(storeMigrationVersionInjectable), + projectVersion: this.dependencies.storeMigrationVersion, cwd: this.cwd(), ...this.params, }); - const res: any = this.fromStore(this.storeConfig.store); + const res = this.fromStore(this.storeConfig.store); - if (res instanceof Promise || (typeof res === "object" && res && typeof res.then === "function")) { - console.error(`${this.displayName} extends BaseStore's fromStore method returns a Promise or promise-like object. This is an error and must be fixed.`); + if (isPromiseLike(res)) { + this.dependencies.logger.error(`${this.displayName} extends BaseStore's fromStore method returns a Promise or promise-like object. This is an error and must be fixed.`); } this.enableSync(); - - if (!isTestEnv) { - logger.info(`[${kebabCase(this.displayName).toUpperCase()}]: LOADED from ${this.path}`); - } + this.dependencies.logger.info(`[${kebabCase(this.displayName).toUpperCase()}]: LOADED from ${this.path}`); } get name() { @@ -94,13 +93,11 @@ export abstract class BaseStore { } protected cwd() { - const di = getLegacyGlobalDiForExtensionApi(); - - return di.inject(directoryForUserDataInjectable); + return this.dependencies.directoryForUserData; } protected saveToFile(model: T) { - logger.info(`[STORE]: SAVING ${this.path}`); + this.dependencies.logger.info(`[STORE]: SAVING ${this.path}`); // todo: update when fixed https://github.com/sindresorhus/conf/issues/114 if (this.storeConfig) { @@ -121,14 +118,14 @@ export abstract class BaseStore { if (ipcMain) { this.syncDisposers.push(ipcMainOn(this.syncMainChannel, (event, model: T) => { - logger.silly(`[STORE]: SYNC ${this.name} from renderer`, { model }); + this.dependencies.logger.silly(`[STORE]: SYNC ${this.name} from renderer`, { model }); this.onSync(model); })); } if (ipcRenderer) { this.syncDisposers.push(ipcRendererOn(this.syncRendererChannel, (event, model: T) => { - logger.silly(`[STORE]: SYNC ${this.name} from main`, { model }); + this.dependencies.logger.silly(`[STORE]: SYNC ${this.name} from main`, { model }); this.onSyncFromMain(model); })); } diff --git a/src/common/cluster-store/cluster-store.injectable.ts b/src/common/cluster-store/cluster-store.injectable.ts index 3904eb3d73..b1de070bdf 100644 --- a/src/common/cluster-store/cluster-store.injectable.ts +++ b/src/common/cluster-store/cluster-store.injectable.ts @@ -7,6 +7,10 @@ import { ClusterStore } from "./cluster-store"; import { createClusterInjectionToken } from "../cluster/create-cluster-injection-token"; import readClusterConfigSyncInjectable from "./read-cluster-config.injectable"; import emitAppEventInjectable from "../app-event-bus/emit-event.injectable"; +import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../logger.injectable"; +import storeMigrationVersionInjectable from "../vars/store-migration-version.injectable"; const clusterStoreInjectable = getInjectable({ id: "cluster-store", @@ -15,9 +19,11 @@ const clusterStoreInjectable = getInjectable({ createCluster: di.inject(createClusterInjectionToken), readClusterConfigSync: di.inject(readClusterConfigSyncInjectable), emitAppEvent: di.inject(emitAppEventInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + logger: di.inject(loggerInjectable), + storeMigrationVersion: di.inject(storeMigrationVersionInjectable), }), - - causesSideEffects: true, }); export default clusterStoreInjectable; diff --git a/src/common/cluster-store/cluster-store.ts b/src/common/cluster-store/cluster-store.ts index 462c1c6dc3..d40f948412 100644 --- a/src/common/cluster-store/cluster-store.ts +++ b/src/common/cluster-store/cluster-store.ts @@ -6,10 +6,10 @@ import { ipcMain, ipcRenderer, webFrame } from "electron"; import { action, comparer, computed, makeObservable, observable, reaction } from "mobx"; +import type { BaseStoreDependencies } from "../base-store"; import { BaseStore } from "../base-store"; import { Cluster } from "../cluster/cluster"; import migrations from "../../migrations/cluster-store"; -import logger from "../../main/logger"; import { disposer, toJS } from "../utils"; import type { ClusterModel, ClusterId, ClusterState } from "../cluster-types"; import { requestInitialClusterStates } from "../../renderer/ipc"; @@ -21,7 +21,7 @@ export interface ClusterStoreModel { clusters?: ClusterModel[]; } -interface Dependencies { +interface Dependencies extends BaseStoreDependencies { createCluster: CreateCluster; readClusterConfigSync: ReadClusterConfigSync; emitAppEvent: EmitAppEvent; @@ -29,12 +29,12 @@ interface Dependencies { export class ClusterStore extends BaseStore { readonly displayName = "ClusterStore"; - clusters = observable.map(); + readonly clusters = observable.map(); protected disposer = disposer(); - constructor(private readonly dependencies: Dependencies) { - super({ + constructor(protected readonly dependencies: Dependencies) { + super(dependencies, { configName: "lens-cluster-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names syncOptions: { @@ -49,7 +49,7 @@ export class ClusterStore extends BaseStore { } async loadInitialOnRenderer() { - logger.info("[CLUSTER-STORE] requesting initial state sync"); + this.dependencies.logger.info("[CLUSTER-STORE] requesting initial state sync"); for (const { id, state } of await requestInitialClusterStates()) { this.getById(id)?.setState(state); @@ -65,7 +65,7 @@ export class ClusterStore extends BaseStore { } registerIpcListener() { - logger.info(`[CLUSTER-STORE] start to listen (${webFrame.routingId})`); + this.dependencies.logger.info(`[CLUSTER-STORE] start to listen (${webFrame.routingId})`); const ipc = ipcMain ?? ipcRenderer; ipc?.on("cluster:state", (event, clusterId: ClusterId, state: ClusterState) => { @@ -139,7 +139,7 @@ export class ClusterStore extends BaseStore { } newClusters.set(clusterModel.id, cluster); } catch (error) { - logger.warn(`[CLUSTER-STORE]: Failed to update/create a cluster: ${error}`); + this.dependencies.logger.warn(`[CLUSTER-STORE]: Failed to update/create a cluster: ${error}`); } } diff --git a/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts b/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts index dc54e96de1..e167e464ef 100644 --- a/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts +++ b/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts @@ -4,11 +4,13 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import Config from "conf"; -import type { BaseStoreParams } from "../base-store"; +import type { Options as ConfOptions } from "conf/dist/source/types"; + +export type GetConfigurationFileModel = (content: ConfOptions) => Config; const getConfigurationFileModelInjectable = getInjectable({ id: "get-configuration-file-model", - instantiate: () => (content: BaseStoreParams) => new Config(content), + instantiate: (): GetConfigurationFileModel => (content) => new Config(content), causesSideEffects: true, }); diff --git a/src/common/hotbars/store.injectable.ts b/src/common/hotbars/store.injectable.ts index 23ef120ed9..ebb9e8dc56 100644 --- a/src/common/hotbars/store.injectable.ts +++ b/src/common/hotbars/store.injectable.ts @@ -6,6 +6,9 @@ import { getInjectable } from "@ogre-tools/injectable"; import catalogCatalogEntityInjectable from "../catalog-entities/general-catalog-entities/implementations/catalog-catalog-entity.injectable"; import { HotbarStore } from "./store"; import loggerInjectable from "../logger.injectable"; +import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; +import storeMigrationVersionInjectable from "../vars/store-migration-version.injectable"; const hotbarStoreInjectable = getInjectable({ id: "hotbar-store", @@ -13,9 +16,10 @@ const hotbarStoreInjectable = getInjectable({ instantiate: (di) => new HotbarStore({ catalogCatalogEntity: di.inject(catalogCatalogEntityInjectable), logger: di.inject(loggerInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + storeMigrationVersion: di.inject(storeMigrationVersionInjectable), }), - - causesSideEffects: true, }); export default hotbarStoreInjectable; diff --git a/src/common/hotbars/store.ts b/src/common/hotbars/store.ts index a75182b23b..be2b437e3f 100644 --- a/src/common/hotbars/store.ts +++ b/src/common/hotbars/store.ts @@ -4,6 +4,7 @@ */ import { action, comparer, observable, makeObservable, computed } from "mobx"; +import type { BaseStoreDependencies } from "../base-store"; import { BaseStore } from "../base-store"; import migrations from "../../migrations/hotbar-store"; import { toJS } from "../utils"; @@ -21,7 +22,7 @@ export interface HotbarStoreModel { activeHotbarId: string; } -interface Dependencies { +interface Dependencies extends BaseStoreDependencies { readonly catalogCatalogEntity: GeneralEntity; readonly logger: Logger; } @@ -31,8 +32,8 @@ export class HotbarStore extends BaseStore { @observable hotbars: Hotbar[] = []; @observable private _activeHotbarId!: string; - constructor(private readonly dependencies: Dependencies) { - super({ + constructor(protected readonly dependencies: Dependencies) { + super(dependencies, { configName: "lens-hotbar-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names syncOptions: { @@ -148,7 +149,7 @@ export class HotbarStore extends BaseStore { const index = this.hotbars.findIndex((hotbar) => hotbar.id === id); if (index < 0) { - return void console.warn( + return this.dependencies.logger.warn( `[HOTBAR-STORE]: cannot setHotbarName: unknown id`, { id }, ); diff --git a/src/common/user-store/user-store.injectable.ts b/src/common/user-store/user-store.injectable.ts index d593ea052d..6d7fd7c722 100644 --- a/src/common/user-store/user-store.injectable.ts +++ b/src/common/user-store/user-store.injectable.ts @@ -6,6 +6,10 @@ import { getInjectable } from "@ogre-tools/injectable"; import { UserStore } from "./user-store"; import selectedUpdateChannelInjectable from "../../features/application-update/common/selected-update-channel/selected-update-channel.injectable"; import emitAppEventInjectable from "../app-event-bus/emit-event.injectable"; +import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../logger.injectable"; +import storeMigrationVersionInjectable from "../vars/store-migration-version.injectable"; const userStoreInjectable = getInjectable({ id: "user-store", @@ -13,9 +17,11 @@ const userStoreInjectable = getInjectable({ instantiate: (di) => new UserStore({ selectedUpdateChannel: di.inject(selectedUpdateChannelInjectable), emitAppEvent: di.inject(emitAppEventInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + logger: di.inject(loggerInjectable), + storeMigrationVersion: di.inject(storeMigrationVersionInjectable), }), - - causesSideEffects: true, }); export default userStoreInjectable; diff --git a/src/common/user-store/user-store.ts b/src/common/user-store/user-store.ts index 7db6127ed8..306bcda5a1 100644 --- a/src/common/user-store/user-store.ts +++ b/src/common/user-store/user-store.ts @@ -5,12 +5,12 @@ import { app } from "electron"; import { action, observable, reaction, makeObservable, isObservableArray, isObservableSet, isObservableMap } from "mobx"; +import type { BaseStoreDependencies } from "../base-store"; import { BaseStore } from "../base-store"; import migrations from "../../migrations/user-store"; import { getOrInsertSet, toggle, toJS, object } from "../../renderer/utils"; import { DESCRIPTORS } from "./preferences-helpers"; import type { UserPreferencesModel, StoreType } from "./preferences-helpers"; -import logger from "../../main/logger"; import type { EmitAppEvent } from "../app-event-bus/emit-event.injectable"; // TODO: Remove coupling with Feature @@ -22,7 +22,7 @@ export interface UserStoreModel { preferences: UserPreferencesModel; } -interface Dependencies { +interface Dependencies extends BaseStoreDependencies { readonly selectedUpdateChannel: SelectedUpdateChannel; emitAppEvent: EmitAppEvent; } @@ -30,8 +30,8 @@ interface Dependencies { export class UserStore extends BaseStore /* implements UserStoreFlatModel (when strict null is enabled) */ { readonly displayName = "UserStore"; - constructor(private readonly dependencies: Dependencies) { - super({ + constructor(protected readonly dependencies: Dependencies) { + super(dependencies, { configName: "lens-user-store", migrations, }); @@ -138,7 +138,7 @@ export class UserStore extends BaseStore /* implements UserStore @action protected fromStore({ lastSeenAppVersion, preferences }: Partial = {}) { - logger.debug("UserStore.fromStore()", { lastSeenAppVersion, preferences }); + this.dependencies.logger.debug("UserStore.fromStore()", { lastSeenAppVersion, preferences }); if (lastSeenAppVersion) { this.lastSeenAppVersion = lastSeenAppVersion; diff --git a/src/common/utils/type-narrowing.ts b/src/common/utils/type-narrowing.ts index 936fb48816..6e93bacb99 100644 --- a/src/common/utils/type-narrowing.ts +++ b/src/common/utils/type-narrowing.ts @@ -123,6 +123,10 @@ export function isDefined(val: T | undefined | null): val is T { return val != null; } +export function isFunction(val: unknown): val is (...args: unknown[]) => unknown { + return typeof val === "function"; +} + /** * Checks if the value in the second position is non-nullable */ @@ -146,6 +150,15 @@ export function hasDefiniteField(field: Field): (val: return (val): val is T & { [f in Field]-?: NonNullable } => val[field] != null; } +export function isPromiseLike(res: unknown): res is (Promise | { then: () => unknown }) { + if (res instanceof Promise) { + return true; + } + + return isObject(res) + && hasTypedProperty(res, "then", isFunction); +} + export function isPromiseSettledRejected(result: PromiseSettledResult): result is PromiseRejectedResult { return result.status === "rejected"; } diff --git a/src/common/weblink-store.injectable.ts b/src/common/weblink-store.injectable.ts index 1e6497f2b1..f6072318e8 100644 --- a/src/common/weblink-store.injectable.ts +++ b/src/common/weblink-store.injectable.ts @@ -3,11 +3,20 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; +import directoryForUserDataInjectable from "./app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import getConfigurationFileModelInjectable from "./get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "./logger.injectable"; +import storeMigrationVersionInjectable from "./vars/store-migration-version.injectable"; import { WeblinkStore } from "./weblink-store"; const weblinkStoreInjectable = getInjectable({ id: "weblink-store", - instantiate: () => new WeblinkStore(), + instantiate: (di) => new WeblinkStore({ + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + logger: di.inject(loggerInjectable), + storeMigrationVersion: di.inject(storeMigrationVersionInjectable), + }), }); export default weblinkStoreInjectable; diff --git a/src/common/weblink-store.ts b/src/common/weblink-store.ts index a8430666e5..c8a50ba605 100644 --- a/src/common/weblink-store.ts +++ b/src/common/weblink-store.ts @@ -4,6 +4,7 @@ */ import { action, comparer, observable, makeObservable } from "mobx"; +import type { BaseStoreDependencies } from "./base-store"; import { BaseStore } from "./base-store"; import migrations from "../migrations/weblinks-store"; import * as uuid from "uuid"; @@ -30,8 +31,8 @@ export class WeblinkStore extends BaseStore { readonly displayName = "WeblinkStore"; @observable weblinks: WeblinkData[] = []; - constructor() { - super({ + constructor(deps: BaseStoreDependencies) { + super(deps, { configName: "lens-weblink-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names syncOptions: { diff --git a/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts b/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts index ad601307b9..dc50db6001 100644 --- a/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts +++ b/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts @@ -8,6 +8,10 @@ import directoryForExtensionDataInjectable from "./directory-for-extension-data. import ensureDirectoryInjectable from "../../../common/fs/ensure-dir.injectable"; import joinPathsInjectable from "../../../common/path/join-paths.injectable"; import randomBytesInjectable from "../../../common/utils/random-bytes.injectable"; +import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import getConfigurationFileModelInjectable from "../../../common/get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../../../common/logger.injectable"; +import storeMigrationVersionInjectable from "../../../common/vars/store-migration-version.injectable"; const fileSystemProvisionerStoreInjectable = getInjectable({ id: "file-system-provisioner-store", @@ -17,6 +21,10 @@ const fileSystemProvisionerStoreInjectable = getInjectable({ ensureDirectory: di.inject(ensureDirectoryInjectable), joinPaths: di.inject(joinPathsInjectable), randomBytes: di.inject(randomBytesInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + logger: di.inject(loggerInjectable), + storeMigrationVersion: di.inject(storeMigrationVersionInjectable), }), }); diff --git a/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts b/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts index 7753d1a9ab..9be4c0529a 100644 --- a/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts +++ b/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts @@ -5,6 +5,7 @@ import { SHA256 } from "crypto-js"; import { action, makeObservable, observable } from "mobx"; +import type { BaseStoreDependencies } from "../../../common/base-store"; import { BaseStore } from "../../../common/base-store"; import type { LensExtensionId } from "../../lens-extension"; import { getOrInsertWithAsync, toJS } from "../../../common/utils"; @@ -16,7 +17,7 @@ interface FSProvisionModel { extensions: Record; // extension names to paths } -interface Dependencies { +interface Dependencies extends BaseStoreDependencies { readonly directoryForExtensionData: string; ensureDirectory: EnsureDirectory; joinPaths: JoinPaths; @@ -27,8 +28,8 @@ export class FileSystemProvisionerStore extends BaseStore { readonly displayName = "FilesystemProvisionerStore"; readonly registeredExtensions = observable.map(); - constructor(private readonly dependencies: Dependencies) { - super({ + constructor(protected readonly dependencies: Dependencies) { + super(dependencies, { configName: "lens-filesystem-provisioner-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names }); diff --git a/src/extensions/extension-store.ts b/src/extensions/extension-store.ts index 868247260e..2ebd1a6089 100644 --- a/src/extensions/extension-store.ts +++ b/src/extensions/extension-store.ts @@ -3,12 +3,18 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ +import type { BaseStoreParams } from "../common/base-store"; import { BaseStore } from "../common/base-store"; import * as path from "path"; import type { LensExtension } from "./lens-extension"; import assert from "assert"; import type { StaticThis } from "../common/utils"; import { getOrInsertWith } from "../common/utils"; +import { getLegacyGlobalDiForExtensionApi } from "./as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; +import directoryForUserDataInjectable from "../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import getConfigurationFileModelInjectable from "../common/get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../common/logger.injectable"; +import storeMigrationVersionInjectable from "../common/vars/store-migration-version.injectable"; export abstract class ExtensionStore extends BaseStore { private static readonly instances = new WeakMap>(); @@ -33,6 +39,17 @@ export abstract class ExtensionStore extends BaseStore { return ExtensionStore.instances.get(this) as (T | undefined); } + constructor(params: BaseStoreParams) { + const di = getLegacyGlobalDiForExtensionApi(); + + super({ + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + logger: di.inject(loggerInjectable), + storeMigrationVersion: di.inject(storeMigrationVersionInjectable), + }, params); + } + /** * @deprecated This is a form of global shared state. Just call `new Store(...)` */ diff --git a/src/extensions/extensions-store/extensions-store.injectable.ts b/src/extensions/extensions-store/extensions-store.injectable.ts index 927444e9e2..baef79dfae 100644 --- a/src/extensions/extensions-store/extensions-store.injectable.ts +++ b/src/extensions/extensions-store/extensions-store.injectable.ts @@ -3,11 +3,20 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; +import directoryForUserDataInjectable from "../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import getConfigurationFileModelInjectable from "../../common/get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../../common/logger.injectable"; +import storeMigrationVersionInjectable from "../../common/vars/store-migration-version.injectable"; import { ExtensionsStore } from "./extensions-store"; const extensionsStoreInjectable = getInjectable({ id: "extensions-store", - instantiate: () => new ExtensionsStore(), + instantiate: (di) => new ExtensionsStore({ + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + logger: di.inject(loggerInjectable), + storeMigrationVersion: di.inject(storeMigrationVersionInjectable), + }), }); export default extensionsStoreInjectable; diff --git a/src/extensions/extensions-store/extensions-store.ts b/src/extensions/extensions-store/extensions-store.ts index 2ec1c8fd55..51f56f531a 100644 --- a/src/extensions/extensions-store/extensions-store.ts +++ b/src/extensions/extensions-store/extensions-store.ts @@ -6,6 +6,7 @@ import type { LensExtensionId } from "../lens-extension"; import { action, computed, makeObservable, observable } from "mobx"; import { toJS } from "../../common/utils"; +import type { BaseStoreDependencies } from "../../common/base-store"; import { BaseStore } from "../../common/base-store"; export interface LensExtensionsStoreModel { @@ -24,8 +25,8 @@ export interface IsEnabledExtensionDescriptor { export class ExtensionsStore extends BaseStore { readonly displayName = "ExtensionsStore"; - constructor() { - super({ + constructor(deps: BaseStoreDependencies) { + super(deps, { configName: "lens-extensions", }); makeObservable(this);