Skip to content

Commit

Permalink
Make registeredExtensions a dependency
Browse files Browse the repository at this point in the history
Signed-off-by: Juho Heikka <juho.heikka@gmail.com>
  • Loading branch information
jweak committed Feb 21, 2023
1 parent 795084d commit 845c727
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/

import type { ObservableMap } from "mobx";
import { getInjectable } from "@ogre-tools/injectable";

import { getOrInsert } from "../../../common/utils";
Expand All @@ -13,9 +12,9 @@ import directoryForExtensionDataInjectable from "./directory-for-extension-data.
import ensureDirInjectable from "../../../common/fs/ensure-dir.injectable";
import getHashInjectable from "./get-hash.injectable";
import getPathToLegacyPackageJsonInjectable from "./get-path-to-legacy-package-json.injectable";
import { registeredExtensionsInjectable } from "./registered-extensions.injectable";

export type EnsureHashedDirectoryForExtension = (extensionName: string, registeredExtensions: ObservableMap<string, string>) => Promise<string>;

export type EnsureHashedDirectoryForExtension = (extensionName: string) => Promise<string>;

const ensureHashedDirectoryForExtensionInjectable = getInjectable({
id: "ensure-hashed-directory-for-extension",
Expand All @@ -27,8 +26,9 @@ const ensureHashedDirectoryForExtensionInjectable = getInjectable({
const ensureDirectory = di.inject(ensureDirInjectable);
const getHash = di.inject(getHashInjectable);
const getPathToLegacyPackageJson = di.inject(getPathToLegacyPackageJsonInjectable);
const registeredExtensions = di.inject(registeredExtensionsInjectable);

return async (extensionName, registeredExtensions) => {
return async (extensionName) => {
let dirPath: string;

const legacyDirPath = getPathToLegacyPackageJson(extensionName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { ObservableMap } from "mobx";
import { observable, runInAction } 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;
Expand All @@ -29,7 +30,7 @@ describe("ensure-hashed-directory-for-extension", () => {
ensureHashedDirectoryForExtensionInjectable,
);

registeredExtensions = observable.map();
registeredExtensions = di.inject(registeredExtensionsInjectable);
});

it("given registered extension exists, returns existing directory", async () => {
Expand All @@ -39,7 +40,6 @@ describe("ensure-hashed-directory-for-extension", () => {

const actual = await ensureHashedDirectoryForExtension(
"some-extension-name",
registeredExtensions,
);

expect(actual).toBe("some-directory");
Expand All @@ -48,7 +48,6 @@ describe("ensure-hashed-directory-for-extension", () => {
it("given registered extension does not exist, returns random directory", async () => {
const actual = await ensureHashedDirectoryForExtension(
"some-extension-name",
registeredExtensions,
);

expect(actual).toBe("some-directory-for-extension-data/a37a1cfefc0391af3733f23cb6b29443f596a2b8ffe6d116c35df7bc3cd99ef6");
Expand All @@ -65,7 +64,6 @@ describe("ensure-hashed-directory-for-extension", () => {
it("returns existing directory", async () => {
const actual = await ensureHashedDirectoryForExtension(
"some-extension-name",
registeredExtensions,
);

expect(actual).toBe("some-directory");
Expand All @@ -74,7 +72,6 @@ describe("ensure-hashed-directory-for-extension", () => {
it("ensure dir is called with some directory", async () => {
await ensureHashedDirectoryForExtension(
"some-extension-name",
registeredExtensions,
);

expect(ensureDirMock).toHaveBeenCalledWith("some-directory");
Expand All @@ -83,7 +80,6 @@ describe("ensure-hashed-directory-for-extension", () => {
it("is migrated to use the extension name as key", async () => {
await ensureHashedDirectoryForExtension(
"some-extension-name",
registeredExtensions,
);

expect(registeredExtensions.get("some-extension-name")).toEqual("some-directory");
Expand All @@ -92,7 +88,6 @@ describe("ensure-hashed-directory-for-extension", () => {
it("old key is removed", async () => {
await ensureHashedDirectoryForExtension(
"some-extension-name",
registeredExtensions,
);

expect(registeredExtensions.has("/some-directory-for-user-data/node_modules/some-extension-name/package.json")).toEqual(false);
Expand Down
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",
});
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { persistStateToConfigInjectionToken } from "../../../common/base-store/s
import getBasenameOfPathInjectable from "../../../common/path/get-basename.injectable";
import { enlistMessageChannelListenerInjectionToken } from "../../../common/utils/channel/enlist-message-channel-listener-injection-token";
import ensureHashedDirectoryForExtensionInjectable from "./ensure-hashed-directory-for-extension.injectable";
import { registeredExtensionsInjectable } from "./registered-extensions.injectable";

const fileSystemProvisionerStoreInjectable = getInjectable({
id: "file-system-provisioner-store",
Expand All @@ -30,6 +31,7 @@ const fileSystemProvisionerStoreInjectable = getInjectable({
enlistMessageChannelListener: di.inject(enlistMessageChannelListenerInjectionToken),
shouldDisableSyncInListener: di.inject(shouldBaseStoreDisableSyncInIpcListenerInjectionToken),
ensureHashedDirectoryForExtension: di.inject(ensureHashedDirectoryForExtensionInjectable),
registeredExtensions: di.inject(registeredExtensionsInjectable),
}),
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/

import { action, makeObservable, observable } from "mobx";
import type { ObservableMap } from "mobx";
import { action, makeObservable } from "mobx";
import type { BaseStoreDependencies } from "../../../common/base-store/base-store";
import { BaseStore } from "../../../common/base-store/base-store";
import type { LensExtensionId } from "../../lens-extension";
Expand All @@ -16,11 +17,10 @@ interface FSProvisionModel {

interface Dependencies extends BaseStoreDependencies {
ensureHashedDirectoryForExtension: EnsureHashedDirectoryForExtension;
registeredExtensions: ObservableMap<LensExtensionId, string>;
}

export class FileSystemProvisionerStore extends BaseStore<FSProvisionModel> {
readonly registeredExtensions = observable.map<LensExtensionId, string>();

constructor(protected readonly dependencies: Dependencies) {
super(dependencies, {
configName: "lens-filesystem-provisioner-store",
Expand All @@ -37,17 +37,17 @@ export class FileSystemProvisionerStore extends BaseStore<FSProvisionModel> {
* @returns path to the folder that the extension can safely write files to.
*/
async requestDirectory(extensionName: string): Promise<string> {
return this.dependencies.ensureHashedDirectoryForExtension(extensionName, this.registeredExtensions);
return this.dependencies.ensureHashedDirectoryForExtension(extensionName);
}

@action
protected fromStore({ extensions }: FSProvisionModel = { extensions: {}}): void {
this.registeredExtensions.merge(extensions);
this.dependencies.registeredExtensions.merge(extensions);
}

toJSON(): FSProvisionModel {
return toJS({
extensions: Object.fromEntries(this.registeredExtensions),
extensions: Object.fromEntries(this.dependencies.registeredExtensions),
});
}
}
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>(),
});

0 comments on commit 845c727

Please sign in to comment.