Commit 6d10f011 authored by Sebastian Malton's avatar Sebastian Malton
Browse files

Explicitly initialize registries


- Helps moves towards turning on banning CyclicImports
Signed-off-by: default avatarSebastian Malton <sebastian@malton.name>
parent c18df6bc
Showing with 48 additions and 54 deletions
+48 -54
......@@ -29,7 +29,7 @@ import { RoutingError, RoutingErrorType } from "./error";
import { ExtensionsStore } from "../../extensions/extensions-store";
import { ExtensionLoader } from "../../extensions/extension-loader";
import type { LensExtension } from "../../extensions/lens-extension";
import type { RouteHandler, RouteParams } from "../../extensions/registries/protocol-handler-registry";
import type { RouteHandler, RouteParams } from "../../extensions/registries/protocol-handler";
// IPC channel for protocol actions. Main broadcasts the open-url events to this channel.
export const ProtocolHandlerIpcPrefix = "protocol-handler";
......
......@@ -26,4 +26,4 @@ export type { KubeObjectStatusRegistration } from "../registries/kube-object-sta
export type { PageRegistration, RegisteredPage, PageParams, PageComponentProps, PageComponents, PageTarget } from "../registries/page-registry";
export type { PageMenuRegistration, ClusterPageMenuRegistration, PageMenuComponents } from "../registries/page-menu-registry";
export type { StatusBarRegistration } from "../registries/status-bar-registry";
export type { ProtocolHandlerRegistration, RouteParams as ProtocolRouteParams, RouteHandler as ProtocolRouteHandler } from "../registries/protocol-handler-registry";
export type { ProtocolHandlerRegistration, RouteParams as ProtocolRouteParams, RouteHandler as ProtocolRouteHandler } from "../registries/protocol-handler";
......@@ -221,11 +221,13 @@ export class ExtensionLoader extends Singleton {
}
loadOnMain() {
registries.MenuRegistry.createInstance();
logger.debug(`${logModule}: load on main`);
this.autoInitExtensions(async (extension: LensMainExtension) => {
// Each .add returns a function to remove the item
const removeItems = [
registries.menuRegistry.add(extension.appMenus)
registries.MenuRegistry.getInstance().add(extension.appMenus)
];
this.events.on("remove", (removedExtension: LensRendererExtension) => {
......@@ -244,13 +246,13 @@ export class ExtensionLoader extends Singleton {
logger.debug(`${logModule}: load on main renderer (cluster manager)`);
this.autoInitExtensions(async (extension: LensRendererExtension) => {
const removeItems = [
registries.globalPageRegistry.add(extension.globalPages, extension),
registries.appPreferenceRegistry.add(extension.appPreferences),
registries.entitySettingRegistry.add(extension.entitySettings),
registries.statusBarRegistry.add(extension.statusBarItems),
registries.commandRegistry.add(extension.commands),
registries.welcomeMenuRegistry.add(extension.welcomeMenus),
registries.catalogEntityDetailRegistry.add(extension.catalogEntityDetailItems),
registries.GlobalPageRegistry.getInstance().add(extension.globalPages, extension),
registries.AppPreferenceRegistry.getInstance().add(extension.appPreferences),
registries.EntitySettingRegistry.getInstance().add(extension.entitySettings),
registries.StatusBarRegistry.getInstance().add(extension.statusBarItems),
registries.CommandRegistry.getInstance().add(extension.commands),
registries.WelcomeMenuRegistry.getInstance().add(extension.welcomeMenus),
registries.CatalogEntityDetailRegistry.getInstance().add(extension.catalogEntityDetailItems),
];
this.events.on("remove", (removedExtension: LensRendererExtension) => {
......@@ -275,13 +277,13 @@ export class ExtensionLoader extends Singleton {
}
const removeItems = [
registries.clusterPageRegistry.add(extension.clusterPages, extension),
registries.clusterPageMenuRegistry.add(extension.clusterPageMenus, extension),
registries.kubeObjectMenuRegistry.add(extension.kubeObjectMenuItems),
registries.kubeObjectDetailRegistry.add(extension.kubeObjectDetailItems),
registries.kubeObjectStatusRegistry.add(extension.kubeObjectStatusTexts),
registries.workloadsOverviewDetailRegistry.add(extension.kubeWorkloadsOverviewItems),
registries.commandRegistry.add(extension.commands),
registries.ClusterPageRegistry.getInstance().add(extension.clusterPages, extension),
registries.ClusterPageMenuRegistry.getInstance().add(extension.clusterPageMenus, extension),
registries.KubeObjectMenuRegistry.getInstance().add(extension.kubeObjectMenuItems),
registries.KubeObjectDetailRegistry.getInstance().add(extension.kubeObjectDetailItems),
registries.KubeObjectStatusRegistry.getInstance().add(extension.kubeObjectStatusTexts),
registries.WorkloadsOverviewDetailRegistry.getInstance().add(extension.kubeWorkloadsOverviewItems),
registries.CommandRegistry.getInstance().add(extension.commands),
];
this.events.on("remove", (removedExtension: LensRendererExtension) => {
......
......@@ -19,7 +19,7 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
import { getExtensionPageUrl, globalPageRegistry, PageParams } from "../page-registry";
import { ClusterPageRegistry, getExtensionPageUrl, GlobalPageRegistry, PageParams } from "../page-registry";
import { LensExtension } from "../../lens-extension";
import React from "react";
import { Console } from "console";
......@@ -43,7 +43,8 @@ describe("getPageUrl", () => {
isEnabled: true,
isCompatible: true
});
globalPageRegistry.add({
ClusterPageRegistry.createInstance();
GlobalPageRegistry.createInstance().add({
id: "page-with-params",
components: {
Page: () => React.createElement("Page with params")
......@@ -55,6 +56,11 @@ describe("getPageUrl", () => {
}, ext);
});
afterEach(() => {
GlobalPageRegistry.resetInstance();
ClusterPageRegistry.resetInstance();
});
it("returns a page url for extension", () => {
expect(getExtensionPageUrl({ extensionId: ext.name })).toBe("/extension/foo-bar");
});
......@@ -111,7 +117,8 @@ describe("globalPageRegistry", () => {
isEnabled: true,
isCompatible: true
});
globalPageRegistry.add([
ClusterPageRegistry.createInstance();
GlobalPageRegistry.createInstance().add([
{
id: "test-page",
components: {
......@@ -132,9 +139,14 @@ describe("globalPageRegistry", () => {
], ext);
});
afterEach(() => {
GlobalPageRegistry.resetInstance();
ClusterPageRegistry.resetInstance();
});
describe("getByPageTarget", () => {
it("matching to first registered page without id", () => {
const page = globalPageRegistry.getByPageTarget({ extensionId: ext.name });
const page = GlobalPageRegistry.getInstance().getByPageTarget({ extensionId: ext.name });
expect(page.id).toEqual(undefined);
expect(page.extensionId).toEqual(ext.name);
......@@ -142,7 +154,7 @@ describe("globalPageRegistry", () => {
});
it("returns matching page", () => {
const page = globalPageRegistry.getByPageTarget({
const page = GlobalPageRegistry.getInstance().getByPageTarget({
pageId: "test-page",
extensionId: ext.name
});
......@@ -151,7 +163,7 @@ describe("globalPageRegistry", () => {
});
it("returns null if target not found", () => {
const page = globalPageRegistry.getByPageTarget({
const page = GlobalPageRegistry.getInstance().getByPageTarget({
pageId: "wrong-page",
extensionId: ext.name
});
......
......@@ -46,5 +46,3 @@ export class AppPreferenceRegistry extends BaseRegistry<AppPreferenceRegistratio
};
}
}
export const appPreferenceRegistry = new AppPreferenceRegistry();
......@@ -21,12 +21,14 @@
// Base class for extensions-api registries
import { action, observable, makeObservable } from "mobx";
import { Singleton } from "../../common/utils";
import { LensExtension } from "../lens-extension";
export class BaseRegistry<T, I = T> {
export class BaseRegistry<T, I = T> extends Singleton {
private items = observable.map<T, I>([], {deep: false});
constructor() {
super();
makeObservable(this);
}
......
......@@ -42,5 +42,3 @@ export class CatalogEntityDetailRegistry extends BaseRegistry<CatalogEntityDetai
return items.sort((a, b) => (b.priority ?? 50) - (a.priority ?? 50));
}
}
export const catalogEntityDetailRegistry = new CatalogEntityDetailRegistry();
......@@ -50,5 +50,3 @@ export class CommandRegistry extends BaseRegistry<CommandRegistration> {
return super.add(filteredItems, extension);
}
}
export const commandRegistry = new CommandRegistry();
......@@ -68,5 +68,3 @@ export class EntitySettingRegistry extends BaseRegistry<EntitySettingRegistratio
return items.sort((a, b) => (b.priority ?? 50) - (a.priority ?? 50));
}
}
export const entitySettingRegistry = new EntitySettingRegistry();
......@@ -32,6 +32,6 @@ export * from "./kube-object-status-registry";
export * from "./command-registry";
export * from "./entity-setting-registry";
export * from "./welcome-menu-registry";
export * from "./protocol-handler-registry";
export * from "./catalog-entity-detail-registry";
export * from "./workloads-overview-detail-registry";
export * from "./protocol-handler";
......@@ -20,10 +20,12 @@
*/
import type React from "react";
import type { KubeObjectDetailsProps } from "../renderer-api/components";
import type { KubeObject } from "../renderer-api/k8s-api";
import { BaseRegistry } from "./base-registry";
export interface KubeObjectDetailComponents {
Details: React.ComponentType<any>;
Details: React.ComponentType<KubeObjectDetailsProps<KubeObject>>;
}
export interface KubeObjectDetailRegistration {
......@@ -42,5 +44,3 @@ export class KubeObjectDetailRegistry extends BaseRegistry<KubeObjectDetailRegis
return items.sort((a, b) => (b.priority ?? 50) - (a.priority ?? 50));
}
}
export const kubeObjectDetailRegistry = new KubeObjectDetailRegistry();
......@@ -39,5 +39,3 @@ export class KubeObjectMenuRegistry extends BaseRegistry<KubeObjectMenuRegistrat
});
}
}
export const kubeObjectMenuRegistry = new KubeObjectMenuRegistry();
......@@ -43,5 +43,3 @@ export class KubeObjectStatusRegistry extends BaseRegistry<KubeObjectStatusRegis
.filter(Boolean);
}
}
export const kubeObjectStatusRegistry = new KubeObjectStatusRegistry();
......@@ -30,5 +30,3 @@ export interface MenuRegistration extends MenuItemConstructorOptions {
export class MenuRegistry extends BaseRegistry<MenuRegistration> {
}
export const menuRegistry = new MenuRegistry();
......@@ -75,5 +75,3 @@ export class ClusterPageMenuRegistry extends PageMenuRegistry<ClusterPageMenuReg
));
}
}
export const clusterPageMenuRegistry = new ClusterPageMenuRegistry();
......@@ -75,7 +75,7 @@ export function getExtensionPageUrl(target: PageTarget): string {
const pageUrl = new URL(pagePath, `http://localhost`);
// stringify params to matched target page
const registeredPage = globalPageRegistry.getByPageTarget(target) || clusterPageRegistry.getByPageTarget(target);
const registeredPage = GlobalPageRegistry.getInstance().getByPageTarget(target) || ClusterPageRegistry.getInstance().getByPageTarget(target);
if (registeredPage?.params) {
Object.entries(registeredPage.params).forEach(([name, param]) => {
......@@ -91,7 +91,7 @@ export function getExtensionPageUrl(target: PageTarget): string {
return pageUrl.href.replace(pageUrl.origin, "");
}
export class PageRegistry extends BaseRegistry<PageRegistration, RegisteredPage> {
class PageRegistry extends BaseRegistry<PageRegistration, RegisteredPage> {
protected getRegisteredItem(page: PageRegistration, ext: LensExtension): RegisteredPage {
const { id: pageId } = page;
const extensionId = ext.name;
......@@ -157,5 +157,5 @@ export class PageRegistry extends BaseRegistry<PageRegistration, RegisteredPage>
}
}
export const globalPageRegistry = new PageRegistry();
export const clusterPageRegistry = new PageRegistry();
export class ClusterPageRegistry extends PageRegistry {}
export class GlobalPageRegistry extends PageRegistry {}
......@@ -41,5 +41,3 @@ export interface StatusBarRegistration extends StatusBarRegistrationV2 {
export class StatusBarRegistry extends BaseRegistry<StatusBarRegistration> {
}
export const statusBarRegistry = new StatusBarRegistry();
......@@ -28,5 +28,3 @@ export interface WelcomeMenuRegistration {
}
export class WelcomeMenuRegistry extends BaseRegistry<WelcomeMenuRegistration> {}
export const welcomeMenuRegistry = new WelcomeMenuRegistry();
......@@ -38,5 +38,3 @@ export class WorkloadsOverviewDetailRegistry extends BaseRegistry<WorkloadsOverv
return items.sort((a, b) => (b.priority ?? 50) - (a.priority ?? 50));
}
}
export const workloadsOverviewDetailRegistry = new WorkloadsOverviewDetailRegistry();
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment