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:
parent
b2a1ee6b59
commit
9405899012
@ -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;
|
||||
@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -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;
|
||||
|
||||
@ -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");
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@ -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;
|
||||
@ -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");
|
||||
});
|
||||
});
|
||||
});
|
||||
Loading…
Reference in New Issue
Block a user