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

Reconstruct the key for old hashed directories

Signed-off-by: Juho Heikka <juho.heikka@gmail.com>
This commit is contained in:
Juho Heikka 2023-02-18 00:59:03 +02:00
parent b2a1ee6b59
commit 9405899012
6 changed files with 90 additions and 90 deletions

View File

@ -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 = <T>(map: Map<string, T>, text: string) => T | undefined;
const findKeyContainsInjectable = getInjectable({
id: "find-key-contains",
instantiate: (): FindKeyContains => {
return <T>(map: Map<string, T>, text: string) => {
const entries = map.entries();
for (const [key, value] of entries) {
if (key.includes(text)) {
return value;
}
}
return undefined;
};
},
});
export default findKeyContainsInjectable;

View File

@ -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<string, string>;
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);
});
});
});

View File

@ -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<string, string>) => Promise<string>;
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)<string>;
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;

View File

@ -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");
});
});

View File

@ -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;

View File

@ -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");
});
});
});