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 ( <> - - + + Shell - + {!node.isUnschedulable() && ( - - + + Cordon - + )} {node.isUnschedulable() && ( - - + + Uncordon - + )} - - + + Drain - + ); } 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]))}> - + this.showLogs(containers[0]))}> + Logs {containers.length > 1 && ( <> - - + + { containers.map(container => { const { name } = container; const status = statuses.find(status => status.name === name); const brick = status ? ( - ) : null; return ( - this.showLogs(container))} className="flex align-center"> + this.showLogs(container))} className="flex align-center"> {brick} {name} - + ); }) } - + )} - + ); } } 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 {