diff --git a/extensions/kube-object-event-status/package/package.json b/extensions/kube-object-event-status/package/package.json
new file mode 100644
index 0000000000..e6ab1bb688
--- /dev/null
+++ b/extensions/kube-object-event-status/package/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "kube-object-event-status",
+ "version": "0.1.0",
+ "description": "Adds kube object status from events",
+ "renderer": "dist/renderer.js",
+ "lens": {
+ "metadata": {},
+ "styles": []
+ },
+ "scripts": {
+ "build": "webpack && npm pack",
+ "dev": "webpack --watch",
+ "test": "echo NO TESTS"
+ },
+ "files": [
+ "dist/**/*"
+ ],
+ "dependencies": {},
+ "devDependencies": {
+ "@k8slens/extensions": "file:../../src/extensions/npm/extensions",
+ "ts-loader": "^8.0.4",
+ "typescript": "^4.0.3",
+ "webpack": "^4.44.2"
+ }
+}
diff --git a/extensions/kube-object-event-status/renderer.tsx b/extensions/kube-object-event-status/renderer.tsx
index afdba07fe9..79e4aab424 100644
--- a/extensions/kube-object-event-status/renderer.tsx
+++ b/extensions/kube-object-event-status/renderer.tsx
@@ -19,45 +19,45 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-import { LensRendererExtension, K8sApi } from "@k8slens/extensions";
+import { Renderer } from "@k8slens/extensions";
import { resolveStatus, resolveStatusForCronJobs, resolveStatusForPods } from "./src/resolver";
-export default class EventResourceStatusRendererExtension extends LensRendererExtension {
+export default class EventResourceStatusRendererExtension extends Renderer.LensExtension {
kubeObjectStatusTexts = [
{
kind: "Pod",
apiVersions: ["v1"],
- resolve: (pod: K8sApi.Pod) => resolveStatusForPods(pod)
+ resolve: (pod: Renderer.K8sApi.Pod) => resolveStatusForPods(pod)
},
{
kind: "ReplicaSet",
apiVersions: ["v1"],
- resolve: (replicaSet: K8sApi.ReplicaSet) => resolveStatus(replicaSet)
+ resolve: (replicaSet: Renderer.K8sApi.ReplicaSet) => resolveStatus(replicaSet)
},
{
kind: "Deployment",
apiVersions: ["apps/v1"],
- resolve: (deployment: K8sApi.Deployment) => resolveStatus(deployment)
+ resolve: (deployment: Renderer.K8sApi.Deployment) => resolveStatus(deployment)
},
{
kind: "StatefulSet",
apiVersions: ["apps/v1"],
- resolve: (statefulSet: K8sApi.StatefulSet) => resolveStatus(statefulSet)
+ resolve: (statefulSet: Renderer.K8sApi.StatefulSet) => resolveStatus(statefulSet)
},
{
kind: "DaemonSet",
apiVersions: ["apps/v1"],
- resolve: (daemonSet: K8sApi.DaemonSet) => resolveStatus(daemonSet)
+ resolve: (daemonSet: Renderer.K8sApi.DaemonSet) => resolveStatus(daemonSet)
},
{
kind: "Job",
apiVersions: ["batch/v1"],
- resolve: (job: K8sApi.Job) => resolveStatus(job)
+ resolve: (job: Renderer.K8sApi.Job) => resolveStatus(job)
},
{
kind: "CronJob",
apiVersions: ["batch/v1"],
- resolve: (cronJob: K8sApi.CronJob) => resolveStatusForCronJobs(cronJob)
+ resolve: (cronJob: Renderer.K8sApi.CronJob) => resolveStatusForCronJobs(cronJob)
},
];
}
diff --git a/extensions/kube-object-event-status/src/resolver.tsx b/extensions/kube-object-event-status/src/resolver.tsx
index 03e1f0cdd9..4a4ebfe25d 100644
--- a/extensions/kube-object-event-status/src/resolver.tsx
+++ b/extensions/kube-object-event-status/src/resolver.tsx
@@ -19,11 +19,19 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-import { K8sApi } from "@k8slens/extensions";
+import { Renderer } from "@k8slens/extensions";
-export function resolveStatus(object: K8sApi.KubeObject): K8sApi.KubeObjectStatus {
- const eventStore = K8sApi.apiManager.getStore(K8sApi.eventApi);
- const events = (eventStore as K8sApi.EventStore).getEventsByObject(object);
+const { apiManager, eventApi, KubeObjectStatusLevel } = Renderer.K8sApi;
+
+type KubeObject = Renderer.K8sApi.KubeObject;
+type Pod = Renderer.K8sApi.Pod;
+type CronJob = Renderer.K8sApi.CronJob;
+type KubeObjectStatus = Renderer.K8sApi.KubeObjectStatus;
+type EventStore = Renderer.K8sApi.EventStore;
+
+export function resolveStatus(object: KubeObject): KubeObjectStatus {
+ const eventStore = apiManager.getStore(eventApi);
+ const events = (eventStore as EventStore).getEventsByObject(object);
const warnings = events.filter(evt => evt.isWarning());
if (!events.length || !warnings.length) {
@@ -32,18 +40,18 @@ export function resolveStatus(object: K8sApi.KubeObject): K8sApi.KubeObjectStatu
const event = [...warnings, ...events][0]; // get latest event
return {
- level: K8sApi.KubeObjectStatusLevel.WARNING,
+ level: KubeObjectStatusLevel.WARNING,
text: `${event.message}`,
timestamp: event.metadata.creationTimestamp
};
}
-export function resolveStatusForPods(pod: K8sApi.Pod): K8sApi.KubeObjectStatus {
+export function resolveStatusForPods(pod: Pod): KubeObjectStatus {
if (!pod.hasIssues()) {
return null;
}
- const eventStore = K8sApi.apiManager.getStore(K8sApi.eventApi);
- const events = (eventStore as K8sApi.EventStore).getEventsByObject(pod);
+ const eventStore = apiManager.getStore(eventApi);
+ const events = (eventStore as EventStore).getEventsByObject(pod);
const warnings = events.filter(evt => evt.isWarning());
if (!events.length || !warnings.length) {
@@ -52,15 +60,15 @@ export function resolveStatusForPods(pod: K8sApi.Pod): K8sApi.KubeObjectStatus {
const event = [...warnings, ...events][0]; // get latest event
return {
- level: K8sApi.KubeObjectStatusLevel.WARNING,
+ level: KubeObjectStatusLevel.WARNING,
text: `${event.message}`,
timestamp: event.metadata.creationTimestamp
};
}
-export function resolveStatusForCronJobs(cronJob: K8sApi.CronJob): K8sApi.KubeObjectStatus {
- const eventStore = K8sApi.apiManager.getStore(K8sApi.eventApi);
- let events = (eventStore as K8sApi.EventStore).getEventsByObject(cronJob);
+export function resolveStatusForCronJobs(cronJob: CronJob): KubeObjectStatus {
+ const eventStore = apiManager.getStore(eventApi);
+ let events = (eventStore as EventStore).getEventsByObject(cronJob);
const warnings = events.filter(evt => evt.isWarning());
if (cronJob.isNeverRun()) {
@@ -73,7 +81,7 @@ export function resolveStatusForCronJobs(cronJob: K8sApi.CronJob): K8sApi.KubeOb
const event = [...warnings, ...events][0]; // get latest event
return {
- level: K8sApi.KubeObjectStatusLevel.WARNING,
+ level: KubeObjectStatusLevel.WARNING,
text: `${event.message}`,
timestamp: event.metadata.creationTimestamp
};
diff --git a/extensions/metrics-cluster-feature/renderer.tsx b/extensions/metrics-cluster-feature/renderer.tsx
index f0d227f0a7..884f6cd7a2 100644
--- a/extensions/metrics-cluster-feature/renderer.tsx
+++ b/extensions/metrics-cluster-feature/renderer.tsx
@@ -20,10 +20,10 @@
*/
import React from "react";
-import { LensRendererExtension, Catalog } from "@k8slens/extensions";
+import { Common, Renderer } from "@k8slens/extensions";
import { MetricsSettings } from "./src/metrics-settings";
-export default class ClusterMetricsFeatureExtension extends LensRendererExtension {
+export default class ClusterMetricsFeatureExtension extends Renderer.LensExtension {
entitySettings = [
{
apiVersions: ["entity.k8slens.dev/v1alpha1"],
@@ -31,7 +31,7 @@ export default class ClusterMetricsFeatureExtension extends LensRendererExtensio
title: "Lens Metrics",
priority: 5,
components: {
- View: ({ entity = null }: { entity: Catalog.KubernetesCluster}) => {
+ View: ({ entity = null }: { entity: Common.Catalog.KubernetesCluster}) => {
return (
);
diff --git a/extensions/metrics-cluster-feature/src/metrics-feature.ts b/extensions/metrics-cluster-feature/src/metrics-feature.ts
index 655c8e60ed..cb536072b5 100644
--- a/extensions/metrics-cluster-feature/src/metrics-feature.ts
+++ b/extensions/metrics-cluster-feature/src/metrics-feature.ts
@@ -19,10 +19,14 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-import { Catalog, K8sApi } from "@k8slens/extensions";
+import { Renderer, Common } from "@k8slens/extensions";
import semver from "semver";
import * as path from "path";
+const { ResourceStack, forCluster, StorageClass, Namespace } = Renderer.K8sApi;
+
+type ResourceStack = Renderer.K8sApi.ResourceStack;
+
export interface MetricsConfiguration {
// Placeholder for Metrics config structure
prometheus: {
@@ -58,10 +62,10 @@ export class MetricsFeature {
name = "lens-metrics";
latestVersion = "v2.26.0-lens1";
- protected stack: K8sApi.ResourceStack;
+ protected stack: ResourceStack;
- constructor(protected cluster: Catalog.KubernetesCluster) {
- this.stack = new K8sApi.ResourceStack(cluster, this.name);
+ constructor(protected cluster: Common.Catalog.KubernetesCluster) {
+ this.stack = new ResourceStack(cluster, this.name);
}
get resourceFolder() {
@@ -70,7 +74,7 @@ export class MetricsFeature {
async install(config: MetricsConfiguration): Promise {
// Check if there are storageclasses
- const storageClassApi = K8sApi.forCluster(this.cluster, K8sApi.StorageClass);
+ const storageClassApi = forCluster(this.cluster, StorageClass);
const scs = await storageClassApi.list();
config.persistence.enabled = scs.some(sc => (
@@ -91,7 +95,7 @@ export class MetricsFeature {
const status: MetricsStatus = { installed: false, canUpgrade: false};
try {
- const namespaceApi = K8sApi.forCluster(this.cluster, K8sApi.Namespace);
+ const namespaceApi = forCluster(this.cluster, Namespace);
const namespace = await namespaceApi.get({name: "lens-metrics"});
if (namespace?.kind) {
diff --git a/extensions/metrics-cluster-feature/src/metrics-settings.tsx b/extensions/metrics-cluster-feature/src/metrics-settings.tsx
index ea8e56be43..b5a78eda1a 100644
--- a/extensions/metrics-cluster-feature/src/metrics-settings.tsx
+++ b/extensions/metrics-cluster-feature/src/metrics-settings.tsx
@@ -19,13 +19,22 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
import React from "react";
-import { Component, Catalog, K8sApi } from "@k8slens/extensions";
+import { Common, Renderer } from "@k8slens/extensions";
import { observer } from "mobx-react";
import { computed, observable, makeObservable } from "mobx";
import { MetricsFeature, MetricsConfiguration } from "./metrics-feature";
+const {
+ K8sApi: {
+ forCluster, StatefulSet, DaemonSet, Deployment,
+ },
+ Component: {
+ SubTitle, FormSwitch, Switcher, Button,
+ }
+} = Renderer;
+
interface Props {
- cluster: Catalog.KubernetesCluster;
+ cluster: Common.Catalog.KubernetesCluster;
}
@observer
@@ -102,7 +111,7 @@ export class MetricsSettings extends React.Component {
this.changed = true;
}
- const statefulSet = K8sApi.forCluster(this.props.cluster, K8sApi.StatefulSet);
+ const statefulSet = forCluster(this.props.cluster, StatefulSet);
try {
await statefulSet.get({name: "prometheus", namespace: "lens-metrics"});
@@ -115,7 +124,7 @@ export class MetricsSettings extends React.Component {
}
}
- const deployment = K8sApi.forCluster(this.props.cluster, K8sApi.Deployment);
+ const deployment = forCluster(this.props.cluster, Deployment);
try {
await deployment.get({name: "kube-state-metrics", namespace: "lens-metrics"});
@@ -128,7 +137,7 @@ export class MetricsSettings extends React.Component {
}
}
- const daemonSet = K8sApi.forCluster(this.props.cluster, K8sApi.DaemonSet);
+ const daemonSet = forCluster(this.props.cluster, DaemonSet);
try {
await daemonSet.get({name: "node-exporter", namespace: "lens-metrics"});
@@ -211,10 +220,10 @@ export class MetricsSettings extends React.Component {
)}
-
-
+ this.togglePrometheus(v.target.checked)}
@@ -229,10 +238,10 @@ export class MetricsSettings extends React.Component {
-
-
+ this.toggleKubeStateMetrics(v.target.checked)}
@@ -248,10 +257,10 @@ export class MetricsSettings extends React.Component {
-
-
+ this.toggleNodeExporter(v.target.checked)}
@@ -267,7 +276,7 @@ export class MetricsSettings extends React.Component {
- this.save()}
diff --git a/extensions/node-menu/renderer.tsx b/extensions/node-menu/renderer.tsx
index f3cb4c2dd7..b85ed7c162 100644
--- a/extensions/node-menu/renderer.tsx
+++ b/extensions/node-menu/renderer.tsx
@@ -19,11 +19,11 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-import { LensRendererExtension } from "@k8slens/extensions";
+import { Renderer } from "@k8slens/extensions";
import React from "react";
import { NodeMenu, NodeMenuProps } from "./src/node-menu";
-export default class NodeMenuRendererExtension extends LensRendererExtension {
+export default class NodeMenuRendererExtension extends Renderer.LensExtension {
kubeObjectMenuItems = [
{
kind: "Node",
diff --git a/extensions/node-menu/src/node-menu.tsx b/extensions/node-menu/src/node-menu.tsx
index 6aafbe67d4..fd8186b18e 100644
--- a/extensions/node-menu/src/node-menu.tsx
+++ b/extensions/node-menu/src/node-menu.tsx
@@ -20,9 +20,23 @@
*/
import React from "react";
-import { Component, K8sApi, Navigation} from "@k8slens/extensions";
+import { Renderer } from "@k8slens/extensions";
-export interface NodeMenuProps extends Component.KubeObjectMenuProps {
+type Node = Renderer.K8sApi.Node;
+
+const {
+ Component: {
+ terminalStore,
+ createTerminalTab,
+ ConfirmDialog,
+ MenuItem,
+ Icon,
+ },
+ Navigation
+} = Renderer;
+
+
+export interface NodeMenuProps extends Renderer.Component.KubeObjectMenuProps {
}
export function NodeMenu(props: NodeMenuProps) {
@@ -32,7 +46,7 @@ export function NodeMenu(props: NodeMenuProps) {
const nodeName = node.getName();
const sendToTerminal = (command: string) => {
- Component.terminalStore.sendCommand(command, {
+ terminalStore.sendCommand(command, {
enter: true,
newTab: true,
});
@@ -40,7 +54,7 @@ export function NodeMenu(props: NodeMenuProps) {
};
const shell = () => {
- Component.createTerminalTab({
+ createTerminalTab({
title: `Node: ${nodeName}`,
node: nodeName,
});
@@ -58,7 +72,7 @@ export function NodeMenu(props: NodeMenuProps) {
const drain = () => {
const command = `kubectl drain ${nodeName} --delete-local-data --ignore-daemonsets --force`;
- Component.ConfirmDialog.open({
+ ConfirmDialog.open({
ok: () => sendToTerminal(command),
labelOk: `Drain Node`,
message: (
@@ -71,26 +85,26 @@ export function NodeMenu(props: NodeMenuProps) {
return (
<>
-
-
+
+
{!node.isUnschedulable() && (
-
-
+
+
)}
{node.isUnschedulable() && (
-
-
+
+
)}
-
-
+
+
>
);
}
diff --git a/extensions/pod-menu/renderer.tsx b/extensions/pod-menu/renderer.tsx
index 149009f027..66da38f7ba 100644
--- a/extensions/pod-menu/renderer.tsx
+++ b/extensions/pod-menu/renderer.tsx
@@ -19,12 +19,12 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-import { LensRendererExtension } from "@k8slens/extensions";
+import { Renderer } from "@k8slens/extensions";
import { PodShellMenu, PodShellMenuProps } from "./src/shell-menu";
import { PodLogsMenu, PodLogsMenuProps } from "./src/logs-menu";
import React from "react";
-export default class PodMenuRendererExtension extends LensRendererExtension {
+export default class PodMenuRendererExtension extends Renderer.LensExtension {
kubeObjectMenuItems = [
{
kind: "Pod",
diff --git a/extensions/pod-menu/src/logs-menu.tsx b/extensions/pod-menu/src/logs-menu.tsx
index a479cd5295..042490f568 100644
--- a/extensions/pod-menu/src/logs-menu.tsx
+++ b/extensions/pod-menu/src/logs-menu.tsx
@@ -20,17 +20,34 @@
*/
import React from "react";
-import { Component, K8sApi, Util, Navigation } from "@k8slens/extensions";
+import { Renderer, Common } from "@k8slens/extensions";
-export interface PodLogsMenuProps extends Component.KubeObjectMenuProps {
+type Pod = Renderer.K8sApi.Pod;
+type IPodContainer = Renderer.K8sApi.IPodContainer;
+
+const {
+ Component: {
+ logTabStore,
+ MenuItem,
+ Icon,
+ SubMenu,
+ StatusBrick,
+ },
+ Navigation,
+} = Renderer;
+const {
+ Util,
+} = Common;
+
+export interface PodLogsMenuProps extends Renderer.Component.KubeObjectMenuProps {
}
export class PodLogsMenu extends React.Component {
- showLogs(container: K8sApi.IPodContainer) {
+ showLogs(container: IPodContainer) {
Navigation.hideDetails();
const pod = this.props.object;
- Component.logTabStore.createPodTab({
+ logTabStore.createPodTab({
selectedPod: pod,
selectedContainer: container,
});
@@ -44,35 +61,35 @@ export class PodLogsMenu extends React.Component {
if (!containers.length) return null;
return (
- this.showLogs(containers[0]))}>
-
+
);
})
}
-
+
>
)}
-
+
);
}
}
diff --git a/extensions/pod-menu/src/shell-menu.tsx b/extensions/pod-menu/src/shell-menu.tsx
index c11a5c2e8f..e1c72391aa 100644
--- a/extensions/pod-menu/src/shell-menu.tsx
+++ b/extensions/pod-menu/src/shell-menu.tsx
@@ -22,9 +22,26 @@
import React from "react";
-import { Component, K8sApi, Util, Navigation } from "@k8slens/extensions";
+import { Renderer, Common } from "@k8slens/extensions";
-export interface PodShellMenuProps extends Component.KubeObjectMenuProps {
+type Pod = Renderer.K8sApi.Pod;
+
+const {
+ Component: {
+ createTerminalTab,
+ terminalStore,
+ MenuItem,
+ Icon,
+ SubMenu,
+ StatusBrick,
+ },
+ Navigation,
+} = Renderer;
+const {
+ Util,
+} = Common;
+
+export interface PodShellMenuProps extends Renderer.Component.KubeObjectMenuProps {
}
export class PodShellMenu extends React.Component {
@@ -44,11 +61,11 @@ export class PodShellMenu extends React.Component {
command = `${command} sh -c "clear; (bash || ash || sh)"`;
}
- const shell = Component.createTerminalTab({
+ const shell = createTerminalTab({
title: `Pod: ${pod.getName()} (namespace: ${pod.getNs()})`
});
- Component.terminalStore.sendCommand(command, {
+ terminalStore.sendCommand(command, {
enter: true,
tabId: shell.id
});
@@ -61,29 +78,29 @@ export class PodShellMenu extends React.Component {
if (!containers.length) return null;
return (
- this.execShell(containers[0].name))}>
-
+ this.execShell(containers[0].name))}>
+
Shell
{containers.length > 1 && (
<>
-
-
+
+
{
containers.map(container => {
const { name } = container;
return (
- this.execShell(name))} className="flex align-center">
-
+ this.execShell(name))} className="flex align-center">
+
{name}
-
+
);
})
}
-
+
>
)}
-
+
);
}
}
diff --git a/src/extensions/core-api/app.ts b/src/extensions/common-api/app.ts
similarity index 100%
rename from src/extensions/core-api/app.ts
rename to src/extensions/common-api/app.ts
diff --git a/src/extensions/core-api/catalog.ts b/src/extensions/common-api/catalog.ts
similarity index 96%
rename from src/extensions/core-api/catalog.ts
rename to src/extensions/common-api/catalog.ts
index 14ba0c94d9..1e4631af22 100644
--- a/src/extensions/core-api/catalog.ts
+++ b/src/extensions/common-api/catalog.ts
@@ -25,6 +25,7 @@ import { catalogEntityRegistry as registry } from "../../main/catalog";
export { catalogCategoryRegistry as catalogCategories } from "../../common/catalog/catalog-category-registry";
export * from "../../common/catalog-entities";
+export * from "../../common/catalog/catalog-entity";
export class CatalogEntityRegistry {
getItemsForApiKind(apiVersion: string, kind: string): T[] {
diff --git a/src/extensions/core-api/event-bus.ts b/src/extensions/common-api/event-bus.ts
similarity index 100%
rename from src/extensions/core-api/event-bus.ts
rename to src/extensions/common-api/event-bus.ts
diff --git a/src/extensions/core-api/index.ts b/src/extensions/common-api/index.ts
similarity index 84%
rename from src/extensions/core-api/index.ts
rename to src/extensions/common-api/index.ts
index 249655394d..c0688dae25 100644
--- a/src/extensions/core-api/index.ts
+++ b/src/extensions/common-api/index.ts
@@ -19,27 +19,19 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-// Lens-extensions api developer's kit
-export { LensMainExtension } from "../lens-main-extension";
-export { LensRendererExtension } from "../lens-renderer-extension";
-
// APIs
import * as App from "./app";
import * as EventBus from "./event-bus";
import * as Store from "./stores";
import * as Util from "./utils";
-import * as Interface from "../interfaces";
import * as Catalog from "./catalog";
import * as Types from "./types";
-import * as Ipc from "./ipc";
export {
App,
EventBus,
Catalog,
- Interface,
Store,
Types,
Util,
- Ipc,
};
diff --git a/src/extensions/interfaces/registrations.ts b/src/extensions/common-api/registrations.ts
similarity index 100%
rename from src/extensions/interfaces/registrations.ts
rename to src/extensions/common-api/registrations.ts
diff --git a/src/extensions/core-api/stores.ts b/src/extensions/common-api/stores.ts
similarity index 100%
rename from src/extensions/core-api/stores.ts
rename to src/extensions/common-api/stores.ts
diff --git a/src/extensions/core-api/types.ts b/src/extensions/common-api/types.ts
similarity index 97%
rename from src/extensions/core-api/types.ts
rename to src/extensions/common-api/types.ts
index ed78b5c017..c40092c86f 100644
--- a/src/extensions/core-api/types.ts
+++ b/src/extensions/common-api/types.ts
@@ -22,3 +22,5 @@
export type IpcMainInvokeEvent = Electron.IpcMainInvokeEvent;
export type IpcRendererEvent = Electron.IpcRendererEvent;
export type IpcMainEvent = Electron.IpcMainEvent;
+
+export * from "./registrations";
diff --git a/src/extensions/core-api/utils.ts b/src/extensions/common-api/utils.ts
similarity index 100%
rename from src/extensions/core-api/utils.ts
rename to src/extensions/common-api/utils.ts
diff --git a/src/extensions/core-api/ipc.ts b/src/extensions/core-api/ipc.ts
deleted file mode 100644
index 7654fa7f27..0000000000
--- a/src/extensions/core-api/ipc.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Copyright (c) 2021 OpenLens Authors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- * the Software, and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-export { IpcMain as Main } from "../ipc/ipc-main";
-export { IpcRegistrar as Registrar } from "../ipc/ipc-registrar";
diff --git a/src/extensions/extension-api.ts b/src/extensions/extension-api.ts
index 4e584419e1..25c5f76059 100644
--- a/src/extensions/extension-api.ts
+++ b/src/extensions/extension-api.ts
@@ -22,5 +22,12 @@
// Extensions-api types bundle (main + renderer)
// Available for lens-extensions via NPM-package "@k8slens/extensions"
-export * from "./core-api";
-export * from "./renderer-api";
+import * as Common from "./common-api";
+import * as Renderer from "./renderer-api";
+import * as Main from "./main-api";
+
+export {
+ Common,
+ Renderer,
+ Main,
+};
diff --git a/src/extensions/extension-loader.ts b/src/extensions/extension-loader.ts
index b3bec33179..dc96b892f2 100644
--- a/src/extensions/extension-loader.ts
+++ b/src/extensions/extension-loader.ts
@@ -337,7 +337,11 @@ export class ExtensionLoader extends Singleton {
try {
return __non_webpack_require__(extAbsolutePath).default;
} catch (error) {
- logger.error(`${logModule}: can't load extension main at ${extAbsolutePath}: ${error}`, { extension, error });
+ if (ipcRenderer) {
+ console.error(`${logModule}: can't load ${entryPointName} for "${extension.manifest.name}": ${error.stack || error}`, extension);
+ } else {
+ logger.error(`${logModule}: can't load ${entryPointName} for "${extension.manifest.name}": ${error}`, { extension });
+ }
}
return null;
diff --git a/src/extensions/interfaces/catalog.ts b/src/extensions/interfaces/catalog.ts
deleted file mode 100644
index d1a54a89d3..0000000000
--- a/src/extensions/interfaces/catalog.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Copyright (c) 2021 OpenLens Authors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- * the Software, and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-export * from "../../common/catalog/catalog-entity";
diff --git a/src/extensions/interfaces/index.ts b/src/extensions/main-api/index.ts
similarity index 87%
rename from src/extensions/interfaces/index.ts
rename to src/extensions/main-api/index.ts
index 876e37069e..95533751cc 100644
--- a/src/extensions/interfaces/index.ts
+++ b/src/extensions/main-api/index.ts
@@ -19,5 +19,10 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-export * from "./registrations";
-export * from "./catalog";
+import { IpcMain as Ipc } from "../ipc/ipc-main";
+import { LensMainExtension as LensExtension } from "../lens-main-extension";
+
+export {
+ Ipc,
+ LensExtension,
+};
diff --git a/src/extensions/renderer-api/index.ts b/src/extensions/renderer-api/index.ts
index 3c53d31415..33defb00f6 100644
--- a/src/extensions/renderer-api/index.ts
+++ b/src/extensions/renderer-api/index.ts
@@ -26,10 +26,14 @@ import * as Component from "./components";
import * as K8sApi from "./k8s-api";
import * as Navigation from "./navigation";
import * as Theme from "./theming";
+import { IpcRenderer as Ipc } from "../ipc/ipc-renderer";
+import { LensRendererExtension as LensExtension } from "../lens-renderer-extension";
export {
Component,
K8sApi,
Navigation,
Theme,
+ Ipc,
+ LensExtension,
};
diff --git a/src/main/index.ts b/src/main/index.ts
index bf8d4943e3..858c903881 100644
--- a/src/main/index.ts
+++ b/src/main/index.ts
@@ -23,7 +23,8 @@
import "../common/system-ca";
import * as Mobx from "mobx";
-import * as LensExtensionsCoreApi from "../extensions/core-api";
+import * as LensExtensionsCommonApi from "../extensions/common-api";
+import * as LensExtensionsMainApi from "../extensions/main-api";
import { app, autoUpdater, ipcMain, dialog, powerMonitor } from "electron";
import { appName, isMac, productName } from "../common/vars";
import path from "path";
@@ -279,7 +280,8 @@ app.on("open-url", (event, rawUrl) => {
* e.g. global.Mobx, global.LensExtensions
*/
const LensExtensions = {
- ...LensExtensionsCoreApi,
+ Common: LensExtensionsCommonApi,
+ Main: LensExtensionsMainApi,
};
export {
diff --git a/src/main/protocol-handler/__test__/router.test.ts b/src/main/protocol-handler/__test__/router.test.ts
index 414881dec1..5e6d6612c4 100644
--- a/src/main/protocol-handler/__test__/router.test.ts
+++ b/src/main/protocol-handler/__test__/router.test.ts
@@ -24,7 +24,7 @@ import * as uuid from "uuid";
import { broadcastMessage } from "../../../common/ipc";
import { ProtocolHandlerExtension, ProtocolHandlerInternal } from "../../../common/protocol-handler";
import { noop } from "../../../common/utils";
-import { LensMainExtension } from "../../../extensions/core-api";
+import { LensExtension } from "../../../extensions/main-api";
import { ExtensionLoader } from "../../../extensions/extension-loader";
import { ExtensionsStore } from "../../../extensions/extensions-store";
import { LensProtocolRouterMain } from "../router";
@@ -78,7 +78,7 @@ describe("protocol router tests", () => {
it.only("should not throw when has valid host", async () => {
const extId = uuid.v4();
- const ext = new LensMainExtension({
+ const ext = new LensExtension({
id: extId,
manifestPath: "/foo/bar",
manifest: {
@@ -155,7 +155,7 @@ describe("protocol router tests", () => {
const lpr = LensProtocolRouterMain.getInstance();
const extId = uuid.v4();
- const ext = new LensMainExtension({
+ const ext = new LensExtension({
id: extId,
manifestPath: "/foo/bar",
manifest: {
@@ -195,7 +195,7 @@ describe("protocol router tests", () => {
{
const extId = uuid.v4();
- const ext = new LensMainExtension({
+ const ext = new LensExtension({
id: extId,
manifestPath: "/foo/bar",
manifest: {
@@ -219,7 +219,7 @@ describe("protocol router tests", () => {
{
const extId = uuid.v4();
- const ext = new LensMainExtension({
+ const ext = new LensExtension({
id: extId,
manifestPath: "/foo/bar",
manifest: {
diff --git a/src/renderer/bootstrap.tsx b/src/renderer/bootstrap.tsx
index 38396cc608..d7f3896a90 100644
--- a/src/renderer/bootstrap.tsx
+++ b/src/renderer/bootstrap.tsx
@@ -26,7 +26,7 @@ import * as Mobx from "mobx";
import * as MobxReact from "mobx-react";
import * as ReactRouter from "react-router";
import * as ReactRouterDom from "react-router-dom";
-import * as LensExtensionsCoreApi from "../extensions/core-api";
+import * as LensExtensionsCommonApi from "../extensions/common-api";
import * as LensExtensionsRendererApi from "../extensions/renderer-api";
import { render, unmountComponentAtNode } from "react-dom";
import { delay } from "../common/utils";
@@ -123,8 +123,8 @@ bootstrap(process.isMainFrame ? LensApp : App);
* e.g. Devtools -> Console -> window.LensExtensions (renderer)
*/
const LensExtensions = {
- ...LensExtensionsCoreApi,
- ...LensExtensionsRendererApi,
+ Common: LensExtensionsCommonApi,
+ Renderer: LensExtensionsRendererApi,
};
export {