From 7fec6b0c08c90747ee8b7066734c928bf730b429 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Tue, 24 Jan 2023 10:35:12 -0500 Subject: [PATCH] Move FileSystemProvisionerStore to new format Signed-off-by: Sebastian Malton --- ...ystem-provisioner-store-injection-token.ts | 4 +- ...ile-system-provisioner-store.injectable.ts | 50 +++++++++--------- .../file-system-provisioner-store.ts | 52 ------------------- .../lens-extension-set-dependencies.ts | 4 +- .../core/src/extensions/lens-extension.ts | 2 +- .../create-extension-instance.injectable.ts | 4 +- .../create-extension-instance.injectable.ts | 4 +- .../utilities/src/collection-functions.ts | 6 ++- 8 files changed, 39 insertions(+), 87 deletions(-) delete mode 100644 packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store-injection-token.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store-injection-token.ts index d7635a71b2..fa30c2e792 100644 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store-injection-token.ts +++ b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store-injection-token.ts @@ -5,6 +5,6 @@ import { getInjectionToken } from "@ogre-tools/injectable"; import type { MigrationDeclaration } from "../../../common/base-store/migrations.injectable"; -export const fileSystemProvisionerStoreInjectionToken = getInjectionToken({ - id: "file-system-provisioner-store-injection-token", +export const fileSystemProvisionerStoreMigrationDeclarationInjectionToken = getInjectionToken({ + id: "file-system-provisioner-store-migration-declaration", }); diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts index 2295608520..5a6ac3a2e7 100644 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts +++ b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts @@ -3,36 +3,36 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import { FileSystemProvisionerStore } from "./file-system-provisioner-store"; -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 { baseStoreIpcChannelPrefixesInjectionToken } from "../../../common/base-store/channel-prefix"; -import { shouldBaseStoreDisableSyncInIpcListenerInjectionToken } from "../../../common/base-store/disable-sync"; -import { persistStateToConfigInjectionToken } from "../../../common/base-store/save-to-file"; -import getBasenameOfPathInjectable from "../../../common/path/get-basename.injectable"; -import { enlistMessageChannelListenerInjectionToken } from "@k8slens/messaging"; -import ensureHashedDirectoryForExtensionInjectable from "./ensure-hashed-directory-for-extension.injectable"; import { registeredExtensionsInjectable } from "./registered-extensions.injectable"; +import createBaseStoreInjectable from "../../../common/base-store/create-base-store.injectable"; +import { action } from "mobx"; +import { object } from "@k8slens/utilities"; +import storeMigrationVersionInjectable from "../../../common/vars/store-migration-version.injectable"; const fileSystemProvisionerStoreInjectable = getInjectable({ id: "file-system-provisioner-store", - instantiate: (di) => new FileSystemProvisionerStore({ - directoryForUserData: di.inject(directoryForUserDataInjectable), - getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), - logger: di.inject(loggerInjectable), - storeMigrationVersion: di.inject(storeMigrationVersionInjectable), - migrations: {}, - getBasenameOfPath: di.inject(getBasenameOfPathInjectable), - ipcChannelPrefixes: di.inject(baseStoreIpcChannelPrefixesInjectionToken), - persistStateToConfig: di.inject(persistStateToConfigInjectionToken), - enlistMessageChannelListener: di.inject(enlistMessageChannelListenerInjectionToken), - shouldDisableSyncInListener: di.inject(shouldBaseStoreDisableSyncInIpcListenerInjectionToken), - ensureHashedDirectoryForExtension: di.inject(ensureHashedDirectoryForExtensionInjectable), - registeredExtensions: di.inject(registeredExtensionsInjectable), - }), + instantiate: (di) => { + const registeredExtensions = di.inject(registeredExtensionsInjectable); + const createBaseStore = di.inject(createBaseStoreInjectable); + const storeMigrationVersion = di.inject(storeMigrationVersionInjectable); + + const store = createBaseStore({ + configName: "lens-filesystem-provisioner-store", + accessPropertiesByDotNotation: false, // To make dots safe in cluster context names + projectVersion: storeMigrationVersion, + fromStore: action(({ extensions = {}}) => { + registeredExtensions.replace(object.entries(extensions)); + }), + toJSON: () => ({ + extensions: Object.fromEntries(registeredExtensions), + }), + }); + + return { + load: () => store.load(), + }; + }, }); export default fileSystemProvisionerStoreInjectable; diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts deleted file mode 100644 index 6c48210479..0000000000 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { LensExtensionId } from "@k8slens/legacy-extensions"; -import type { ObservableMap } from "mobx"; -import { action, makeObservable } from "mobx"; -import type { BaseStoreDependencies } from "../../../common/base-store/base-store"; -import { BaseStore } from "../../../common/base-store/base-store"; -import type { EnsureHashedDirectoryForExtension } from "./ensure-hashed-directory-for-extension.injectable"; - -interface FSProvisionModel { - extensions: Record; // extension names to paths -} - -interface Dependencies extends BaseStoreDependencies { - ensureHashedDirectoryForExtension: EnsureHashedDirectoryForExtension; - registeredExtensions: ObservableMap; -} - -export class FileSystemProvisionerStore extends BaseStore { - constructor(protected readonly dependencies: Dependencies) { - super(dependencies, { - configName: "lens-filesystem-provisioner-store", - accessPropertiesByDotNotation: false, // To make dots safe in cluster context names - }); - - makeObservable(this); - } - - /** - * This function retrieves the saved path to the folder which the extension - * can saves files to. If the folder is not present then it is created. - * @param extensionName the name of the extension requesting the path - * @returns path to the folder that the extension can safely write files to. - */ - async requestDirectory(extensionName: string): Promise { - return this.dependencies.ensureHashedDirectoryForExtension(extensionName); - } - - @action - protected fromStore({ extensions }: FSProvisionModel = { extensions: {}}): void { - this.dependencies.registeredExtensions.merge(extensions); - } - - toJSON(): FSProvisionModel { - return { - extensions: Object.fromEntries(this.dependencies.registeredExtensions.toJSON()), - }; - } -} diff --git a/packages/core/src/extensions/lens-extension-set-dependencies.ts b/packages/core/src/extensions/lens-extension-set-dependencies.ts index 7b7c62597a..aa22b7a1a1 100644 --- a/packages/core/src/extensions/lens-extension-set-dependencies.ts +++ b/packages/core/src/extensions/lens-extension-set-dependencies.ts @@ -10,13 +10,13 @@ import type { Route } from "../common/front-end-routing/front-end-route-injectio import type { CatalogEntityRegistry as MainCatalogEntityRegistry } from "../main/catalog"; import type { CatalogEntityRegistry as RendererCatalogEntityRegistry } from "../renderer/api/catalog/entity/registry"; import type { GetExtensionPageParameters } from "../renderer/routes/get-extension-page-parameters.injectable"; -import type { FileSystemProvisionerStore } from "./extension-loader/file-system-provisioner-store/file-system-provisioner-store"; import type { NavigateForExtension } from "../main/start-main-application/lens-window/navigate-for-extension.injectable"; import type { Logger } from "../common/logger"; +import type { EnsureHashedDirectoryForExtension } from "./extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.injectable"; export interface LensExtensionDependencies { - readonly fileSystemProvisionerStore: FileSystemProvisionerStore; readonly logger: Logger; + ensureHashedDirectoryForExtension: EnsureHashedDirectoryForExtension; } export interface LensMainExtensionDependencies extends LensExtensionDependencies { diff --git a/packages/core/src/extensions/lens-extension.ts b/packages/core/src/extensions/lens-extension.ts index 83ba4ebaec..ec5eca0cd9 100644 --- a/packages/core/src/extensions/lens-extension.ts +++ b/packages/core/src/extensions/lens-extension.ts @@ -83,7 +83,7 @@ export class LensExtension< */ async getExtensionFileFolder(): Promise { // storeName is read from the manifest and has a fallback to the manifest name, which equals id - return this[lensExtensionDependencies].fileSystemProvisionerStore.requestDirectory(this.storeName); + return this[lensExtensionDependencies].ensureHashedDirectoryForExtension(this.storeName); } @action diff --git a/packages/core/src/main/extension-loader/create-extension-instance.injectable.ts b/packages/core/src/main/extension-loader/create-extension-instance.injectable.ts index 62417149d4..cd20ab7ede 100644 --- a/packages/core/src/main/extension-loader/create-extension-instance.injectable.ts +++ b/packages/core/src/main/extension-loader/create-extension-instance.injectable.ts @@ -6,7 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import type { Writable } from "type-fest"; import loggerInjectable from "../../common/logger.injectable"; import { createExtensionInstanceInjectionToken } from "../../extensions/extension-loader/create-extension-instance.token"; -import fileSystemProvisionerStoreInjectable from "../../extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable"; +import ensureHashedDirectoryForExtensionInjectable from "../../extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.injectable"; import { lensExtensionDependencies } from "../../extensions/lens-extension"; import type { LensMainExtensionDependencies } from "../../extensions/lens-extension-set-dependencies"; import type { LensMainExtension } from "../../extensions/lens-main-extension"; @@ -17,7 +17,7 @@ const createExtensionInstanceInjectable = getInjectable({ id: "create-extension-instance", instantiate: (di) => { const deps: LensMainExtensionDependencies = { - fileSystemProvisionerStore: di.inject(fileSystemProvisionerStoreInjectable), + ensureHashedDirectoryForExtension: di.inject(ensureHashedDirectoryForExtensionInjectable), entityRegistry: di.inject(catalogEntityRegistryInjectable), navigate: di.inject(navigateForExtensionInjectable), logger: di.inject(loggerInjectable), diff --git a/packages/core/src/renderer/extension-loader/create-extension-instance.injectable.ts b/packages/core/src/renderer/extension-loader/create-extension-instance.injectable.ts index 0f92440338..ebc424641a 100644 --- a/packages/core/src/renderer/extension-loader/create-extension-instance.injectable.ts +++ b/packages/core/src/renderer/extension-loader/create-extension-instance.injectable.ts @@ -7,7 +7,7 @@ import type { Writable } from "type-fest"; import catalogCategoryRegistryInjectable from "../../common/catalog/category-registry.injectable"; import loggerInjectable from "../../common/logger.injectable"; import { createExtensionInstanceInjectionToken } from "../../extensions/extension-loader/create-extension-instance.token"; -import fileSystemProvisionerStoreInjectable from "../../extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable"; +import ensureHashedDirectoryForExtensionInjectable from "../../extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.injectable"; import { lensExtensionDependencies } from "../../extensions/lens-extension"; import type { LensRendererExtensionDependencies } from "../../extensions/lens-extension-set-dependencies"; import type { LensRendererExtension } from "../../extensions/lens-renderer-extension"; @@ -22,7 +22,7 @@ const createExtensionInstanceInjectable = getInjectable({ const deps: LensRendererExtensionDependencies = { categoryRegistry: di.inject(catalogCategoryRegistryInjectable), entityRegistry: di.inject(catalogEntityRegistryInjectable), - fileSystemProvisionerStore: di.inject(fileSystemProvisionerStoreInjectable), + ensureHashedDirectoryForExtension: di.inject(ensureHashedDirectoryForExtensionInjectable), getExtensionPageParameters: di.inject(getExtensionPageParametersInjectable), navigateToRoute: di.inject(navigateToRouteInjectable), routes: di.inject(routesInjectable), diff --git a/packages/utility-features/utilities/src/collection-functions.ts b/packages/utility-features/utilities/src/collection-functions.ts index e78e215e8b..0c2d5cf119 100644 --- a/packages/utility-features/utilities/src/collection-functions.ts +++ b/packages/utility-features/utilities/src/collection-functions.ts @@ -74,7 +74,11 @@ export function getOrInsertWith(map: Map | WeakMap(map: Map, key: K, asyncBuilder: () => Promise): Promise { if (!map.has(key)) { - map.set(key, await asyncBuilder()); + const newValue = await asyncBuilder(); + + runInAction(() => { + map.set(key, newValue); + }); } // eslint-disable-next-line @typescript-eslint/no-non-null-assertion