From 9405899012f9011847e8294710c3acffe6048198 Mon Sep 17 00:00:00 2001 From: Juho Heikka Date: Sat, 18 Feb 2023 00:59:03 +0200 Subject: [PATCH] Reconstruct the key for old hashed directories Signed-off-by: Juho Heikka --- .../utils/find-key-contains.injectable.ts | 27 ---------- .../common/utils/find-key-contains.test.ts | 50 ------------------- ...shed-directory-for-extension.injectable.ts | 28 ++++++----- ...ure-hashed-directory-for-extension.test.ts | 17 ++++++- ...-path-to-legacy-package-json.injectable.ts | 24 +++++++++ .../get-path-to-legacy-package-json.test.ts | 34 +++++++++++++ 6 files changed, 90 insertions(+), 90 deletions(-) delete mode 100644 packages/core/src/common/utils/find-key-contains.injectable.ts delete mode 100644 packages/core/src/common/utils/find-key-contains.test.ts create mode 100644 packages/core/src/extensions/extension-loader/file-system-provisioner-store/get-path-to-legacy-package-json.injectable.ts create mode 100644 packages/core/src/extensions/extension-loader/file-system-provisioner-store/get-path-to-legacy-package-json.test.ts diff --git a/packages/core/src/common/utils/find-key-contains.injectable.ts b/packages/core/src/common/utils/find-key-contains.injectable.ts deleted file mode 100644 index 3a38c663b7..0000000000 --- a/packages/core/src/common/utils/find-key-contains.injectable.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * 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"; - -export type FindKeyContains = (map: Map, text: string) => T | undefined; - -const findKeyContainsInjectable = getInjectable({ - id: "find-key-contains", - - instantiate: (): FindKeyContains => { - return (map: Map, text: string) => { - const entries = map.entries(); - - for (const [key, value] of entries) { - if (key.includes(text)) { - return value; - } - } - - return undefined; - }; - }, -}); - -export default findKeyContainsInjectable; diff --git a/packages/core/src/common/utils/find-key-contains.test.ts b/packages/core/src/common/utils/find-key-contains.test.ts deleted file mode 100644 index 088c8511b1..0000000000 --- a/packages/core/src/common/utils/find-key-contains.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getDiForUnitTesting } from "../../renderer/getDiForUnitTesting"; -import type { FindKeyContains } from "./find-key-contains.injectable"; -import findKeyContainsInjectable from "./find-key-contains.injectable"; - -describe("find-key-contains", () => { - let map: Map; - - let findKeyContains: FindKeyContains; - - beforeEach(() => { - const di = getDiForUnitTesting({ doGeneralOverrides: true }); - - findKeyContains = di.inject(findKeyContainsInjectable); - }); - - describe("map with entries", () => { - beforeEach(() => { - map = new Map(); - map.set("some-key", "some-value"); - }); - - it("given key starts with key, returns value", () => { - expect(findKeyContains(map, "some")).toEqual("some-value"); - }); - - it("given key ends with key, returns value", () => { - expect(findKeyContains(map, "key")).toEqual("some-value"); - }); - - it("given key is in middle of key, returns value", () => { - map.set("some-long-key", "some-value-for-long-key"); - - expect(findKeyContains(map, "long")).toEqual("some-value-for-long-key"); - }); - - it("given key does not include text, returns undefined", () => { - expect(findKeyContains(map, "not")).toEqual(undefined); - }); - }); - - describe("map with no entries", () => { - it("it returns undefined", () => { - expect(findKeyContains(map, "some-text")).toEqual(undefined); - }); - }); -}); 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 31f8a8147d..4a76902303 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 @@ -12,10 +12,11 @@ import joinPathsInjectable from "../../../common/path/join-paths.injectable"; import directoryForExtensionDataInjectable from "./directory-for-extension-data.injectable"; import ensureDirInjectable from "../../../common/fs/ensure-dir.injectable"; import getHashInjectable from "./get-hash.injectable"; -import findKeyContainsInjectable from "../../../common/utils/find-key-contains.injectable"; +import getPathToLegacyPackageJsonInjectable from "./get-path-to-legacy-package-json.injectable"; export type EnsureHashedDirectoryForExtension = (extensionName: string, registeredExtensions: ObservableMap) => Promise; + const ensureHashedDirectoryForExtensionInjectable = getInjectable({ id: "ensure-hashed-directory-for-extension", @@ -25,22 +26,25 @@ const ensureHashedDirectoryForExtensionInjectable = getInjectable({ const directoryForExtensionData = di.inject(directoryForExtensionDataInjectable); const ensureDirectory = di.inject(ensureDirInjectable); const getHash = di.inject(getHashInjectable); - const findKeyContains = di.inject(findKeyContainsInjectable); + const getPathToLegacyPackageJson = di.inject(getPathToLegacyPackageJsonInjectable); return async (extensionName, registeredExtensions) => { - const legacyDirPath = findKeyContains(registeredExtensions, extensionName); + let dirPath: string; - if (legacyDirPath) { - return legacyDirPath; + const legacyDirPath = getPathToLegacyPackageJson(extensionName); + const hashedDirectoryForLegacyDirPath = registeredExtensions.get(legacyDirPath); + + if (hashedDirectoryForLegacyDirPath) { + dirPath = hashedDirectoryForLegacyDirPath; + } else { + dirPath = await getOrInsertWithAsync(registeredExtensions, extensionName, async () => { + const salt = (await randomBytes(32)).toString("hex"); + const hashedName = getHash(`${extensionName}/${salt}`); + + return joinPaths(directoryForExtensionData, hashedName); + }); } - const dirPath = await getOrInsertWithAsync(registeredExtensions, extensionName, async () => { - const salt = (await randomBytes(32)).toString("hex"); - const hashedName = getHash(`${extensionName}/${salt}`); - - return joinPaths(directoryForExtensionData, hashedName); - }); - await ensureDirectory(dirPath); return dirPath; 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 4c09565732..84ef3e82c7 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 @@ -9,6 +9,7 @@ import type { EnsureHashedDirectoryForExtension } from "./ensure-hashed-director 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"; describe("ensure-hashed-directory-for-extension", () => { let ensureHashedDirectoryForExtension: EnsureHashedDirectoryForExtension; @@ -22,6 +23,7 @@ describe("ensure-hashed-directory-for-extension", () => { di.override(ensureDirInjectable, () => ensureDirMock); di.override(directoryForExtensionDataInjectable, () => "some-directory-for-extension-data"); + di.override(directoryForUserDataInjectable, () => "/some-directory-for-user-data"); ensureHashedDirectoryForExtension = di.inject( ensureHashedDirectoryForExtensionInjectable, @@ -54,7 +56,7 @@ describe("ensure-hashed-directory-for-extension", () => { it("given extension directory was saved based on extension's package.json path, returns existing directory", async () => { runInAction(() => { - registeredExtensions.set("/Users/some-user/Library/Application Support/Lens/node_modules/some-extension-name/package.json", "some-directory"); + registeredExtensions.set("/some-directory-for-user-data/node_modules/some-extension-name/package.json", "some-directory"); }); const actual = await ensureHashedDirectoryForExtension( "some-extension-name", @@ -64,4 +66,17 @@ describe("ensure-hashed-directory-for-extension", () => { expect(actual).toBe("some-directory"); }); + it("given extension directory was saved based on extension's package.json path, ensure dir is called with right parameter", async () => { + runInAction(() => { + registeredExtensions.set("/some-directory-for-user-data/node_modules/some-extension-name/package.json", "some-directory"); + }); + + await ensureHashedDirectoryForExtension( + "some-extension-name", + registeredExtensions, + ); + + expect(ensureDirMock).toHaveBeenCalledWith("some-directory"); + }); + }); diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/get-path-to-legacy-package-json.injectable.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/get-path-to-legacy-package-json.injectable.ts new file mode 100644 index 0000000000..421bdf9e37 --- /dev/null +++ b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/get-path-to-legacy-package-json.injectable.ts @@ -0,0 +1,24 @@ +/** + * 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 directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import joinPathsInjectable from "../../../common/path/join-paths.injectable"; + +export type GetPathToLegacyPackageJson = (extensionName: string) => string; + +const getPathToLegacyPackageJson = getInjectable({ + id: "get-path-to-legacy-package-json", + + instantiate: (di): GetPathToLegacyPackageJson => { + const directoryForUserData = di.inject(directoryForUserDataInjectable); + const joinPaths = di.inject(joinPathsInjectable); + + return (extensionName: string) => { + return joinPaths(directoryForUserData, "node_modules", extensionName, "package.json"); + }; + }, +}); + +export default getPathToLegacyPackageJson; diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/get-path-to-legacy-package-json.test.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/get-path-to-legacy-package-json.test.ts new file mode 100644 index 0000000000..0e2485188f --- /dev/null +++ b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/get-path-to-legacy-package-json.test.ts @@ -0,0 +1,34 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; +import { getDiForUnitTesting } from "../../../main/getDiForUnitTesting"; +import type { GetPathToLegacyPackageJson } from "./get-path-to-legacy-package-json.injectable"; +import getPathToLegacyPackageJsonInjectable from "./get-path-to-legacy-package-json.injectable"; + +describe("get-legacy-path-for-extension-name", () => { + let getPathToLegacyPackageJson: GetPathToLegacyPackageJson; + + beforeEach(() => { + const di = getDiForUnitTesting({ doGeneralOverrides: true }); + const directoryForExtensionDataMock = jest.fn().mockReturnValue("/path/to/user/data"); + + di.override(directoryForUserDataInjectable, directoryForExtensionDataMock); + getPathToLegacyPackageJson = di.inject(getPathToLegacyPackageJsonInjectable); + }); + + describe("given extension name", () => { + it("given some extension returns path for package.json in user data directory", () => { + const pathToExtensionPackageJson = getPathToLegacyPackageJson("some-extension"); + + expect(pathToExtensionPackageJson).toEqual("/path/to/user/data/node_modules/some-extension/package.json"); + }); + + it("given some other extension returns path for package.json in user data directory", () => { + const pathToExtensionPackageJson = getPathToLegacyPackageJson("some-other-extension"); + + expect(pathToExtensionPackageJson).toEqual("/path/to/user/data/node_modules/some-other-extension/package.json"); + }); + }); +});