1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Pipe dependencies through to BaseStore without using getLegacyDi

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2022-07-07 14:48:57 -04:00
parent 7e4de0a74e
commit 70a9a2476d
16 changed files with 132 additions and 54 deletions

View File

@ -4,6 +4,7 @@
*/ */
import mockFs from "mock-fs"; import mockFs from "mock-fs";
import type { BaseStoreDependencies } from "../base-store";
import { BaseStore } from "../base-store"; import { BaseStore } from "../base-store";
import { action, comparer, makeObservable, observable, toJS } from "mobx"; import { action, comparer, makeObservable, observable, toJS } from "mobx";
import { readFileSync } from "fs"; import { readFileSync } from "fs";
@ -15,6 +16,7 @@ import getConfigurationFileModelInjectable
from "../get-configuration-file-model/get-configuration-file-model.injectable"; from "../get-configuration-file-model/get-configuration-file-model.injectable";
import appVersionInjectable import appVersionInjectable
from "../get-configuration-file-model/app-version/app-version.injectable"; from "../get-configuration-file-model/app-version/app-version.injectable";
import loggerInjectable from "../logger.injectable";
jest.mock("electron", () => ({ jest.mock("electron", () => ({
ipcMain: { ipcMain: {
@ -34,8 +36,8 @@ class TestStore extends BaseStore<TestStoreModel> {
@observable b = ""; @observable b = "";
@observable c = ""; @observable c = "";
constructor() { constructor(dependencies: BaseStoreDependencies) {
super({ super(dependencies, {
configName: "test-store", configName: "test-store",
accessPropertiesByDotNotation: false, // To make dots safe in cluster context names accessPropertiesByDotNotation: false, // To make dots safe in cluster context names
syncOptions: { syncOptions: {
@ -82,13 +84,11 @@ describe("BaseStore", () => {
let store: TestStore; let store: TestStore;
beforeEach(() => { beforeEach(() => {
const mainDi = getDiForUnitTesting({ doGeneralOverrides: true }); const di = getDiForUnitTesting({ doGeneralOverrides: true });
mainDi.override(directoryForUserDataInjectable, () => "some-user-data-directory"); di.override(directoryForUserDataInjectable, () => "some-user-data-directory");
mainDi.permitSideEffects(getConfigurationFileModelInjectable); di.permitSideEffects(getConfigurationFileModelInjectable);
mainDi.permitSideEffects(appVersionInjectable); di.permitSideEffects(appVersionInjectable);
TestStore.resetInstance();
const mockOpts = { const mockOpts = {
"some-user-data-directory": { "some-user-data-directory": {
@ -98,13 +98,18 @@ describe("BaseStore", () => {
mockFs(mockOpts); 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(() => { afterEach(() => {
mockFs.restore(); mockFs.restore();
store.disableSync(); store.disableSync();
TestStore.resetInstance();
}); });
describe("persistence", () => { describe("persistence", () => {

View File

@ -11,14 +11,11 @@ import type { IEqualsComparer } from "mobx";
import { makeObservable, reaction, runInAction } from "mobx"; import { makeObservable, reaction, runInAction } from "mobx";
import type { Disposer } from "./utils"; import type { Disposer } from "./utils";
import { Singleton, toJS } from "./utils"; import { Singleton, toJS } from "./utils";
import logger from "../main/logger";
import { broadcastMessage, ipcMainOn, ipcRendererOn } from "./ipc"; import { broadcastMessage, ipcMainOn, ipcRendererOn } from "./ipc";
import isEqual from "lodash/isEqual"; import isEqual from "lodash/isEqual";
import { kebabCase } from "lodash"; import { kebabCase } from "lodash";
import { getLegacyGlobalDiForExtensionApi } from "../extensions/as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; import type { GetConfigurationFileModel } from "./get-configuration-file-model/get-configuration-file-model.injectable";
import directoryForUserDataInjectable from "./app-paths/directory-for-user-data/directory-for-user-data.injectable"; import type { Logger } from "./logger";
import getConfigurationFileModelInjectable from "./get-configuration-file-model/get-configuration-file-model.injectable";
import appVersionInjectable from "./get-configuration-file-model/app-version/app-version.injectable";
export interface BaseStoreParams<T> extends ConfOptions<T> { export interface BaseStoreParams<T> extends ConfOptions<T> {
syncOptions?: { syncOptions?: {
@ -27,6 +24,13 @@ export interface BaseStoreParams<T> extends ConfOptions<T> {
}; };
} }
export interface BaseStoreDependencies {
readonly logger: Logger;
readonly appVersion: string;
readonly directoryForUserData: string;
getConfigurationFileModel: GetConfigurationFileModel;
}
/** /**
* Note: T should only contain base JSON serializable types. * Note: T should only contain base JSON serializable types.
*/ */
@ -36,7 +40,7 @@ export abstract class BaseStore<T> extends Singleton {
readonly displayName: string = this.constructor.name; readonly displayName: string = this.constructor.name;
protected constructor(protected params: BaseStoreParams<T>) { protected constructor(protected readonly depenendices: BaseStoreDependencies, protected params: BaseStoreParams<T>) {
super(); super();
makeObservable(this); makeObservable(this);
} }
@ -45,26 +49,22 @@ export abstract class BaseStore<T> extends Singleton {
* This must be called after the last child's constructor is finished (or just before it finishes) * This must be called after the last child's constructor is finished (or just before it finishes)
*/ */
load() { load() {
logger.debug(`[${kebabCase(this.displayName).toUpperCase()}]: LOADING from ${this.path} ...`); this.depenendices.logger.debug(`[${kebabCase(this.displayName).toUpperCase()}]: LOADING from ${this.path} ...`);
this.storeConfig = this.depenendices.getConfigurationFileModel({
const di = getLegacyGlobalDiForExtensionApi();
const getConfigurationFileModel = di.inject(getConfigurationFileModelInjectable);
this.storeConfig = getConfigurationFileModel({
...this.params, ...this.params,
projectName: "lens", projectName: "lens",
projectVersion: di.inject(appVersionInjectable), projectVersion: this.depenendices.appVersion,
cwd: this.cwd(), cwd: this.cwd(),
}); });
const res: any = this.fromStore(this.storeConfig.store); const res: any = this.fromStore(this.storeConfig.store);
if (res instanceof Promise || (typeof res === "object" && res && typeof res.then === "function")) { if (res instanceof Promise || (typeof res === "object" && res && typeof res.then === "function")) {
console.error(`${this.displayName} extends BaseStore<T>'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<T>'s fromStore method returns a Promise or promise-like object. This is an error and must be fixed.`);
} }
this.enableSync(); 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() { get name() {
@ -84,13 +84,11 @@ export abstract class BaseStore<T> extends Singleton {
} }
protected cwd() { protected cwd() {
const di = getLegacyGlobalDiForExtensionApi(); return this.depenendices.directoryForUserData;
return di.inject(directoryForUserDataInjectable);
} }
protected saveToFile(model: T) { 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 // todo: update when fixed https://github.com/sindresorhus/conf/issues/114
if (this.storeConfig) { if (this.storeConfig) {
@ -111,14 +109,14 @@ export abstract class BaseStore<T> extends Singleton {
if (ipcMain) { if (ipcMain) {
this.syncDisposers.push(ipcMainOn(this.syncMainChannel, (event, model: T) => { 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); this.onSync(model);
})); }));
} }
if (ipcRenderer) { if (ipcRenderer) {
this.syncDisposers.push(ipcRendererOn(this.syncRendererChannel, (event, model: T) => { 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); this.onSyncFromMain(model);
})); }));
} }

View File

@ -7,6 +7,10 @@ import { ClusterStore } from "./cluster-store";
import { createClusterInjectionToken } from "../cluster/create-cluster-injection-token"; import { createClusterInjectionToken } from "../cluster/create-cluster-injection-token";
import readClusterConfigSyncInjectable from "./read-cluster-config.injectable"; import readClusterConfigSyncInjectable from "./read-cluster-config.injectable";
import { clusterStoreMigrationsInjectionToken } from "./migrations"; 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({ const clusterStoreInjectable = getInjectable({
id: "cluster-store", id: "cluster-store",
@ -18,6 +22,10 @@ const clusterStoreInjectable = getInjectable({
createCluster: di.inject(createClusterInjectionToken), createCluster: di.inject(createClusterInjectionToken),
readClusterConfigSync: di.inject(readClusterConfigSyncInjectable), readClusterConfigSync: di.inject(readClusterConfigSyncInjectable),
migrations: di.inject(clusterStoreMigrationsInjectionToken), migrations: di.inject(clusterStoreMigrationsInjectionToken),
logger: di.inject(loggerInjectable),
appVersion: di.inject(appVersionInjectable),
directoryForUserData: di.inject(directoryForUserDataInjectable),
getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable),
}); });
}, },

View File

@ -6,6 +6,7 @@
import { ipcMain, ipcRenderer, webFrame } from "electron"; import { ipcMain, ipcRenderer, webFrame } from "electron";
import { action, comparer, computed, makeObservable, observable, reaction } from "mobx"; import { action, comparer, computed, makeObservable, observable, reaction } from "mobx";
import type { BaseStoreDependencies } from "../base-store";
import { BaseStore } from "../base-store"; import { BaseStore } from "../base-store";
import { Cluster } from "../cluster/cluster"; import { Cluster } from "../cluster/cluster";
import logger from "../../main/logger"; import logger from "../../main/logger";
@ -23,7 +24,7 @@ export interface ClusterStoreModel {
clusters?: ClusterModel[]; clusters?: ClusterModel[];
} }
interface Dependencies { interface ClusterStoreDependencies extends BaseStoreDependencies {
createCluster: CreateCluster; createCluster: CreateCluster;
readClusterConfigSync: ReadClusterConfigSync; readClusterConfigSync: ReadClusterConfigSync;
readonly migrations: Migrations<ClusterStoreModel> | undefined; readonly migrations: Migrations<ClusterStoreModel> | undefined;
@ -35,8 +36,8 @@ export class ClusterStore extends BaseStore<ClusterStoreModel> {
protected disposer = disposer(); protected disposer = disposer();
constructor(protected readonly dependencies: Dependencies) { constructor(protected readonly dependencies: ClusterStoreDependencies) {
super({ super(dependencies, {
configName: "lens-cluster-store", configName: "lens-cluster-store",
accessPropertiesByDotNotation: false, // To make dots safe in cluster context names accessPropertiesByDotNotation: false, // To make dots safe in cluster context names
syncOptions: { syncOptions: {

View File

@ -6,9 +6,11 @@ import { getInjectable } from "@ogre-tools/injectable";
import Config from "conf"; import Config from "conf";
import type { BaseStoreParams } from "../base-store"; import type { BaseStoreParams } from "../base-store";
export type GetConfigurationFileModel = <T>(content: BaseStoreParams<T>) => Config<T>;
const getConfigurationFileModelInjectable = getInjectable({ const getConfigurationFileModelInjectable = getInjectable({
id: "get-configuration-file-model", id: "get-configuration-file-model",
instantiate: () => <ConfigurationContent>(content: BaseStoreParams<ConfigurationContent>) => new Config(content), instantiate: (): GetConfigurationFileModel => (content) => new Config(content),
causesSideEffects: true, causesSideEffects: true,
}); });

View File

@ -6,6 +6,10 @@ import { getInjectable } from "@ogre-tools/injectable";
import catalogCatalogEntityInjectable from "../catalog-entities/general-catalog-entities/implementations/catalog-catalog-entity.injectable"; import catalogCatalogEntityInjectable from "../catalog-entities/general-catalog-entities/implementations/catalog-catalog-entity.injectable";
import { HotbarStore } from "./store"; import { HotbarStore } from "./store";
import loggerInjectable from "../logger.injectable"; 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({ const hotbarStoreInjectable = getInjectable({
id: "hotbar-store", id: "hotbar-store",
@ -15,7 +19,11 @@ const hotbarStoreInjectable = getInjectable({
return HotbarStore.createInstance({ return HotbarStore.createInstance({
catalogCatalogEntity: di.inject(catalogCatalogEntityInjectable), catalogCatalogEntity: di.inject(catalogCatalogEntityInjectable),
migrations: di.inject(hotbarStoreMigrationsInjectionToken),
logger: di.inject(loggerInjectable), logger: di.inject(loggerInjectable),
appVersion: di.inject(appVersionInjectable),
directoryForUserData: di.inject(directoryForUserDataInjectable),
getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable),
}); });
}, },

View File

@ -4,6 +4,7 @@
*/ */
import { action, comparer, observable, makeObservable, computed } from "mobx"; import { action, comparer, observable, makeObservable, computed } from "mobx";
import type { BaseStoreDependencies } from "../base-store";
import { BaseStore } from "../base-store"; import { BaseStore } from "../base-store";
import { toJS } from "../utils"; import { toJS } from "../utils";
import type { CatalogEntity } from "../catalog"; import type { CatalogEntity } from "../catalog";
@ -21,7 +22,7 @@ export interface HotbarStoreModel {
activeHotbarId: string; activeHotbarId: string;
} }
interface Dependencies { interface HotbarStoreDependencies extends BaseStoreDependencies {
readonly catalogCatalogEntity: GeneralEntity; readonly catalogCatalogEntity: GeneralEntity;
readonly logger: Logger; readonly logger: Logger;
readonly migrations: Migrations<HotbarStoreModel> | undefined; readonly migrations: Migrations<HotbarStoreModel> | undefined;
@ -32,8 +33,8 @@ export class HotbarStore extends BaseStore<HotbarStoreModel> {
@observable hotbars: Hotbar[] = []; @observable hotbars: Hotbar[] = [];
@observable private _activeHotbarId!: string; @observable private _activeHotbarId!: string;
constructor(private readonly dependencies: Dependencies) { constructor(protected readonly dependencies: HotbarStoreDependencies) {
super({ super(dependencies, {
configName: "lens-hotbar-store", configName: "lens-hotbar-store",
accessPropertiesByDotNotation: false, // To make dots safe in cluster context names accessPropertiesByDotNotation: false, // To make dots safe in cluster context names
syncOptions: { syncOptions: {
@ -149,7 +150,7 @@ export class HotbarStore extends BaseStore<HotbarStoreModel> {
const index = this.hotbars.findIndex((hotbar) => hotbar.id === id); const index = this.hotbars.findIndex((hotbar) => hotbar.id === id);
if (index < 0) { if (index < 0) {
return void console.warn( return this.dependencies.logger.warn(
`[HOTBAR-STORE]: cannot setHotbarName: unknown id`, `[HOTBAR-STORE]: cannot setHotbarName: unknown id`,
{ id }, { id },
); );

View File

@ -6,6 +6,10 @@ import { getInjectable } from "@ogre-tools/injectable";
import { UserStore } from "./user-store"; import { UserStore } from "./user-store";
import selectedUpdateChannelInjectable from "../application-update/selected-update-channel/selected-update-channel.injectable"; import selectedUpdateChannelInjectable from "../application-update/selected-update-channel/selected-update-channel.injectable";
import { userStoreMigrationsInjectionToken, userStorePreMigrationsInjectionToken } from "./migrations"; 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({ const userStoreInjectable = getInjectable({
id: "user-store", id: "user-store",
@ -22,6 +26,10 @@ const userStoreInjectable = getInjectable({
return UserStore.createInstance({ return UserStore.createInstance({
selectedUpdateChannel: di.inject(selectedUpdateChannelInjectable), selectedUpdateChannel: di.inject(selectedUpdateChannelInjectable),
migrations: di.inject(userStoreMigrationsInjectionToken), migrations: di.inject(userStoreMigrationsInjectionToken),
logger: di.inject(loggerInjectable),
appVersion: di.inject(appVersionInjectable),
directoryForUserData: di.inject(directoryForUserDataInjectable),
getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable),
}); });
}, },

View File

@ -6,6 +6,7 @@
import { app } from "electron"; import { app } from "electron";
import semver from "semver"; import semver from "semver";
import { action, computed, observable, reaction, makeObservable, isObservableArray, isObservableSet, isObservableMap } from "mobx"; import { action, computed, observable, reaction, makeObservable, isObservableArray, isObservableSet, isObservableMap } from "mobx";
import type { BaseStoreDependencies } from "../base-store";
import { BaseStore } from "../base-store"; import { BaseStore } from "../base-store";
import { getAppVersion } from "../utils/app-version"; import { getAppVersion } from "../utils/app-version";
import { kubeConfigDefaultPath } from "../kube-helpers"; 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 { getOrInsertSet, toggle, toJS, object } from "../../renderer/utils";
import { DESCRIPTORS } from "./preferences-helpers"; import { DESCRIPTORS } from "./preferences-helpers";
import type { UserPreferencesModel, StoreType } 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 { SelectedUpdateChannel } from "../application-update/selected-update-channel/selected-update-channel.injectable";
import type { UpdateChannelId } from "../application-update/update-channels"; import type { UpdateChannelId } from "../application-update/update-channels";
import type { Migrations } from "conf/dist/source/types"; import type { Migrations } from "conf/dist/source/types";
@ -23,7 +23,7 @@ export interface UserStoreModel {
preferences: UserPreferencesModel; preferences: UserPreferencesModel;
} }
interface Dependencies { interface UserStoreDependencies extends BaseStoreDependencies {
readonly selectedUpdateChannel: SelectedUpdateChannel; readonly selectedUpdateChannel: SelectedUpdateChannel;
readonly migrations: Migrations<UserStoreModel> | undefined; readonly migrations: Migrations<UserStoreModel> | undefined;
} }
@ -31,8 +31,8 @@ interface Dependencies {
export class UserStore extends BaseStore<UserStoreModel> /* implements UserStoreFlatModel (when strict null is enabled) */ { export class UserStore extends BaseStore<UserStoreModel> /* implements UserStoreFlatModel (when strict null is enabled) */ {
readonly displayName = "UserStore"; readonly displayName = "UserStore";
constructor(private readonly dependencies: Dependencies) { constructor(protected readonly dependencies: UserStoreDependencies) {
super({ super(dependencies, {
configName: "lens-user-store", configName: "lens-user-store",
migrations: dependencies.migrations, migrations: dependencies.migrations,
}); });
@ -160,7 +160,7 @@ export class UserStore extends BaseStore<UserStoreModel> /* implements UserStore
@action @action
protected fromStore({ lastSeenAppVersion, preferences }: Partial<UserStoreModel> = {}) { protected fromStore({ lastSeenAppVersion, preferences }: Partial<UserStoreModel> = {}) {
logger.debug("UserStore.fromStore()", { lastSeenAppVersion, preferences }); this.dependencies.logger.debug("UserStore.fromStore()", { lastSeenAppVersion, preferences });
if (lastSeenAppVersion) { if (lastSeenAppVersion) {
this.lastSeenAppVersion = lastSeenAppVersion; this.lastSeenAppVersion = lastSeenAppVersion;

View File

@ -3,6 +3,10 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { getInjectable } from "@ogre-tools/injectable"; 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 { weblinksStoreMigrationsInjectionToken } from "./migrations";
import { WeblinkStore } from "./store"; import { WeblinkStore } from "./store";
@ -14,6 +18,10 @@ const weblinkStoreInjectable = getInjectable({
return WeblinkStore.createInstance({ return WeblinkStore.createInstance({
migrations: di.inject(weblinksStoreMigrationsInjectionToken), migrations: di.inject(weblinksStoreMigrationsInjectionToken),
logger: di.inject(loggerInjectable),
appVersion: di.inject(appVersionInjectable),
directoryForUserData: di.inject(directoryForUserDataInjectable),
getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable),
}); });
}, },
}); });

View File

@ -4,6 +4,7 @@
*/ */
import { action, comparer, observable, makeObservable } from "mobx"; import { action, comparer, observable, makeObservable } from "mobx";
import type { BaseStoreDependencies } from "../base-store";
import { BaseStore } from "../base-store"; import { BaseStore } from "../base-store";
import * as uuid from "uuid"; import * as uuid from "uuid";
import { toJS } from "../utils"; import { toJS } from "../utils";
@ -26,7 +27,7 @@ export interface WeblinkStoreModel {
weblinks: WeblinkData[]; weblinks: WeblinkData[];
} }
export interface WeblinkStoreDependencies { export interface WeblinkStoreDependencies extends BaseStoreDependencies {
readonly migrations: Migrations<WeblinkStoreModel> | undefined; readonly migrations: Migrations<WeblinkStoreModel> | undefined;
} }
@ -35,7 +36,7 @@ export class WeblinkStore extends BaseStore<WeblinkStoreModel> {
@observable weblinks: WeblinkData[] = []; @observable weblinks: WeblinkData[] = [];
constructor(protected readonly dependencies: WeblinkStoreDependencies) { constructor(protected readonly dependencies: WeblinkStoreDependencies) {
super({ super(dependencies, {
configName: "lens-weblink-store", configName: "lens-weblink-store",
accessPropertiesByDotNotation: false, // To make dots safe in cluster context names accessPropertiesByDotNotation: false, // To make dots safe in cluster context names
syncOptions: { syncOptions: {

View File

@ -5,6 +5,10 @@
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { FileSystemProvisionerStore } from "./file-system-provisioner-store"; import { FileSystemProvisionerStore } from "./file-system-provisioner-store";
import directoryForExtensionDataInjectable from "./directory-for-extension-data.injectable"; 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({ const fileSystemProvisionerStoreInjectable = getInjectable({
id: "file-system-provisioner-store", id: "file-system-provisioner-store",
@ -14,6 +18,10 @@ const fileSystemProvisionerStoreInjectable = getInjectable({
return FileSystemProvisionerStore.createInstance({ return FileSystemProvisionerStore.createInstance({
directoryForExtensionData: di.inject(directoryForExtensionDataInjectable), directoryForExtensionData: di.inject(directoryForExtensionDataInjectable),
logger: di.inject(loggerInjectable),
appVersion: di.inject(appVersionInjectable),
directoryForUserData: di.inject(directoryForUserDataInjectable),
getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable),
}); });
}, },

View File

@ -8,6 +8,7 @@ import { SHA256 } from "crypto-js";
import fse from "fs-extra"; import fse from "fs-extra";
import { action, makeObservable, observable } from "mobx"; import { action, makeObservable, observable } from "mobx";
import path from "path"; import path from "path";
import type { BaseStoreDependencies } from "../../../common/base-store";
import { BaseStore } from "../../../common/base-store"; import { BaseStore } from "../../../common/base-store";
import type { LensExtensionId } from "../../lens-extension"; import type { LensExtensionId } from "../../lens-extension";
import { getOrInsertWith, toJS } from "../../../common/utils"; import { getOrInsertWith, toJS } from "../../../common/utils";
@ -16,16 +17,16 @@ interface FSProvisionModel {
extensions: Record<string, string>; // extension names to paths extensions: Record<string, string>; // extension names to paths
} }
interface Dependencies { interface FileSystemProvisionerStoreDependencies extends BaseStoreDependencies {
directoryForExtensionData: string; readonly directoryForExtensionData: string;
} }
export class FileSystemProvisionerStore extends BaseStore<FSProvisionModel> { export class FileSystemProvisionerStore extends BaseStore<FSProvisionModel> {
readonly displayName = "FilesystemProvisionerStore"; readonly displayName = "FilesystemProvisionerStore";
registeredExtensions = observable.map<LensExtensionId, string>(); registeredExtensions = observable.map<LensExtensionId, string>();
constructor(private dependencies: Dependencies) { constructor(protected readonly dependencies: FileSystemProvisionerStoreDependencies) {
super({ super(dependencies, {
configName: "lens-filesystem-provisioner-store", configName: "lens-filesystem-provisioner-store",
accessPropertiesByDotNotation: false, // To make dots safe in cluster context names accessPropertiesByDotNotation: false, // To make dots safe in cluster context names
}); });

View File

@ -3,15 +3,32 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * 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 { BaseStore } from "../common/base-store";
import * as path from "path"; import * as path from "path";
import type { LensExtension } from "./lens-extension"; import type { LensExtension } from "./lens-extension";
import assert from "assert"; 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<T> extends BaseStore<T> { export abstract class ExtensionStore<T> extends BaseStore<T> {
readonly displayName = "ExtensionStore<T>"; readonly displayName = "ExtensionStore<T>";
protected extension?: LensExtension; protected extension?: LensExtension;
constructor(params: BaseStoreParams<T>) {
const di = getLegacyGlobalDiForExtensionApi();
super({
logger: di.inject(loggerInjectable),
getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable),
appVersion: di.inject(appVersionInjectable),
directoryForUserData: di.inject(directoryForUserDataInjectable),
}, params);
}
loadExtension(extension: LensExtension) { loadExtension(extension: LensExtension) {
this.extension = extension; this.extension = extension;

View File

@ -3,15 +3,24 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { getInjectable } from "@ogre-tools/injectable"; 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"; import { ExtensionsStore } from "./extensions-store";
const extensionsStoreInjectable = getInjectable({ const extensionsStoreInjectable = getInjectable({
id: "extensions-store", id: "extensions-store",
instantiate: () => { instantiate: (di) => {
ExtensionsStore.resetInstance(); 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, causesSideEffects: true,

View File

@ -6,6 +6,7 @@
import type { LensExtensionId } from "../lens-extension"; import type { LensExtensionId } from "../lens-extension";
import { action, computed, makeObservable, observable } from "mobx"; import { action, computed, makeObservable, observable } from "mobx";
import { toJS } from "../../common/utils"; import { toJS } from "../../common/utils";
import type { BaseStoreDependencies } from "../../common/base-store";
import { BaseStore } from "../../common/base-store"; import { BaseStore } from "../../common/base-store";
export interface LensExtensionsStoreModel { export interface LensExtensionsStoreModel {
@ -22,10 +23,12 @@ export interface IsEnabledExtensionDescriptor {
isBundled: boolean; isBundled: boolean;
} }
export interface ExtensionsStoreDependencies extends BaseStoreDependencies {}
export class ExtensionsStore extends BaseStore<LensExtensionsStoreModel> { export class ExtensionsStore extends BaseStore<LensExtensionsStoreModel> {
readonly displayName = "ExtensionsStore"; readonly displayName = "ExtensionsStore";
constructor() { constructor(protected readonly dependencies: ExtensionsStoreDependencies) {
super({ super(dependencies, {
configName: "lens-extensions", configName: "lens-extensions",
}); });
makeObservable(this); makeObservable(this);