mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Move FileSystemProvisionerStore to new format
Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
parent
f1f72b1021
commit
7fec6b0c08
@ -5,6 +5,6 @@
|
|||||||
import { getInjectionToken } from "@ogre-tools/injectable";
|
import { getInjectionToken } from "@ogre-tools/injectable";
|
||||||
import type { MigrationDeclaration } from "../../../common/base-store/migrations.injectable";
|
import type { MigrationDeclaration } from "../../../common/base-store/migrations.injectable";
|
||||||
|
|
||||||
export const fileSystemProvisionerStoreInjectionToken = getInjectionToken<MigrationDeclaration>({
|
export const fileSystemProvisionerStoreMigrationDeclarationInjectionToken = getInjectionToken<MigrationDeclaration>({
|
||||||
id: "file-system-provisioner-store-injection-token",
|
id: "file-system-provisioner-store-migration-declaration",
|
||||||
});
|
});
|
||||||
|
|||||||
@ -3,36 +3,36 @@
|
|||||||
* 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 { 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 { 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({
|
const fileSystemProvisionerStoreInjectable = getInjectable({
|
||||||
id: "file-system-provisioner-store",
|
id: "file-system-provisioner-store",
|
||||||
|
|
||||||
instantiate: (di) => new FileSystemProvisionerStore({
|
instantiate: (di) => {
|
||||||
directoryForUserData: di.inject(directoryForUserDataInjectable),
|
const registeredExtensions = di.inject(registeredExtensionsInjectable);
|
||||||
getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable),
|
const createBaseStore = di.inject(createBaseStoreInjectable);
|
||||||
logger: di.inject(loggerInjectable),
|
const storeMigrationVersion = di.inject(storeMigrationVersionInjectable);
|
||||||
storeMigrationVersion: di.inject(storeMigrationVersionInjectable),
|
|
||||||
migrations: {},
|
const store = createBaseStore({
|
||||||
getBasenameOfPath: di.inject(getBasenameOfPathInjectable),
|
configName: "lens-filesystem-provisioner-store",
|
||||||
ipcChannelPrefixes: di.inject(baseStoreIpcChannelPrefixesInjectionToken),
|
accessPropertiesByDotNotation: false, // To make dots safe in cluster context names
|
||||||
persistStateToConfig: di.inject(persistStateToConfigInjectionToken),
|
projectVersion: storeMigrationVersion,
|
||||||
enlistMessageChannelListener: di.inject(enlistMessageChannelListenerInjectionToken),
|
fromStore: action(({ extensions = {}}) => {
|
||||||
shouldDisableSyncInListener: di.inject(shouldBaseStoreDisableSyncInIpcListenerInjectionToken),
|
registeredExtensions.replace(object.entries(extensions));
|
||||||
ensureHashedDirectoryForExtension: di.inject(ensureHashedDirectoryForExtensionInjectable),
|
}),
|
||||||
registeredExtensions: di.inject(registeredExtensionsInjectable),
|
toJSON: () => ({
|
||||||
}),
|
extensions: Object.fromEntries(registeredExtensions),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
load: () => store.load(),
|
||||||
|
};
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default fileSystemProvisionerStoreInjectable;
|
export default fileSystemProvisionerStoreInjectable;
|
||||||
|
|||||||
@ -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<string, string>; // extension names to paths
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Dependencies extends BaseStoreDependencies {
|
|
||||||
ensureHashedDirectoryForExtension: EnsureHashedDirectoryForExtension;
|
|
||||||
registeredExtensions: ObservableMap<LensExtensionId, string>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class FileSystemProvisionerStore extends BaseStore<FSProvisionModel> {
|
|
||||||
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<string> {
|
|
||||||
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()),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -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 MainCatalogEntityRegistry } from "../main/catalog";
|
||||||
import type { CatalogEntityRegistry as RendererCatalogEntityRegistry } from "../renderer/api/catalog/entity/registry";
|
import type { CatalogEntityRegistry as RendererCatalogEntityRegistry } from "../renderer/api/catalog/entity/registry";
|
||||||
import type { GetExtensionPageParameters } from "../renderer/routes/get-extension-page-parameters.injectable";
|
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 { NavigateForExtension } from "../main/start-main-application/lens-window/navigate-for-extension.injectable";
|
||||||
import type { Logger } from "../common/logger";
|
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 {
|
export interface LensExtensionDependencies {
|
||||||
readonly fileSystemProvisionerStore: FileSystemProvisionerStore;
|
|
||||||
readonly logger: Logger;
|
readonly logger: Logger;
|
||||||
|
ensureHashedDirectoryForExtension: EnsureHashedDirectoryForExtension;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface LensMainExtensionDependencies extends LensExtensionDependencies {
|
export interface LensMainExtensionDependencies extends LensExtensionDependencies {
|
||||||
|
|||||||
@ -83,7 +83,7 @@ export class LensExtension<
|
|||||||
*/
|
*/
|
||||||
async getExtensionFileFolder(): Promise<string> {
|
async getExtensionFileFolder(): Promise<string> {
|
||||||
// storeName is read from the manifest and has a fallback to the manifest name, which equals id
|
// 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
|
@action
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable";
|
|||||||
import type { Writable } from "type-fest";
|
import type { Writable } from "type-fest";
|
||||||
import loggerInjectable from "../../common/logger.injectable";
|
import loggerInjectable from "../../common/logger.injectable";
|
||||||
import { createExtensionInstanceInjectionToken } from "../../extensions/extension-loader/create-extension-instance.token";
|
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 { lensExtensionDependencies } from "../../extensions/lens-extension";
|
||||||
import type { LensMainExtensionDependencies } from "../../extensions/lens-extension-set-dependencies";
|
import type { LensMainExtensionDependencies } from "../../extensions/lens-extension-set-dependencies";
|
||||||
import type { LensMainExtension } from "../../extensions/lens-main-extension";
|
import type { LensMainExtension } from "../../extensions/lens-main-extension";
|
||||||
@ -17,7 +17,7 @@ const createExtensionInstanceInjectable = getInjectable({
|
|||||||
id: "create-extension-instance",
|
id: "create-extension-instance",
|
||||||
instantiate: (di) => {
|
instantiate: (di) => {
|
||||||
const deps: LensMainExtensionDependencies = {
|
const deps: LensMainExtensionDependencies = {
|
||||||
fileSystemProvisionerStore: di.inject(fileSystemProvisionerStoreInjectable),
|
ensureHashedDirectoryForExtension: di.inject(ensureHashedDirectoryForExtensionInjectable),
|
||||||
entityRegistry: di.inject(catalogEntityRegistryInjectable),
|
entityRegistry: di.inject(catalogEntityRegistryInjectable),
|
||||||
navigate: di.inject(navigateForExtensionInjectable),
|
navigate: di.inject(navigateForExtensionInjectable),
|
||||||
logger: di.inject(loggerInjectable),
|
logger: di.inject(loggerInjectable),
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import type { Writable } from "type-fest";
|
|||||||
import catalogCategoryRegistryInjectable from "../../common/catalog/category-registry.injectable";
|
import catalogCategoryRegistryInjectable from "../../common/catalog/category-registry.injectable";
|
||||||
import loggerInjectable from "../../common/logger.injectable";
|
import loggerInjectable from "../../common/logger.injectable";
|
||||||
import { createExtensionInstanceInjectionToken } from "../../extensions/extension-loader/create-extension-instance.token";
|
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 { lensExtensionDependencies } from "../../extensions/lens-extension";
|
||||||
import type { LensRendererExtensionDependencies } from "../../extensions/lens-extension-set-dependencies";
|
import type { LensRendererExtensionDependencies } from "../../extensions/lens-extension-set-dependencies";
|
||||||
import type { LensRendererExtension } from "../../extensions/lens-renderer-extension";
|
import type { LensRendererExtension } from "../../extensions/lens-renderer-extension";
|
||||||
@ -22,7 +22,7 @@ const createExtensionInstanceInjectable = getInjectable({
|
|||||||
const deps: LensRendererExtensionDependencies = {
|
const deps: LensRendererExtensionDependencies = {
|
||||||
categoryRegistry: di.inject(catalogCategoryRegistryInjectable),
|
categoryRegistry: di.inject(catalogCategoryRegistryInjectable),
|
||||||
entityRegistry: di.inject(catalogEntityRegistryInjectable),
|
entityRegistry: di.inject(catalogEntityRegistryInjectable),
|
||||||
fileSystemProvisionerStore: di.inject(fileSystemProvisionerStoreInjectable),
|
ensureHashedDirectoryForExtension: di.inject(ensureHashedDirectoryForExtensionInjectable),
|
||||||
getExtensionPageParameters: di.inject(getExtensionPageParametersInjectable),
|
getExtensionPageParameters: di.inject(getExtensionPageParametersInjectable),
|
||||||
navigateToRoute: di.inject(navigateToRouteInjectable),
|
navigateToRoute: di.inject(navigateToRouteInjectable),
|
||||||
routes: di.inject(routesInjectable),
|
routes: di.inject(routesInjectable),
|
||||||
|
|||||||
@ -74,7 +74,11 @@ export function getOrInsertWith<K extends object, V>(map: Map<K, V> | WeakMap<K,
|
|||||||
*/
|
*/
|
||||||
export async function getOrInsertWithAsync<K, V>(map: Map<K, V>, key: K, asyncBuilder: () => Promise<V>): Promise<V> {
|
export async function getOrInsertWithAsync<K, V>(map: Map<K, V>, key: K, asyncBuilder: () => Promise<V>): Promise<V> {
|
||||||
if (!map.has(key)) {
|
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
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user