diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.injectable.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.injectable.ts index 636fc18bb4..50051bf094 100644 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.injectable.ts +++ b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.injectable.ts @@ -3,7 +3,6 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { ObservableMap } from "mobx"; import { getInjectable } from "@ogre-tools/injectable"; import { getOrInsert } from "../../../common/utils"; @@ -13,9 +12,9 @@ import directoryForExtensionDataInjectable from "./directory-for-extension-data. import ensureDirInjectable from "../../../common/fs/ensure-dir.injectable"; import getHashInjectable from "./get-hash.injectable"; import getPathToLegacyPackageJsonInjectable from "./get-path-to-legacy-package-json.injectable"; +import { registeredExtensionsInjectable } from "./registered-extensions.injectable"; -export type EnsureHashedDirectoryForExtension = (extensionName: string, registeredExtensions: ObservableMap) => Promise; - +export type EnsureHashedDirectoryForExtension = (extensionName: string) => Promise; const ensureHashedDirectoryForExtensionInjectable = getInjectable({ id: "ensure-hashed-directory-for-extension", @@ -27,8 +26,9 @@ const ensureHashedDirectoryForExtensionInjectable = getInjectable({ const ensureDirectory = di.inject(ensureDirInjectable); const getHash = di.inject(getHashInjectable); const getPathToLegacyPackageJson = di.inject(getPathToLegacyPackageJsonInjectable); + const registeredExtensions = di.inject(registeredExtensionsInjectable); - return async (extensionName, registeredExtensions) => { + return async (extensionName) => { let dirPath: string; const legacyDirPath = getPathToLegacyPackageJson(extensionName); diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.test.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.test.ts index 9d4ea7f8b8..dab86f68b2 100644 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.test.ts +++ b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.test.ts @@ -3,13 +3,14 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import type { ObservableMap } from "mobx"; -import { observable, runInAction } from "mobx"; +import { runInAction } from "mobx"; import { getDiForUnitTesting } from "../../../main/getDiForUnitTesting"; import type { EnsureHashedDirectoryForExtension } from "./ensure-hashed-directory-for-extension.injectable"; import ensureHashedDirectoryForExtensionInjectable from "./ensure-hashed-directory-for-extension.injectable"; import ensureDirInjectable from "../../../common/fs/ensure-dir.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 { registeredExtensionsInjectable } from "./registered-extensions.injectable"; describe("ensure-hashed-directory-for-extension", () => { let ensureHashedDirectoryForExtension: EnsureHashedDirectoryForExtension; @@ -29,7 +30,7 @@ describe("ensure-hashed-directory-for-extension", () => { ensureHashedDirectoryForExtensionInjectable, ); - registeredExtensions = observable.map(); + registeredExtensions = di.inject(registeredExtensionsInjectable); }); it("given registered extension exists, returns existing directory", async () => { @@ -39,7 +40,6 @@ describe("ensure-hashed-directory-for-extension", () => { const actual = await ensureHashedDirectoryForExtension( "some-extension-name", - registeredExtensions, ); expect(actual).toBe("some-directory"); @@ -48,7 +48,6 @@ describe("ensure-hashed-directory-for-extension", () => { it("given registered extension does not exist, returns random directory", async () => { const actual = await ensureHashedDirectoryForExtension( "some-extension-name", - registeredExtensions, ); expect(actual).toBe("some-directory-for-extension-data/a37a1cfefc0391af3733f23cb6b29443f596a2b8ffe6d116c35df7bc3cd99ef6"); @@ -65,7 +64,6 @@ describe("ensure-hashed-directory-for-extension", () => { it("returns existing directory", async () => { const actual = await ensureHashedDirectoryForExtension( "some-extension-name", - registeredExtensions, ); expect(actual).toBe("some-directory"); @@ -74,7 +72,6 @@ describe("ensure-hashed-directory-for-extension", () => { it("ensure dir is called with some directory", async () => { await ensureHashedDirectoryForExtension( "some-extension-name", - registeredExtensions, ); expect(ensureDirMock).toHaveBeenCalledWith("some-directory"); @@ -83,7 +80,6 @@ describe("ensure-hashed-directory-for-extension", () => { it("is migrated to use the extension name as key", async () => { await ensureHashedDirectoryForExtension( "some-extension-name", - registeredExtensions, ); expect(registeredExtensions.get("some-extension-name")).toEqual("some-directory"); @@ -92,7 +88,6 @@ describe("ensure-hashed-directory-for-extension", () => { it("old key is removed", async () => { await ensureHashedDirectoryForExtension( "some-extension-name", - registeredExtensions, ); expect(registeredExtensions.has("/some-directory-for-user-data/node_modules/some-extension-name/package.json")).toEqual(false); 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 new file mode 100644 index 0000000000..d7635a71b2 --- /dev/null +++ b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store-injection-token.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +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", +}); 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 7a9d3c4aa1..847ae37f03 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 @@ -14,6 +14,7 @@ import { persistStateToConfigInjectionToken } from "../../../common/base-store/s import getBasenameOfPathInjectable from "../../../common/path/get-basename.injectable"; import { enlistMessageChannelListenerInjectionToken } from "../../../common/utils/channel/enlist-message-channel-listener-injection-token"; import ensureHashedDirectoryForExtensionInjectable from "./ensure-hashed-directory-for-extension.injectable"; +import { registeredExtensionsInjectable } from "./registered-extensions.injectable"; const fileSystemProvisionerStoreInjectable = getInjectable({ id: "file-system-provisioner-store", @@ -30,6 +31,7 @@ const fileSystemProvisionerStoreInjectable = getInjectable({ enlistMessageChannelListener: di.inject(enlistMessageChannelListenerInjectionToken), shouldDisableSyncInListener: di.inject(shouldBaseStoreDisableSyncInIpcListenerInjectionToken), ensureHashedDirectoryForExtension: di.inject(ensureHashedDirectoryForExtensionInjectable), + registeredExtensions: di.inject(registeredExtensionsInjectable), }), }); 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 index 7c4fb87361..37bff649ad 100644 --- 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 @@ -3,7 +3,8 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { action, makeObservable, observable } from "mobx"; +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 { LensExtensionId } from "../../lens-extension"; @@ -16,11 +17,10 @@ interface FSProvisionModel { interface Dependencies extends BaseStoreDependencies { ensureHashedDirectoryForExtension: EnsureHashedDirectoryForExtension; + registeredExtensions: ObservableMap; } export class FileSystemProvisionerStore extends BaseStore { - readonly registeredExtensions = observable.map(); - constructor(protected readonly dependencies: Dependencies) { super(dependencies, { configName: "lens-filesystem-provisioner-store", @@ -37,17 +37,17 @@ export class FileSystemProvisionerStore extends BaseStore { * @returns path to the folder that the extension can safely write files to. */ async requestDirectory(extensionName: string): Promise { - return this.dependencies.ensureHashedDirectoryForExtension(extensionName, this.registeredExtensions); + return this.dependencies.ensureHashedDirectoryForExtension(extensionName); } @action protected fromStore({ extensions }: FSProvisionModel = { extensions: {}}): void { - this.registeredExtensions.merge(extensions); + this.dependencies.registeredExtensions.merge(extensions); } toJSON(): FSProvisionModel { return toJS({ - extensions: Object.fromEntries(this.registeredExtensions), + extensions: Object.fromEntries(this.dependencies.registeredExtensions), }); } } diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/registered-extensions.injectable.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/registered-extensions.injectable.ts new file mode 100644 index 0000000000..93fb7a342c --- /dev/null +++ b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/registered-extensions.injectable.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { observable } from "mobx"; +import type { LensExtensionId } from "../../lens-extension"; + +export const registeredExtensionsInjectable = getInjectable({ + id: "registered-extensions", + instantiate: () => observable.map(), +});