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

Cleanup get extension fake to simplify impl

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2023-03-21 08:35:52 -04:00
parent 5856210aa9
commit c74f88fda6
2 changed files with 35 additions and 76 deletions

View File

@ -53,7 +53,7 @@ import { applicationWindowInjectionToken } from "../../../main/start-main-applic
import closeAllWindowsInjectable from "../../../main/start-main-application/lens-window/hide-all-windows/close-all-windows.injectable"; import closeAllWindowsInjectable from "../../../main/start-main-application/lens-window/hide-all-windows/close-all-windows.injectable";
import type { LensWindow } from "../../../main/start-main-application/lens-window/application-window/create-lens-window.injectable"; import type { LensWindow } from "../../../main/start-main-application/lens-window/application-window/create-lens-window.injectable";
import type { FakeExtensionOptions } from "./get-extension-fake"; import type { FakeExtensionOptions } from "./get-extension-fake";
import { getExtensionFakeForMain, getExtensionFakeForRenderer } from "./get-extension-fake"; import { getMainExtensionFakeWith, getRendererExtensionFakeWith } from "./get-extension-fake";
import namespaceApiInjectable from "../../../common/k8s-api/endpoints/namespace.api.injectable"; import namespaceApiInjectable from "../../../common/k8s-api/endpoints/namespace.api.injectable";
import { Namespace } from "../../../common/k8s-api/endpoints"; import { Namespace } from "../../../common/k8s-api/endpoints";
import { getOverrideFsWithFakes } from "../../../test-utils/override-fs-with-fakes"; import { getOverrideFsWithFakes } from "../../../test-utils/override-fs-with-fakes";
@ -594,49 +594,28 @@ export const getApplicationBuilder = () => {
}, },
enable: (...extensions) => { enable: (...extensions) => {
builder.afterWindowStart(({ windowDi }) => { builder.afterWindowStart(action(({ windowDi }) => {
const rendererExtensionInstances = extensions.map((options) => extensions
getExtensionFakeForRenderer( .map(getRendererExtensionFakeWith(windowDi))
windowDi, .forEach(enableExtensionFor(windowDi, rendererExtensionsStateInjectable));
options.id, }));
options.name,
options.rendererOptions || {},
),
);
rendererExtensionInstances.forEach( builder.afterApplicationStart(action(({ mainDi }) => {
enableExtensionFor(windowDi, rendererExtensionsStateInjectable), extensions
); .map(getMainExtensionFakeWith(mainDi))
}); .forEach(enableExtensionFor(mainDi, mainExtensionsStateInjectable));
}));
builder.afterApplicationStart(({ mainDi }) => {
const mainExtensionInstances = extensions.map((extension) =>
getExtensionFakeForMain(mainDi, extension.id, extension.name, extension.mainOptions || {}),
);
runInAction(() => {
mainExtensionInstances.forEach(
enableExtensionFor(mainDi, mainExtensionsStateInjectable),
);
});
});
}, },
disable: (...extensions) => { disable: (...extensions) => {
builder.afterWindowStart(({ windowDi }) => { builder.afterWindowStart(({ windowDi }) => {
extensions extensions
.map((ext) => ext.id) .forEach(disableExtensionFor(windowDi, rendererExtensionsStateInjectable));
.forEach(
disableExtensionFor(windowDi, rendererExtensionsStateInjectable),
);
}); });
builder.afterApplicationStart(({ mainDi }) => { builder.afterApplicationStart(({ mainDi }) => {
extensions extensions
.map((ext) => ext.id) .forEach(disableExtensionFor(mainDi, mainExtensionsStateInjectable));
.forEach(
disableExtensionFor(mainDi, mainExtensionsStateInjectable),
);
}); });
}, },
}, },
@ -835,49 +814,29 @@ const selectOptionFor = (builder: ApplicationBuilder, menuId: string) => (labelT
userEvent.click(option); userEvent.click(option);
}; };
const enableExtensionFor = ( function enableExtensionFor(di: DiContainer, stateInjectable: Injectable<ObservableMap<string, any>, any, any>) {
di: DiContainer,
stateInjectable: Injectable<ObservableMap<string, any>, any, any>,
) => {
const extensionState = di.inject(stateInjectable); const extensionState = di.inject(stateInjectable);
const getExtension = (extension: LensExtension) => return (instance: LensExtension) => {
di.inject(extensionInjectable, extension); const extension = di.inject(extensionInjectable, instance);
return (extensionInstance: LensExtension) => { extension.register();
const extension = getExtension(extensionInstance); extensionState.set(instance.id, instance);
runInAction(() => {
extension.register();
extensionState.set(extensionInstance.id, extensionInstance);
});
}; };
}; }
const disableExtensionFor = function disableExtensionFor(di: DiContainer, stateInjectable: Injectable<ObservableMap<string, any>, unknown, void>) {
( return (extension: FakeExtensionOptions) => {
di: DiContainer, const extensionsState = di.inject(stateInjectable);
stateInjectable: Injectable<ObservableMap<string, any>, unknown, void>, const instance = extensionsState.get(extension.id);
) =>
(id: string) => {
const getExtension = (extension: LensExtension) =>
di.inject(extensionInjectable, extension);
const extensionsState = di.inject(stateInjectable); if (!instance) {
throw new Error(`Tried to disable extension with ID "${extension.id}", but it wasn't enabled`);
}
const instance = extensionsState.get(id); const injectable = di.inject(extensionInjectable, instance);
if (!instance) { injectable.deregister();
throw new Error( extensionsState.delete(extension.id);
`Tried to disable extension with ID "${id}", but it wasn't enabled`, };
); }
}
const injectable = getExtension(instance);
runInAction(() => {
injectable.deregister();
extensionsState.delete(id);
});
};

View File

@ -27,7 +27,7 @@ export interface FakeExtensionOptions {
mainOptions?: Partial<LensMainExtension>; mainOptions?: Partial<LensMainExtension>;
} }
export const getExtensionFakeForMain = (di: DiContainer, id: string, name: string, options: Partial<LensMainExtension>) => { export const getMainExtensionFakeWith = (di: DiContainer) => ({ id, name, mainOptions = {}}: FakeExtensionOptions) => {
const instance = new TestExtensionMain({ const instance = new TestExtensionMain({
id, id,
absolutePath: "irrelevant", absolutePath: "irrelevant",
@ -44,7 +44,7 @@ export const getExtensionFakeForMain = (di: DiContainer, id: string, name: strin
manifestPath: "irrelevant", manifestPath: "irrelevant",
}); });
Object.assign(instance, options); Object.assign(instance, mainOptions);
(instance as Writable<LensMainExtension>)[lensExtensionDependencies] = { (instance as Writable<LensMainExtension>)[lensExtensionDependencies] = {
fileSystemProvisionerStore: di.inject(fileSystemProvisionerStoreInjectable), fileSystemProvisionerStore: di.inject(fileSystemProvisionerStoreInjectable),
@ -56,7 +56,7 @@ export const getExtensionFakeForMain = (di: DiContainer, id: string, name: strin
return instance; return instance;
}; };
export const getExtensionFakeForRenderer = (di: DiContainer, id: string, name: string, options: Partial<LensRendererExtension>) => { export const getRendererExtensionFakeWith = (di: DiContainer) => ({ id, name, rendererOptions = {}}: FakeExtensionOptions) => {
const instance = new TestExtensionRenderer({ const instance = new TestExtensionRenderer({
id, id,
absolutePath: "irrelevant", absolutePath: "irrelevant",
@ -73,7 +73,7 @@ export const getExtensionFakeForRenderer = (di: DiContainer, id: string, name: s
manifestPath: "irrelevant", manifestPath: "irrelevant",
}); });
Object.assign(instance, options); Object.assign(instance, rendererOptions);
(instance as Writable<LensRendererExtension>)[lensExtensionDependencies] = { (instance as Writable<LensRendererExtension>)[lensExtensionDependencies] = {
categoryRegistry: di.inject(catalogCategoryRegistryInjectable), categoryRegistry: di.inject(catalogCategoryRegistryInjectable),