From 70a9a2476d46151d25cee8c0afeb13354cce45cd Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Thu, 7 Jul 2022 14:48:57 -0400 Subject: [PATCH] Pipe dependencies through to BaseStore without using getLegacyDi Signed-off-by: Sebastian Malton --- src/common/__tests__/base-store.test.ts | 25 +++++++----- src/common/base-store.ts | 40 +++++++++---------- .../cluster-store/cluster-store.injectable.ts | 8 ++++ src/common/cluster-store/cluster-store.ts | 7 ++-- ...get-configuration-file-model.injectable.ts | 4 +- src/common/hotbars/store.injectable.ts | 8 ++++ src/common/hotbars/store.ts | 9 +++-- .../user-store/user-store.injectable.ts | 8 ++++ src/common/user-store/user-store.ts | 10 ++--- src/common/weblinks/store.injectable.ts | 8 ++++ src/common/weblinks/store.ts | 5 ++- ...ile-system-provisioner-store.injectable.ts | 8 ++++ .../file-system-provisioner-store.ts | 9 +++-- src/extensions/extension-store.ts | 17 ++++++++ .../extensions-store.injectable.ts | 13 +++++- .../extensions-store/extensions-store.ts | 7 +++- 16 files changed, 132 insertions(+), 54 deletions(-) diff --git a/src/common/__tests__/base-store.test.ts b/src/common/__tests__/base-store.test.ts index e7eb952111..810e4007a2 100644 --- a/src/common/__tests__/base-store.test.ts +++ b/src/common/__tests__/base-store.test.ts @@ -4,6 +4,7 @@ */ 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"; @@ -15,6 +16,7 @@ import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; import appVersionInjectable from "../get-configuration-file-model/app-version/app-version.injectable"; +import loggerInjectable from "../logger.injectable"; jest.mock("electron", () => ({ ipcMain: { @@ -34,8 +36,8 @@ class TestStore extends BaseStore { @observable b = ""; @observable c = ""; - constructor() { - super({ + constructor(dependencies: BaseStoreDependencies) { + super(dependencies, { configName: "test-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names syncOptions: { @@ -82,13 +84,11 @@ describe("BaseStore", () => { let store: TestStore; beforeEach(() => { - const mainDi = getDiForUnitTesting({ doGeneralOverrides: true }); + const di = getDiForUnitTesting({ doGeneralOverrides: true }); - mainDi.override(directoryForUserDataInjectable, () => "some-user-data-directory"); - mainDi.permitSideEffects(getConfigurationFileModelInjectable); - mainDi.permitSideEffects(appVersionInjectable); - - TestStore.resetInstance(); + di.override(directoryForUserDataInjectable, () => "some-user-data-directory"); + di.permitSideEffects(getConfigurationFileModelInjectable); + di.permitSideEffects(appVersionInjectable); const mockOpts = { "some-user-data-directory": { @@ -98,13 +98,18 @@ describe("BaseStore", () => { mockFs(mockOpts); - store = TestStore.createInstance(); + TestStore.resetInstance(); + store = TestStore.createInstance({ + logger: di.inject(loggerInjectable), + appVersion: di.inject(appVersionInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + }); }); afterEach(() => { mockFs.restore(); store.disableSync(); - TestStore.resetInstance(); }); describe("persistence", () => { diff --git a/src/common/base-store.ts b/src/common/base-store.ts index e61915d5c2..39c4d99b8e 100644 --- a/src/common/base-store.ts +++ b/src/common/base-store.ts @@ -11,14 +11,11 @@ import type { IEqualsComparer } from "mobx"; import { makeObservable, reaction, runInAction } from "mobx"; import type { Disposer } from "./utils"; import { Singleton, toJS } from "./utils"; -import logger from "../main/logger"; import { broadcastMessage, ipcMainOn, ipcRendererOn } from "./ipc"; import isEqual from "lodash/isEqual"; 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 appVersionInjectable from "./get-configuration-file-model/app-version/app-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?: { @@ -27,6 +24,13 @@ export interface BaseStoreParams extends ConfOptions { }; } +export interface BaseStoreDependencies { + readonly logger: Logger; + readonly appVersion: string; + readonly directoryForUserData: string; + getConfigurationFileModel: GetConfigurationFileModel; +} + /** * Note: T should only contain base JSON serializable types. */ @@ -36,7 +40,7 @@ export abstract class BaseStore extends Singleton { readonly displayName: string = this.constructor.name; - protected constructor(protected params: BaseStoreParams) { + protected constructor(protected readonly depenendices: BaseStoreDependencies, protected params: BaseStoreParams) { super(); makeObservable(this); } @@ -45,26 +49,22 @@ export abstract class BaseStore extends Singleton { * This must be called after the last child's constructor is finished (or just before it finishes) */ load() { - logger.debug(`[${kebabCase(this.displayName).toUpperCase()}]: LOADING from ${this.path} ...`); - - const di = getLegacyGlobalDiForExtensionApi(); - const getConfigurationFileModel = di.inject(getConfigurationFileModelInjectable); - - this.storeConfig = getConfigurationFileModel({ + this.depenendices.logger.debug(`[${kebabCase(this.displayName).toUpperCase()}]: LOADING from ${this.path} ...`); + this.storeConfig = this.depenendices.getConfigurationFileModel({ ...this.params, projectName: "lens", - projectVersion: di.inject(appVersionInjectable), + projectVersion: this.depenendices.appVersion, cwd: this.cwd(), }); const res: any = 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.`); + this.depenendices.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(); - logger.debug(`[${kebabCase(this.displayName).toUpperCase()}]: LOADED from ${this.path}`); + this.depenendices.logger.debug(`[${kebabCase(this.displayName).toUpperCase()}]: LOADED from ${this.path}`); } get name() { @@ -84,13 +84,11 @@ export abstract class BaseStore extends Singleton { } protected cwd() { - const di = getLegacyGlobalDiForExtensionApi(); - - return di.inject(directoryForUserDataInjectable); + return this.depenendices.directoryForUserData; } protected saveToFile(model: T) { - logger.info(`[STORE]: SAVING ${this.path}`); + this.depenendices.logger.info(`[STORE]: SAVING ${this.path}`); // todo: update when fixed https://github.com/sindresorhus/conf/issues/114 if (this.storeConfig) { @@ -111,14 +109,14 @@ export abstract class BaseStore extends Singleton { if (ipcMain) { this.syncDisposers.push(ipcMainOn(this.syncMainChannel, (event, model: T) => { - logger.silly(`[STORE]: SYNC ${this.name} from renderer`, { model }); + this.depenendices.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.depenendices.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 6d759387e2..8be7fd8c71 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 { clusterStoreMigrationsInjectionToken } from "./migrations"; +import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import appVersionInjectable from "../get-configuration-file-model/app-version/app-version.injectable"; +import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../logger.injectable"; const clusterStoreInjectable = getInjectable({ id: "cluster-store", @@ -18,6 +22,10 @@ const clusterStoreInjectable = getInjectable({ createCluster: di.inject(createClusterInjectionToken), readClusterConfigSync: di.inject(readClusterConfigSyncInjectable), migrations: di.inject(clusterStoreMigrationsInjectionToken), + logger: di.inject(loggerInjectable), + appVersion: di.inject(appVersionInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), }); }, diff --git a/src/common/cluster-store/cluster-store.ts b/src/common/cluster-store/cluster-store.ts index c887094b62..36ee383613 100644 --- a/src/common/cluster-store/cluster-store.ts +++ b/src/common/cluster-store/cluster-store.ts @@ -6,6 +6,7 @@ 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 logger from "../../main/logger"; @@ -23,7 +24,7 @@ export interface ClusterStoreModel { clusters?: ClusterModel[]; } -interface Dependencies { +interface ClusterStoreDependencies extends BaseStoreDependencies { createCluster: CreateCluster; readClusterConfigSync: ReadClusterConfigSync; readonly migrations: Migrations | undefined; @@ -35,8 +36,8 @@ export class ClusterStore extends BaseStore { protected disposer = disposer(); - constructor(protected readonly dependencies: Dependencies) { - super({ + constructor(protected readonly dependencies: ClusterStoreDependencies) { + super(dependencies, { configName: "lens-cluster-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names syncOptions: { 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 a1027c22c6..4950894a32 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 @@ -6,9 +6,11 @@ import { getInjectable } from "@ogre-tools/injectable"; import Config from "conf"; import type { BaseStoreParams } from "../base-store"; +export type GetConfigurationFileModel = (content: BaseStoreParams) => 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 ace13b8be4..154cc876d7 100644 --- a/src/common/hotbars/store.injectable.ts +++ b/src/common/hotbars/store.injectable.ts @@ -6,6 +6,10 @@ 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 appVersionInjectable from "../get-configuration-file-model/app-version/app-version.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 { hotbarStoreMigrationsInjectionToken } from "./migrations"; const hotbarStoreInjectable = getInjectable({ id: "hotbar-store", @@ -15,7 +19,11 @@ const hotbarStoreInjectable = getInjectable({ return HotbarStore.createInstance({ catalogCatalogEntity: di.inject(catalogCatalogEntityInjectable), + migrations: di.inject(hotbarStoreMigrationsInjectionToken), logger: di.inject(loggerInjectable), + appVersion: di.inject(appVersionInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), }); }, diff --git a/src/common/hotbars/store.ts b/src/common/hotbars/store.ts index 520bcc199d..be3f057468 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 { toJS } from "../utils"; import type { CatalogEntity } from "../catalog"; @@ -21,7 +22,7 @@ export interface HotbarStoreModel { activeHotbarId: string; } -interface Dependencies { +interface HotbarStoreDependencies extends BaseStoreDependencies { readonly catalogCatalogEntity: GeneralEntity; readonly logger: Logger; readonly migrations: Migrations | undefined; @@ -32,8 +33,8 @@ export class HotbarStore extends BaseStore { @observable hotbars: Hotbar[] = []; @observable private _activeHotbarId!: string; - constructor(private readonly dependencies: Dependencies) { - super({ + constructor(protected readonly dependencies: HotbarStoreDependencies) { + super(dependencies, { configName: "lens-hotbar-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names syncOptions: { @@ -149,7 +150,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 87c216ae5c..dbda8f629e 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 "../application-update/selected-update-channel/selected-update-channel.injectable"; import { userStoreMigrationsInjectionToken, userStorePreMigrationsInjectionToken } from "./migrations"; +import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import appVersionInjectable from "../get-configuration-file-model/app-version/app-version.injectable"; +import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../logger.injectable"; const userStoreInjectable = getInjectable({ id: "user-store", @@ -22,6 +26,10 @@ const userStoreInjectable = getInjectable({ return UserStore.createInstance({ selectedUpdateChannel: di.inject(selectedUpdateChannelInjectable), migrations: di.inject(userStoreMigrationsInjectionToken), + logger: di.inject(loggerInjectable), + appVersion: di.inject(appVersionInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), }); }, diff --git a/src/common/user-store/user-store.ts b/src/common/user-store/user-store.ts index 70de68c869..bd453723eb 100644 --- a/src/common/user-store/user-store.ts +++ b/src/common/user-store/user-store.ts @@ -6,6 +6,7 @@ import { app } from "electron"; import semver from "semver"; import { action, computed, observable, reaction, makeObservable, isObservableArray, isObservableSet, isObservableMap } from "mobx"; +import type { BaseStoreDependencies } from "../base-store"; import { BaseStore } from "../base-store"; import { getAppVersion } from "../utils/app-version"; import { kubeConfigDefaultPath } from "../kube-helpers"; @@ -13,7 +14,6 @@ import { appEventBus } from "../app-event-bus/event-bus"; 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 { SelectedUpdateChannel } from "../application-update/selected-update-channel/selected-update-channel.injectable"; import type { UpdateChannelId } from "../application-update/update-channels"; import type { Migrations } from "conf/dist/source/types"; @@ -23,7 +23,7 @@ export interface UserStoreModel { preferences: UserPreferencesModel; } -interface Dependencies { +interface UserStoreDependencies extends BaseStoreDependencies { readonly selectedUpdateChannel: SelectedUpdateChannel; readonly migrations: Migrations | undefined; } @@ -31,8 +31,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: UserStoreDependencies) { + super(dependencies, { configName: "lens-user-store", migrations: dependencies.migrations, }); @@ -160,7 +160,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/weblinks/store.injectable.ts b/src/common/weblinks/store.injectable.ts index 0a00d32056..1c7f8203c3 100644 --- a/src/common/weblinks/store.injectable.ts +++ b/src/common/weblinks/store.injectable.ts @@ -3,6 +3,10 @@ * 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 appVersionInjectable from "../get-configuration-file-model/app-version/app-version.injectable"; +import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../logger.injectable"; import { weblinksStoreMigrationsInjectionToken } from "./migrations"; import { WeblinkStore } from "./store"; @@ -14,6 +18,10 @@ const weblinkStoreInjectable = getInjectable({ return WeblinkStore.createInstance({ migrations: di.inject(weblinksStoreMigrationsInjectionToken), + logger: di.inject(loggerInjectable), + appVersion: di.inject(appVersionInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), }); }, }); diff --git a/src/common/weblinks/store.ts b/src/common/weblinks/store.ts index 5510ae1ebd..764e79a883 100644 --- a/src/common/weblinks/store.ts +++ b/src/common/weblinks/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 * as uuid from "uuid"; import { toJS } from "../utils"; @@ -26,7 +27,7 @@ export interface WeblinkStoreModel { weblinks: WeblinkData[]; } -export interface WeblinkStoreDependencies { +export interface WeblinkStoreDependencies extends BaseStoreDependencies { readonly migrations: Migrations | undefined; } @@ -35,7 +36,7 @@ export class WeblinkStore extends BaseStore { @observable weblinks: WeblinkData[] = []; constructor(protected readonly dependencies: WeblinkStoreDependencies) { - super({ + super(dependencies, { 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 a0951baa8f..e5247a6c60 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 @@ -5,6 +5,10 @@ import { getInjectable } from "@ogre-tools/injectable"; import { FileSystemProvisionerStore } from "./file-system-provisioner-store"; import directoryForExtensionDataInjectable from "./directory-for-extension-data.injectable"; +import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import appVersionInjectable from "../../../common/get-configuration-file-model/app-version/app-version.injectable"; +import getConfigurationFileModelInjectable from "../../../common/get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../../../common/logger.injectable"; const fileSystemProvisionerStoreInjectable = getInjectable({ id: "file-system-provisioner-store", @@ -14,6 +18,10 @@ const fileSystemProvisionerStoreInjectable = getInjectable({ return FileSystemProvisionerStore.createInstance({ directoryForExtensionData: di.inject(directoryForExtensionDataInjectable), + logger: di.inject(loggerInjectable), + appVersion: di.inject(appVersionInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), }); }, 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 fab21df3cc..197483cfcc 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 @@ -8,6 +8,7 @@ import { SHA256 } from "crypto-js"; import fse from "fs-extra"; import { action, makeObservable, observable } from "mobx"; import path from "path"; +import type { BaseStoreDependencies } from "../../../common/base-store"; import { BaseStore } from "../../../common/base-store"; import type { LensExtensionId } from "../../lens-extension"; import { getOrInsertWith, toJS } from "../../../common/utils"; @@ -16,16 +17,16 @@ interface FSProvisionModel { extensions: Record; // extension names to paths } -interface Dependencies { - directoryForExtensionData: string; +interface FileSystemProvisionerStoreDependencies extends BaseStoreDependencies { + readonly directoryForExtensionData: string; } export class FileSystemProvisionerStore extends BaseStore { readonly displayName = "FilesystemProvisionerStore"; registeredExtensions = observable.map(); - constructor(private dependencies: Dependencies) { - super({ + constructor(protected readonly dependencies: FileSystemProvisionerStoreDependencies) { + 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 62799f9843..24085034ae 100644 --- a/src/extensions/extension-store.ts +++ b/src/extensions/extension-store.ts @@ -3,15 +3,32 @@ * 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 { getLegacyGlobalDiForExtensionApi } from "./as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; +import loggerInjectable from "../common/logger.injectable"; +import getConfigurationFileModelInjectable from "../common/get-configuration-file-model/get-configuration-file-model.injectable"; +import directoryForUserDataInjectable from "../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import appVersionInjectable from "../common/get-configuration-file-model/app-version/app-version.injectable"; export abstract class ExtensionStore extends BaseStore { readonly displayName = "ExtensionStore"; protected extension?: LensExtension; + constructor(params: BaseStoreParams) { + const di = getLegacyGlobalDiForExtensionApi(); + + super({ + logger: di.inject(loggerInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + appVersion: di.inject(appVersionInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + }, params); + } + loadExtension(extension: LensExtension) { this.extension = extension; diff --git a/src/extensions/extensions-store/extensions-store.injectable.ts b/src/extensions/extensions-store/extensions-store.injectable.ts index edf84e4b66..c2f38a7063 100644 --- a/src/extensions/extensions-store/extensions-store.injectable.ts +++ b/src/extensions/extensions-store/extensions-store.injectable.ts @@ -3,15 +3,24 @@ * 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 appVersionInjectable from "../../common/get-configuration-file-model/app-version/app-version.injectable"; +import getConfigurationFileModelInjectable from "../../common/get-configuration-file-model/get-configuration-file-model.injectable"; +import loggerInjectable from "../../common/logger.injectable"; import { ExtensionsStore } from "./extensions-store"; const extensionsStoreInjectable = getInjectable({ id: "extensions-store", - instantiate: () => { + instantiate: (di) => { ExtensionsStore.resetInstance(); - return ExtensionsStore.createInstance(); + return ExtensionsStore.createInstance({ + logger: di.inject(loggerInjectable), + getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), + appVersion: di.inject(appVersionInjectable), + directoryForUserData: di.inject(directoryForUserDataInjectable), + }); }, causesSideEffects: true, diff --git a/src/extensions/extensions-store/extensions-store.ts b/src/extensions/extensions-store/extensions-store.ts index 2ec1c8fd55..e0872117a3 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 { @@ -22,10 +23,12 @@ export interface IsEnabledExtensionDescriptor { isBundled: boolean; } +export interface ExtensionsStoreDependencies extends BaseStoreDependencies {} + export class ExtensionsStore extends BaseStore { readonly displayName = "ExtensionsStore"; - constructor() { - super({ + constructor(protected readonly dependencies: ExtensionsStoreDependencies) { + super(dependencies, { configName: "lens-extensions", }); makeObservable(this);