-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix ensure hashed directory for extension (#7188)
* Fix ensure hashed directory for extension Earlier open lens versions stored extension_data directory based on path of extension's package.json. This causes problems because extensions have moved to new location. This ensures backward compatibility that extension will get the same directory than before the change. Signed-off-by: Juho Heikka <juho.heikka@gmail.com> * Reconstruct the key for old hashed directories Signed-off-by: Juho Heikka <juho.heikka@gmail.com> * Remove unnecessary return Signed-off-by: Juho Heikka <juho.heikka@gmail.com> * Use sync version of random bytes Signed-off-by: Juho Heikka <juho.heikka@gmail.com> * Add migration to new type of key Signed-off-by: Juho Heikka <juho.heikka@gmail.com> * Fix global override for random bytes to not return a promise Signed-off-by: Juho Heikka <juho.heikka@gmail.com> * Make registeredExtensions a dependency Signed-off-by: Juho Heikka <juho.heikka@gmail.com> --------- Signed-off-by: Juho Heikka <juho.heikka@gmail.com>
- Loading branch information
Showing
9 changed files
with
173 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
96 changes: 96 additions & 0 deletions
96
...ension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
/** | ||
* Copyright (c) OpenLens Authors. All rights reserved. | ||
* Licensed under MIT License. See LICENSE in root directory for more information. | ||
*/ | ||
import type { ObservableMap } 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; | ||
let ensureDirMock: jest.Mock; | ||
let registeredExtensions: ObservableMap<string, string>; | ||
|
||
beforeEach(() => { | ||
const di = getDiForUnitTesting({ doGeneralOverrides: true }); | ||
|
||
ensureDirMock = jest.fn(); | ||
|
||
di.override(ensureDirInjectable, () => ensureDirMock); | ||
di.override(directoryForExtensionDataInjectable, () => "some-directory-for-extension-data"); | ||
di.override(directoryForUserDataInjectable, () => "/some-directory-for-user-data"); | ||
|
||
ensureHashedDirectoryForExtension = di.inject( | ||
ensureHashedDirectoryForExtensionInjectable, | ||
); | ||
|
||
registeredExtensions = di.inject(registeredExtensionsInjectable); | ||
}); | ||
|
||
it("given registered extension exists, returns existing directory", async () => { | ||
runInAction(() => { | ||
registeredExtensions.set("some-extension-name", "some-directory"); | ||
}); | ||
|
||
const actual = await ensureHashedDirectoryForExtension( | ||
"some-extension-name", | ||
); | ||
|
||
expect(actual).toBe("some-directory"); | ||
}); | ||
|
||
it("given registered extension does not exist, returns random directory", async () => { | ||
const actual = await ensureHashedDirectoryForExtension( | ||
"some-extension-name", | ||
); | ||
|
||
expect(actual).toBe("some-directory-for-extension-data/a37a1cfefc0391af3733f23cb6b29443f596a2b8ffe6d116c35df7bc3cd99ef6"); | ||
}); | ||
|
||
describe("given extension directory was saved based on extension's package.json path", () => { | ||
beforeEach(() => { | ||
runInAction(() => { | ||
registeredExtensions.set("/some-directory-for-user-data/node_modules/some-extension-name/package.json", "some-directory"); | ||
}); | ||
ensureDirMock.mockClear(); | ||
}); | ||
|
||
it("returns existing directory", async () => { | ||
const actual = await ensureHashedDirectoryForExtension( | ||
"some-extension-name", | ||
); | ||
|
||
expect(actual).toBe("some-directory"); | ||
}); | ||
|
||
it("ensure dir is called with some directory", async () => { | ||
await ensureHashedDirectoryForExtension( | ||
"some-extension-name", | ||
); | ||
|
||
expect(ensureDirMock).toHaveBeenCalledWith("some-directory"); | ||
}); | ||
|
||
it("is migrated to use the extension name as key", async () => { | ||
await ensureHashedDirectoryForExtension( | ||
"some-extension-name", | ||
); | ||
|
||
expect(registeredExtensions.get("some-extension-name")).toEqual("some-directory"); | ||
}); | ||
|
||
it("old key is removed", async () => { | ||
await ensureHashedDirectoryForExtension( | ||
"some-extension-name", | ||
); | ||
|
||
expect(registeredExtensions.has("/some-directory-for-user-data/node_modules/some-extension-name/package.json")).toEqual(false); | ||
}); | ||
}); | ||
}); |
10 changes: 10 additions & 0 deletions
10
...ion-loader/file-system-provisioner-store/file-system-provisioner-store-injection-token.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<MigrationDeclaration>({ | ||
id: "file-system-provisioner-store-injection-token", | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
22 changes: 22 additions & 0 deletions
22
...ension-loader/file-system-provisioner-store/get-path-to-legacy-package-json.injectable.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
/** | ||
* 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) => joinPaths(directoryForUserData, "node_modules", extensionName, "package.json"); | ||
}, | ||
}); | ||
|
||
export default getPathToLegacyPackageJson; |
12 changes: 12 additions & 0 deletions
12
...nsions/extension-loader/file-system-provisioner-store/registered-extensions.injectable.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<LensExtensionId, string>(), | ||
}); |