Complete a majority of the rest of DI

- All KubeApi and KubeObjectStore's

- All of Catalog

- ApiManager

- KubeObjectDetailRegistry

- All BaseStore's and their migrations

- LensProxy and Router

- WindowManager

- App Menu

- Tray Icon

- ThemeStore

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton committed 2022-01-28 18:05:05 -05:00
1 parent 6cba82c491
commit 1747cbf6c8
1345 files changed
+34694 -27702

No files matched your search

@@ -23,7 +23,7 @@ jest.mock(
"electron",
() => ({
ipcRenderer: {
invoke: jest.fn(async (channel: string) => {
invoke: jest.fn((channel: string) => {
if (channel === "extensions:main") {
return [
[
@@ -12,7 +12,7 @@ console = new Console(stdout, stderr);
let ext: LensExtension = null;
describe("lens extension", () => {
beforeEach(async () => {
beforeEach(() => {
ext = new LensExtension({
manifest: {
name: "foo-bar",
+1 -6
View File
@@ -3,12 +3,7 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
export {
KubernetesCluster,
kubernetesClusterCategory,
GeneralEntity,
WebLink,
} from "../../common/catalog-entities";
export { KubernetesCluster, GeneralEntity, WebLink } from "../../common/catalog-entities";
export type {
KubernetesClusterPrometheusMetrics,
+2 -2
View File
@@ -4,10 +4,10 @@
*/
export type { AppPreferenceRegistration, AppPreferenceComponents } from "../../renderer/components/+preferences/app-preferences/app-preference-registration";
export type { KubeObjectDetailRegistration, KubeObjectDetailComponents } from "../registries/kube-object-detail-registry";
export type { KubeObjectMenuRegistration, KubeObjectMenuComponents } from "../registries/kube-object-menu-registry";
export type { KubeObjectStatusRegistration } from "../registries/kube-object-status-registry";
export type { PageRegistration, RegisteredPage, PageParams, PageComponentProps, PageComponents, PageTarget } from "../registries/page-registry";
export type { ClusterPageMenuRegistration, ClusterPageMenuComponents } 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";
export type { KubeObjectStatusRegistration } from "../../renderer/components/kube-object-status-icon/kube-object-status";
export type { KubeObjectDetailRegistration, KubeObjectDetailComponents } from "../../renderer/components/kube-object-details/kube-details-items/kube-detail-items";
@@ -3,11 +3,14 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { UserStore } from "../../common/user-store";
import userPreferencesStoreInjectable from "../../common/user-preferences/store.injectable";
import { asLegacyGlobalObjectForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
const userStore = asLegacyGlobalObjectForExtensionApi(userPreferencesStoreInjectable);
/**
* Get the configured kubectl binaries path.
*/
export function getKubectlPath(): string | undefined {
return UserStore.getInstance().kubectlBinariesPath;
return userStore.kubectlBinariesPath;
}
@@ -14,7 +14,7 @@ import type { ExtensionDiscovery } from "../extension-discovery/extension-discov
import installExtensionInjectable
from "../extension-installer/install-extension/install-extension.injectable";
import directoryForUserDataInjectable
from "../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable";
from "../../common/app-paths/directory-for-user-data.injectable";
import mockFs from "mock-fs";
jest.setTimeout(60_000);
@@ -128,15 +128,15 @@ export class ExtensionDiscovery {
/**
* Initializes the class and setups the file watcher for added/removed local extensions.
*/
async init(): Promise<void> {
init() {
if (ipcRenderer) {
await this.initRenderer();
this.initRenderer();
} else {
await this.initMain();
this.initMain();
}
}
async initRenderer(): Promise<void> {
initRenderer() {
const onMessage = ({ isLoaded }: ExtensionDiscoveryChannelMessage) => {
this.isLoaded = isLoaded;
};
@@ -147,7 +147,7 @@ export class ExtensionDiscovery {
});
}
async initMain(): Promise<void> {
initMain() {
ipcMainHandle(ExtensionDiscovery.extensionDiscoveryChannel, () => this.toJSON());
reaction(() => this.toJSON(), () => {
@@ -479,10 +479,8 @@ export class ExtensionDiscovery {
* Loads extension from absolute path, updates this.packagesJson to include it and returns the extension.
* @param folderPath Folder path to extension
*/
async loadExtensionFromFolder(folderPath: string, { isBundled = false }: LoadFromFolderOptions = {}): Promise<InstalledExtension | null> {
const manifestPath = path.resolve(folderPath, manifestFilename);
return this.getByManifest(manifestPath, { isBundled });
loadExtensionFromFolder(folderPath: string, { isBundled = false }: LoadFromFolderOptions = {}): Promise<InstalledExtension | null> {
return this.getByManifest(path.resolve(folderPath, manifestFilename), { isBundled });
}
toJSON(): ExtensionDiscoveryChannelMessage {
@@ -4,7 +4,7 @@
*/
import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable";
import directoryForUserDataInjectable
from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable";
from "../../../common/app-paths/directory-for-user-data.injectable";
const extensionPackageRootDirectoryInjectable = getInjectable({
instantiate: (di) => di.inject(directoryForUserDataInjectable),
@@ -4,7 +4,7 @@
*/
import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable";
import path from "path";
import directoryForUserDataInjectable from "../../../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable";
import directoryForUserDataInjectable from "../../../../common/app-paths/directory-for-user-data.injectable";
const directoryForExtensionDataInjectable = getInjectable({
instantiate: (di) =>
@@ -4,15 +4,12 @@
*/
import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable";
import { FileSystemProvisionerStore } from "./file-system-provisioner-store";
import directoryForExtensionDataInjectable from "./directory-for-extension-data/directory-for-extension-data.injectable";
import directoryForExtensionDataInjectable from "./directory-for-extension-data.injectable";
const fileSystemProvisionerStoreInjectable = getInjectable({
instantiate: (di) =>
FileSystemProvisionerStore.createInstance({
directoryForExtensionData: di.inject(
directoryForExtensionDataInjectable,
),
}),
instantiate: (di) => new FileSystemProvisionerStore({
directoryForExtensionData: di.inject(directoryForExtensionDataInjectable),
}),
lifecycle: lifecycleEnum.singleton,
});
@@ -132,9 +132,9 @@ export class ExtensionLoader {
@action
async init() {
if (ipcRenderer) {
await this.initRenderer();
this.initRenderer();
} else {
await this.initMain();
this.initMain();
}
await Promise.all([this.whenLoaded]);
@@ -192,7 +192,7 @@ export class ExtensionLoader {
this.extensions.get(lensExtensionId).isEnabled = isEnabled;
}
protected async initMain() {
protected initMain() {
this.isLoaded = true;
this.loadOnMain();
@@ -205,7 +205,7 @@ export class ExtensionLoader {
});
}
protected async initRenderer() {
protected initRenderer() {
const extensionListHandler = (extensions: [LensExtensionId, InstalledExtension][]) => {
this.isLoaded = true;
this.syncExtensions(extensions);
@@ -249,12 +249,11 @@ export class ExtensionLoader {
loadOnClusterManagerRenderer = () => {
logger.debug(`${logModule}: load on main renderer (cluster manager)`);
return this.autoInitExtensions(async (extension: LensRendererExtension) => {
return this.autoInitExtensions((extension: LensRendererExtension) => {
const removeItems = [
registries.GlobalPageRegistry.getInstance().add(extension.globalPages, extension),
registries.EntitySettingRegistry.getInstance().add(extension.entitySettings),
registries.StatusBarRegistry.getInstance().add(extension.statusBarItems),
registries.CatalogEntityDetailRegistry.getInstance().add(extension.catalogEntityDetailItems),
];
this.events.on("remove", (removedExtension: LensRendererExtension) => {
@@ -265,7 +264,7 @@ export class ExtensionLoader {
}
});
return removeItems;
return Promise.resolve(removeItems);
});
};
@@ -282,8 +281,6 @@ export class ExtensionLoader {
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),
];
@@ -4,7 +4,7 @@
*/
import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable";
import directoryForUserDataInjectable
from "../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable";
from "../../common/app-paths/directory-for-user-data.injectable";
const extensionPackagesRootInjectable = getInjectable({
instantiate: (di) => di.inject(directoryForUserDataInjectable),
+63
View File
@@ -7,7 +7,70 @@ import { BaseStore } from "../common/base-store";
import * as path from "path";
import type { LensExtension } from "./lens-extension";
type StaticThis<T, R extends any[]> = { new(...args: R): T };
export abstract class ExtensionStore<T> extends BaseStore<T> {
private static instances = new WeakMap<object, ExtensionStore<any>>();
private static creating = "";
/**
* @deprecated You can and should just create the instance of the store yourself
* Creates the single instance of the child class if one was not already created.
*
* Multiple calls will return the same instance.
* Essentially throwing away the arguments to the subsequent calls.
*
* Note: this is a racy function, if two (or more) calls are racing to call this function
* only the first's arguments will be used.
* @param this Implicit argument that is the child class type
* @param args The constructor arguments for the child class
* @returns An instance of the child class
*/
static createInstance<T, R extends any[]>(this: StaticThis<T, R>, ...args: R): T {
if (!ExtensionStore.instances.has(this)) {
if (ExtensionStore.creating.length > 0) {
throw new TypeError(`Cannot create a second ExtensionStore (${this.name}) while creating a first (${ExtensionStore.creating})`);
}
try {
ExtensionStore.creating = this.name;
ExtensionStore.instances.set(this, new this(...args) as any);
} finally {
ExtensionStore.creating = "";
}
}
return ExtensionStore.instances.get(this) as any;
}
/**
* @deprecated You can and should just get the instance of the store yourself
* Get the instance of the child class that was previously created.
* @param this Implicit argument that is the child class type
* @param strict If false will return `undefined` instead of throwing when an instance doesn't exist.
* Default: `true`
* @returns An instance of the child class
*/
static getInstance<T, R extends any[]>(this: StaticThis<T, R>, strict = true): T | undefined {
if (!ExtensionStore.instances.has(this) && strict) {
throw new TypeError(`instance of ${this.name} is not created`);
}
return ExtensionStore.instances.get(this) as any;
}
/**
* @deprecated This function shouldn't really be used
* Delete the instance of the child class.
*
* Note: this doesn't prevent callers of `getInstance` from storing the result in a global.
*
* There is *no* way in JS or TS to prevent globals like that.
*/
static resetInstance() {
ExtensionStore.instances.delete(this);
}
readonly displayName = "ExtensionStore<T>";
protected extension: LensExtension;
@@ -6,7 +6,7 @@ import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable";
import { ExtensionsStore } from "./extensions-store";
const extensionsStoreInjectable = getInjectable({
instantiate: () => ExtensionsStore.createInstance(),
instantiate: () => new ExtensionsStore(),
lifecycle: lifecycleEnum.singleton,
});
+2 -2
View File
@@ -75,12 +75,12 @@ export class LensExtension {
* Note: there is no security done on this folder, only obfuscation of the
* folder name.
*/
async getExtensionFileFolder(): Promise<string> {
getExtensionFileFolder(): Promise<string> {
return this.dependencies.fileSystemProvisionerStore.requestDirectory(this.id);
}
@action
async enable(register: (ext: LensExtension) => Promise<Disposer[]>) {
async enable(register: (ext: LensExtension) => Disposer[] | Promise<Disposer[]>) {
if (this._isEnabled) {
return;
}
+17 -7
View File
@@ -4,25 +4,35 @@
*/
import { LensExtension } from "./lens-extension";
import { WindowManager } from "../main/window-manager";
import { catalogEntityRegistry } from "../main/catalog";
import type { CatalogEntity } from "../common/catalog";
import type { IObservableArray } from "mobx";
import { computed, IComputedValue, IObservableArray, observable } from "mobx";
import type { MenuRegistration } from "../main/menu/menu-registration";
import type { TrayMenuRegistration } from "../main/tray/tray-menu-registration";
import windowManagerInjectable from "../main/windows/manager.injectable";
import { asLegacyGlobalObjectForExtensionApi } from "./as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
const windowManager = asLegacyGlobalObjectForExtensionApi(windowManagerInjectable);
export class LensMainExtension extends LensExtension {
appMenus: MenuRegistration[] = [];
trayMenus: TrayMenuRegistration[] = [];
sources = observable.map<string, IComputedValue<CatalogEntity[]>>();
async navigate(pageId?: string, params?: Record<string, any>, frameId?: number) {
return WindowManager.getInstance().navigateExtension(this.id, pageId, params, frameId);
navigate(pageId?: string, params?: Record<string, any>, frameId?: number) {
return windowManager.navigateExtension(this.id, pageId, params, frameId);
}
/**
* @deprecated Just call `set()` on `.sources` directly
*/
addCatalogSource(id: string, source: IObservableArray<CatalogEntity>) {
catalogEntityRegistry.addObservableSource(`${this.name}:${id}`, source);
this.sources.set(id, computed(() => [...source]));
}
/**
* @deprecated Just call `delete()` on `.sources` directly
*/
removeCatalogSource(id: string) {
catalogEntityRegistry.removeSource(`${this.name}:${id}`);
this.sources.delete(id);
}
}
+21 -10
View File
@@ -6,10 +6,9 @@
import type * as registries from "./registries";
import { Disposers, LensExtension } from "./lens-extension";
import { getExtensionPageUrl } from "./registries/page-registry";
import type { CatalogEntity } from "../common/catalog";
import type { CatalogEntity, CategoryFilter } from "../common/catalog";
import type { Disposer } from "../common/utils";
import { catalogEntityRegistry, EntityFilter } from "../renderer/api/catalog-entity-registry";
import { catalogCategoryRegistry, CategoryFilter } from "../renderer/api/catalog-category-registry";
import type { EntityFilter } from "../renderer/catalog/entity-registry";
import type { TopBarRegistration } from "../renderer/components/layout/top-bar/top-bar-registration";
import type { KubernetesCluster } from "../common/catalog-entities";
import type { WelcomeMenuRegistration } from "../renderer/components/+welcome/welcome-menu-items/welcome-menu-registration";
@@ -17,25 +16,33 @@ import type { WelcomeBannerRegistration } from "../renderer/components/+welcome/
import type { CommandRegistration } from "../renderer/components/command-palette/registered-commands/commands";
import type { AppPreferenceRegistration } from "../renderer/components/+preferences/app-preferences/app-preference-registration";
import type { AdditionalCategoryColumnRegistration } from "../renderer/components/+catalog/custom-category-columns";
import type { KubeObjectDetailRegistration } from "../renderer/components/kube-object-details/kube-details-items/kube-detail-items";
import type { KubeObjectStatusRegistration } from "../renderer/components/kube-object-status-icon/kube-object-status";
import type { CatalogEntityDetailRegistration } from "../renderer/catalog/catalog-entity-details";
import { observable } from "mobx";
import { once } from "lodash";
export class LensRendererExtension extends LensExtension {
globalPages: registries.PageRegistration[] = [];
clusterPages: registries.PageRegistration[] = [];
clusterPageMenus: registries.ClusterPageMenuRegistration[] = [];
kubeObjectStatusTexts: registries.KubeObjectStatusRegistration[] = [];
appPreferences: AppPreferenceRegistration[] = [];
kubeObjectStatusTexts: KubeObjectStatusRegistration[] = [];
entitySettings: registries.EntitySettingRegistration[] = [];
statusBarItems: registries.StatusBarRegistration[] = [];
kubeObjectDetailItems: registries.KubeObjectDetailRegistration[] = [];
kubeObjectDetailItems: KubeObjectDetailRegistration[] = [];
kubeObjectMenuItems: registries.KubeObjectMenuRegistration[] = [];
kubeWorkloadsOverviewItems: registries.WorkloadsOverviewDetailRegistration[] = [];
commands: CommandRegistration[] = [];
welcomeMenus: WelcomeMenuRegistration[] = [];
welcomeBanners: WelcomeBannerRegistration[] = [];
catalogEntityDetailItems: registries.CatalogEntityDetailRegistration<CatalogEntity>[] = [];
catalogEntityDetailItems: CatalogEntityDetailRegistration<CatalogEntity>[] = [];
topBarItems: TopBarRegistration[] = [];
additionalCategoryColumns: AdditionalCategoryColumnRegistration[] = [];
@observable catalogFilters = observable.array<EntityFilter>();
@observable catalogCategoryFilters = observable.array<CategoryFilter>();
async navigate<P extends object>(pageId?: string, params?: P) {
const { navigate } = await import("../renderer/navigation");
const pageUrl = getExtensionPageUrl({
@@ -53,31 +60,35 @@ export class LensRendererExtension extends LensExtension {
*
* The default implementation is to return `true`
*/
async isEnabledForCluster(cluster: KubernetesCluster): Promise<Boolean> {
return (void cluster) || true;
isEnabledForCluster(cluster: KubernetesCluster): Promise<Boolean> {
return Promise.resolve((void cluster) || true);
}
/**
* @deprecated Just push to `.catalogFilters` instead
* Add a filtering function for the catalog entities. This will be removed if the extension is disabled.
* @param fn The function which should return a truthy value for those entities which should be kept.
* @returns A function to clean up the filter
*/
addCatalogFilter(fn: EntityFilter): Disposer {
const dispose = catalogEntityRegistry.addCatalogFilter(fn);
const dispose = once(() => this.catalogFilters.remove(fn));
this.catalogFilters.push(fn);
this[Disposers].push(dispose);
return dispose;
}
/**
* @deprecated Just push to `.catalogCategoryFilters` instead
* Add a filtering function for the catalog categories. This will be removed if the extension is disabled.
* @param fn The function which should return a truthy value for those categories which should be kept.
* @returns A function to clean up the filter
*/
addCatalogCategoryFilter(fn: CategoryFilter): Disposer {
const dispose = catalogCategoryRegistry.addCatalogCategoryFilter(fn);
const dispose = once(() => this.catalogCategoryFilters.remove(fn));
this.catalogCategoryFilters.push(fn);
this[Disposers].push(dispose);
return dispose;
+91 -7
View File
@@ -3,15 +3,99 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { CatalogEntity } from "../../common/catalog";
import { catalogEntityRegistry as registry } from "../../main/catalog";
import type { CatalogCategory, CatalogEntity, CatalogEntityData, CatalogEntityKindData, CategoryFilter, CatalogCategoryRegistry as InternalCatalogCategoryRegistry } from "../../common/catalog";
import type { CatalogEntityRegistry as InternalCatalogEntityRegistry } from "../../main/catalog";
import catalogCategoryRegistryInjectable from "../../main/catalog/category-registry.injectable";
import catalogEntityRegistryInjectable from "../../main/catalog/entity-registry.injectable";
import type { Disposer } from "../../renderer/utils";
import { asLegacyGlobalObjectForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
export { catalogCategoryRegistry as catalogCategories } from "../../common/catalog/catalog-category-registry";
export class CatalogEntityRegistry {
getItemsForApiKind<T extends CatalogEntity>(apiVersion: string, kind: string): T[] {
return registry.getItemsForApiKind<T>(apiVersion, kind);
interface CatalogEntityRegistryDependencies {
readonly internalRegistry: InternalCatalogEntityRegistry;
}
export type { CatalogEntityRegistry };
class CatalogEntityRegistry {
/**
* @internal
*/
constructor(protected readonly dependencies: CatalogEntityRegistryDependencies) {}
/**
* @deprecated use cast instead of unused generic type argument
*/
getItemsForApiKind<T extends CatalogEntity>(apiVersion: string, kind: string): T[];
getItemsForApiKind(apiVersion: string, kind: string): CatalogEntity[] {
return this.dependencies.internalRegistry.getItemsForApiKind(apiVersion, kind);
}
}
export const catalogEntities = new CatalogEntityRegistry();
interface CatalogCategoryRegistryDependencies {
readonly internalRegistry: InternalCatalogCategoryRegistry;
}
export type { CatalogCategoryRegistry };
class CatalogCategoryRegistry {
constructor(protected readonly dependencies: CatalogCategoryRegistryDependencies) {}
add(category: CatalogCategory): Disposer {
return this.dependencies.internalRegistry.add(category);
}
get items() {
return this.dependencies.internalRegistry.items;
}
get filteredItems() {
return this.dependencies.internalRegistry.filteredItems.get();
}
/**
* @deprecated use cast instead of unused generic type argument
*/
getForGroupKind<T extends CatalogCategory>(group: string, kind: string): T | undefined;
getForGroupKind(group: string, kind: string): CatalogCategory | undefined {
return this.dependencies.internalRegistry.getForGroupKind(group, kind);
}
getEntityForData(data: CatalogEntityData & CatalogEntityKindData): CatalogEntity | null {
return this.dependencies.internalRegistry.getEntityForData(data);
}
/**
* @deprecated use cast instead of unused generic type argument
*/
getCategoryForEntity<T extends CatalogCategory>({ kind, apiVersion }: CatalogEntityData & CatalogEntityKindData): T;
/**
* @throws if category is not found
*/
getCategoryForEntity(entity: CatalogEntityData & CatalogEntityKindData): CatalogCategory {
return this.dependencies.internalRegistry.getCategoryForEntity(entity);
}
getByName(name: string): CatalogCategory | undefined {
return this.dependencies.internalRegistry.getByName(name);
}
/**
* Add a new filter to the set of category filters
* @param fn The function that should return a truthy value if that category should be displayed
* @returns A function to remove that filter
*/
addCatalogCategoryFilter(fn: CategoryFilter): Disposer {
return this.dependencies.internalRegistry.addCatalogCategoryFilter(fn);
}
}
export const catalogEntities = new CatalogEntityRegistry({
internalRegistry: asLegacyGlobalObjectForExtensionApi(catalogEntityRegistryInjectable),
});
export const catalogCategories = new CatalogCategoryRegistry({
internalRegistry: asLegacyGlobalObjectForExtensionApi(catalogCategoryRegistryInjectable),
});
+32 -32
View File
@@ -3,43 +3,43 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
export { isAllowedResource } from "../../common/utils/allowed-resource";
export { ResourceStack } from "../../common/k8s/resource-stack";
export { apiManager } from "../../common/k8s-api/api-manager";
export { KubeApi, forCluster, forRemoteCluster } from "../../common/k8s-api/kube-api";
export { KubeObject, KubeStatus } from "../../common/k8s-api/kube-object";
export { KubeObjectStore } from "../../common/k8s-api/kube-object.store";
export { Pod, podsApi, PodsApi } from "../../common/k8s-api/endpoints/pods.api";
export { Node, nodesApi, NodesApi } from "../../common/k8s-api/endpoints/nodes.api";
export { Deployment, deploymentApi, DeploymentApi } from "../../common/k8s-api/endpoints/deployment.api";
export { DaemonSet, daemonSetApi } from "../../common/k8s-api/endpoints/daemon-set.api";
export { StatefulSet, statefulSetApi } from "../../common/k8s-api/endpoints/stateful-set.api";
export { Job, jobApi } from "../../common/k8s-api/endpoints/job.api";
export { CronJob, cronJobApi } from "../../common/k8s-api/endpoints/cron-job.api";
export { ConfigMap, configMapApi } from "../../common/k8s-api/endpoints/configmap.api";
export { Secret, secretsApi } from "../../common/k8s-api/endpoints/secret.api";
export { ReplicaSet, replicaSetApi } from "../../common/k8s-api/endpoints/replica-set.api";
export { ResourceQuota, resourceQuotaApi } from "../../common/k8s-api/endpoints/resource-quota.api";
export { LimitRange, limitRangeApi } from "../../common/k8s-api/endpoints/limit-range.api";
export { HorizontalPodAutoscaler, hpaApi } from "../../common/k8s-api/endpoints/hpa.api";
export { PodDisruptionBudget, pdbApi } from "../../common/k8s-api/endpoints/poddisruptionbudget.api";
export { Service, serviceApi } from "../../common/k8s-api/endpoints/service.api";
export { Endpoint, endpointApi } from "../../common/k8s-api/endpoints/endpoint.api";
export { Ingress, ingressApi, IngressApi } from "../../common/k8s-api/endpoints/ingress.api";
export { NetworkPolicy, networkPolicyApi } from "../../common/k8s-api/endpoints/network-policy.api";
export { PersistentVolume, persistentVolumeApi } from "../../common/k8s-api/endpoints/persistent-volume.api";
export { PersistentVolumeClaim, pvcApi, PersistentVolumeClaimsApi } from "../../common/k8s-api/endpoints/persistent-volume-claims.api";
export { StorageClass, storageClassApi } from "../../common/k8s-api/endpoints/storage-class.api";
export { Namespace, namespacesApi } from "../../common/k8s-api/endpoints/namespaces.api";
export { KubeEvent, eventApi } from "../../common/k8s-api/endpoints/events.api";
export { ServiceAccount, serviceAccountsApi } from "../../common/k8s-api/endpoints/service-accounts.api";
export { Role, roleApi } from "../../common/k8s-api/endpoints/role.api";
export { RoleBinding, roleBindingApi } from "../../common/k8s-api/endpoints/role-binding.api";
export { ClusterRole, clusterRoleApi } from "../../common/k8s-api/endpoints/cluster-role.api";
export { ClusterRoleBinding, clusterRoleBindingApi } from "../../common/k8s-api/endpoints/cluster-role-binding.api";
export { CustomResourceDefinition, crdApi } from "../../common/k8s-api/endpoints/crd.api";
export {
Pod, PodApi as PodsApi,
Node, NodeApi as NodesApi,
Deployment, DeploymentApi,
DaemonSet, DaemonSetApi,
StatefulSet, StatefulSetApi,
Job, JobApi,
CronJob, CronJobApi,
ConfigMap, ConfigMapApi,
Secret, SecretApi,
ReplicaSet, ReplicaSetApi,
ResourceQuota, ResourceQuotaApi,
LimitRange, LimitRangeApi,
HorizontalPodAutoscaler, HorizontalPodAutoscalerApi,
PodDisruptionBudget, PodDisruptionBudgetApi,
Service, ServiceApi,
Endpoint, EndpointApi,
Ingress, IngressApi,
NetworkPolicy, NetworkPolicyApi,
PersistentVolume, PersistentVolumeApi,
PersistentVolumeClaim, PersistentVolumeClaimApi as PersistentVolumeClaimsApi,
StorageClass, StorageClassApi,
Namespace, NamespaceApi,
Event as KubeEvent, EventApi,
ServiceAccount, ServiceAccountApi,
Role, RoleApi,
RoleBinding, RoleBindingApi,
ClusterRole, ClusterRoleApi,
ClusterRoleBinding, ClusterRoleBindingApi,
CustomResourceDefinition, CustomResourceDefinitionApi,
} from "../../common/k8s-api/endpoints";
// types
export type { ILocalKubeApiConfig, IRemoteKubeApiConfig, IKubeApiCluster } from "../../common/k8s-api/kube-api";
export type { IPodContainer, IPodContainerStatus } from "../../common/k8s-api/endpoints/pods.api";
export type { IPodContainer, IPodContainerStatus } from "../../common/k8s-api/endpoints/pod.api";
export type { ISecretRef } from "../../common/k8s-api/endpoints/secret.api";
+3 -2
View File
@@ -3,8 +3,9 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { WindowManager } from "../../main/window-manager";
import windowManagerInjectable from "../../main/windows/manager.injectable";
import { asLegacyGlobalObjectForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
export function navigate(url: string) {
return WindowManager.getInstance().navigate(url);
asLegacyGlobalObjectForExtensionApi(windowManagerInjectable).navigate(url);
}
@@ -10,8 +10,6 @@ import React from "react";
import fse from "fs-extra";
import { Console } from "console";
import { stderr, stdout } from "process";
import { ThemeStore } from "../../../renderer/theme.store";
import { UserStore } from "../../../common/user-store";
import { getDisForUnitTesting } from "../../../test-utils/get-dis-for-unit-testing";
import mockFs from "mock-fs";
@@ -55,8 +53,6 @@ describe("page registry tests", () => {
isEnabled: true,
isCompatible: true,
});
UserStore.createInstance();
ThemeStore.createInstance();
ClusterPageRegistry.createInstance();
GlobalPageRegistry.createInstance().add({
id: "page-with-params",
@@ -92,8 +88,6 @@ describe("page registry tests", () => {
afterEach(() => {
GlobalPageRegistry.resetInstance();
ClusterPageRegistry.resetInstance();
ThemeStore.resetInstance();
UserStore.resetInstance();
fse.remove("tmp");
mockFs.restore();
});
@@ -1,33 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type React from "react";
import type { CatalogEntity } from "../common-api/catalog";
import { BaseRegistry } from "./base-registry";
export interface CatalogEntityDetailsProps<T extends CatalogEntity> {
entity: T;
}
export interface CatalogEntityDetailComponents<T extends CatalogEntity> {
Details: React.ComponentType<CatalogEntityDetailsProps<T>>;
}
export interface CatalogEntityDetailRegistration<T extends CatalogEntity> {
kind: string;
apiVersions: string[];
components: CatalogEntityDetailComponents<T>;
priority?: number;
}
export class CatalogEntityDetailRegistry extends BaseRegistry<CatalogEntityDetailRegistration<CatalogEntity>> {
getItemsForKind(kind: string, apiVersion: string) {
const items = this.getItems().filter((item) => {
return item.kind === kind && item.apiVersions.includes(apiVersion);
});
return items.sort((a, b) => (b.priority ?? 50) - (a.priority ?? 50));
}
}
-3
View File
@@ -8,10 +8,7 @@
export * from "./page-registry";
export * from "./page-menu-registry";
export * from "./status-bar-registry";
export * from "./kube-object-detail-registry";
export * from "./kube-object-menu-registry";
export * from "./kube-object-status-registry";
export * from "./entity-setting-registry";
export * from "./catalog-entity-detail-registry";
export * from "./workloads-overview-detail-registry";
export * from "./protocol-handler";
@@ -1,30 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
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<T extends KubeObject = KubeObject> {
Details: React.ComponentType<KubeObjectDetailsProps<T>>;
}
export interface KubeObjectDetailRegistration {
kind: string;
apiVersions: string[];
components: KubeObjectDetailComponents<KubeObject>;
priority?: number;
}
export class KubeObjectDetailRegistry extends BaseRegistry<KubeObjectDetailRegistration> {
getItemsForKind(kind: string, apiVersion: string) {
const items = this.getItems().filter((item) => {
return item.kind === kind && item.apiVersions.includes(apiVersion);
});
return items.sort((a, b) => (b.priority ?? 50) - (a.priority ?? 50));
}
}
@@ -1,29 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { KubeObject, KubeObjectStatus } from "../renderer-api/k8s-api";
import { BaseRegistry } from "./base-registry";
export interface KubeObjectStatusRegistration {
kind: string;
apiVersions: string[];
resolve: (object: KubeObject) => KubeObjectStatus;
}
export class KubeObjectStatusRegistry extends BaseRegistry<KubeObjectStatusRegistration> {
getItemsForKind(kind: string, apiVersion: string) {
return this.getItems()
.filter((item) => (
item.kind === kind
&& item.apiVersions.includes(apiVersion)
));
}
getItemsForObject(src: KubeObject) {
return this.getItemsForKind(src.kind, src.apiVersion)
.map(item => item.resolve(src))
.filter(Boolean);
}
}
+97 -14
View File
@@ -3,35 +3,54 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { CatalogCategory, CatalogEntity } from "../../common/catalog";
import { catalogEntityRegistry as registry } from "../../renderer/api/catalog-entity-registry";
import type { CatalogEntityOnBeforeRun } from "../../renderer/api/catalog-entity-registry";
import { asLegacyGlobalObjectForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import type { CatalogCategory, CatalogEntity, CatalogCategoryRegistry as InternalCatalogCategoryRegistry, CatalogEntityData, CatalogEntityKindData, CategoryFilter } from "../../common/catalog";
import type { CatalogEntityRegistry as InternalCatalogEntityRegistry, CatalogEntityOnBeforeRun } from "../../renderer/catalog/entity-registry";
import type { Disposer } from "../../common/utils";
export { catalogCategoryRegistry as catalogCategories } from "../../common/catalog/catalog-category-registry";
import catalogEntityRegistryInjectable from "../../renderer/catalog/entity-registry.injectable";
import catalogCategoryRegistryInjectable from "../../renderer/catalog/category-registry.injectable";
interface CatalogEntityRegistryDependencies {
readonly internalRegistry: InternalCatalogEntityRegistry;
}
export type { CatalogEntityRegistry };
class CatalogEntityRegistry {
/**
* @internal
*/
constructor(protected readonly dependencies: CatalogEntityRegistryDependencies) {}
export class CatalogEntityRegistry {
/**
* Currently active/visible entity
*/
get activeEntity() {
return registry.activeEntity;
return this.dependencies.internalRegistry.activeEntity;
}
get entities(): Map<string, CatalogEntity> {
return registry.entities;
return this.dependencies.internalRegistry.entities;
}
getById(id: string) {
return this.entities.get(id);
}
getItemsForApiKind<T extends CatalogEntity>(apiVersion: string, kind: string): T[] {
return registry.getItemsForApiKind<T>(apiVersion, kind);
/**
* @deprecated use cast and not the unused generic type param
*/
getItemsForApiKind<T extends CatalogEntity>(apiVersion: string, kind: string): T[];
getItemsForApiKind(apiVersion: string, kind: string): CatalogEntity[] {
return this.dependencies.internalRegistry.getItemsForApiKind(apiVersion, kind);
}
getItemsForCategory<T extends CatalogEntity>(category: CatalogCategory): T[] {
return registry.getItemsForCategory(category);
/**
* @deprecated use cast and not the unused generic type param
*/
getItemsForCategory<T extends CatalogEntity>(category: CatalogCategory): T[];
getItemsForCategory(category: CatalogCategory): CatalogEntity[] {
return this.dependencies.internalRegistry.getItemsForCategory(category);
}
/**
@@ -43,8 +62,72 @@ export class CatalogEntityRegistry {
* @returns A function to remove that hook
*/
addOnBeforeRun(onBeforeRun: CatalogEntityOnBeforeRun): Disposer {
return registry.addOnBeforeRun(onBeforeRun);
return this.dependencies.internalRegistry.addOnBeforeRun(onBeforeRun);
}
}
export const catalogEntities = new CatalogEntityRegistry();
interface CatalogCategoryRegistryDependencies {
readonly internalRegistry: InternalCatalogCategoryRegistry;
}
export type { CatalogCategoryRegistry };
class CatalogCategoryRegistry {
constructor(protected readonly dependencies: CatalogCategoryRegistryDependencies) {}
add(category: CatalogCategory): Disposer {
return this.dependencies.internalRegistry.add(category);
}
get items() {
return this.dependencies.internalRegistry.items;
}
get filteredItems() {
return this.dependencies.internalRegistry.filteredItems.get();
}
/**
* @deprecated use cast instead of unused generic type argument
*/
getForGroupKind<T extends CatalogCategory>(group: string, kind: string): T | undefined;
getForGroupKind(group: string, kind: string): CatalogCategory | undefined {
return this.dependencies.internalRegistry.getForGroupKind(group, kind);
}
getEntityForData(data: CatalogEntityData & CatalogEntityKindData): CatalogEntity | null {
return this.dependencies.internalRegistry.getEntityForData(data);
}
/**
* @deprecated use cast instead of unused generic type argument
*/
getCategoryForEntity<T extends CatalogCategory>({ kind, apiVersion }: CatalogEntityData & CatalogEntityKindData): T;
/**
* @throws if category is not found
*/
getCategoryForEntity(entity: CatalogEntityData & CatalogEntityKindData): CatalogCategory {
return this.dependencies.internalRegistry.getCategoryForEntity(entity);
}
getByName(name: string): CatalogCategory | undefined {
return this.dependencies.internalRegistry.getByName(name);
}
/**
* Add a new filter to the set of category filters
* @param fn The function that should return a truthy value if that category should be displayed
* @returns A function to remove that filter
*/
addCatalogCategoryFilter(fn: CategoryFilter): Disposer {
return this.dependencies.internalRegistry.addCatalogCategoryFilter(fn);
}
}
export const catalogEntities = new CatalogEntityRegistry({
internalRegistry: asLegacyGlobalObjectForExtensionApi(catalogEntityRegistryInjectable),
});
export const catalogCategories = new CatalogCategoryRegistry({
internalRegistry: asLegacyGlobalObjectForExtensionApi(catalogCategoryRegistryInjectable),
});
+17 -9
View File
@@ -2,15 +2,18 @@
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { asLegacyGlobalFunctionForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-function-for-extension-api";
import createTerminalTabInjectable from "../../renderer/components/dock/create-terminal-tab/create-terminal-tab.injectable";
import terminalStoreInjectable from "../../renderer/components/dock/terminal-store/terminal-store.injectable";
import terminalStoreInjectable from "../../renderer/components/dock/terminal/store.injectable";
import { asLegacyGlobalObjectForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import logTabStoreInjectable from "../../renderer/components/dock/log-tab-store/log-tab-store.injectable";
import { asLegacyGlobalSingletonForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-singleton-for-extension-api";
import { TerminalStore as TerminalStoreClass } from "../../renderer/components/dock/terminal-store/terminal.store";
import { TerminalStore as TerminalStoreClass } from "../../renderer/components/dock/terminal/store";
import commandOverlayInjectable from "../../renderer/components/command-palette/command-overlay.injectable";
import newTerminalTabInjectable from "../../renderer/components/dock/terminal/create-tab.injectable";
import { ConfirmDialog as _ConfirmDialog } from "../../renderer/components/confirm-dialog";
import openConfirmDialogInjectable from "../../renderer/components/confirm-dialog/dialog-open.injectable";
import confirmWithDialogInjectable from "../../renderer/components/confirm-dialog/dialog-confirm.injectable";
import { asLegacyGlobalFunctionForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-function-for-extension-api";
import logTabStoreInjectable from "../../renderer/components/dock/logs/tab-store.injectable";
// layouts
export * from "../../renderer/components/layout/main-layout";
@@ -36,6 +39,12 @@ export type {
AdditionalCategoryColumnRegistration,
} from "../../renderer/components/+catalog/custom-category-columns";
export type { ConfirmDialogBooleanParams, ConfirmDialogParams, ConfirmDialogProps } from "../../renderer/components/confirm-dialog";
export const ConfirmDialog = Object.assign(_ConfirmDialog, {
open: asLegacyGlobalFunctionForExtensionApi(openConfirmDialogInjectable),
confirm: asLegacyGlobalFunctionForExtensionApi(confirmWithDialogInjectable),
});
// other components
export * from "../../renderer/components/icon";
export * from "../../renderer/components/tooltip";
@@ -44,14 +53,13 @@ export * from "../../renderer/components/table";
export * from "../../renderer/components/badge";
export * from "../../renderer/components/drawer";
export * from "../../renderer/components/dialog";
export * from "../../renderer/components/confirm-dialog";
export * from "../../renderer/components/line-progress";
export * from "../../renderer/components/menu";
export * from "../../renderer/components/notifications";
export * from "../../renderer/components/spinner";
export * from "../../renderer/components/stepper";
export * from "../../renderer/components/wizard";
export * from "../../renderer/components/+workloads-pods/pod-details-list";
export * from "../../renderer/components/+pods/details-list";
export * from "../../renderer/components/+namespaces/namespace-select";
export * from "../../renderer/components/+namespaces/namespace-select-filter";
export * from "../../renderer/components/layout/sub-title";
@@ -70,7 +78,7 @@ export * from "../../renderer/components/+events/kube-event-details";
// specific exports
export * from "../../renderer/components/status-brick";
export const createTerminalTab = asLegacyGlobalFunctionForExtensionApi(createTerminalTabInjectable);
export const createTerminalTab = asLegacyGlobalFunctionForExtensionApi(newTerminalTabInjectable);
export const TerminalStore = asLegacyGlobalSingletonForExtensionApi(TerminalStoreClass, terminalStoreInjectable);
export const terminalStore = asLegacyGlobalObjectForExtensionApi(terminalStoreInjectable);
export const logTabStore = asLegacyGlobalObjectForExtensionApi(logTabStoreInjectable);
+212 -59
View File
@@ -3,43 +3,108 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
export { isAllowedResource } from "../../common/utils/allowed-resource";
import apiManagerInjectable from "../../common/k8s-api/api-manager.injectable";
import configMapApiInjectable from "../../common/k8s-api/endpoints/configmap.api.injectable";
import cronJobApiInjectable from "../../common/k8s-api/endpoints/cron-job.api.injectable";
import daemonSetApiInjectable from "../../common/k8s-api/endpoints/daemon-set.api.injectable";
import deploymentApiInjectable from "../../common/k8s-api/endpoints/deployment.api.injectable";
import horizontalPodAutoscalerApiInjectable from "../../common/k8s-api/endpoints/horizontal-pod-autoscaler.api.injectable";
import jobApiInjectable from "../../common/k8s-api/endpoints/job.api.injectable";
import limitRangeApiInjectable from "../../common/k8s-api/endpoints/limit-range.api.injectable";
import nodeApiInjectable from "../../common/k8s-api/endpoints/node.api.injectable";
import persistentVolumeClaimApiInjectable from "../../common/k8s-api/endpoints/persistent-volume-claim.api.injectable";
import persistentVolumeApiInjectable from "../../common/k8s-api/endpoints/persistent-volume.api.injectable";
import podApiInjectable from "../../common/k8s-api/endpoints/pod.api.injectable";
import replicaSetApiInjectable from "../../common/k8s-api/endpoints/replica-set.api.injectable";
import resourceQuotaApiInjectable from "../../common/k8s-api/endpoints/resource-quota.api.injectable";
import secretApiInjectable from "../../common/k8s-api/endpoints/secret.api.injectable";
import serviceApiInjectable from "../../common/k8s-api/endpoints/service.api.injectable";
import statefulSetApiInjectable from "../../common/k8s-api/endpoints/stateful-set.api.injectable";
import horizontalPodAutoscalerStoreInjectable from "../../renderer/components/+autoscalers/store.injectable";
import limitRangeStoreInjectable from "../../renderer/components/+limit-ranges/store.injectable";
import resourceQuotaStoreInjectable from "../../renderer/components/+resource-quotas/store.injectable";
import secretStoreInjectable from "../../renderer/components/+secrets/store.injectable";
import eventStoreInjectable from "../../renderer/components/+events/store.injectable";
import namespaceStoreInjectable from "../../renderer/components/+namespaces/store.injectable";
import serviceAccountStoreInjectable from "../../renderer/components/+service-accounts/store.injectable";
import cronJobStoreInjectable from "../../renderer/components/+cronjobs/store.injectable";
import jobStoreInjectable from "../../renderer/components/+jobs/store.injectable";
import replicaSetStoreInjectable from "../../renderer/components/+replica-sets/store.injectable";
import { asLegacyGlobalObjectForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import nodeStoreInjectable from "../../renderer/components/+nodes/store.injectable";
import podStoreInjectable from "../../renderer/components/+pods/store.injectable";
import deploymentStoreInjectable from "../../renderer/components/+deployments/store.injectable";
import daemonSetStoreInjectable from "../../renderer/components/+daemonsets/store.injectable";
import statefulSetStoreInjectable from "../../renderer/components/+stateful-sets/store.injectable";
import configMapStoreInjectable from "../../renderer/components/+config-maps/store.injectable";
import persistentVolumeClaimStoreInjectable from "../../renderer/components/+persistent-volume-claims/store.injectable";
import persistentVolumeStoreInjectable from "../../renderer/components/+persistent-volumes/store.injectable";
import podDisruptionBudgetApiInjectable from "../../common/k8s-api/endpoints/pod-disruption-budget.api.injectable";
import podDisruptionBudgetStoreInjectable from "../../renderer/components/+pod-disruption-budgets/store.injectable";
import endpointApiInjectable from "../../common/k8s-api/endpoints/endpoint.api.injectable";
import ingressApiInjectable from "../../common/k8s-api/endpoints/ingress.api.injectable";
import networkPolicyApiInjectable from "../../common/k8s-api/endpoints/network-policy.api.injectable";
import storageClassApiInjectable from "../../common/k8s-api/endpoints/storage-class.api.injectable";
import namespaceApiInjectable from "../../common/k8s-api/endpoints/namespace.api.injectable";
import eventApiInjectable from "../../common/k8s-api/endpoints/event.api.injectable";
import serviceAccountApiInjectable from "../../common/k8s-api/endpoints/service-account.api.injectable";
import endpointStoreInjectable from "../../renderer/components/+endpoints/store.injectable";
import ingressStoreInjectable from "../../renderer/components/+ingresses/store.injectables";
import networkPolicyStoreInjectable from "../../renderer/components/+network-policies/store.injectable";
import storageClassStoreInjectable from "../../renderer/components/+storage-classes/store.injectable";
import roleApiInjectable from "../../common/k8s-api/endpoints/role.api.injectable";
import roleStoreInjectable from "../../renderer/components/+roles/store.injectable";
import roleBindingApiInjectable from "../../common/k8s-api/endpoints/role-binding.api.injectable";
import clusterRoleApiInjectable from "../../common/k8s-api/endpoints/cluster-role.api.injectable";
import clusterRoleBindingApiInjectable from "../../common/k8s-api/endpoints/cluster-role-binding.api.injectable";
import customResourceDefinitionApiInjectable from "../../common/k8s-api/endpoints/custom-resource-definition.api.injectable";
import roleBindingStoreInjectable from "../../renderer/components/+role-bindings/store.injectable";
import clusterRoleStoreInjectable from "../../renderer/components/+cluster-roles/store.injectable";
import clusterRoleBindingStoreInjectable from "../../renderer/components/+cluster-role-bindings/store.injectable";
import customResourceDefinitionStoreInjectable from "../../renderer/components/+custom-resource/store.injectable";
import { asLegacyGlobalFunctionForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-function-for-extension-api";
import isAllowedResourceInjectable from "../../renderer/utils/allowed-resource.injectable";
export const isAllowedResource = asLegacyGlobalFunctionForExtensionApi(isAllowedResourceInjectable);
export { ResourceStack } from "../../common/k8s/resource-stack";
export { apiManager } from "../../common/k8s-api/api-manager";
export { KubeObjectStore } from "../../common/k8s-api/kube-object.store";
export { KubeApi, forCluster, forRemoteCluster } from "../../common/k8s-api/kube-api";
export { KubeObject, KubeStatus } from "../../common/k8s-api/kube-object";
export { Pod, podsApi, PodsApi } from "../../common/k8s-api/endpoints";
export { Node, nodesApi, NodesApi } from "../../common/k8s-api/endpoints";
export { Deployment, deploymentApi, DeploymentApi } from "../../common/k8s-api/endpoints";
export { DaemonSet, daemonSetApi } from "../../common/k8s-api/endpoints";
export { StatefulSet, statefulSetApi } from "../../common/k8s-api/endpoints";
export { Job, jobApi } from "../../common/k8s-api/endpoints";
export { CronJob, cronJobApi } from "../../common/k8s-api/endpoints";
export { ConfigMap, configMapApi } from "../../common/k8s-api/endpoints";
export { Secret, secretsApi } from "../../common/k8s-api/endpoints";
export { ReplicaSet, replicaSetApi } from "../../common/k8s-api/endpoints";
export { ResourceQuota, resourceQuotaApi } from "../../common/k8s-api/endpoints";
export { LimitRange, limitRangeApi } from "../../common/k8s-api/endpoints";
export { HorizontalPodAutoscaler, hpaApi } from "../../common/k8s-api/endpoints";
export { PodDisruptionBudget, pdbApi } from "../../common/k8s-api/endpoints";
export { Service, serviceApi } from "../../common/k8s-api/endpoints";
export { Endpoint, endpointApi } from "../../common/k8s-api/endpoints";
export { Ingress, ingressApi, IngressApi } from "../../common/k8s-api/endpoints";
export { NetworkPolicy, networkPolicyApi } from "../../common/k8s-api/endpoints";
export { PersistentVolume, persistentVolumeApi } from "../../common/k8s-api/endpoints";
export { PersistentVolumeClaim, pvcApi, PersistentVolumeClaimsApi } from "../../common/k8s-api/endpoints";
export { StorageClass, storageClassApi } from "../../common/k8s-api/endpoints";
export { Namespace, namespacesApi } from "../../common/k8s-api/endpoints";
export { KubeEvent, eventApi } from "../../common/k8s-api/endpoints";
export { ServiceAccount, serviceAccountsApi } from "../../common/k8s-api/endpoints";
export { Role, roleApi } from "../../common/k8s-api/endpoints";
export { RoleBinding, roleBindingApi } from "../../common/k8s-api/endpoints";
export { ClusterRole, clusterRoleApi } from "../../common/k8s-api/endpoints";
export { ClusterRoleBinding, clusterRoleBindingApi } from "../../common/k8s-api/endpoints";
export { CustomResourceDefinition, crdApi } from "../../common/k8s-api/endpoints";
export { KubeObjectStatusLevel } from "./kube-object-status";
export { KubeJsonApi } from "../../common/k8s-api/kube-json-api";
export {
Pod, PodApi as PodsApi,
Node, NodeApi as NodesApi,
Deployment, DeploymentApi,
DaemonSet, DaemonSetApi,
StatefulSet, StatefulSetApi,
Job, JobApi,
CronJob, CronJobApi,
ConfigMap, ConfigMapApi,
Secret, SecretApi,
ReplicaSet, ReplicaSetApi,
ResourceQuota, ResourceQuotaApi,
LimitRange, LimitRangeApi,
HorizontalPodAutoscaler, HorizontalPodAutoscalerApi,
PodDisruptionBudget, PodDisruptionBudgetApi,
Service, ServiceApi,
Endpoint, EndpointApi,
Ingress, IngressApi,
NetworkPolicy, NetworkPolicyApi,
PersistentVolume, PersistentVolumeApi,
PersistentVolumeClaim, PersistentVolumeClaimApi as PersistentVolumeClaimsApi,
StorageClass, StorageClassApi,
Namespace, NamespaceApi,
Event as KubeEvent, EventApi,
ServiceAccount, ServiceAccountApi,
Role, RoleApi,
RoleBinding, RoleBindingApi,
ClusterRole, ClusterRoleApi,
ClusterRoleBinding, ClusterRoleBindingApi,
CustomResourceDefinition, CustomResourceDefinitionApi,
} from "../../common/k8s-api/endpoints";
export type { ApiManager } from "../../common/k8s-api/api-manager";
// types
export type { ILocalKubeApiConfig, IRemoteKubeApiConfig, IKubeApiCluster } from "../../common/k8s-api/kube-api";
@@ -48,31 +113,119 @@ export type { ISecretRef } from "../../common/k8s-api/endpoints";
export type { KubeObjectStatus } from "./kube-object-status";
// stores
export type { EventStore } from "../../renderer/components/+events/event.store";
export type { PodsStore } from "../../renderer/components/+workloads-pods/pods.store";
export type { NodesStore } from "../../renderer/components/+nodes/nodes.store";
export type { DeploymentStore } from "../../renderer/components/+workloads-deployments/deployments.store";
export type { DaemonSetStore } from "../../renderer/components/+workloads-daemonsets/daemonsets.store";
export type { StatefulSetStore } from "../../renderer/components/+workloads-statefulsets/statefulset.store";
export type { JobStore } from "../../renderer/components/+workloads-jobs/job.store";
export type { CronJobStore } from "../../renderer/components/+workloads-cronjobs/cronjob.store";
export type { ConfigMapsStore } from "../../renderer/components/+config-maps/config-maps.store";
export type { SecretsStore } from "../../renderer/components/+config-secrets/secrets.store";
export type { ReplicaSetStore } from "../../renderer/components/+workloads-replicasets/replicasets.store";
export type { ResourceQuotasStore } from "../../renderer/components/+config-resource-quotas/resource-quotas.store";
export type { LimitRangesStore } from "../../renderer/components/+config-limit-ranges/limit-ranges.store";
export type { HPAStore } from "../../renderer/components/+config-autoscalers/hpa.store";
export type { PodDisruptionBudgetsStore } from "../../renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store";
export type { ServiceStore } from "../../renderer/components/+network-services/services.store";
export type { EndpointStore } from "../../renderer/components/+network-endpoints/endpoints.store";
export type { IngressStore } from "../../renderer/components/+network-ingresses/ingress.store";
export type { NetworkPolicyStore } from "../../renderer/components/+network-policies/network-policy.store";
export type { PersistentVolumesStore } from "../../renderer/components/+storage-volumes/volumes.store";
export type { VolumeClaimStore } from "../../renderer/components/+storage-volume-claims/volume-claim.store";
export type { StorageClassStore } from "../../renderer/components/+storage-classes/storage-class.store";
export type { NamespaceStore } from "../../renderer/components/+namespaces/namespace-store/namespace.store";
export type { ServiceAccountsStore } from "../../renderer/components/+user-management/+service-accounts/store";
export type { RolesStore } from "../../renderer/components/+user-management/+roles/store";
export type { RoleBindingsStore } from "../../renderer/components/+user-management/+role-bindings/store";
export type { CRDStore } from "../../renderer/components/+custom-resources/crd.store";
export type { CRDResourceStore } from "../../renderer/components/+custom-resources/crd-resource.store";
export type { EventStore } from "../../renderer/components/+events/store";
export type { PodStore as PodsStore } from "../../renderer/components/+pods/store";
export type { NodeStore as NodesStore } from "../../renderer/components/+nodes/store";
export type { DeploymentStore } from "../../renderer/components/+deployments/store";
export type { DaemonSetStore } from "../../renderer/components/+daemonsets/store";
export type { StatefulSetStore } from "../../renderer/components/+stateful-sets/store";
export type { JobStore } from "../../renderer/components/+jobs/store";
export type { CronJobStore } from "../../renderer/components/+cronjobs/store";
export type { ConfigMapStore as ConfigMapsStore } from "../../renderer/components/+config-maps/store";
export type { SecretStore as SecretsStore } from "../../renderer/components/+secrets/store";
export type { ReplicaSetStore } from "../../renderer/components/+replica-sets/store";
export type { ResourceQuotaStore as ResourceQuotasStore } from "../../renderer/components/+resource-quotas/store";
export type { LimitRangeStore as LimitRangesStore } from "../../renderer/components/+limit-ranges/store";
export type { HorizontalPodAutoscalerStore as HPAStore } from "../../renderer/components/+autoscalers/store";
export type { PodDisruptionBudgetStore as PodDisruptionBudgetsStore } from "../../renderer/components/+pod-disruption-budgets/store";
export type { ServiceStore } from "../../renderer/components/+services/store";
export type { EndpointStore } from "../../renderer/components/+endpoints/store";
export type { IngressStore } from "../../renderer/components/+ingresses/store";
export type { NetworkPolicyStore } from "../../renderer/components/+network-policies/store";
export type { PersistentVolumeStore as PersistentVolumesStore } from "../../renderer/components/+persistent-volumes/store";
export type { PersistentVolumeClaimStore as VolumeClaimStore } from "../../renderer/components/+persistent-volume-claims/store";
export type { StorageClassStore } from "../../renderer/components/+storage-classes/store";
export type { NamespaceStore } from "../../renderer/components/+namespaces/store";
export type { ServiceAccountStore as ServiceAccountsStore } from "../../renderer/components/+service-accounts/store";
export type { RoleStore as RolesStore } from "../../renderer/components/+roles/store";
export type { RoleBindingStore as RoleBindingsStore } from "../../renderer/components/+role-bindings/store";
export type { CustomResourceDefinitionStore as CRDStore } from "../../renderer/components/+custom-resource/store";
export type { CRDResourceStore } from "../../renderer/components/+custom-resource/resource.store";
export const apiManager = asLegacyGlobalObjectForExtensionApi(apiManagerInjectable);
export const nodesApi = asLegacyGlobalObjectForExtensionApi(nodeApiInjectable);
export const nodeStore = asLegacyGlobalObjectForExtensionApi(nodeStoreInjectable);
export const podsApi = asLegacyGlobalObjectForExtensionApi(podApiInjectable);
export const podStore = asLegacyGlobalObjectForExtensionApi(podStoreInjectable);
export const serviceApi = asLegacyGlobalObjectForExtensionApi(serviceApiInjectable);
export const deploymentApi = asLegacyGlobalObjectForExtensionApi(deploymentApiInjectable);
export const deploymentStore = asLegacyGlobalObjectForExtensionApi(deploymentStoreInjectable);
export const daemonSetApi = asLegacyGlobalObjectForExtensionApi(daemonSetApiInjectable);
export const daemonSetStore = asLegacyGlobalObjectForExtensionApi(daemonSetStoreInjectable);
export const statefulSetApi = asLegacyGlobalObjectForExtensionApi(statefulSetApiInjectable);
export const statefulSetStore = asLegacyGlobalObjectForExtensionApi(statefulSetStoreInjectable);
export const jobApi = asLegacyGlobalObjectForExtensionApi(jobApiInjectable);
export const jobStore = asLegacyGlobalObjectForExtensionApi(jobStoreInjectable);
export const cronJobApi = asLegacyGlobalObjectForExtensionApi(cronJobApiInjectable);
export const cronJobStore = asLegacyGlobalObjectForExtensionApi(cronJobStoreInjectable);
export const configMapApi = asLegacyGlobalObjectForExtensionApi(configMapApiInjectable);
export const configMapStore = asLegacyGlobalObjectForExtensionApi(configMapStoreInjectable);
export const pvcApi = asLegacyGlobalObjectForExtensionApi(persistentVolumeClaimApiInjectable);
export const persistentVolumeClaimStore = asLegacyGlobalObjectForExtensionApi(persistentVolumeClaimStoreInjectable);
export const persistentVolumeApi = asLegacyGlobalObjectForExtensionApi(persistentVolumeApiInjectable);
export const persistentVolumeStore = asLegacyGlobalObjectForExtensionApi(persistentVolumeStoreInjectable);
export const secretApi = asLegacyGlobalObjectForExtensionApi(secretApiInjectable);
export const secretStore = asLegacyGlobalObjectForExtensionApi(secretStoreInjectable);
export const replicaSetApi = asLegacyGlobalObjectForExtensionApi(replicaSetApiInjectable);
export const replicaSetStore = asLegacyGlobalObjectForExtensionApi(replicaSetStoreInjectable);
export const resourceQuotaApi = asLegacyGlobalObjectForExtensionApi(resourceQuotaApiInjectable);
export const resourceQuotaStore = asLegacyGlobalObjectForExtensionApi(resourceQuotaStoreInjectable);
export const limitRangeApi = asLegacyGlobalObjectForExtensionApi(limitRangeApiInjectable);
export const limitRangeStore = asLegacyGlobalObjectForExtensionApi(limitRangeStoreInjectable);
export const hpaApi = asLegacyGlobalObjectForExtensionApi(horizontalPodAutoscalerApiInjectable);
export const horizontalPodAutoscalerStore = asLegacyGlobalObjectForExtensionApi(horizontalPodAutoscalerStoreInjectable);
export const pdbApi = asLegacyGlobalObjectForExtensionApi(podDisruptionBudgetApiInjectable);
export const podDisruptionBudgetStore = asLegacyGlobalObjectForExtensionApi(podDisruptionBudgetStoreInjectable);
export const endpointApi = asLegacyGlobalObjectForExtensionApi(endpointApiInjectable);
export const endpointStore = asLegacyGlobalObjectForExtensionApi(endpointStoreInjectable);
export const ingressApi = asLegacyGlobalObjectForExtensionApi(ingressApiInjectable);
export const ingressStore = asLegacyGlobalObjectForExtensionApi(ingressStoreInjectable);
export const networkPolicyApi = asLegacyGlobalObjectForExtensionApi(networkPolicyApiInjectable);
export const networkPolicyStore = asLegacyGlobalObjectForExtensionApi(networkPolicyStoreInjectable);
export const storageClassApi = asLegacyGlobalObjectForExtensionApi(storageClassApiInjectable);
export const storageClassStore = asLegacyGlobalObjectForExtensionApi(storageClassStoreInjectable);
export const namespacesApi = asLegacyGlobalObjectForExtensionApi(namespaceApiInjectable);
export const namespaceStore = asLegacyGlobalObjectForExtensionApi(namespaceStoreInjectable);
export const eventApi = asLegacyGlobalObjectForExtensionApi(eventApiInjectable);
export const eventStore = asLegacyGlobalObjectForExtensionApi(eventStoreInjectable);
export const serviceAccountsApi = asLegacyGlobalObjectForExtensionApi(serviceAccountApiInjectable);
export const serviceAccountStore = asLegacyGlobalObjectForExtensionApi(serviceAccountStoreInjectable);
export const roleApi = asLegacyGlobalObjectForExtensionApi(roleApiInjectable);
export const roleStore = asLegacyGlobalObjectForExtensionApi(roleStoreInjectable);
export const roleBindingApi = asLegacyGlobalObjectForExtensionApi(roleBindingApiInjectable);
export const roleBindingStore = asLegacyGlobalObjectForExtensionApi(roleBindingStoreInjectable);
export const clusterRoleApi = asLegacyGlobalObjectForExtensionApi(clusterRoleApiInjectable);
export const clusterRoleStore = asLegacyGlobalObjectForExtensionApi(clusterRoleStoreInjectable);
export const clusterRoleBindingApi = asLegacyGlobalObjectForExtensionApi(clusterRoleBindingApiInjectable);
export const clusterRoleBindingStore = asLegacyGlobalObjectForExtensionApi(clusterRoleBindingStoreInjectable);
export const crdApi = asLegacyGlobalObjectForExtensionApi(customResourceDefinitionApiInjectable);
export const customResourceDefinitionStore = asLegacyGlobalObjectForExtensionApi(customResourceDefinitionStoreInjectable);
+5 -2
View File
@@ -3,8 +3,11 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { ThemeStore } from "../../renderer/theme.store";
import activeThemeInjectable from "../../renderer/themes/active-theme.injectable";
import { asLegacyGlobalObjectForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
const activeTheme = asLegacyGlobalObjectForExtensionApi(activeThemeInjectable);
export function getActiveTheme() {
return ThemeStore.getInstance().activeTheme;
return activeTheme.get();
}