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 directoryForExtensionDataInjectable from "./directory-for-extension-data.injectable";
|
||||||
import ensureDirInjectable from "../../../common/fs/ensure-dir.injectable";
|
import ensureDirInjectable from "../../../common/fs/ensure-dir.injectable";
|
||||||
import getHashInjectable from "./get-hash.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>;
|
export type EnsureHashedDirectoryForExtension = (extensionName: string, registeredExtensions: ObservableMap<string, string>) => Promise<string>;
|
||||||
|
|
||||||
|
|
||||||
const ensureHashedDirectoryForExtensionInjectable = getInjectable({
|
const ensureHashedDirectoryForExtensionInjectable = getInjectable({
|
||||||
id: "ensure-hashed-directory-for-extension",
|
id: "ensure-hashed-directory-for-extension",
|
||||||
|
|
||||||
@ -25,22 +26,25 @@ const ensureHashedDirectoryForExtensionInjectable = getInjectable({
|
|||||||
const directoryForExtensionData = di.inject(directoryForExtensionDataInjectable);
|
const directoryForExtensionData = di.inject(directoryForExtensionDataInjectable);
|
||||||
const ensureDirectory = di.inject(ensureDirInjectable);
|
const ensureDirectory = di.inject(ensureDirInjectable);
|
||||||
const getHash = di.inject(getHashInjectable);
|
const getHash = di.inject(getHashInjectable);
|
||||||
const findKeyContains = di.inject(findKeyContainsInjectable)<string>;
|
const getPathToLegacyPackageJson = di.inject(getPathToLegacyPackageJsonInjectable);
|
||||||
|
|
||||||
return async (extensionName, registeredExtensions) => {
|
return async (extensionName, registeredExtensions) => {
|
||||||
const legacyDirPath = findKeyContains(registeredExtensions, extensionName);
|
let dirPath: string;
|
||||||
|
|
||||||
if (legacyDirPath) {
|
const legacyDirPath = getPathToLegacyPackageJson(extensionName);
|
||||||
return legacyDirPath;
|
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);
|
await ensureDirectory(dirPath);
|
||||||
|
|
||||||
return dirPath;
|
return dirPath;
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import type { EnsureHashedDirectoryForExtension } from "./ensure-hashed-director
|
|||||||
import ensureHashedDirectoryForExtensionInjectable 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 ensureDirInjectable from "../../../common/fs/ensure-dir.injectable";
|
||||||
import directoryForExtensionDataInjectable from "./directory-for-extension-data.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", () => {
|
describe("ensure-hashed-directory-for-extension", () => {
|
||||||
let ensureHashedDirectoryForExtension: EnsureHashedDirectoryForExtension;
|
let ensureHashedDirectoryForExtension: EnsureHashedDirectoryForExtension;
|
||||||
@ -22,6 +23,7 @@ describe("ensure-hashed-directory-for-extension", () => {
|
|||||||
|
|
||||||
di.override(ensureDirInjectable, () => ensureDirMock);
|
di.override(ensureDirInjectable, () => ensureDirMock);
|
||||||
di.override(directoryForExtensionDataInjectable, () => "some-directory-for-extension-data");
|
di.override(directoryForExtensionDataInjectable, () => "some-directory-for-extension-data");
|
||||||
|
di.override(directoryForUserDataInjectable, () => "/some-directory-for-user-data");
|
||||||
|
|
||||||
ensureHashedDirectoryForExtension = di.inject(
|
ensureHashedDirectoryForExtension = di.inject(
|
||||||
ensureHashedDirectoryForExtensionInjectable,
|
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 () => {
|
it("given extension directory was saved based on extension's package.json path, returns existing directory", async () => {
|
||||||
runInAction(() => {
|
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(
|
const actual = await ensureHashedDirectoryForExtension(
|
||||||
"some-extension-name",
|
"some-extension-name",
|
||||||
@ -64,4 +66,17 @@ describe("ensure-hashed-directory-for-extension", () => {
|
|||||||
expect(actual).toBe("some-directory");
|
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